diff --git a/DEPS b/DEPS
index 96a350b..ecf0866 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': 'c99b8f0351850cc1901fe359feb4ca357141346f',
+  'skia_revision': 'bc927548db17accec2195af6e15053f7918bb3f5',
   # 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': '8d71398059ea2ee560b8dcffef37cac17730126f',
+  'v8_revision': '0d7b8ac7973c9e48776047115603f554d1d0f1f6',
   # 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.
@@ -51,7 +51,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': 'e271a7e4a15e5f58bd7c5a70e29e1f79803636c9',
+  'angle_revision': 'de44d3a43a7d44ddfc5d8160c165c26de819ae6c',
   # 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.
@@ -59,7 +59,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': 'f6d9a61af218b7acc1161ae231b16765ca10b526',
+  'pdfium_revision': '06f457216f45093dc5dff12055733aa426c26c59',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling openmax_dl
   # and whatever else without interference from each other.
@@ -96,7 +96,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '849bc5d4ec90569bceaa29274fc80482947a94dd',
+  'catapult_revision': '222acfed7b3fbe32aa8f80ca5cc733b9e7073bc9',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -198,10 +198,7 @@
    Var('chromium_git') + '/webm/libvpx.git' + '@' +  '57566ff24adbf8109414ea908585cc5edec3ac70',
 
   'src/third_party/ffmpeg':
-   Var('chromium_git') + '/chromium/third_party/ffmpeg.git' + '@' + '0ba7f6830534bc2afbbe24200cc51602272fc706',
-
-  'src/third_party/libjingle/source/talk':
-    Var('chromium_git') + '/external/webrtc/trunk/talk.git' + '@' + 'c51edbc97d541bfd39139683c78c16874c6645ab', # commit position 12750
+   Var('chromium_git') + '/chromium/third_party/ffmpeg.git' + '@' + 'fa382f21a6b9d0f1b7276457cb5a50081379d60e',
 
   'src/third_party/usrsctp/usrsctplib':
     Var('chromium_git') + '/external/github.com/sctplab/usrsctp' + '@' + 'c60ec8b35c3fe6027d7a3faae89d1c8d7dd3ce98',
@@ -228,7 +225,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' + '@' + '431aeebbe3c5950d3ecbd3c81083f4daac71b09a', # commit position 12753
+    Var('chromium_git') + '/external/webrtc/trunk/webrtc.git' + '@' + '1f04dc934d5d70b68cc0b5ba87bbdb56f91457f7', # commit position 12756
 
   'src/third_party/openmax_dl':
     Var('chromium_git') + '/external/webrtc/deps/third_party/openmax.git' + '@' +  Var('openmax_dl_revision'),
@@ -258,7 +255,7 @@
    Var('chromium_git') + '/chromium/deps/opus.git' + '@' + '655cc54c564b84ef2827f0b2152ce3811046201e',
 
   'src/media/cdm/api':
-   Var('chromium_git') + '/chromium/cdm.git' + '@' + '1dea7088184dec2ebe4a8b3800aabb0afbb4b88a',
+   Var('chromium_git') + '/chromium/cdm.git' + '@' + '245af7782c9f54d776722a2c7b53372ee040e5fc',
 
   'src/third_party/mesa/src':
    Var('chromium_git') + '/chromium/deps/mesa.git' + '@' + 'ef811c6bd4de74e13e7035ca882cc77f85793fef',
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 4e5e5c3..7672a57e 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -1439,6 +1439,13 @@
     - Are using 'TAG' as variable name for the tags (warn)
     - Are using a tag that is shorter than 20 characters (error)
   """
+
+  # Do not check format of logs in //chrome/android/webapk because
+  # //chrome/android/webapk cannot depend on //base
+  cr_log_check_excluded_paths = [
+    r"^chrome[\\\/]android[\\\/]webapk[\\\/].*",
+  ]
+
   cr_log_import_pattern = input_api.re.compile(
       r'^import org\.chromium\.base\.Log;$', input_api.re.MULTILINE)
   class_in_base_pattern = input_api.re.compile(
@@ -1453,7 +1460,8 @@
 
   REF_MSG = ('See docs/android_logging.md '
             'or contact dgn@chromium.org for more info.')
-  sources = lambda x: input_api.FilterSourceFile(x, white_list=(r'.*\.java$',))
+  sources = lambda x: input_api.FilterSourceFile(x, white_list=(r'.*\.java$',),
+      black_list=cr_log_check_excluded_paths)
 
   tag_decl_errors = []
   tag_length_errors = []
diff --git a/WATCHLISTS b/WATCHLISTS
index 7dd1cc9d..bfa4a5a 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -621,6 +621,7 @@
     },
     'ntp_snippets': {
       'filepath': 'chrome/android/java/src/org/chromium/chrome/browser/ntp/|'\
+        'chrome/android/javatests/src/org/chromium/chrome/browser/ntp/|'\
         'chrome/browser/ntp_snippets/|'\
         'components/ntp_snippets/|'\
         'chrome/android/java/res/layout/new_tab_page|'\
@@ -1369,6 +1370,7 @@
                'jessicag+watch-blimp@chromium.org',
                'kmarshall+watch-blimp@chromium.org',
                'khushalsagar+watch-blimp@chromium.org',
+	       'lethalantidote+watch-blimp@chromium.org',
                'maniscalco+watch-blimp@chromium.org',
                'marcinjb+watch-blimp@chromium.org',
                'nyquist+watch-blimp@chromium.org',
@@ -1543,7 +1545,8 @@
     'ntp': ['dbeam+watch-ntp@chromium.org',
             'pedrosimonetti+watch@chromium.org'],
     'ntp_snippets': ['mcwilliams+watch@chromium.org',
-                     'dgn+watch@chromium.org'],
+                     'dgn+watch@chromium.org',
+                     'mvanouwerkerk+watch@chromium.org'],
     'offline_pages': ['dimich+watch@chromium.org',
                       'fgorski+watch@chromium.org',
                       'petewil+watch@chromium.org',
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn
index 45e2732..6670def 100644
--- a/android_webview/BUILD.gn
+++ b/android_webview/BUILD.gn
@@ -589,6 +589,7 @@
     "//third_party/WebKit/public:blink",
     "//ui/events:gesture_detection",
     "//ui/gl",
+    "//ui/gl/init",
     "//ui/shell_dialogs",
     "//v8",
   ]
diff --git a/android_webview/android_webview.gyp b/android_webview/android_webview.gyp
index 4a4f85e..1c79e44c 100644
--- a/android_webview/android_webview.gyp
+++ b/android_webview/android_webview.gyp
@@ -260,6 +260,7 @@
         '../third_party/WebKit/public/blink.gyp:blink',
         '../ui/events/events.gyp:gesture_detection',
         '../ui/gl/gl.gyp:gl',
+        '../ui/gl/init/gl_init.gyp:gl_init',
         '../ui/shell_dialogs/shell_dialogs.gyp:shell_dialogs',
         '../url/ipc/url_ipc.gyp:url_ipc',
         '../v8/src/v8.gyp:v8',
diff --git a/android_webview/android_webview_tests.gypi b/android_webview/android_webview_tests.gypi
index 35877b5a..5e3b962 100644
--- a/android_webview/android_webview_tests.gypi
+++ b/android_webview/android_webview_tests.gypi
@@ -136,6 +136,7 @@
         '../testing/gtest.gyp:gtest',
         '../ui/base/ui_base.gyp:ui_base_jni_headers',
         '../ui/gl/gl.gyp:gl',
+        '../ui/gl/init/gl_init.gyp:gl_init',
         '../ui/gl/gl.gyp:gl_test_support',
         'android_webview_common',
         'android_webview_unittests_jni',
diff --git a/android_webview/apk/java/AndroidManifest.xml b/android_webview/apk/java/AndroidManifest.xml
index ccbfb3f..b46f523 100644
--- a/android_webview/apk/java/AndroidManifest.xml
+++ b/android_webview/apk/java/AndroidManifest.xml
@@ -18,21 +18,24 @@
     <application android:label="Android System WebView"
         android:icon="@drawable/icon_webview"
         android:multiArch="true">
-        <activity android:name="com.android.webview.chromium.LicenseActivity"
-                  android:label="@string/license_activity_title"
-                  >
-            <intent-filter>
-                <action android:name="android.settings.WEBVIEW_LICENSE" />
-                <category android:name="android.intent.category.DEFAULT" />
-            </intent-filter>
-            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
-                       android:value="true" />
-        </activity>
-        <provider android:name="com.android.webview.chromium.LicenseContentProvider"
-                  android:exported="true"
-                  android:authorities="{{package|default('com.android.webview')}}.LicenseContentProvider" />
-        <meta-data android:name="com.android.webview.WebViewLibrary"
-                   android:value="libwebviewchromium.so" />
+        {# This part is shared between stand-alone WebView and Monochrome #}
+        {% macro common(manifest_package, webview_lib) %}
+            <activity android:name="com.android.webview.chromium.LicenseActivity"
+                    android:label="@string/license_activity_title">
+                <intent-filter>
+                    <action android:name="android.settings.WEBVIEW_LICENSE" />
+                    <category android:name="android.intent.category.DEFAULT" />
+                </intent-filter>
+                <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
+                        android:value="true" />
+            </activity>
+            <provider android:name="com.android.webview.chromium.LicenseContentProvider"
+                    android:exported="true"
+                    android:authorities="{{ manifest_package }}.LicenseContentProvider" />
+            <meta-data android:name="com.android.webview.WebViewLibrary"
+                    android:value="{{ webview_lib }}" />
+        {% endmacro %}
+        {{ common(package|default('com.android.webview'), 'libwebviewchromium.so') }}
         <meta-data android:name="org.chromium.content.browser.NUM_SANDBOXED_SERVICES"
                    android:value="1"/>
         <service android:name="org.chromium.content.app.SandboxedProcessService0"
diff --git a/android_webview/browser/aw_gl_surface.h b/android_webview/browser/aw_gl_surface.h
index d0c5220..056851b 100644
--- a/android_webview/browser/aw_gl_surface.h
+++ b/android_webview/browser/aw_gl_surface.h
@@ -13,7 +13,7 @@
 // This surface is used to represent the underlying surface provided by the App
 // inside a hardware draw. Note that offscreen contexts will not be using this
 // GLSurface.
-class GL_EXPORT AwGLSurface : public gfx::GLSurface {
+class AwGLSurface : public gfx::GLSurface {
  public:
   AwGLSurface();
 
diff --git a/android_webview/browser/scoped_app_gl_state_restore.cc b/android_webview/browser/scoped_app_gl_state_restore.cc
index caa23879..0c6867f 100644
--- a/android_webview/browser/scoped_app_gl_state_restore.cc
+++ b/android_webview/browser/scoped_app_gl_state_restore.cc
@@ -11,6 +11,7 @@
 #include "ui/gl/gl_bindings.h"
 #include "ui/gl/gl_context.h"
 #include "ui/gl/gl_surface_stub.h"
+#include "ui/gl/init/gl_factory.h"
 
 namespace android_webview {
 
@@ -22,9 +23,9 @@
  public:
   AppContextSurface()
       : surface(new gfx::GLSurfaceStub),
-        context(gfx::GLContext::CreateGLContext(NULL,
-                                                surface.get(),
-                                                gfx::PreferDiscreteGpu)) {}
+        context(gl::init::CreateGLContext(nullptr,
+                                          surface.get(),
+                                          gfx::PreferDiscreteGpu)) {}
   void MakeCurrent() { context->MakeCurrent(surface.get()); }
 
  private:
diff --git a/android_webview/browser/test/fake_window.cc b/android_webview/browser/test/fake_window.cc
index 3319db1..4b63f74 100644
--- a/android_webview/browser/test/fake_window.cc
+++ b/android_webview/browser/test/fake_window.cc
@@ -12,6 +12,7 @@
 #include "base/threading/thread.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "ui/gl/gl_bindings.h"
+#include "ui/gl/init/gl_factory.h"
 
 namespace android_webview {
 
@@ -192,11 +193,11 @@
 
 void FakeWindow::InitializeOnRT(base::WaitableEvent* sync) {
   CheckCurrentlyOnRT();
-  surface_ = gfx::GLSurface::CreateOffscreenGLSurface(surface_size_);
+  surface_ = gl::init::CreateOffscreenGLSurface(surface_size_);
   DCHECK(surface_);
   DCHECK(surface_->GetHandle());
-  context_ = gfx::GLContext::CreateGLContext(nullptr, surface_.get(),
-                                             gfx::PreferDiscreteGpu);
+  context_ = gl::init::CreateGLContext(nullptr, surface_.get(),
+                                       gfx::PreferDiscreteGpu);
   DCHECK(context_);
   sync->Signal();
 }
diff --git a/android_webview/native/aw_contents.cc b/android_webview/native/aw_contents.cc
index 44073fe..0da570e 100644
--- a/android_webview/native/aw_contents.cc
+++ b/android_webview/native/aw_contents.cc
@@ -68,6 +68,7 @@
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/render_view_host.h"
 #include "content/public/browser/web_contents.h"
+#include "content/public/common/mhtml_generation_params.h"
 #include "content/public/common/renderer_preferences.h"
 #include "content/public/common/ssl_status.h"
 #include "jni/AwContents_jni.h"
@@ -403,8 +404,7 @@
   j_callback->Reset(env, callback);
   base::FilePath target_path(ConvertJavaStringToUTF8(env, jpath));
   web_contents_->GenerateMHTML(
-      target_path,
-      false /* use_binary_encoding */,
+      content::MHTMLGenerationParams(target_path),
       base::Bind(&GenerateMHTMLCallback, base::Owned(j_callback), target_path));
 }
 
diff --git a/ash/material_design/material_design_controller.cc b/ash/material_design/material_design_controller.cc
index de6bab83..f263a85 100644
--- a/ash/material_design/material_design_controller.cc
+++ b/ash/material_design/material_design_controller.cc
@@ -54,6 +54,11 @@
 }
 
 // static
+bool MaterialDesignController::IsShelfMaterial() {
+  return MaterialDesignController::IsMaterialExperimental();
+}
+
+// static
 MaterialDesignController::Mode MaterialDesignController::mode() {
   return mode_;
 }
diff --git a/ash/material_design/material_design_controller.h b/ash/material_design/material_design_controller.h
index cd272b07..0ceef47f 100644
--- a/ash/material_design/material_design_controller.h
+++ b/ash/material_design/material_design_controller.h
@@ -41,6 +41,9 @@
   // Maps to "--ash-md=experimental" command line switch value.
   static bool IsMaterialExperimental();
 
+  // Returns true if Material Design features are enabled for Chrome OS shelf.
+  static bool IsShelfMaterial();
+
  private:
   friend class test::MaterialDesignControllerTestAPI;
 
diff --git a/ash/mus/BUILD.gn b/ash/mus/BUILD.gn
index da25a6e..6b8a563 100644
--- a/ash/mus/BUILD.gn
+++ b/ash/mus/BUILD.gn
@@ -129,3 +129,24 @@
     "//ash/resources:ash_test_resources_200_percent",
   ]
 }
+
+source_set("unittests") {
+  testonly = true
+
+  sources = [
+    "shelf_delegate_mus_unittest.cc",
+  ]
+
+  deps = [
+    "//base",
+    "//components/mus/public/interfaces",
+    "//mash/shelf/public/interfaces",
+    "//mojo/public/cpp/bindings",
+    "//services/shell/public/cpp:shell_test_support",
+  ]
+
+  data_deps = [
+    "//mash/session",
+    ":mus",
+  ]
+}
diff --git a/ash/mus/shelf_delegate_mus_unittest.cc b/ash/mus/shelf_delegate_mus_unittest.cc
new file mode 100644
index 0000000..0a59fde
--- /dev/null
+++ b/ash/mus/shelf_delegate_mus_unittest.cc
@@ -0,0 +1,132 @@
+// 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 <memory>
+
+#include "base/bind.h"
+#include "base/command_line.h"
+#include "base/run_loop.h"
+#include "components/mus/public/interfaces/window_server_test.mojom.h"
+#include "mash/shelf/public/interfaces/shelf.mojom.h"
+#include "mojo/public/cpp/bindings/associated_binding.h"
+#include "services/shell/public/cpp/shell_test.h"
+
+namespace {
+
+class TestShelfObserver : public mash::shelf::mojom::ShelfObserver {
+ public:
+  explicit TestShelfObserver(mash::shelf::mojom::ShelfControllerPtr* shelf)
+      : observer_binding_(this) {
+    mash::shelf::mojom::ShelfObserverAssociatedPtrInfo ptr_info;
+    observer_binding_.Bind(&ptr_info, shelf->associated_group());
+    (*shelf)->AddObserver(std::move(ptr_info));
+  }
+
+  ~TestShelfObserver() override {}
+
+  mash::shelf::mojom::Alignment alignment() const { return alignment_; }
+  mash::shelf::mojom::AutoHideBehavior auto_hide() const { return auto_hide_; }
+
+  void WaitForIncomingMethodCalls(size_t expected_calls) {
+    DCHECK_EQ(0u, expected_calls_);
+    expected_calls_ = expected_calls;
+    DCHECK(!run_loop_ || !run_loop_->running());
+    run_loop_.reset(new base::RunLoop());
+    run_loop_->Run();
+  }
+
+ private:
+  void OnMethodCall() {
+    DCHECK_LT(0u, expected_calls_);
+    DCHECK(run_loop_->running());
+    expected_calls_--;
+    if (expected_calls_ == 0u)
+      run_loop_->Quit();
+  }
+
+  // mash::shelf::mojom::ShelfObserver:
+  void OnAlignmentChanged(mash::shelf::mojom::Alignment alignment) override {
+    alignment_ = alignment;
+    OnMethodCall();
+  }
+  void OnAutoHideBehaviorChanged(
+      mash::shelf::mojom::AutoHideBehavior auto_hide) override {
+    auto_hide_ = auto_hide;
+    OnMethodCall();
+  }
+
+  mojo::AssociatedBinding<mash::shelf::mojom::ShelfObserver> observer_binding_;
+
+  mash::shelf::mojom::Alignment alignment_ =
+      mash::shelf::mojom::Alignment::BOTTOM;
+  mash::shelf::mojom::AutoHideBehavior auto_hide_ =
+      mash::shelf::mojom::AutoHideBehavior::NEVER;
+
+  size_t expected_calls_ = 0u;
+  std::unique_ptr<base::RunLoop> run_loop_;
+
+  DISALLOW_COPY_AND_ASSIGN(TestShelfObserver);
+};
+
+}  // namespace
+
+namespace ash {
+namespace sysui {
+
+void RunCallback(bool* success, const base::Closure& callback, bool result) {
+  *success = result;
+  callback.Run();
+}
+
+class ShelfDelegateMusTest : public shell::test::ShellTest {
+ public:
+  ShelfDelegateMusTest() : ShellTest("exe:mash_unittests") {}
+  ~ShelfDelegateMusTest() override {}
+
+ private:
+  void SetUp() override {
+    base::CommandLine::ForCurrentProcess()->AppendSwitch("use-test-config");
+    ShellTest::SetUp();
+  }
+
+  DISALLOW_COPY_AND_ASSIGN(ShelfDelegateMusTest);
+};
+
+TEST_F(ShelfDelegateMusTest, AshSysUIHasDrawnWindow) {
+  // mash_session embeds ash_sysui, which paints the shelf.
+  connector()->Connect("mojo:mash_session");
+  mus::mojom::WindowServerTestPtr test_interface;
+  connector()->ConnectToInterface("mojo:mus", &test_interface);
+  base::RunLoop run_loop;
+  bool drawn = false;
+  test_interface->EnsureClientHasDrawnWindow(
+      "mojo:ash_sysui",
+      base::Bind(&RunCallback, &drawn, run_loop.QuitClosure()));
+  run_loop.Run();
+  EXPECT_TRUE(drawn);
+}
+
+TEST_F(ShelfDelegateMusTest, ShelfControllerAndObserverBasic) {
+  connector()->Connect("mojo:mash_session");
+  mash::shelf::mojom::ShelfControllerPtr shelf_controller;
+  connector()->ConnectToInterface("mojo:ash_sysui", &shelf_controller);
+
+  // Adding the observer should fire state initialization function calls.
+  TestShelfObserver observer(&shelf_controller);
+  observer.WaitForIncomingMethodCalls(2u);
+  EXPECT_EQ(mash::shelf::mojom::Alignment::BOTTOM, observer.alignment());
+  EXPECT_EQ(mash::shelf::mojom::AutoHideBehavior::NEVER, observer.auto_hide());
+
+  shelf_controller->SetAlignment(mash::shelf::mojom::Alignment::LEFT);
+  observer.WaitForIncomingMethodCalls(1u);
+  EXPECT_EQ(mash::shelf::mojom::Alignment::LEFT, observer.alignment());
+
+  shelf_controller->SetAutoHideBehavior(
+      mash::shelf::mojom::AutoHideBehavior::ALWAYS);
+  observer.WaitForIncomingMethodCalls(1u);
+  EXPECT_EQ(mash::shelf::mojom::AutoHideBehavior::ALWAYS, observer.auto_hide());
+}
+
+}  // namespace sysui
+}  // namespace ash
diff --git a/ash/mus/sysui_application.cc b/ash/mus/sysui_application.cc
index 7590af8..a43fb159 100644
--- a/ash/mus/sysui_application.cc
+++ b/ash/mus/sysui_application.cc
@@ -12,6 +12,7 @@
 #include "ash/desktop_background/desktop_background_controller.h"
 #include "ash/host/ash_window_tree_host_init_params.h"
 #include "ash/host/ash_window_tree_host_platform.h"
+#include "ash/material_design/material_design_controller.h"
 #include "ash/mus/app_list_presenter_mus.h"
 #include "ash/mus/keyboard_ui_mus.h"
 #include "ash/mus/shelf_delegate_mus.h"
@@ -198,6 +199,7 @@
                   const ::shell::Identity& identity) {
     InitializeResourceBundle(connector);
     aura_init_.reset(new views::AuraInit(connector, "views_mus_resources.pak"));
+    ash::MaterialDesignController::Initialize();
     views::WindowManagerConnection::Create(connector, identity);
 
     display::Screen* screen = display::Screen::GetScreen();
diff --git a/ash/root_window_controller.cc b/ash/root_window_controller.cc
index 7d6b190fa..68bbc7442 100644
--- a/ash/root_window_controller.cc
+++ b/ash/root_window_controller.cc
@@ -56,6 +56,7 @@
 #include "ash/wm/window_util.h"
 #include "ash/wm/workspace_controller.h"
 #include "base/command_line.h"
+#include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/time/time.h"
 #include "ui/aura/client/aura_constants.h"
@@ -71,6 +72,7 @@
 #include "ui/display/screen.h"
 #include "ui/keyboard/keyboard_controller.h"
 #include "ui/keyboard/keyboard_util.h"
+#include "ui/views/controls/menu/menu_model_adapter.h"
 #include "ui/views/controls/menu/menu_runner.h"
 #include "ui/views/view_model.h"
 #include "ui/views/view_model_utils.h"
@@ -589,27 +591,26 @@
                                            ui::MenuSourceType source_type) {
   ShellDelegate* delegate = Shell::GetInstance()->delegate();
   DCHECK(delegate);
-  std::unique_ptr<ui::MenuModel> menu_model(
-      delegate->CreateContextMenu(shelf_->shelf(), nullptr));
-  if (!menu_model)
+  menu_model_.reset(delegate->CreateContextMenu(shelf_->shelf(), nullptr));
+  if (!menu_model_)
     return;
 
+  menu_model_adapter_.reset(new views::MenuModelAdapter(
+      menu_model_.get(),
+      base::Bind(&RootWindowController::OnMenuClosed, base::Unretained(this))));
+
   // Background controller may not be set yet if user clicked on status are
   // before initial animation completion. See crbug.com/222218
   if (!wallpaper_controller_.get())
     return;
 
-  views::MenuRunner menu_runner(menu_model.get(),
-                                views::MenuRunner::CONTEXT_MENU);
-  if (menu_runner.RunMenuAt(wallpaper_controller_->widget(),
-                            NULL,
-                            gfx::Rect(location_in_screen, gfx::Size()),
-                            views::MENU_ANCHOR_TOPLEFT,
-                            source_type) == views::MenuRunner::MENU_DELETED) {
-    return;
-  }
-
-  Shell::GetInstance()->UpdateShelfVisibility();
+  menu_runner_.reset(new views::MenuRunner(
+      menu_model_adapter_->CreateMenu(),
+      views::MenuRunner::CONTEXT_MENU | views::MenuRunner::ASYNC));
+  ignore_result(
+      menu_runner_->RunMenuAt(wallpaper_controller_->widget(), NULL,
+                              gfx::Rect(location_in_screen, gfx::Size()),
+                              views::MENU_ANCHOR_TOPLEFT, source_type));
 }
 
 void RootWindowController::UpdateShelfVisibility() {
@@ -1043,6 +1044,13 @@
   touch_hud_projection_->Remove();
 }
 
+void RootWindowController::OnMenuClosed() {
+  menu_runner_.reset();
+  menu_model_adapter_.reset();
+  menu_model_.reset();
+  Shell::GetInstance()->UpdateShelfVisibility();
+}
+
 void RootWindowController::OnLoginStateChanged(user::LoginStatus status) {
   shelf_->shelf_layout_manager()->UpdateVisibilityState();
 }
diff --git a/ash/root_window_controller.h b/ash/root_window_controller.h
index a45ce180..283468ec 100644
--- a/ash/root_window_controller.h
+++ b/ash/root_window_controller.h
@@ -34,9 +34,12 @@
 
 namespace ui {
 class EventHandler;
+class MenuModel;
 }
 
 namespace views {
+class MenuModelAdapter;
+class MenuRunner;
 class Widget;
 }
 
@@ -254,6 +257,9 @@
   // Disables projection touch HUD.
   void DisableTouchHudProjection();
 
+  // Callback for MenuModelAdapter.
+  void OnMenuClosed();
+
   // Overridden from ShellObserver.
   void OnLoginStateChanged(user::LoginStatus status) override;
   void OnTouchHudProjectionToggled(bool enabled) override;
@@ -303,6 +309,11 @@
   std::unique_ptr<AnimatingDesktopController> animating_wallpaper_controller_;
   std::unique_ptr<::wm::ScopedCaptureClient> capture_client_;
 
+  // Manages the context menu.
+  std::unique_ptr<ui::MenuModel> menu_model_;
+  std::unique_ptr<views::MenuModelAdapter> menu_model_adapter_;
+  std::unique_ptr<views::MenuRunner> menu_runner_;
+
   DISALLOW_COPY_AND_ASSIGN(RootWindowController);
 };
 
diff --git a/ash/shelf/shelf_button.cc b/ash/shelf/shelf_button.cc
index faf0b4e..70adc8c4 100644
--- a/ash/shelf/shelf_button.cc
+++ b/ash/shelf/shelf_button.cc
@@ -8,11 +8,14 @@
 
 #include "ash/ash_constants.h"
 #include "ash/ash_switches.h"
+#include "ash/material_design/material_design_controller.h"
 #include "ash/shelf/shelf.h"
+#include "ash/shelf/shelf_constants.h"
 #include "ash/shelf/shelf_view.h"
 #include "base/time/time.h"
 #include "grit/ash_resources.h"
 #include "skia/ext/image_operations.h"
+#include "third_party/skia/include/core/SkPaint.h"
 #include "ui/accessibility/ax_view_state.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/compositor/layer.h"
@@ -37,6 +40,24 @@
 const int kIconPadVertical = 6;
 const int kAttentionThrobDurationMS = 800;
 const int kMaxAnimationSeconds = 10;
+const int kIndicatorOffsetFromBottom = 2;
+const int kIndicatorRadius = 2;
+const SkColor kIndicatorColor = SK_ColorWHITE;
+
+// Canvas scale to ensure that the activity indicator is not pixelated even at
+// the highest possible device scale factors.
+const int kIndicatorCanvasScale = 5;
+
+// Paints an activity indicator on |canvas| whose |size| is specified in DIP.
+void PaintIndicatorOnCanvas(gfx::Canvas* canvas, const gfx::Size& size) {
+  SkPaint paint;
+  paint.setColor(kIndicatorColor);
+  paint.setFlags(SkPaint::kAntiAlias_Flag);
+  canvas->DrawCircle(
+      gfx::Point(size.width() / 2,
+                 size.height() - kIndicatorOffsetFromBottom - kIndicatorRadius),
+      kIndicatorRadius, paint);
+}
 
 // Simple AnimationDelegate that owns a single ThrobAnimation instance to
 // keep all Draw Attention animations in sync.
@@ -486,8 +507,16 @@
 
   if (bar_id != 0) {
     Shelf* shelf = shelf_view_->shelf();
-    ResourceBundle* rb = &ResourceBundle::GetSharedInstance();
-    gfx::ImageSkia image = *rb->GetImageNamed(bar_id).ToImageSkia();
+    gfx::ImageSkia image;
+    if (ash::MaterialDesignController::IsShelfMaterial()) {
+      gfx::Size size(kShelfButtonSize, kShelfSize);
+      gfx::Canvas canvas(size, kIndicatorCanvasScale, true /* is_opaque */);
+      PaintIndicatorOnCanvas(&canvas, size);
+      image = gfx::ImageSkia(canvas.ExtractImageRep());
+    } else {
+      ResourceBundle* rb = &ResourceBundle::GetSharedInstance();
+      image = *rb->GetImageNamed(bar_id).ToImageSkia();
+    }
     if (!shelf->IsHorizontalAlignment()) {
       image = gfx::ImageSkiaOperations::CreateRotatedImage(
           image, shelf->alignment() == wm::SHELF_ALIGNMENT_LEFT
@@ -503,7 +532,6 @@
         views::ImageView::CENTER));
     bar_->SchedulePaint();
   }
-
   bar_->SetVisible(bar_id != 0 && state_ != STATE_NORMAL);
 }
 
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb
index 7fc2e8c4..1ac358d 100644
--- a/ash/strings/ash_strings_am.xtb
+++ b/ash/strings/ash_strings_am.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">አነስተኛ ኃይል ያለው ባትሪ መሙያ ተገናኝቷል</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">ለማየት ጠቅ ያድርጉ</translation>
+<translation id="8825534185036233643">ከሁለት ማሳያዎች በላይ ማንጸባረቅ አይደገፍም።</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8878886163241303700">ማያ ገጽ በማስቀጠል ላይ</translation>
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb
index 2595cf4..fc4cd1f 100644
--- a/ash/strings/ash_strings_ar.xtb
+++ b/ash/strings/ash_strings_ar.xtb
@@ -230,6 +230,7 @@
 <translation id="8676770494376880701">تمّ توصيل شاحن منخفض الطاقة</translation>
 <translation id="8814190375133053267">‏لاسلكي، Wi-Fi</translation>
 <translation id="882279321799040148">انقر للعرض</translation>
+<translation id="8825534185036233643">النسخ المطابق بأكثر من عرضين غير مدعوم.</translation>
 <translation id="8828714802988429505">90 درجة</translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8878886163241303700">توسيع الشاشة</translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb
index 8a5c4df..e937f1c0 100644
--- a/ash/strings/ash_strings_bg.xtb
+++ b/ash/strings/ash_strings_bg.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">Свързано е зарядно устройство с малка мощност</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">Кликнете, за да прегледате</translation>
+<translation id="8825534185036233643">Дублирането с повече от два екрана не се поддържа.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">търсене + Esc</translation>
 <translation id="8878886163241303700">Разгъване на екрана</translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb
index e56a7ed..3fc3fc29 100644
--- a/ash/strings/ash_strings_bn.xtb
+++ b/ash/strings/ash_strings_bn.xtb
@@ -232,6 +232,7 @@
 <translation id="8676770494376880701">নিম্ন শক্তির চার্জার সংযুক্ত করা হয়েছে</translation>
 <translation id="8814190375133053267">ওয়াই-ফাই</translation>
 <translation id="882279321799040148">দেখার জন্য ক্লিক করুন</translation>
+<translation id="8825534185036233643">দুটির বেশি প্রদর্শনের সাথে মিররিং সমর্থিত নয়।</translation>
 <translation id="8828714802988429505">৯০°</translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8878886163241303700">স্ক্রীন সম্প্রসারণ করা হচ্ছে</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb
index fb40e38..1ad12bb1 100644
--- a/ash/strings/ash_strings_ca.xtb
+++ b/ash/strings/ash_strings_ca.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">S'ha connectat un carregador de baix consum</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">Feu clic per visualitzar-la</translation>
+<translation id="8825534185036233643">No es pot projectar amb més de dues pantalles.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Cerca + Esc</translation>
 <translation id="8878886163241303700">Ampliació de la pantalla</translation>
diff --git a/ash/strings/ash_strings_cs.xtb b/ash/strings/ash_strings_cs.xtb
index 7ee3f335..a4433de 100644
--- a/ash/strings/ash_strings_cs.xtb
+++ b/ash/strings/ash_strings_cs.xtb
@@ -230,6 +230,7 @@
 <translation id="8676770494376880701">Byla připojena nabíječka s nízkým napětím</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">Kliknutím jej zobrazíte</translation>
+<translation id="8825534185036233643">Zrcadlení s více než dvěma obrazovkami není podporováno.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Hledat+Esc</translation>
 <translation id="8878886163241303700">Rozšíření obrazovky</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb
index d13e5a0..e57e9366 100644
--- a/ash/strings/ash_strings_da.xtb
+++ b/ash/strings/ash_strings_da.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">Oplader med lav kraft er tilsluttet</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">Klik for at se det</translation>
+<translation id="8825534185036233643">Spejling med mere end to skærme understøttes ikke.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Søg+Esc</translation>
 <translation id="8878886163241303700">Udvider skærm</translation>
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb
index 3ce03a4..ae82074 100644
--- a/ash/strings/ash_strings_de.xtb
+++ b/ash/strings/ash_strings_de.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">Schwachstrom-Ladegerät angeschlossen</translation>
 <translation id="8814190375133053267">WLAN</translation>
 <translation id="882279321799040148">Zum Anzeigen klicken</translation>
+<translation id="8825534185036233643">Das Spiegeln mit mehr als zwei Displays wird nicht unterstützt.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Suche + Esc</translation>
 <translation id="8878886163241303700">Bildschirmerweiterung</translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb
index 64d3a82..0bebca4 100644
--- a/ash/strings/ash_strings_el.xtb
+++ b/ash/strings/ash_strings_el.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">Ο συνδεδεμένος φορτιστής παρέχει χαμηλή ισχύ</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">Κάντε κλικ για προβολή</translation>
+<translation id="8825534185036233643">Δεν υποστηρίζεται ο κατοπτρισμός με περισσότερες από δύο οθόνες.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Πλήκτρο αναζήτησης+Esc</translation>
 <translation id="8878886163241303700">Επέκταση οθόνης</translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb
index 0cad707..1402cb0 100644
--- a/ash/strings/ash_strings_en-GB.xtb
+++ b/ash/strings/ash_strings_en-GB.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">Low-power charger connected</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">Click to view</translation>
+<translation id="8825534185036233643">Mirroring with more than two displays is not supported.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8878886163241303700">Extending screen</translation>
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb
index d741c85..ad9130f 100644
--- a/ash/strings/ash_strings_es-419.xtb
+++ b/ash/strings/ash_strings_es-419.xtb
@@ -232,6 +232,7 @@
 <translation id="8676770494376880701">Cargador de baja potencia conectado</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">Haz clic para verla.</translation>
+<translation id="8825534185036233643">La duplicación con más de dos pantallas no es compatible.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Tecla de búsqueda + Esc</translation>
 <translation id="8878886163241303700">Ampliando pantalla</translation>
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb
index 11cad5cd..d807cd9 100644
--- a/ash/strings/ash_strings_es.xtb
+++ b/ash/strings/ash_strings_es.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">Cargador de baja potencia conectado</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">Haz clic para verla</translation>
+<translation id="8825534185036233643">No se puede proyectar contenido en más de dos pantallas.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Buscar+Esc</translation>
 <translation id="8878886163241303700">Ampliando pantalla</translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb
index 77b18f5..fc7b629 100644
--- a/ash/strings/ash_strings_et.xtb
+++ b/ash/strings/ash_strings_et.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">Väikese energiakuluga laadija on ühendatud</translation>
 <translation id="8814190375133053267">WiFi</translation>
 <translation id="882279321799040148">Vaatamiseks klõpsake</translation>
+<translation id="8825534185036233643">Rohkem kui kahe ekraaniga peegeldamist ei toetata.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Otsing + ESC</translation>
 <translation id="8878886163241303700">Ekraani laiendamine</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb
index 6e12daa..5c949864 100644
--- a/ash/strings/ash_strings_fa.xtb
+++ b/ash/strings/ash_strings_fa.xtb
@@ -231,6 +231,7 @@
 <translation id="8676770494376880701">شارژر برق متصل شده ضعیف است</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">برای مشاهده کلیک کنید</translation>
+<translation id="8825534185036233643">«نمایش صفحه‌نمایش روی دستگاه دیگر» با بیش از دو نمایشگر پشتیبانی نمی‌شود.</translation>
 <translation id="8828714802988429505">۹۰°</translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8878886163241303700">صفحه گسترش یافته است</translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb
index 91e786f..a49fd010 100644
--- a/ash/strings/ash_strings_fi.xtb
+++ b/ash/strings/ash_strings_fi.xtb
@@ -230,6 +230,7 @@
 <translation id="8676770494376880701">Pienitehoinen laturi kytketty</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">Näytä klikkaamalla</translation>
+<translation id="8825534185036233643">Peilaamista yli kahdelle näytölle ei tueta.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Haku+Esc</translation>
 <translation id="8878886163241303700">Laajennettu näyttö</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb
index 7f9f1486..ea7d181 100644
--- a/ash/strings/ash_strings_fil.xtb
+++ b/ash/strings/ash_strings_fil.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">Nakakabit ang low-power charger</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">I-click upang tingnan</translation>
+<translation id="8825534185036233643">Hindi sinusuportahan ang pagmi-mirror sa mahigit sa dalawang display.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8878886163241303700">Pinapalawak ang screen</translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb
index 561ff5bf..eea592c 100644
--- a/ash/strings/ash_strings_fr.xtb
+++ b/ash/strings/ash_strings_fr.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">Chargeur de faible puissance connecté</translation>
 <translation id="8814190375133053267">Wi-Fi </translation>
 <translation id="882279321799040148">Cliquer ici pour afficher la capture d'écran</translation>
+<translation id="8825534185036233643">La duplication d'écran avec plus de deux écrans n'est pas acceptée.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Recherche+Échap</translation>
 <translation id="8878886163241303700">Extension de l'écran</translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb
index 3ecd062..59a040e 100644
--- a/ash/strings/ash_strings_gu.xtb
+++ b/ash/strings/ash_strings_gu.xtb
@@ -232,6 +232,7 @@
 <translation id="8676770494376880701">નિમ્ન-પાવર ચાર્જર કનેક્ટ કર્યું છે</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">જોવા માટે ક્લિક કરો</translation>
+<translation id="8825534185036233643">બે કરતાં વધુ પ્રદર્શનો સાથે મીરરીંગ સમર્થિત નથી.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8878886163241303700">સ્ક્રીનને વિસ્તૃત કરી રહ્યું છે</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb
index 71ca494..ddc155d47 100644
--- a/ash/strings/ash_strings_hi.xtb
+++ b/ash/strings/ash_strings_hi.xtb
@@ -232,6 +232,7 @@
 <translation id="8676770494376880701">कम-शक्ति वाला चार्जर</translation>
 <translation id="8814190375133053267">वाई-फ़ाई </translation>
 <translation id="882279321799040148">देखने के लिए क्लिक करें</translation>
+<translation id="8825534185036233643">दो से अधिक प्रदर्शनों की मिररिंग समर्थित नहीं है.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8878886163241303700">स्क्रीन का विस्तार करना</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb
index f9bdb88..6ca0b56 100644
--- a/ash/strings/ash_strings_hr.xtb
+++ b/ash/strings/ash_strings_hr.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">Priključen je punjač male snage</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">Kliknite za prikaz</translation>
+<translation id="8825534185036233643">Zrcaljenje s više od dva zaslona nije podržano.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Pretraživanje + Esc</translation>
 <translation id="8878886163241303700">Produljenje zaslona</translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb
index 90b031b..8540ff9 100644
--- a/ash/strings/ash_strings_hu.xtb
+++ b/ash/strings/ash_strings_hu.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">Kis teljesítményű töltő csatlakoztatva</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">Kattintson a megtekintéshez</translation>
+<translation id="8825534185036233643">A böngésző nem támogatja a tükrözést kettőnél több megjelenítő esetén.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Keresés+Esc</translation>
 <translation id="8878886163241303700">Kibővített képernyő</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb
index 09584fb4..9b52807 100644
--- a/ash/strings/ash_strings_id.xtb
+++ b/ash/strings/ash_strings_id.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">Pengisi daya rendah terpasang</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">Klik untuk melihat</translation>
+<translation id="8825534185036233643">Pencerminan dengan lebih dari dua layar tidak didukung.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8878886163241303700">Memperluas layar</translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb
index ae47aa8..253bea1 100644
--- a/ash/strings/ash_strings_it.xtb
+++ b/ash/strings/ash_strings_it.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">Caricabatterie a basso consumo collegato</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">Fai clic per visualizzare</translation>
+<translation id="8825534185036233643">Il mirroring con più di due display non è supportato.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Tasto di ricerca+ESC</translation>
 <translation id="8878886163241303700">Estensione schermo</translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb
index 5baadb8..b67fd09 100644
--- a/ash/strings/ash_strings_iw.xtb
+++ b/ash/strings/ash_strings_iw.xtb
@@ -232,6 +232,7 @@
 <translation id="8676770494376880701">חובר מטען בעל מתח נמוך</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">לחץ להצגה</translation>
+<translation id="8825534185036233643">אין תמיכה בשיקוף מסך עם יותר משני מסכים.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8878886163241303700">מסך מתרחב</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb
index 90c8a08..7279dcb9 100644
--- a/ash/strings/ash_strings_ja.xtb
+++ b/ash/strings/ash_strings_ja.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">低電力の充電器に接続されています</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">クリックして表示</translation>
+<translation id="8825534185036233643">2 台を超えるディスプレイのミラーリングはサポートされていません。</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8878886163241303700">画面を拡張しています</translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb
index 50841ae..9d47af5 100644
--- a/ash/strings/ash_strings_kn.xtb
+++ b/ash/strings/ash_strings_kn.xtb
@@ -232,6 +232,7 @@
 <translation id="8676770494376880701">ಕಡಿಮೆ ವಿದ್ಯುತ್ ಚಾರ್ಜರ್ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">ವೀಕ್ಷಿಸಲು ಕ್ಲಿಕ್ ಮಾಡಿ</translation>
+<translation id="8825534185036233643">ಎರಡಕ್ಕಿಂತ ಹೆಚ್ಚಿನ ಪ್ರದರ್ಶನಗಳ ಪ್ರತಿಬಿಂಬಿಸುವಿಕೆ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8878886163241303700">ಪರದೆಯನ್ನು ವಿಸ್ತರಿಸಲಾಗುತ್ತಿದೆ</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb
index b26101e..c8b9984 100644
--- a/ash/strings/ash_strings_ko.xtb
+++ b/ash/strings/ash_strings_ko.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">저출력 충전기 연결됨</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">클릭하여 보기</translation>
+<translation id="8825534185036233643">3개 이상의 디스플레이 미러링은 지원되지 않습니다.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8878886163241303700">화면 확대</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb
index 501c60d..614c152 100644
--- a/ash/strings/ash_strings_lt.xtb
+++ b/ash/strings/ash_strings_lt.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">Prijungtas mažos galios įkroviklis</translation>
 <translation id="8814190375133053267">WI-Fi</translation>
 <translation id="882279321799040148">Jei norite peržiūrėti, spustelėkite</translation>
+<translation id="8825534185036233643">Negalima bendrinti daugiau nei dviejų ekranų vaizdų.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Paieškos klavišas + „Esc“</translation>
 <translation id="8878886163241303700">Išplečiamas ekranas</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb
index 485844c9..680a93e 100644
--- a/ash/strings/ash_strings_ml.xtb
+++ b/ash/strings/ash_strings_ml.xtb
@@ -231,6 +231,7 @@
 <translation id="8676770494376880701">കുറഞ്ഞ തോതിൽ വൈദ്യുതി പ്രവഹിക്കുന്ന ചാർജർ കണക്റ്റുചെയ്‌തു</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">കാണുന്നതിന് ക്ലിക്കുചെയ്യുക</translation>
+<translation id="8825534185036233643">രണ്ടിലധികം ഡിസ്‌പ്ലേകളിൽ മിററിംഗ് ചെയ്യുന്നത് പിന്തുണയ്‌ക്കുന്നില്ല.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">തിരയൽ+Esc</translation>
 <translation id="8878886163241303700">സ്‌ക്രീൻ വിപുലീകരിക്കുന്നു</translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb
index 6470b0c..7cfe62f 100644
--- a/ash/strings/ash_strings_mr.xtb
+++ b/ash/strings/ash_strings_mr.xtb
@@ -232,6 +232,7 @@
 <translation id="8676770494376880701">निम्न-उर्जेचे चार्जर कनेक्ट केले</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">पाहण्यासाठी क्लिक करा</translation>
+<translation id="8825534185036233643">दोन पेक्षा जास्त प्रदर्शनापेक्षा जास्त मि‍ररिंग समर्थित नाही.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8878886163241303700">स्क्रीन विस्तृत करत आहे</translation>
diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb
index d6a8cff4e..5a81194f 100644
--- a/ash/strings/ash_strings_ms.xtb
+++ b/ash/strings/ash_strings_ms.xtb
@@ -232,6 +232,7 @@
 <translation id="8676770494376880701">Pengecas berkuasa rendah disambungkan</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">Klik untuk melihat</translation>
+<translation id="8825534185036233643">Pencerminan menggunakan lebih daripada dua paparan tidak disokong.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Carian+Esc</translation>
 <translation id="8878886163241303700">Meluaskan skrin</translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb
index e343c1c..e22ef25 100644
--- a/ash/strings/ash_strings_nl.xtb
+++ b/ash/strings/ash_strings_nl.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">Laag-vermogen-lader aangesloten</translation>
 <translation id="8814190375133053267">Wifi</translation>
 <translation id="882279321799040148">Klik om te bekijken</translation>
+<translation id="8825534185036233643">Mirroring met meer dan twee displays wordt niet ondersteund.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Zoeken+Esc</translation>
 <translation id="8878886163241303700">Uitgebreid scherm</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb
index faafa5a..4f35efa 100644
--- a/ash/strings/ash_strings_no.xtb
+++ b/ash/strings/ash_strings_no.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">Laveffektslader er tilkoblet</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">Klikk for å se den</translation>
+<translation id="8825534185036233643">Speiling med mer enn to skjermer støttes ikke.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Søk+Esc</translation>
 <translation id="8878886163241303700">Utvidet skjerm</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb
index 9c32e0b..7f37a2b 100644
--- a/ash/strings/ash_strings_pl.xtb
+++ b/ash/strings/ash_strings_pl.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">Podłączono ładowarkę o małej mocy</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">Kliknij, by wyświetlić</translation>
+<translation id="8825534185036233643">Odbicie lustrzane na więcej niż dwóch wyświetlaczach nie jest obsługiwane.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Szukaj+Esc</translation>
 <translation id="8878886163241303700">Rozszerzony ekran</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb
index 20a7bf63..7d71a1d 100644
--- a/ash/strings/ash_strings_pt-BR.xtb
+++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -232,6 +232,7 @@
 <translation id="8676770494376880701">Carregador de baixa potência conectado</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">Clique para visualizar</translation>
+<translation id="8825534185036233643">Não há compatibilidade com o espelhamento com mais de duas telas.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Pesquisa+Esc</translation>
 <translation id="8878886163241303700">Tela ampla</translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb
index d9b834a..13cfa90 100644
--- a/ash/strings/ash_strings_pt-PT.xtb
+++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">Carregador de baixo consumo ligado</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">Clique para ver</translation>
+<translation id="8825534185036233643">O espelhamento com mais do que dois ecrãs não é suportado.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Pesquisa+Esc</translation>
 <translation id="8878886163241303700">Ecrã alargado</translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb
index 07aeb61..1f9e6ba 100644
--- a/ash/strings/ash_strings_ro.xtb
+++ b/ash/strings/ash_strings_ro.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">A fost conectat un încărcător de putere joasă</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">Dați clic pentru afișare</translation>
+<translation id="8825534185036233643">Oglindirea cu mai mult de două afișaje nu este acceptată.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Tasta de căutare + Esc</translation>
 <translation id="8878886163241303700">Ecran extins</translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb
index 1377ff4b..4c8c44ab 100644
--- a/ash/strings/ash_strings_ru.xtb
+++ b/ash/strings/ash_strings_ru.xtb
@@ -232,6 +232,7 @@
 <translation id="8676770494376880701">Подключено маломощное зарядное устройство</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">Посмотреть</translation>
+<translation id="8825534185036233643">Зеркалирование более двух дисплеев не поддерживается.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Клавиша поиска + Esc</translation>
 <translation id="8878886163241303700">Раскрытый экран</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb
index caa9c97..6ead9b6 100644
--- a/ash/strings/ash_strings_sk.xtb
+++ b/ash/strings/ash_strings_sk.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">Pripojila sa nabíjačka s nízkym výkonom</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">Zobrazíte ju kliknutím tu</translation>
+<translation id="8825534185036233643">Zrkadlenie s viac ako dvoma obrazovkami nie je podporované.</translation>
 <translation id="8828714802988429505">90 °</translation>
 <translation id="8850991929411075241">Hľadať+Esc</translation>
 <translation id="8878886163241303700">Rozšírenie obrazovky</translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb
index 8dd793e..0ef69423 100644
--- a/ash/strings/ash_strings_sl.xtb
+++ b/ash/strings/ash_strings_sl.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">Priključen je nizkoenergijski polnilnik</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">Kliknite za prikaz</translation>
+<translation id="8825534185036233643">Zrcaljenje z več kot dvema zaslonoma ni podprto.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Iskanje + Esc</translation>
 <translation id="8878886163241303700">Razširjanje zaslona</translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb
index 07097c0..717d214 100644
--- a/ash/strings/ash_strings_sr.xtb
+++ b/ash/strings/ash_strings_sr.xtb
@@ -232,6 +232,7 @@
 <translation id="8676770494376880701">Повезан је пуњач мале снаге</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">Кликните за приказ</translation>
+<translation id="8825534185036233643">Пресликавање са више од два екрана није подржано.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8878886163241303700">Проширени екран</translation>
diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb
index aa90216..383c91d 100644
--- a/ash/strings/ash_strings_sv.xtb
+++ b/ash/strings/ash_strings_sv.xtb
@@ -231,6 +231,7 @@
 <translation id="8676770494376880701">Laddare med låg effekt ansluten</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">Klicka för att visa</translation>
+<translation id="8825534185036233643">Det finns inte stöd för spegling på fler än två skärmar.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Sök+Escape</translation>
 <translation id="8878886163241303700">Utökad skärm</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb
index 0786c33..a54b239 100644
--- a/ash/strings/ash_strings_sw.xtb
+++ b/ash/strings/ash_strings_sw.xtb
@@ -232,6 +232,7 @@
 <translation id="8676770494376880701">Chaja ya nguvu ya chini imeunganishwa</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">Bofya ili kutazama</translation>
+<translation id="8825534185036233643">Kuakisi kwa maonyesho zaidi ya mawili hakutumiki.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8878886163241303700">Kuongeza skrini</translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb
index aac7b02..1f52876f 100644
--- a/ash/strings/ash_strings_ta.xtb
+++ b/ash/strings/ash_strings_ta.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">குறைந்த சக்தியிலான சார்ஜர் இணைக்கப்பட்டுள்ளது</translation>
 <translation id="8814190375133053267">வைஃபை</translation>
 <translation id="882279321799040148">காண கிளிக் செய்க</translation>
+<translation id="8825534185036233643">இரண்டிற்கும் மேற்பட்ட திரைகளில் பிரதிபலிப்பது ஆதரிக்கப்படவில்லை.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8878886163241303700">திரையை விரிவாக்குகிறது</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb
index f77ce62..b1dd9792 100644
--- a/ash/strings/ash_strings_te.xtb
+++ b/ash/strings/ash_strings_te.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">తక్కువ-పవర్ గల ఛార్జర్ కనెక్ట్ చేయబడింది</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">వీక్షించడానికి క్లిక్ చేసినప్పుడు</translation>
+<translation id="8825534185036233643">రెండింటి కంటే ఎక్కువ డిస్‌ప్లేలతో మిర్రరింగ్ చేయడానికి మద్దతు లేదు.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8878886163241303700">స్క్రీన్ విస్తరించబడుతోంది</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb
index 5318217..d90f8d74 100644
--- a/ash/strings/ash_strings_th.xtb
+++ b/ash/strings/ash_strings_th.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">เชื่อมต่อกับที่ชาร์จพลังงานต่ำ</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">คลิกเพื่อดู</translation>
+<translation id="8825534185036233643">ไม่สนับสนุนการมิเรอร์บนจอแสดงผลเกิน 2 หน้าจอ</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8878886163241303700">กำลังขยายหน้าจอ</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb
index ade3b1d8..9a40c7f 100644
--- a/ash/strings/ash_strings_tr.xtb
+++ b/ash/strings/ash_strings_tr.xtb
@@ -234,6 +234,7 @@
 <translation id="8676770494376880701">Düşük güçlü şarj cihazı bağlandı</translation>
 <translation id="8814190375133053267">Kablosuz</translation>
 <translation id="882279321799040148">Görüntülemek için tıklayın</translation>
+<translation id="8825534185036233643">İkiden fazla ekranla yansıtma desteklenmez.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Ara+Esc</translation>
 <translation id="8878886163241303700">Genişletilmiş ekran</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb
index aa92b64..5db560a3 100644
--- a/ash/strings/ash_strings_uk.xtb
+++ b/ash/strings/ash_strings_uk.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">Зарядний пристрій низької потужності підключено</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">Натисніть, щоб переглянути</translation>
+<translation id="8825534185036233643">Дзеркалювання на більше ніж двох дисплеях не підтримується.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Search (Пошук)+Esc</translation>
 <translation id="8878886163241303700">Розширення екрана</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb
index 90bfb957..5c7ce24 100644
--- a/ash/strings/ash_strings_vi.xtb
+++ b/ash/strings/ash_strings_vi.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">Đã kết nối bộ sạc công suất thấp</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">Nhấp để xem</translation>
+<translation id="8825534185036233643">Không hỗ trợ tính năng phản chiếu với hai màn hình trở lên.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8878886163241303700">Mở rộng màn hình</translation>
diff --git a/ash/strings/ash_strings_zh-CN.xtb b/ash/strings/ash_strings_zh-CN.xtb
index bccd3c6..3d0113e 100644
--- a/ash/strings/ash_strings_zh-CN.xtb
+++ b/ash/strings/ash_strings_zh-CN.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">已连接低功率充电器</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">点击即可查看</translation>
+<translation id="8825534185036233643">系统不支持镜像两个以上的显示屏。</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8878886163241303700">正在扩展屏幕</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb
index 8607d54..65f16394 100644
--- a/ash/strings/ash_strings_zh-TW.xtb
+++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -233,6 +233,7 @@
 <translation id="8676770494376880701">已連接低功率充電器</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="882279321799040148">按這裡瀏覽</translation>
+<translation id="8825534185036233643">鏡像處理作業最多支援兩部顯示器。</translation>
 <translation id="8828714802988429505">90 度</translation>
 <translation id="8850991929411075241">搜尋鍵 + Esc 鍵</translation>
 <translation id="8878886163241303700">延伸螢幕</translation>
diff --git a/ash/system/chromeos/power/power_status_view.cc b/ash/system/chromeos/power/power_status_view.cc
index 56881a9..9c2c25f 100644
--- a/ash/system/chromeos/power/power_status_view.cc
+++ b/ash/system/chromeos/power/power_status_view.cc
@@ -28,10 +28,13 @@
 
 PowerStatusView::PowerStatusView(bool default_view_right_align)
     : default_view_right_align_(default_view_right_align),
-      time_status_label_(new views::Label),
       percentage_label_(new views::Label),
+      separator_label_(new views::Label),
+      time_status_label_(new views::Label),
       icon_(nullptr) {
   percentage_label_->SetEnabledColor(kHeaderTextColorNormal);
+  separator_label_->SetEnabledColor(kHeaderTextColorNormal);
+  separator_label_->SetText(base::ASCIIToUTF16(" - "));
   LayoutView();
   PowerStatus::Get()->AddObserver(this);
   OnPowerStatusChanged();
@@ -61,6 +64,7 @@
     SetLayoutManager(layout);
 
     AddChildView(percentage_label_);
+    AddChildView(separator_label_);
     AddChildView(time_status_label_);
 
     icon_ = new views::ImageView;
@@ -76,6 +80,7 @@
     AddChildView(icon_);
 
     AddChildView(percentage_label_);
+    AddChildView(separator_label_);
     AddChildView(time_status_label_);
   }
 }
@@ -118,11 +123,11 @@
                 minute);
       }
     }
-    battery_percentage = battery_time_status.empty() ?
-        battery_percentage : battery_percentage + base::ASCIIToUTF16(" - ");
   }
   percentage_label_->SetVisible(!battery_percentage.empty());
   percentage_label_->SetText(battery_percentage);
+  separator_label_->SetVisible(!battery_percentage.empty() &&
+                               !battery_time_status.empty());
   time_status_label_->SetVisible(!battery_time_status.empty());
   time_status_label_->SetText(battery_time_status);
 }
@@ -143,10 +148,12 @@
 void PowerStatusView::Layout() {
   views::View::Layout();
 
-  // Move the time_status_label_ closer to percentage_label_.
-  if (percentage_label_ && time_status_label_ &&
+  // Move the time_status_label_, separator_label_, and percentage_label_
+  // closer to each other.
+  if (percentage_label_ && separator_label_ && time_status_label_ &&
       percentage_label_->visible() && time_status_label_->visible()) {
-    time_status_label_->SetX(percentage_label_->bounds().right() + 1);
+    separator_label_->SetX(percentage_label_->bounds().right() + 1);
+    time_status_label_->SetX(separator_label_->bounds().right() + 1);
   }
 }
 
diff --git a/ash/system/chromeos/power/power_status_view.h b/ash/system/chromeos/power/power_status_view.h
index 5d80c39..c050d4d 100644
--- a/ash/system/chromeos/power/power_status_view.h
+++ b/ash/system/chromeos/power/power_status_view.h
@@ -44,8 +44,9 @@
   // if true; otherwise, layout the UI items on the left side.
   bool default_view_right_align_;
 
-  views::Label* time_status_label_;
   views::Label* percentage_label_;
+  views::Label* separator_label_;
+  views::Label* time_status_label_;
 
   // Battery status indicator icon.
   views::ImageView* icon_;
diff --git a/base/numerics/safe_conversions.h b/base/numerics/safe_conversions.h
index 42232c67..0dd7126 100644
--- a/base/numerics/safe_conversions.h
+++ b/base/numerics/safe_conversions.h
@@ -67,6 +67,24 @@
   }
 };
 
+namespace internal {
+// This wrapper is used for C++11 constexpr support by avoiding the declaration
+// of local variables in the saturated_cast template function.
+template <typename Dst, class NaNHandler, typename Src>
+inline constexpr Dst saturated_cast_impl(const Src value,
+                                         const RangeConstraint constraint) {
+  return constraint == RANGE_VALID
+             ? static_cast<Dst>(value)
+             : (constraint == RANGE_UNDERFLOW
+                    ? std::numeric_limits<Dst>::min()
+                    : (constraint == RANGE_OVERFLOW
+                           ? std::numeric_limits<Dst>::max()
+                           : (constraint == RANGE_INVALID
+                                  ? NaNHandler::template HandleNaN<Dst>()
+                                  : (NOTREACHED(), static_cast<Dst>(value)))));
+}
+}  // namespace internal
+
 // saturated_cast<> is analogous to static_cast<> for numeric types, except
 // that the specified numeric conversion will saturate rather than overflow or
 // underflow. NaN assignment to an integral will defer the behavior to a
@@ -74,28 +92,11 @@
 template <typename Dst,
           class NaNHandler = SaturatedCastNaNBehaviorReturnZero,
           typename Src>
-inline Dst saturated_cast(Src value) {
-  // Optimization for floating point values, which already saturate.
-  if (std::numeric_limits<Dst>::is_iec559)
-    return static_cast<Dst>(value);
-
-  switch (internal::DstRangeRelationToSrcRange<Dst>(value)) {
-    case internal::RANGE_VALID:
-      return static_cast<Dst>(value);
-
-    case internal::RANGE_UNDERFLOW:
-      return std::numeric_limits<Dst>::min();
-
-    case internal::RANGE_OVERFLOW:
-      return std::numeric_limits<Dst>::max();
-
-    // Should fail only on attempting to assign NaN to a saturated integer.
-    case internal::RANGE_INVALID:
-      return NaNHandler::template HandleNaN<Dst>();
-  }
-
-  NOTREACHED();
-  return static_cast<Dst>(value);
+inline constexpr Dst saturated_cast(Src value) {
+  return std::numeric_limits<Dst>::is_iec559
+             ? static_cast<Dst>(value)  // Floating point optimization.
+             : internal::saturated_cast_impl<Dst, NaNHandler>(
+                   value, internal::DstRangeRelationToSrcRange<Dst>(value));
 }
 
 // strict_cast<> is analogous to static_cast<> for numeric types, except that
diff --git a/base/threading/sequenced_worker_pool.cc b/base/threading/sequenced_worker_pool.cc
index ee573f4d..57961b5c 100644
--- a/base/threading/sequenced_worker_pool.cc
+++ b/base/threading/sequenced_worker_pool.cc
@@ -31,6 +31,7 @@
 #include "base/threading/thread_restrictions.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
+#include "base/trace_event/heap_profiler.h"
 #include "base/trace_event/trace_event.h"
 #include "base/tracked_objects.h"
 #include "build/build_config.h"
@@ -810,6 +811,8 @@
             TRACE_EVENT_FLAG_FLOW_IN,
             "src_file", task.posted_from.file_name(),
             "src_func", task.posted_from.function_name());
+        TRACE_HEAP_PROFILER_API_SCOPED_TASK_EXECUTION task_event(
+            task.posted_from.file_name());
         int new_thread_id = WillRunWorkerTask(task);
         {
           AutoUnlock unlock(lock_);
diff --git a/blimp/client/BUILD.gn b/blimp/client/BUILD.gn
index d773b26..34ac0dcb 100644
--- a/blimp/client/BUILD.gn
+++ b/blimp/client/BUILD.gn
@@ -64,6 +64,7 @@
     "//third_party/libwebp",
     "//ui/gfx/geometry",
     "//ui/gl",
+    "//ui/gl/init",
     "//url:url",
   ]
 }
@@ -99,10 +100,15 @@
   if (is_linux) {
     sources += [ "session/assignment_source_unittest.cc" ]
     deps += [
+      "//blimp/common",
+      "//blimp/common:test_support",
       "//components/safe_json:test_support",
       "//net:test_support",
     ]
-    data += [ "session/test_selfsigned_cert.pem" ]
+    data += [
+      "session/test_selfsigned_cert.pem",
+      "//blimp/test/data/test_client_token",
+    ]
   }
 }
 
diff --git a/blimp/client/app/blimp_startup.cc b/blimp/client/app/blimp_startup.cc
index 71dad32..0b45e9e 100644
--- a/blimp/client/app/blimp_startup.cc
+++ b/blimp/client/app/blimp_startup.cc
@@ -15,7 +15,7 @@
 #include "blimp/client/app/blimp_discardable_memory_allocator.h"
 #include "blimp/client/feature/compositor/decoding_image_generator.h"
 #include "third_party/skia/include/core/SkGraphics.h"
-#include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 
 class SkImageGenerator;
 
@@ -73,7 +73,7 @@
   // Set the DiscardableMemoryAllocator.
   base::DiscardableMemoryAllocator::SetInstance(
       g_discardable_memory_allocator.Pointer());
-  if (!gfx::GLSurface::InitializeOneOff())
+  if (!gl::init::InitializeGLOneOff())
     return false;
   SkGraphics::Init();
   SkGraphics::SetImageGeneratorFromEncodedFactory(CreateImageGenerator);
diff --git a/blimp/client/session/assignment_source.cc b/blimp/client/session/assignment_source.cc
index f22e554..2a08376b 100644
--- a/blimp/client/session/assignment_source.cc
+++ b/blimp/client/session/assignment_source.cc
@@ -15,8 +15,10 @@
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/task_runner_util.h"
+#include "base/threading/thread_restrictions.h"
 #include "base/values.h"
 #include "blimp/client/app/blimp_client_switches.h"
+#include "blimp/common/get_client_token.h"
 #include "blimp/common/protocol_version.h"
 #include "components/safe_json/safe_json_parser.h"
 #include "net/base/ip_address.h"
@@ -99,22 +101,21 @@
 // Must be called on a thread suitable for file IO.
 Assignment GetAssignmentFromCommandLine() {
   Assignment assignment;
-  assignment.client_token = kDummyClientToken;
+
+  const base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess();
+  assignment.client_token = GetClientToken(*cmd_line);
+  CHECK(!assignment.client_token.empty()) << "No client token provided.";
 
   unsigned port_parsed = 0;
   if (!base::StringToUint(
-          base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
-              switches::kEnginePort),
-          &port_parsed) ||
-      !IsValidIpPortNumber(port_parsed)) {
+          cmd_line->GetSwitchValueASCII(switches::kEnginePort),
+          &port_parsed) || !IsValidIpPortNumber(port_parsed)) {
     DLOG(FATAL) << "--engine-port must be a value between 1 and 65535.";
     return Assignment();
   }
 
   net::IPAddress ip_address;
-  std::string ip_str =
-      base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
-          switches::kEngineIP);
+  std::string ip_str = cmd_line->GetSwitchValueASCII(switches::kEngineIP);
   if (!ip_address.AssignFromIPLiteral(ip_str)) {
     DLOG(FATAL) << "Invalid engine IP " << ip_str;
     return Assignment();
@@ -123,8 +124,7 @@
       net::IPEndPoint(ip_address, base::checked_cast<uint16_t>(port_parsed));
 
   std::string transport_str =
-      base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
-          switches::kEngineTransport);
+      cmd_line->GetSwitchValueASCII(switches::kEngineTransport);
   if (transport_str == kSSLTransportValue) {
     assignment.transport_protocol = Assignment::TransportProtocol::SSL;
   } else if (transport_str == kTCPTransportValue) {
@@ -137,8 +137,7 @@
   scoped_refptr<net::X509Certificate> cert;
   if (assignment.transport_protocol == Assignment::TransportProtocol::SSL) {
     base::FilePath cert_path =
-        base::CommandLine::ForCurrentProcess()->GetSwitchValuePath(
-            switches::kEngineCertPath);
+        cmd_line->GetSwitchValuePath(switches::kEngineCertPath);
     if (cert_path.empty()) {
       DLOG(FATAL) << "Missing required parameter --"
                   << switches::kEngineCertPath << ".";
diff --git a/blimp/client/session/assignment_source.h b/blimp/client/session/assignment_source.h
index 6999337..56ba28a 100644
--- a/blimp/client/session/assignment_source.h
+++ b/blimp/client/session/assignment_source.h
@@ -28,9 +28,6 @@
 namespace blimp {
 namespace client {
 
-// TODO(kmarshall): Take values from configuration data.
-const char kDummyClientToken[] = "MyVoiceIsMyPassport";
-
 // An Assignment contains the configuration data needed for a client
 // to connect to the engine.
 struct Assignment {
diff --git a/blimp/client/session/assignment_source_unittest.cc b/blimp/client/session/assignment_source_unittest.cc
index b34820c..49301547 100644
--- a/blimp/client/session/assignment_source_unittest.cc
+++ b/blimp/client/session/assignment_source_unittest.cc
@@ -16,7 +16,9 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/values.h"
 #include "blimp/client/app/blimp_client_switches.h"
+#include "blimp/common/get_client_token.h"
 #include "blimp/common/protocol_version.h"
+#include "blimp/common/switches.h"
 #include "components/safe_json/testing_json_parser.h"
 #include "net/base/test_data_directory.h"
 #include "net/url_request/test_url_fetcher_factory.h"
@@ -45,6 +47,7 @@
 const char kTestClientToken[] = "secrett0ken";
 const char kTestAuthToken[] = "UserAuthT0kenz";
 const char kAssignerUrl[] = "http://www.assigner.test/";
+const char kTestClientTokenPath[] = "blimp/test/data/test_client_token";
 
 MATCHER_P(AssignmentEquals, assignment, "") {
   return arg.transport_protocol == assignment.transport_protocol &&
@@ -74,6 +77,7 @@
     PathService::Get(base::DIR_SOURCE_ROOT, &src_root);
     ASSERT_FALSE(src_root.empty());
     cert_path_ = src_root.Append(kCertRelativePath);
+    client_token_path_ = src_root.Append(kTestClientTokenPath);
     ASSERT_TRUE(base::ReadFileToString(cert_path_, &cert_pem_));
     net::CertificateList cert_list =
         net::X509Certificate::CreateCertificateListFromBytes(
@@ -163,6 +167,9 @@
   // Path to the PEM-encoded certificate chain.
   base::FilePath cert_path_;
 
+  // Path to the client token;
+  base::FilePath client_token_path_;
+
   // Payload of PEM certificate chain at |cert_path_|.
   std::string cert_pem_;
 
@@ -199,15 +206,18 @@
   Assignment assignment;
   assignment.transport_protocol = Assignment::TransportProtocol::TCP;
   assignment.engine_endpoint = net::IPEndPoint(kTestIpAddress, kTestPort);
-  assignment.client_token = kDummyClientToken;
   assignment.cert = scoped_refptr<net::X509Certificate>(nullptr);
 
-  base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
-      switches::kEngineIP, kTestIpAddressString);
-  base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
-      switches::kEnginePort, std::to_string(kTestPort));
-  base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
-      switches::kEngineTransport, kTcpTransportName);
+  auto cmd_line = base::CommandLine::ForCurrentProcess();
+  cmd_line->AppendSwitchASCII(switches::kEngineIP, kTestIpAddressString);
+  cmd_line->AppendSwitchASCII(switches::kEnginePort,
+                              std::to_string(kTestPort));
+  cmd_line->AppendSwitchASCII(switches::kEngineTransport, kTcpTransportName);
+  cmd_line->AppendSwitchASCII(kClientTokenPath, client_token_path_.value());
+
+  assignment.client_token = GetClientToken(*cmd_line);
+
+  CHECK_EQ("MyVoiceIsMyPassport", assignment.client_token);
 
   EXPECT_CALL(*this, AssignmentResponse(AssignmentSource::Result::RESULT_OK,
                                         AssignmentEquals(assignment)))
@@ -220,17 +230,18 @@
   Assignment assignment;
   assignment.transport_protocol = Assignment::TransportProtocol::SSL;
   assignment.engine_endpoint = net::IPEndPoint(kTestIpAddress, kTestPort);
-  assignment.client_token = kDummyClientToken;
   assignment.cert = cert_;
 
-  base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
-      switches::kEngineIP, kTestIpAddressString);
-  base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
-      switches::kEnginePort, std::to_string(kTestPort));
-  base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
-      switches::kEngineTransport, kSslTransportName);
-  base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
-      switches::kEngineCertPath, cert_path_.value());
+  auto cmd_line = base::CommandLine::ForCurrentProcess();
+
+  cmd_line->AppendSwitchASCII(switches::kEngineIP, kTestIpAddressString);
+  cmd_line->AppendSwitchASCII(switches::kEnginePort,
+                              std::to_string(kTestPort));
+  cmd_line->AppendSwitchASCII(switches::kEngineTransport, kSslTransportName);
+  cmd_line->AppendSwitchASCII(switches::kEngineCertPath, cert_path_.value());
+  cmd_line->AppendSwitchASCII(kClientTokenPath, client_token_path_.value());
+
+  assignment.client_token = GetClientToken(*cmd_line);
 
   EXPECT_CALL(*this, AssignmentResponse(AssignmentSource::Result::RESULT_OK,
                                         AssignmentEquals(assignment)))
diff --git a/blimp/client/session/blimp_client_session.cc b/blimp/client/session/blimp_client_session.cc
index 760842ab..e4be5dd 100644
--- a/blimp/client/session/blimp_client_session.cc
+++ b/blimp/client/session/blimp_client_session.cc
@@ -191,6 +191,7 @@
 }
 
 void BlimpClientSession::Connect(const std::string& client_auth_token) {
+  VLOG(1) << "Trying to get assignment.";
   assignment_source_->GetAssignment(
       client_auth_token, base::Bind(&BlimpClientSession::ConnectWithAssignment,
                                     weak_factory_.GetWeakPtr()));
@@ -201,10 +202,12 @@
   OnAssignmentConnectionAttempted(result, assignment);
 
   if (result != AssignmentSource::Result::RESULT_OK) {
-    VLOG(1) << "Assignment request failed: " << result;
+    LOG(FATAL) << "Assignment failed, reason: " << result;
     return;
   }
 
+  VLOG(1) << "Assignment succeeded";
+
   io_thread_.task_runner()->PostTask(
       FROM_HERE,
       base::Bind(&ClientNetworkComponents::ConnectWithAssignment,
diff --git a/blimp/common/BUILD.gn b/blimp/common/BUILD.gn
index 287b7b5b..57dc9ca7 100644
--- a/blimp/common/BUILD.gn
+++ b/blimp/common/BUILD.gn
@@ -17,9 +17,13 @@
     "compositor/blimp_task_graph_runner.h",
     "create_blimp_message.cc",
     "create_blimp_message.h",
+    "get_client_token.cc",
+    "get_client_token.h",
     "logging.cc",
     "logging.h",
     "protocol_version.h",
+    "switches.cc",
+    "switches.h",
   ]
 
   defines = [ "BLIMP_COMMON_IMPLEMENTATION=1" ]
diff --git a/blimp/common/get_client_token.cc b/blimp/common/get_client_token.cc
new file mode 100644
index 0000000..025bf19
--- /dev/null
+++ b/blimp/common/get_client_token.cc
@@ -0,0 +1,23 @@
+// 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 "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/strings/string_util.h"
+#include "blimp/common/get_client_token.h"
+#include "blimp/common/switches.h"
+
+namespace blimp {
+
+std::string GetClientToken(const base::CommandLine& cmd_line) {
+  std::string file_contents;
+  const base::FilePath path = cmd_line.GetSwitchValuePath(kClientTokenPath);
+  if (!base::ReadFileToString(path, &file_contents)) {
+    LOG(ERROR) << "Could not read client token file at "
+               << (path.empty() ? "(not provided)" : path.AsUTF8Unsafe());
+  }
+  return base::CollapseWhitespaceASCII(file_contents, true);
+}
+
+}  // namespace blimp
diff --git a/blimp/common/get_client_token.h b/blimp/common/get_client_token.h
new file mode 100644
index 0000000..bc6574d1
--- /dev/null
+++ b/blimp/common/get_client_token.h
@@ -0,0 +1,22 @@
+// 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 BLIMP_COMMON_GET_CLIENT_TOKEN_H_
+#define BLIMP_COMMON_GET_CLIENT_TOKEN_H_
+
+#include <string>
+
+#include "base/command_line.h"
+#include "blimp/common/blimp_common_export.h"
+
+namespace blimp {
+
+// Gets the client token from the file provided by the command line. If a read
+// does not succeed, or the switch is malformed, an empty string is returned.
+BLIMP_COMMON_EXPORT std::string GetClientToken(
+    const base::CommandLine& cmd_line);
+
+}  // namespace blimp
+
+#endif  // BLIMP_COMMON_GET_CLIENT_TOKEN_H_
diff --git a/blimp/common/proto/input.proto b/blimp/common/proto/input.proto
index 0905884..5e23906 100644
--- a/blimp/common/proto/input.proto
+++ b/blimp/common/proto/input.proto
@@ -57,6 +57,16 @@
   optional float scale = 2;
 }
 
+message GestureTapDown {
+  optional float width = 1;
+  optional float height = 2;
+}
+
+message GestureShowPress {
+  optional float width = 1;
+  optional float height = 2;
+}
+
 message InputMessage {
   enum Type {
     UNKNOWN = 0;
@@ -74,27 +84,33 @@
     Type_GesturePinchBegin = 7;
     Type_GesturePinchEnd = 8;
     Type_GesturePinchUpdate = 9;
+    Type_GestureTapDown = 10;
+    Type_GestureTapCancel = 11;
+    Type_GestureTapUnconfirmed = 12;
+    Type_GestureShowPress = 13;
   }
 
   optional Type type = 1;
 
   // An ID that corresponds to RenderWidgetMessage.render_widget_id.
-  optional int32 render_widget_id = 10;
+  optional int32 render_widget_id = 2;
 
   // Seconds since client platform start (boot) with millisecond resolution.
   // On Android, this is based off of the client's SystemClock#uptimeMillis().
-  optional double timestamp_seconds = 2;
+  optional double timestamp_seconds = 3;
 
-  optional GestureCommon gesture_common = 3;
+  optional GestureCommon gesture_common = 4;
 
   // Input event specific messages follow.
   // Only one of these fields may be set per InputMessage.
   // TODO(dtrainor): use a 'oneof' union when it's supported in Chromium.  See
   // crbug.com/570371.
-  optional GestureScrollBegin gesture_scroll_begin = 4;
-  optional GestureScrollUpdate gesture_scroll_update = 5;
-  optional GestureFlingStart gesture_fling_start = 6;
-  optional GestureFlingCancel gesture_fling_cancel = 7;
-  optional GestureTap gesture_tap = 8;
-  optional GesturePinchUpdate gesture_pinch_update = 9;
+  optional GestureScrollBegin gesture_scroll_begin = 5;
+  optional GestureScrollUpdate gesture_scroll_update = 6;
+  optional GestureFlingStart gesture_fling_start = 7;
+  optional GestureFlingCancel gesture_fling_cancel = 8;
+  optional GestureTap gesture_tap = 9;
+  optional GesturePinchUpdate gesture_pinch_update = 10;
+  optional GestureTapDown gesture_tap_down = 11;
+  optional GestureShowPress gesture_show_press = 12;
 }
diff --git a/blimp/common/switches.cc b/blimp/common/switches.cc
new file mode 100644
index 0000000..4f1c056
--- /dev/null
+++ b/blimp/common/switches.cc
@@ -0,0 +1,11 @@
+// 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 "blimp/common/switches.h"
+
+namespace blimp {
+
+const char kClientTokenPath[] = "blimp-client-token-path";
+
+}  // namespace blimp
diff --git a/blimp/common/switches.h b/blimp/common/switches.h
new file mode 100644
index 0000000..e29bd33
--- /dev/null
+++ b/blimp/common/switches.h
@@ -0,0 +1,17 @@
+// 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 BLIMP_COMMON_SWITCHES_H_
+#define BLIMP_COMMON_SWITCHES_H_
+
+#include "blimp/common/blimp_common_export.h"
+
+namespace blimp {
+
+// Path to the client token/shared secret between the Engine and the Client.
+extern BLIMP_COMMON_EXPORT const char kClientTokenPath[];
+
+}  // namespace blimp
+
+#endif  // BLIMP_COMMON_SWITCHES_H_
diff --git a/blimp/docs/running.md b/blimp/docs/running.md
index 5d087f1..97c6f06 100644
--- a/blimp/docs/running.md
+++ b/blimp/docs/running.md
@@ -23,6 +23,23 @@
 The engine sends partially rendered content to the client. To request the complete
 page from the engine, use the `--download-whole-document` flag on the client.
 
+### Specifying the client auth token file
+The client needs access to a file containing a client auth token. One should
+make sure this file is available by pushing it onto the device before running
+the client. One can do this by running the following command:
+
+```bash
+adb push /path/to/blimp_client_token \
+  /data/data/org.chromium.blimp/blimp_client_token
+```
+
+To have the client use the given client auth token file, use the
+`--blimp-client-token-path` flag (e.g.
+`--blimp-client-token-path=/data/data/org.chromium.blimp/blimp_client_token`)
+
+An example of a client token file is
+[test_client_token](https://code.google.com/p/chromium/codesearch#chromium/src/blimp/test/data/test_client_token).
+
 ### Android Client
 
 Install the Blimp APK with the following:
@@ -101,19 +118,8 @@
   renderer.
 
 #### Typical invocation
-When the client connects to a manually specified engine instead of using the
-assigner, it will use a dummy token. The engine needs to know what this token
-is, so it must be provided using the `--blimp-client-token-path` flag. The token
-is available in the constant `kDummyClientToken` in
-`blimp/client/session/assignment_source.h`. You can easily store that to a file
-by running the following command once:
 
-```bash
-awk '{if ( match($0, /^\s*const char kDummyClientToken.*/) ) { print substr($5, 2, length($5)-3);} }' \
-  ./blimp/client/session/assignment_source.h > /tmp/blimpengine-token
-```
-
-Then start the engine using these flags:
+One can start the engine using these flags:
 
 ```bash
 out-linux/Debug/blimp_engine_app \
diff --git a/blimp/engine/BUILD.gn b/blimp/engine/BUILD.gn
index fb1fe5a..797de10 100644
--- a/blimp/engine/BUILD.gn
+++ b/blimp/engine/BUILD.gn
@@ -64,7 +64,6 @@
     ":app_net",
     ":app_permissions",
     ":app_settings",
-    ":app_switches",
     ":app_ui",
     ":blob_channel",
     ":common",
@@ -93,8 +92,8 @@
     "app/blimp_engine_config.h",
   ]
   deps = [
-    ":app_switches",
     "//base",
+    "//blimp/common",
     "//cc",
     "//content/public/common",
     "//ui/gl",
@@ -378,10 +377,11 @@
     ":app_metrics",
     ":app_net",
     ":app_settings",
-    ":app_switches",
     "//base",
     "//base/test:run_all_unittests",
     "//base/test:test_support",
+    "//blimp/common",
+    "//blimp/common:test_support",
     "//blimp/engine:app_ui",
     "//components/metrics:metrics",
     "//components/pref_registry:pref_registry",
diff --git a/blimp/engine/app/blimp_engine_config.cc b/blimp/engine/app/blimp_engine_config.cc
index ecf9e11..307e6b1 100644
--- a/blimp/engine/app/blimp_engine_config.cc
+++ b/blimp/engine/app/blimp_engine_config.cc
@@ -13,7 +13,7 @@
 #include "base/files/file_util.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/string_util.h"
-#include "blimp/engine/app/switches.h"
+#include "blimp/common/get_client_token.h"
 #include "cc/base/switches.h"
 #include "content/public/common/content_switches.h"
 #include "ui/gl/gl_switches.h"
@@ -22,20 +22,6 @@
 namespace blimp {
 namespace engine {
 
-namespace {
-// Gets the client token from the file provided by the command line. If a read
-// does not succeed, or the switch is malformed, an empty string is returned.
-std::string GetClientToken(const base::CommandLine& cmd_line) {
-  std::string file_contents;
-  const base::FilePath path = cmd_line.GetSwitchValuePath(kClientTokenPath);
-  if (!base::ReadFileToString(path, &file_contents)) {
-    LOG(ERROR) << "Could not read client token file at "
-               << (path.empty() ? "(not provided)" : path.AsUTF8Unsafe());
-  }
-  return base::CollapseWhitespaceASCII(file_contents, true);
-}
-}  // namespace
-
 void SetCommandLineDefaults(base::CommandLine* command_line) {
   command_line->AppendSwitch(::switches::kEnableOverlayScrollbar);
   command_line->AppendSwitch(cc::switches::kDisableCachedPictureRaster);
diff --git a/blimp/engine/app/blimp_engine_config_unittest.cc b/blimp/engine/app/blimp_engine_config_unittest.cc
index d4afec2..1da80488 100644
--- a/blimp/engine/app/blimp_engine_config_unittest.cc
+++ b/blimp/engine/app/blimp_engine_config_unittest.cc
@@ -12,7 +12,7 @@
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/strings/stringprintf.h"
-#include "blimp/engine/app/switches.h"
+#include "blimp/common/switches.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace blimp {
diff --git a/blimp/engine/app/switches.cc b/blimp/engine/app/switches.cc
index d993d91..0cfe19d 100644
--- a/blimp/engine/app/switches.cc
+++ b/blimp/engine/app/switches.cc
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
+// 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.
 
@@ -7,7 +7,6 @@
 namespace blimp {
 namespace engine {
 
-const char kClientTokenPath[] = "blimp-client-token-path";
 const char kEnginePort[] = "engine-port";
 
 }  // namespace engine
diff --git a/blimp/engine/app/switches.h b/blimp/engine/app/switches.h
index 6e25d73..b7c807f 100644
--- a/blimp/engine/app/switches.h
+++ b/blimp/engine/app/switches.h
@@ -1,4 +1,4 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
+// 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.
 
@@ -8,9 +8,6 @@
 namespace blimp {
 namespace engine {
 
-// Path to the client token/shared secret between the engine and the client.
-extern const char kClientTokenPath[];
-
 // The port to listen to for incoming TCP connections.
 extern const char kEnginePort[];
 
diff --git a/blimp/engine/app/ui/blimp_screen_unittest.cc b/blimp/engine/app/ui/blimp_screen_unittest.cc
index 9753fef..b45420f1 100644
--- a/blimp/engine/app/ui/blimp_screen_unittest.cc
+++ b/blimp/engine/app/ui/blimp_screen_unittest.cc
@@ -13,7 +13,6 @@
 #include "base/files/scoped_temp_dir.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/stringprintf.h"
-#include "blimp/engine/app/switches.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/display/display.h"
diff --git a/blimp/engine/session/blimp_engine_session.cc b/blimp/engine/session/blimp_engine_session.cc
index 037f3e80..60297171 100644
--- a/blimp/engine/session/blimp_engine_session.cc
+++ b/blimp/engine/session/blimp_engine_session.cc
@@ -388,8 +388,8 @@
 void BlimpEngineSession::OnWebGestureEvent(
     content::RenderWidgetHost* render_widget_host,
     std::unique_ptr<blink::WebGestureEvent> event) {
-  TRACE_EVENT0("blimp", "BlimpEngineSession::OnWebGestureEvent");
-
+  TRACE_EVENT1("blimp", "BlimpEngineSession::OnWebGestureEvent", "type",
+               event->type);
   render_widget_host->ForwardGestureEvent(*event);
 }
 
diff --git a/blimp/net/input_message_converter.cc b/blimp/net/input_message_converter.cc
index 99427c6a..7badd713 100644
--- a/blimp/net/input_message_converter.cc
+++ b/blimp/net/input_message_converter.cc
@@ -126,6 +126,49 @@
   return event;
 }
 
+std::unique_ptr<blink::WebGestureEvent> ProtoToGestureTapDown(
+    const InputMessage& proto) {
+  std::unique_ptr<blink::WebGestureEvent> event(
+      BuildCommonWebGesture(proto, blink::WebInputEvent::Type::GestureTapDown));
+
+  const GestureTapDown& details = proto.gesture_tap_down();
+  event->data.tapDown.width = details.width();
+  event->data.tapDown.height = details.height();
+
+  return event;
+}
+
+std::unique_ptr<blink::WebGestureEvent> ProtoToGestureTapCancel(
+    const InputMessage& proto) {
+  return BuildCommonWebGesture(proto,
+                               blink::WebInputEvent::Type::GestureTapCancel);
+}
+
+std::unique_ptr<blink::WebGestureEvent> ProtoToGestureTapUnconfirmed(
+    const InputMessage& proto) {
+  std::unique_ptr<blink::WebGestureEvent> event(BuildCommonWebGesture(
+      proto, blink::WebInputEvent::Type::GestureTapUnconfirmed));
+
+  const GestureTap& details = proto.gesture_tap();
+  event->data.tap.tapCount = details.tap_count();
+  event->data.tap.width = details.width();
+  event->data.tap.height = details.height();
+
+  return event;
+}
+
+std::unique_ptr<blink::WebGestureEvent> ProtoToGestureShowPress(
+    const InputMessage& proto) {
+  std::unique_ptr<blink::WebGestureEvent> event(BuildCommonWebGesture(
+      proto, blink::WebInputEvent::Type::GestureShowPress));
+
+  const GestureShowPress& details = proto.gesture_show_press();
+  event->data.showPress.width = details.width();
+  event->data.showPress.height = details.height();
+
+  return event;
+}
+
 }  // namespace
 
 InputMessageConverter::InputMessageConverter() {}
@@ -164,6 +207,18 @@
     case InputMessage::Type_GesturePinchUpdate:
       event = ProtoToGesturePinchUpdate(message);
       break;
+    case InputMessage::Type_GestureTapDown:
+      event = ProtoToGestureTapDown(message);
+      break;
+    case InputMessage::Type_GestureTapCancel:
+      event = ProtoToGestureTapCancel(message);
+      break;
+    case InputMessage::Type_GestureTapUnconfirmed:
+      event = ProtoToGestureTapUnconfirmed(message);
+      break;
+    case InputMessage::Type_GestureShowPress:
+      event = ProtoToGestureShowPress(message);
+      break;
     case InputMessage::UNKNOWN:
       DLOG(FATAL) << "Received an InputMessage with an unknown type.";
       return nullptr;
diff --git a/blimp/net/input_message_generator.cc b/blimp/net/input_message_generator.cc
index 195def3a..e7ca4f4 100644
--- a/blimp/net/input_message_generator.cc
+++ b/blimp/net/input_message_generator.cc
@@ -106,6 +106,40 @@
   details->set_scale(event.data.pinchUpdate.scale);
 }
 
+void GestureTapDownToProto(const blink::WebGestureEvent& event,
+                           InputMessage* proto) {
+  CommonWebGestureToProto(event, InputMessage::Type_GestureTapDown, proto);
+
+  GestureTapDown* details = proto->mutable_gesture_tap_down();
+  details->set_width(event.data.tapDown.width);
+  details->set_height(event.data.tapDown.height);
+}
+
+void GestureTapCancelToProto(const blink::WebGestureEvent& event,
+                             InputMessage* proto) {
+  CommonWebGestureToProto(event, InputMessage::Type_GestureTapCancel, proto);
+}
+
+void GestureTapUnconfirmedToProto(const blink::WebGestureEvent& event,
+                                  InputMessage* proto) {
+  CommonWebGestureToProto(event, InputMessage::Type_GestureTapUnconfirmed,
+                          proto);
+
+  GestureTap* details = proto->mutable_gesture_tap();
+  details->set_tap_count(event.data.tap.tapCount);
+  details->set_width(event.data.tap.width);
+  details->set_height(event.data.tap.height);
+}
+
+void GestureShowPressToProto(const blink::WebGestureEvent& event,
+                             InputMessage* proto) {
+  CommonWebGestureToProto(event, InputMessage::Type_GestureShowPress, proto);
+
+  GestureShowPress* details = proto->mutable_gesture_show_press();
+  details->set_width(event.data.showPress.width);
+  details->set_height(event.data.showPress.height);
+}
+
 }  // namespace
 
 InputMessageGenerator::InputMessageGenerator() {}
@@ -145,6 +179,19 @@
     case blink::WebInputEvent::Type::GesturePinchUpdate:
       GesturePinchUpdateToProto(event, details);
       break;
+    case blink::WebInputEvent::Type::GestureShowPress:
+      GestureShowPressToProto(event, details);
+      break;
+    case blink::WebInputEvent::Type::GestureTapUnconfirmed:
+      GestureTapUnconfirmedToProto(event, details);
+      break;
+    case blink::WebInputEvent::Type::GestureTapDown:
+      GestureTapDownToProto(event, details);
+      break;
+    case blink::WebInputEvent::Type::GestureTapCancel:
+      GestureTapCancelToProto(event, details);
+      break;
+
     // Unsupported types:
     case blink::WebInputEvent::Type::Undefined:
     case blink::WebInputEvent::Type::MouseDown:
@@ -158,10 +205,6 @@
     case blink::WebInputEvent::Type::KeyDown:
     case blink::WebInputEvent::Type::KeyUp:
     case blink::WebInputEvent::Type::Char:
-    case blink::WebInputEvent::Type::GestureShowPress:
-    case blink::WebInputEvent::Type::GestureTapUnconfirmed:
-    case blink::WebInputEvent::Type::GestureTapDown:
-    case blink::WebInputEvent::Type::GestureTapCancel:
     case blink::WebInputEvent::Type::GestureDoubleTap:
     case blink::WebInputEvent::Type::GestureTwoFingerTap:
     case blink::WebInputEvent::Type::GestureLongPress:
@@ -171,7 +214,7 @@
     case blink::WebInputEvent::Type::TouchEnd:
     case blink::WebInputEvent::Type::TouchCancel:
     case blink::WebInputEvent::Type::TouchScrollStarted:
-      NOTIMPLEMENTED();
+      DVLOG(1) << "Unsupported WebInputEvent type " << event.type;
       return nullptr;
   }
 
diff --git a/blimp/net/input_message_unittest.cc b/blimp/net/input_message_unittest.cc
index 4b7a2e7..8d8d0e5 100644
--- a/blimp/net/input_message_unittest.cc
+++ b/blimp/net/input_message_unittest.cc
@@ -139,4 +139,35 @@
   }
 }
 
+TEST(InputMessageTest, TestGestureTapDownRoundTrip) {
+  blink::WebGestureEvent event = BuildBaseTestEvent();
+  event.type = blink::WebGestureEvent::Type::GestureTapDown;
+  event.data.tapDown.width = 2.3f;
+  event.data.tapDown.height = 3.4f;
+  ValidateWebGestureEventRoundTripping(event);
+}
+
+TEST(InputMessageTest, TestGestureTapCancelRoundTrip) {
+  blink::WebGestureEvent event = BuildBaseTestEvent();
+  event.type = blink::WebGestureEvent::Type::GestureTapCancel;
+  ValidateWebGestureEventRoundTripping(event);
+}
+
+TEST(InputMessageTest, TestGestureTapUnconfirmedRoundTrip) {
+  blink::WebGestureEvent event = BuildBaseTestEvent();
+  event.type = blink::WebGestureEvent::Type::GestureTapUnconfirmed;
+  event.data.tap.tapCount = 2;
+  event.data.tap.width = 2.3f;
+  event.data.tap.height = 3.4f;
+  ValidateWebGestureEventRoundTripping(event);
+}
+
+TEST(InputMessageTest, TestGestureShowPressRoundTrip) {
+  blink::WebGestureEvent event = BuildBaseTestEvent();
+  event.type = blink::WebGestureEvent::Type::GestureShowPress;
+  event.data.showPress.width = 2.3f;
+  event.data.showPress.height = 3.4f;
+  ValidateWebGestureEventRoundTripping(event);
+}
+
 }  // namespace blimp
diff --git a/blimp/test/BUILD.gn b/blimp/test/BUILD.gn
index 50bfcb0..f5460f2 100644
--- a/blimp/test/BUILD.gn
+++ b/blimp/test/BUILD.gn
@@ -22,6 +22,7 @@
     "//blimp/client:session",
     "//blimp/client:switches",
     "//blimp/client:test_support",
+    "//blimp/common",
     "//blimp/engine:app",
     "//blimp/engine:app_config",
     "//blimp/engine:app_switches",
diff --git a/blimp/test/browser_tests/blimp_browser_test.cc b/blimp/test/browser_tests/blimp_browser_test.cc
index 47f3719..0d66fb73 100644
--- a/blimp/test/browser_tests/blimp_browser_test.cc
+++ b/blimp/test/browser_tests/blimp_browser_test.cc
@@ -15,6 +15,8 @@
 #include "base/run_loop.h"
 #include "blimp/client/app/blimp_client_switches.h"
 #include "blimp/client/session/assignment_source.h"
+#include "blimp/common/get_client_token.h"
+#include "blimp/common/switches.h"
 #include "blimp/engine/app/blimp_browser_main_parts.h"
 #include "blimp/engine/app/blimp_content_browser_client.h"
 #include "blimp/engine/app/blimp_engine_config.h"
@@ -60,7 +62,8 @@
 
 client::Assignment BlimpBrowserTest::GetAssignment() {
   client::Assignment assignment;
-  assignment.client_token = client::kDummyClientToken;
+  assignment.client_token = GetClientToken(
+      *base::CommandLine::ForCurrentProcess());
   assignment.engine_endpoint =
       net::IPEndPoint(net::IPAddress::IPv4Localhost(), engine_port_);
   assignment.transport_protocol = client::Assignment::TransportProtocol::TCP;
@@ -87,8 +90,7 @@
   command_line->AppendSwitchASCII(blimp::engine::kEnginePort, "0");
   base::FilePath src_root;
   PathService::Get(base::DIR_SOURCE_ROOT, &src_root);
-  command_line->AppendSwitchASCII(
-      blimp::engine::kClientTokenPath,
+  command_line->AppendSwitchASCII(kClientTokenPath,
       src_root.Append(kClientTokenFilePath).value());
 }
 
diff --git a/build/android/provision_devices.py b/build/android/provision_devices.py
index 8890fc0..11b2862 100755
--- a/build/android/provision_devices.py
+++ b/build/android/provision_devices.py
@@ -35,6 +35,7 @@
 from devil.android import device_utils
 from devil.android.sdk import keyevent
 from devil.android.sdk import version_codes
+from devil.constants import exit_codes
 from devil.utils import run_tests_helper
 from devil.utils import timeout_retry
 from pylib import constants
@@ -370,16 +371,21 @@
     if device.build_version_sdk >= version_codes.MARSHMALLOW:
       date_format = '%m%d%H%M%Y.%S'
       set_date_command = ['date', '-u']
+      get_date_command = ['date', '-u']
     else:
       date_format = '%Y%m%d.%H%M%S'
-      set_date_command = ['date', '-u', '-s']
+      set_date_command = ['date', '-s']
+      get_date_command = ['date']
+
+    # TODO(jbudorick): This is wrong on pre-M devices -- get/set are
+    # dealing in local time, but we're setting based on GMT.
     strgmtime = time.strftime(date_format, time.gmtime())
     set_date_command.append(strgmtime)
     device.RunShellCommand(set_date_command, as_root=True, check_return=True)
 
+    get_date_command.append('+"%Y%m%d.%H%M%S"')
     device_time = device.RunShellCommand(
-        ['date', '-u', '+"%Y%m%d.%H%M%S"'], as_root=True,
-        single_line=True).replace('"', '')
+        get_date_command, as_root=True, single_line=True).replace('"', '')
     device_time = datetime.datetime.strptime(device_time, "%Y%m%d.%H%M%S")
     correct_time = datetime.datetime.strptime(strgmtime, date_format)
     tdelta = (correct_time - device_time).seconds
@@ -549,7 +555,10 @@
 
   devil_chromium.Initialize(custom_deps=devil_custom_deps)
 
-  return ProvisionDevices(args)
+  try:
+    return ProvisionDevices(args)
+  except (device_errors.DeviceUnreachableError, device_errors.NoDevicesError):
+    return exit_codes.INFRA
 
 
 if __name__ == '__main__':
diff --git a/build/android/pylib/local/device/local_device_gtest_run.py b/build/android/pylib/local/device/local_device_gtest_run.py
index 8b0d1a3..2630af9 100644
--- a/build/android/pylib/local/device/local_device_gtest_run.py
+++ b/build/android/pylib/local/device/local_device_gtest_run.py
@@ -4,6 +4,7 @@
 
 import collections
 import itertools
+import logging
 import os
 import posixpath
 
@@ -311,9 +312,13 @@
     @local_device_test_run.handle_shard_failures_with(
         on_failure=self._env.BlacklistDevice)
     def list_tests(dev):
-      tests = self._delegate.Run(
+      raw_test_list = self._delegate.Run(
           None, dev, flags='--gtest_list_tests', timeout=30)
-      tests = gtest_test_instance.ParseGTestListTests(tests)
+      tests = gtest_test_instance.ParseGTestListTests(raw_test_list)
+      if not tests:
+        logging.info('No tests found. Output:')
+        for l in raw_test_list:
+          logging.info('  %s', l)
       tests = self._test_instance.FilterTests(tests)
       return tests
 
diff --git a/build/common.gypi b/build/common.gypi
index 8e0c0c0..88b4121 100644
--- a/build/common.gypi
+++ b/build/common.gypi
@@ -887,10 +887,10 @@
           'enable_pdf%': 1,
           'pdf_enable_v8%': 1,
         }],
-        ['chromeos==1 or OS=="android" or OS=="ios" or (embedded==1 and chromecast==0)', {
+        ['OS=="android" or OS=="ios" or (embedded==1 and chromecast==0)', {
           'pdf_enable_xfa%': 0,
         }, {
-          'pdf_enable_xfa%': 0, # Reverted pending crbug.com/596373
+          'pdf_enable_xfa%': 1,
         }],
 
         ['chromeos==1 or OS=="android" or OS=="ios" or desktop_linux==1', {
diff --git a/build_overrides/pdfium.gni b/build_overrides/pdfium.gni
index b05a8dd..b37d13f7 100644
--- a/build_overrides/pdfium.gni
+++ b/build_overrides/pdfium.gni
@@ -6,7 +6,7 @@
 pdf_enable_v8_override = true
 
 # Disable XFA forms in Chromium builds.
-pdf_enable_xfa_override = false
+pdf_enable_xfa_override = !is_android && !is_ios
 
 # Disable use of Skia backend.
 pdf_use_skia_override = false
diff --git a/cc/ipc/BUILD.gn b/cc/ipc/BUILD.gn
new file mode 100644
index 0000000..97e2338
--- /dev/null
+++ b/cc/ipc/BUILD.gn
@@ -0,0 +1,35 @@
+# 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.
+
+component("ipc") {
+  output_name = "cc_ipc"
+
+  defines = [ "CC_IPC_IMPLEMENTATION" ]
+
+  sources = [
+    "cc_ipc_export.h",
+    "cc_param_traits.cc",
+    "cc_param_traits.h",
+    "cc_param_traits_macros.h",
+  ]
+
+  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
+
+  public_deps = [
+    "//cc",
+    "//cc/surfaces",
+  ]
+
+  deps = [
+    "//base",
+    "//gpu/ipc/common",
+    "//ipc",
+    "//skia",
+    "//ui/events/ipc",
+    "//ui/gfx",
+    "//ui/gfx/ipc",
+    "//ui/gfx/ipc/geometry",
+    "//ui/gfx/ipc/skia",
+  ]
+}
diff --git a/cc/ipc/DEPS b/cc/ipc/DEPS
new file mode 100644
index 0000000..3a74ce8
--- /dev/null
+++ b/cc/ipc/DEPS
@@ -0,0 +1,4 @@
+include_rules = [
+  "+gpu/ipc/common",
+  "+ui/events/ipc",
+]
diff --git a/cc/ipc/cc_ipc.gyp b/cc/ipc/cc_ipc.gyp
new file mode 100644
index 0000000..e116fda
--- /dev/null
+++ b/cc/ipc/cc_ipc.gyp
@@ -0,0 +1,40 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+{
+  'variables': {
+    'chromium_code': 1,
+  },
+  'targets': [
+     {
+      # GN version: //cc/ipc
+      'target_name': 'cc_ipc',
+      'type': '<(component)',
+      'dependencies': [
+        '../../base/base.gyp:base',
+        '../../cc/cc.gyp:cc',
+        '../../gpu/gpu.gyp:gpu_ipc_common',
+        '../../ipc/ipc.gyp:ipc',
+        '../../skia/skia.gyp:skia',
+        '../../ui/events/events.gyp:events_base',
+        '../../ui/events/events.gyp:events_ipc',
+        '../../ui/gfx/gfx.gyp:gfx',
+        '../../ui/gfx/gfx.gyp:gfx_geometry',
+        '../../ui/gfx/ipc/gfx_ipc.gyp:gfx_ipc',
+        '../../ui/gfx/ipc/geometry/gfx_ipc_geometry.gyp:gfx_ipc_geometry',
+        '../../ui/gfx/ipc/skia/gfx_ipc_skia.gyp:gfx_ipc_skia',
+      ],
+      'defines': [
+        'CC_IPC_IMPLEMENTATION',
+      ],
+      'sources': [
+        'cc_param_traits.cc',
+        'cc_param_traits.h',
+        'cc_param_traits_macros.h',
+      ],
+      # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
+      'msvs_disabled_warnings': [ 4267, ],
+    },
+  ],
+}
diff --git a/cc/ipc/cc_ipc_export.h b/cc/ipc/cc_ipc_export.h
new file mode 100644
index 0000000..4a3623e0
--- /dev/null
+++ b/cc/ipc/cc_ipc_export.h
@@ -0,0 +1,29 @@
+// 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 CC_IPC_CC_IPC_EXPORT_H_
+#define CC_IPC_CC_IPC_EXPORT_H_
+
+#if defined(COMPONENT_BUILD)
+#if defined(WIN32)
+
+#if defined(CC_IPC_IMPLEMENTATION)
+#define CC_IPC_EXPORT __declspec(dllexport)
+#else
+#define CC_IPC_EXPORT __declspec(dllimport)
+#endif  // defined(CC_IPC_IMPLEMENTATION)
+
+#else  // defined(WIN32)
+#if defined(CC_IPC_IMPLEMENTATION)
+#define CC_IPC_EXPORT __attribute__((visibility("default")))
+#else
+#define CC_IPC_EXPORT
+#endif
+#endif
+
+#else  // defined(COMPONENT_BUILD)
+#define CC_IPC_EXPORT
+#endif
+
+#endif  // CC_IPC_CC_IPC_EXPORT_H_
diff --git a/content/common/cc_messages.cc b/cc/ipc/cc_param_traits.cc
similarity index 91%
rename from content/common/cc_messages.cc
rename to cc/ipc/cc_param_traits.cc
index e4b07401..fe7ccd6 100644
--- a/content/common/cc_messages.cc
+++ b/cc/ipc/cc_param_traits.cc
@@ -2,22 +2,30 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/common/cc_messages.h"
+#include "cc/ipc/cc_param_traits.h"
 
 #include <stddef.h>
 #include <utility>
 
 #include "base/numerics/safe_conversions.h"
+#include "base/time/time.h"
 #include "cc/output/compositor_frame.h"
 #include "cc/output/filter_operations.h"
+#include "cc/quads/debug_border_draw_quad.h"
 #include "cc/quads/draw_quad.h"
+#include "cc/quads/io_surface_draw_quad.h"
 #include "cc/quads/largest_draw_quad.h"
-#include "cc/quads/render_pass_id.h"
-#include "content/public/common/common_param_traits.h"
+#include "cc/quads/render_pass_draw_quad.h"
+#include "cc/quads/solid_color_draw_quad.h"
+#include "cc/quads/surface_draw_quad.h"
+#include "cc/quads/tile_draw_quad.h"
+#include "cc/quads/yuv_video_draw_quad.h"
 #include "third_party/skia/include/core/SkData.h"
 #include "third_party/skia/include/core/SkFlattenableSerialization.h"
 #include "third_party/skia/include/core/SkImageFilter.h"
 #include "third_party/skia/include/core/SkRefCnt.h"
+#include "ui/gfx/ipc/geometry/gfx_param_traits.h"
+#include "ui/gfx/ipc/skia/gfx_skia_param_traits.h"
 
 namespace IPC {
 
@@ -151,10 +159,8 @@
       break;
     }
     case cc::FilterOperation::ZOOM:
-      if (ReadParam(m, iter, &amount) &&
-          ReadParam(m, iter, &zoom_inset) &&
-          amount >= 0.f &&
-          zoom_inset >= 0) {
+      if (ReadParam(m, iter, &amount) && ReadParam(m, iter, &zoom_inset) &&
+          amount >= 0.f && zoom_inset >= 0) {
         r->set_amount(amount);
         r->set_zoom_inset(zoom_inset);
         success = true;
@@ -176,8 +182,8 @@
   return success;
 }
 
-void ParamTraits<cc::FilterOperation>::Log(
-    const param_type& p, std::string* l) {
+void ParamTraits<cc::FilterOperation>::Log(const param_type& p,
+                                           std::string* l) {
   l->append("(");
   LogParam(static_cast<unsigned>(p.type()), l);
   l->append(", ");
@@ -256,8 +262,8 @@
   return true;
 }
 
-void ParamTraits<cc::FilterOperations>::Log(
-    const param_type& p, std::string* l) {
+void ParamTraits<cc::FilterOperations>::Log(const param_type& p,
+                                            std::string* l) {
   l->append("(");
   for (std::size_t i = 0; i < p.size(); ++i) {
     if (i)
@@ -306,8 +312,8 @@
   return true;
 }
 
-void ParamTraits<sk_sp<SkImageFilter> >::Log(
-    const param_type& p, std::string* l) {
+void ParamTraits<sk_sp<SkImageFilter>>::Log(const param_type& p,
+                                            std::string* l) {
   l->append("(");
   LogParam(p.get() ? p->countInputs() : 0, l);
   l->append(")");
@@ -432,10 +438,7 @@
       !ReadParam(m, iter, &quad_list_size))
     return false;
 
-  p->SetAll(id,
-            output_rect,
-            damage_rect,
-            transform_to_root_target,
+  p->SetAll(id, output_rect, damage_rect, transform_to_root_target,
             has_transparent_background);
 
   for (uint32_t i = 0; i < quad_list_size; ++i) {
@@ -512,8 +515,7 @@
   return true;
 }
 
-void ParamTraits<cc::RenderPass>::Log(
-    const param_type& p, std::string* l) {
+void ParamTraits<cc::RenderPass>::Log(const param_type& p, std::string* l) {
   l->append("RenderPass((");
   LogParam(p.id, l);
   l->append("), ");
@@ -575,11 +577,11 @@
 }
 
 namespace {
-  enum CompositorFrameType {
-    NO_FRAME,
-    DELEGATED_FRAME,
-    GL_FRAME,
-  };
+enum CompositorFrameType {
+  NO_FRAME,
+  DELEGATED_FRAME,
+  GL_FRAME,
+};
 }
 
 void ParamTraits<cc::CompositorFrame>::Write(base::Pickle* m,
@@ -700,8 +702,8 @@
   WriteParam(m, base::checked_cast<uint32_t>(p.render_pass_list.size()));
   for (const auto& pass : p.render_pass_list) {
     WriteParam(m, base::checked_cast<uint32_t>(pass->quad_list.size()));
-    WriteParam(m, base::checked_cast<uint32_t>(
-        pass->shared_quad_state_list.size()));
+    WriteParam(
+        m, base::checked_cast<uint32_t>(pass->shared_quad_state_list.size()));
     WriteParam(m, *pass);
   }
 }
@@ -709,13 +711,13 @@
 bool ParamTraits<cc::DelegatedFrameData>::Read(const base::Pickle* m,
                                                base::PickleIterator* iter,
                                                param_type* p) {
+  const size_t kMaxRenderPasses = 10000;
+  const size_t kMaxSharedQuadStateListSize = 100000;
+  const size_t kMaxQuadListSize = 1000000;
+
   if (!ReadParam(m, iter, &p->device_scale_factor))
     return false;
 
-  const static size_t kMaxRenderPasses = 10000;
-  const static size_t kMaxSharedQuadStateListSize = 100000;
-  const static size_t kMaxQuadListSize = 1000000;
-
   std::set<cc::RenderPassId> pass_set;
 
   uint32_t num_render_passes;
@@ -814,7 +816,8 @@
 }
 
 void ParamTraits<cc::StreamVideoDrawQuad::OverlayResources>::GetSize(
-    base::PickleSizer* s, const param_type& p) {
+    base::PickleSizer* s,
+    const param_type& p) {
   for (size_t i = 0; i < cc::DrawQuad::Resources::kMaxResourceIdCount; ++i) {
     GetParamSize(s, p.size_in_pixels[i]);
   }
@@ -852,7 +855,8 @@
 }
 
 void ParamTraits<cc::TextureDrawQuad::OverlayResources>::GetSize(
-    base::PickleSizer* s, const param_type& p) {
+    base::PickleSizer* s,
+    const param_type& p) {
   for (size_t i = 0; i < cc::DrawQuad::Resources::kMaxResourceIdCount; ++i) {
     GetParamSize(s, p.size_in_pixels[i]);
   }
@@ -890,3 +894,31 @@
 }
 
 }  // namespace IPC
+
+// Generate param traits size methods.
+#include "ipc/param_traits_size_macros.h"
+namespace IPC {
+#undef CC_IPC_CC_PARAM_TRAITS_MACROS_H_
+#include "cc/ipc/cc_param_traits_macros.h"
+}
+
+// Generate param traits write methods.
+#include "ipc/param_traits_write_macros.h"
+namespace IPC {
+#undef CC_IPC_CC_PARAM_TRAITS_MACROS_H_
+#include "cc/ipc/cc_param_traits_macros.h"
+}  // namespace IPC
+
+// Generate param traits read methods.
+#include "ipc/param_traits_read_macros.h"
+namespace IPC {
+#undef CC_IPC_CC_PARAM_TRAITS_MACROS_H_
+#include "cc/ipc/cc_param_traits_macros.h"
+}  // namespace IPC
+
+// Generate param traits log methods.
+#include "ipc/param_traits_log_macros.h"
+namespace IPC {
+#undef CC_IPC_CC_PARAM_TRAITS_MACROS_H_
+#include "cc/ipc/cc_param_traits_macros.h"
+}  // namespace IPC
diff --git a/cc/ipc/cc_param_traits.h b/cc/ipc/cc_param_traits.h
new file mode 100644
index 0000000..310b3f0b
--- /dev/null
+++ b/cc/ipc/cc_param_traits.h
@@ -0,0 +1,140 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// IPC Messages sent between compositor instances.
+
+#ifndef CC_IPC_CC_PARAM_TRAITS_H_
+#define CC_IPC_CC_PARAM_TRAITS_H_
+
+#include "cc/ipc/cc_ipc_export.h"
+#include "cc/ipc/cc_param_traits_macros.h"
+#include "cc/output/compositor_frame.h"
+#include "cc/output/compositor_frame_ack.h"
+#include "cc/output/filter_operation.h"
+#include "cc/output/viewport_selection_bound.h"
+#include "cc/quads/draw_quad.h"
+#include "cc/quads/stream_video_draw_quad.h"
+#include "cc/quads/texture_draw_quad.h"
+#include "gpu/ipc/common/gpu_command_buffer_traits.h"
+#include "ipc/ipc_message_macros.h"
+
+namespace gfx {
+class Transform;
+}
+
+namespace cc {
+class FilterOperations;
+}
+
+namespace IPC {
+
+template <>
+struct ParamTraits<cc::FilterOperation> {
+  typedef cc::FilterOperation param_type;
+  static void GetSize(base::PickleSizer* s, const param_type& p);
+  static void Write(base::Pickle* m, const param_type& p);
+  static bool Read(const base::Pickle* m,
+                   base::PickleIterator* iter,
+                   param_type* r);
+  static void Log(const param_type& p, std::string* l);
+};
+
+template <>
+struct ParamTraits<cc::FilterOperations> {
+  typedef cc::FilterOperations param_type;
+  static void GetSize(base::PickleSizer* s, const param_type& p);
+  static void Write(base::Pickle* m, const param_type& p);
+  static bool Read(const base::Pickle* m,
+                   base::PickleIterator* iter,
+                   param_type* r);
+  static void Log(const param_type& p, std::string* l);
+};
+
+template <>
+struct ParamTraits<sk_sp<SkImageFilter>> {
+  typedef sk_sp<SkImageFilter> param_type;
+  static void GetSize(base::PickleSizer* s, const param_type& p);
+  static void Write(base::Pickle* m, const param_type& p);
+  static bool Read(const base::Pickle* m,
+                   base::PickleIterator* iter,
+                   param_type* r);
+  static void Log(const param_type& p, std::string* l);
+};
+
+template <>
+struct CC_IPC_EXPORT ParamTraits<cc::RenderPass> {
+  typedef cc::RenderPass param_type;
+  static void Write(base::Pickle* m, const param_type& p);
+  static bool Read(const base::Pickle* m,
+                   base::PickleIterator* iter,
+                   param_type* r);
+  static void Log(const param_type& p, std::string* l);
+};
+
+template <>
+struct CC_IPC_EXPORT ParamTraits<cc::CompositorFrame> {
+  typedef cc::CompositorFrame param_type;
+  static void Write(base::Pickle* m, const param_type& p);
+  static bool Read(const base::Pickle* m,
+                   base::PickleIterator* iter,
+                   param_type* p);
+  static void Log(const param_type& p, std::string* l);
+};
+
+template <>
+struct CC_IPC_EXPORT ParamTraits<cc::CompositorFrameAck> {
+  typedef cc::CompositorFrameAck param_type;
+  static void Write(base::Pickle* m, const param_type& p);
+  static bool Read(const base::Pickle* m,
+                   base::PickleIterator* iter,
+                   param_type* p);
+  static void Log(const param_type& p, std::string* l);
+};
+
+template <>
+struct CC_IPC_EXPORT ParamTraits<cc::DelegatedFrameData> {
+  typedef cc::DelegatedFrameData param_type;
+  static void Write(base::Pickle* m, const param_type& p);
+  static bool Read(const base::Pickle* m,
+                   base::PickleIterator* iter,
+                   param_type* p);
+  static void Log(const param_type& p, std::string* l);
+};
+
+template <>
+struct CC_IPC_EXPORT ParamTraits<cc::DrawQuad::Resources> {
+  typedef cc::DrawQuad::Resources param_type;
+  static void GetSize(base::PickleSizer* s, const param_type& p);
+  static void Write(base::Pickle* m, const param_type& p);
+  static bool Read(const base::Pickle* m,
+                   base::PickleIterator* iter,
+                   param_type* p);
+  static void Log(const param_type& p, std::string* l);
+};
+
+template <>
+struct CC_IPC_EXPORT ParamTraits<cc::StreamVideoDrawQuad::OverlayResources> {
+  typedef cc::StreamVideoDrawQuad::OverlayResources param_type;
+  static void GetSize(base::PickleSizer* s, const param_type& p);
+  static void Write(base::Pickle* m, const param_type& p);
+  static bool Read(const base::Pickle* m,
+                   base::PickleIterator* iter,
+                   param_type* p);
+  static void Log(const param_type& p, std::string* l);
+};
+
+template <>
+struct CC_IPC_EXPORT ParamTraits<cc::TextureDrawQuad::OverlayResources> {
+  typedef cc::TextureDrawQuad::OverlayResources param_type;
+  static void GetSize(base::PickleSizer* s, const param_type& p);
+  static void Write(base::Pickle* m, const param_type& p);
+  static bool Read(const base::Pickle* m,
+                   base::PickleIterator* iter,
+                   param_type* p);
+  static void Log(const param_type& p, std::string* l);
+};
+
+}  // namespace IPC
+
+#endif  // CC_IPC_CC_PARAM_TRAITS_H_
diff --git a/cc/ipc/cc_param_traits_macros.h b/cc/ipc/cc_param_traits_macros.h
new file mode 100644
index 0000000..cf39f82
--- /dev/null
+++ b/cc/ipc/cc_param_traits_macros.h
@@ -0,0 +1,225 @@
+// 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 CC_IPC_CC_PARAM_TRAITS_MACROS_H_
+#define CC_IPC_CC_PARAM_TRAITS_MACROS_H_
+
+#include "cc/input/selection_bound_type.h"
+#include "cc/output/begin_frame_args.h"
+#include "cc/output/compositor_frame.h"
+#include "cc/output/filter_operation.h"
+#include "cc/quads/debug_border_draw_quad.h"
+#include "cc/quads/draw_quad.h"
+#include "cc/quads/io_surface_draw_quad.h"
+#include "cc/quads/render_pass.h"
+#include "cc/quads/render_pass_id.h"
+#include "cc/quads/shared_quad_state.h"
+#include "cc/quads/solid_color_draw_quad.h"
+#include "cc/quads/stream_video_draw_quad.h"
+#include "cc/quads/surface_draw_quad.h"
+#include "cc/quads/texture_draw_quad.h"
+#include "cc/quads/tile_draw_quad.h"
+#include "cc/quads/yuv_video_draw_quad.h"
+#include "cc/resources/resource_format.h"
+#include "cc/resources/returned_resource.h"
+#include "cc/resources/transferable_resource.h"
+#include "cc/surfaces/surface_id.h"
+#include "cc/surfaces/surface_sequence.h"
+#include "ui/events/ipc/latency_info_param_traits.h"
+#include "ui/gfx/ipc/gfx_param_traits.h"
+#include "ui/gfx/ipc/skia/gfx_skia_param_traits.h"
+
+#undef IPC_MESSAGE_EXPORT
+#define IPC_MESSAGE_EXPORT CC_IPC_EXPORT
+
+IPC_ENUM_TRAITS_MAX_VALUE(cc::DrawQuad::Material, cc::DrawQuad::MATERIAL_LAST)
+IPC_ENUM_TRAITS_MAX_VALUE(cc::IOSurfaceDrawQuad::Orientation,
+                          cc::IOSurfaceDrawQuad::ORIENTATION_LAST)
+IPC_ENUM_TRAITS_MAX_VALUE(cc::FilterOperation::FilterType,
+                          cc::FilterOperation::FILTER_TYPE_LAST)
+IPC_ENUM_TRAITS_MAX_VALUE(cc::ResourceFormat, cc::RESOURCE_FORMAT_MAX)
+IPC_ENUM_TRAITS_MAX_VALUE(cc::SelectionBoundType, cc::SELECTION_BOUND_TYPE_LAST)
+
+// TODO(fsamuel): This trait belongs with skia code.
+IPC_ENUM_TRAITS_MAX_VALUE(SkXfermode::Mode, SkXfermode::kLastMode)
+IPC_ENUM_TRAITS_MAX_VALUE(cc::YUVVideoDrawQuad::ColorSpace,
+                          cc::YUVVideoDrawQuad::COLOR_SPACE_LAST)
+
+IPC_STRUCT_TRAITS_BEGIN(cc::RenderPassId)
+  IPC_STRUCT_TRAITS_MEMBER(layer_id)
+  IPC_STRUCT_TRAITS_MEMBER(index)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::SurfaceId)
+  IPC_STRUCT_TRAITS_MEMBER(id)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::SurfaceSequence)
+  IPC_STRUCT_TRAITS_MEMBER(id_namespace)
+  IPC_STRUCT_TRAITS_MEMBER(sequence)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::DrawQuad)
+  IPC_STRUCT_TRAITS_MEMBER(material)
+  IPC_STRUCT_TRAITS_MEMBER(rect)
+  IPC_STRUCT_TRAITS_MEMBER(opaque_rect)
+  IPC_STRUCT_TRAITS_MEMBER(visible_rect)
+  IPC_STRUCT_TRAITS_MEMBER(needs_blending)
+  IPC_STRUCT_TRAITS_MEMBER(resources)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::DebugBorderDrawQuad)
+  IPC_STRUCT_TRAITS_PARENT(cc::DrawQuad)
+  IPC_STRUCT_TRAITS_MEMBER(color)
+  IPC_STRUCT_TRAITS_MEMBER(width)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::IOSurfaceDrawQuad)
+  IPC_STRUCT_TRAITS_PARENT(cc::DrawQuad)
+  IPC_STRUCT_TRAITS_MEMBER(io_surface_size)
+  IPC_STRUCT_TRAITS_MEMBER(orientation)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::RenderPassDrawQuad)
+  IPC_STRUCT_TRAITS_PARENT(cc::DrawQuad)
+  IPC_STRUCT_TRAITS_MEMBER(render_pass_id)
+  IPC_STRUCT_TRAITS_MEMBER(mask_uv_scale)
+  IPC_STRUCT_TRAITS_MEMBER(mask_texture_size)
+  IPC_STRUCT_TRAITS_MEMBER(filters)
+  IPC_STRUCT_TRAITS_MEMBER(filters_scale)
+  IPC_STRUCT_TRAITS_MEMBER(background_filters)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::SolidColorDrawQuad)
+  IPC_STRUCT_TRAITS_PARENT(cc::DrawQuad)
+  IPC_STRUCT_TRAITS_MEMBER(color)
+  IPC_STRUCT_TRAITS_MEMBER(force_anti_aliasing_off)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::StreamVideoDrawQuad)
+  IPC_STRUCT_TRAITS_PARENT(cc::DrawQuad)
+  IPC_STRUCT_TRAITS_MEMBER(overlay_resources)
+  IPC_STRUCT_TRAITS_MEMBER(matrix)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::SurfaceDrawQuad)
+  IPC_STRUCT_TRAITS_PARENT(cc::DrawQuad)
+  IPC_STRUCT_TRAITS_MEMBER(surface_id)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::TextureDrawQuad)
+  IPC_STRUCT_TRAITS_PARENT(cc::DrawQuad)
+  IPC_STRUCT_TRAITS_MEMBER(overlay_resources)
+  IPC_STRUCT_TRAITS_MEMBER(premultiplied_alpha)
+  IPC_STRUCT_TRAITS_MEMBER(uv_top_left)
+  IPC_STRUCT_TRAITS_MEMBER(uv_bottom_right)
+  IPC_STRUCT_TRAITS_MEMBER(background_color)
+  IPC_STRUCT_TRAITS_MEMBER(vertex_opacity[0])
+  IPC_STRUCT_TRAITS_MEMBER(vertex_opacity[1])
+  IPC_STRUCT_TRAITS_MEMBER(vertex_opacity[2])
+  IPC_STRUCT_TRAITS_MEMBER(vertex_opacity[3])
+  IPC_STRUCT_TRAITS_MEMBER(y_flipped)
+  IPC_STRUCT_TRAITS_MEMBER(nearest_neighbor)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::TileDrawQuad)
+  IPC_STRUCT_TRAITS_PARENT(cc::DrawQuad)
+  IPC_STRUCT_TRAITS_MEMBER(tex_coord_rect)
+  IPC_STRUCT_TRAITS_MEMBER(texture_size)
+  IPC_STRUCT_TRAITS_MEMBER(swizzle_contents)
+  IPC_STRUCT_TRAITS_MEMBER(nearest_neighbor)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::YUVVideoDrawQuad)
+  IPC_STRUCT_TRAITS_PARENT(cc::DrawQuad)
+  IPC_STRUCT_TRAITS_MEMBER(ya_tex_coord_rect)
+  IPC_STRUCT_TRAITS_MEMBER(uv_tex_coord_rect)
+  IPC_STRUCT_TRAITS_MEMBER(ya_tex_size)
+  IPC_STRUCT_TRAITS_MEMBER(uv_tex_size)
+  IPC_STRUCT_TRAITS_MEMBER(color_space)
+  IPC_STRUCT_TRAITS_MEMBER(resource_offset)
+  IPC_STRUCT_TRAITS_MEMBER(resource_multiplier)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::SharedQuadState)
+  IPC_STRUCT_TRAITS_MEMBER(quad_to_target_transform)
+  IPC_STRUCT_TRAITS_MEMBER(quad_layer_bounds)
+  IPC_STRUCT_TRAITS_MEMBER(visible_quad_layer_rect)
+  IPC_STRUCT_TRAITS_MEMBER(clip_rect)
+  IPC_STRUCT_TRAITS_MEMBER(is_clipped)
+  IPC_STRUCT_TRAITS_MEMBER(opacity)
+  IPC_STRUCT_TRAITS_MEMBER(blend_mode)
+  IPC_STRUCT_TRAITS_MEMBER(sorting_context_id)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::TransferableResource)
+  IPC_STRUCT_TRAITS_MEMBER(id)
+  IPC_STRUCT_TRAITS_MEMBER(format)
+  IPC_STRUCT_TRAITS_MEMBER(filter)
+  IPC_STRUCT_TRAITS_MEMBER(size)
+  IPC_STRUCT_TRAITS_MEMBER(mailbox_holder)
+  IPC_STRUCT_TRAITS_MEMBER(read_lock_fences_enabled)
+  IPC_STRUCT_TRAITS_MEMBER(is_software)
+  IPC_STRUCT_TRAITS_MEMBER(gpu_memory_buffer_id)
+  IPC_STRUCT_TRAITS_MEMBER(is_overlay_candidate)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::ReturnedResource)
+  IPC_STRUCT_TRAITS_MEMBER(id)
+  IPC_STRUCT_TRAITS_MEMBER(sync_token)
+  IPC_STRUCT_TRAITS_MEMBER(count)
+  IPC_STRUCT_TRAITS_MEMBER(lost)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::ViewportSelectionBound)
+  IPC_STRUCT_TRAITS_MEMBER(type)
+  IPC_STRUCT_TRAITS_MEMBER(edge_top)
+  IPC_STRUCT_TRAITS_MEMBER(edge_bottom)
+  IPC_STRUCT_TRAITS_MEMBER(visible)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::ViewportSelection)
+  IPC_STRUCT_TRAITS_MEMBER(start)
+  IPC_STRUCT_TRAITS_MEMBER(end)
+  IPC_STRUCT_TRAITS_MEMBER(is_editable)
+  IPC_STRUCT_TRAITS_MEMBER(is_empty_text_form_control)
+IPC_STRUCT_TRAITS_END()
+
+IPC_ENUM_TRAITS_MAX_VALUE(cc::BeginFrameArgs::BeginFrameArgsType,
+                          cc::BeginFrameArgs::BEGIN_FRAME_ARGS_TYPE_MAX - 1)
+
+IPC_STRUCT_TRAITS_BEGIN(cc::BeginFrameArgs)
+  IPC_STRUCT_TRAITS_MEMBER(frame_time)
+  IPC_STRUCT_TRAITS_MEMBER(deadline)
+  IPC_STRUCT_TRAITS_MEMBER(interval)
+  IPC_STRUCT_TRAITS_MEMBER(type)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::CompositorFrameMetadata)
+  IPC_STRUCT_TRAITS_MEMBER(device_scale_factor)
+  IPC_STRUCT_TRAITS_MEMBER(root_scroll_offset)
+  IPC_STRUCT_TRAITS_MEMBER(page_scale_factor)
+  IPC_STRUCT_TRAITS_MEMBER(scrollable_viewport_size)
+  IPC_STRUCT_TRAITS_MEMBER(root_layer_size)
+  IPC_STRUCT_TRAITS_MEMBER(min_page_scale_factor)
+  IPC_STRUCT_TRAITS_MEMBER(max_page_scale_factor)
+  IPC_STRUCT_TRAITS_MEMBER(root_overflow_x_hidden)
+  IPC_STRUCT_TRAITS_MEMBER(root_overflow_y_hidden)
+  IPC_STRUCT_TRAITS_MEMBER(location_bar_offset)
+  IPC_STRUCT_TRAITS_MEMBER(location_bar_content_translation)
+  IPC_STRUCT_TRAITS_MEMBER(root_background_color)
+  IPC_STRUCT_TRAITS_MEMBER(selection)
+  IPC_STRUCT_TRAITS_MEMBER(latency_info)
+  IPC_STRUCT_TRAITS_MEMBER(satisfies_sequences)
+  IPC_STRUCT_TRAITS_MEMBER(referenced_surfaces)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::GLFrameData)
+  IPC_STRUCT_TRAITS_MEMBER(mailbox)
+  IPC_STRUCT_TRAITS_MEMBER(sync_token)
+  IPC_STRUCT_TRAITS_MEMBER(size)
+  IPC_STRUCT_TRAITS_MEMBER(sub_buffer_rect)
+IPC_STRUCT_TRAITS_END()
+
+#endif  // CC_IPC_CC_PARAM_TRAITS_MACROS_H_
diff --git a/cc/layers/layer.cc b/cc/layers/layer.cc
index ab348da..4a52bf3 100644
--- a/cc/layers/layer.cc
+++ b/cc/layers/layer.cc
@@ -78,7 +78,6 @@
       use_local_transform_for_backface_visibility_(false),
       should_check_backface_visibility_(false),
       force_render_surface_for_testing_(false),
-      has_render_surface_(false),
       subtree_property_changed_(false),
       background_color_(0),
       safe_opaque_background_color_(0),
@@ -1350,7 +1349,6 @@
   base->set_double_sided(double_sided_);
   base->set_draws_content(draws_content_);
   base->set_hide_layer_and_subtree(hide_layer_and_subtree_);
-  base->set_has_render_surface(has_render_surface_);
   base->set_subtree_property_changed(subtree_property_changed_);
 
   // TODO(nyquist): Add support for serializing FilterOperations for
@@ -1433,7 +1431,6 @@
   double_sided_ = base.double_sided();
   draws_content_ = base.draws_content();
   hide_layer_and_subtree_ = base.hide_layer_and_subtree();
-  has_render_surface_ = base.has_render_surface();
   subtree_property_changed_ = base.subtree_property_changed();
   masks_to_bounds_ = base.masks_to_bounds();
   main_thread_scrolling_reasons_ = base.main_thread_scrolling_reasons();
@@ -1564,10 +1561,6 @@
     return nullptr;
 }
 
-void Layer::SetHasRenderSurface(bool has_render_surface) {
-  has_render_surface_ = has_render_surface;
-}
-
 void Layer::SetSubtreePropertyChanged() {
   if (subtree_property_changed_)
     return;
diff --git a/cc/layers/layer.h b/cc/layers/layer.h
index a5985b2..f39dfe1 100644
--- a/cc/layers/layer.h
+++ b/cc/layers/layer.h
@@ -476,14 +476,6 @@
 
   void set_clip_rect(const gfx::Rect& rect) {}
 
-  // This should only be called during BeginMainFrame since it does not trigger
-  // a Commit. This is called right after property tree being built and should
-  // not trigger property tree rebuild.
-  void SetHasRenderSurface(bool has_render_surface);
-  bool has_render_surface() const {
-    return has_render_surface_;
-  }
-
   void SetSubtreePropertyChanged();
   bool subtree_property_changed() const { return subtree_property_changed_; }
 
@@ -642,7 +634,6 @@
   bool use_local_transform_for_backface_visibility_ : 1;
   bool should_check_backface_visibility_ : 1;
   bool force_render_surface_for_testing_ : 1;
-  bool has_render_surface_ : 1;
   bool subtree_property_changed_ : 1;
   Region non_fast_scrollable_region_;
   Region touch_event_handler_region_;
diff --git a/cc/layers/layer_unittest.cc b/cc/layers/layer_unittest.cc
index caec92e..39125c7 100644
--- a/cc/layers/layer_unittest.cc
+++ b/cc/layers/layer_unittest.cc
@@ -156,7 +156,6 @@
     EXPECT_EQ(src->double_sided_, dest->double_sided_);
     EXPECT_EQ(src->draws_content_, dest->draws_content_);
     EXPECT_EQ(src->hide_layer_and_subtree_, dest->hide_layer_and_subtree_);
-    EXPECT_EQ(src->has_render_surface_, dest->has_render_surface_);
     EXPECT_EQ(src->masks_to_bounds_, dest->masks_to_bounds_);
     EXPECT_EQ(src->main_thread_scrolling_reasons_,
               dest->main_thread_scrolling_reasons_);
@@ -264,7 +263,6 @@
     layer->double_sided_ = true;
     layer->draws_content_ = true;
     layer->hide_layer_and_subtree_ = false;
-    layer->has_render_surface_ = false;
     layer->masks_to_bounds_ = true;
     layer->main_thread_scrolling_reasons_ =
         MainThreadScrollingReason::kNotScrollingOnMain;
@@ -309,7 +307,6 @@
     layer->double_sided_ = !layer->double_sided_;
     layer->draws_content_ = !layer->draws_content_;
     layer->hide_layer_and_subtree_ = !layer->hide_layer_and_subtree_;
-    layer->has_render_surface_ = !layer->has_render_surface_;
     layer->masks_to_bounds_ = !layer->masks_to_bounds_;
     layer->main_thread_scrolling_reasons_ =
         MainThreadScrollingReason::kHasBackgroundAttachmentFixedObjects;
diff --git a/cc/layers/nine_patch_layer.cc b/cc/layers/nine_patch_layer.cc
index 84aaee54..b68891c 100644
--- a/cc/layers/nine_patch_layer.cc
+++ b/cc/layers/nine_patch_layer.cc
@@ -57,14 +57,6 @@
   SetNeedsCommit();
 }
 
-void NinePatchLayer::SetLayerOcclusion(const gfx::Rect& occlusion) {
-  if (layer_occlusion_ == occlusion)
-    return;
-
-  layer_occlusion_ = occlusion;
-  SetNeedsCommit();
-}
-
 void NinePatchLayer::PushPropertiesTo(LayerImpl* layer) {
   UIResourceLayer::PushPropertiesTo(layer);
   TRACE_EVENT0("cc", "NinePatchLayer::PushPropertiesTo");
@@ -75,8 +67,8 @@
   } else {
     DCHECK(layer_tree_host());
 
-    layer_impl->SetLayout(image_aperture_, border_, layer_occlusion_,
-                          fill_center_, nearest_neighbor_);
+    layer_impl->SetLayout(image_aperture_, border_, fill_center_,
+                          nearest_neighbor_);
   }
 }
 
diff --git a/cc/layers/nine_patch_layer.h b/cc/layers/nine_patch_layer.h
index accdc704..1c2d725 100644
--- a/cc/layers/nine_patch_layer.h
+++ b/cc/layers/nine_patch_layer.h
@@ -42,11 +42,6 @@
   void SetFillCenter(bool fill_center);
   void SetNearestNeighbor(bool nearest_neighbor);
 
-  // |rect| is the space completely occluded by another layer in layer
-  // space. This can be used for example to occlude the entire window's
-  // content when drawing the shadow with a 9 patches layer.
-  void SetLayerOcclusion(const gfx::Rect& occlusion);
-
  private:
   NinePatchLayer();
   ~NinePatchLayer() override;
@@ -60,10 +55,6 @@
   // image space.
   gfx::Rect image_aperture_;
 
-  // The occluded region in layer space set by SetLayerOcclusion. It is
-  // usually larger than |image_aperture_|.
-  gfx::Rect layer_occlusion_;
-
   DISALLOW_COPY_AND_ASSIGN(NinePatchLayer);
 };
 
diff --git a/cc/layers/nine_patch_layer_impl.cc b/cc/layers/nine_patch_layer_impl.cc
index 1fac38552..039adb37 100644
--- a/cc/layers/nine_patch_layer_impl.cc
+++ b/cc/layers/nine_patch_layer_impl.cc
@@ -7,7 +7,6 @@
 #include "base/strings/stringprintf.h"
 #include "base/values.h"
 #include "cc/base/math_util.h"
-#include "cc/quads/solid_color_draw_quad.h"
 #include "cc/quads/texture_draw_quad.h"
 #include "cc/trees/layer_tree_impl.h"
 #include "cc/trees/occlusion.h"
@@ -15,14 +14,6 @@
 
 namespace cc {
 
-// Maximum number of patches that can be produced for one NinePatchLayer.
-static const int kMaxOcclusionPatches = 12;
-static const int kMaxPatches = 9;
-
-NinePatchLayerImpl::Patch::Patch(const gfx::Rect& image_rect,
-                                 const gfx::Rect& layer_rect)
-    : image_rect(image_rect), layer_rect(layer_rect) {}
-
 NinePatchLayerImpl::NinePatchLayerImpl(LayerTreeImpl* tree_impl, int id)
     : UIResourceLayerImpl(tree_impl, id),
       fill_center_(false),
@@ -39,24 +30,24 @@
   UIResourceLayerImpl::PushPropertiesTo(layer);
   NinePatchLayerImpl* layer_impl = static_cast<NinePatchLayerImpl*>(layer);
 
-  layer_impl->SetLayout(image_aperture_, border_, layer_occlusion_,
-                        fill_center_, nearest_neighbor_);
+  layer_impl->SetLayout(image_aperture_, border_, fill_center_,
+                        nearest_neighbor_);
 }
 
-static gfx::Rect BoundsToRect(int x1, int y1, int x2, int y2) {
-  return gfx::Rect(x1, y1, x2 - x1, y2 - y1);
-}
-
-static gfx::RectF NormalizedRect(const gfx::Rect& rect,
+static gfx::RectF NormalizedRect(float x,
+                                 float y,
+                                 float width,
+                                 float height,
                                  float total_width,
                                  float total_height) {
-  return gfx::RectF(rect.x() / total_width, rect.y() / total_height,
-                    rect.width() / total_width, rect.height() / total_height);
+  return gfx::RectF(x / total_width,
+                    y / total_height,
+                    width / total_width,
+                    height / total_height);
 }
 
 void NinePatchLayerImpl::SetLayout(const gfx::Rect& aperture,
                                    const gfx::Rect& border,
-                                   const gfx::Rect& layer_occlusion,
                                    bool fill_center,
                                    bool nearest_neighbor) {
   // This check imposes an ordering on the call sequence.  An UIResource must
@@ -64,15 +55,13 @@
   DCHECK(ui_resource_id_);
 
   if (image_aperture_ == aperture && border_ == border &&
-      fill_center_ == fill_center && nearest_neighbor_ == nearest_neighbor &&
-      layer_occlusion_ == layer_occlusion)
+      fill_center_ == fill_center && nearest_neighbor_ == nearest_neighbor)
     return;
 
   image_aperture_ = aperture;
   border_ = border;
   fill_center_ = fill_center;
   nearest_neighbor_ = nearest_neighbor;
-  layer_occlusion_ = layer_occlusion;
 
   NoteLayerPropertyChanged();
 }
@@ -95,184 +84,6 @@
       << " image_aperture_ " << image_aperture_.ToString();
 }
 
-std::vector<NinePatchLayerImpl::Patch>
-NinePatchLayerImpl::ComputeQuadsWithoutOcclusion() const {
-  float image_width = image_bounds_.width();
-  float image_height = image_bounds_.height();
-  int layer_width = bounds().width();
-  int layer_height = bounds().height();
-  gfx::Rect layer_aperture(border_.x(), border_.y(),
-                           layer_width - border_.width(),
-                           layer_height - border_.height());
-
-  std::vector<Patch> patches;
-  patches.reserve(kMaxPatches);
-
-  // Top-left.
-  patches.push_back(
-      Patch(BoundsToRect(0, 0, image_aperture_.x(), image_aperture_.y()),
-            BoundsToRect(0, 0, layer_aperture.x(), layer_aperture.y())));
-
-  // Top-right.
-  patches.push_back(Patch(BoundsToRect(image_aperture_.right(), 0, image_width,
-                                       image_aperture_.y()),
-                          BoundsToRect(layer_aperture.right(), 0, layer_width,
-                                       layer_aperture.y())));
-
-  // Bottom-left.
-  patches.push_back(Patch(BoundsToRect(0, image_aperture_.bottom(),
-                                       image_aperture_.x(), image_height),
-                          BoundsToRect(0, layer_aperture.bottom(),
-                                       layer_aperture.x(), layer_height)));
-
-  // Bottom-right.
-  patches.push_back(
-      Patch(BoundsToRect(image_aperture_.right(), image_aperture_.bottom(),
-                         image_width, image_height),
-            BoundsToRect(layer_aperture.right(), layer_aperture.bottom(),
-                         layer_width, layer_height)));
-
-  // Top.
-  patches.push_back(
-      Patch(BoundsToRect(image_aperture_.x(), 0, image_aperture_.right(),
-                         image_aperture_.y()),
-            BoundsToRect(layer_aperture.x(), 0, layer_aperture.right(),
-                         layer_aperture.y())));
-
-  // Left.
-  patches.push_back(
-      Patch(BoundsToRect(0, image_aperture_.y(), image_aperture_.x(),
-                         image_aperture_.bottom()),
-            BoundsToRect(0, layer_aperture.y(), layer_aperture.x(),
-                         layer_aperture.bottom())));
-
-  // Right.
-  patches.push_back(
-      Patch(BoundsToRect(image_aperture_.right(), image_aperture_.y(),
-                         image_width, image_aperture_.bottom()),
-            BoundsToRect(layer_aperture.right(), layer_aperture.y(),
-                         layer_width, layer_aperture.bottom())));
-
-  // Bottom.
-  patches.push_back(
-      Patch(BoundsToRect(image_aperture_.x(), image_aperture_.bottom(),
-                         image_aperture_.right(), image_height),
-            BoundsToRect(layer_aperture.x(), layer_aperture.bottom(),
-                         layer_aperture.right(), layer_height)));
-
-  // Center.
-  if (fill_center_) {
-    patches.push_back(
-        Patch(BoundsToRect(image_aperture_.x(), image_aperture_.y(),
-                           image_aperture_.right(), image_aperture_.bottom()),
-              BoundsToRect(layer_aperture.x(), layer_aperture.y(),
-                           layer_aperture.right(), layer_aperture.bottom())));
-  }
-
-  return patches;
-}
-
-std::vector<NinePatchLayerImpl::Patch>
-NinePatchLayerImpl::ComputeQuadsWithOcclusion() const {
-  float image_width = image_bounds_.width();
-  float image_height = image_bounds_.height();
-  int layer_width = bounds().width();
-  int layer_height = bounds().height();
-  gfx::Rect image_occlusion(
-      BoundsToRect(layer_occlusion_.x(), layer_occlusion_.y(),
-                   image_width - (layer_width - layer_occlusion_.right()),
-                   image_height - (layer_height - layer_occlusion_.bottom())));
-  gfx::Rect layer_aperture(
-      BoundsToRect(image_aperture_.x(), image_aperture_.y(),
-                   layer_width - (image_width - image_aperture_.right()),
-                   layer_height - (image_height - image_aperture_.bottom())));
-
-  std::vector<Patch> patches;
-  patches.reserve(kMaxOcclusionPatches);
-
-  // Top-left-left.
-  patches.push_back(
-      Patch(BoundsToRect(0, 0, image_occlusion.x(), image_aperture_.y()),
-            BoundsToRect(0, 0, layer_occlusion_.x(), layer_aperture.y())));
-
-  // Top-left-right.
-  patches.push_back(
-      Patch(BoundsToRect(image_occlusion.x(), 0, image_aperture_.x(),
-                         image_occlusion.y()),
-            BoundsToRect(layer_occlusion_.x(), 0, layer_aperture.x(),
-                         layer_occlusion_.y())));
-
-  // Top-center.
-  patches.push_back(
-      Patch(BoundsToRect(image_aperture_.x(), 0, image_aperture_.right(),
-                         image_occlusion.y()),
-            BoundsToRect(layer_aperture.x(), 0, layer_aperture.right(),
-                         layer_occlusion_.y())));
-
-  // Top-right-left.
-  patches.push_back(
-      Patch(BoundsToRect(image_aperture_.right(), 0, image_occlusion.right(),
-                         image_occlusion.y()),
-            BoundsToRect(layer_aperture.right(), 0, layer_occlusion_.right(),
-                         layer_occlusion_.y())));
-
-  // Top-right-right.
-  patches.push_back(Patch(BoundsToRect(image_occlusion.right(), 0, image_width,
-                                       image_aperture_.y()),
-                          BoundsToRect(layer_occlusion_.right(), 0, layer_width,
-                                       layer_aperture.y())));
-
-  // Right-center.
-  patches.push_back(
-      Patch(BoundsToRect(0, image_aperture_.y(), image_occlusion.x(),
-                         image_aperture_.bottom()),
-            BoundsToRect(0, layer_aperture.y(), layer_occlusion_.x(),
-                         layer_aperture.bottom())));
-
-  // Left-center.
-  patches.push_back(
-      Patch(BoundsToRect(image_occlusion.right(), image_aperture_.y(),
-                         image_width, image_aperture_.bottom()),
-            BoundsToRect(layer_occlusion_.right(), layer_aperture.y(),
-                         layer_width, layer_aperture.bottom())));
-
-  // Bottom-left-left.
-  patches.push_back(Patch(BoundsToRect(0, image_aperture_.bottom(),
-                                       image_occlusion.x(), image_height),
-                          BoundsToRect(0, layer_aperture.bottom(),
-                                       layer_occlusion_.x(), layer_height)));
-
-  // Bottom-left-right.
-  patches.push_back(
-      Patch(BoundsToRect(image_occlusion.x(), image_occlusion.bottom(),
-                         image_aperture_.x(), image_height),
-            BoundsToRect(layer_occlusion_.x(), layer_occlusion_.bottom(),
-                         layer_aperture.x(), layer_height)));
-
-  // Bottom-center.
-  patches.push_back(
-      Patch(BoundsToRect(image_aperture_.x(), image_occlusion.bottom(),
-                         image_aperture_.right(), image_height),
-            BoundsToRect(layer_aperture.x(), layer_occlusion_.bottom(),
-                         layer_aperture.right(), layer_height)));
-
-  // Bottom-right-left.
-  patches.push_back(
-      Patch(BoundsToRect(image_aperture_.right(), image_occlusion.bottom(),
-                         image_occlusion.right(), image_height),
-            BoundsToRect(layer_aperture.right(), layer_occlusion_.bottom(),
-                         layer_occlusion_.right(), layer_height)));
-
-  // Bottom-right-right.
-  patches.push_back(
-      Patch(BoundsToRect(image_occlusion.right(), image_aperture_.bottom(),
-                         image_width, image_height),
-            BoundsToRect(layer_occlusion_.right(), layer_aperture.bottom(),
-                         layer_width, layer_height)));
-
-  return patches;
-}
-
 void NinePatchLayerImpl::AppendQuads(
     RenderPass* render_pass,
     AppendQuadsData* append_quads_data) {
@@ -293,35 +104,243 @@
   if (!resource)
     return;
 
-  DCHECK(!bounds().IsEmpty());
-
-  std::vector<Patch> patches;
-
-  if (!layer_occlusion_.IsEmpty() && border_.IsEmpty() && !fill_center_)
-    patches = ComputeQuadsWithOcclusion();
-  else
-    patches = ComputeQuadsWithoutOcclusion();
-
-  const float vertex_opacity[] = {1.0f, 1.0f, 1.0f, 1.0f};
-  const bool opaque = layer_tree_impl()->IsUIResourceOpaque(ui_resource_id_);
   static const bool flipped = false;
   static const bool premultiplied_alpha = true;
 
-  for (const auto& patch : patches) {
-    gfx::Rect visible_rect =
+  DCHECK(!bounds().IsEmpty());
+
+  // NinePatch border widths in layer space.
+  int layer_left_width = border_.x();
+  int layer_top_height = border_.y();
+  int layer_right_width = border_.width() - layer_left_width;
+  int layer_bottom_height = border_.height() - layer_top_height;
+
+  int layer_middle_width = bounds().width() - border_.width();
+  int layer_middle_height = bounds().height() - border_.height();
+
+  // Patch positions in layer space
+  gfx::Rect layer_top_left(0, 0, layer_left_width, layer_top_height);
+  gfx::Rect layer_top_right(bounds().width() - layer_right_width,
+                            0,
+                            layer_right_width,
+                            layer_top_height);
+  gfx::Rect layer_bottom_left(0,
+                              bounds().height() - layer_bottom_height,
+                              layer_left_width,
+                              layer_bottom_height);
+  gfx::Rect layer_bottom_right(layer_top_right.x(),
+                               layer_bottom_left.y(),
+                               layer_right_width,
+                               layer_bottom_height);
+  gfx::Rect layer_top(
+      layer_top_left.right(), 0, layer_middle_width, layer_top_height);
+  gfx::Rect layer_left(
+      0, layer_top_left.bottom(), layer_left_width, layer_middle_height);
+  gfx::Rect layer_right(layer_top_right.x(),
+                        layer_top_right.bottom(),
+                        layer_right_width,
+                        layer_left.height());
+  gfx::Rect layer_bottom(layer_top.x(),
+                         layer_bottom_left.y(),
+                         layer_top.width(),
+                         layer_bottom_height);
+  gfx::Rect layer_center(layer_left_width,
+                         layer_top_height,
+                         layer_middle_width,
+                         layer_middle_height);
+
+  // Note the following values are in image (bitmap) space.
+  float image_width = image_bounds_.width();
+  float image_height = image_bounds_.height();
+
+  int image_aperture_left_width = image_aperture_.x();
+  int image_aperture_top_height = image_aperture_.y();
+  int image_aperture_right_width = image_width - image_aperture_.right();
+  int image_aperture_bottom_height = image_height - image_aperture_.bottom();
+  // Patch positions in bitmap UV space (from zero to one)
+  gfx::RectF uv_top_left = NormalizedRect(0,
+                                          0,
+                                          image_aperture_left_width,
+                                          image_aperture_top_height,
+                                          image_width,
+                                          image_height);
+  gfx::RectF uv_top_right =
+      NormalizedRect(image_width - image_aperture_right_width,
+                     0,
+                     image_aperture_right_width,
+                     image_aperture_top_height,
+                     image_width,
+                     image_height);
+  gfx::RectF uv_bottom_left =
+      NormalizedRect(0,
+                     image_height - image_aperture_bottom_height,
+                     image_aperture_left_width,
+                     image_aperture_bottom_height,
+                     image_width,
+                     image_height);
+  gfx::RectF uv_bottom_right =
+      NormalizedRect(image_width - image_aperture_right_width,
+                     image_height - image_aperture_bottom_height,
+                     image_aperture_right_width,
+                     image_aperture_bottom_height,
+                     image_width,
+                     image_height);
+  gfx::RectF uv_top(
+      uv_top_left.right(),
+      0,
+      (image_width - image_aperture_left_width - image_aperture_right_width) /
+          image_width,
+      (image_aperture_top_height) / image_height);
+  gfx::RectF uv_left(0,
+                     uv_top_left.bottom(),
+                     image_aperture_left_width / image_width,
+                     (image_height - image_aperture_top_height -
+                      image_aperture_bottom_height) /
+                         image_height);
+  gfx::RectF uv_right(uv_top_right.x(),
+                      uv_top_right.bottom(),
+                      image_aperture_right_width / image_width,
+                      uv_left.height());
+  gfx::RectF uv_bottom(uv_top.x(),
+                       uv_bottom_left.y(),
+                       uv_top.width(),
+                       image_aperture_bottom_height / image_height);
+  gfx::RectF uv_center(uv_top_left.right(),
+                       uv_top_left.bottom(),
+                       uv_top.width(),
+                       uv_left.height());
+
+  gfx::Rect opaque_rect;
+  gfx::Rect visible_rect;
+  const float vertex_opacity[] = {1.0f, 1.0f, 1.0f, 1.0f};
+  const bool opaque = layer_tree_impl()->IsUIResourceOpaque(ui_resource_id_);
+
+  visible_rect =
+      draw_properties().occlusion_in_content_space.GetUnoccludedContentRect(
+          layer_top_left);
+  opaque_rect = opaque ? visible_rect : gfx::Rect();
+  if (!visible_rect.IsEmpty()) {
+    TextureDrawQuad* quad =
+        render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>();
+    quad->SetNew(shared_quad_state, layer_top_left, opaque_rect, visible_rect,
+                 resource, premultiplied_alpha, uv_top_left.origin(),
+                 uv_top_left.bottom_right(), SK_ColorTRANSPARENT,
+                 vertex_opacity, flipped, nearest_neighbor_);
+    ValidateQuadResources(quad);
+  }
+
+  visible_rect =
+      draw_properties().occlusion_in_content_space.GetUnoccludedContentRect(
+          layer_top_right);
+  opaque_rect = opaque ? visible_rect : gfx::Rect();
+  if (!visible_rect.IsEmpty()) {
+    TextureDrawQuad* quad =
+        render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>();
+    quad->SetNew(shared_quad_state, layer_top_right, opaque_rect, visible_rect,
+                 resource, premultiplied_alpha, uv_top_right.origin(),
+                 uv_top_right.bottom_right(), SK_ColorTRANSPARENT,
+                 vertex_opacity, flipped, nearest_neighbor_);
+    ValidateQuadResources(quad);
+  }
+
+  visible_rect =
+      draw_properties().occlusion_in_content_space.GetUnoccludedContentRect(
+          layer_bottom_left);
+  opaque_rect = opaque ? visible_rect : gfx::Rect();
+  if (!visible_rect.IsEmpty()) {
+    TextureDrawQuad* quad =
+        render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>();
+    quad->SetNew(shared_quad_state, layer_bottom_left, opaque_rect,
+                 visible_rect, resource, premultiplied_alpha,
+                 uv_bottom_left.origin(), uv_bottom_left.bottom_right(),
+                 SK_ColorTRANSPARENT, vertex_opacity, flipped,
+                 nearest_neighbor_);
+    ValidateQuadResources(quad);
+  }
+
+  visible_rect =
+      draw_properties().occlusion_in_content_space.GetUnoccludedContentRect(
+          layer_bottom_right);
+  opaque_rect = opaque ? visible_rect : gfx::Rect();
+  if (!visible_rect.IsEmpty()) {
+    TextureDrawQuad* quad =
+        render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>();
+    quad->SetNew(shared_quad_state, layer_bottom_right, opaque_rect,
+                 visible_rect, resource, premultiplied_alpha,
+                 uv_bottom_right.origin(), uv_bottom_right.bottom_right(),
+                 SK_ColorTRANSPARENT, vertex_opacity, flipped,
+                 nearest_neighbor_);
+    ValidateQuadResources(quad);
+  }
+
+  visible_rect =
+      draw_properties().occlusion_in_content_space.GetUnoccludedContentRect(
+          layer_top);
+  opaque_rect = opaque ? visible_rect : gfx::Rect();
+  if (!visible_rect.IsEmpty()) {
+    TextureDrawQuad* quad =
+        render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>();
+    quad->SetNew(shared_quad_state, layer_top, opaque_rect, visible_rect,
+                 resource, premultiplied_alpha, uv_top.origin(),
+                 uv_top.bottom_right(), SK_ColorTRANSPARENT, vertex_opacity,
+                 flipped, nearest_neighbor_);
+    ValidateQuadResources(quad);
+  }
+
+  visible_rect =
+      draw_properties().occlusion_in_content_space.GetUnoccludedContentRect(
+          layer_left);
+  opaque_rect = opaque ? visible_rect : gfx::Rect();
+  if (!visible_rect.IsEmpty()) {
+    TextureDrawQuad* quad =
+        render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>();
+    quad->SetNew(shared_quad_state, layer_left, opaque_rect, visible_rect,
+                 resource, premultiplied_alpha, uv_left.origin(),
+                 uv_left.bottom_right(), SK_ColorTRANSPARENT, vertex_opacity,
+                 flipped, nearest_neighbor_);
+    ValidateQuadResources(quad);
+  }
+
+  visible_rect =
+      draw_properties().occlusion_in_content_space.GetUnoccludedContentRect(
+          layer_right);
+  opaque_rect = opaque ? visible_rect : gfx::Rect();
+  if (!visible_rect.IsEmpty()) {
+    TextureDrawQuad* quad =
+        render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>();
+    quad->SetNew(shared_quad_state, layer_right, opaque_rect, layer_right,
+                 resource, premultiplied_alpha, uv_right.origin(),
+                 uv_right.bottom_right(), SK_ColorTRANSPARENT, vertex_opacity,
+                 flipped, nearest_neighbor_);
+    ValidateQuadResources(quad);
+  }
+
+  visible_rect =
+      draw_properties().occlusion_in_content_space.GetUnoccludedContentRect(
+          layer_bottom);
+  opaque_rect = opaque ? visible_rect : gfx::Rect();
+  if (!visible_rect.IsEmpty()) {
+    TextureDrawQuad* quad =
+        render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>();
+    quad->SetNew(shared_quad_state, layer_bottom, opaque_rect, visible_rect,
+                 resource, premultiplied_alpha, uv_bottom.origin(),
+                 uv_bottom.bottom_right(), SK_ColorTRANSPARENT, vertex_opacity,
+                 flipped, nearest_neighbor_);
+    ValidateQuadResources(quad);
+  }
+
+  if (fill_center_) {
+    visible_rect =
         draw_properties().occlusion_in_content_space.GetUnoccludedContentRect(
-            patch.layer_rect);
-    gfx::Rect opaque_rect = opaque ? visible_rect : gfx::Rect();
+            layer_center);
+    opaque_rect = opaque ? visible_rect : gfx::Rect();
     if (!visible_rect.IsEmpty()) {
-      gfx::RectF image_rect(NormalizedRect(
-          patch.image_rect, image_bounds_.width(), image_bounds_.height()));
       TextureDrawQuad* quad =
           render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>();
-      quad->SetNew(shared_quad_state, patch.layer_rect, opaque_rect,
-                   visible_rect, resource, premultiplied_alpha,
-                   image_rect.origin(), image_rect.bottom_right(),
-                   SK_ColorTRANSPARENT, vertex_opacity, flipped,
-                   nearest_neighbor_);
+      quad->SetNew(shared_quad_state, layer_center, opaque_rect, visible_rect,
+                   resource, premultiplied_alpha, uv_center.origin(),
+                   uv_center.bottom_right(), SK_ColorTRANSPARENT,
+                   vertex_opacity, flipped, nearest_neighbor_);
       ValidateQuadResources(quad);
     }
   }
@@ -350,13 +369,6 @@
 
   result->SetBoolean("FillCenter", fill_center_);
 
-  list = new base::ListValue;
-  list->AppendInteger(layer_occlusion_.x());
-  list->AppendInteger(layer_occlusion_.y());
-  list->AppendInteger(layer_occlusion_.width());
-  list->AppendInteger(layer_occlusion_.height());
-  result->Set("LayerOcclusion", list);
-
   return result;
 }
 
diff --git a/cc/layers/nine_patch_layer_impl.h b/cc/layers/nine_patch_layer_impl.h
index 3511c32..1fe8e7f2 100644
--- a/cc/layers/nine_patch_layer_impl.h
+++ b/cc/layers/nine_patch_layer_impl.h
@@ -34,52 +34,29 @@
   // The bitmap stretches out the bounds of the layer.  The following picture
   // illustrates the parameters associated with the dimensions.
   //
-  // Layer space layout
+  // Layer space layout              Bitmap space layout
   //
-  // --------------------------------
-  // |         :    :               |
-  // |         J    C               |
-  // |         :    :               |
-  // |      ------------------      |
-  // |      |       :        |      |
-  // |~~~I~~|  ------------  |      |
-  // |      |  |          |  |      |
-  // |      |  |          |  |      |
-  // |~~~A~~|~~|          |~~|~B~~~~|
-  // |      |  |          |  |      |
-  // |      L  ------------  |      |
-  // |      |       :        |      |
-  // |      ---K--------------      |
-  // |              D               |
-  // |              :               |
-  // |              :               |
-  // --------------------------------
-  //
-  // Bitmap space layout
-  //
-  // ~~~~~~~~~~ W ~~~~~~~~~~
-  // :     :                |
-  // :     Y                |
-  // :     :                |
-  // :~~X~~------------     |
-  // :     |          :     |
-  // :     |          :     |
-  // H     |          Q     |
-  // :     |          :     |
-  // :     ~~~~~P~~~~~      |
-  // :                      |
-  // :                      |
-  // :                      |
-  // ------------------------
+  // ------------------------       ~~~~~~~~~~ W ~~~~~~~~~~
+  // |          :           |       :     :                |
+  // |          C           |       :     Y                |
+  // |          :           |       :     :                |
+  // |     ------------     |       :~~X~~------------     |
+  // |     |          |     |       :     |          :     |
+  // |     |          |     |       :     |          :     |
+  // |~~A~~|          |~~B~~|       H     |          Q     |
+  // |     |          |     |       :     |          :     |
+  // |     ------------     |       :     ~~~~~P~~~~~      |
+  // |          :           |       :                      |
+  // |          D           |       :                      |
+  // |          :           |       :                      |
+  // ------------------------       ------------------------
   //
   // |image_bounds| = (W, H)
   // |image_aperture| = (X, Y, P, Q)
   // |border| = (A, C, A + B, C + D)
-  // |occlusion_rectangle| = (I, J, K, L)
   // |fill_center| indicates whether to draw the center quad or not.
   void SetLayout(const gfx::Rect& image_aperture,
                  const gfx::Rect& border,
-                 const gfx::Rect& layer_occlusion,
                  bool fill_center,
                  bool nearest_neighbor);
 
@@ -95,21 +72,10 @@
   NinePatchLayerImpl(LayerTreeImpl* tree_impl, int id);
 
  private:
-  class Patch {
-   public:
-    Patch(const gfx::Rect& image_rect, const gfx::Rect& layer_rect);
-
-    gfx::Rect image_rect;
-    gfx::Rect layer_rect;
-  };
-
   const char* LayerTypeAsString() const override;
 
   void CheckGeometryLimitations();
 
-  std::vector<Patch> ComputeQuadsWithOcclusion() const;
-  std::vector<Patch> ComputeQuadsWithoutOcclusion() const;
-
   // The transparent center region that shows the parent layer's contents in
   // image space.
   gfx::Rect image_aperture_;
@@ -121,8 +87,6 @@
 
   bool nearest_neighbor_;
 
-  gfx::Rect layer_occlusion_;
-
   DISALLOW_COPY_AND_ASSIGN(NinePatchLayerImpl);
 };
 
diff --git a/cc/layers/nine_patch_layer_impl_unittest.cc b/cc/layers/nine_patch_layer_impl_unittest.cc
index d1396db..89cf250 100644
--- a/cc/layers/nine_patch_layer_impl_unittest.cc
+++ b/cc/layers/nine_patch_layer_impl_unittest.cc
@@ -35,28 +35,14 @@
                               const gfx::Rect& aperture_rect,
                               const gfx::Size& layer_size,
                               const gfx::Rect& border,
-                              const gfx::Rect& occlusion,
                               bool fill_center,
                               size_t expected_quad_size) {
   std::unique_ptr<RenderPass> render_pass = RenderPass::Create();
   gfx::Rect visible_layer_rect(layer_size);
-  gfx::Rect expected_layer_remaining;
-  gfx::Rect expected_tex_remaining;
-
-  if (!occlusion.IsEmpty()) {
-    expected_layer_remaining = occlusion;
-    expected_tex_remaining.SetRect(
-        occlusion.x(), occlusion.y(),
-        (bitmap_size.width() - occlusion.x()) -
-            (layer_size.width() - occlusion.right()),
-        (bitmap_size.height() - occlusion.y()) -
-            (layer_size.height() - occlusion.bottom()));
-  } else {
-    expected_layer_remaining.SetRect(border.x(), border.y(),
-                                     layer_size.width() - border.width(),
-                                     layer_size.height() - border.height());
-    expected_tex_remaining = aperture_rect;
-  }
+  gfx::Rect expected_remaining(border.x(),
+                               border.y(),
+                               layer_size.width() - border.width(),
+                               layer_size.height() - border.height());
 
   FakeImplTaskRunnerProvider task_runner_provider;
   TestSharedBitmapManager shared_bitmap_manager;
@@ -80,7 +66,7 @@
   host_impl.CreateUIResource(uid, bitmap);
   layer->SetUIResourceId(uid);
   layer->SetImageBounds(bitmap_size);
-  layer->SetLayout(aperture_rect, border, occlusion, fill_center, false);
+  layer->SetLayout(aperture_rect, border, fill_center, false);
   AppendQuadsData data;
   layer->AppendQuads(render_pass.get(), &data);
 
@@ -88,21 +74,21 @@
   const QuadList& quads = render_pass->quad_list;
   EXPECT_EQ(expected_quad_size, quads.size());
 
-  Region layer_remaining(visible_layer_rect);
+  Region remaining(visible_layer_rect);
   for (auto iter = quads.cbegin(); iter != quads.cend(); ++iter) {
     gfx::Rect quad_rect = iter->rect;
 
     EXPECT_TRUE(visible_layer_rect.Contains(quad_rect)) << iter.index();
-    EXPECT_TRUE(layer_remaining.Contains(quad_rect)) << iter.index();
-    layer_remaining.Subtract(Region(quad_rect));
+    EXPECT_TRUE(remaining.Contains(quad_rect)) << iter.index();
+    remaining.Subtract(Region(quad_rect));
   }
 
   // Check if the left-over quad is the same size as the mapped aperture quad in
   // layer space.
   if (!fill_center) {
-    EXPECT_EQ(expected_layer_remaining, layer_remaining.bounds());
+    EXPECT_EQ(expected_remaining, remaining.bounds());
   } else {
-    EXPECT_TRUE(layer_remaining.bounds().IsEmpty());
+    EXPECT_TRUE(remaining.bounds().IsEmpty());
   }
 
   // Verify UV rects
@@ -117,11 +103,11 @@
   }
 
   if (!fill_center) {
-    EXPECT_EQ(expected_tex_remaining, tex_remaining.bounds());
-    Region aperture_region(expected_tex_remaining);
+    EXPECT_EQ(aperture_rect, tex_remaining.bounds());
+    Region aperture_region(aperture_rect);
     EXPECT_EQ(aperture_region, tex_remaining);
   } else {
-    EXPECT_TRUE(layer_remaining.bounds().IsEmpty());
+    EXPECT_TRUE(remaining.bounds().IsEmpty());
   }
 }
 
@@ -134,8 +120,12 @@
   gfx::Rect border(40, 40, 80, 80);
   bool fill_center = false;
   size_t expected_quad_size = 8;
-  NinePatchLayerLayoutTest(bitmap_size, aperture_rect, layer_size, border,
-                           gfx::Rect(), fill_center, expected_quad_size);
+  NinePatchLayerLayoutTest(bitmap_size,
+                           aperture_rect,
+                           layer_size,
+                           border,
+                           fill_center,
+                           expected_quad_size);
 
   // The bounds of the layer are set to less than the bitmap size.
   bitmap_size = gfx::Size(100, 100);
@@ -144,8 +134,12 @@
   border = gfx::Rect(10, 10, 25, 15);
   fill_center = true;
   expected_quad_size = 9;
-  NinePatchLayerLayoutTest(bitmap_size, aperture_rect, layer_size, border,
-                           gfx::Rect(), fill_center, expected_quad_size);
+  NinePatchLayerLayoutTest(bitmap_size,
+                           aperture_rect,
+                           layer_size,
+                           border,
+                           fill_center,
+                           expected_quad_size);
 
   // Layer and image sizes are equal.
   bitmap_size = gfx::Size(100, 100);
@@ -154,21 +148,12 @@
   border = gfx::Rect(20, 30, 40, 50);
   fill_center = true;
   expected_quad_size = 9;
-  NinePatchLayerLayoutTest(bitmap_size, aperture_rect, layer_size, border,
-                           gfx::Rect(), fill_center, expected_quad_size);
-}
-
-TEST(NinePatchLayerImplTest, VerifyDrawQuadsWithOcclusion) {
-  // Input is a 100x100 bitmap with a 40x50 aperture at x=20, y=30.
-  // The bounds of the layer are set to 400x400.
-  gfx::Size bitmap_size(100, 100);
-  gfx::Rect aperture_rect(30, 30, 40, 40);
-  gfx::Size layer_size(400, 400);
-  gfx::Rect occlusion(20, 20, 360, 360);
-  bool fill_center = false;
-  size_t expected_quad_size = 12;
-  NinePatchLayerLayoutTest(bitmap_size, aperture_rect, layer_size, gfx::Rect(),
-                           occlusion, fill_center, expected_quad_size);
+  NinePatchLayerLayoutTest(bitmap_size,
+                           aperture_rect,
+                           layer_size,
+                           border,
+                           fill_center,
+                           expected_quad_size);
 }
 
 TEST(NinePatchLayerImplTest, VerifyDrawQuadsWithEmptyPatches) {
@@ -180,8 +165,12 @@
   gfx::Rect border(10, 0, 20, 10);
   bool fill_center = false;
   size_t expected_quad_size = 5;
-  NinePatchLayerLayoutTest(bitmap_size, aperture_rect, layer_size, border,
-                           gfx::Rect(), fill_center, expected_quad_size);
+  NinePatchLayerLayoutTest(bitmap_size,
+                           aperture_rect,
+                           layer_size,
+                           border,
+                           fill_center,
+                           expected_quad_size);
 
   // The top and left components of the 9-patch are empty, so there should be no
   // quads for the left and top components.
@@ -191,8 +180,12 @@
   border = gfx::Rect(0, 0, 10, 10);
   fill_center = false;
   expected_quad_size = 3;
-  NinePatchLayerLayoutTest(bitmap_size, aperture_rect, layer_size, border,
-                           gfx::Rect(), fill_center, expected_quad_size);
+  NinePatchLayerLayoutTest(bitmap_size,
+                           aperture_rect,
+                           layer_size,
+                           border,
+                           fill_center,
+                           expected_quad_size);
 
   // The aperture is the size of the bitmap and the center doesn't draw.
   bitmap_size = gfx::Size(100, 100);
@@ -201,8 +194,12 @@
   border = gfx::Rect(0, 0, 0, 0);
   fill_center = false;
   expected_quad_size = 0;
-  NinePatchLayerLayoutTest(bitmap_size, aperture_rect, layer_size, border,
-                           gfx::Rect(), fill_center, expected_quad_size);
+  NinePatchLayerLayoutTest(bitmap_size,
+                           aperture_rect,
+                           layer_size,
+                           border,
+                           fill_center,
+                           expected_quad_size);
 
   // The aperture is the size of the bitmap and the center does draw.
   bitmap_size = gfx::Size(100, 100);
@@ -211,8 +208,12 @@
   border = gfx::Rect(0, 0, 0, 0);
   fill_center = true;
   expected_quad_size = 1;
-  NinePatchLayerLayoutTest(bitmap_size, aperture_rect, layer_size, border,
-                           gfx::Rect(), fill_center, expected_quad_size);
+  NinePatchLayerLayoutTest(bitmap_size,
+                           aperture_rect,
+                           layer_size,
+                           border,
+                           fill_center,
+                           expected_quad_size);
 }
 
 TEST(NinePatchLayerImplTest, Occlusion) {
@@ -237,7 +238,7 @@
 
   gfx::Rect aperture = gfx::Rect(3, 3, 4, 4);
   gfx::Rect border = gfx::Rect(300, 300, 400, 400);
-  nine_patch_layer_impl->SetLayout(aperture, border, gfx::Rect(), true, false);
+  nine_patch_layer_impl->SetLayout(aperture, border, true, false);
 
   impl.CalcDrawProps(viewport_size);
 
@@ -315,8 +316,7 @@
 
     gfx::Rect aperture = gfx::Rect(3, 3, 4, 4);
     gfx::Rect border = gfx::Rect(300, 300, 400, 400);
-    nine_patch_layer_impl->SetLayout(aperture, border, gfx::Rect(), true,
-                                     false);
+    nine_patch_layer_impl->SetLayout(aperture, border, true, false);
 
     impl.AppendQuadsWithOcclusion(nine_patch_layer_impl, gfx::Rect());
 
diff --git a/cc/layers/texture_layer_unittest.cc b/cc/layers/texture_layer_unittest.cc
index f94430d6..2bf6a332 100644
--- a/cc/layers/texture_layer_unittest.cc
+++ b/cc/layers/texture_layer_unittest.cc
@@ -1217,7 +1217,7 @@
         // So the old mailbox isn't returned yet.
         EXPECT_EQ(0, mailbox_returned_);
         // Make layer visible again.
-        parent_layer_->SetOpacity(1.f);
+        parent_layer_->SetOpacity(0.9f);
         break;
       case 4:
         // Layer should have been updated.
diff --git a/cc/playback/display_item_list.cc b/cc/playback/display_item_list.cc
index 38bd1eb..f1160531 100644
--- a/cc/playback/display_item_list.cc
+++ b/cc/playback/display_item_list.cc
@@ -167,6 +167,7 @@
 }
 
 void DisplayItemList::Finalize() {
+  TRACE_EVENT0("cc", "DisplayItemList::Finalize");
   // TODO(dtrainor): Need to deal with serializing visual_rects_.
   // http://crbug.com/568757.
   DCHECK(!retain_individual_display_items_ ||
@@ -200,7 +201,9 @@
 }
 
 int DisplayItemList::ApproximateOpCount() const {
-  return approximate_op_count_;
+  if (retain_individual_display_items_)
+    return approximate_op_count_;
+  return picture_ ? picture_->approximateOpCount() : 0;
 }
 
 size_t DisplayItemList::ApproximateMemoryUsage() const {
diff --git a/cc/playback/display_item_list_unittest.cc b/cc/playback/display_item_list_unittest.cc
index 73953dfb..35c490bd 100644
--- a/cc/playback/display_item_list_unittest.cc
+++ b/cc/playback/display_item_list_unittest.cc
@@ -541,6 +541,7 @@
   DrawingDisplayItem suitable_item(suitable_picture);
   list->RasterIntoCanvas(suitable_item);
   list->Finalize();
+  EXPECT_TRUE(list->ApproximateOpCount());
   EXPECT_TRUE(list->IsSuitableForGpuRasterization());
 
   list = DisplayItemList::Create(layer_rect, settings);
diff --git a/cc/playback/recording_source.cc b/cc/playback/recording_source.cc
index a98a60e..feaae88 100644
--- a/cc/playback/recording_source.cc
+++ b/cc/playback/recording_source.cc
@@ -104,6 +104,7 @@
 }
 
 void RecordingSource::FinishDisplayItemListUpdate() {
+  TRACE_EVENT0("cc", "RecordingSource::FinishDisplayItemListUpdate");
   DetermineIfSolidColor();
   display_list_->EmitTraceSnapshot();
   if (generate_discardable_images_metadata_)
@@ -227,6 +228,8 @@
   if (!display_list_->ShouldBeAnalyzedForSolidColor())
     return;
 
+  TRACE_EVENT1("cc", "RecordingSource::DetermineIfSolidColor", "opcount",
+               display_list_->ApproximateOpCount());
   gfx::Size layer_size = GetSize();
   skia::AnalysisCanvas canvas(layer_size.width(), layer_size.height());
   display_list_->Raster(&canvas, nullptr, gfx::Rect(), 1.f);
diff --git a/cc/proto/layer.proto b/cc/proto/layer.proto
index 16ed618..d1c97ad 100644
--- a/cc/proto/layer.proto
+++ b/cc/proto/layer.proto
@@ -81,7 +81,6 @@
   optional bool double_sided = 8;
   optional bool draws_content = 9;
   optional bool hide_layer_and_subtree = 10;
-  optional bool has_render_surface = 11;
   optional bool subtree_property_changed = 47;
   // TODO(nyquist): Add support for FilterOperation. See crbug.com/541321.
   // repeated FilterOperation filters = 12;
diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc
index ed2cb7a3..6c62063 100644
--- a/cc/scheduler/scheduler_state_machine.cc
+++ b/cc/scheduler/scheduler_state_machine.cc
@@ -559,6 +559,9 @@
 }
 
 void SchedulerStateMachine::WillCommit(bool commit_has_no_updates) {
+  DCHECK(!has_pending_tree_ ||
+         (settings_.main_frame_before_activation_enabled &&
+          commit_has_no_updates));
   commit_count_++;
 
   if (commit_has_no_updates || settings_.main_frame_before_activation_enabled) {
@@ -567,8 +570,9 @@
     begin_main_frame_state_ = BEGIN_MAIN_FRAME_STATE_WAITING_FOR_ACTIVATION;
   }
 
-  // If the commit was aborted, then there is no pending tree.
-  has_pending_tree_ = !commit_has_no_updates;
+  // Pending tree only exists if commit had updates.
+  if (!commit_has_no_updates)
+    has_pending_tree_ = true;
 
   wait_for_ready_to_draw_ =
       !commit_has_no_updates && settings_.commit_to_active_tree;
diff --git a/cc/scheduler/scheduler_state_machine_unittest.cc b/cc/scheduler/scheduler_state_machine_unittest.cc
index f7dbcc4..8f86c3d 100644
--- a/cc/scheduler/scheduler_state_machine_unittest.cc
+++ b/cc/scheduler/scheduler_state_machine_unittest.cc
@@ -145,6 +145,7 @@
     return SchedulerStateMachine::PendingActivationsShouldBeForced();
   }
 
+  bool has_pending_tree() const { return has_pending_tree_; }
   void SetHasPendingTree(bool has_pending_tree) {
     has_pending_tree_ = has_pending_tree;
   }
@@ -608,19 +609,8 @@
   EXPECT_TRUE(state.ForcedRedrawState() ==
               SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_COMMIT);
 
-  state.NotifyBeginMainFrameStarted();
-  state.NotifyReadyToCommit();
-  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
-  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
-  EXPECT_TRUE(state.RedrawPending());
-  EXPECT_FALSE(state.CommitPending());
-
-  // Now force redraw should be in waiting for activation
-  EXPECT_TRUE(state.ForcedRedrawState() ==
-    SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_ACTIVATION);
-
   // After failing additional draws, we should still be in a forced
-  // redraw, but not back in WAITING_FOR_COMMIT.
+  // redraw, but not back in IDLE.
   for (int i = 0; i < draw_limit; ++i) {
     state.SetNeedsRedraw(true);
     state.OnBeginImplFrame();
@@ -635,7 +625,7 @@
   }
   EXPECT_TRUE(state.RedrawPending());
   EXPECT_TRUE(state.ForcedRedrawState() ==
-    SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_ACTIVATION);
+              SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_COMMIT);
 }
 
 TEST(SchedulerStateMachineTest, TestFailedDrawIsRetriedInNextBeginImplFrame) {
@@ -1020,6 +1010,7 @@
 TEST(SchedulerStateMachineTest, DontCommitWithoutDrawWithoutPendingTree) {
   SchedulerSettings scheduler_settings;
   scheduler_settings.commit_to_active_tree = true;
+  scheduler_settings.main_frame_before_activation_enabled = false;
   StateMachine state(scheduler_settings);
   SET_UP_STATE(state)
 
@@ -1043,9 +1034,65 @@
   EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 }
 
+TEST(SchedulerStateMachineTest, AbortedMainFrameDoesNotResetPendingTree) {
+  SchedulerSettings scheduler_settings;
+  scheduler_settings.main_frame_before_activation_enabled = true;
+  StateMachine state(scheduler_settings);
+  SET_UP_STATE(state);
+
+  // Perform a commit so that we have an active tree.
+  state.SetNeedsBeginMainFrame();
+  state.OnBeginImplFrame();
+  EXPECT_ACTION_UPDATE_STATE(
+      SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
+  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+  state.NotifyBeginMainFrameStarted();
+  state.NotifyReadyToCommit();
+  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
+  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+  EXPECT_TRUE(state.has_pending_tree());
+  state.OnBeginImplFrameDeadline();
+  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+
+  // Ask for another commit but abort it. Verify that we didn't reset pending
+  // tree state.
+  state.SetNeedsBeginMainFrame();
+  state.OnBeginImplFrame();
+  EXPECT_ACTION_UPDATE_STATE(
+      SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
+  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+  EXPECT_TRUE(state.has_pending_tree());
+  state.NotifyBeginMainFrameStarted();
+  state.BeginMainFrameAborted(CommitEarlyOutReason::FINISHED_NO_UPDATES);
+  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+  EXPECT_TRUE(state.has_pending_tree());
+  state.OnBeginImplFrameDeadline();
+  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+
+  // Ask for another commit that doesn't abort.
+  state.SetNeedsBeginMainFrame();
+  state.OnBeginImplFrame();
+  EXPECT_ACTION_UPDATE_STATE(
+      SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
+  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+  state.NotifyBeginMainFrameStarted();
+  state.NotifyReadyToCommit();
+  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+  EXPECT_TRUE(state.has_pending_tree());
+
+  // Verify that commit is delayed until the pending tree is activated.
+  state.NotifyReadyToActivate();
+  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
+  EXPECT_FALSE(state.has_pending_tree());
+  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
+  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+  EXPECT_TRUE(state.has_pending_tree());
+}
+
 TEST(SchedulerStateMachineTest, TestFullCycleWithCommitToActive) {
   SchedulerSettings scheduler_settings;
   scheduler_settings.commit_to_active_tree = true;
+  scheduler_settings.main_frame_before_activation_enabled = false;
   StateMachine state(scheduler_settings);
   SET_UP_STATE(state)
 
diff --git a/cc/test/layer_tree_host_common_test.cc b/cc/test/layer_tree_host_common_test.cc
index 4f2be2b4f..a064bbc 100644
--- a/cc/test/layer_tree_host_common_test.cc
+++ b/cc/test/layer_tree_host_common_test.cc
@@ -125,7 +125,6 @@
       outer_viewport_scroll_layer, overscroll_elasticity_layer,
       elastic_overscroll, page_scale_factor, device_scale_factor,
       gfx::Rect(device_viewport_size), identity_transform, property_trees);
-  draw_property_utils::UpdateRenderSurfaces(root_layer, property_trees);
   draw_property_utils::UpdatePropertyTrees(property_trees,
                                            can_render_to_separate_surface);
   draw_property_utils::FindLayersThatNeedUpdates(
diff --git a/cc/trees/damage_tracker.cc b/cc/trees/damage_tracker.cc
index 6a8891bf..95e545f2 100644
--- a/cc/trees/damage_tracker.cc
+++ b/cc/trees/damage_tracker.cc
@@ -153,18 +153,34 @@
   current_damage_rect_.Union(damage_rect_for_this_update);
 }
 
-DamageTracker::RectMapData& DamageTracker::RectDataForLayer(
+DamageTracker::LayerRectMapData& DamageTracker::RectDataForLayer(
     int layer_id,
     bool* layer_is_new) {
+  LayerRectMapData data(layer_id);
 
-  RectMapData data(layer_id);
+  SortedRectMapForLayers::iterator it = std::lower_bound(
+      rect_history_for_layers_.begin(), rect_history_for_layers_.end(), data);
 
-  SortedRectMap::iterator it = std::lower_bound(rect_history_.begin(),
-    rect_history_.end(), data);
-
-  if (it == rect_history_.end() || it->layer_id_ != layer_id) {
+  if (it == rect_history_for_layers_.end() || it->layer_id_ != layer_id) {
     *layer_is_new = true;
-    it = rect_history_.insert(it, data);
+    it = rect_history_for_layers_.insert(it, data);
+  }
+
+  return *it;
+}
+
+DamageTracker::SurfaceRectMapData& DamageTracker::RectDataForSurface(
+    int surface_id,
+    bool* surface_is_new) {
+  SurfaceRectMapData data(surface_id);
+
+  SortedRectMapForSurfaces::iterator it =
+      std::lower_bound(rect_history_for_surfaces_.begin(),
+                       rect_history_for_surfaces_.end(), data);
+
+  if (it == rect_history_for_surfaces_.end() || it->surface_id_ != surface_id) {
+    *surface_is_new = true;
+    it = rect_history_for_surfaces_.insert(it, data);
   }
 
   return *it;
@@ -222,8 +238,12 @@
   // So, these regions are now exposed on the target surface.
 
   gfx::Rect damage_rect;
-  SortedRectMap::iterator cur_pos = rect_history_.begin();
-  SortedRectMap::iterator copy_pos = cur_pos;
+  SortedRectMapForLayers::iterator layer_cur_pos =
+      rect_history_for_layers_.begin();
+  SortedRectMapForLayers::iterator layer_copy_pos = layer_cur_pos;
+  SortedRectMapForSurfaces::iterator surface_cur_pos =
+      rect_history_for_surfaces_.begin();
+  SortedRectMapForSurfaces::iterator surface_copy_pos = surface_cur_pos;
 
   // Loop below basically implements std::remove_if loop with and extra
   // processing (adding deleted rect to damage_rect) for deleted items.
@@ -233,25 +253,47 @@
   // moved to the next position.
   // If there are no deleted elements then copy_pos iterator is in sync with
   // cur_pos and no copy happens.
-  while (cur_pos < rect_history_.end()) {
-    if (cur_pos->mailboxId_ == mailboxId_) {
-      if (cur_pos != copy_pos)
-        *copy_pos = *cur_pos;
+  while (layer_cur_pos < rect_history_for_layers_.end()) {
+    if (layer_cur_pos->mailboxId_ == mailboxId_) {
+      if (layer_cur_pos != layer_copy_pos)
+        *layer_copy_pos = *layer_cur_pos;
 
-      ++copy_pos;
+      ++layer_copy_pos;
     } else {
-      damage_rect.Union(cur_pos->rect_);
+      damage_rect.Union(layer_cur_pos->rect_);
     }
 
-    ++cur_pos;
+    ++layer_cur_pos;
   }
 
-  if (copy_pos != rect_history_.end())
-    rect_history_.erase(copy_pos, rect_history_.end());
+  while (surface_cur_pos < rect_history_for_surfaces_.end()) {
+    if (surface_cur_pos->mailboxId_ == mailboxId_) {
+      if (surface_cur_pos != surface_copy_pos)
+        *surface_copy_pos = *surface_cur_pos;
+
+      ++surface_copy_pos;
+    } else {
+      damage_rect.Union(surface_cur_pos->rect_);
+    }
+
+    ++surface_cur_pos;
+  }
+
+  if (layer_copy_pos != rect_history_for_layers_.end())
+    rect_history_for_layers_.erase(layer_copy_pos,
+                                   rect_history_for_layers_.end());
+  if (surface_copy_pos != rect_history_for_surfaces_.end())
+    rect_history_for_surfaces_.erase(surface_copy_pos,
+                                     rect_history_for_surfaces_.end());
 
   // If the vector has excessive storage, shrink it
-  if (rect_history_.capacity() > rect_history_.size() * 4)
-    SortedRectMap(rect_history_).swap(rect_history_);
+  if (rect_history_for_layers_.capacity() > rect_history_for_layers_.size() * 4)
+    SortedRectMapForLayers(rect_history_for_layers_)
+        .swap(rect_history_for_layers_);
+  if (rect_history_for_surfaces_.capacity() >
+      rect_history_for_surfaces_.size() * 4)
+    SortedRectMapForSurfaces(rect_history_for_surfaces_)
+        .swap(rect_history_for_surfaces_);
 
   return damage_rect;
 }
@@ -277,7 +319,7 @@
   // ancestor surface, ExtendDamageForRenderSurface() must be called instead.
 
   bool layer_is_new = false;
-  RectMapData& data = RectDataForLayer(layer->id(), &layer_is_new);
+  LayerRectMapData& data = RectDataForLayer(layer->id(), &layer_is_new);
   gfx::Rect old_rect_in_target_space = data.rect_;
 
   gfx::Rect rect_in_target_space = layer->GetEnclosingRectInTargetSpace();
@@ -327,7 +369,7 @@
   RenderSurfaceImpl* render_surface = layer->render_surface();
 
   bool surface_is_new = false;
-  RectMapData& data = RectDataForLayer(layer->id(), &surface_is_new);
+  SurfaceRectMapData& data = RectDataForSurface(layer->id(), &surface_is_new);
   gfx::Rect old_surface_rect = data.rect_;
 
   // The drawableContextRect() already includes the replica if it exists.
@@ -369,7 +411,7 @@
     LayerImpl* replica_mask_layer = layer->replica_layer()->mask_layer();
 
     bool replica_is_new = false;
-    RectMapData& data =
+    LayerRectMapData& data =
         RectDataForLayer(replica_mask_layer->id(), &replica_is_new);
 
     const gfx::Transform& replica_draw_transform =
diff --git a/cc/trees/damage_tracker.h b/cc/trees/damage_tracker.h
index d1ed0a1..c03ca32 100644
--- a/cc/trees/damage_tracker.h
+++ b/cc/trees/damage_tracker.h
@@ -63,15 +63,16 @@
   void ExtendDamageForRenderSurface(LayerImpl* layer,
                                     gfx::Rect* target_damage_rect);
 
-  struct RectMapData {
-    RectMapData() : layer_id_(0), mailboxId_(0) {}
-    explicit RectMapData(int layer_id) : layer_id_(layer_id), mailboxId_(0) {}
+  struct LayerRectMapData {
+    LayerRectMapData() : layer_id_(0), mailboxId_(0) {}
+    explicit LayerRectMapData(int layer_id)
+        : layer_id_(layer_id), mailboxId_(0) {}
     void Update(const gfx::Rect& rect, unsigned int mailboxId) {
       mailboxId_ = mailboxId;
       rect_ = rect;
     }
 
-    bool operator < (const RectMapData& other) const {
+    bool operator<(const LayerRectMapData& other) const {
       return layer_id_ < other.layer_id_;
     }
 
@@ -79,11 +80,32 @@
     unsigned int mailboxId_;
     gfx::Rect rect_;
   };
-  typedef std::vector<RectMapData> SortedRectMap;
 
-  RectMapData& RectDataForLayer(int layer_id, bool* layer_is_new);
+  struct SurfaceRectMapData {
+    SurfaceRectMapData() : surface_id_(0), mailboxId_(0) {}
+    explicit SurfaceRectMapData(int surface_id)
+        : surface_id_(surface_id), mailboxId_(0) {}
+    void Update(const gfx::Rect& rect, unsigned int mailboxId) {
+      mailboxId_ = mailboxId;
+      rect_ = rect;
+    }
 
-  SortedRectMap rect_history_;
+    bool operator<(const SurfaceRectMapData& other) const {
+      return surface_id_ < other.surface_id_;
+    }
+
+    int surface_id_;
+    unsigned int mailboxId_;
+    gfx::Rect rect_;
+  };
+  typedef std::vector<LayerRectMapData> SortedRectMapForLayers;
+  typedef std::vector<SurfaceRectMapData> SortedRectMapForSurfaces;
+
+  LayerRectMapData& RectDataForLayer(int layer_id, bool* layer_is_new);
+  SurfaceRectMapData& RectDataForSurface(int layer_id, bool* layer_is_new);
+
+  SortedRectMapForLayers rect_history_for_layers_;
+  SortedRectMapForSurfaces rect_history_for_surfaces_;
 
   unsigned int mailboxId_;
   gfx::Rect current_damage_rect_;
diff --git a/cc/trees/damage_tracker_unittest.cc b/cc/trees/damage_tracker_unittest.cc
index f907bb7..884d6f00 100644
--- a/cc/trees/damage_tracker_unittest.cc
+++ b/cc/trees/damage_tracker_unittest.cc
@@ -418,6 +418,24 @@
   EXPECT_FLOAT_RECT_EQ(expected_rect, root_damage_rect);
 }
 
+TEST_F(DamageTrackerTest, VerifyDamageWhenSurfaceRemoved) {
+  LayerImpl* root = CreateAndSetUpTestTreeWithTwoSurfaces();
+  LayerImpl* surface = root->children()[0];
+  LayerImpl* child = surface->children()[0];
+  child->SetDrawsContent(true);
+  EmulateDrawingOneFrame(root);
+  ClearDamageForAllSurfaces(root);
+
+  surface->test_properties()->force_render_surface = false;
+  child->SetDrawsContent(false);
+  root->layer_tree_impl()->property_trees()->needs_rebuild = true;
+  EmulateDrawingOneFrame(root);
+  gfx::Rect root_damage_rect =
+      root->render_surface()->damage_tracker()->current_damage_rect();
+  EXPECT_EQ(gfx::Rect(290, 290, 16, 18).ToString(),
+            root_damage_rect.ToString());
+}
+
 TEST_F(DamageTrackerTest, VerifyDamageForTransformedLayer) {
   // If a layer is transformed, the damage rect should still enclose the entire
   // transformed layer.
diff --git a/cc/trees/draw_property_utils.cc b/cc/trees/draw_property_utils.cc
index 775482a2..a152ce0 100644
--- a/cc/trees/draw_property_utils.cc
+++ b/cc/trees/draw_property_utils.cc
@@ -33,13 +33,6 @@
 }
 
 #if DCHECK_IS_ON()
-static Layer* EffectNodeOwner(Layer* layer) {
-  EffectNode* node =
-      layer->layer_tree_host()->property_trees()->effect_tree.Node(
-          layer->effect_tree_index());
-  return layer->layer_tree_host()->LayerById(node->owner_id);
-}
-
 static LayerImpl* EffectNodeOwner(LayerImpl* layer) {
   EffectNode* node =
       layer->layer_tree_impl()->property_trees()->effect_tree.Node(
@@ -47,14 +40,7 @@
   return layer->layer_tree_impl()->LayerById(node->owner_id);
 }
 
-static void inline ValidateIsNotRootForIsolatedGroup(Layer* layer) {
-  DCHECK(!layer->is_root_for_isolated_group()) << "layer: " << layer->id();
-}
-
-static void inline ValidateIsNotRootForIsolatedGroup(LayerImpl* layer) {}
-
-template <typename LayerType>
-static void ValidateRenderSurfaceForLayer(LayerType* layer) {
+static void ValidateRenderSurfaceForLayer(LayerImpl* layer) {
   // This test verifies that there are no cases where a LayerImpl needs
   // a render surface, but doesn't have one.
   if (layer->has_render_surface())
@@ -68,7 +54,6 @@
   DCHECK(!layer->mask_layer()) << "layer: " << layer->id();
   DCHECK(!layer->replica_layer()) << "layer: " << layer->id();
   DCHECK(!layer->HasCopyRequest()) << "layer: " << layer->id();
-  ValidateIsNotRootForIsolatedGroup(layer);
 }
 
 #endif
@@ -350,10 +335,9 @@
   }
 }
 
-template <typename LayerType>
 void UpdateRenderSurfaceForLayer(EffectTree* effect_tree,
                                  bool non_root_surfaces_enabled,
-                                 LayerType* layer) {
+                                 LayerImpl* layer) {
   if (!non_root_surfaces_enabled) {
     layer->SetHasRenderSurface(IsRootLayer(layer));
     return;
@@ -797,17 +781,6 @@
       property_trees->transform_tree, can_render_to_separate_surface);
 }
 
-void UpdateRenderSurfaces(Layer* root_layer, PropertyTrees* property_trees) {
-  for (auto* layer : *root_layer->layer_tree_host()) {
-    UpdateRenderSurfaceForLayer(&property_trees->effect_tree,
-                                property_trees->non_root_surfaces_enabled,
-                                layer);
-#if DCHECK_IS_ON()
-    ValidateRenderSurfaceForLayer(layer);
-#endif
-  }
-}
-
 void UpdatePropertyTrees(PropertyTrees* property_trees,
                          bool can_render_to_separate_surface) {
   if (property_trees->non_root_surfaces_enabled !=
diff --git a/cc/trees/draw_property_utils.h b/cc/trees/draw_property_utils.h
index d948fe3d..c660686 100644
--- a/cc/trees/draw_property_utils.h
+++ b/cc/trees/draw_property_utils.h
@@ -56,9 +56,6 @@
     PropertyTrees* property_trees,
     LayerImplList* visible_layer_list);
 
-void CC_EXPORT UpdateRenderSurfaces(Layer* root_layer,
-                                    PropertyTrees* property_trees);
-
 void CC_EXPORT UpdatePropertyTrees(PropertyTrees* property_trees,
                                    bool can_render_to_separate_surface);
 
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc
index a06ea9e..9ab3678 100644
--- a/cc/trees/layer_tree_host.cc
+++ b/cc/trees/layer_tree_host.cc
@@ -1003,7 +1003,6 @@
                            TRACE_EVENT_SCOPE_THREAD, "property_trees",
                            property_trees_.AsTracedValue());
     }
-    draw_property_utils::UpdateRenderSurfaces(root_layer, &property_trees_);
     draw_property_utils::UpdatePropertyTrees(&property_trees_,
                                              can_render_to_separate_surface);
     draw_property_utils::FindLayersThatNeedUpdates(
diff --git a/cc/trees/layer_tree_host_common.cc b/cc/trees/layer_tree_host_common.cc
index 94f360f..8ed875c5 100644
--- a/cc/trees/layer_tree_host_common.cc
+++ b/cc/trees/layer_tree_host_common.cc
@@ -639,7 +639,6 @@
       inputs->page_scale_factor, inputs->device_scale_factor,
       gfx::Rect(inputs->device_viewport_size), inputs->device_transform,
       property_trees);
-  draw_property_utils::UpdateRenderSurfaces(inputs->root_layer, property_trees);
   draw_property_utils::UpdatePropertyTrees(property_trees,
                                            can_render_to_separate_surface);
   draw_property_utils::FindLayersThatNeedUpdates(
diff --git a/cc/trees/layer_tree_host_common_unittest.cc b/cc/trees/layer_tree_host_common_unittest.cc
index 91f27f1..0932bff 100644
--- a/cc/trees/layer_tree_host_common_unittest.cc
+++ b/cc/trees/layer_tree_host_common_unittest.cc
@@ -4171,48 +4171,43 @@
   // "flattened" to each parent layer according to current W3C spec.
 
   const gfx::Transform identity_matrix;
-  scoped_refptr<Layer> parent = Layer::Create();
-  scoped_refptr<LayerWithForcedDrawsContent> front_facing_child =
-      make_scoped_refptr(new LayerWithForcedDrawsContent());
-  scoped_refptr<LayerWithForcedDrawsContent> back_facing_child =
-      make_scoped_refptr(new LayerWithForcedDrawsContent());
-  scoped_refptr<LayerWithForcedDrawsContent> front_facing_surface =
-      make_scoped_refptr(new LayerWithForcedDrawsContent());
-  scoped_refptr<LayerWithForcedDrawsContent> back_facing_surface =
-      make_scoped_refptr(new LayerWithForcedDrawsContent());
-  scoped_refptr<LayerWithForcedDrawsContent>
-      front_facing_child_of_front_facing_surface =
-          make_scoped_refptr(new LayerWithForcedDrawsContent());
-  scoped_refptr<LayerWithForcedDrawsContent>
-      back_facing_child_of_front_facing_surface =
-          make_scoped_refptr(new LayerWithForcedDrawsContent());
-  scoped_refptr<LayerWithForcedDrawsContent>
-      front_facing_child_of_back_facing_surface =
-          make_scoped_refptr(new LayerWithForcedDrawsContent());
-  scoped_refptr<LayerWithForcedDrawsContent>
-      back_facing_child_of_back_facing_surface =
-          make_scoped_refptr(new LayerWithForcedDrawsContent());
-
-  parent->AddChild(front_facing_child);
-  parent->AddChild(back_facing_child);
-  parent->AddChild(front_facing_surface);
-  parent->AddChild(back_facing_surface);
-  front_facing_surface->AddChild(front_facing_child_of_front_facing_surface);
-  front_facing_surface->AddChild(back_facing_child_of_front_facing_surface);
-  back_facing_surface->AddChild(front_facing_child_of_back_facing_surface);
-  back_facing_surface->AddChild(back_facing_child_of_back_facing_surface);
-
-  host()->SetRootLayer(parent);
+  LayerImpl* parent = root_layer();
+  LayerImpl* front_facing_child = AddChildToRoot<LayerImpl>();
+  LayerImpl* back_facing_child = AddChildToRoot<LayerImpl>();
+  LayerImpl* front_facing_surface = AddChildToRoot<LayerImpl>();
+  LayerImpl* back_facing_surface = AddChildToRoot<LayerImpl>();
+  LayerImpl* front_facing_child_of_front_facing_surface =
+      AddChild<LayerImpl>(front_facing_surface);
+  LayerImpl* back_facing_child_of_front_facing_surface =
+      AddChild<LayerImpl>(front_facing_surface);
+  LayerImpl* front_facing_child_of_back_facing_surface =
+      AddChild<LayerImpl>(back_facing_surface);
+  LayerImpl* back_facing_child_of_back_facing_surface =
+      AddChild<LayerImpl>(back_facing_surface);
 
   // Nothing is double-sided
-  front_facing_child->SetDoubleSided(false);
-  back_facing_child->SetDoubleSided(false);
-  front_facing_surface->SetDoubleSided(false);
-  back_facing_surface->SetDoubleSided(false);
-  front_facing_child_of_front_facing_surface->SetDoubleSided(false);
-  back_facing_child_of_front_facing_surface->SetDoubleSided(false);
-  front_facing_child_of_back_facing_surface->SetDoubleSided(false);
-  back_facing_child_of_back_facing_surface->SetDoubleSided(false);
+  front_facing_child->test_properties()->double_sided = false;
+  back_facing_child->test_properties()->double_sided = false;
+  front_facing_surface->test_properties()->double_sided = false;
+  back_facing_surface->test_properties()->double_sided = false;
+  front_facing_child_of_front_facing_surface->test_properties()->double_sided =
+      false;
+  back_facing_child_of_front_facing_surface->test_properties()->double_sided =
+      false;
+  front_facing_child_of_back_facing_surface->test_properties()->double_sided =
+      false;
+  back_facing_child_of_back_facing_surface->test_properties()->double_sided =
+      false;
+
+  // Everything draws content.
+  front_facing_child->SetDrawsContent(true);
+  back_facing_child->SetDrawsContent(true);
+  front_facing_surface->SetDrawsContent(true);
+  back_facing_surface->SetDrawsContent(true);
+  front_facing_child_of_front_facing_surface->SetDrawsContent(true);
+  back_facing_child_of_front_facing_surface->SetDrawsContent(true);
+  front_facing_child_of_back_facing_surface->SetDrawsContent(true);
+  back_facing_child_of_back_facing_surface->SetDrawsContent(true);
 
   gfx::Transform backface_matrix;
   backface_matrix.Translate(50.0, 50.0);
@@ -4226,71 +4221,34 @@
   // Nothing preserves 3d. According to current W3C CSS gfx::Transforms spec,
   // these layers should blindly use their own local transforms to determine
   // back-face culling.
-  SetLayerPropertiesForTesting(parent.get(),
-                               identity_matrix,
-                               gfx::Point3F(),
-                               gfx::PointF(),
-                               gfx::Size(100, 100),
-                               true,
-                               false);
-  SetLayerPropertiesForTesting(front_facing_child.get(),
-                               identity_matrix,
-                               gfx::Point3F(),
-                               gfx::PointF(),
-                               gfx::Size(100, 100),
-                               true,
-                               false);
-  SetLayerPropertiesForTesting(back_facing_child.get(),
-                               backface_matrix,
-                               gfx::Point3F(),
-                               gfx::PointF(),
-                               gfx::Size(100, 100),
-                               true,
-                               false);
-  SetLayerPropertiesForTesting(front_facing_surface.get(),
-                               identity_matrix,
-                               gfx::Point3F(),
-                               gfx::PointF(),
-                               gfx::Size(100, 100),
-                               true,
-                               false);
-  SetLayerPropertiesForTesting(back_facing_surface.get(),
-                               backface_matrix,
-                               gfx::Point3F(),
-                               gfx::PointF(),
-                               gfx::Size(100, 100),
-                               true,
-                               false);
-  SetLayerPropertiesForTesting(front_facing_child_of_front_facing_surface.get(),
-                               identity_matrix,
-                               gfx::Point3F(),
-                               gfx::PointF(),
-                               gfx::Size(100, 100),
-                               true,
-                               false);
-  SetLayerPropertiesForTesting(back_facing_child_of_front_facing_surface.get(),
-                               backface_matrix,
-                               gfx::Point3F(),
-                               gfx::PointF(),
-                               gfx::Size(100, 100),
-                               true,
-                               false);
-  SetLayerPropertiesForTesting(front_facing_child_of_back_facing_surface.get(),
-                               identity_matrix,
-                               gfx::Point3F(),
-                               gfx::PointF(),
-                               gfx::Size(100, 100),
-                               true,
-                               false);
-  SetLayerPropertiesForTesting(back_facing_child_of_back_facing_surface.get(),
-                               backface_matrix,
-                               gfx::Point3F(),
-                               gfx::PointF(),
-                               gfx::Size(100, 100),
-                               true,
-                               false);
+  SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
+                               gfx::PointF(), gfx::Size(100, 100), true, false);
+  SetLayerPropertiesForTesting(front_facing_child, identity_matrix,
+                               gfx::Point3F(), gfx::PointF(),
+                               gfx::Size(100, 100), true, false);
+  SetLayerPropertiesForTesting(back_facing_child, backface_matrix,
+                               gfx::Point3F(), gfx::PointF(),
+                               gfx::Size(100, 100), true, false);
+  SetLayerPropertiesForTesting(front_facing_surface, identity_matrix,
+                               gfx::Point3F(), gfx::PointF(),
+                               gfx::Size(100, 100), true, false);
+  SetLayerPropertiesForTesting(back_facing_surface, backface_matrix,
+                               gfx::Point3F(), gfx::PointF(),
+                               gfx::Size(100, 100), true, false);
+  SetLayerPropertiesForTesting(front_facing_child_of_front_facing_surface,
+                               identity_matrix, gfx::Point3F(), gfx::PointF(),
+                               gfx::Size(100, 100), true, false);
+  SetLayerPropertiesForTesting(back_facing_child_of_front_facing_surface,
+                               backface_matrix, gfx::Point3F(), gfx::PointF(),
+                               gfx::Size(100, 100), true, false);
+  SetLayerPropertiesForTesting(front_facing_child_of_back_facing_surface,
+                               identity_matrix, gfx::Point3F(), gfx::PointF(),
+                               gfx::Size(100, 100), true, false);
+  SetLayerPropertiesForTesting(back_facing_child_of_back_facing_surface,
+                               backface_matrix, gfx::Point3F(), gfx::PointF(),
+                               gfx::Size(100, 100), true, false);
 
-  ExecuteCalculateDrawPropertiesWithPropertyTrees(parent.get());
+  ExecuteCalculateDrawPropertiesWithPropertyTrees(parent);
 
   // Verify which render surfaces were created.
   EXPECT_FALSE(front_facing_child->has_render_surface());
@@ -4303,13 +4261,13 @@
   EXPECT_FALSE(front_facing_child_of_back_facing_surface->has_render_surface());
   EXPECT_FALSE(back_facing_child_of_back_facing_surface->has_render_surface());
 
-  EXPECT_EQ(4u, update_layer_list().size());
-  EXPECT_TRUE(UpdateLayerListContains(front_facing_child->id()));
-  EXPECT_TRUE(UpdateLayerListContains(front_facing_surface->id()));
-  EXPECT_TRUE(UpdateLayerListContains(
+  EXPECT_EQ(4u, update_layer_list_impl()->size());
+  EXPECT_TRUE(UpdateLayerListImplContains(front_facing_child->id()));
+  EXPECT_TRUE(UpdateLayerListImplContains(front_facing_surface->id()));
+  EXPECT_TRUE(UpdateLayerListImplContains(
       front_facing_child_of_front_facing_surface->id()));
-  EXPECT_TRUE(
-      UpdateLayerListContains(front_facing_child_of_back_facing_surface->id()));
+  EXPECT_TRUE(UpdateLayerListImplContains(
+      front_facing_child_of_back_facing_surface->id()));
 }
 
 TEST_F(LayerTreeHostCommonTest, BackFaceCullingWithPreserves3d) {
@@ -4430,98 +4388,59 @@
   // Verify that layers are appropriately culled when their back face is showing
   // and they are not double sided, while animations are going on.
   //
-  // Layers that are animating do not get culled on the main thread, as their
-  // transforms should be treated as "unknown" so we can not be sure that their
-  // back face is really showing.
+  // Even layers that are animating get culled if their back face is showing and
+  // they are not double sided.
   const gfx::Transform identity_matrix;
-  scoped_refptr<Layer> parent = Layer::Create();
-  scoped_refptr<LayerWithForcedDrawsContent> child =
-      make_scoped_refptr(new LayerWithForcedDrawsContent());
-  scoped_refptr<LayerWithForcedDrawsContent> animating_surface =
-      make_scoped_refptr(new LayerWithForcedDrawsContent());
-  scoped_refptr<LayerWithForcedDrawsContent> child_of_animating_surface =
-      make_scoped_refptr(new LayerWithForcedDrawsContent());
-  scoped_refptr<LayerWithForcedDrawsContent> animating_child =
-      make_scoped_refptr(new LayerWithForcedDrawsContent());
-  scoped_refptr<LayerWithForcedDrawsContent> child2 =
-      make_scoped_refptr(new LayerWithForcedDrawsContent());
-
-  parent->AddChild(child);
-  parent->AddChild(animating_surface);
-  animating_surface->AddChild(child_of_animating_surface);
-  parent->AddChild(animating_child);
-  parent->AddChild(child2);
-
-  host()->SetRootLayer(parent);
+  LayerImpl* parent = root_layer();
+  LayerImpl* child = AddChildToRoot<LayerImpl>();
+  LayerImpl* animating_surface = AddChildToRoot<LayerImpl>();
+  LayerImpl* child_of_animating_surface =
+      AddChild<LayerImpl>(animating_surface);
+  LayerImpl* animating_child = AddChildToRoot<LayerImpl>();
+  LayerImpl* child2 = AddChildToRoot<LayerImpl>();
 
   // Nothing is double-sided
-  child->SetDoubleSided(false);
-  child2->SetDoubleSided(false);
-  animating_surface->SetDoubleSided(false);
-  child_of_animating_surface->SetDoubleSided(false);
-  animating_child->SetDoubleSided(false);
+  child->test_properties()->double_sided = false;
+  child2->test_properties()->double_sided = false;
+  animating_surface->test_properties()->double_sided = false;
+  child_of_animating_surface->test_properties()->double_sided = false;
+  animating_child->test_properties()->double_sided = false;
+
+  // Everything draws content.
+  child->SetDrawsContent(true);
+  child2->SetDrawsContent(true);
+  animating_surface->SetDrawsContent(true);
+  child_of_animating_surface->SetDrawsContent(true);
+  animating_child->SetDrawsContent(true);
 
   gfx::Transform backface_matrix;
   backface_matrix.Translate(50.0, 50.0);
   backface_matrix.RotateAboutYAxis(180.0);
   backface_matrix.Translate(-50.0, -50.0);
 
-  // Make our render surface.
-  animating_surface->SetForceRenderSurfaceForTesting(true);
-
   // Animate the transform on the render surface.
-  AddAnimatedTransformToLayerWithPlayer(animating_surface->id(), timeline(),
-                                        10.0, 30, 0);
+  AddAnimatedTransformToLayerWithPlayer(animating_surface->id(),
+                                        timeline_impl(), 10.0, 30, 0);
   // This is just an animating layer, not a surface.
-  AddAnimatedTransformToLayerWithPlayer(animating_child->id(), timeline(), 10.0,
-                                        30, 0);
+  AddAnimatedTransformToLayerWithPlayer(animating_child->id(), timeline_impl(),
+                                        10.0, 30, 0);
 
-  SetLayerPropertiesForTesting(parent.get(),
-                               identity_matrix,
-                               gfx::Point3F(),
-                               gfx::PointF(),
-                               gfx::Size(100, 100),
-                               true,
-                               false);
-  SetLayerPropertiesForTesting(child.get(),
-                               backface_matrix,
-                               gfx::Point3F(),
-                               gfx::PointF(),
-                               gfx::Size(100, 100),
-                               true,
-                               false);
-  SetLayerPropertiesForTesting(animating_surface.get(),
-                               backface_matrix,
-                               gfx::Point3F(),
-                               gfx::PointF(),
-                               gfx::Size(100, 100),
-                               true,
-                               false);
-  SetLayerPropertiesForTesting(child_of_animating_surface.get(),
-                               backface_matrix,
-                               gfx::Point3F(),
-                               gfx::PointF(),
-                               gfx::Size(100, 100),
-                               true,
-                               false);
-  SetLayerPropertiesForTesting(animating_child.get(),
-                               backface_matrix,
-                               gfx::Point3F(),
-                               gfx::PointF(),
-                               gfx::Size(100, 100),
-                               true,
-                               false);
-  SetLayerPropertiesForTesting(child2.get(),
-                               identity_matrix,
-                               gfx::Point3F(),
-                               gfx::PointF(),
-                               gfx::Size(100, 100),
-                               true,
-                               false);
+  SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
+                               gfx::PointF(), gfx::Size(100, 100), true, false);
+  SetLayerPropertiesForTesting(child, backface_matrix, gfx::Point3F(),
+                               gfx::PointF(), gfx::Size(100, 100), true, false);
+  SetLayerPropertiesForTesting(animating_surface, backface_matrix,
+                               gfx::Point3F(), gfx::PointF(),
+                               gfx::Size(100, 100), true, false, true);
+  SetLayerPropertiesForTesting(child_of_animating_surface, backface_matrix,
+                               gfx::Point3F(), gfx::PointF(),
+                               gfx::Size(100, 100), true, false);
+  SetLayerPropertiesForTesting(animating_child, backface_matrix, gfx::Point3F(),
+                               gfx::PointF(), gfx::Size(100, 100), true, false);
+  SetLayerPropertiesForTesting(child2, identity_matrix, gfx::Point3F(),
+                               gfx::PointF(), gfx::Size(100, 100), true, false);
 
-  LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
-      parent.get(), parent->bounds());
-  LayerTreeHostCommon::CalculateDrawPropertiesForTesting(&inputs);
+  ExecuteCalculateDrawPropertiesWithPropertyTrees(parent);
 
   EXPECT_FALSE(child->has_render_surface());
   EXPECT_TRUE(animating_surface->has_render_surface());
@@ -4529,29 +4448,17 @@
   EXPECT_FALSE(animating_child->has_render_surface());
   EXPECT_FALSE(child2->has_render_surface());
 
-  ExecuteCalculateDrawPropertiesWithPropertyTrees(parent.get());
+  EXPECT_EQ(1u, update_layer_list_impl()->size());
 
-  EXPECT_EQ(4u, update_layer_list().size());
+  // The back facing layers are culled from the layer list, and have an empty
+  // visible rect.
+  EXPECT_TRUE(UpdateLayerListImplContains(child2->id()));
+  EXPECT_TRUE(child->visible_layer_rect().IsEmpty());
+  EXPECT_TRUE(animating_surface->visible_layer_rect().IsEmpty());
+  EXPECT_TRUE(child_of_animating_surface->visible_layer_rect().IsEmpty());
+  EXPECT_TRUE(animating_child->visible_layer_rect().IsEmpty());
 
-  // The non-animating child be culled from the layer list for the parent render
-  // surface.
-  EXPECT_TRUE(UpdateLayerListContains(animating_surface->id()));
-  EXPECT_TRUE(UpdateLayerListContains(animating_child->id()));
-  EXPECT_TRUE(UpdateLayerListContains(child2->id()));
-  EXPECT_TRUE(UpdateLayerListContains(child_of_animating_surface->id()));
-
-  EXPECT_FALSE(child2->visible_layer_rect_for_testing().IsEmpty());
-
-  // The animating layers should have a visible content rect that represents the
-  // area of the front face that is within the viewport.
-  EXPECT_EQ(animating_child->visible_layer_rect_for_testing(),
-            gfx::Rect(animating_child->bounds()));
-  EXPECT_EQ(animating_surface->visible_layer_rect_for_testing(),
-            gfx::Rect(animating_surface->bounds()));
-  // And layers in the subtree of the animating layer should have valid visible
-  // content rects also.
-  EXPECT_EQ(child_of_animating_surface->visible_layer_rect_for_testing(),
-            gfx::Rect(child_of_animating_surface->bounds()));
+  EXPECT_EQ(gfx::Rect(100, 100), child2->visible_layer_rect());
 }
 
 TEST_F(LayerTreeHostCommonTest,
@@ -4560,72 +4467,47 @@
   // created when it flattens its subtree, and its parent has preserves-3d.
 
   const gfx::Transform identity_matrix;
-  scoped_refptr<Layer> parent = Layer::Create();
-  scoped_refptr<LayerWithForcedDrawsContent> front_facing_surface =
-      make_scoped_refptr(new LayerWithForcedDrawsContent());
-  scoped_refptr<LayerWithForcedDrawsContent> back_facing_surface =
-      make_scoped_refptr(new LayerWithForcedDrawsContent());
-  scoped_refptr<LayerWithForcedDrawsContent> child1 =
-      make_scoped_refptr(new LayerWithForcedDrawsContent());
-  scoped_refptr<LayerWithForcedDrawsContent> child2 =
-      make_scoped_refptr(new LayerWithForcedDrawsContent());
-
-  parent->AddChild(front_facing_surface);
-  parent->AddChild(back_facing_surface);
-  front_facing_surface->AddChild(child1);
-  back_facing_surface->AddChild(child2);
-
-  host()->SetRootLayer(parent);
+  LayerImpl* parent = root_layer();
+  LayerImpl* front_facing_surface = AddChildToRoot<LayerImpl>();
+  LayerImpl* back_facing_surface = AddChildToRoot<LayerImpl>();
+  LayerImpl* child1 = AddChild<LayerImpl>(front_facing_surface);
+  LayerImpl* child2 = AddChild<LayerImpl>(back_facing_surface);
 
   // RenderSurfaces are not double-sided
-  front_facing_surface->SetDoubleSided(false);
-  back_facing_surface->SetDoubleSided(false);
+  front_facing_surface->test_properties()->double_sided = false;
+  back_facing_surface->test_properties()->double_sided = false;
+
+  // Everything draws content.
+  front_facing_surface->SetDrawsContent(true);
+  back_facing_surface->SetDrawsContent(true);
+  child1->SetDrawsContent(true);
+  child2->SetDrawsContent(true);
 
   gfx::Transform backface_matrix;
   backface_matrix.Translate(50.0, 50.0);
   backface_matrix.RotateAboutYAxis(180.0);
   backface_matrix.Translate(-50.0, -50.0);
 
-  SetLayerPropertiesForTesting(parent.get(),
-                               identity_matrix,
-                               gfx::Point3F(),
-                               gfx::PointF(),
-                               gfx::Size(100, 100),
-                               false,
+  SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(),
+                               gfx::PointF(), gfx::Size(100, 100), false,
                                true);  // parent transform style is preserve3d.
-  SetLayerPropertiesForTesting(front_facing_surface.get(),
-                               identity_matrix,
-                               gfx::Point3F(),
-                               gfx::PointF(),
-                               gfx::Size(100, 100),
-                               true,
+  SetLayerPropertiesForTesting(front_facing_surface, identity_matrix,
+                               gfx::Point3F(), gfx::PointF(),
+                               gfx::Size(100, 100), true,
                                true);  // surface transform style is flat.
-  SetLayerPropertiesForTesting(back_facing_surface.get(),
-                               backface_matrix,
-                               gfx::Point3F(),
-                               gfx::PointF(),
-                               gfx::Size(100, 100),
-                               true,
+  SetLayerPropertiesForTesting(back_facing_surface, backface_matrix,
+                               gfx::Point3F(), gfx::PointF(),
+                               gfx::Size(100, 100), true,
                                true);  // surface transform style is flat.
-  SetLayerPropertiesForTesting(child1.get(),
-                               identity_matrix,
-                               gfx::Point3F(),
-                               gfx::PointF(),
-                               gfx::Size(100, 100),
-                               true,
-                               false);
-  SetLayerPropertiesForTesting(child2.get(),
-                               identity_matrix,
-                               gfx::Point3F(),
-                               gfx::PointF(),
-                               gfx::Size(100, 100),
-                               true,
-                               false);
+  SetLayerPropertiesForTesting(child1, identity_matrix, gfx::Point3F(),
+                               gfx::PointF(), gfx::Size(100, 100), true, false);
+  SetLayerPropertiesForTesting(child2, identity_matrix, gfx::Point3F(),
+                               gfx::PointF(), gfx::Size(100, 100), true, false);
 
   front_facing_surface->Set3dSortingContextId(1);
   back_facing_surface->Set3dSortingContextId(1);
 
-  ExecuteCalculateDrawPropertiesWithPropertyTrees(parent.get());
+  ExecuteCalculateDrawPropertiesWithPropertyTrees(parent);
 
   // Verify which render surfaces were created and used.
   EXPECT_TRUE(front_facing_surface->has_render_surface());
@@ -4635,9 +4517,9 @@
   EXPECT_FALSE(child1->has_render_surface());
   EXPECT_FALSE(child2->has_render_surface());
 
-  EXPECT_EQ(2u, update_layer_list().size());
-  EXPECT_TRUE(UpdateLayerListContains(front_facing_surface->id()));
-  EXPECT_TRUE(UpdateLayerListContains(child1->id()));
+  EXPECT_EQ(2u, update_layer_list_impl()->size());
+  EXPECT_TRUE(UpdateLayerListImplContains(front_facing_surface->id()));
+  EXPECT_TRUE(UpdateLayerListImplContains(child1->id()));
 }
 
 TEST_F(LayerTreeHostCommonScalingTest, LayerTransformsInHighDPI) {
@@ -5091,41 +4973,22 @@
 }
 
 TEST_F(LayerTreeHostCommonTest, TransparentChildRenderSurfaceCreation) {
-  scoped_refptr<Layer> root = Layer::Create();
-  scoped_refptr<Layer> child = Layer::Create();
-  scoped_refptr<LayerWithForcedDrawsContent> grand_child =
-      make_scoped_refptr(new LayerWithForcedDrawsContent());
+  LayerImpl* root = root_layer();
+  LayerImpl* child = AddChild<LayerImpl>(root);
+  LayerImpl* grand_child = AddChild<LayerImpl>(child);
+  grand_child->SetDrawsContent(true);
 
   const gfx::Transform identity_matrix;
-  SetLayerPropertiesForTesting(root.get(),
-                               identity_matrix,
-                               gfx::Point3F(),
-                               gfx::PointF(),
-                               gfx::Size(100, 100),
-                               true,
-                               false);
-  SetLayerPropertiesForTesting(child.get(),
-                               identity_matrix,
-                               gfx::Point3F(),
-                               gfx::PointF(),
-                               gfx::Size(10, 10),
-                               true,
-                               false);
-  SetLayerPropertiesForTesting(grand_child.get(),
-                               identity_matrix,
-                               gfx::Point3F(),
-                               gfx::PointF(),
-                               gfx::Size(10, 10),
-                               true,
-                               false);
+  SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(),
+                               gfx::PointF(), gfx::Size(100, 100), true, false);
+  SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(),
+                               gfx::PointF(), gfx::Size(10, 10), true, false);
+  SetLayerPropertiesForTesting(grand_child, identity_matrix, gfx::Point3F(),
+                               gfx::PointF(), gfx::Size(10, 10), true, false);
 
-  root->AddChild(child);
-  child->AddChild(grand_child);
   child->SetOpacity(0.5f);
 
-  host()->SetRootLayer(root);
-
-  ExecuteCalculateDrawProperties(root.get());
+  ExecuteCalculateDrawProperties(root);
 
   EXPECT_FALSE(child->has_render_surface());
 }
@@ -8228,24 +8091,21 @@
 // Verify that having an animated filter (but no current filter, as these
 // are mutually exclusive) correctly creates a render surface.
 TEST_F(LayerTreeHostCommonTest, AnimatedFilterCreatesRenderSurface) {
-  scoped_refptr<Layer> root = Layer::Create();
-  scoped_refptr<Layer> child = Layer::Create();
-  scoped_refptr<Layer> grandchild = Layer::Create();
-  root->AddChild(child);
-  child->AddChild(grandchild);
+  LayerImpl* root = root_layer();
+  LayerImpl* child = AddChild<LayerImpl>(root);
+  LayerImpl* grandchild = AddChild<LayerImpl>(child);
 
   gfx::Transform identity_transform;
-  SetLayerPropertiesForTesting(root.get(), identity_transform, gfx::Point3F(),
+  SetLayerPropertiesForTesting(root, identity_transform, gfx::Point3F(),
                                gfx::PointF(), gfx::Size(50, 50), true, false);
-  SetLayerPropertiesForTesting(child.get(), identity_transform, gfx::Point3F(),
+  SetLayerPropertiesForTesting(child, identity_transform, gfx::Point3F(),
                                gfx::PointF(), gfx::Size(50, 50), true, false);
-  SetLayerPropertiesForTesting(grandchild.get(), identity_transform,
-                               gfx::Point3F(), gfx::PointF(), gfx::Size(50, 50),
-                               true, false);
-  host()->SetRootLayer(root);
+  SetLayerPropertiesForTesting(grandchild, identity_transform, gfx::Point3F(),
+                               gfx::PointF(), gfx::Size(50, 50), true, false);
 
-  AddAnimatedFilterToLayerWithPlayer(child->id(), timeline(), 10.0, 0.1f, 0.2f);
-  ExecuteCalculateDrawProperties(root.get());
+  AddAnimatedFilterToLayerWithPlayer(child->id(), timeline_impl(), 10.0, 0.1f,
+                                     0.2f);
+  ExecuteCalculateDrawProperties(root);
 
   EXPECT_TRUE(root->has_render_surface());
   EXPECT_TRUE(child->has_render_surface());
@@ -8263,21 +8123,17 @@
 // Verify that having a filter animation with a delayed start time creates a
 // render surface.
 TEST_F(LayerTreeHostCommonTest, DelayedFilterAnimationCreatesRenderSurface) {
-  scoped_refptr<Layer> root = Layer::Create();
-  scoped_refptr<Layer> child = Layer::Create();
-  scoped_refptr<Layer> grandchild = Layer::Create();
-  root->AddChild(child);
-  child->AddChild(grandchild);
+  LayerImpl* root = root_layer();
+  LayerImpl* child = AddChild<LayerImpl>(root);
+  LayerImpl* grandchild = AddChild<LayerImpl>(child);
 
   gfx::Transform identity_transform;
-  SetLayerPropertiesForTesting(root.get(), identity_transform, gfx::Point3F(),
+  SetLayerPropertiesForTesting(root, identity_transform, gfx::Point3F(),
                                gfx::PointF(), gfx::Size(50, 50), true, false);
-  SetLayerPropertiesForTesting(child.get(), identity_transform, gfx::Point3F(),
+  SetLayerPropertiesForTesting(child, identity_transform, gfx::Point3F(),
                                gfx::PointF(), gfx::Size(50, 50), true, false);
-  SetLayerPropertiesForTesting(grandchild.get(), identity_transform,
-                               gfx::Point3F(), gfx::PointF(), gfx::Size(50, 50),
-                               true, false);
-  host()->SetRootLayer(root);
+  SetLayerPropertiesForTesting(grandchild, identity_transform, gfx::Point3F(),
+                               gfx::PointF(), gfx::Size(50, 50), true, false);
 
   std::unique_ptr<KeyframedFilterAnimationCurve> curve(
       KeyframedFilterAnimationCurve::Create());
@@ -8294,8 +8150,9 @@
   animation->set_fill_mode(Animation::FILL_MODE_NONE);
   animation->set_time_offset(base::TimeDelta::FromMilliseconds(-1000));
 
-  AddAnimationToLayerWithPlayer(child->id(), timeline(), std::move(animation));
-  ExecuteCalculateDrawProperties(root.get());
+  AddAnimationToLayerWithPlayer(child->id(), timeline_impl(),
+                                std::move(animation));
+  ExecuteCalculateDrawProperties(root);
 
   EXPECT_TRUE(root->has_render_surface());
   EXPECT_TRUE(child->has_render_surface());
diff --git a/cc/trees/layer_tree_host_unittest_animation.cc b/cc/trees/layer_tree_host_unittest_animation.cc
index 22a3d55..16efbec 100644
--- a/cc/trees/layer_tree_host_unittest_animation.cc
+++ b/cc/trees/layer_tree_host_unittest_animation.cc
@@ -862,41 +862,14 @@
   }
 
   void BeginCommitOnThread(LayerTreeHostImpl* host_impl) override {
-    host_impl->BlockNotifyReadyToActivateForTesting(true);
+    host_impl->BlockNotifyReadyToActivateForTesting(
+        ShouldBlockActivation(host_impl));
   }
 
   void WillBeginImplFrameOnThread(LayerTreeHostImpl* host_impl,
                                   const BeginFrameArgs& args) override {
-    if (!host_impl->pending_tree())
-      return;
-
-    if (!host_impl->active_tree()->root_layer()) {
-      host_impl->BlockNotifyReadyToActivateForTesting(false);
-      return;
-    }
-
-    scoped_refptr<AnimationTimeline> timeline_impl =
-        host_impl->animation_host()->GetTimelineById(timeline_id_);
-    scoped_refptr<AnimationPlayer> player_impl =
-        timeline_impl->GetPlayerById(player_child_id_);
-
-    LayerImpl* scroll_layer_impl =
-        host_impl->active_tree()->LayerById(scroll_layer_->id());
-    Animation* animation = player_impl->element_animations()
-                               ->GetAnimation(TargetProperty::SCROLL_OFFSET);
-
-    if (!animation || animation->run_state() != Animation::RUNNING) {
-      host_impl->BlockNotifyReadyToActivateForTesting(false);
-      return;
-    }
-
-    // Block activation until the running animation has a chance to produce a
-    // scroll delta.
-    gfx::Vector2dF scroll_delta = ScrollDelta(scroll_layer_impl);
-    if (scroll_delta.x() < 1.f || scroll_delta.y() < 1.f)
-      return;
-
-    host_impl->BlockNotifyReadyToActivateForTesting(false);
+    host_impl->BlockNotifyReadyToActivateForTesting(
+        ShouldBlockActivation(host_impl));
   }
 
   void WillActivateTreeOnThread(LayerTreeHostImpl* host_impl) override {
@@ -921,6 +894,35 @@
   }
 
  private:
+  bool ShouldBlockActivation(LayerTreeHostImpl* host_impl) {
+    if (!host_impl->pending_tree())
+      return false;
+
+    if (!host_impl->active_tree()->root_layer())
+      return false;
+
+    scoped_refptr<AnimationTimeline> timeline_impl =
+        host_impl->animation_host()->GetTimelineById(timeline_id_);
+    scoped_refptr<AnimationPlayer> player_impl =
+        timeline_impl->GetPlayerById(player_child_id_);
+
+    LayerImpl* scroll_layer_impl =
+        host_impl->active_tree()->LayerById(scroll_layer_->id());
+    Animation* animation = player_impl->element_animations()->GetAnimation(
+        TargetProperty::SCROLL_OFFSET);
+
+    if (!animation || animation->run_state() != Animation::RUNNING)
+      return false;
+
+    // Block activation until the running animation has a chance to produce a
+    // scroll delta.
+    gfx::Vector2dF scroll_delta = ScrollDelta(scroll_layer_impl);
+    if (scroll_delta.x() > 0.f || scroll_delta.y() > 0.f)
+      return false;
+
+    return true;
+  }
+
   FakeContentLayerClient client_;
   scoped_refptr<FakePictureLayer> scroll_layer_;
   const gfx::ScrollOffset final_postion_;
diff --git a/cc/trees/proxy_impl.cc b/cc/trees/proxy_impl.cc
index 123e394..92b4506 100644
--- a/cc/trees/proxy_impl.cc
+++ b/cc/trees/proxy_impl.cc
@@ -184,7 +184,6 @@
                CommitEarlyOutReasonToString(reason));
   DCHECK(IsImplThread());
   DCHECK(scheduler_->CommitPending());
-  DCHECK(!layer_tree_host_impl_->pending_tree());
 
   if (CommitEarlyOutHandledCommit(reason)) {
     SetInputThrottledUntilCommitOnImpl(false);
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index cb1fbba..81196a02 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -411,6 +411,7 @@
 # GYP: //chrome/android/chrome_apk.gyp:chrome_public_apk_template_resources
 jinja_template_resources("chrome_public_apk_template_resources") {
   resources = [
+    "java/res_template/xml/chromebackupscheme.xml",
     "java/res_template/xml/searchable.xml",
     "java/res_template/xml/syncadapter.xml",
   ]
@@ -421,6 +422,7 @@
 # GYP: //chrome/android/chrome_apk.gyp:chrome_sync_shell_apk_template_resources
 jinja_template_resources("chrome_sync_shell_apk_template_resources") {
   resources = [
+    "java/res_template/xml/chromebackupscheme.xml",
     "java/res_template/xml/searchable.xml",
     "java/res_template/xml/syncadapter.xml",
   ]
diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml
index 75ab3df..858b3f3d 100644
--- a/chrome/android/java/AndroidManifest.xml
+++ b/chrome/android/java/AndroidManifest.xml
@@ -101,7 +101,9 @@
         android:icon="@mipmap/app_icon"
         android:label="@string/app_name"
         android:largeHeap="false"
-        android:allowBackup="false"
+        android:allowBackup="true"
+        android:backupAgent="org.chromium.chrome.browser.ChromeBackupAgent"
+        android:fullBackupContent="@xml/chromebackupscheme"
         android:supportsRtl="true"
         {% block extra_application_attributes %}{% endblock %}>
 
diff --git a/chrome/android/java/res/layout/payment_request.xml b/chrome/android/java/res/layout/payment_request.xml
index b0639f9..a1e0c24 100644
--- a/chrome/android/java/res/layout/payment_request.xml
+++ b/chrome/android/java/res/layout/payment_request.xml
@@ -3,25 +3,22 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <!-- Dimming scrim. -->
-    <View
-        android:id="@+id/scrim"
-        android:background="@color/payments_ui_scrim"
-        android:layout_height="match_parent"
-        android:layout_width="match_parent" />
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:chrome="http://schemas.android.com/apk/res-auto"
+    android:background="@color/payments_ui_scrim" >
 
     <!-- Payments fields dialog.
          TODO(dfalcantara): Figure out if it makes sense to recombine this and the PaymentResult
                             dialog box once redlines stabilize. -->
-    <LinearLayout
+    <org.chromium.chrome.browser.widget.BoundedLinearLayout
         android:id="@+id/dialogContainer"
         android:orientation="vertical"
         android:background="@android:color/white"
         android:layout_height="wrap_content"
         android:layout_width="match_parent"
-        android:layout_gravity="bottom|center_horizontal" >
+        android:layout_gravity="bottom|center_horizontal"
+        chrome:maxWidth="@dimen/payments_ui_max_dialog_width" >
 
         <!-- Box header. -->
         <FrameLayout
@@ -127,5 +124,5 @@
             android:padding="@dimen/payments_section_large_spacing"
             android:background="@android:color/white"
             android:visibility="gone" />
-    </LinearLayout>
+    </org.chromium.chrome.browser.widget.BoundedLinearLayout>
 </FrameLayout>
\ No newline at end of file
diff --git a/chrome/android/java/res/values-sw600dp/dimens.xml b/chrome/android/java/res/values-sw600dp/dimens.xml
index d82327fe1..be70249 100644
--- a/chrome/android/java/res/values-sw600dp/dimens.xml
+++ b/chrome/android/java/res/values-sw600dp/dimens.xml
@@ -51,4 +51,7 @@
     <!-- Web app dimensions -->
     <dimen name="webapp_splash_offset">48dp</dimen>
     <dimen name="webapp_splash_large_title_margin_bottom">8dp</dimen>
+
+    <!-- Payments UI -->
+    <dimen name="payments_ui_max_dialog_width">600dp</dimen>
 </resources>
diff --git a/chrome/android/java/res/values/colors.xml b/chrome/android/java/res/values/colors.xml
index 9f07473..be6c5f4 100644
--- a/chrome/android/java/res/values/colors.xml
+++ b/chrome/android/java/res/values/colors.xml
@@ -181,7 +181,7 @@
     <color name="bottom_bar_shadow_color">#1d000000</color>
 
     <!-- Payments UI colors -->
-    <color name="payments_ui_scrim">#7f000000</color>
+    <color name="payments_ui_scrim">#000000</color>
     <color name="payments_section_edit_background">#f5f5f5</color>
     <color name="payments_section_chevron">#b2b2b2</color>
     <color name="payments_section_separator">#e0e0e0</color>
diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res/values/dimens.xml
index 9c148e9..f67f7ba89 100644
--- a/chrome/android/java/res/values/dimens.xml
+++ b/chrome/android/java/res/values/dimens.xml
@@ -325,7 +325,7 @@
     <dimen name="payments_section_separator_height">1dp</dimen>
     <dimen name="payments_section_logo_height">36dp</dimen>
     <dimen name="payments_section_logo_width">56dp</dimen>
-    <dimen name="payments_ui_max_dialog_width">600dp</dimen>
+    <dimen name="payments_ui_max_dialog_width">0dp</dimen>
     <dimen name="payments_ui_translation">100dp</dimen>
 
     <!-- Dialog dimensions.
diff --git a/chrome/android/java/res_template/xml/chromebackupscheme.xml b/chrome/android/java/res_template/xml/chromebackupscheme.xml
new file mode 100644
index 0000000..effae19
--- /dev/null
+++ b/chrome/android/java/res_template/xml/chromebackupscheme.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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. -->
+
+<full-backup-content>
+    <include domain="sharedpref" path="{{manifest_package}}_preferences.xml"/>
+</full-backup-content>
\ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
index da127fe..b1b0eb3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -88,6 +88,7 @@
 import org.chromium.chrome.browser.metrics.LaunchMetrics;
 import org.chromium.chrome.browser.metrics.StartupMetrics;
 import org.chromium.chrome.browser.metrics.UmaSessionStats;
+import org.chromium.chrome.browser.metrics.UmaUtils;
 import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
 import org.chromium.chrome.browser.nfc.BeamController;
 import org.chromium.chrome.browser.nfc.BeamProvider;
@@ -1651,6 +1652,11 @@
 
     protected final void postDeferredStartupIfNeeded() {
         if (!mDeferredStartupNotified) {
+            RecordHistogram.recordLongTimesHistogram(
+                    "UMA.Debug.EnableCrashUpload.PostDeferredStartUptime",
+                    SystemClock.uptimeMillis() - UmaUtils.getMainEntryPointTime(),
+                    TimeUnit.MILLISECONDS);
+
             // We want to perform deferred startup tasks a short time after the first page
             // load completes, but only when the main thread Looper has become idle.
             mHandler.postDelayed(new Runnable() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackupAgent.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackupAgent.java
new file mode 100644
index 0000000..a95ec53
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackupAgent.java
@@ -0,0 +1,87 @@
+// 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.
+
+package org.chromium.chrome.browser;
+
+import android.annotation.TargetApi;
+import android.app.backup.BackupAgent;
+import android.app.backup.BackupDataInput;
+import android.app.backup.BackupDataOutput;
+import android.content.SharedPreferences;
+import android.os.Build;
+import android.os.ParcelFileDescriptor;
+import android.preference.PreferenceManager;
+
+import org.chromium.base.Log;
+import org.chromium.chrome.browser.firstrun.FirstRunSignInProcessor;
+import org.chromium.chrome.browser.firstrun.FirstRunStatus;
+import org.chromium.chrome.browser.preferences.privacy.PrivacyPreferences;
+import org.chromium.sync.signin.ChromeSigninController;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Backup agent for Chrome, filters the restored backup to remove preferences that should not have
+ * been restored.
+ */
+@TargetApi(Build.VERSION_CODES.LOLLIPOP)
+public class ChromeBackupAgent extends BackupAgent {
+
+    private static final String TAG = "ChromeBackupAgent";
+
+    // Lists of preferences that should be restored unchanged.
+
+    // TODO(aberent): At present this only restores the signed in user, and the FRE settings
+    // (whether is has been completed, and whether the user disabled crash dump reporting). It
+    // should restore all non-device specific aspects of the user's state. This will involve both
+    // restoring many more Android preferences and many Chrome preferences (in Chrome's JSON
+    // preference file).
+    private static final String[] RESTORED_ANDROID_PREFS = {
+            PrivacyPreferences.PREF_CRASH_DUMP_UPLOAD,
+            FirstRunStatus.FIRST_RUN_FLOW_COMPLETE,
+            FirstRunSignInProcessor.FIRST_RUN_FLOW_SIGNIN_SETUP,
+    };
+
+    @Override
+    public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
+            ParcelFileDescriptor newState) throws IOException {
+        // No implementation needed for Android 6.0 Auto Backup. Used only on older versions of
+        // Android Backup
+    }
+
+    @Override
+    public void onRestore(BackupDataInput data, int appVersionCode, ParcelFileDescriptor newState)
+            throws IOException {
+        // No implementation needed for Android 6.0 Auto Backup. Used only on older versions of
+        // Android Backup
+    }
+
+    @Override
+    public void onRestoreFinished() {
+        SharedPreferences sharedPrefs =
+                PreferenceManager.getDefaultSharedPreferences(ChromeBackupAgent.this);
+        Set<String> prefNames = sharedPrefs.getAll().keySet();
+        // Save the user name for later restoration.
+        String userName = sharedPrefs.getString(ChromeSigninController.SIGNED_IN_ACCOUNT_KEY, null);
+        SharedPreferences.Editor editor = sharedPrefs.edit();
+        // Throw away prefs we don't want to restore.
+        Set<String> restoredPrefs = new HashSet<>(Arrays.asList(RESTORED_ANDROID_PREFS));
+        for (String pref : prefNames) {
+            Log.d(TAG, "Checking pref " + pref);
+            if (!restoredPrefs.contains(pref)) editor.remove(pref);
+        }
+        // Because FirstRunSignInProcessor.FIRST_RUN_FLOW_SIGNIN_COMPLETE is not restored Chrome
+        // will sign in the user on first run to the account in FIRST_RUN_FLOW_SIGNIN_ACCOUNT_NAME
+        // if any. If the rest of FRE has been completed this will happen silently.
+        if (userName != null) {
+            editor.putString(FirstRunSignInProcessor.FIRST_RUN_FLOW_SIGNIN_ACCOUNT_NAME, userName);
+        }
+        boolean commitResult = editor.commit();
+
+        Log.d(TAG, "onRestoreFinished complete; commit result = " + commitResult);
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/DeferredStartupHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/DeferredStartupHandler.java
index 70ea42e4..3eab85d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/DeferredStartupHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/DeferredStartupHandler.java
@@ -63,6 +63,10 @@
         if (mDeferredStartupComplete) return;
         ThreadUtils.assertOnUiThread();
 
+        RecordHistogram.recordLongTimesHistogram("UMA.Debug.EnableCrashUpload.DeferredStartUptime",
+                SystemClock.uptimeMillis() - UmaUtils.getMainEntryPointTime(),
+                TimeUnit.MILLISECONDS);
+
         // Punt all tasks that may block the UI thread off onto a background thread.
         new AsyncTask<Void, Void, Void>() {
             @Override
@@ -70,8 +74,8 @@
                 try {
                     TraceEvent.begin("ChromeBrowserInitializer.onDeferredStartup.doInBackground");
                     if (!crashDumpUploadingCommandLineDisabled) {
-                        RecordHistogram.recordMediumTimesHistogram(
-                                "UMA.Debug.EnableCrashUpload.Uptime",
+                        RecordHistogram.recordLongTimesHistogram(
+                                "UMA.Debug.EnableCrashUpload.Uptime2",
                                 SystemClock.uptimeMillis() - UmaUtils.getMainEntryPointTime(),
                                 TimeUnit.MILLISECONDS);
                         PrivacyPreferencesManager.getInstance(application)
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanel.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanel.java
index 4ebb19b..8b53b6c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanel.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanel.java
@@ -14,13 +14,18 @@
 import org.chromium.base.ApplicationStatus.ActivityStateListener;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.compositor.LayerTitleCache;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager.PanelPriority;
 import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost;
+import org.chromium.chrome.browser.compositor.layouts.components.VirtualView;
 import org.chromium.chrome.browser.compositor.layouts.eventfilter.EdgeSwipeEventFilter.ScrollDirection;
 import org.chromium.chrome.browser.compositor.layouts.eventfilter.EdgeSwipeHandler;
 import org.chromium.chrome.browser.compositor.layouts.eventfilter.EventFilter;
+import org.chromium.chrome.browser.compositor.layouts.eventfilter.EventFilterHost;
 import org.chromium.chrome.browser.compositor.layouts.eventfilter.GestureHandler;
-import org.chromium.chrome.browser.compositor.scene_layer.SceneLayer;
+import org.chromium.chrome.browser.compositor.layouts.eventfilter.OverlayPanelEventFilter;
+import org.chromium.chrome.browser.compositor.overlays.SceneOverlay;
+import org.chromium.chrome.browser.compositor.scene_layer.SceneOverlayLayer;
 import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.content.browser.ContentVideoViewEmbedder;
@@ -30,21 +35,19 @@
 import org.chromium.ui.base.LocalizationUtils;
 import org.chromium.ui.resources.ResourceManager;
 
+import java.util.List;
+
 /**
  * Controls the Overlay Panel.
  */
 public class OverlayPanel extends OverlayPanelAnimation implements ActivityStateListener,
-        EdgeSwipeHandler, GestureHandler, OverlayPanelContentFactory {
+        EdgeSwipeHandler, GestureHandler, OverlayPanelContentFactory, SceneOverlay {
 
-    /**
-     * The extra dp added around the close button touch target.
-     */
+    /** The extra dp added around the close button touch target. */
     private static final int CLOSE_BUTTON_TOUCH_SLOP_DP = 5;
 
-    /**
-     * State of the Overlay Panel.
-     */
-    public enum PanelState {
+    /** State of the Overlay Panel. */
+    public static enum PanelState {
         // TODO(pedrosimonetti): consider removing the UNDEFINED state
         UNDEFINED,
         CLOSED,
@@ -109,12 +112,15 @@
     /** Container for content the panel will show. */
     private OverlayPanelContent mContent;
 
-    /** The {@link OverlayPanelHost} used to communicate with the supported layout. */
-    private OverlayPanelHost mOverlayPanelHost;
-
     /** OverlayPanel manager handle for notifications of opening and closing. */
     protected OverlayPanelManager mPanelManager;
 
+    /** If the base page text controls have been cleared. */
+    private boolean mDidClearTextControls;
+
+    /** If the panel should be ignoring swipe events (for compatibility mode). */
+    private boolean mIgnoreSwipeEvents;
+
     // ============================================================================================
     // Constructor
     // ============================================================================================
@@ -122,15 +128,17 @@
     /**
      * @param context The current Android {@link Context}.
      * @param updateHost The {@link LayoutUpdateHost} used to request updates in the Layout.
+     * @param eventHost The {@link EventFilterHost} used to propagate events.
      * @param panelManager The {@link OverlayPanelManager} responsible for showing panels.
      */
-    public OverlayPanel(Context context, LayoutUpdateHost updateHost,
+    public OverlayPanel(Context context, LayoutUpdateHost updateHost, EventFilterHost eventHost,
                 OverlayPanelManager panelManager) {
         super(context, updateHost);
         mContentFactory = this;
 
         mPanelManager = panelManager;
         mPanelManager.registerPanel(this);
+        mEventFilter = new OverlayPanelEventFilter(mContext, eventHost, this);
     }
 
     /**
@@ -151,6 +159,7 @@
 
     @Override
     protected void onClosed(StateChangeReason reason) {
+        setBasePageTextControlsVisibility(true);
         destroyComponents();
         mPanelManager.notifyPanelClosed(this, reason);
     }
@@ -178,13 +187,6 @@
         if (!isShowing()) return;
 
         super.closePanel(reason, animate);
-
-        // If the close action is animated, the Layout will be hidden when
-        // the animation is finished, so we should only hide the Layout
-        // here when not animating.
-        if (!animate && mOverlayPanelHost != null) {
-            mOverlayPanelHost.hideLayout(true);
-        }
     }
 
     /**
@@ -285,6 +287,25 @@
         return -mActivity.getFullscreenManager().getControlOffset() * mPxToDp;
     }
 
+    /**
+     * Set the visibility of the base page text selection controls.
+     * TODO(mdjones): This should be replaced be focusing the panel's ContentViewCore.
+     * @param visible If the text controls are visible.
+     */
+    protected void setBasePageTextControlsVisibility(boolean visible) {
+        if (mActivity == null) return;
+
+        ContentViewCore baseContentView = mActivity.getActivityTab().getContentViewCore();
+        if (baseContentView == null) return;
+
+        // If the panel does not have focus or isn't open, return.
+        if (isPanelOpened() && mDidClearTextControls && visible) return;
+        if (!isPanelOpened() && !mDidClearTextControls && !visible) return;
+
+        mDidClearTextControls = !visible;
+        baseContentView.updateTextSelectionUI(visible);
+    }
+
     // ============================================================================================
     // ActivityStateListener
     // ============================================================================================
@@ -469,35 +490,20 @@
     }
 
     // ============================================================================================
-    // Animation Handling
+    // OverlayPanelBase methods.
     // ============================================================================================
 
     @Override
     protected void onAnimationFinished() {
         super.onAnimationFinished();
 
-        if (shouldHideOverlayPanelLayout()) {
-            if (mOverlayPanelHost != null) {
-                mOverlayPanelHost.hideLayout(false);
-            }
+        if (getPanelState() == PanelState.PEEKED || getPanelState() == PanelState.CLOSED) {
+            setBasePageTextControlsVisibility(true);
+        } else {
+            setBasePageTextControlsVisibility(false);
         }
     }
 
-    /**
-     * Whether the Overlay Panel Layout should be hidden.
-     *
-     * @return Whether the Overlay Panel Layout should be hidden.
-     */
-    private boolean shouldHideOverlayPanelLayout() {
-        final PanelState state = getPanelState();
-        return (state == PanelState.PEEKED || state == PanelState.CLOSED)
-                && getHeight() == getPanelHeightFromState(state);
-    }
-
-    // ============================================================================================
-    // ContextualSearchPanelBase methods.
-    // ============================================================================================
-
     @Override
     protected int getControlContainerHeightResource() {
         // TODO(mdjones): Investigate passing this in to the constructor instead.
@@ -510,35 +516,10 @@
     // ============================================================================================
 
     /**
-     * Sets the {@link OverlayPanelHost} used to communicate with the supported layout.
-     * @param host The {@link OverlayPanelHost}.
+     * Updates the Panel so it preserves its state when the orientation changes.
      */
-    public void setHost(OverlayPanelHost host) {
-        mOverlayPanelHost = host;
-    }
-
-    /**
-     * @return The scene layer used to draw this panel.
-     */
-    public SceneLayer getSceneLayer() {
-        return null;
-    }
-
-    /**
-     * Update this panel's scene layer. This should be implemented by each panel type.
-     * @param resourceManager Used to access static resources.
-     */
-    public void updateSceneLayer(ResourceManager resourceManager) {
-    }
-
-    /**
-     * Determine if using a second layout for showing the overlay panel is possible. This should
-     * be overridden by each panel and returns true by default.
-     * @return True if the layout is supported.
-     * TODO(mdjones): Rename to supportsOverlayPanelLayout once the corresponding class is renamed.
-     */
-    public boolean supportsContextualSearchLayout() {
-        return true;
+    protected void updatePanelForOrientationChange() {
+        resizePanelToState(getPanelState(), StateChangeReason.UNKNOWN);
     }
 
     // ============================================================================================
@@ -760,21 +741,31 @@
 
     @Override
     public void swipeStarted(ScrollDirection direction, float x, float y) {
+        if (onInterceptBarSwipe()) {
+            mIgnoreSwipeEvents = true;
+            return;
+        }
         handleSwipeStart();
     }
 
     @Override
     public void swipeUpdated(float x, float y, float dx, float dy, float tx, float ty) {
+        if (mIgnoreSwipeEvents) return;
         handleSwipeMove(ty);
     }
 
     @Override
     public void swipeFinished() {
+        if (mIgnoreSwipeEvents) {
+            mIgnoreSwipeEvents = false;
+            return;
+        }
         handleSwipeEnd();
     }
 
     @Override
     public void swipeFlingOccurred(float x, float y, float tx, float ty, float vx, float vy) {
+        if (mIgnoreSwipeEvents) return;
         handleFling(vy);
     }
 
@@ -782,4 +773,108 @@
     public boolean isSwipeEnabled(ScrollDirection direction) {
         return direction == ScrollDirection.UP && isShowing();
     }
+
+    // ============================================================================================
+    // SceneOverlay implementation.
+    // ============================================================================================
+
+    @Override
+    public SceneOverlayLayer getUpdatedSceneOverlayTree(LayerTitleCache layerTitleCache,
+            ResourceManager resourceManager, float yOffset) {
+        return null;
+    }
+
+    @Override
+    public boolean isSceneOverlayTreeShowing() {
+        return isShowing();
+    }
+
+    @Override
+    public EventFilter getEventFilter() {
+        return mEventFilter;
+    }
+
+    @Override
+    public void onSizeChanged(float width, float height, float visibleViewportOffsetY,
+            int orientation) {
+        onSizeChanged(width, height);
+    }
+
+    @Override
+    public void getVirtualViews(List<VirtualView> views) {
+        // TODO(mdjones): Add views for accessibility.
+    }
+
+    @Override
+    public boolean handlesTabCreating() {
+        // If the panel is not opened, do not handle tab creating.
+        if (!isPanelOpened()) return false;
+        // Updates TopControls' State so the Toolbar becomes visible.
+        // TODO(pedrosimonetti): The transition when promoting to a new tab is only smooth
+        // if the SearchContentView's vertical scroll position is zero. Otherwise the
+        // ContentView will appear to jump in the screen. Coordinate with @dtrainor to solve
+        // this problem.
+        updateTopControlsState(TopControlsState.BOTH, false);
+        return true;
+    }
+
+    @Override
+    public boolean shouldHideAndroidTopControls() {
+        return isPanelOpened();
+    }
+
+    @Override
+    public boolean updateOverlay(long time, long dt) {
+        if (isPanelOpened()) setBasePageTextControlsVisibility(false);
+        return super.onUpdateAnimation(time, false);
+    }
+
+    @Override
+    public void onHideLayout() {
+        if (!isShowing()) return;
+        closePanel(StateChangeReason.UNKNOWN, false);
+    }
+
+    @Override
+    public boolean onBackPressed() {
+        if (!isPanelOpened()) return false;
+        closePanel(StateChangeReason.BACK_PRESS, true);
+        return true;
+    }
+
+    @Override
+    public void tabTitleChanged(int tabId, String title) {}
+
+    @Override
+    public void tabStateInitialized() {}
+
+    @Override
+    public void tabModelSwitched(boolean incognito) {}
+
+    @Override
+    public void tabSelected(long time, boolean incognito, int id, int prevId) {}
+
+    @Override
+    public void tabMoved(long time, boolean incognito, int id, int oldIndex, int newIndex) {}
+
+    @Override
+    public void tabClosed(long time, boolean incognito, int id) {}
+
+    @Override
+    public void tabClosureCancelled(long time, boolean incognito, int id) {}
+
+    @Override
+    public void tabCreated(long time, boolean incognito, int id, int prevId, boolean selected) {}
+
+    @Override
+    public void tabPageLoadStarted(int id, boolean incognito) {}
+
+    @Override
+    public void tabPageLoadFinished(int id, boolean incognito) {}
+
+    @Override
+    public void tabLoadStarted(int id, boolean incognito) {}
+
+    @Override
+    public void tabLoadFinished(int id, boolean incognito) {}
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBase.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBase.java
index 2c4cd8d8..553cb261 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBase.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBase.java
@@ -276,7 +276,8 @@
     }
 
     /**
-     * @return Whether the Overlay Panel is opened. That is, whether it is EXPANDED or MAXIMIZED.
+     * @return Whether the Overlay Panel is opened. That is, whether the current height is greater
+     * than the peeking height.
      */
     public boolean isPanelOpened() {
         return mHeight > mBarHeightPeeking;
@@ -491,8 +492,8 @@
     // Base Page states
     // --------------------------------------------------------------------------------------------
 
-    private float mBasePageY;
-    private float mBasePageBrightness;
+    private float mBasePageY = 0.0f;
+    private float mBasePageBrightness = 1.0f;
 
     /**
      * @return The vertical offset of the base page.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelHost.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelHost.java
deleted file mode 100644
index a182af3f..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelHost.java
+++ /dev/null
@@ -1,16 +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.
-
-package org.chromium.chrome.browser.compositor.bottombar;
-
-/**
- * Interface that allows {@link ContextualSearchPanel} to communicate with its host Layout.
- */
-public interface OverlayPanelHost {
-    /**
-     * Hides the Overlay Panel Supported Layout.
-     * @param immediately Whether it should be hidden immediately.
-     */
-    void hideLayout(boolean immediately);
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManager.java
index 6e8f2f48..dec1711 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManager.java
@@ -6,6 +6,7 @@
 
 import android.view.ViewGroup;
 
+import org.chromium.base.VisibleForTesting;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.StateChangeReason;
 import org.chromium.ui.resources.dynamics.DynamicResourceLoader;
 
@@ -47,9 +48,6 @@
     /** When a panel is suppressed, this the reason the pending panel is to be shown. */
     private StateChangeReason mPendingReason;
 
-    /** This handles communication between each panel and it's host layout. */
-    private OverlayPanelHost mOverlayPanelHost;
-
     /** This handles resource loading for each panels. */
     private DynamicResourceLoader mDynamicResourceLoader;
 
@@ -133,6 +131,7 @@
      * Get the panel that has been determined to be active.
      * @return The active OverlayPanel.
      */
+    @VisibleForTesting
     public OverlayPanel getActivePanel() {
         return mActivePanel;
     }
@@ -149,23 +148,11 @@
         mSuppressedPanel = null;
 
         // Clear references to held resources.
-        mOverlayPanelHost = null;
         mDynamicResourceLoader = null;
         mContainerViewGroup = null;
     }
 
     /**
-     * Set the panel host for all OverlayPanels.
-     * @param host The OverlayPanel host.
-     */
-    public void setPanelHost(OverlayPanelHost host) {
-        mOverlayPanelHost = host;
-        for (OverlayPanel p : mPanelSet) {
-            p.setHost(host);
-        }
-    }
-
-    /**
      * Set the resource loader for all OverlayPanels.
      * @param host The OverlayPanel host.
      */
@@ -188,17 +175,6 @@
     }
 
     /**
-     * Send size change event to all panels.
-     * @param width The new width.
-     * @param height The new height.
-     */
-    public void onSizeChanged(float width, float height) {
-        for (OverlayPanel p : mPanelSet) {
-            p.onSizeChanged(width, height);
-        }
-    }
-
-    /**
      * Add a panel to the collection that is managed by this class. If any of the setters for this
      * class were called before a panel was added, that panel will still get those resources.
      * @param panel An OverlayPanel to be managed.
@@ -206,9 +182,6 @@
     public void registerPanel(OverlayPanel panel) {
         // If any of the setters for this manager were called before some panel registration,
         // make sure that panel gets the appropriate resources.
-        if (mOverlayPanelHost != null) {
-            panel.setHost(mOverlayPanelHost);
-        }
         if (mDynamicResourceLoader != null) {
             panel.setDynamicResourceLoader(mDynamicResourceLoader);
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java
index c68d28b..f2d836b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java
@@ -11,7 +11,9 @@
 import org.chromium.base.ActivityState;
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.VisibleForTesting;
+
 import org.chromium.chrome.R;
+import org.chromium.chrome.browser.compositor.LayerTitleCache;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayContentProgressObserver;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelContent;
@@ -19,8 +21,9 @@
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager.PanelPriority;
 import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchPromoControl.ContextualSearchPromoHost;
 import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost;
+import org.chromium.chrome.browser.compositor.layouts.eventfilter.EventFilterHost;
 import org.chromium.chrome.browser.compositor.scene_layer.ContextualSearchSceneLayer;
-import org.chromium.chrome.browser.compositor.scene_layer.SceneLayer;
+import org.chromium.chrome.browser.compositor.scene_layer.SceneOverlayLayer;
 import org.chromium.chrome.browser.contextualsearch.ContextualSearchManagementDelegate;
 import org.chromium.chrome.browser.util.MathUtils;
 import org.chromium.ui.resources.ResourceManager;
@@ -72,12 +75,12 @@
     /**
      * @param context The current Android {@link Context}.
      * @param updateHost The {@link LayoutUpdateHost} used to request updates in the Layout.
+     * @param eventHost The {@link EventFilterHost} for propagating events.
      * @param panelManager The object managing the how different panels are shown.
      */
     public ContextualSearchPanel(Context context, LayoutUpdateHost updateHost,
-                OverlayPanelManager panelManager) {
-        super(context, updateHost, panelManager);
-
+                EventFilterHost eventHost, OverlayPanelManager panelManager) {
+        super(context, updateHost, eventHost, panelManager);
         mSceneLayer = createNewContextualSearchSceneLayer();
         mPanelMetrics = new ContextualSearchPanelMetrics();
 
@@ -124,25 +127,9 @@
     }
 
     // ============================================================================================
-    // Scene layer
+    // Scene Overlay
     // ============================================================================================
 
-    @Override
-    public SceneLayer getSceneLayer() {
-        return mSceneLayer;
-    }
-
-    @Override
-    public void updateSceneLayer(ResourceManager resourceManager) {
-        if (mSceneLayer == null) return;
-
-        mSceneLayer.update(resourceManager, this,
-                getSearchBarControl(),
-                getPeekPromoControl(),
-                getPromoControl(),
-                getIconSpriteControl());
-    }
-
     /**
      * Create a new scene layer for this panel. This should be overridden by tests as necessary.
      */
@@ -150,6 +137,18 @@
         return new ContextualSearchSceneLayer(mContext.getResources().getDisplayMetrics().density);
     }
 
+    @Override
+    public SceneOverlayLayer getUpdatedSceneOverlayTree(LayerTitleCache layerTitleCache,
+            ResourceManager resourceManager, float yOffset) {
+        mSceneLayer.update(resourceManager, this,
+                getSearchBarControl(),
+                getPeekPromoControl(),
+                getPromoControl(),
+                getIconSpriteControl());
+
+        return mSceneLayer;
+    }
+
     // ============================================================================================
     // Contextual Search Manager Integration
     // ============================================================================================
@@ -255,6 +254,8 @@
         setProgressBarVisible(false);
 
         super.onClosed(reason);
+
+        if (mSceneLayer != null) mSceneLayer.hideTree();
     }
 
     // ============================================================================================
@@ -327,11 +328,6 @@
     }
 
     @Override
-    public boolean supportsContextualSearchLayout() {
-        return mManagementDelegate != null && !mManagementDelegate.isRunningInCompatibilityMode();
-    }
-
-    @Override
     public void notifyBarTouched(float x) {
         if (canDisplayContentInPanel()) {
             getOverlayPanelContent().showContent();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/readermode/ReaderModePanel.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/readermode/ReaderModePanel.java
index 937d6cb..9637134 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/readermode/ReaderModePanel.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/readermode/ReaderModePanel.java
@@ -7,6 +7,7 @@
 import android.content.Context;
 
 import org.chromium.chrome.R;
+import org.chromium.chrome.browser.compositor.LayerTitleCache;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayContentDelegate;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayContentProgressObserver;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel;
@@ -16,8 +17,9 @@
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager.PanelPriority;
 import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost;
+import org.chromium.chrome.browser.compositor.layouts.eventfilter.EventFilterHost;
 import org.chromium.chrome.browser.compositor.scene_layer.ReaderModeSceneLayer;
-import org.chromium.chrome.browser.compositor.scene_layer.SceneLayer;
+import org.chromium.chrome.browser.compositor.scene_layer.SceneOverlayLayer;
 import org.chromium.chrome.browser.dom_distiller.DomDistillerTabUtils;
 import org.chromium.chrome.browser.dom_distiller.ReaderModeManagerDelegate;
 import org.chromium.chrome.browser.externalnav.ExternalNavigationHandler;
@@ -57,11 +59,14 @@
     /**
      * @param context The current Android {@link Context}.
      * @param updateHost The {@link LayoutUpdateHost} used to request updates in the Layout.
+     * @param eventHost The {@link EventFilterHost} for propagating events.
+     * @param panelManager The {@link OverlayPanelManager} used to control panel show/hide.
+     * @param contentViewDelegate Notifies the activity that a ContentViewCore has been created.
      */
-    public ReaderModePanel(Context context, LayoutUpdateHost updateHost,
+    public ReaderModePanel(Context context, LayoutUpdateHost updateHost, EventFilterHost eventHost,
                 OverlayPanelManager panelManager,
                 OverlayPanelContentViewDelegate contentViewDelegate) {
-        super(context, updateHost, panelManager);
+        super(context, updateHost, eventHost, panelManager);
         mSceneLayer = createNewReaderModeSceneLayer();
         mContentViewDelegate = contentViewDelegate;
     }
@@ -115,25 +120,9 @@
     }
 
     // ============================================================================================
-    // Scene layer
+    // Scene Overlay
     // ============================================================================================
 
-    @Override
-    public SceneLayer getSceneLayer() {
-        return mSceneLayer;
-    }
-
-    @Override
-    public void updateSceneLayer(ResourceManager resourceManager) {
-        if (mSceneLayer == null) return;
-
-        // This will cause the ContentViewCore to size itself appropriately for the panel (includes
-        // top controls height).
-        updateTopControlsState();
-
-        mSceneLayer.update(resourceManager, this, getBarTextViewId(), mReaderBarTextOpacity);
-    }
-
     /**
      * Create a new scene layer for this panel. This should be overridden by tests as necessary.
      */
@@ -141,6 +130,23 @@
         return new ReaderModeSceneLayer(mContext.getResources().getDisplayMetrics().density);
     }
 
+    @Override
+    public SceneOverlayLayer getUpdatedSceneOverlayTree(LayerTitleCache layerTitleCache,
+            ResourceManager resourceManager, float yOffset) {
+        mSceneLayer.update(resourceManager, this, getBarTextViewId(), mReaderBarTextOpacity);
+
+        return mSceneLayer;
+    }
+
+    @Override
+    public boolean updateOverlay(long time, long dt) {
+        // This will cause the ContentViewCore to size itself appropriately for the panel (includes
+        // top controls height).
+        updateTopControlsState();
+
+        return super.updateOverlay(time, dt);
+    }
+
     // ============================================================================================
     // Manager Integration
     // ============================================================================================
@@ -275,6 +281,7 @@
     @Override
     protected void onClosed(StateChangeReason reason) {
         super.onClosed(reason);
+        if (mSceneLayer != null) mSceneLayer.hideTree();
         if (mManagerDelegate == null) return;
         mManagerDelegate.onClosed(reason);
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ContextualSearchSupportedLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ContextualSearchSupportedLayout.java
deleted file mode 100644
index 8b88813..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ContextualSearchSupportedLayout.java
+++ /dev/null
@@ -1,149 +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.
-
-package org.chromium.chrome.browser.compositor.layouts;
-
-import android.content.Context;
-import android.graphics.Rect;
-import android.view.View;
-import android.view.ViewGroup;
-
-import org.chromium.chrome.browser.compositor.LayerTitleCache;
-import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel;
-import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelHost;
-import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager;
-import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
-import org.chromium.chrome.browser.compositor.layouts.eventfilter.EventFilter;
-import org.chromium.chrome.browser.compositor.scene_layer.SceneLayer;
-import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
-import org.chromium.content.browser.ContentViewCore;
-import org.chromium.ui.resources.ResourceManager;
-
-import java.util.List;
-
-/**
- * A {@link Layout} that can show a Contextual Search overlay that shows at the
- * bottom and can be swiped upwards.
- * TODO(mdjones): Rename this class to OverlayPanelSupportedLayout.
- */
-public abstract class ContextualSearchSupportedLayout extends Layout {
-    /**
-     * The {@link OverlayPanelHost} that allows the {@link OverlayPanel} to
-     * communicate back to the Layout.
-     */
-    protected final OverlayPanelHost mOverlayPanelHost;
-
-    /**
-     * The {@link OverlayPanelManager} used to get the active panel.
-     */
-    protected final OverlayPanelManager mPanelManager;
-
-    /**
-     * @param context The current Android context.
-     * @param updateHost The {@link LayoutUpdateHost} view for this layout.
-     * @param renderHost The {@link LayoutRenderHost} view for this layout.
-     * @param eventFilter The {@link EventFilter} that is needed for this view.
-     * @param panelManager The {@link OverlayPanelManager} responsible for showing panels.
-     */
-    public ContextualSearchSupportedLayout(Context context, LayoutUpdateHost updateHost,
-            LayoutRenderHost renderHost, EventFilter eventFilter,
-            OverlayPanelManager panelManager) {
-        super(context, updateHost, renderHost, eventFilter);
-
-        mOverlayPanelHost = new OverlayPanelHost() {
-            @Override
-            public void hideLayout(boolean immediately) {
-                ContextualSearchSupportedLayout.this.hideContextualSearch(immediately);
-            }
-        };
-
-        mPanelManager = panelManager;
-    }
-
-    @Override
-    public void attachViews(ViewGroup container) {
-        mPanelManager.setContainerView(container);
-    }
-
-    @Override
-    public void getAllViews(List<View> views) {
-        // TODO(dtrainor): If we move ContextualSearch to an overlay, pull the views from there
-        // instead in Layout.java.
-        OverlayPanel panel = mPanelManager.getActivePanel();
-        if (panel != null) {
-            ContentViewCore content = panel.getContentViewCore();
-            if (content != null) views.add(content.getContainerView());
-        }
-        super.getAllViews(views);
-    }
-
-    @Override
-    public void getAllContentViewCores(List<ContentViewCore> contents) {
-        // TODO(dtrainor): If we move ContextualSearch to an overlay, pull the content from there
-        // instead in Layout.java.
-        OverlayPanel panel = mPanelManager.getActivePanel();
-        if (panel != null) {
-            ContentViewCore content = panel.getContentViewCore();
-            if (content != null) contents.add(content);
-        }
-        super.getAllContentViewCores(contents);
-    }
-
-    @Override
-    public void show(long time, boolean animate) {
-        mPanelManager.setPanelHost(mOverlayPanelHost);
-        super.show(time, animate);
-    }
-
-    /**
-     * Hides the Contextual Search Supported Layout.
-     * @param immediately Whether it should be hidden immediately.
-     */
-    protected void hideContextualSearch(boolean immediately) {
-        // NOTE(pedrosimonetti): To be implemented by a supported Layout.
-    }
-
-    @Override
-    protected void notifySizeChanged(float width, float height, int orientation) {
-        super.notifySizeChanged(width, height, orientation);
-        mPanelManager.onSizeChanged(width, height);
-        onSizeChanged(width, height);
-    }
-
-    /**
-     * Handles the resizing of the view.
-     * @param width  The new width in dp.
-     * @param height The new height in dp.
-     */
-    protected void onSizeChanged(float width, float height) {
-        // NOTE(pedrosimonetti): To be implemented by a supported Layout.
-    }
-
-    @Override
-    protected boolean onUpdateAnimation(long time, boolean jumpToEnd) {
-        boolean parentAnimating = super.onUpdateAnimation(time, jumpToEnd);
-        OverlayPanel panel = mPanelManager.getActivePanel();
-        boolean panelAnimating = panel != null && panel.onUpdateAnimation(time, jumpToEnd);
-        return panelAnimating || parentAnimating;
-    }
-
-    @Override
-    protected SceneLayer getSceneLayer() {
-        OverlayPanel panel = mPanelManager.getActivePanel();
-        if (panel == null) return null;
-        return panel.getSceneLayer();
-    }
-
-    @Override
-    protected void updateSceneLayer(Rect viewport, Rect contentViewport,
-            LayerTitleCache layerTitleCache, TabContentManager tabContentManager,
-            ResourceManager resourceManager, ChromeFullscreenManager fullscreenManager) {
-        super.updateSceneLayer(viewport, contentViewport, layerTitleCache, tabContentManager,
-                resourceManager, fullscreenManager);
-        OverlayPanel panel = mPanelManager.getActivePanel();
-        if (panel == null || !panel.isShowing()) return;
-
-        panel.updateSceneLayer(resourceManager);
-    }
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java
index 0266a941..8d67ebe 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java
@@ -1166,6 +1166,9 @@
 
         SceneLayer content = getSceneLayer();
         for (int i = 0; i < mSceneOverlays.size(); i++) {
+            // If the SceneOverlay is not showing, don't bother adding it to the tree.
+            if (!mSceneOverlays.get(i).isSceneOverlayTreeShowing()) continue;
+
             SceneOverlayLayer overlayLayer = mSceneOverlays.get(i).getUpdatedSceneOverlayTree(
                     layerTitleCache, resourceManager, offsetDp);
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java
index 52ee952..2b199d04 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java
@@ -68,12 +68,18 @@
         // Set up state
         mDefaultTitle = context.getString(R.string.tab_loading_default_title);
 
-        addGlobalSceneOverlay(mTabStripLayoutHelperManager);
 
         setNextLayout(null);
     }
 
     @Override
+    protected void addAllSceneOverlays() {
+        // Add the tab strip overlay before any others.
+        addGlobalSceneOverlay(mTabStripLayoutHelperManager);
+        super.addAllSceneOverlays();
+    }
+
+    @Override
     public void destroy() {
         super.destroy();
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerDocument.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerDocument.java
index ee07e563..d6548123 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerDocument.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerDocument.java
@@ -14,7 +14,6 @@
 
 import org.chromium.chrome.browser.ChromeApplication;
 import org.chromium.chrome.browser.UrlConstants;
-import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelContentViewDelegate;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager;
 import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchPanel;
@@ -22,19 +21,13 @@
 import org.chromium.chrome.browser.compositor.layouts.components.LayoutTab;
 import org.chromium.chrome.browser.compositor.layouts.components.VirtualView;
 import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
-import org.chromium.chrome.browser.compositor.layouts.eventfilter.CascadeEventFilter;
-import org.chromium.chrome.browser.compositor.layouts.eventfilter.ContextualSearchEventFilter;
 import org.chromium.chrome.browser.compositor.layouts.eventfilter.EdgeSwipeEventFilter;
 import org.chromium.chrome.browser.compositor.layouts.eventfilter.EdgeSwipeEventFilter.ScrollDirection;
 import org.chromium.chrome.browser.compositor.layouts.eventfilter.EdgeSwipeHandler;
 import org.chromium.chrome.browser.compositor.layouts.eventfilter.EmptyEdgeSwipeHandler;
-import org.chromium.chrome.browser.compositor.layouts.eventfilter.EventFilter;
 import org.chromium.chrome.browser.compositor.layouts.eventfilter.GestureHandler;
-import org.chromium.chrome.browser.compositor.layouts.phone.ContextualSearchLayout;
 import org.chromium.chrome.browser.compositor.overlays.SceneOverlay;
 import org.chromium.chrome.browser.contextualsearch.ContextualSearchManagementDelegate;
-import org.chromium.chrome.browser.contextualsearch.ContextualSearchStaticEventFilter;
-import org.chromium.chrome.browser.contextualsearch.ContextualSearchStaticEventFilter.ContextualSearchTapHandler;
 import org.chromium.chrome.browser.device.DeviceClassManager;
 import org.chromium.chrome.browser.dom_distiller.ReaderModeManagerDelegate;
 import org.chromium.chrome.browser.fullscreen.FullscreenManager;
@@ -57,22 +50,18 @@
  * driving all {@link Layout}s that get shown via the {@link LayoutManager}.
  */
 public class LayoutManagerDocument extends LayoutManager
-        implements ContextualSearchTapHandler, OverlayPanelContentViewDelegate {
+        implements OverlayPanelContentViewDelegate {
     // Layouts
     /** A {@link Layout} used for showing a normal web page. */
     protected final StaticLayout mStaticLayout;
-    /** A {@link Layout} used for when the contextual search panel is up. */
-    protected final ContextualSearchLayout mContextualSearchLayout;
 
     // Event Filters
     private final EdgeSwipeEventFilter mStaticEdgeEventFilter;
-    private final ContextualSearchEventFilter mContextualSearchEventFilter;
     private final EdgeSwipeHandler mToolbarSwipeHandler;
 
     // Event Filter Handlers
     /** A {@link GestureHandler} that will delegate all events to {@link #getActiveLayout()}. */
     protected final GestureHandler mGestureHandler;
-    private final EdgeSwipeHandler mOverlayPanelEdgeSwipeHandler;
 
     // Internal State
     private final SparseArray<LayoutTab> mTabCache = new SparseArray<LayoutTab>();
@@ -93,30 +82,26 @@
         Context context = host.getContext();
         LayoutRenderHost renderHost = host.getLayoutRenderHost();
 
-        mOverlayPanelManager = new OverlayPanelManager();
-        mContextualSearchPanel = new ContextualSearchPanel(context, this, mOverlayPanelManager);
-        mReaderModePanel = new ReaderModePanel(context, this, mOverlayPanelManager, this);
-
         // Build Event Filter Handlers
-        mOverlayPanelEdgeSwipeHandler = new OverlayPanelEdgeSwipeHandler(this);
         mGestureHandler = new GestureHandlerLayoutDelegate(this);
         mToolbarSwipeHandler = new ToolbarSwipeHandler(this);
 
         // Build Event Filters
         mStaticEdgeEventFilter =
                 new EdgeSwipeEventFilter(context, this, new StaticEdgeSwipeHandler());
-        mContextualSearchEventFilter = new ContextualSearchEventFilter(
-                context, this, mGestureHandler, mOverlayPanelManager);
-        EventFilter contextualSearchStaticEventFilter = new ContextualSearchStaticEventFilter(
-                context, this, mOverlayPanelManager, mOverlayPanelEdgeSwipeHandler, this);
-        EventFilter staticCascadeEventFilter = new CascadeEventFilter(context, this,
-                new EventFilter[] {contextualSearchStaticEventFilter, mStaticEdgeEventFilter});
+
+        mOverlayPanelManager = new OverlayPanelManager();
 
         // Build Layouts
         mStaticLayout = new StaticLayout(
-                context, this, renderHost, staticCascadeEventFilter, mOverlayPanelManager);
-        mContextualSearchLayout = new ContextualSearchLayout(
-                context, this, renderHost, mContextualSearchEventFilter, mOverlayPanelManager);
+                context, this, renderHost, mStaticEdgeEventFilter, mOverlayPanelManager);
+
+        // Contextual Search scene overlay.
+        mContextualSearchPanel = new ContextualSearchPanel(context, this, this,
+                mOverlayPanelManager);
+
+        // Reader Mode scene overlay.
+        mReaderModePanel = new ReaderModePanel(context, this, this, mOverlayPanelManager, this);
 
         // Set up layout parameters
         mStaticLayout.setLayoutHandlesTabLifecycles(true);
@@ -130,6 +115,9 @@
             ContextualSearchManagementDelegate contextualSearchDelegate,
             ReaderModeManagerDelegate readerModeDelegate,
             DynamicResourceLoader dynamicResourceLoader) {
+        // Add any SceneOverlays to a layout.
+        addAllSceneOverlays();
+
         // Save state
         mContextualSearchDelegate = contextualSearchDelegate;
 
@@ -138,7 +126,6 @@
 
         // Initialize Layouts
         mStaticLayout.setTabModelSelector(selector, content);
-        mContextualSearchLayout.setTabModelSelector(selector, content);
 
         // Initialize Contextual Search Panel
         mContextualSearchPanel.setManagementDelegate(contextualSearchDelegate);
@@ -155,6 +142,7 @@
 
         // Set the dynamic resource loader for all overlay panels.
         mOverlayPanelManager.setDynamicResourceLoader(dynamicResourceLoader);
+        mOverlayPanelManager.setContainerView(androidContentContainer);
 
         mTabModelSelectorTabObserver = new TabModelSelectorTabObserver(selector) {
             @Override
@@ -182,7 +170,6 @@
         super.destroy();
 
         if (mStaticLayout != null) mStaticLayout.destroy();
-        if (mContextualSearchLayout != null) mContextualSearchLayout.destroy();
         if (mOverlayPanelManager != null) mOverlayPanelManager.destroy();
         if (mTabModelSelectorTabObserver != null) mTabModelSelectorTabObserver.destroy();
     }
@@ -225,7 +212,15 @@
      */
     protected void addGlobalSceneOverlay(SceneOverlay helper) {
         mStaticLayout.addSceneOverlay(helper);
-        mContextualSearchLayout.addSceneOverlay(helper);
+    }
+
+    /**
+     * Add any {@link SceneOverlay}s to the layout. This can be used to add the overlays in a
+     * particular order.
+     */
+    protected void addAllSceneOverlays() {
+        mStaticLayout.addSceneOverlay(mContextualSearchPanel);
+        mStaticLayout.addSceneOverlay(mReaderModePanel);
     }
 
     /**
@@ -304,27 +299,6 @@
     }
 
     @Override
-    public void handleTapContextualSearchBar(long time, float x, float y) {
-        if (getActiveLayout() == mContextualSearchLayout) return;
-
-        OverlayPanel panel = mOverlayPanelManager.getActivePanel();
-        if (panel == null) return;
-
-        // When not in compatibility mode, tapping on the Search Bar will expand the Panel,
-        // therefore we must start showing the ContextualSearchLayout.
-        // TODO(pedrosimonetti): once we implement the close button, a tap in the Panel might
-        // trigger the Panel to close, not expand, so in that case we don't want to show the
-        // ContextualSearchLayout. Coordinate with dtrainor@ to solve this. It might be
-        // necessary for the ContextualSearchPanel to be able to trigger the display of the
-        // ContextualSearchLayout.
-        if (panel.supportsContextualSearchLayout()) {
-            showContextualSearchLayout(true);
-        }
-
-        panel.handleClick(time, x, y);
-    }
-
-    @Override
     public void setOverlayPanelContentViewCore(ContentViewCore contentViewCore) {
         mHost.onContentViewCoreAdded(contentViewCore);
     }
@@ -336,14 +310,6 @@
         if (tab != null) tab.updateFullscreenEnabledState();
     }
 
-    private void showContextualSearchLayout(boolean animate) {
-        ContentViewCore cvc = getCurrentTabContentViewCore();
-        if (cvc != null) {
-            cvc.preserveSelectionOnNextLossOfFocus();
-        }
-        startShowing(mContextualSearchLayout, animate);
-    }
-
     private ContentViewCore getCurrentTabContentViewCore() {
         if (getTabModelSelector() == null) return null;
         Tab tab = getTabModelSelector().getCurrentTab();
@@ -365,31 +331,6 @@
         }
     }
 
-    private class OverlayPanelEdgeSwipeHandler extends EdgeSwipeHandlerLayoutDelegate {
-        public OverlayPanelEdgeSwipeHandler(LayoutProvider provider) {
-            super(provider);
-        }
-
-        @Override
-        public void swipeStarted(ScrollDirection direction, float x, float y) {
-            OverlayPanel panel = mOverlayPanelManager.getActivePanel();
-            if (getActiveLayout() != mContextualSearchLayout && panel != null
-                    && panel.supportsContextualSearchLayout()) {
-                showContextualSearchLayout(false);
-            }
-
-            if (panel != null && !panel.onInterceptBarSwipe()) {
-                super.swipeStarted(direction, x, y);
-            }
-        }
-
-        @Override
-        public boolean isSwipeEnabled(ScrollDirection direction) {
-            OverlayPanel panel = mOverlayPanelManager.getActivePanel();
-            return direction == ScrollDirection.UP && panel != null && panel.isShowing();
-        }
-    }
-
     /**
      * A {@link EdgeSwipeHandler} meant to respond to edge events for the toolbar.
      */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/StaticLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/StaticLayout.java
index 2e23cb9..d2bb422 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/StaticLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/StaticLayout.java
@@ -30,7 +30,7 @@
  * {@link #tabSelecting(long, int)} call, and is used to show a thumbnail of a {@link Tab}
  * until that {@link Tab} is ready to be shown.
  */
-public class StaticLayout extends ContextualSearchSupportedLayout {
+public class StaticLayout extends Layout {
     public static final String TAG = "StaticLayout";
 
     private static final int HIDE_TIMEOUT_MS = 2000;
@@ -66,7 +66,7 @@
      */
     public StaticLayout(Context context, LayoutUpdateHost updateHost, LayoutRenderHost renderHost,
             EventFilter eventFilter, OverlayPanelManager panelManager) {
-        super(context, updateHost, renderHost, eventFilter, panelManager);
+        super(context, updateHost, renderHost, eventFilter);
 
         mHandler = new Handler();
         mUnstallRunnable = new UnstallRunnable();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/eventfilter/ContextualSearchEventFilter.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/eventfilter/ContextualSearchEventFilter.java
deleted file mode 100644
index 18fceee..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/eventfilter/ContextualSearchEventFilter.java
+++ /dev/null
@@ -1,545 +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.
-
-package org.chromium.chrome.browser.compositor.layouts.eventfilter;
-
-import android.content.Context;
-import android.view.GestureDetector;
-import android.view.MotionEvent;
-import android.view.ViewConfiguration;
-
-import org.chromium.base.VisibleForTesting;
-import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel;
-import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager;
-
-import java.util.ArrayList;
-
-/**
- * The {@link GestureEventFilter} used when Contextual Search Layout is being shown. It filters
- * events that happen in the Search Content View area and propagates them to the appropriate
- * Content View Core via {@link EventFilterHost}. Events that happen outside that area are
- * propagated to the {@code ContextualSearchLayout} via {@code LayoutManagerPhone}.
- */
-public class ContextualSearchEventFilter extends GestureEventFilter {
-
-    /**
-     * The targets that can handle MotionEvents.
-     */
-    private enum EventTarget {
-        UNDETERMINED,
-        SEARCH_PANEL,
-        SEARCH_CONTENT_VIEW
-    }
-
-    /**
-     * The direction of the gesture.
-     */
-    private enum GestureOrientation {
-        UNDETERMINED,
-        HORIZONTAL,
-        VERTICAL
-    }
-
-    /**
-     * The boost factor that can be applied to prioritize vertical movements over horizontal ones.
-     */
-    private static final float VERTICAL_DETERMINATION_BOOST = 1.25f;
-
-    /**
-     * Manager to get the active OverlayPanel from.
-     */
-    private OverlayPanelManager mPanelManager;
-
-    /**
-     * The {@link GestureDetector} used to distinguish tap and scroll gestures.
-     */
-    private final GestureDetector mGestureDetector;
-
-    /**
-     * The target to propagate events to.
-     */
-    private EventTarget mEventTarget;
-
-    /**
-     * Whether the code is in the middle of the process of determining the event target.
-     */
-    private boolean mIsDeterminingEventTarget;
-
-    /**
-     * Whether the event target has been determined.
-     */
-    private boolean mHasDeterminedEventTarget;
-
-    /**
-     * The previous target the events were propagated to.
-     */
-    private EventTarget mPreviousEventTarget;
-
-    /**
-     * Whether the event target has changed since the last touch event.
-     */
-    private boolean mHasChangedEventTarget;
-
-    /**
-     * Whether the event target might change. This will be true in cases we know the overscroll
-     * and/or underscroll might happen, which means we'll have to constantly monitor the event
-     * targets in order to determine the exact moment the target has changed.
-     */
-    private boolean mMayChangeEventTarget;
-
-    /**
-     * Whether the gesture orientation has been determined.
-     */
-    private boolean mHasDeterminedGestureOrientation;
-
-    /**
-     * The current gesture orientation.
-     */
-    private GestureOrientation mGestureOrientation;
-
-    /**
-     * Whether the events are being recorded.
-     */
-    private boolean mIsRecordingEvents;
-
-    /**
-     * Whether the ACTION_DOWN that initiated the MotionEvent's stream was synthetic.
-     */
-    private boolean mWasActionDownEventSynthetic;
-
-    /**
-     * The X coordinate of the synthetic ACTION_DOWN MotionEvent.
-     */
-    private float mSyntheticActionDownX;
-
-    /**
-     * The Y coordinate of the synthetic ACTION_DOWN MotionEvent.
-     */
-    private float mSyntheticActionDownY;
-
-    /**
-     * The list of recorded events.
-     */
-    private final ArrayList<MotionEvent> mRecordedEvents = new ArrayList<MotionEvent>();
-
-    /**
-     * The initial Y position of the current gesture.
-     */
-    private float mInitialEventY;
-
-    /**
-     * The square of ViewConfiguration.getScaledTouchSlop() in pixels used to calculate whether
-     * the finger has moved beyond the established threshold.
-     */
-    private final float mTouchSlopSquarePx;
-
-    /**
-     * Creates a {@link GestureEventFilter} with offset touch events.
-     * @param context The {@link Context} for Android.
-     * @param host The {@link EventFilterHost} for this event filter.
-     * @param handler The {@link GestureHandler} for this event filter.
-     * @param panelManager The {@link OverlayPanelManager} responsible for showing panels.
-     */
-    public ContextualSearchEventFilter(Context context, EventFilterHost host,
-            GestureHandler handler, OverlayPanelManager panelManager) {
-        super(context, host, handler, false, false);
-
-        mGestureDetector = new GestureDetector(context, new InternalGestureDetector());
-        mPanelManager = panelManager;
-
-        // Store the square of the platform touch slop in pixels to use in the scroll detection.
-        // See {@link ContextualSearchEventFilter#isDistanceGreaterThanTouchSlop}.
-        float touchSlopPx = ViewConfiguration.get(context).getScaledTouchSlop();
-        mTouchSlopSquarePx = touchSlopPx * touchSlopPx;
-
-        reset();
-    }
-
-    /**
-     * Gets the Search Content View's vertical scroll position. If the Search Content View
-     * is not available it returns -1.
-     * @return The Search Content View scroll position.
-     */
-    @VisibleForTesting
-    protected float getSearchContentViewVerticalScroll() {
-        OverlayPanel panel = mPanelManager.getActivePanel();
-        if (panel == null) return 0;
-
-        return panel.getContentVerticalScroll();
-    }
-
-    @Override
-    public boolean onTouchEventInternal(MotionEvent e) {
-        final int action = e.getActionMasked();
-
-        if (!mIsDeterminingEventTarget && action == MotionEvent.ACTION_DOWN) {
-            mInitialEventY = e.getY();
-            OverlayPanel panel = mPanelManager.getActivePanel();
-            if (panel != null && panel.isCoordinateInsideContent(
-                    e.getX() * mPxToDp, mInitialEventY * mPxToDp)) {
-                // If the DOWN event happened inside the Search Content View, we'll need
-                // to wait until the user has moved the finger beyond a certain threshold,
-                // so we can determine the gesture's orientation and consequently be able
-                // to tell if the Content View will accept the gesture.
-                mIsDeterminingEventTarget = true;
-                mMayChangeEventTarget = true;
-            } else {
-                // If the DOWN event happened outside the Search Content View, then we know
-                // that the Search Panel will start handling the event right away.
-                setEventTarget(EventTarget.SEARCH_PANEL);
-                mMayChangeEventTarget = false;
-            }
-        }
-
-        // Send the event to the GestureDetector so we can distinguish between scroll and tap.
-        mGestureDetector.onTouchEvent(e);
-
-        if (mHasDeterminedEventTarget) {
-            // If the event target has been determined, resume pending events, then propagate
-            // the current event to the appropriate target.
-            resumeAndPropagateEvent(e);
-        } else {
-            // If the event target has not been determined, we need to record a copy of the event
-            // until we are able to determine the event target.
-            MotionEvent event = MotionEvent.obtain(e);
-            mRecordedEvents.add(event);
-            mIsRecordingEvents = true;
-        }
-
-        if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
-            reset();
-        }
-
-        return true;
-    }
-
-    /**
-     * Resets the current and previous {@link EventTarget} as well the {@link GestureOrientation}
-     * to the UNDETERMINED state.
-     */
-    private void reset() {
-        mEventTarget = EventTarget.UNDETERMINED;
-        mIsDeterminingEventTarget = false;
-        mHasDeterminedEventTarget = false;
-
-        mPreviousEventTarget = EventTarget.UNDETERMINED;
-        mHasChangedEventTarget = false;
-        mMayChangeEventTarget = false;
-
-        mWasActionDownEventSynthetic = false;
-
-        mGestureOrientation = GestureOrientation.UNDETERMINED;
-        mHasDeterminedGestureOrientation = false;
-    }
-
-    /**
-     * Resumes pending events then propagates the given event to the current {@link EventTarget}.
-     *
-     * Resuming events might consist in simply propagating previously recorded events if the
-     * EventTarget was UNDETERMINED when the gesture started.
-     *
-     * For the case where the EventTarget has changed during the course of the gesture, we'll
-     * need to simulate a gesture end in the previous target (by simulating an ACTION_CANCEL
-     * event) and a gesture start in the new target (by simulating an ACTION_DOWN event).
-     *
-     * @param e The {@link MotionEvent} to be propagated after resuming the pending events.
-     */
-    private void resumeAndPropagateEvent(MotionEvent e) {
-        OverlayPanel panel = mPanelManager.getActivePanel();
-        if (panel == null) return;
-
-        if (mIsRecordingEvents) {
-            resumeRecordedEvents();
-        }
-
-        if (mHasChangedEventTarget) {
-            // If the event target has changed since the beginning of the gesture, then we need
-            // to send a ACTION_CANCEL to the previous event target to make sure it no longer
-            // expects events.
-            propagateAndRecycleEvent(copyEvent(e, MotionEvent.ACTION_CANCEL), mPreviousEventTarget);
-
-            // Similarly we need to send an ACTION_DOWN to the new event target so subsequent
-            // events can be analyzed properly by the Gesture Detector.
-            MotionEvent syntheticActionDownEvent = copyEvent(e, MotionEvent.ACTION_DOWN);
-
-            // Store the synthetic ACTION_DOWN coordinates to prevent unwanted taps from
-            // happening. See {@link ContextualSearchEventFilter#propagateEventToSearchContentView}.
-            mWasActionDownEventSynthetic = true;
-            mSyntheticActionDownX = syntheticActionDownEvent.getX();
-            mSyntheticActionDownY = syntheticActionDownEvent.getY() - panel.getContentY() / mPxToDp;
-
-            propagateAndRecycleEvent(syntheticActionDownEvent, mEventTarget);
-
-            mHasChangedEventTarget = false;
-        }
-
-        propagateEvent(e, mEventTarget);
-    }
-
-    /**
-     * Resumes recorded events by propagating all of them to the current {@link EventTarget}.
-     */
-    private void resumeRecordedEvents() {
-        for (int i = 0, size = mRecordedEvents.size(); i < size; i++) {
-            propagateAndRecycleEvent(mRecordedEvents.get(i), mEventTarget);
-        }
-
-        mRecordedEvents.clear();
-        mIsRecordingEvents = false;
-    }
-
-    /**
-     * Propagates the given {@link MotionEvent} to the given {@link EventTarget}, recycling it
-     * afterwards. This is intended for synthetic events only, those create by
-     * {@link MotionEvent#obtain} or the helper methods
-     * {@link ContextualSearchEventFilter#lockEventHorizontallty} and
-     * {@link ContextualSearchEventFilter#copyEvent}.
-     *
-     * @param e The {@link MotionEvent} to be propagated.
-     * @param target The {@link EventTarget} to propagate events to.
-     */
-    private void propagateAndRecycleEvent(MotionEvent e, EventTarget target) {
-        propagateEvent(e, target);
-        e.recycle();
-    }
-
-    /**
-     * Propagates the given {@link MotionEvent} to the given {@link EventTarget}.
-     * @param e The {@link MotionEvent} to be propagated.
-     * @param target The {@link EventTarget} to propagate events to.
-     */
-    private void propagateEvent(MotionEvent e, EventTarget target) {
-        if (target == EventTarget.SEARCH_PANEL) {
-            super.onTouchEventInternal(e);
-        } else if (target == EventTarget.SEARCH_CONTENT_VIEW) {
-            propagateEventToSearchContentView(e);
-        }
-    }
-
-    /**
-     * Propagates the given {@link MotionEvent} to the Search Content View.
-     * @param e The {@link MotionEvent} to be propagated.
-     */
-    @VisibleForTesting
-    protected void propagateEventToSearchContentView(MotionEvent e) {
-        OverlayPanel panel = mPanelManager.getActivePanel();
-        if (panel == null) return;
-
-        MotionEvent event = e;
-        int action = event.getActionMasked();
-        boolean isSyntheticEvent = false;
-        if (mGestureOrientation == GestureOrientation.HORIZONTAL && !panel.isMaximized()) {
-            // Ignores multitouch events to prevent the Search Result Page from from scrolling.
-            if (action == MotionEvent.ACTION_POINTER_UP
-                    || action == MotionEvent.ACTION_POINTER_DOWN) {
-                return;
-            }
-
-            // NOTE(pedrosimonetti): Lock horizontal motion, ignoring all vertical changes,
-            // when the Panel is not maximized. This is to prevent the Search Result Page
-            // from scrolling when side swiping on the expanded Panel. Also, note that the
-            // method {@link ContextualSearchEventFilter#lockEventHorizontallty} will always
-            // return an event with a single pointer, which is necessary to prevent
-            // the app from crashing when the motion involves multiple pointers.
-            // See: crbug.com/486901
-            event = MotionEvent.obtain(
-                    e.getDownTime(),
-                    e.getEventTime(),
-                    // NOTE(pedrosimonetti): Use getActionMasked() to make sure we're not
-                    // send any pointer information to the event, given that getAction()
-                    // may have the pointer Id associated to it.
-                    e.getActionMasked(),
-                    e.getX(),
-                    mInitialEventY,
-                    e.getMetaState());
-
-            isSyntheticEvent = true;
-        }
-
-        final float contentViewOffsetXPx = panel.getContentX() / mPxToDp;
-        final float contentViewOffsetYPx = panel.getContentY() / mPxToDp;
-
-        // Adjust the offset to be relative to the Search Contents View.
-        event.offsetLocation(-contentViewOffsetXPx, -contentViewOffsetYPx);
-
-        boolean wasEventCanceled = false;
-        if (mWasActionDownEventSynthetic && action == MotionEvent.ACTION_UP) {
-            float deltaX = event.getX() - mSyntheticActionDownX;
-            float deltaY = event.getY() - mSyntheticActionDownY;
-            // NOTE(pedrosimonetti): If the ACTION_DOWN event was synthetic and the distance
-            // between it and the ACTION_UP event was short, then we should synthesize an
-            // ACTION_CANCEL event to prevent a Tap gesture from being triggered on the Search
-            // Content View. See crbug.com/408654
-            if (!isDistanceGreaterThanTouchSlop(deltaX, deltaY)) {
-                event.setAction(MotionEvent.ACTION_CANCEL);
-                mHost.propagateEvent(event);
-                wasEventCanceled = true;
-            }
-        } else if (action == MotionEvent.ACTION_DOWN) {
-            panel.onTouchSearchContentViewAck();
-        }
-
-        // Propagate the event to the appropriate view
-        if (!wasEventCanceled) mHost.propagateEvent(event);
-
-        // Synthetic events should be recycled.
-        if (isSyntheticEvent) event.recycle();
-    }
-
-    /**
-     * Creates a {@link MotionEvent} inheriting from a given |e| event.
-     * @param e The {@link MotionEvent} to inherit properties from.
-     * @param action The MotionEvent's Action to be used.
-     * @return A new {@link MotionEvent}.
-     */
-    private MotionEvent copyEvent(MotionEvent e, int action) {
-        MotionEvent event = MotionEvent.obtain(e);
-        event.setAction(action);
-        return event;
-    }
-
-    /**
-     * Handles the tap event, determining the event target.
-     * @param e The tap {@link MotionEvent}.
-     * @return Whether the event has been consumed.
-     */
-    private boolean handleSingleTapUp(MotionEvent e) {
-        OverlayPanel panel = mPanelManager.getActivePanel();
-        if (panel != null) {
-            setEventTarget(panel.isCoordinateInsideContent(
-                    e.getX() * mPxToDp, e.getY() * mPxToDp)
-                    ? EventTarget.SEARCH_CONTENT_VIEW : EventTarget.SEARCH_PANEL);
-        }
-        return false;
-    }
-
-    /**
-     * Handles the scroll event, determining the gesture orientation and event target,
-     * when appropriate.
-     * @param e1 The first down {@link MotionEvent} that started the scrolling.
-     * @param e2 The move {@link MotionEvent} that triggered the current scroll.
-     * @param distanceY The distance along the Y axis that has been scrolled since the last call
-     *                  to handleScroll.
-     * @return Whether the event has been consumed.
-     */
-    private boolean handleScroll(MotionEvent e1, MotionEvent e2, float distanceY) {
-        // Only determines the gesture orientation if it hasn't been determined yet,
-        // affectively "locking" the orientation once the gesture has started.
-        if (!mHasDeterminedGestureOrientation && isDistanceGreaterThanTouchSlop(e1, e2)) {
-            determineGestureOrientation(e1, e2);
-        }
-
-        // Only determines the event target after determining the gesture orientation and
-        // if it hasn't been determined yet or if changing the event target during the
-        // middle of the gesture is supported. This will allow a smooth transition from
-        // swiping the Panel and scrolling the Search Content View.
-        final boolean mayChangeEventTarget = mMayChangeEventTarget && e2.getPointerCount() == 1;
-        if (mHasDeterminedGestureOrientation
-                && (!mHasDeterminedEventTarget || mayChangeEventTarget)) {
-            determineEventTarget(distanceY);
-        }
-
-        return false;
-    }
-
-    /**
-     * Determines the gesture orientation.
-     * @param e1 The first down {@link MotionEvent} that started the scrolling.
-     * @param e2 The move {@link MotionEvent} that triggered the current scroll.
-     */
-    private void determineGestureOrientation(MotionEvent e1, MotionEvent e2) {
-        float deltaX = Math.abs(e2.getX() - e1.getX());
-        float deltaY = Math.abs(e2.getY() - e1.getY());
-        mGestureOrientation = deltaY * VERTICAL_DETERMINATION_BOOST > deltaX
-                ? GestureOrientation.VERTICAL : GestureOrientation.HORIZONTAL;
-        mHasDeterminedGestureOrientation = true;
-    }
-
-    /**
-     * Determines the target to propagate events to. This will not only update the
-     * {@code mEventTarget} but also save the previous target and determine whether the
-     * target has changed.
-     * @param distanceY The distance along the Y axis that has been scrolled since the last call
-     *                  to handleScroll.
-     */
-    private void determineEventTarget(float distanceY) {
-        boolean isVertical = mGestureOrientation == GestureOrientation.VERTICAL;
-
-        boolean shouldPropagateEventsToSearchPanel;
-        OverlayPanel panel = mPanelManager.getActivePanel();
-        if (panel != null && panel.isMaximized()) {
-            // Allow overscroll in the Search Content View to move the Search Panel instead
-            // of scrolling the Search Result Page.
-            boolean isMovingDown = distanceY < 0;
-            shouldPropagateEventsToSearchPanel = isVertical
-                    && isMovingDown
-                    && getSearchContentViewVerticalScroll() == 0;
-        } else {
-            // Only allow horizontal movements to be propagated to the Search Content View
-            // when the Panel is expanded (that is, not maximized).
-            shouldPropagateEventsToSearchPanel = isVertical;
-
-            // If the gesture is horizontal, then we know that the event target won't change.
-            if (!isVertical) mMayChangeEventTarget = false;
-        }
-
-        EventTarget target = shouldPropagateEventsToSearchPanel
-                ? EventTarget.SEARCH_PANEL : EventTarget.SEARCH_CONTENT_VIEW;
-
-        if (target != mEventTarget) {
-            mPreviousEventTarget = mEventTarget;
-            setEventTarget(target);
-
-            mHasChangedEventTarget = mEventTarget != mPreviousEventTarget
-                    && mPreviousEventTarget != EventTarget.UNDETERMINED;
-        }
-    }
-
-    /**
-     * Sets the {@link EventTarget}.
-     * @param target The {@link EventTarget} to be set.
-     */
-    private void setEventTarget(EventTarget target) {
-        mEventTarget = target;
-
-        mIsDeterminingEventTarget = false;
-        mHasDeterminedEventTarget = true;
-    }
-
-    /**
-     * @param e1 The first down {@link MotionEvent} that started the scrolling.
-     * @param e2 The move {@link MotionEvent} that triggered the current scroll.
-     * @return Whether the distance is greater than the touch slop threshold.
-     */
-    private boolean isDistanceGreaterThanTouchSlop(MotionEvent e1, MotionEvent e2) {
-        float deltaX = e2.getX() - e1.getX();
-        float deltaY = e2.getY() - e1.getY();
-        // Check if the distance between the events |e1| and |e2| is greater than the touch slop.
-        return isDistanceGreaterThanTouchSlop(deltaX, deltaY);
-    }
-
-    /**
-     * @param deltaX The delta X in pixels.
-     * @param deltaY The delta Y in pixels.
-     * @return Whether the distance is greater than the touch slop threshold.
-     */
-    private boolean isDistanceGreaterThanTouchSlop(float deltaX, float deltaY) {
-        return deltaX * deltaX + deltaY * deltaY > mTouchSlopSquarePx;
-    }
-
-    /**
-     * Internal GestureDetector class that is responsible for determining the event target.
-     */
-    private class InternalGestureDetector extends GestureDetector.SimpleOnGestureListener {
-        @Override
-        public boolean onSingleTapUp(MotionEvent e) {
-            return handleSingleTapUp(e);
-        }
-
-        @Override
-        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
-            return handleScroll(e1, e2, distanceY);
-        }
-    }
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/ContextualSearchLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/ContextualSearchLayout.java
deleted file mode 100644
index e1d7972..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/ContextualSearchLayout.java
+++ /dev/null
@@ -1,294 +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.
-
-package org.chromium.chrome.browser.compositor.layouts.phone;
-
-import android.content.Context;
-import android.graphics.Color;
-import android.graphics.Rect;
-import android.view.View;
-
-import org.chromium.chrome.browser.compositor.LayerTitleCache;
-import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel;
-import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.StateChangeReason;
-import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager;
-import org.chromium.chrome.browser.compositor.layouts.ContextualSearchSupportedLayout;
-import org.chromium.chrome.browser.compositor.layouts.Layout;
-import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost;
-import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost;
-import org.chromium.chrome.browser.compositor.layouts.components.LayoutTab;
-import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
-import org.chromium.chrome.browser.compositor.layouts.eventfilter.EdgeSwipeEventFilter.ScrollDirection;
-import org.chromium.chrome.browser.compositor.layouts.eventfilter.EventFilter;
-import org.chromium.chrome.browser.compositor.scene_layer.SceneLayer;
-import org.chromium.chrome.browser.compositor.scene_layer.TabListSceneLayer;
-import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
-import org.chromium.chrome.browser.tab.Tab;
-import org.chromium.chrome.browser.util.MathUtils;
-import org.chromium.content.browser.ContentViewCore;
-import org.chromium.content_public.common.TopControlsState;
-import org.chromium.ui.resources.ResourceManager;
-
-/**
- * A {@link Layout} that shows a Contextual Search overlay at the bottom.
- */
-public class ContextualSearchLayout extends ContextualSearchSupportedLayout {
-    /**
-     * The initial Y position of the touch event.
-     */
-    private float mInitialPanelTouchY;
-
-    /**
-     * The base Tab.
-     */
-    private LayoutTab mBaseTab;
-
-    private final TabListSceneLayer mTabListSceneLayer;
-
-    /**
-     * @param context The current Android context.
-     * @param updateHost The {@link LayoutUpdateHost} view for this layout.
-     * @param renderHost The {@link LayoutRenderHost} view for this layout.
-     * @param eventFilter The {@link EventFilter} that is needed for this view.
-     * @param panelManager The {@link OverlayPanelManager} for getting the active panel.
-     */
-    public ContextualSearchLayout(Context context, LayoutUpdateHost updateHost,
-            LayoutRenderHost renderHost, EventFilter eventFilter,
-            OverlayPanelManager panelManager) {
-        super(context, updateHost, renderHost, eventFilter, panelManager);
-        mTabListSceneLayer = new TabListSceneLayer() {
-            @Override
-            protected int getTabListBackgroundColor(Context context) {
-                OverlayPanel panel = mPanelManager.getActivePanel();
-                // If the panel is null (which in theory should never happen in this case since
-                // this layout is only present when the Panel is open), we will assume the
-                // background color to be white (assuming most pages have a white background).
-                if (panel == null) {
-                    return Color.WHITE;
-                } else {
-                    return panel.getBasePageBackgroundColor();
-                }
-            }
-        };
-    }
-
-    /**
-     * Handles the resizing of the viewport.
-     * @param width  The new width in dp.
-     * @param height The new height in dp.
-     */
-    @Override
-    protected void onSizeChanged(float width, float height) {
-        if (mBaseTab != null) {
-            OverlayPanel panel = mPanelManager.getActivePanel();
-            if (panel != null) {
-                mBaseTab.setMaxContentWidth(width);
-                mBaseTab.setMaxContentHeight(panel.getTabHeight());
-                mBaseTab.setContentSize(width, panel.getTabHeight());
-            }
-        }
-    }
-
-    @Override
-    public View getViewForInteraction() {
-        OverlayPanel panel = mPanelManager.getActivePanel();
-        if (panel != null) {
-            ContentViewCore content = panel.getContentViewCore();
-            if (content != null) return content.getContainerView();
-        }
-
-        return super.getViewForInteraction();
-    }
-
-    @Override
-    public int getSizingFlags() {
-        return SizingFlags.HELPER_SUPPORTS_FULLSCREEN;
-    }
-
-    public float getTopControlsOffset(float currentOffsetDp) {
-        return MathUtils.clamp(mBaseTab.getY(), -mPanelManager.getActivePanel().getToolbarHeight(),
-                Math.min(currentOffsetDp, 0f));
-    }
-
-    @Override
-    protected void updateLayout(long time, long dt) {
-        super.updateLayout(time, dt);
-        if (mBaseTab == null) return;
-
-        OverlayPanel panel = mPanelManager.getActivePanel();
-        if (panel != null) {
-            mBaseTab.setY(panel.getBasePageY());
-            mBaseTab.setBrightness(panel.getBasePageBrightness());
-        }
-
-        boolean needUpdate = mBaseTab.updateSnap(dt);
-        if (needUpdate) requestUpdate();
-    }
-
-    @Override
-    public boolean handlesTabCreating() {
-        // Prevents the new Tab animation from happening when promoting to a new Tab.
-        startHiding(mBaseTab.getId(), false);
-        // Updates TopControls' State so the Toolbar becomes visible.
-        // TODO(pedrosimonetti): The transition when promoting to a new tab is only smooth
-        // if the SearchContentView's vertical scroll position is zero. Otherwise the
-        // ContentView will appear to jump in the screen. Coordinate with @dtrainor to solve
-        // this problem.
-        mPanelManager.getActivePanel().updateTopControlsState(TopControlsState.BOTH, false);
-        doneHiding();
-        return true;
-    }
-
-    @Override
-    public void show(long time, boolean animate) {
-        // TODO(changwan): use SceneOverlayTree's setContentTree() instead once we refactor
-        // ContextualSearchSupportedLayout into LayoutHelper.
-        mTabListSceneLayer.setContentTree(super.getSceneLayer());
-
-        super.show(time, animate);
-
-        resetLayout();
-        createBaseLayoutTab(mBaseTab);
-    }
-
-    /**
-     * Resets the Layout.
-     */
-    private void resetLayout() {
-        mLayoutTabs = null;
-        mBaseTab = null;
-    }
-
-    /**
-     * Creates the Base Page's LayoutTab to be presented in the screen.
-     *
-     * @param layoutTab The {@link Layout} instance.
-     */
-    private void createBaseLayoutTab(LayoutTab layoutTab) {
-        if (mTabModelSelector == null) return;
-
-        int baseTabId = mTabModelSelector.getCurrentTabId();
-        if (baseTabId == Tab.INVALID_TAB_ID) return;
-
-        mBaseTab = createLayoutTab(
-                baseTabId, mTabModelSelector.isIncognitoSelected(), NO_CLOSE_BUTTON, NO_TITLE);
-
-        assert mBaseTab != null;
-        mBaseTab.setScale(1.f);
-        mBaseTab.setBorderScale(1.f);
-        mBaseTab.setBorderAlpha(0.f);
-
-        mLayoutTabs = new LayoutTab[] {mBaseTab};
-    }
-
-    // ============================================================================================
-    // Panel Host
-    // ============================================================================================
-
-    @Override
-    protected void hideContextualSearch(boolean immediately) {
-        if (isActive()) {
-            startHiding(Tab.INVALID_TAB_ID, false);
-            if (immediately) doneHiding();
-        }
-    }
-
-    // ============================================================================================
-    // cc::Layer Events
-    // ============================================================================================
-
-    @Override
-    public void onDown(long time, float x, float y) {
-        mInitialPanelTouchY = y;
-        mPanelManager.getActivePanel().handleSwipeStart();
-    }
-
-    @Override
-    public void drag(long time, float x, float y, float deltaX, float deltaY) {
-        final float ty = y - mInitialPanelTouchY;
-
-        mPanelManager.getActivePanel().handleSwipeMove(ty);
-    }
-
-    @Override
-    public void onUpOrCancel(long time) {
-        mPanelManager.getActivePanel().handleSwipeEnd();
-    }
-
-    @Override
-    public void fling(long time, float x, float y, float velocityX, float velocityY) {
-        mPanelManager.getActivePanel().handleFling(velocityY);
-    }
-
-    @Override
-    public void click(long time, float x, float y) {
-        mPanelManager.getActivePanel().handleClick(time, x, y);
-    }
-
-    // ============================================================================================
-    // Android View Events
-    // ============================================================================================
-
-    @Override
-    public void swipeStarted(long time, ScrollDirection direction, float x, float y) {
-        mPanelManager.getActivePanel().handleSwipeStart();
-    }
-
-    @Override
-    public void swipeUpdated(long time, float x, float y, float dx, float dy, float tx, float ty) {
-        mPanelManager.getActivePanel().handleSwipeMove(ty);
-    }
-
-    @Override
-    public void swipeFlingOccurred(
-            long time, float x, float y, float tx, float ty, float vx, float vy) {
-        mPanelManager.getActivePanel().handleFling(vy);
-    }
-
-    @Override
-    public void swipeFinished(long time) {
-        mPanelManager.getActivePanel().handleSwipeEnd();
-    }
-
-    @Override
-    public void swipeCancelled(long time) {
-        swipeFinished(time);
-    }
-
-    @Override
-    public boolean onBackPressed() {
-        mPanelManager.getActivePanel().closePanel(StateChangeReason.BACK_PRESS, true);
-        return true;
-    }
-
-    @Override
-    protected SceneLayer getSceneLayer() {
-        return mTabListSceneLayer;
-    }
-
-    @Override
-    protected void updateSceneLayer(Rect viewport, Rect contentViewport,
-            LayerTitleCache layerTitleCache, TabContentManager tabContentManager,
-            ResourceManager resourceManager, ChromeFullscreenManager fullscreenManager) {
-        super.updateSceneLayer(viewport, contentViewport, layerTitleCache, tabContentManager,
-                resourceManager, fullscreenManager);
-        assert mTabListSceneLayer != null;
-        mTabListSceneLayer.pushLayers(getContext(), viewport, contentViewport, this,
-                layerTitleCache, tabContentManager, resourceManager);
-    }
-
-    @Override
-    public boolean forceHideTopControlsAndroidView() {
-        return true;
-    }
-
-    public float getToolbarBrightness() {
-        return mPanelManager.getActivePanel().getBasePageBrightness();
-    }
-
-    @Override
-    public boolean isTabStripEventFilterEnabled() {
-        return false;
-    }
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/SceneOverlay.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/SceneOverlay.java
index be165a9d..49e70b71 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/SceneOverlay.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/SceneOverlay.java
@@ -30,6 +30,13 @@
             ResourceManager resourceManager, float yOffset);
 
     /**
+     * Notify the layout that a SceneOverlay is visible. If not visible, the content tree will not
+     * be modified.
+     * @return True if the SceneOverlay tree is showing.
+     */
+    boolean isSceneOverlayTreeShowing();
+
+    /**
      * @return The {@link EventFilter} that processes events for this {@link SceneOverlay}.
      */
     EventFilter getEventFilter();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java
index 1c3d5fb..7cc8d942a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java
@@ -126,6 +126,13 @@
     }
 
     @Override
+    public boolean isSceneOverlayTreeShowing() {
+        // TODO(mdjones): This matches existing behavior but can be improved to return false if
+        // the top controls offset is equal to the top controls height.
+        return true;
+    }
+
+    @Override
     public EventFilter getEventFilter() {
         return mEventFilter;
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer.java
index df3a581..e7755d5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer.java
@@ -18,12 +18,15 @@
  * A SceneLayer to render layers for ContextualSearchLayout.
  */
 @JNINamespace("chrome::android")
-public class ContextualSearchSceneLayer extends SceneLayer {
+public class ContextualSearchSceneLayer extends SceneOverlayLayer {
 
     // NOTE: If you use SceneLayer's native pointer here, the JNI generator will try to
     // downcast using reinterpret_cast<>. We keep a separate pointer to avoid it.
     private long mNativePtr;
 
+    /** If the scene layer has been initialized. */
+    private boolean mIsInitialized;
+
     private final float mDpToPx;
 
     public ContextualSearchSceneLayer(float dpToPx) {
@@ -44,6 +47,13 @@
             ContextualSearchPeekPromoControl peekPromoControl,
             ContextualSearchPromoControl promoControl,
             ContextualSearchIconSpriteControl spriteControl) {
+        // Don't try to update the layer if not initialized or showing.
+        if (resourceManager == null || !panel.isShowing()) return;
+
+        if (!mIsInitialized) {
+            nativeCreateContextualSearchLayer(mNativePtr, resourceManager);
+            mIsInitialized = true;
+        }
 
         int searchContextViewId = searchBarControl.getSearchContextViewId();
         int searchTermViewId = searchBarControl.getSearchTermViewId();
@@ -110,6 +120,8 @@
                 R.drawable.contextual_search_promo_ripple,
                 searchPeekPromoTextViewId,
                 mDpToPx,
+                panel.getBasePageBrightness(),
+                panel.getBasePageY() * mDpToPx,
                 panel.getContentViewCore(),
                 searchPromoVisible,
                 searchPromoHeightPx,
@@ -141,8 +153,20 @@
                 isProgressBarVisible,
                 progressBarHeight * mDpToPx,
                 progressBarOpacity,
-                progressBarCompletion,
-                resourceManager);
+                progressBarCompletion);
+    }
+
+    @Override
+    public void setContentTree(SceneLayer contentTree) {
+        nativeSetContentTree(mNativePtr, contentTree);
+    }
+
+    /**
+     * Hide the layer tree; for use if the panel is not being shown.
+     */
+    public void hideTree() {
+        if (!mIsInitialized) return;
+        nativeHideTree(mNativePtr);
     }
 
     @Override
@@ -159,10 +183,19 @@
     @Override
     public void destroy() {
         super.destroy();
+        mIsInitialized = false;
         mNativePtr = 0;
     }
 
     private native long nativeInit();
+    private native void nativeCreateContextualSearchLayer(
+            long nativeContextualSearchSceneLayer,
+            ResourceManager resourceManager);
+    private native void nativeSetContentTree(
+            long nativeContextualSearchSceneLayer,
+            SceneLayer contentTree);
+    private native void nativeHideTree(
+            long nativeContextualSearchSceneLayer);
     private native void nativeUpdateContextualSearchLayer(
             long nativeContextualSearchSceneLayer,
             int searchBarBackgroundResourceId,
@@ -180,6 +213,8 @@
             int peekPromoRippleResourceId,
             int peekPromoTextResourceId,
             float dpToPx,
+            float basePageBrightness,
+            float basePageYOffset,
             ContentViewCore contentViewCore,
             boolean searchPromoVisible,
             float searchPromoHeight,
@@ -211,6 +246,5 @@
             boolean isProgressBarVisible,
             float progressBarHeight,
             float progressBarOpacity,
-            int progressBarCompletion,
-            ResourceManager resourceManager);
+            int progressBarCompletion);
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ReaderModeSceneLayer.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ReaderModeSceneLayer.java
index 157c5f0..2b08a78 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ReaderModeSceneLayer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ReaderModeSceneLayer.java
@@ -14,7 +14,7 @@
  * A SceneLayer to render layers for Reader Mode.
  */
 @JNINamespace("chrome::android")
-public class ReaderModeSceneLayer extends SceneLayer {
+public class ReaderModeSceneLayer extends SceneOverlayLayer {
 
     /** Pointer to native ReaderModeSceneLayer. */
     private long mNativePtr;
@@ -41,7 +41,10 @@
      */
     public void update(ResourceManager resourceManager, OverlayPanel panel, int barTextViewId,
             float barTextOpacity) {
-        if (!mIsInitialized && resourceManager != null) {
+        // Don't try to update the layer if not initialized or showing.
+        if (resourceManager == null || !panel.isShowing()) return;
+
+        if (!mIsInitialized) {
             nativeCreateReaderModeLayer(mNativePtr, resourceManager);
             // TODO(mdjones): Rename contextual search resources below to be generic to overlay
             // panels.
@@ -54,10 +57,10 @@
             mIsInitialized = true;
         }
 
-        // Don't try to update the layer if not initialized.
-        if (!mIsInitialized) return;
         nativeUpdate(mNativePtr,
                 mDpToPx,
+                panel.getBasePageBrightness(),
+                panel.getBasePageY() * mDpToPx,
                 panel.getContentViewCore(),
                 panel.getOffsetX() * mDpToPx,
                 panel.getOffsetY() * mDpToPx,
@@ -73,6 +76,19 @@
     }
 
     @Override
+    public void setContentTree(SceneLayer contentTree) {
+        nativeSetContentTree(mNativePtr, contentTree);
+    }
+
+    /**
+     * Hide the layer tree; for use if the panel is not being shown.
+     */
+    public void hideTree() {
+        if (!mIsInitialized) return;
+        nativeHideTree(mNativePtr);
+    }
+
+    @Override
     protected void initializeNative() {
         if (mNativePtr == 0) {
             mNativePtr = nativeInit();
@@ -94,6 +110,11 @@
     private native void nativeCreateReaderModeLayer(
             long nativeReaderModeSceneLayer,
             ResourceManager resourceManager);
+    private native void nativeSetContentTree(
+            long nativeReaderModeSceneLayer,
+            SceneLayer contentTree);
+    private native void nativeHideTree(
+            long nativeReaderModeSceneLayer);
     private native void nativeSetResourceIds(
             long nativeReaderModeSceneLayer,
             int barTextResourceId,
@@ -104,6 +125,8 @@
     private native void nativeUpdate(
             long nativeReaderModeSceneLayer,
             float dpToPx,
+            float basePageBrightness,
+            float basePageYOffset,
             ContentViewCore contentViewCore,
             float panelX,
             float panelY,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java
index 5cb0981..6e4f3b5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java
@@ -27,18 +27,6 @@
     private long mNativePtr;
 
     /**
-     * Sets a content tree inside this scene overlay tree.
-     *
-     * TODO(changwan): use SceneOverlayTree's setContentTree() once we have refactored
-     * ContextualSearchSupportedLayout into LayoutHelper.
-     *
-     * @param contentTree A content tree.
-     */
-    public void setContentTree(SceneLayer contentTree) {
-        nativeSetContentTree(mNativePtr, contentTree);
-    }
-
-    /**
      * Pushes all relevant {@link LayoutTab}s from a {@link Layout} to the CC Layer tree.  This will
      * let them be rendered on the screen.  This should only be called when the Compositor has
      * disabled ScheduleComposite calls as this will change the tree and could subsequently cause
@@ -128,7 +116,6 @@
     }
 
     private native long nativeInit();
-    private native void nativeSetContentTree(long nativeTabListSceneLayer, SceneLayer contentTree);
     private native void nativeBeginBuildingFrame(long nativeTabListSceneLayer);
     private native void nativeFinishBuildingFrame(long nativeTabListSceneLayer);
     private native void nativeUpdateLayer(long nativeTabListSceneLayer, int backgroundColor,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchStaticEventFilter.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchStaticEventFilter.java
deleted file mode 100644
index 5a5d60d..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchStaticEventFilter.java
+++ /dev/null
@@ -1,110 +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.
-
-package org.chromium.chrome.browser.contextualsearch;
-
-import android.content.Context;
-import android.view.MotionEvent;
-
-import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel;
-import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager;
-import org.chromium.chrome.browser.compositor.layouts.eventfilter.EdgeSwipeHandler;
-import org.chromium.chrome.browser.compositor.layouts.eventfilter.EventFilter;
-import org.chromium.chrome.browser.compositor.layouts.eventfilter.EventFilterHost;
-
-/**
- * A {@link EventFilter} used to filter events in the Contextual Search Bar, when displayed
- * in the StaticLayout.
- */
-public class ContextualSearchStaticEventFilter extends EventFilter {
-    /**
-     * The @{link OverlayPanelManager} that controls panel's UI.
-     */
-    private final OverlayPanelManager mPanelManager;
-
-    /**
-     * The @{link SwipeRecognizer} that recognizes directional swipe gestures.
-     */
-    private final SwipeRecognizer mSwipeRecognizer;
-
-    private final ContextualSearchTapHandler mTapHandler;
-
-    /**
-     * Interface to handle taps on the contextual search bar..
-     */
-    public interface ContextualSearchTapHandler {
-        /**
-         * Handle a tap event on the contextual seach bar.
-         * @param time The time of the tap event.
-         * @param x The x position of the tap event.
-         * @param y The y position of the tap event.
-         */
-        void handleTapContextualSearchBar(long time, float x, float y);
-    }
-
-    /**
-     * Constructs a {@link ContextualSearchStaticEventFilter}.
-     *
-     * @param context The current Android {@link Context}.
-     * @param host The @{link EventFilterHost} associated to this filter.
-     * @param panelManager The @{link OverlayPanelManager} responsible for showing different panels.
-     * @param swipeHandler The @{link EdgeSwipeHandler} for Contextual Search events.
-     */
-    public ContextualSearchStaticEventFilter(Context context, EventFilterHost host,
-            OverlayPanelManager panelManager, EdgeSwipeHandler swipeHandler,
-            ContextualSearchTapHandler tapHandler) {
-        super(context, host);
-
-        mPanelManager = panelManager;
-        mSwipeRecognizer = new SwipeRecognizerImpl(context);
-        mSwipeRecognizer.setSwipeHandler(swipeHandler);
-        mTapHandler = tapHandler;
-    }
-
-    @Override
-    protected boolean onInterceptTouchEventInternal(MotionEvent event, boolean isKeyboardShowing) {
-        // TODO(pedrosimonetti): isKeyboardShowing has the wrong value after
-        // rotating the device. We don't really need to check whether the
-        // keyboard is showing here because Contextual Search's Panel will
-        // be closed, if opened, when the keyboard shows up. Even so,
-        // it would be nice fixing this problem in Chrome-Android.
-        OverlayPanel activePanel = mPanelManager.getActivePanel();
-        return activePanel != null && activePanel.isPeeking()
-                && activePanel.isCoordinateInsideBar(event.getX() * mPxToDp,
-                        activePanel.getFullscreenY(event.getY()) * mPxToDp);
-    }
-
-    @Override
-    protected boolean onTouchEventInternal(MotionEvent event) {
-        OverlayPanel activePanel = mPanelManager.getActivePanel();
-        if (activePanel == null) return false;
-
-        if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
-            // To avoid a gray flash of empty content, show the search content
-            // view immediately on tap rather than waiting for panel expansion.
-            // TODO(pedrosimonetti): Once we implement "side-swipe to dismiss"
-            // we'll have to revisit this because we don't want to set the
-            // Content View visibility to true when the side-swipe is detected.
-            activePanel.notifyBarTouched(event.getX() * mPxToDp);
-        }
-
-        mSwipeRecognizer.onTouchEvent(event);
-        return true;
-    }
-
-    private class SwipeRecognizerImpl extends SwipeRecognizer {
-        public SwipeRecognizerImpl(Context context) {
-            super(context);
-        }
-
-        @Override
-        public boolean onSingleTapUp(MotionEvent event) {
-            if (mTapHandler == null) return true;
-            mTapHandler.handleTapContextualSearchBar(event.getEventTime(),
-                    event.getX() * mPxToDp,
-                    mPanelManager.getActivePanel().getFullscreenY(event.getY()) * mPxToDp);
-            return true;
-        }
-    }
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
index 770a73b..14739a7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
@@ -204,7 +204,9 @@
         mIntentDataProvider = new CustomTabIntentDataProvider(getIntent(), this);
         mSession = mIntentDataProvider.getSession();
         supportRequestWindowFeature(Window.FEATURE_ACTION_MODE_OVERLAY);
-        if (CustomTabsConnection.hasWarmUpBeenFinished(getApplication())) {
+        boolean prerendered = !TextUtils.isEmpty(
+                CustomTabsConnection.getInstance(getApplication()).getPrerenderedUrl(mSession));
+        if (CustomTabsConnection.hasWarmUpBeenFinished(getApplication()) && !prerendered) {
             mMainTab = createMainTab();
             loadUrlInTab(mMainTab, new LoadUrlParams(getUrlToLoad()),
                     IntentHandler.getTimestampFromIntent(getIntent()));
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
index c37d0e9..6650be7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
@@ -210,34 +210,35 @@
 
     /**
      * Add a download successful notification.
+     * @param notificationId Notification ID of the download.
      * @param downloadGuid GUID of the download.
+     * @param fileName GUID of the download.
      * @param intent Intent to launch when clicking the notification.
      */
-    public void notifyDownloadSuccessful(String downloadGuid, Intent intent) {
-        DownloadSharedPreferenceEntry entry = getDownloadSharedPreferenceEntry(downloadGuid);
-        if (entry == null) return;
+    public void notifyDownloadSuccessful(int notificationId, String downloadGuid, String fileName,
+            Intent intent) {
         NotificationCompat.Builder builder = buildNotification(
-                android.R.drawable.stat_sys_download_done, entry.fileName,
+                android.R.drawable.stat_sys_download_done, fileName,
                 mContext.getResources().getString(R.string.download_notification_completed));
         if (intent != null) {
             builder.setContentIntent(PendingIntent.getActivity(
                     mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT));
         }
-        updateNotification(entry.notificationId, builder.build());
+        updateNotification(notificationId, builder.build());
         removeSharedPreferenceEntry(downloadGuid);
     }
 
     /**
      * Add a download failed notification.
+     * @param notificationId Notification ID of the download.
      * @param downloadGuid GUID of the download.
+     * @param fileName GUID of the download.
      */
-    public void notifyDownloadFailed(String downloadGuid) {
-        DownloadSharedPreferenceEntry entry = getDownloadSharedPreferenceEntry(downloadGuid);
-        if (entry == null) return;
+    public void notifyDownloadFailed(int notificationId, String downloadGuid, String fileName) {
         NotificationCompat.Builder builder = buildNotification(
-                android.R.drawable.stat_sys_download_done, entry.fileName,
+                android.R.drawable.stat_sys_download_done, fileName,
                 mContext.getResources().getString(R.string.download_notification_failed));
-        updateNotification(entry.notificationId, builder.build());
+        updateNotification(notificationId, builder.build());
         removeSharedPreferenceEntry(downloadGuid);
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier.java b/chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier.java
index 42d94e5..43f1dfa 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier.java
@@ -248,11 +248,14 @@
                         break;
                     case DOWNLOAD_NOTIFICATION_TYPE_SUCCESS:
                         mBoundService.notifyDownloadSuccessful(
-                                info.getDownloadGuid(), notificationInfo.intent);
+                                info.getNotificationId(), info.getDownloadGuid(),
+                                info.getFileName(), notificationInfo.intent);
                         stopServiceIfNeeded();
                         break;
                     case DOWNLOAD_NOTIFICATION_TYPE_FAILURE:
-                        mBoundService.notifyDownloadFailed(info.getDownloadGuid());
+                        mBoundService.notifyDownloadFailed(
+                                info.getNotificationId(), info.getDownloadGuid(),
+                                info.getFileName());
                         stopServiceIfNeeded();
                         break;
                     case DOWNLOAD_NOTIFICATION_TYPE_CANCEL:
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunSignInProcessor.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunSignInProcessor.java
index ab862b4..64c0ac3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunSignInProcessor.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunSignInProcessor.java
@@ -41,9 +41,11 @@
      * SharedPreferences preference names to keep the state of the First Run Experience.
      */
     private static final String FIRST_RUN_FLOW_SIGNIN_COMPLETE = "first_run_signin_complete";
-    private static final String FIRST_RUN_FLOW_SIGNIN_ACCOUNT_NAME =
+
+    // Needed by ChromeBackupAgent
+    public static final String FIRST_RUN_FLOW_SIGNIN_SETUP = "first_run_signin_setup";
+    public static final String FIRST_RUN_FLOW_SIGNIN_ACCOUNT_NAME =
             "first_run_signin_account_name";
-    private static final String FIRST_RUN_FLOW_SIGNIN_SETUP = "first_run_signin_setup";
 
     /**
      * Initiates the automatic sign-in process in background.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunStatus.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunStatus.java
index 08a772a7..542bc95c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunStatus.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunStatus.java
@@ -13,7 +13,8 @@
  */
 public class FirstRunStatus {
 
-    private static final String FIRST_RUN_FLOW_COMPLETE = "first_run_flow";
+    // Needed by ChromeBackupAgent
+    public static final String FIRST_RUN_FLOW_COMPLETE = "first_run_flow";
 
     /**
      * Sets the "main First Run Experience flow complete" preference.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
index 7ecf0ed5..5d8f36b3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
@@ -62,7 +62,6 @@
  */
 public class ChromeBrowserInitializer {
     private static final String TAG = "BrowserInitializer";
-    private static final String PRIVATE_DATA_DIRECTORY_SUFFIX = "chrome";
     private static ChromeBrowserInitializer sChromeBrowserInitiliazer;
 
     private final Handler mHandler;
@@ -75,6 +74,9 @@
 
     private MinidumpDirectoryObserver mMinidumpDirectoryObserver;
 
+    // Public to allow use in ChromeBackupAgent
+    public static final String PRIVATE_DATA_DIRECTORY_SUFFIX = "chrome";
+
     /**
      * A callback to be executed when there is a new version available in Play Store.
      */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java
index 8e481cb..f9ce390f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java
@@ -309,7 +309,7 @@
         mMostVisitedDesign = new MostVisitedDesign(getContext());
         mMostVisitedLayout =
                 (MostVisitedLayout) mNewTabPageLayout.findViewById(R.id.most_visited_layout);
-        mMostVisitedDesign.initMostVisitedLayout(mMostVisitedLayout, searchProviderHasLogo);
+        mMostVisitedDesign.initMostVisitedLayout(searchProviderHasLogo);
 
         mSearchProviderLogoView =
                 (LogoView) mNewTabPageLayout.findViewById(R.id.search_provider_logo);
@@ -1070,13 +1070,13 @@
 
         if (showPlaceholder) {
             if (mMostVisitedPlaceholder == null) {
-                ViewStub mostVisitedPlaceholderStub = (ViewStub) findViewById(
-                        R.id.most_visited_placeholder_stub);
+                ViewStub mostVisitedPlaceholderStub = (ViewStub) mNewTabPageLayout
+                        .findViewById(R.id.most_visited_placeholder_stub);
+
                 mMostVisitedPlaceholder = mostVisitedPlaceholderStub.inflate();
             }
             mMostVisitedLayout.setVisibility(GONE);
             mMostVisitedPlaceholder.setVisibility(VISIBLE);
-            return;
         } else if (mMostVisitedPlaceholder != null) {
             mMostVisitedLayout.setVisibility(VISIBLE);
             mMostVisitedPlaceholder.setVisibility(GONE);
@@ -1118,9 +1118,8 @@
             return searchProviderHasLogo ? NUM_TILES : NUM_TILES_NO_LOGO;
         }
 
-        public void initMostVisitedLayout(MostVisitedLayout mostVisitedLayout,
-                boolean searchProviderHasLogo) {
-            mostVisitedLayout.setMaxRows(searchProviderHasLogo ? MAX_ROWS : MAX_ROWS_NO_LOGO);
+        public void initMostVisitedLayout(boolean searchProviderHasLogo) {
+            mMostVisitedLayout.setMaxRows(searchProviderHasLogo ? MAX_ROWS : MAX_ROWS_NO_LOGO);
         }
 
         public void setSearchProviderHasLogo(View mostVisitedLayout, boolean hasLogo) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
index 474f62a..3d39b2b5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
@@ -88,6 +88,7 @@
 import org.chromium.chrome.browser.util.KeyNavigationUtil;
 import org.chromium.chrome.browser.util.ViewUtils;
 import org.chromium.chrome.browser.widget.TintedImageButton;
+import org.chromium.chrome.browser.widget.animation.AnimatorProperties;
 import org.chromium.components.security_state.ConnectionSecurityLevel;
 import org.chromium.content.browser.ContentViewCore;
 import org.chromium.content_public.browser.LoadUrlParams;
@@ -2163,7 +2164,7 @@
         if (mFadeInOmniboxBackgroundAnimator == null) {
             mFadeInOmniboxBackgroundAnimator = ObjectAnimator.ofInt(
                     getRootView().findViewById(R.id.omnibox_results_container).getBackground(),
-                    "alpha", 0, 255);
+                    AnimatorProperties.DRAWABLE_ALPHA_PROPERTY, 0, 255);
             mFadeInOmniboxBackgroundAnimator.setDuration(OMNIBOX_CONTAINER_BACKGROUND_FADE_MS);
             mFadeInOmniboxBackgroundAnimator.setInterpolator(
                     BakedBezierInterpolator.FADE_IN_CURVE);
@@ -2175,7 +2176,7 @@
         if (mFadeOutOmniboxBackgroundAnimator == null) {
             mFadeOutOmniboxBackgroundAnimator = ObjectAnimator.ofInt(
                     getRootView().findViewById(R.id.omnibox_results_container).getBackground(),
-                    "alpha", 255, 0);
+                    AnimatorProperties.DRAWABLE_ALPHA_PROPERTY, 255, 0);
             mFadeOutOmniboxBackgroundAnimator.setDuration(OMNIBOX_CONTAINER_BACKGROUND_FADE_MS);
             mFadeOutOmniboxBackgroundAnimator.setInterpolator(
                     BakedBezierInterpolator.FADE_OUT_CURVE);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java
index 757c9503..3dd237f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java
@@ -43,6 +43,7 @@
 import org.chromium.chrome.browser.payments.ui.PaymentRequestSection.SectionSeparator;
 import org.chromium.chrome.browser.widget.AlwaysDismissedDialog;
 import org.chromium.chrome.browser.widget.DualControlLayout;
+import org.chromium.chrome.browser.widget.animation.AnimatorProperties;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -159,7 +160,6 @@
     private final ViewGroup mBottomSheetContainer;
     private final PaymentResultUI mResultUI;
 
-    private final View mScrim;
     private final ScrollView mPaymentContainer;
     private final ViewGroup mPaymentContainerLayout;
     private final DualControlLayout mButtonBar;
@@ -220,6 +220,7 @@
         mAnimatorTranslation = activity.getResources().getDimensionPixelSize(
                 R.dimen.payments_ui_translation);
 
+        // Inflate the layout.
         mFullContainer =
                 (ViewGroup) LayoutInflater.from(mContext).inflate(R.layout.payment_request, null);
         mBottomSheetContainer = (ViewGroup) mFullContainer.findViewById(R.id.dialogContainer);
@@ -229,11 +230,6 @@
         ((TextView) mBottomSheetContainer.findViewById(R.id.pageTitle)).setText(title);
         ((TextView) mBottomSheetContainer.findViewById(R.id.hostname)).setText(origin);
 
-        // Setting the container as clickable prevents the scrim from acknowledging the event.
-        mBottomSheetContainer.setClickable(true);
-        mScrim = mFullContainer.findViewById(R.id.scrim);
-        mScrim.setOnClickListener(this);
-
         // Set up the buttons.
         mCloseButton = mBottomSheetContainer.findViewById(R.id.close_button);
         mCloseButton.setOnClickListener(this);
@@ -501,7 +497,7 @@
         new DisappearingAnimator(false);
 
         int floatingDialogWidth = PaymentResultUI.computeMaxWidth(
-                mContext, mScrim.getMeasuredWidth(), mScrim.getMeasuredHeight());
+                mContext, mFullContainer.getMeasuredWidth(), mFullContainer.getMeasuredHeight());
         FrameLayout.LayoutParams overlayParams =
                 new FrameLayout.LayoutParams(floatingDialogWidth, LayoutParams.WRAP_CONTENT);
         overlayParams.gravity = Gravity.CENTER;
@@ -659,10 +655,15 @@
                 int oldLeft, int oldTop, int oldRight, int oldBottom) {
             mBottomSheetContainer.removeOnLayoutChangeListener(this);
 
+            Animator scrimFader = ObjectAnimator.ofInt(mFullContainer.getBackground(),
+                    AnimatorProperties.DRAWABLE_ALPHA_PROPERTY, 0, 127);
             Animator alphaAnimator = ObjectAnimator.ofFloat(mFullContainer, View.ALPHA, 0f, 1f);
-            alphaAnimator.setDuration(DIALOG_ENTER_ANIMATION_MS);
-            alphaAnimator.setInterpolator(new LinearOutSlowInInterpolator());
-            alphaAnimator.start();
+
+            AnimatorSet alphaSet = new AnimatorSet();
+            alphaSet.playTogether(scrimFader, alphaAnimator);
+            alphaSet.setDuration(DIALOG_ENTER_ANIMATION_MS);
+            alphaSet.setInterpolator(new LinearOutSlowInInterpolator());
+            alphaSet.start();
         }
     }
 
@@ -909,12 +910,13 @@
                     mBottomSheetContainer, View.ALPHA, mBottomSheetContainer.getAlpha(), 0f);
             Animator sheetTranslator = ObjectAnimator.ofFloat(
                     mBottomSheetContainer, View.TRANSLATION_Y, 0f, mAnimatorTranslation);
-            Animator scrimFader = ObjectAnimator.ofFloat(mScrim, View.ALPHA, mScrim.getAlpha(), 0f);
 
             AnimatorSet current = new AnimatorSet();
             current.setDuration(DIALOG_EXIT_ANIMATION_MS);
             current.setInterpolator(new FastOutLinearInInterpolator());
             if (mIsDialogClosing) {
+                Animator scrimFader = ObjectAnimator.ofInt(mFullContainer.getBackground(),
+                        AnimatorProperties.DRAWABLE_ALPHA_PROPERTY, 127, 0);
                 current.playTogether(sheetFader, sheetTranslator, scrimFader);
             } else {
                 current.playTogether(sheetFader, sheetTranslator);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java
index cef7a28..ee65ce4 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java
@@ -36,7 +36,6 @@
     private static final String PREF_SAFE_BROWSING = "safe_browsing";
     private static final String PREF_CONTEXTUAL_SEARCH = "contextual_search";
     private static final String PREF_NETWORK_PREDICTIONS = "network_predictions";
-    private static final String PREF_CRASH_DUMP_UPLOAD = "crash_dump_upload";
     private static final String PREF_CRASH_DUMP_UPLOAD_NO_CELLULAR =
             "crash_dump_upload_no_cellular";
     private static final String PREF_DO_NOT_TRACK = "do_not_track";
@@ -45,6 +44,9 @@
 
     private ManagedPreferenceDelegate mManagedPreferenceDelegate;
 
+    // Needed for ChromeBackupAgent
+    public static final String PREF_CRASH_DUMP_UPLOAD = "crash_dump_upload";
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
index 3a7c2877..f362ac2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
@@ -1447,14 +1447,17 @@
             TabModelSelector tabModelSelector = getTabModelSelector();
             if (tabModelSelector == null) return false;
             mIsDetachedForReparenting = true;
+
+            // Add the tab to AsyncTabParamsManager before removing it from the current model to
+            // ensure the global count of tabs is correct. See crbug.com/611806.
+            intent.putExtra(IntentHandler.EXTRA_TAB_ID, mId);
+            AsyncTabParamsManager.add(mId,
+                    new TabReparentingParams(this, intent, finalizeCallback));
+
             tabModelSelector.getModel(mIncognito).removeTab(this);
 
             if (mContentViewCore != null) mContentViewCore.updateWindowAndroid(null);
             attachTabContentManager(null);
-
-            intent.putExtra(IntentHandler.EXTRA_TAB_ID, mId);
-            AsyncTabParamsManager.add(mId,
-                    new TabReparentingParams(this, intent, finalizeCallback));
         }
 
         activity.startActivity(intent, startActivityOptions);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/AsyncTabParamsManager.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/AsyncTabParamsManager.java
index b7ba9ec..5843304 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/AsyncTabParamsManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/AsyncTabParamsManager.java
@@ -44,6 +44,14 @@
     }
 
     /**
+     * @return A map of tab IDs to AsyncTabParams containing data that will be used later when a tab
+     *         is opened via an intent.
+     */
+    public static SparseArray<AsyncTabParams> getAsyncTabParams() {
+        return sAsyncTabParams;
+    }
+
+    /**
      * @return Retrieves and removes AsyncTabCreationParams for a particular tab id.
      */
     public static AsyncTabParams remove(int tabId) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/OffTheRecordTabModel.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/OffTheRecordTabModel.java
index 989c138..bbc4db9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/OffTheRecordTabModel.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/OffTheRecordTabModel.java
@@ -232,6 +232,9 @@
     @Override
     public void removeTab(Tab tab) {
         mDelegateModel.removeTab(tab);
+        // Call destroyIncognitoIfNecessary() in case the last incognito tab in this model is
+        // reparented to a different activity. See crbug.com/611806.
+        destroyIncognitoIfNecessary();
     }
 
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManager.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManager.java
index a7f623b..aff83459 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabWindowManager.java
@@ -5,6 +5,7 @@
 package org.chromium.chrome.browser.tabmodel;
 
 import android.app.Activity;
+import android.util.SparseArray;
 
 import org.chromium.base.ActivityState;
 import org.chromium.base.ApplicationStatus;
@@ -12,6 +13,7 @@
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.ui.base.WindowAndroid;
 
 import java.util.ArrayList;
@@ -141,6 +143,14 @@
                 count += mSelectors.get(i).getModel(true).getCount();
             }
         }
+
+        // Count tabs that are moving between activities (e.g. a tab that was recently reparented
+        // and hasn't been attached to its new activity yet).
+        SparseArray<AsyncTabParams> asyncTabParams = AsyncTabParamsManager.getAsyncTabParams();
+        for (int i = 0; i < asyncTabParams.size(); i++) {
+            Tab tab = asyncTabParams.valueAt(i).getTabToReparent();
+            if (tab != null && tab.isIncognito()) count++;
+        }
         return count;
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/BoundedLinearLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/BoundedLinearLayout.java
index 6fe79ff..7b4f8eb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/BoundedLinearLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/BoundedLinearLayout.java
@@ -35,10 +35,15 @@
      */
     public BoundedLinearLayout(Context context, AttributeSet attrs) {
         super(context, attrs);
+
         TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.BoundedView);
-        mMaxWidth = a.getDimensionPixelSize(R.styleable.BoundedView_maxWidth, NOT_SPECIFIED);
-        mMaxHeight = a.getDimensionPixelSize(R.styleable.BoundedView_maxHeight, NOT_SPECIFIED);
+        int maxWidth = a.getDimensionPixelSize(R.styleable.BoundedView_maxWidth, NOT_SPECIFIED);
+        int maxHeight = a.getDimensionPixelSize(R.styleable.BoundedView_maxHeight, NOT_SPECIFIED);
         a.recycle();
+
+        // Treat 0 or below as being unconstrained.
+        mMaxWidth = maxWidth <= 0 ? NOT_SPECIFIED : maxWidth;
+        mMaxHeight = maxHeight <= 0 ? NOT_SPECIFIED : maxHeight;
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/DualControlLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/DualControlLayout.java
index 2005afa..309aa96 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/DualControlLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/DualControlLayout.java
@@ -17,14 +17,14 @@
 import org.chromium.ui.widget.ButtonCompat;
 
 /**
- * Automatically lays out one or two Views for an infobar, placing them on the same row if possible
- * and stacking them otherwise.
+ * Automatically lays out one or two Views, placing them on the same row if possible and stacking
+ * them otherwise.
  *
  * Use cases of this Layout include placement of infobar buttons and placement of TextViews inside
  * of spinner controls (http://goto.google.com/infobar-spec).
  *
- * Layout parameters (i.e. margins) are ignored to enforce infobar consistency.  Alignment defines
- * where the controls are placed (for RTL, flip everything):
+ * Layout parameters (i.e. margins) are ignored to enforce consistency.  Alignment defines where the
+ * controls are placed (for RTL, flip everything):
  *
  * ALIGN_START                      ALIGN_APART                      ALIGN_END
  * -----------------------------    -----------------------------    -----------------------------
@@ -53,7 +53,8 @@
      */
     public static Button createButtonForLayout(
             Context context, boolean isPrimary, String text, OnClickListener listener) {
-        int lightActiveColor = context.getResources().getColor(R.color.light_active_color);
+        int lightActiveColor =
+                ApiCompatibilityUtils.getColor(context.getResources(), R.color.light_active_color);
 
         if (isPrimary) {
             ButtonCompat primaryButton = new ButtonCompat(context, lightActiveColor, false);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/animation/AnimatorProperties.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/animation/AnimatorProperties.java
new file mode 100644
index 0000000..14a27c1
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/animation/AnimatorProperties.java
@@ -0,0 +1,29 @@
+// 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.
+
+package org.chromium.chrome.browser.widget.animation;
+
+import android.graphics.drawable.Drawable;
+import android.util.Property;
+
+/**
+ * Holds different {@link Property} types that can be used with ObjectAnimators.
+ */
+public class AnimatorProperties {
+    public static final Property<Drawable, Integer> DRAWABLE_ALPHA_PROPERTY =
+            new Property<Drawable, Integer>(Integer.class, "alpha") {
+        @Override
+        public Integer get(Drawable d) {
+            // getAlpha() is only exposed on drawable in API 19+, so we rely on animations
+            // always setting the starting and ending values instead of relying on this
+            // property.
+            return 0;
+        }
+
+        @Override
+        public void set(Drawable d, Integer alpha) {
+            d.setAlpha(alpha);
+        }
+    };
+}
\ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/newtab/NewTabButton.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/newtab/NewTabButton.java
index ef0d02b..a0fd5b22 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/newtab/NewTabButton.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/newtab/NewTabButton.java
@@ -11,11 +11,11 @@
 import android.graphics.Canvas;
 import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
-import android.util.Property;
 import android.widget.Button;
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.R;
+import org.chromium.chrome.browser.widget.animation.AnimatorProperties;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -25,22 +25,6 @@
  */
 public class NewTabButton extends Button implements Drawable.Callback {
 
-    private static final Property<Drawable, Integer> DRAWABLE_ALPHA_PROPERTY =
-            new Property<Drawable, Integer>(Integer.class, "alpha") {
-        @Override
-        public Integer get(Drawable d) {
-            // getAlpha() is only exposed on drawable in API 19+, so we rely on animations
-            // always setting the starting and ending values instead of relying on this
-            // property.
-            return 0;
-        }
-
-        @Override
-        public void set(Drawable d, Integer alpha) {
-            d.setAlpha(alpha);
-        }
-    };
-
     private final Drawable mNormalDrawable;
     private final Drawable mIncognitoDrawable;
     private boolean mIsIncognito;
@@ -139,12 +123,12 @@
 
         List<Animator> animations = new ArrayList<Animator>();
         Animator animation = ObjectAnimator.ofInt(
-                fadeOutDrawable, DRAWABLE_ALPHA_PROPERTY, 255, 0);
+                fadeOutDrawable, AnimatorProperties.DRAWABLE_ALPHA_PROPERTY, 255, 0);
         animation.setDuration(100);
         animations.add(animation);
 
         animation = ObjectAnimator.ofInt(
-                fadeInDrawable, DRAWABLE_ALPHA_PROPERTY, 0, 255);
+                fadeInDrawable, AnimatorProperties.DRAWABLE_ALPHA_PROPERTY, 0, 255);
         animation.setStartDelay(150);
         animation.setDuration(100);
         animations.add(animation);
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
index 997f360..c914b44 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Chrome እሱን ለዚህ ጣቢያ ለማጋራት የማይክሮፎን መዳረሻ ያስፈልገዋል።</translation>
 <translation id="1080790410959514870">በ <ph name="DOMAIN_NAME" />ከሚቀናበር መለያ ዘግተው እየወጡ ነው። ይሄ በዚህ መሣሪያ ላይ የተከማቸውን የChrome ውሂብ ይሰርዘዋል፣ ነገር ግን ውሂቡ በእርስዎ የGoogle መለያ ውስጥ እንዳለ ይቀራል።</translation>
 <translation id="1098052486217676340">ተጠናቋል</translation>
+<translation id="1111673857033749125">በሌሎች መሣሪያዎችዎ ላይ የተቀመጡ ዕልባቶችዎ እዚህ ብቅ ይላሉ።</translation>
 <translation id="1121094540300013208">የአጠቃቀም እና የብልሽት ሪፖርቶች</translation>
 <translation id="1137305377394488060">ያለፈው ሰዓት</translation>
 <translation id="1178581264944972037">ለአፍታ አቁም</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">ይህን ጣቢያ በጭራሽ አትተርጉም</translation>
 <translation id="1291207594882862231">ታሪክ፣ ኩኪዎች፣ የጣቢያ ውሂብ፣ መሸጎጫን አጽዳ…</translation>
 <translation id="129553762522093515">በቅርብ ጊዜ የተዘጉ</translation>
+<translation id="1326317727527857210">ትሮችዎን ከሌሎች መሣሪያዎችዎ ለማግኘት ወደ Chrome ይግቡ።</translation>
 <translation id="13410144310025252">በChrome ውስጥ ይመልከቷቸው</translation>
 <translation id="1369915414381695676"><ph name="SITE_NAME" /> ጣቢያ ተክሏል</translation>
 <translation id="1373696734384179344">የተመረጠውን ይዘት ለማውረድ በቂ ያልሆነ ማህደረ ትውስታ።</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">አጽዳ</translation>
 <translation id="2315043854645842844">የደንበኛ ወገን ዕውቅና ማረጋገጫ ምርጫ በስርዓተ-ክወናው አይደገፍም።</translation>
 <translation id="2321958826496381788">ይህን በሚመች ሁኔታ ማንበብ እስኪችሉ ድረስ ተንሸራታቹን ይጎትቱት። በአንድ አንቀጽ ላይ ሁለቴ መታ ካደረጉ በኋላ ጽሑፍ ቢያንስ የዚህ ያህል ትልቀት ሊኖረው ይገባል።</translation>
+<translation id="2331464965008647960">ከእርስዎ አቅራቢያ ያሉ መሣሪያዎች ድረ-ገጾችን በብሉቱዝ በኩል እያሰራጩ ነው። Chrome ገጾችን ይቃኝና መሣሪያዎን ሲያነቁት ገጾቹን ያሳያቸዋል። እነዚህ ገጾች የገጽ ውጤቶችን ጥራት ለማሻሻል ሲባል በGoogle አገልግሎት በኩል ያልፋሉ።
+
+አካላዊ ድሩን በChrome ቅንብሮች ውስጥ መቆጣጠር ይችላሉ።
+
+<ph name="BEGIN_LINK" />የበለጠ ለመረዳት<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">በመጫን ላይ…</translation>
 <translation id="2351097562818989364">የትርጉም ቅንብሮችዎ ዳግም እንዲጀምሩ ተደርገዋል።</translation>
 <translation id="2359808026110333948">ቀጥል</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Google ትርጉምን በመጠቀም ገጾችን ለመተርጎም የቀረበ ሃሳብ</translation>
 <translation id="3089395242580810162">ማንነትን በማያሳውቅ ትር ክፈት</translation>
 <translation id="3090193911106258841">የኦዲዮ እና የቪዲዮ ግብዓትን በመድረስ ላይ</translation>
+<translation id="3117051980354074377">ዕልባቶችዎን ከሌሎች መሣሪያዎችዎ ለማግኘት ወደ Chrome ይግቡ።</translation>
 <translation id="3137521801621304719">ከማንነት የማያሳውቅ ሁነታ ይውጡ</translation>
 <translation id="3149891296864842641">የመላኪያ አማራጭ</translation>
 <translation id="3162882791484435636">የመላኪያ አማራጭ ምረጥ</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">የህግ መረጃ</translation>
 <translation id="4089831646916293264">ይህ ባህሪ በእርስዎ አገልግሎት አቅራቢ በሚቀርቡ ዋና የውሂብ አገልግሎቶች ላይ ጣልቃ ሊገባ ይችላል።</translation>
 <translation id="4099578267706723511">የአጠቃቀም ስታቲክሶችን እና የብልሽት ሪፖርቶችን ወደ Google በመላክ Chromeን የተሻለ ለማድረግ እገዛ ያድርጉ።</translation>
+<translation id="410351446219883937">ራስ-አጫውት</translation>
 <translation id="411254640334432676">ማውረድ አልተሳካም።</translation>
 <translation id="4113030288477039509">በእርስዎ አስተዳዳሪ የሚቀናበር</translation>
 <translation id="4165986682804962316">የጣቢያ ቅንብሮች</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">ተጨማሪ</translation>
 <translation id="604996488070107836"><ph name="FILE_NAME" />ን ማውረድ ባልታወቀ ስህተት ምክንያት አልተሳካም።</translation>
 <translation id="605721222689873409">ዓዓ</translation>
+<translation id="605904398899306450">ጣቢያዎች አስፈላጊ ማህደረመረጃን በራስ-እንዲያጫውቱ ይፍቀዱ (የሚመከር)</translation>
 <translation id="6075798973483050474">መነሻ ገጽን ያርትዑ</translation>
 <translation id="6108923351542677676">ማዋቀር በሂደት ላይ…</translation>
 <translation id="6112702117600201073">ገጽ በማደስ ላይ</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">አማራጮች</translation>
 <translation id="656628257199996201"><ph name="SOURCE_LANGUAGE" />ን ሁልጊዜ መተርጎም</translation>
 <translation id="6571070086367343653">ክሬዲት ካርድን አርትዕ</translation>
+<translation id="6573431926118603307">በሌሎች መሣሪያዎችዎ ላይ ባለ Chrome ላይ የከፈቷቸው ትሮች እዚህ ይመጣሉ።</translation>
 <translation id="6575643671698722332">ዳግም ማስጀመር አልተሳካም። የእርስዎ መሣሪያ መስመር ላይ መሆኑን ያረጋግጡና እንደገና ይሞክሩ።</translation>
 <translation id="6600954340915313787">ወደ Chrome ተቀድቷል</translation>
 <translation id="6612358246767739896">ጥበቃ የሚደረግለት ይዘት</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">አክል</translation>
 <translation id="780301667611848630">አይ፣ አመሰግናለሁ</translation>
 <translation id="7829298379596169484">የኦዲዮ ግብዓትን በመድረስ ላይ</translation>
+<translation id="7837582000577464779">ትዕዛዝዎን መስራት ላይ አንድ ስህተት ነበር። እባክዎ መለያዎን ይፈትሹትና እንደገና ይሞክሩ።</translation>
+<translation id="7840369537802583269">ለአንድ የተወሰነ ጣቢያ ማህደረመረጃን ያግኙና መልሰው ያጫውቱ።</translation>
 <translation id="7846076177841592234">ምርጫ ሰርዝ</translation>
 <translation id="7851858861565204677">ሌሎች መሣሪያዎች</translation>
 <translation id="7876243839304621966">ሁሉንም አስወግድ</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">ይዘቶችን (ፊልሞች፣ ሙዚቃ፣ ወዘተ.) የሚያወርዱ መተግበሪያዎች በአዲስ መሣሪያ ምስክርነት ላይ ተመስርተው ፍቃዶችን ዳግም እስኪያገኙ ድረስ በእነሱ የወረዱ ይዘቶችን መልሶ ማጫወት ላይቻል ይችላል።
 
 አዲስ ፍቃዶችን ለማግኘት ከበይነመሩቡ ጋር ይገናኙና የወረዱት ይዘቶችዎን ያጫውቱ።</translation>
+<translation id="8636825310635137004">ትሮችዎን ከሌሎች መሣሪያዎችዎ ለማግኘት ስምረትን ያብሩ።</translation>
 <translation id="8660471606262461360">ከGoogle ክፍያዎች</translation>
 <translation id="8676374126336081632">ግቤቱን አጽዳ</translation>
 <translation id="869891660844655955">የሚያበቀበት ጊዜ</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
index 118a9b2f..4f24dd9a 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">‏يحتاج Chrome إلى الحصول على حق الوصول إلى الميكرفون لمشاركته مع هذا الموقع.</translation>
 <translation id="1080790410959514870">‏أنت بصدد الخروج من حساب تحت إدارة <ph name="DOMAIN_NAME" />. سيؤدي هذا إلى حذف بيانات Chrome المخزنة على هذا الجهاز، إلا أن البيانات ستظل في حسابك على Google.</translation>
 <translation id="1098052486217676340">تم الانتهاء</translation>
+<translation id="1111673857033749125">ستظهر هنا الإشارات التي تم حفظها على أجهزتك الأخرى.</translation>
 <translation id="1121094540300013208">تقارير الاستخدام والأعطال</translation>
 <translation id="1137305377394488060">الساعة الماضية</translation>
 <translation id="1178581264944972037">تعليق</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">عدم ترجمة هذا الموقع مطلقًا</translation>
 <translation id="1291207594882862231">محو السجل وملفات تعريف الارتباط وبيانات المواقع وذاكرة التخزين المؤقت...</translation>
 <translation id="129553762522093515">المغلقة حديثًا</translation>
+<translation id="1326317727527857210">‏للحصول على علامات التبويب من أجهزتك الأخرى، سجّل الدخول إلى Chrome.</translation>
 <translation id="13410144310025252">‏عرضها في Chrome</translation>
 <translation id="1369915414381695676">تمت إضافة الموقع <ph name="SITE_NAME" /></translation>
 <translation id="1373696734384179344">لا توجد ذاكرة كافية لتنزيل المحتوى المحدد.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">تحسين</translation>
 <translation id="2315043854645842844">لا يدعم نظام التشغيل تحديد الشهادة من جانب العميل.</translation>
 <translation id="2321958826496381788">يمكنك سحب شريط التمرير حتى تتمكن من قراءة هذا النص بسهولة. يجب أن يظهر النص بهذا الحجم على الأقل بعد النقر مرتين على إحدى الفقرات.</translation>
+<translation id="2331464965008647960">‏تبث الأجهزة المجاورة لك صفحات ويب عبر بلوتوث. سيعمل Chrome على فحص الصفحات وعرضها عند تشغيل جهازك. وستمر هذه الصفحات عبر خدمة Google لتحسين جودة نتائج الصفحات.
+
+يمكنك التحكم في الشبكة المادية من خلال إعدادات Chrome.
+
+<ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">جارٍ التثبيت...</translation>
 <translation id="2351097562818989364">تم إعادة ضبط إعداداتك للترجمة.</translation>
 <translation id="2359808026110333948">المتابعة</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">‏عرض ترجمة الصفحات باستخدام ترجمة Google.</translation>
 <translation id="3089395242580810162">فتح في علامة تبويب تصفح متخفي</translation>
 <translation id="3090193911106258841">جارٍ الوصول إلى إدخال الصوت والفيديو</translation>
+<translation id="3117051980354074377">‏للحصول على الإشارات من أجهزتك الأخرى، سجّل الدخول إلى Chrome.</translation>
 <translation id="3137521801621304719">مغادرة وضع التصفح المتخفي</translation>
 <translation id="3149891296864842641">خيار الشحن</translation>
 <translation id="3162882791484435636">حدد خيار الشحن</translation>
@@ -218,6 +226,7 @@
 <translation id="4062305924942672200">المعلومات القانونية</translation>
 <translation id="4089831646916293264">قد تتداخل هذه الميزة مع إمكانية الوصول إلى خدمات البيانات المتميزة التي يقدّمها مشغّل شبكة الجوال.</translation>
 <translation id="4099578267706723511">‏ساعد في تحسين Chrome عن طريق إرسال إحصاءات الاستخدام وتقارير الأعطال إلى Google.</translation>
+<translation id="410351446219883937">تشغيل تلقائي</translation>
 <translation id="411254640334432676">فشلت عملية التنزيل</translation>
 <translation id="4113030288477039509">يديره المسؤول</translation>
 <translation id="4165986682804962316">إعدادات الموقع</translation>
@@ -372,6 +381,7 @@
 <translation id="6042308850641462728">المزيد</translation>
 <translation id="604996488070107836">أخفق تنزيل الملف <ph name="FILE_NAME" /> بسبب خطأ غير معلوم.</translation>
 <translation id="605721222689873409">العام</translation>
+<translation id="605904398899306450">السماح للمواقع بالتشغيل التلقائي للوسائط المهمة (موصى به)</translation>
 <translation id="6075798973483050474">تعديل الصفحة الرئيسية</translation>
 <translation id="6108923351542677676">الإعداد قيد التقدّم…</translation>
 <translation id="6112702117600201073">يتم الآن تحديث الصفحة</translation>
@@ -408,6 +418,7 @@
 <translation id="6550675742724504774">خيارات</translation>
 <translation id="656628257199996201">ترجمة <ph name="SOURCE_LANGUAGE" /> دائمًا</translation>
 <translation id="6571070086367343653">تعديل بطاقة الائتمان</translation>
+<translation id="6573431926118603307">‏ستظهر هنا علامات التبويب التي فتحتها في Chrome من أجهزتك الأخرى.</translation>
 <translation id="6575643671698722332">أخفقت إعادة التعيين. تأكد من مدى اتصال جهازك وأعد المحاولة.</translation>
 <translation id="6600954340915313787">‏تم النسخ إلى Chrome</translation>
 <translation id="6612358246767739896">محتوى محمي</translation>
@@ -510,6 +521,8 @@
 <translation id="7791543448312431591">إضافة</translation>
 <translation id="780301667611848630">لا، شكرًا</translation>
 <translation id="7829298379596169484">جارٍ الوصول إلى إدخال الصوت</translation>
+<translation id="7837582000577464779">حدث خطأ أثناء معالجة طلبك.  الرجاء التحقق من حسابك والمحاولة مرة أخرى.</translation>
+<translation id="7840369537802583269">اكتشاف وتشغيل الوسائط المهمة لموقع معين.</translation>
 <translation id="7846076177841592234">إلغاء التحديد</translation>
 <translation id="7851858861565204677">أجهزة أخرى</translation>
 <translation id="7876243839304621966">إزالة الكل</translation>
@@ -566,6 +579,7 @@
 <translation id="862875433388403934">قد لا يكون المحتوى (أفلام، موسيقى، وما إلى ذلك) الذي تم تنزيله في تطبيقات أخرى قابلاً للتشغيل حتى تُعيد هذه التطبيقات الحصول على التراخيص استنادًا إلى بيانات اعتماد الجهاز الجديدة.
 
 للحصول على تراخيص جديدة، عليك الاتصال بالإنترنت ثم تشغيل المحتوى الذي تم تنزيله.</translation>
+<translation id="8636825310635137004">للحصول على علامات التبويب من أجهزتك الأخرى، شغِّل المزامنة.</translation>
 <translation id="8660471606262461360">‏من Google Payments</translation>
 <translation id="8676374126336081632">محو الإرسال</translation>
 <translation id="869891660844655955">تاريخ انتهاء الصلاحية</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
index 9bcf999..e4fa659 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Chrome се нуждае от достъп до микрофона, за да го сподели с този сайт.</translation>
 <translation id="1080790410959514870">Излизате от профил, управляван от <ph name="DOMAIN_NAME" />. Съхраняваните на това устройство данни в Chrome ще се изтрият, но ще останат в профила ви в Google.</translation>
 <translation id="1098052486217676340">Завършено</translation>
+<translation id="1111673857033749125">Тук ще се показват отметките, които сте запазили на другите си устройства.</translation>
 <translation id="1121094540300013208">Отчети за употребата и сигнали за сривове</translation>
 <translation id="1137305377394488060">последния час</translation>
 <translation id="1178581264944972037">Пауза</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Този сайт да не се превежда никога</translation>
 <translation id="1291207594882862231">Изчистване на историята, „бисквитките“, данните за сайтове и кеша…</translation>
 <translation id="129553762522093515">Наскоро затворени</translation>
+<translation id="1326317727527857210">Влезте в Chrome, за да получите разделите си от другите си устройства.</translation>
 <translation id="13410144310025252">Прегледайте ги в Chrome</translation>
 <translation id="1369915414381695676">Сайтът <ph name="SITE_NAME" /> е добавен</translation>
 <translation id="1373696734384179344">Недостатъчно памет за изтегляне на избраното съдържание.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Прецизиране</translation>
 <translation id="2315043854645842844">Избраният сертификат от страната на клиента не се поддържа от операционната система.</translation>
 <translation id="2321958826496381788">Преместете плъзгача, докато можете да четете удобно това. Текстът трябва да изглежда поне толкова голям след двукратно докосване на абзац.</translation>
+<translation id="2331464965008647960">Устройствата близо до вас излъчват уеб страници през Bluetooth. Chrome ще сканира за страници и ще ги показва, когато устройството ви излезе от спящ режим. Те ще преминават през услуга на Google с цел подобряване на качеството на съответните резултати.
+
+Можете да управлявате Физическата мрежа от настройките на Chrome.
+
+<ph name="BEGIN_LINK" />Научете повече<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Инсталира се…</translation>
 <translation id="2351097562818989364">Настройките ви за превод са нулирани.</translation>
 <translation id="2359808026110333948">Напред</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Извеждане на предложения за превод на страниците посредством Google Преводач</translation>
 <translation id="3089395242580810162">Отваряне в раздел „инкогнито“</translation>
 <translation id="3090193911106258841">Осъществява се достъп до аудио- и видеовхода</translation>
+<translation id="3117051980354074377">Влезте в Chrome, за да получите отметките си от другите си устройства.</translation>
 <translation id="3137521801621304719">Напускане на режима „инкогнито“</translation>
 <translation id="3149891296864842641">Опция за доставка</translation>
 <translation id="3162882791484435636">Избиране на опция за доставка</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Правна информация</translation>
 <translation id="4089831646916293264">Тази функция може да възпрепятства достъпа до предоставените от оператора ви платени услуги за данни.</translation>
 <translation id="4099578267706723511">Помогнете за подобряването на Chrome, като изпращате до Google статистически данни за употребата и сигнали за сривове.</translation>
+<translation id="410351446219883937">Автоматично възпроизвеждане</translation>
 <translation id="411254640334432676">Изтеглянето не бе успешно.</translation>
 <translation id="4113030288477039509">Управлява се от администратора ви</translation>
 <translation id="4165986682804962316">Настройки за сайта</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">Още</translation>
 <translation id="604996488070107836">Изтеглянето на „<ph name="FILE_NAME" />“ не бе успешно поради неизвестна грешка.</translation>
 <translation id="605721222689873409">ГГ</translation>
+<translation id="605904398899306450">Разрешаване на сайтовете автоматично да възпроизвеждат важното мултимедийно съдържание (препоръчително)</translation>
 <translation id="6075798973483050474">Редактиране на началната страница</translation>
 <translation id="6108923351542677676">Извършва се настройване…</translation>
 <translation id="6112702117600201073">Опресняване на страницата</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">Опции</translation>
 <translation id="656628257199996201">Винаги да се превежда от <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="6571070086367343653">Редактиране на кредитната карта</translation>
+<translation id="6573431926118603307">Тук ще се показват разделите, които сте отворили в Chrome на другите си устройства.</translation>
 <translation id="6575643671698722332">Нулирането не бе успешно. Уверете се, че устройството е онлайн, и опитайте пак.</translation>
 <translation id="6600954340915313787">Копирано в Chrome</translation>
 <translation id="6612358246767739896">Защитено съдържание</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">Добавяне</translation>
 <translation id="780301667611848630">Не, благодаря</translation>
 <translation id="7829298379596169484">Осъществява се достъп до аудиовхода</translation>
+<translation id="7837582000577464779">При обработването на поръчката ви възникна грешка. Моля, проверете профила си и опитайте отново.</translation>
+<translation id="7840369537802583269">Откриване и възпроизвеждане на важното мултимедийно съдържание за конкретен сайт.</translation>
 <translation id="7846076177841592234">Анулиране на избора</translation>
 <translation id="7851858861565204677">Други устройства</translation>
 <translation id="7876243839304621966">Премахване на всички</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">Възможно е изтегленото в други приложения съдържание (филми, музика и др.) да не се възпроизвежда повече, докато те не придобият отново лицензи въз основа на нови идентификационни данни на устройството.
 
 За да получите нови лицензи, свържете се с интернет и пуснете изтегленото съдържание.</translation>
+<translation id="8636825310635137004">Включете синхронизирането, за да получите разделите си от другите си устройства.</translation>
 <translation id="8660471606262461360">От Google Payments</translation>
 <translation id="8676374126336081632">Изчистване на въведеното</translation>
 <translation id="869891660844655955">Дата на валидност</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
index 2486218..e0194a2 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Chrome necessita accés al micròfon per compartir-lo amb aquest lloc web.</translation>
 <translation id="1080790410959514870">Esteu tancant la sessió d'un compte que gestiona <ph name="DOMAIN_NAME" />. Aquesta acció farà que se suprimeixin les dades de Chrome emmagatzemades en aquest dispositiu, però les dades es conservaran al vostre compte de Google.</translation>
 <translation id="1098052486217676340">Finalitzat</translation>
+<translation id="1111673857033749125">Les adreces d'interès desades als altres dispositius es mostraran aquí.</translation>
 <translation id="1121094540300013208">Informes d'ús i d'error</translation>
 <translation id="1137305377394488060">de l'última hora</translation>
 <translation id="1178581264944972037">Pausa</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">No tradueixis mai aquest lloc</translation>
 <translation id="1291207594882862231">Esborra l'historial, les galetes, les dades del lloc, la memòria cau, etc.</translation>
 <translation id="129553762522093515">Tancades recentment</translation>
+<translation id="1326317727527857210">Inicieu la sessió a Chrome per accedir a les vostres pestanyes des dels altres dispositius.</translation>
 <translation id="13410144310025252">Consulteu-les a Chrome</translation>
 <translation id="1369915414381695676">El lloc <ph name="SITE_NAME" /> s'ha afegit</translation>
 <translation id="1373696734384179344">No hi ha prou memòria per baixar el contingut seleccionat.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Restringeix</translation>
 <translation id="2315043854645842844">El sistema operatiu no permet seleccionar el certificat del client.</translation>
 <translation id="2321958826496381788">Arrossegueu el control lliscant fins que ho pugueu llegir còmodament. El text ha de ser almenys així de gran després de tocar dos cops un paràgraf.</translation>
+<translation id="2331464965008647960">Hi ha dispositius a prop que estan emetent pàgines web per Bluetooth. Quan activeu el vostre dispositiu, Chrome cercarà pàgines i us les mostrarà. A més, es processaran mitjançant un servei de Google per millorar la qualitat dels resultats.
+
+Podeu controlar el Web físic a la configuració de Chrome.
+
+<ph name="BEGIN_LINK" />Més informació<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Instal·lant…</translation>
 <translation id="2351097562818989364">S'ha restablert la configuració de traducció.</translation>
 <translation id="2359808026110333948">Continua</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Proposa'm de traduir les pàgines amb el Traductor de Google</translation>
 <translation id="3089395242580810162">Obre en una pestanya d'incògnit</translation>
 <translation id="3090193911106258841">S'està accedint a l'entrada d'àudio i de vídeo</translation>
+<translation id="3117051980354074377">Inicieu la sessió a Chrome per accedir a les adreces d'interès des dels altres dispositius.</translation>
 <translation id="3137521801621304719">Surt del mode d'incògnit</translation>
 <translation id="3149891296864842641">Opció d'enviament</translation>
 <translation id="3162882791484435636">Seleccioneu l'opció d'enviament</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Informació legal</translation>
 <translation id="4089831646916293264">És possible que aquesta funció interfereixi en l'accés als serveis de dades premium que us proporciona l'operador de telefonia mòbil.</translation>
 <translation id="4099578267706723511">Ajudeu a millorar Chrome mitjançant l'enviament d'estadístiques d'ús i d'informes d'error a Google.</translation>
+<translation id="410351446219883937">Reproducció automàtica</translation>
 <translation id="411254640334432676">S'ha produït un error durant la baixada.</translation>
 <translation id="4113030288477039509">Gestionat per l'administrador</translation>
 <translation id="4165986682804962316">Configuració del lloc</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">Més</translation>
 <translation id="604996488070107836">No s'ha pogut baixar <ph name="FILE_NAME" /> a causa d'un error desconegut.</translation>
 <translation id="605721222689873409">AA</translation>
+<translation id="605904398899306450">Permet que els llocs reprodueixin vídeos importants automàticament (opció recomanada)</translation>
 <translation id="6075798973483050474">Editar la pàgina d'inici</translation>
 <translation id="6108923351542677676">Configuració en curs...</translation>
 <translation id="6112702117600201073">S'està actualitzant la pàgina</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">Opcions</translation>
 <translation id="656628257199996201">Tradueix sempre: <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="6571070086367343653">Edita la targeta de crèdit</translation>
+<translation id="6573431926118603307">Les pestanyes que tingueu obertes a Chrome als altres dispositius es mostraran aquí.</translation>
 <translation id="6575643671698722332">El restabliment ha fallat. Assegureu-vos que el dispositiu estigui en línia i torneu-ho a provar.</translation>
 <translation id="6600954340915313787">Copiada de Chrome</translation>
 <translation id="6612358246767739896">Contingut protegit</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">Afegeix</translation>
 <translation id="780301667611848630">No, gràcies</translation>
 <translation id="7829298379596169484">S'està accedint a l'entrada d'àudio</translation>
+<translation id="7837582000577464779">S'ha produït un error en processar la comanda. Comproveu el compte i torneu-ho a provar.</translation>
+<translation id="7840369537802583269">Detecta i reprodueix els vídeos importants d'un lloc concret.</translation>
 <translation id="7846076177841592234">Cancel·la la selecció</translation>
 <translation id="7851858861565204677">Altres dispositius</translation>
 <translation id="7876243839304621966">Suprimeix-ho tot</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">És possible que el contingut (pel·lícules, música, etc.) que hàgiu baixat en altres aplicacions ja no es pugui reproduir fins que aquestes aplicacions no tornin a adquirir llicències basades en les credencials del dispositiu nou.
 
 Per obtenir llicències noves, connecteu-vos a Internet i reproduïu el contingut que tingueu baixat.</translation>
+<translation id="8636825310635137004">Activeu la sincronització per accedir a les vostres pestanyes des dels altres dispositius.</translation>
 <translation id="8660471606262461360">De Google Payments</translation>
 <translation id="8676374126336081632">Esborra l'entrada</translation>
 <translation id="869891660844655955">Data de caducitat</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
index 1a4ae56..09d834a 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Aby Chrome mohl s těmito webovými stránkami sdílet mikrofon, musí k němu mít přístup.</translation>
 <translation id="1080790410959514870">Odhlašujete se z účtu, který je spravován doménou <ph name="DOMAIN_NAME" />. Data prohlížeče Chrome uložená v tomto zařízení touto akcí smažete, avšak v účtu Google tato data zůstanou.</translation>
 <translation id="1098052486217676340">Dokončeno</translation>
+<translation id="1111673857033749125">Zde se objeví záložky, které jste si uložili v ostatních zařízeních.</translation>
 <translation id="1121094540300013208">Zprávy o využití a selhání</translation>
 <translation id="1137305377394488060">z uplynulé hodiny</translation>
 <translation id="1178581264944972037">Pozastavit</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Tento web nikdy nepřekládat</translation>
 <translation id="1291207594882862231">Vymazat historii, soubory cookie, data webů, mezipaměť…</translation>
 <translation id="129553762522093515">Nedávno zavřené</translation>
+<translation id="1326317727527857210">Chcete-li získat přístup ke kartám ze svých ostatních zařízení, přihlaste se do Chromu.</translation>
 <translation id="13410144310025252">Zobrazte je v Chromu</translation>
 <translation id="1369915414381695676">Byl přidán web <ph name="SITE_NAME" /></translation>
 <translation id="1373696734384179344">Ke stažení vybraného obsahu není k dispozici dostatek paměti.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Upřesnit</translation>
 <translation id="2315043854645842844">Volbu certifikátu na straně klienta operační systém nepodporuje.</translation>
 <translation id="2321958826496381788">Přetahujte posuvník tak dlouho, dokud nebudete moci pohodlně přečíst tento text. Po dvojitém klepnutí na odstavec by měl být text alespoň takto velký.</translation>
+<translation id="2331464965008647960">Zařízení v okolí vysílají webové stránky přes Bluetooth. Když zařízení probudíte z režimu spánku, Chrome tyto stránky vyhledá a zobrazí. Stránky budou za účelem zlepšení kvality zpracovány službou Google.
+
+Fyzický web můžete ovládat v nastavení Chromu.
+
+<ph name="BEGIN_LINK" />Další informace<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Instalace…</translation>
 <translation id="2351097562818989364">Nastavení překladů bylo resetováno.</translation>
 <translation id="2359808026110333948">Pokračovat</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Nabízet překlad stránek pomocí Překladače Google</translation>
 <translation id="3089395242580810162">Otevřít na anonymní kartě</translation>
 <translation id="3090193911106258841">Přístup ke vstupu zvuku a videa</translation>
+<translation id="3117051980354074377">Chcete-li získat přístup k záložkám ze svých ostatních zařízení, přihlaste se do Chromu.</translation>
 <translation id="3137521801621304719">Ukončit anonymní režim</translation>
 <translation id="3149891296864842641">Způsob dopravy</translation>
 <translation id="3162882791484435636">Vyberte způsob dopravy</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Právní informace</translation>
 <translation id="4089831646916293264">Tato funkce může být v konfliktu s prémiovými datovými službami poskytovanými vaším operátorem.</translation>
 <translation id="4099578267706723511">Pomozte Chrome zlepšovat – posílejte Googlu statistiky využití a zprávy o selhání.</translation>
+<translation id="410351446219883937">Automatické přehrávání</translation>
 <translation id="411254640334432676">Stahování se nezdařilo.</translation>
 <translation id="4113030288477039509">Spravováno vaším administrátorem</translation>
 <translation id="4165986682804962316">Nastavení webu</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">Více</translation>
 <translation id="604996488070107836">Stažení souboru <ph name="FILE_NAME" /> se nezdařilo z důvodu neznámé chyby.</translation>
 <translation id="605721222689873409">RR</translation>
+<translation id="605904398899306450">Povolit webům automaticky přehrávat důležitý mediální obsah (doporučeno)</translation>
 <translation id="6075798973483050474">Upravit domovskou stránku</translation>
 <translation id="6108923351542677676">Probíhá nastavování…</translation>
 <translation id="6112702117600201073">Obnovování stránky</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">Možnosti</translation>
 <translation id="656628257199996201">Vždy překládat jazyk <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="6571070086367343653">Upravit platební kartu</translation>
+<translation id="6573431926118603307">Zde se objeví karty, které jste otevřeli v Chromu ve svých ostatních zařízeních.</translation>
 <translation id="6575643671698722332">Resetování se nezdařilo. Zkontrolujte, zda je zařízení online, a zkuste to znovu.</translation>
 <translation id="6600954340915313787">Zkopírováno do Chromu</translation>
 <translation id="6612358246767739896">Chráněný obsah</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">Přidat</translation>
 <translation id="780301667611848630">Ne, děkuji</translation>
 <translation id="7829298379596169484">Přístup ke zvukovému vstupu</translation>
+<translation id="7837582000577464779">Při zpracování objednávky došlo k chybě. Zkontrolujte účet a zkuste to znovu.</translation>
+<translation id="7840369537802583269">Rozpoznat a přehrát mediální obsah, který je pro konkrétní web důležitý.</translation>
 <translation id="7846076177841592234">Zrušit výběr</translation>
 <translation id="7851858861565204677">Jiná zařízení</translation>
 <translation id="7876243839304621966">Odstranit vše</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">Obsah (filmy, hudba atd.) stažený v jiných aplikacích možná nebude možné přehrát, dokud dané aplikace znovu nezískají licence s novými identifikačními údaji zařízení.
 
 Chcete-li získat nové licence, připojte se k internetu a přehrajte stažený obsah.</translation>
+<translation id="8636825310635137004">Chcete-li získat přístup ke kartám ze svých ostatních zařízení, zapněte synchronizaci.</translation>
 <translation id="8660471606262461360">Od služby Google Payments</translation>
 <translation id="8676374126336081632">Vymazat vstup</translation>
 <translation id="869891660844655955">Datum vypršení platnosti</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
index 9b7608c..89d648ea 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Chrome skal have adgang til mikrofonen for at kunne dele den med dette website.</translation>
 <translation id="1080790410959514870">Du er ved at logge ud af en konto, der administreres af <ph name="DOMAIN_NAME" />. Dette medfører sletning af de Chrome-data, der er gemt på denne enhed, men dataene forbliver på din Google-konto.</translation>
 <translation id="1098052486217676340">Afsluttet</translation>
+<translation id="1111673857033749125">Bogmærker, der er gemt på dine andre enheder, vises her.</translation>
 <translation id="1121094540300013208">Forbrugs- og nedbrudsrapporter</translation>
 <translation id="1137305377394488060">den seneste time</translation>
 <translation id="1178581264944972037">Pause</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Oversæt aldrig dette website</translation>
 <translation id="1291207594882862231">Ryd historik, cookies, websitedata, cache...</translation>
 <translation id="129553762522093515">Senest lukkede</translation>
+<translation id="1326317727527857210">Log ind på Chrome for at få adgang til dine faner på dine andre enheder.</translation>
 <translation id="13410144310025252">Se dem i Chrome</translation>
 <translation id="1369915414381695676">Websitet <ph name="SITE_NAME" /> blev tilføjet</translation>
 <translation id="1373696734384179344">Der er ikke nok hukommelse til at downloade det valgte indhold.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Juster</translation>
 <translation id="2315043854645842844">Klientens certifikatvalg understøttes ikke af operativsystemet.</translation>
 <translation id="2321958826496381788">Træk i skyderen, indtil du kan læse dette uden problemer. Når du trykker to gange på et afsnit, skal teksten som minimum være på denne størrelse.</translation>
+<translation id="2331464965008647960">Der er enheder i nærheden af dig, som udsender websider via Bluetooth. Chrome scanner efter sider og viser dem, når du starter din enhed. Siderne går gennem en Google-tjeneste, så kvaliteten af sideresultaterne forbedres.
+
+Du kan kontrollere Fysisk web i Chrome-indstillingerne.
+
+<ph name="BEGIN_LINK" />Få flere oplysninger<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Installerer…</translation>
 <translation id="2351097562818989364">Dine oversættelsesindstillinger er nulstillet.</translation>
 <translation id="2359808026110333948">Fortsæt</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Tilbyd at oversætte sider ved hjælp af Google Oversæt</translation>
 <translation id="3089395242580810162">Åbn i inkognitofane</translation>
 <translation id="3090193911106258841">Åbner lyd- og videoinput</translation>
+<translation id="3117051980354074377">Log ind på Chrome for at se dine bogmærker på dine andre enheder.</translation>
 <translation id="3137521801621304719">Slå inkognitotilstand fra</translation>
 <translation id="3149891296864842641">Forsendelsesmuligheder</translation>
 <translation id="3162882791484435636">Vælg forsendelsesmulighed</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Juridiske oplysninger</translation>
 <translation id="4089831646916293264">Denne funktion kan forstyrre adgangen til eksklusive datatjenester, der leveres af dit mobilselskab.</translation>
 <translation id="4099578267706723511">Hjælp med at gøre Chrome bedre ved at sende brugsstatistik og nedbrudsrapporter til Google.</translation>
+<translation id="410351446219883937">Autoplay</translation>
 <translation id="411254640334432676">Download mislykkedes.</translation>
 <translation id="4113030288477039509">Administreres af din administrator</translation>
 <translation id="4165986682804962316">Indstillinger for website</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">Mere</translation>
 <translation id="604996488070107836"><ph name="FILE_NAME" /> kunne ikke downloades, da der opstod en ukendt fejl.</translation>
 <translation id="605721222689873409">ÅÅ</translation>
+<translation id="605904398899306450">Tillad, at websites afspiller vigtige medier automatisk (anbefales)</translation>
 <translation id="6075798973483050474">Rediger startside</translation>
 <translation id="6108923351542677676">Konfigurationen er i gang...</translation>
 <translation id="6112702117600201073">Opdaterer siden</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">Valgmuligheder</translation>
 <translation id="656628257199996201">Oversæt altid <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="6571070086367343653">Rediger kreditkort</translation>
+<translation id="6573431926118603307">Faner, du har åbnet i Chrome på dine andre enheder, vises her.</translation>
 <translation id="6575643671698722332">Nulstillingsfejl. Sørg for, at enheden er online, og prøv igen.</translation>
 <translation id="6600954340915313787">Kopieret til Chrome</translation>
 <translation id="6612358246767739896">Beskyttet indhold</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">Tilføj</translation>
 <translation id="780301667611848630">Nej tak</translation>
 <translation id="7829298379596169484">Åbner lydinput</translation>
+<translation id="7837582000577464779">Der opstod en fejl under behandlingen af din ordre.  Kontrollér din konto, og prøv igen.</translation>
+<translation id="7840369537802583269">Find og afspil vigtige medier for et bestemt website.</translation>
 <translation id="7846076177841592234">Annuller valg</translation>
 <translation id="7851858861565204677">Andre enheder</translation>
 <translation id="7876243839304621966">Fjern alt</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">Indhold (film, musik m.m.), der er downloadet i andre applikationer, kan muligvis ikke længere afspilles, før disse applikationer får nye licenser, der er baseret på nye loginoplysninger for enheden.
 
 Du kan få nye licenser ved at oprette forbindelse til internettet og afspille det indhold, du har downloadet.</translation>
+<translation id="8636825310635137004">Aktivér synkronisering for at få adgang til dine faner på dine andre enheder.</translation>
 <translation id="8660471606262461360">Fra Google Payments</translation>
 <translation id="8676374126336081632">Ryd indtastning</translation>
 <translation id="869891660844655955">Udløbsdato</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
index a933c8e..c2813e5 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Chrome benötigt Zugriff auf das Mikrofon, um es für diese Website freizugeben.</translation>
 <translation id="1080790410959514870">Sie melden sich von einem Konto ab, das von <ph name="DOMAIN_NAME" /> verwaltet wird. Dadurch werden die auf diesem Gerät gespeicherten Chrome-Daten gelöscht. Die Daten verbleiben jedoch weiterhin in Ihrem Google-Konto.</translation>
 <translation id="1098052486217676340">Fertig</translation>
+<translation id="1111673857033749125">Hier werden die Lesezeichen angezeigt, die auf Ihren anderen Geräten gespeichert sind.</translation>
 <translation id="1121094540300013208">Nutzungs- und Absturzberichte</translation>
 <translation id="1137305377394488060">für die letzte Stunde</translation>
 <translation id="1178581264944972037">Anhalten</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Diese Website nie übersetzen</translation>
 <translation id="1291207594882862231">Verlauf, Cookies, Websitedaten, Cache leeren…</translation>
 <translation id="129553762522093515">Kürzlich geschlossen</translation>
+<translation id="1326317727527857210">Melden Sie sich in Chrome an, um Tabs von Ihren anderen Geräten abzurufen.</translation>
 <translation id="13410144310025252">In Chrome ansehen</translation>
 <translation id="1369915414381695676">Website "<ph name="SITE_NAME" />" hinzugefügt</translation>
 <translation id="1373696734384179344">Der Speicher reicht nicht aus, um den ausgewählten Inhalt herunterzuladen.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Verfeinern</translation>
 <translation id="2315043854645842844">Die clientseitige Zertifikatauswahl wird vom Betriebssystem nicht unterstützt.</translation>
 <translation id="2321958826496381788">Ziehen Sie den Schieberegler, bis Sie diesen Text problemlos lesen können. Nach dem Doppeltippen auf einen Abschnitt sollte der Text mindestens so groß sein.</translation>
+<translation id="2331464965008647960">Geräte in Ihrer Nähe übertragen Webseiten über Bluetooth. Chrome sucht nach Seiten und zeigt Sie Ihnen an, wenn Ihr Gerät entsperrt ist. Diese Seiten werden durch einen Google-Dienst überprüft, um die Qualität der Suchergebnisse zu verbessern.
+
+Über die Chrome-Einstellungen können Sie das Physical Web verwalten.
+
+<ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Wird installiert…</translation>
 <translation id="2351097562818989364">Übersetzungseinstellungen zurückgesetzt</translation>
 <translation id="2359808026110333948">Weiter</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Übersetzung der Seiten mithilfe von Google Übersetzer anbieten</translation>
 <translation id="3089395242580810162">In Inkognito-Tab öffnen</translation>
 <translation id="3090193911106258841">Zugriff auf Audio- und Video-Eingang</translation>
+<translation id="3117051980354074377">Melden Sie sich in Chrome an, um Lesezeichen von Ihren anderen Geräten abzurufen.</translation>
 <translation id="3137521801621304719">Inkognitomodus deaktivieren</translation>
 <translation id="3149891296864842641">Versandoption</translation>
 <translation id="3162882791484435636">Versandoption auswählen</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Rechtliche Hinweise</translation>
 <translation id="4089831646916293264">Diese Funktion beeinträchtigt möglicherweise den Zugang zu Premium-Datendiensten, die von Ihrem Mobilfunkanbieter bereitgestellt werden.</translation>
 <translation id="4099578267706723511">Nutzungsstatistiken und Absturzberichte zur Verbesserung von Chrome an Google senden</translation>
+<translation id="410351446219883937">Autoplay</translation>
 <translation id="411254640334432676">Fehler beim Download</translation>
 <translation id="4113030288477039509">Von Ihrem Administrator verwaltet</translation>
 <translation id="4165986682804962316">Website-Einstellungen</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">Mehr</translation>
 <translation id="604996488070107836"><ph name="FILE_NAME" /> konnte aufgrund eines unbekannten Fehlers nicht heruntergeladen werden.</translation>
 <translation id="605721222689873409">JJ</translation>
+<translation id="605904398899306450">Websites dürfen die Wiedergabe wichtiger Medien automatisch starten (empfohlen)</translation>
 <translation id="6075798973483050474">Startseite bearbeiten</translation>
 <translation id="6108923351542677676">Einrichtung läuft...</translation>
 <translation id="6112702117600201073">Aktualisierung der Seite</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">Optionen</translation>
 <translation id="656628257199996201"><ph name="SOURCE_LANGUAGE" /> immer übersetzen</translation>
 <translation id="6571070086367343653">Kreditkarte bearbeiten</translation>
+<translation id="6573431926118603307">Hier werden Tabs angezeigt, die Sie auf Ihren anderen Geräten in Chrome geöffnet haben.</translation>
 <translation id="6575643671698722332">Fehler beim Zurücksetzen, da das Gerät nicht online ist. Versuchen Sie es erneut.</translation>
 <translation id="6600954340915313787">In Chrome kopiert</translation>
 <translation id="6612358246767739896">Geschützte Inhalte</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">Hinzufügen</translation>
 <translation id="780301667611848630">Kein Interesse</translation>
 <translation id="7829298379596169484">Zugriff auf Audio-Eingang</translation>
+<translation id="7837582000577464779">Bei der Verarbeitung Ihrer Bestellung ist ein Fehler aufgetreten. Überprüfen Sie Ihr Konto und versuchen Sie es erneut.</translation>
+<translation id="7840369537802583269">Erkennung und Wiedergabe wichtiger Medien für eine bestimmte Website</translation>
 <translation id="7846076177841592234">Auswahl aufheben</translation>
 <translation id="7851858861565204677">Andere Geräte</translation>
 <translation id="7876243839304621966">Alle entfernen</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">In anderen Anwendungen heruntergeladene Inhalte wie Filme und Musik können möglicherweise erst wieder abgespielt werden, nachdem Lizenzen basierend auf neuen Anmeldedaten für die betreffenden Anwendungen erworben wurden.
 
 Um neue Lizenzen zu erwerben, stellen Sie eine Internetverbindung her und spielen Sie die heruntergeladenen Inhalte ab.</translation>
+<translation id="8636825310635137004">Aktivieren Sie die Synchronisierung, um Tabs von Ihren anderen Geräten abzurufen.</translation>
 <translation id="8660471606262461360">Aus Google Payments</translation>
 <translation id="8676374126336081632">Eingabe löschen</translation>
 <translation id="869891660844655955">Ablaufdatum</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
index 63025b8..42599c6 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Το Chrome χρειάζεται πρόσβαση στο μικρόφωνο προκειμένου να το μοιραστεί με αυτόν τον ιστότοπο.</translation>
 <translation id="1080790410959514870">Πρόκειται να αποσυνδεθείτε από έναν λογαριασμό που τελεί υπό τη διαχείριση του <ph name="DOMAIN_NAME" />. Με αυτόν τον τρόπο θα διαγραφούν τα δεδομένα του Chrome που είναι αποθηκευμένα σε αυτήν τη συσκευή, αλλά τα δεδομένα θα διατηρηθούν στο Λογαριασμό σας Google.</translation>
 <translation id="1098052486217676340">Ολοκληρώθηκε</translation>
+<translation id="1111673857033749125">Οι σελιδοδείκτες που είναι αποθηκευμένοι σε άλλες συσκευές θα εμφανίζονται εδώ.</translation>
 <translation id="1121094540300013208">Αναφορές χρήσης και σφαλμάτων</translation>
 <translation id="1137305377394488060">τελευταία ώρα</translation>
 <translation id="1178581264944972037">Παύση</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Να μην γίνεται ποτέ μετάφραση αυτού του ιστότοπου</translation>
 <translation id="1291207594882862231">Εκκαθάριση ιστορικού, cookie, δεδομένων ιστότοπου, κρυφής μνήμης…</translation>
 <translation id="129553762522093515">Έκλεισαν πρόσφατα</translation>
+<translation id="1326317727527857210">Για να εμφανίζονται οι καρτέλες από τις άλλες συσκευές σας, συνδεθείτε στο Chrome.</translation>
 <translation id="13410144310025252">Προβολή στο Chrome</translation>
 <translation id="1369915414381695676">Προστέθηκε ο ιστότοπος <ph name="SITE_NAME" /></translation>
 <translation id="1373696734384179344">Ανεπαρκής μνήμη για τη λήψη του επιλεγμένου περιεχομένου.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Περιορισμός</translation>
 <translation id="2315043854645842844">Η επιλογή πιστοποιητικού από τον πελάτη δεν υποστηρίζεται από το λειτουργικό σύστημα.</translation>
 <translation id="2321958826496381788">Σύρετε το ρυθμιστικό έως ότου να διαβάσετε αυτό το μήνυμα άνετα. Το κείμενο θα πρέπει να είναι τουλάχιστον τόσο μεγάλο αφού πατήσετε δύο φορές σε μια παράγραφο.</translation>
+<translation id="2331464965008647960">Οι συσκευές που βρίσκονται κοντά σας μεταδίδουν ιστοσελίδες μέσω Bluetooth. Το Chrome θα σαρώσει τις κοντινές σελίδες και θα τις εμφανίσει μόλις ενεργοποιήσετε τη συσκευή σας. Αυτές οι σελίδες θα περάσουν από μια υπηρεσία Google για τη βελτίωση της ποιότητας των αποτελεσμάτων σελίδων.
+
+Μπορείτε να ελέγξετε τη λειτουργία του Φυσικού δικτύου από τις Ρυθμίσεις του Chrome.
+
+<ph name="BEGIN_LINK" />Μάθετε περισσότερα<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Εγκατάσταση…</translation>
 <translation id="2351097562818989364">Έγινε επαναφορά ρυθμίσεων μετάφρασης.</translation>
 <translation id="2359808026110333948">Συνέχεια</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Πρόταση μετάφρασης σελίδων χρησιμοποιώντας τη Μετάφραση Google</translation>
 <translation id="3089395242580810162">Άνοιγμα σε καρτέλα ανώνυμης περιήγησης</translation>
 <translation id="3090193911106258841">Πρόσβαση στην είσοδο ήχου και βίντεο</translation>
+<translation id="3117051980354074377">Για να εμφανίζονται οι σελιδοδείκτες από τις άλλες συσκευές σας, συνδεθείτε στο Chrome.</translation>
 <translation id="3137521801621304719">Έξοδος από την κατάσταση ανώνυμης περιήγησης</translation>
 <translation id="3149891296864842641">Επιλογή αποστολής</translation>
 <translation id="3162882791484435636">Ορίστε επιλογή αποστολής</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Νομικές πληροφορίες</translation>
 <translation id="4089831646916293264">Αυτή η λειτουργία ενδέχεται να εμποδίζει την πρόσβαση σε υπηρεσίες δεδομένων υψηλής ποιότητας που παρέχονται από την εταιρεία κινητής τηλεφωνίας.</translation>
 <translation id="4099578267706723511">Συμβάλετε στη βελτίωση του Chrome, στέλνοντας στην Google στατιστικά στοιχεία χρήσης και αναφορές σφαλμάτων.</translation>
+<translation id="410351446219883937">Αυτόματη αναπαραγωγή</translation>
 <translation id="411254640334432676">Αποτυχία λήψης.</translation>
 <translation id="4113030288477039509">Διαχειρίζεται από το διαχειριστή σας</translation>
 <translation id="4165986682804962316">Ρυθμίσεις ιστότοπου</translation>
@@ -374,6 +383,7 @@
 <translation id="6042308850641462728">Περισσότερα</translation>
 <translation id="604996488070107836">Η λήψη του αρχείου <ph name="FILE_NAME" /> απέτυχε λόγω άγνωστου σφάλματος.</translation>
 <translation id="605721222689873409">ΕΕ</translation>
+<translation id="605904398899306450">Να επιτρέπεται στους ιστότοπους η αυτόματη αναπαραγωγή σημαντικών μέσων (συνιστάται)</translation>
 <translation id="6075798973483050474">Επεξεργασία αρχικής σελίδας</translation>
 <translation id="6108923351542677676">Ρύθμιση σε εξέλιξη…</translation>
 <translation id="6112702117600201073">Ανανέωση σελίδας</translation>
@@ -410,6 +420,7 @@
 <translation id="6550675742724504774">Επιλογές</translation>
 <translation id="656628257199996201">Να γίνεται πάντα μετάφραση των <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="6571070086367343653">Επεξεργασία πιστωτικής κάρτας</translation>
+<translation id="6573431926118603307">Οι καρτέλες που έχετε ανοίξει στο Chrome στις άλλες συσκευές σας θα εμφανίζονται εδώ.</translation>
 <translation id="6575643671698722332">Αποτυχία επαναφοράς. Επιβεβαιώστε τη σύνδεση της συσκευής σας και δοκιμάστε ξανά.</translation>
 <translation id="6600954340915313787">Αντιγράφηκε στο Chrome</translation>
 <translation id="6612358246767739896">Προστατευμένο περιεχόμενο</translation>
@@ -512,6 +523,8 @@
 <translation id="7791543448312431591">Προσθήκη</translation>
 <translation id="780301667611848630">Όχι, ευχαριστώ</translation>
 <translation id="7829298379596169484">Πρόσβαση στην είσοδο ήχου</translation>
+<translation id="7837582000577464779">Παρουσιάστηκε κάποιο πρόβλημα κατά την επεξεργασία της παραγγελίας σας. Ελέγξτε τον λογαριασμό σας και δοκιμάστε ξανά.</translation>
+<translation id="7840369537802583269">Εντοπισμός και αυτόματη αναπαραγωγή σημαντικών μέσων για έναν συγκεκριμένο ιστότοπο.</translation>
 <translation id="7846076177841592234">Ακύρωση επιλογής</translation>
 <translation id="7851858861565204677">Άλλες συσκευές</translation>
 <translation id="7876243839304621966">Κατάργηση όλων</translation>
@@ -568,6 +581,7 @@
 <translation id="862875433388403934">Ίσως να είναι αδύνατη η αναπαραγωγή λήψεων περιεχομένου (ταινίες, μουσική, κ.λπ.), σε άλλες εφαρμογές έως ότου αποκτήσουν άδειες με νέα διαπιστευτήρια συσκευής.
 
 Για απόκτηση νέων αδειών, συνδεθείτε στο διαδίκτυο και κάντε αναπαραγωγή των λήψεων περιεχομένου.</translation>
+<translation id="8636825310635137004">Για να εμφανίζονται οι καρτέλες από τις άλλες συσκευές σας, ενεργοποιήστε τον συγχρονισμό.</translation>
 <translation id="8660471606262461360">Από το Google Payments</translation>
 <translation id="8676374126336081632">Εκκαθάριση καταχώρισης</translation>
 <translation id="869891660844655955">Ημερομηνία λήξης</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
index 7f07e1e..4b918a4 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Chrome needs microphone access to share it with this site.</translation>
 <translation id="1080790410959514870">You are signing out of an account managed by <ph name="DOMAIN_NAME" />. This will delete the Chrome data stored on this device, but the data will remain in your Google Account.</translation>
 <translation id="1098052486217676340">Finished</translation>
+<translation id="1111673857033749125">Bookmarks saved on your other devices will appear here.</translation>
 <translation id="1121094540300013208">Usage and crash reports</translation>
 <translation id="1137305377394488060">past hour</translation>
 <translation id="1178581264944972037">Pause</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Never translate this site</translation>
 <translation id="1291207594882862231">Clear history, cookies, site data, cache…</translation>
 <translation id="129553762522093515">Recently closed</translation>
+<translation id="1326317727527857210">To get your tabs from your other devices, sign in to Chrome.</translation>
 <translation id="13410144310025252">View them in Chrome</translation>
 <translation id="1369915414381695676">Site <ph name="SITE_NAME" /> added</translation>
 <translation id="1373696734384179344">Insufficient memory to download the selected content.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Refine</translation>
 <translation id="2315043854645842844">Client side certificate selection is not supported by the operating system.</translation>
 <translation id="2321958826496381788">Drag the slider until you can read this comfortably. Text should look at least this big after double-tapping on a paragraph.</translation>
+<translation id="2331464965008647960">Devices near to you are broadcasting web pages over Bluetooth. Chrome will scan for pages and display them when you wake up your device. These pages will go through a Google service to improve the quality of page results.
+
+You can control the Physical Web in Chrome Settings.
+
+<ph name="BEGIN_LINK" />Find out more<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Installing…</translation>
 <translation id="2351097562818989364">Your translate settings have been reset.</translation>
 <translation id="2359808026110333948">Continue</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Offer to translate pages using Google Translate</translation>
 <translation id="3089395242580810162">Open in incognito tab</translation>
 <translation id="3090193911106258841">Accessing audio and video input</translation>
+<translation id="3117051980354074377">To get your bookmarks your other devices, sign in to Chrome.</translation>
 <translation id="3137521801621304719">Leave incognito mode</translation>
 <translation id="3149891296864842641">Delivery option</translation>
 <translation id="3162882791484435636">Select shipping option</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Legal information</translation>
 <translation id="4089831646916293264">This feature may interfere with access to premium data services provided by your operator.</translation>
 <translation id="4099578267706723511">Help make Chrome better by sending usage statistics and crash reports to Google.</translation>
+<translation id="410351446219883937">Auto-play</translation>
 <translation id="411254640334432676">Download failed.</translation>
 <translation id="4113030288477039509">Managed by your administrator</translation>
 <translation id="4165986682804962316">Site settings</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">More</translation>
 <translation id="604996488070107836"><ph name="FILE_NAME" /> download failed due to an unknown error.</translation>
 <translation id="605721222689873409">YY</translation>
+<translation id="605904398899306450">Allow sites to auto-play important media (recommended)</translation>
 <translation id="6075798973483050474">Edit home page</translation>
 <translation id="6108923351542677676">Setup in progress…</translation>
 <translation id="6112702117600201073">Refreshing page</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">Options</translation>
 <translation id="656628257199996201">Always translate <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="6571070086367343653">Edit credit card</translation>
+<translation id="6573431926118603307">Tabs that you've opened in Chrome on your other devices will appear here.</translation>
 <translation id="6575643671698722332">Reset failed. Ensure that your device is online and try again.</translation>
 <translation id="6600954340915313787">Copied to Chrome</translation>
 <translation id="6612358246767739896">Protected content</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">Add</translation>
 <translation id="780301667611848630">No, thank you</translation>
 <translation id="7829298379596169484">Accessing audio input</translation>
+<translation id="7837582000577464779">There was an error processing your order.  Please check your account and try again.</translation>
+<translation id="7840369537802583269">Detect and play back important media for a specific site.</translation>
 <translation id="7846076177841592234">Cancel selection</translation>
 <translation id="7851858861565204677">Other Devices</translation>
 <translation id="7876243839304621966">Remove all</translation>
@@ -565,6 +578,7 @@
 <translation id="8617240290563765734">Open the suggested URL specified in the downloaded content?</translation>
 <translation id="8627706565932943526">Sync error</translation>
 <translation id="862875433388403934">Content (films, music, etc.) downloaded in other applications may no longer be playable until those applications re-acquire licences based on a new device credential. To obtain new licences, connect to the Internet and play your downloaded content.</translation>
+<translation id="8636825310635137004">To get your tabs from your other devices, turn on sync.</translation>
 <translation id="8660471606262461360">From Google Payments</translation>
 <translation id="8676374126336081632">Clear input</translation>
 <translation id="869891660844655955">Expiry date</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
index 4147a07..83344e3 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Chrome necesita acceso al micrófono para compartirlo con este sitio.</translation>
 <translation id="1080790410959514870">Saldrás de una cuenta administrada por <ph name="DOMAIN_NAME" />. Esta acción eliminará los datos de Chrome almacenados en este dispositivo, aunque estos se mantendrán en la cuenta de Google.</translation>
 <translation id="1098052486217676340">Finalizado</translation>
+<translation id="1111673857033749125">Los marcadores guardados en tus otros dispositivos aparecerán aquí.</translation>
 <translation id="1121094540300013208">Informes de uso y de fallos</translation>
 <translation id="1137305377394488060">hace una hora</translation>
 <translation id="1178581264944972037">Detener</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Nunca traducir este sitio</translation>
 <translation id="1291207594882862231">Borra el historial, las cookies, los datos del sitio, la caché…</translation>
 <translation id="129553762522093515">Cerrado recientemente</translation>
+<translation id="1326317727527857210">Accede a Chrome para obtener las pestañas de tus otros dispositivos.</translation>
 <translation id="13410144310025252">Ver en Chrome</translation>
 <translation id="1369915414381695676">Se agregó el sitio <ph name="SITE_NAME" />.</translation>
 <translation id="1373696734384179344">Memoria insuficiente para descargar el contenido seleccionado</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Definir mejor</translation>
 <translation id="2315043854645842844">El sistema operativo no admite la selección de certificados del lado del cliente.</translation>
 <translation id="2321958826496381788">Arrastra el control deslizante hasta que puedas leer esto cómodamente. El texto debería verse, al menos, de este tamaño al tocar dos veces un párrafo.</translation>
+<translation id="2331464965008647960">Los dispositivos cercanos están transmitiendo páginas web a través de Bluetooth. Chrome buscará páginas y las mostrará cuando actives tu dispositivo. Estas páginas pasarán por un servicio de Google que mejorará la calidad de los resultados.
+
+Puedes controlar la Web física desde la configuración de Chrome.
+
+<ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Instalando…</translation>
 <translation id="2351097562818989364">Se restableció la configuración de traducción.</translation>
 <translation id="2359808026110333948">Continuar</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Ofrecer la traducción de páginas con Google Traductor</translation>
 <translation id="3089395242580810162">Abrir en pestaña de incógnito</translation>
 <translation id="3090193911106258841">Accediendo a la entrada de video y de audio</translation>
+<translation id="3117051980354074377">Accede a Chrome para obtener los marcadores de tus otros dispositivos.</translation>
 <translation id="3137521801621304719">Salir del modo de navegación de incógnito</translation>
 <translation id="3149891296864842641">Opción de envío</translation>
 <translation id="3162882791484435636">Seleccionar la opción de envío</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Información legal</translation>
 <translation id="4089831646916293264">Esta función puede interferir con el acceso a servicios de datos de alta calidad brindados por el proveedor.</translation>
 <translation id="4099578267706723511">Envía las estadísticas de uso y los informes de fallos a Google para ayudarnos a mejorar Chrome.</translation>
+<translation id="410351446219883937">Reproducción automática</translation>
 <translation id="411254640334432676">Se produjo un error durante la descarga.</translation>
 <translation id="4113030288477039509">Administrado por tu administrador</translation>
 <translation id="4165986682804962316">Configuración del sitio</translation>
@@ -374,6 +383,7 @@
 <translation id="6042308850641462728">Más</translation>
 <translation id="604996488070107836"><ph name="FILE_NAME" /> no se pudo descargar debido a un error desconocido.</translation>
 <translation id="605721222689873409">AA</translation>
+<translation id="605904398899306450">Permitir que los sitios reproduzcan de forma automática medios importantes (opción recomendada)</translation>
 <translation id="6075798973483050474">Editar la Página principal</translation>
 <translation id="6108923351542677676">Configuración en curso…</translation>
 <translation id="6112702117600201073">Actualizando la página</translation>
@@ -410,6 +420,7 @@
 <translation id="6550675742724504774">Opciones</translation>
 <translation id="656628257199996201">Traducir siempre el texto en <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="6571070086367343653">Editar tarjeta de crédito</translation>
+<translation id="6573431926118603307">Aquí aparecerán las pestañas que abriste en Chrome en tus otros dispositivos.</translation>
 <translation id="6575643671698722332">Error al restablecer. Comprueba la conexión y vuelve a intentarlo.</translation>
 <translation id="6600954340915313787">Se copió en Chrome.</translation>
 <translation id="6612358246767739896">Contenido protegido</translation>
@@ -512,6 +523,8 @@
 <translation id="7791543448312431591">Agregar</translation>
 <translation id="780301667611848630">No, gracias</translation>
 <translation id="7829298379596169484">Accediendo a la entrada de audio</translation>
+<translation id="7837582000577464779">Se produjo un error al procesar tu pedido. Comprueba tu cuenta e inténtalo de nuevo.</translation>
+<translation id="7840369537802583269">Detecta y reproduce medios importantes para un sitio específico.</translation>
 <translation id="7846076177841592234">Cancelar la selección</translation>
 <translation id="7851858861565204677">Otros dispositivos</translation>
 <translation id="7876243839304621966">Eliminar todo</translation>
@@ -568,6 +581,7 @@
 <translation id="862875433388403934">Tal vez no puedas reproducir el contenido descargado (películas, música, etc.) en otras aplicaciones hasta que dichas aplicaciones vuelvan a adquirir licencias basadas en una nueva credencial de dispositivo.
 
 Conéctate a Internet y reproduce el contenido descargado para obtener licencias nuevas.</translation>
+<translation id="8636825310635137004">Activa la sincronización para obtener las pestañas de tus otros dispositivos.</translation>
 <translation id="8660471606262461360">De Google Payments</translation>
 <translation id="8676374126336081632">Borrar entrada</translation>
 <translation id="869891660844655955">Fecha de vencimiento</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
index 0d7b3ef1..de529da 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Chrome necesita acceder al micrófono para compartirlo con este sitio web.</translation>
 <translation id="1080790410959514870">Vas a salir de una cuenta administrada por <ph name="DOMAIN_NAME" />. Se eliminarán los datos de Chrome almacenados en este dispositivo, pero los datos permanecerán en tu cuenta de Google.</translation>
 <translation id="1098052486217676340">Finalizado</translation>
+<translation id="1111673857033749125">Aquí aparecen los marcadores que hayas guardado en otros dispositivos.</translation>
 <translation id="1121094540300013208">Informes de uso y sobre fallos</translation>
 <translation id="1137305377394488060">última hora</translation>
 <translation id="1178581264944972037">Detener</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">No traducir nunca este sitio</translation>
 <translation id="1291207594882862231">Borrar el historial, las cookies, los datos del sitio web, la caché…</translation>
 <translation id="129553762522093515">Cerrado recientemente</translation>
+<translation id="1326317727527857210">Inicia sesión en Chrome para ver las pestañas de tus otros dispositivos.</translation>
 <translation id="13410144310025252">Ver en Chrome</translation>
 <translation id="1369915414381695676">Se ha añadido el sitio <ph name="SITE_NAME" /></translation>
 <translation id="1373696734384179344">No hay memoria suficiente para descargar el contenido seleccionado.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Restringir</translation>
 <translation id="2315043854645842844">El sistema operativo no admite la selección de certificados de cliente.</translation>
 <translation id="2321958826496381788">Arrastra el control deslizante hasta que puedas leer cómodamente. El texto debe tener al menos este tamaño después de tocar un párrafo dos veces.</translation>
+<translation id="2331464965008647960">Dispositivos cercanos con los que transmites páginas web por Bluetooth. Chrome busca páginas y las muestra cuando activas el dispositivo. Estas páginas se envían a un servicio de Google para mejorar la calidad de los resultados de páginas.
+
+Puedes controlar la Web física en la configuración de privacidad de Chrome.
+
+<ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Instalando…</translation>
 <translation id="2351097562818989364">Se han restablecido tus ajustes de traducción.</translation>
 <translation id="2359808026110333948">Continuar</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Ofrece la traducción de páginas con el Traductor de Google</translation>
 <translation id="3089395242580810162">Abrir en modo de incógnito</translation>
 <translation id="3090193911106258841">Accediendo a la entrada de vídeo y audio</translation>
+<translation id="3117051980354074377">Inicia sesión en Chrome para ver tus marcadores en otros dispositivos.</translation>
 <translation id="3137521801621304719">Salir del modo incógnito</translation>
 <translation id="3149891296864842641">Opción de envío</translation>
 <translation id="3162882791484435636">Seleccionar opción de envío</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Información legal</translation>
 <translation id="4089831646916293264">Esta función puede interferir con el acceso a servicios de datos premium ofrecidos por el operador.</translation>
 <translation id="4099578267706723511">Ayuda a mejorar Chrome enviando estadísticas de uso e informes sobre fallos.</translation>
+<translation id="410351446219883937">Reproducción automática</translation>
 <translation id="411254640334432676">Error de descarga.</translation>
 <translation id="4113030288477039509">Administrado por tu administrador</translation>
 <translation id="4165986682804962316">Configuración de sitios web</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">Más</translation>
 <translation id="604996488070107836">No ha sido posible descargar el archivo <ph name="FILE_NAME" /> debido a un error desconocido.</translation>
 <translation id="605721222689873409">AA</translation>
+<translation id="605904398899306450">Permitir que los sitios web reproduzcan automáticamente el contenido multimedia importante (recomendado)</translation>
 <translation id="6075798973483050474">Editar página principal</translation>
 <translation id="6108923351542677676">Configuración en curso…</translation>
 <translation id="6112702117600201073">Actualizando página</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">Configuración</translation>
 <translation id="656628257199996201">Traducir siempre del <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="6571070086367343653">Editar tarjeta de crédito</translation>
+<translation id="6573431926118603307">Aquí aparecen las pestañas que hayas abierto en Chrome en otros dispositivos.</translation>
 <translation id="6575643671698722332">Error al restablecer. Comprueba la conexión y vuelve a intentarlo.</translation>
 <translation id="6600954340915313787">Copiada a Chrome</translation>
 <translation id="6612358246767739896">Contenido protegido</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">Añadir</translation>
 <translation id="780301667611848630">No, gracias</translation>
 <translation id="7829298379596169484">Accediendo a la entrada de audio</translation>
+<translation id="7837582000577464779">Se ha producido un error al procesar tu pedido. Comprueba tu cuenta y vuelve a intentarlo.</translation>
+<translation id="7840369537802583269">Detecta y reproduce el contenido multimedia importante de un sitio web específico.</translation>
 <translation id="7846076177841592234">Cancelar selección</translation>
 <translation id="7851858861565204677">Otros dispositivos</translation>
 <translation id="7876243839304621966">Eliminar todo</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">Es posible que el contenido (películas, música, etc.) descargado en otras aplicaciones no se pueda reproducir hasta que esas aplicaciones no vuelvan a adquirir licencias basadas en una nueva credencial de dispositivo.
 
 Para obtener nuevas licencias, conéctate a Internet y reproduce el contenido descargado.</translation>
+<translation id="8636825310635137004">Activa la sincronización para ver tus pestañas en otros dispositivos.</translation>
 <translation id="8660471606262461360">De Google Payments</translation>
 <translation id="8676374126336081632">Borrar entrada</translation>
 <translation id="869891660844655955">Fecha de caducidad</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
index e3ff90d..64ca7ac 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">‏Chrome باید به میکروفون دسترسی داشته باشد تا آن را با این سایت به اشتراک بگذارد.</translation>
 <translation id="1080790410959514870">‏در حال خروج از حسابی هستید که توسط <ph name="DOMAIN_NAME" /> مدیریت می‌شود. این کار داده‌های Chrome ذخیره شده در این دستگاه را حذف خواهد کرد، اما داده‌ها در حساب Google شما باقی خواهد ماند.</translation>
 <translation id="1098052486217676340">پایان یافت</translation>
+<translation id="1111673857033749125">نشانک‌های ذخیره‌شده در سایر دستگاه‌های شما در اینجا نشان داده می‌شوند.</translation>
 <translation id="1121094540300013208">آمار استفاده و گزارش‌های خرابی</translation>
 <translation id="1137305377394488060">ساعت گذشته</translation>
 <translation id="1178581264944972037">مکث</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">این سایت هرگز ترجمه نشود</translation>
 <translation id="1291207594882862231">پاک کردن سابقه، کوکی‌ها، داده‌های سایت، حافظه پنهان…</translation>
 <translation id="129553762522093515">اخیراً بسته شده</translation>
+<translation id="1326317727527857210">‏برای دسترسی به برگه‌هایتان در دستگاه‌های دیگر، به سیستم Chrome وارد شوید.</translation>
 <translation id="13410144310025252">‏آنها را در Chrome ببینید</translation>
 <translation id="1369915414381695676">سایت <ph name="SITE_NAME" /> اضافه شد</translation>
 <translation id="1373696734384179344">حافظه برای بارگیری محتوای انتخابی کافی نیست.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">فیلتر</translation>
 <translation id="2315043854645842844">انتخاب گواهی سمت کلاینت توسط سیستم‌عامل پشتیبانی نمی‌شود.</translation>
 <translation id="2321958826496381788">لغزنده را بکشید تا زمانی که بتوانید این متن را به راحتی بخوانید. بعد از دو ضربه متوالی روی یک پاراگراف، اندازه نوشتار حداقل باید به این بزرگی باشد.</translation>
+<translation id="2331464965008647960">‏دستگاه‌های نزدیک شما درحال پخش صفحه‌های وب ازطریق بلوتوث هستند. وقتی دستگاهتان را فعال می‌کنید، Chrome برای صفحه‌های وب جستجو می‌کند و آن‌ها را نشان می‌دهد. برای بهبود کیفیت نتایج صفحه، این صفحه‌ها از طریق یک سرویس Google ارائه می‌شوند.
+
+می‌توانید «وب فیزیکی» را در «تنظیمات Chrome» کنترل کنید.
+
+<ph name="BEGIN_LINK" />بیشتر بدانید<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">در حال نصب…</translation>
 <translation id="2351097562818989364">تنظیمات ترجمه شما بازنشانی شده است.</translation>
 <translation id="2359808026110333948">ادامه</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">‏پیشنهاد ترجمه صفحه‌ها با استفاده از Google Translate</translation>
 <translation id="3089395242580810162">باز کردن در برگه ناشناس</translation>
 <translation id="3090193911106258841">در حال دسترسی به ورودی صوتی و ویدیویی</translation>
+<translation id="3117051980354074377">‏برای دسترسی به نشانک‌هایتان در دستگاه‌های دیگر، به سیستم Chrome وارد شوید.</translation>
 <translation id="3137521801621304719">خروج از حالت ناشناس</translation>
 <translation id="3149891296864842641">گزینه ارسال</translation>
 <translation id="3162882791484435636">انتخاب گزینه ارسال</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">اطلاعات حقوقی</translation>
 <translation id="4089831646916293264">ممکن است این قابلیت با دسترسی به خدمات داده‌های برتر ارائه شده توسط شرکت مخابراتی شما تداخل داشته باشد.</translation>
 <translation id="4099578267706723511">‏‫با ارسال آمار کاربرد و گزارش‌های خرابی به Google، به بهتر شدن Chrome کمک کنید.</translation>
+<translation id="410351446219883937">پخش خودکار</translation>
 <translation id="411254640334432676">بارگیری نشد.</translation>
 <translation id="4113030288477039509">مدیریت شده توسط سرپرست‌تان</translation>
 <translation id="4165986682804962316">تنظیمات سایت</translation>
@@ -372,6 +381,7 @@
 <translation id="6042308850641462728">بیشتر</translation>
 <translation id="604996488070107836">به‌دلیل خطایی ناشناخته، بارگیری <ph name="FILE_NAME" /> انجام نشد.</translation>
 <translation id="605721222689873409">سال</translation>
+<translation id="605904398899306450">سایت‌ها مجاز به پخش خودکار رسانه مهم (توصیه می‌شود)</translation>
 <translation id="6075798973483050474">ویرایش صفحه اصلی</translation>
 <translation id="6108923351542677676">تنظیم در حال انجام است...</translation>
 <translation id="6112702117600201073">درحال بازخوانی صفحه</translation>
@@ -408,6 +418,7 @@
 <translation id="6550675742724504774">گزینه‌ها</translation>
 <translation id="656628257199996201"><ph name="SOURCE_LANGUAGE" /> همیشه ترجمه شود</translation>
 <translation id="6571070086367343653">ویرایش کارت اعتباری</translation>
+<translation id="6573431926118603307">‏برگه‌هایی که در دستگاه‌های دیگر در Chrome باز کرده‌اید، در اینجا نمایان می‌شوند.</translation>
 <translation id="6575643671698722332">بازنشانی انجام نشد. مطمئن شوید دستگاهتان آنلاین است و دوباره امتحان کنید.</translation>
 <translation id="6600954340915313787">‏کپی در Chrome</translation>
 <translation id="6612358246767739896">محتوای محافظت‌شده</translation>
@@ -510,6 +521,8 @@
 <translation id="7791543448312431591">افزودن</translation>
 <translation id="780301667611848630">نه متشکرم</translation>
 <translation id="7829298379596169484">در حال دسترسی به ورودی صوتی</translation>
+<translation id="7837582000577464779">هنگام پردازش سفارش شما خطایی رخ داد. لطفاً حسابتان را بررسی کرده و دوباره امتحان کنید.</translation>
+<translation id="7840369537802583269">شناسایی و بازپخش رسانه مهم برای یک سایت خاص.</translation>
 <translation id="7846076177841592234">لغو انتخاب</translation>
 <translation id="7851858861565204677">دستگاه‌های دیگر</translation>
 <translation id="7876243839304621966">حذف همه</translation>
@@ -566,6 +579,7 @@
 <translation id="862875433388403934">شاید دیگر محتوای بارگیری‌شده (فیلم‌ها، موسیقی و غیره) در برنامه‌های دیگر قابل پخش نباشد، مگر آنکه آن برنامه‌ها مجدداً مجوزها را براساس اعتبارنامه دستگاه جدید بدست آورند.
 
 برای بدست آوردن مجوزهای جدید، به اینترنت وصل شوید و محتوای بارگیری‌شده خودتان را پخش کنید.</translation>
+<translation id="8636825310635137004">برای دسترسی به برگه‌هایتان در دستگاه‌های دیگر، همگام‌سازی را روشن کنید.</translation>
 <translation id="8660471606262461360">‏از Google Payments</translation>
 <translation id="8676374126336081632">پاک کردن ورودی</translation>
 <translation id="869891660844655955">تاریخ انقضا</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
index 76e22150..852eaf1 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Chrome tarvitsee mikrofonin käyttöoikeuden voidakseen jakaa sen tämän sivuston kanssa.</translation>
 <translation id="1080790410959514870">Olet kirjautumassa ulos tilistä, jota hallinnoi <ph name="DOMAIN_NAME" />. Laitteelle tallennetut Chrome-tiedot poistetaan, mutta ne säilytetään Google-tililläsi.</translation>
 <translation id="1098052486217676340">Päättyi</translation>
+<translation id="1111673857033749125">Muilla laitteilla tallentamasi kirjanmerkit näytetään täällä.</translation>
 <translation id="1121094540300013208">Käyttö- ja virheraportit</translation>
 <translation id="1137305377394488060">viimeisen tunnin ajalta</translation>
 <translation id="1178581264944972037">Tauko</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Älä käännä tätä sivustoa</translation>
 <translation id="1291207594882862231">Tyhjennä historia, evästeet, sivustojen tiedot, välimuisti ja niin edelleen.</translation>
 <translation id="129553762522093515">Hiljattain suljetut välilehdet</translation>
+<translation id="1326317727527857210">Käytä välilehtiä muilta laitteiltasi kirjautumalla Chromeen.</translation>
 <translation id="13410144310025252">Tarkastele niitä Chromessa.</translation>
 <translation id="1369915414381695676">Sivusto <ph name="SITE_NAME" /> lisättiin.</translation>
 <translation id="1373696734384179344">Liian vähän muistia valitun sisällön lataamiseen.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Tarkenna</translation>
 <translation id="2315043854645842844">Käyttöjärjestelmä ei tue palvelimen varmennevalintaa.</translation>
 <translation id="2321958826496381788">Vedä liukusäädintä, kunnes voit lukea tämän mukavasti. Tekstin tulisi olla vähintään näin suurta kaksoisnapautettuasi kappaletta.</translation>
+<translation id="2331464965008647960">Lähelläsi olevat laitteet lähettävät verkkosivuja Bluetoothin kautta. Kun herätät laitteen lepotilasta, Chrome etsii sivuja ja näyttää ne. Tulosten laatua parannetaan käsittelemällä sivut Google-palvelussa.
+
+Voit hallinnoida Fyysisen webin ominaisuuksia Chromen asetuksissa.
+
+<ph name="BEGIN_LINK" />Lisätietoja<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Asennetaan…</translation>
 <translation id="2351097562818989364">Käännösasetukset on nollattu.</translation>
 <translation id="2359808026110333948">Jatka</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Tarjoa sivujen kääntämistä Google Kääntäjällä.</translation>
 <translation id="3089395242580810162">Avaa incognito-välilehdessä</translation>
 <translation id="3090193911106258841">Ääni- ja videotuloa käytetään</translation>
+<translation id="3117051980354074377">Käytä kirjanmerkkejä muilta laitteiltasi kirjautumalla Chromeen.</translation>
 <translation id="3137521801621304719">Poistu incognito-tilasta</translation>
 <translation id="3149891296864842641">Toimitustapa</translation>
 <translation id="3162882791484435636">Valitse toimitustapa</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Oikeudelliset tiedot</translation>
 <translation id="4089831646916293264">Tämä ominaisuus voi häiritä operaattorisi tarjoamien premium-tietopalveluiden käyttöä.</translation>
 <translation id="4099578267706723511">Auta parantamaan Chromea lähettämällä käyttötilastoja ja virheraportteja Googlelle.</translation>
+<translation id="410351446219883937">Automaattinen toisto</translation>
 <translation id="411254640334432676">Lataus epäonnistui.</translation>
 <translation id="4113030288477039509">Järjestelmänvalvojasi hallinnoima</translation>
 <translation id="4165986682804962316">Sivustoasetukset</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">Lisää</translation>
 <translation id="604996488070107836">Tiedoston <ph name="FILE_NAME" /> lataus epäonnistui tuntemattoman virheen vuoksi.</translation>
 <translation id="605721222689873409">VV</translation>
+<translation id="605904398899306450">Sallii sivustojen toistaa tärkeitä mediatiedostoja automaattisesti (suositus).</translation>
 <translation id="6075798973483050474">Muokkaa etusivua</translation>
 <translation id="6108923351542677676">Synkronointia valmistellaan…</translation>
 <translation id="6112702117600201073">Sivun päivittäminen</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">Asetukset</translation>
 <translation id="656628257199996201">Käännä aina <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="6571070086367343653">Luottokortin muokkaus</translation>
+<translation id="6573431926118603307">Muilla laitteilla Chromessa avaamasi välilehdet näytetään täällä.</translation>
 <translation id="6575643671698722332">Nollaus epäonnistui. Varmista verkkoyhteys ja yritä uudelleen.</translation>
 <translation id="6600954340915313787">Kopioitiin Chromeen.</translation>
 <translation id="6612358246767739896">Suojattu sisältö</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">Lisää</translation>
 <translation id="780301667611848630">Ei kiitos</translation>
 <translation id="7829298379596169484">Äänituloa käytetään</translation>
+<translation id="7837582000577464779">Tilauksen käsittelyssä tapahtui virhe. Tarkista tilisi ja yritä uudelleen.</translation>
+<translation id="7840369537802583269">Tunnista ja toista tietyn sivuston tärkeät mediatiedostot.</translation>
 <translation id="7846076177841592234">Peruuta valinta</translation>
 <translation id="7851858861565204677">Muut laitteet</translation>
 <translation id="7876243839304621966">Poista kaikki</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">Muissa sov. ladattua sisältöä (esim. elokuvia, musiikkia) ei ehkä voi toistaa ennen käyttöoik. myöntämistä sovellukselle uudell. uusien laitteen kirjautumistiet. perust.
 
 Hanki uudet käyttöoik. muodostam. verkkoyhteys ja toistamalla ladattu sisältö.</translation>
+<translation id="8636825310635137004">Ota synkronointi käyttöön, niin voit käyttää välilehtiäsi kaikilla laitteilla.</translation>
 <translation id="8660471606262461360">Google Paymentsista</translation>
 <translation id="8676374126336081632">Tyhjennä teksti</translation>
 <translation id="869891660844655955">Vanhenemispäivämäärä</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
index 528db2d..6d8d3db8 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Kailangan ng Chrome ng access sa mikropono upang maibahagi ito sa site na ito.</translation>
 <translation id="1080790410959514870">Nagsa-sign out ka sa isang account na pinamamahalaan ng <ph name="DOMAIN_NAME" />. Ide-delete nito ang data ng Chrome na nakaimbak sa device na ito, ngunit mananatili ang data sa iyong Google Account.</translation>
 <translation id="1098052486217676340">Tapos na</translation>
+<translation id="1111673857033749125">Dito lalabas ang mga naka-save na bookmark sa iba mo pang mga device.</translation>
 <translation id="1121094540300013208">Mga ulat sa paggamit at pag-crash</translation>
 <translation id="1137305377394488060">nakalipas na oras</translation>
 <translation id="1178581264944972037">I-pause</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Huwag isalin kailanman ang site na ito</translation>
 <translation id="1291207594882862231">I-clear ang history, cookies, site data, cache…</translation>
 <translation id="129553762522093515">Kamakailang isinara</translation>
+<translation id="1326317727527857210">Upang makuha ang iyong mga tab mula sa iba mo pang mga device, mag-sign in sa Chrome.</translation>
 <translation id="13410144310025252">Tingnan ang mga ito sa Chrome</translation>
 <translation id="1369915414381695676">Nadagdag na ang site ng <ph name="SITE_NAME" /></translation>
 <translation id="1373696734384179344">Hindi sapat ang memory upang ma-download ang napiling content.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Pinuhin</translation>
 <translation id="2315043854645842844">Hindi sinusuportahan ng operating system ang pagpipilian ng certificate sa panig ng kliyente.</translation>
 <translation id="2321958826496381788">I-drag ang slider hanggang sa mabasa mo ito nang kumportable. Dapat ay halos ganito kalaki ang text pagkatapos mag-double tap sa isang talata.</translation>
+<translation id="2331464965008647960">May mga device na malapit sa iyo na nagbo-broadcast ng mga web page sa pamamagitan ng Bluetooth. Mag-ii-scan ang Chrome ng mga page at ipapakita ang mga ito sa iyo kapag ginamit mo ang iyong device. Dadaan ang mga page na ito sa isang serbisyo ng Google upang pahusayin ang kalidad ng mga resulta ng page.
+
+Makokontrol mo ang Pisikal na Web sa Mga Setting ng Chrome.
+
+<ph name="BEGIN_LINK" />Matuto nang higit pa<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Ini-install…</translation>
 <translation id="2351097562818989364">Na-reset ang iyong mga setting sa pag-translate.</translation>
 <translation id="2359808026110333948">Magpatuloy</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Mag-alok na magsalin ng mga page sa pamamagitan ng Google Translate</translation>
 <translation id="3089395242580810162">Buksan sa tab na incognito</translation>
 <translation id="3090193911106258841">Ina-access ang input ng audio at video</translation>
+<translation id="3117051980354074377">Upang mailagay ang iyong mga bookmark sa iba mo pang mga device, mag-sign in sa Chrome.</translation>
 <translation id="3137521801621304719">Umalis sa mode na incognito</translation>
 <translation id="3149891296864842641">Opsyon sa pagpapadala</translation>
 <translation id="3162882791484435636">Pumili ng opsyon sa pagpapadala</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Impormasyong legal</translation>
 <translation id="4089831646916293264">Maaaring makasagabal ang feature na ito sa pag-access ng mga premium na data service mula sa iyong carrier.</translation>
 <translation id="4099578267706723511">Tulungang mapahusay ang Chrome sa pamamagitan ng pagpapadala sa Google ng mga istatistika ng paggamit at ulat ng pag-crash.</translation>
+<translation id="410351446219883937">I-autoplay</translation>
 <translation id="411254640334432676">Hindi na-download.</translation>
 <translation id="4113030288477039509">Pinamamahalaan ng iyong administrator</translation>
 <translation id="4165986682804962316">Mga setting ng site</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">Higit pa</translation>
 <translation id="604996488070107836">Hindi na-download ang <ph name="FILE_NAME" /> dahil sa isang hindi alam na error.</translation>
 <translation id="605721222689873409">YY</translation>
+<translation id="605904398899306450">Payagan ang mga site na mag-autoplay ng mahalagang media (inirerekomenda)</translation>
 <translation id="6075798973483050474">I-edit ang home page</translation>
 <translation id="6108923351542677676">Kasalukuyang sine-setup…</translation>
 <translation id="6112702117600201073">Nire-refresh ang page</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">Mga Pagpipilian</translation>
 <translation id="656628257199996201">Palaging isalin ang <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="6571070086367343653">I-edit ang credit card</translation>
+<translation id="6573431926118603307">Dito lalabas ang mga nabuksan mong tab sa Chrome sa iba mo pang mga device.</translation>
 <translation id="6575643671698722332">Hindi nakapag-reset. Tiyaking online ang iyong device at subukang muli.</translation>
 <translation id="6600954340915313787">Kinopya sa Chrome</translation>
 <translation id="6612358246767739896">Pinoprotektahang content</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">Magdagdag</translation>
 <translation id="780301667611848630">Hindi salamat</translation>
 <translation id="7829298379596169484">Ina-access ang input ng audio</translation>
+<translation id="7837582000577464779">Nagkaroon ng error sa pagpoproseso ng iyong order.  Pakitingnan ang iyong account at subukang muli.</translation>
+<translation id="7840369537802583269">Tumukoy at mag-playback ng mahalagang media para sa isang partikular na site.</translation>
 <translation id="7846076177841592234">Kanselahin ang pinili</translation>
 <translation id="7851858861565204677">Iba pang mga device</translation>
 <translation id="7876243839304621966">Alisin lahat</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">Ang content (mga pelikula, musika, atbp.) na na-download sa iba pang mga application ay maaaring hindi na ma-play hanggang sa muling makakuha ang mga application na iyon ng mga lisensya batay sa bagong kredensyal ng device.
 
 Upang makakuha ng mga bagong lisensya, kumonekta sa internet at i-play ang iyong na-download na content.</translation>
+<translation id="8636825310635137004">Upang makuha ang iyong mga tab mula sa iba mo pang mga device, i-on ang pag-sync.</translation>
 <translation id="8660471606262461360">Mula sa Google Payments</translation>
 <translation id="8676374126336081632">I-clear ang input</translation>
 <translation id="869891660844655955">Expiration date</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
index fe0e79d..29240f5 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Chrome doit disposer de l'accès au micro pour le partager avec ce site.</translation>
 <translation id="1080790410959514870">Vous vous déconnectez d'un compte géré par <ph name="DOMAIN_NAME" />. Cette opération va entraîner la suppression des données Chrome stockées sur l'appareil, mais celles-ci seront conservées dans votre compte Google.</translation>
 <translation id="1098052486217676340">Terminé</translation>
+<translation id="1111673857033749125">Les favoris enregistrés sur vos autres appareils s'affichent ici.</translation>
 <translation id="1121094540300013208">Statistiques d'utilisation et rapports d'erreur</translation>
 <translation id="1137305377394488060">de la dernière heure</translation>
 <translation id="1178581264944972037">Suspendre</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Ne jamais traduire ce site</translation>
 <translation id="1291207594882862231">Effacer l'historique, vider le cache, supprimer les cookies et les données du site…</translation>
 <translation id="129553762522093515">Récemment fermés</translation>
+<translation id="1326317727527857210">Connectez-vous à Chrome pour accéder à vos onglets sur vos autres appareils.</translation>
 <translation id="13410144310025252">Affichez-les dans Chrome.</translation>
 <translation id="1369915414381695676">Site "<ph name="SITE_NAME" />" ajouté</translation>
 <translation id="1373696734384179344">Mémoire insuffisante pour télécharger le contenu sélectionné.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Affiner</translation>
 <translation id="2315043854645842844">La sélection de certificat côté client n'est pas compatible avec le système d'exploitation.</translation>
 <translation id="2321958826496381788">Faites glisser le curseur pour lire le texte aisément. Sa taille doit être similaire à celle-ci lorsque vous appuyez deux fois sur un paragraphe.</translation>
+<translation id="2331464965008647960">Des appareils à proximité diffusent des pages Web via le Bluetooth. Chrome recherche les pages à proximité et les affiche lorsque vous réactivez votre l'appareil. Ces pages sont analysées par un service Google pour améliorer la qualité des résultats.
+
+Vous pouvez contrôler le Web physique dans les paramètres de Chrome.
+
+<ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Installation…</translation>
 <translation id="2351097562818989364">Les paramètres de traduction ont été réinitialisés.</translation>
 <translation id="2359808026110333948">Continuer</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Proposer de traduire des pages avec Google Traduction</translation>
 <translation id="3089395242580810162">Ouvrir dans un onglet de nav. privée</translation>
 <translation id="3090193911106258841">Accès à l'entrée audio et vidéo en cours…</translation>
+<translation id="3117051980354074377">Connectez-vous à Chrome pour accéder à vos favoris sur vos autres appareils.</translation>
 <translation id="3137521801621304719">Désactiver le mode navigation privée</translation>
 <translation id="3149891296864842641">Option d'expédition</translation>
 <translation id="3162882791484435636">Sélectionner une option d'expédition</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Informations légales</translation>
 <translation id="4089831646916293264">Cette fonctionnalité peut perturber l'accès aux services de données premium fournis par votre opérateur.</translation>
 <translation id="4099578267706723511">Envoyez des statistiques d'utilisation et des rapports d'erreur pour améliorer Chrome.</translation>
+<translation id="410351446219883937">Lecture automatique</translation>
 <translation id="411254640334432676">Échec du téléchargement.</translation>
 <translation id="4113030288477039509">Géré par votre administrateur</translation>
 <translation id="4165986682804962316">Paramètres du site</translation>
@@ -374,6 +383,7 @@
 <translation id="6042308850641462728">Plus</translation>
 <translation id="604996488070107836">Échec du téléchargement du fichier "<ph name="FILE_NAME" />" en raison d'une erreur inconnue.</translation>
 <translation id="605721222689873409">AA</translation>
+<translation id="605904398899306450">Autoriser les sites à lire automatiquement les fichiers multimédias importants (recommandé)</translation>
 <translation id="6075798973483050474">Modifier la page d'accueil</translation>
 <translation id="6108923351542677676">Configuration en cours…</translation>
 <translation id="6112702117600201073">Actualisation de la page</translation>
@@ -410,6 +420,7 @@
 <translation id="6550675742724504774">Options</translation>
 <translation id="656628257199996201">Toujours traduire les pages en <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="6571070086367343653">Modifier la carte de paiement</translation>
+<translation id="6573431926118603307">Les onglets que vous avez ouverts dans Chrome sur vos autres appareils s'affichent ici.</translation>
 <translation id="6575643671698722332">Échec de la réinitialisation. Veuillez vous assurer que l'appareil connecté, puis réessayez.</translation>
 <translation id="6600954340915313787">Copiée dans Chrome</translation>
 <translation id="6612358246767739896">Contenu protégé</translation>
@@ -512,6 +523,8 @@
 <translation id="7791543448312431591">Ajouter</translation>
 <translation id="780301667611848630">Non merci</translation>
 <translation id="7829298379596169484">Accès à l'entrée audio en cours…</translation>
+<translation id="7837582000577464779">Une erreur s'est produite lors du traitement de votre commande. Veuillez vérifier votre compte, puis réessayer.</translation>
+<translation id="7840369537802583269">Détecter et lire les fichiers multimédias importants pour un site spécifique.</translation>
 <translation id="7846076177841592234">Annuler la sélection</translation>
 <translation id="7851858861565204677">Autres appareils</translation>
 <translation id="7876243839304621966">Tout supprimer</translation>
@@ -568,6 +581,7 @@
 <translation id="862875433388403934">Il se peut que le contenu (films, musique, etc.) téléchargé dans d'autres applications ne soit plus lisible tant que ces applications n'ont pas obtenu de nouvelles licences sur la base d'un nouvel identifiant d'appareil.
 
 Pour obtenir de nouvelles licences, connectez-vous à Internet et lisez le contenu que vous avez téléchargé.</translation>
+<translation id="8636825310635137004">Activez la synchronisation pour accéder à vos onglets sur vos autres appareils.</translation>
 <translation id="8660471606262461360">Informations issues de Google Payments</translation>
 <translation id="8676374126336081632">Effacer la saisie</translation>
 <translation id="869891660844655955">Date d'expiration</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
index 2e07c7b..344dc5c15 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Chrome को माइक्रोफ़ोन ऐक्सेस की आवश्यकता है ताक‍ि माइक्रोफ़ोन को इस साइट के साथ साझा किया जा सके.</translation>
 <translation id="1080790410959514870">आप <ph name="DOMAIN_NAME" /> द्वारा प्रबंधित खाते से प्रस्थान कर रहे हैं. इससे इस डिवाइस पर संग्रहीत Chrome डेटा हट जाएगा, लेकिन डेटा आपके Google खाते में बना रहेगा.</translation>
 <translation id="1098052486217676340">समाप्त</translation>
+<translation id="1111673857033749125">आपके अन्‍य डिवाइस पर सहेजे गए बुकमार्क यहां दिखाई देंगे.</translation>
 <translation id="1121094540300013208">उपयोग और क्रैश रिपोर्ट</translation>
 <translation id="1137305377394488060">पिछला घंटा</translation>
 <translation id="1178581264944972037">पॉज़ करें</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">कभी भी इस साइट का अनुवाद न करें</translation>
 <translation id="1291207594882862231">इतिहास, कुकी, साइट डेटा, संचय साफ़ करें…</translation>
 <translation id="129553762522093515">हाल ही में बंद किए गए</translation>
+<translation id="1326317727527857210">अपने अन्य डिवाइस से अपने टैब प्राप्त करने के लिए, Chrome में प्रवेश करें.</translation>
 <translation id="13410144310025252">उन्हें Chrome में देखें</translation>
 <translation id="1369915414381695676"><ph name="SITE_NAME" /> साइट जोड़ी गई</translation>
 <translation id="1373696734384179344">चयनित सामग्री डाउनलोड करने के लिए मेमोरी अपर्याप्‍त है.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">परिशोधित करें</translation>
 <translation id="2315043854645842844">क्लाइंट-साइड प्रमाणपत्र चयन ऑपरेटिंग सिस्टम के द्वारा समर्थित नहीं है.</translation>
 <translation id="2321958826496381788">स्‍लाइडर को तब तक खींचें, जब तक कि आपको इसे पढ़ने में सुविधा न हो. पैराग्राफ़ पर डबल-टैप करने के बाद लेख को इतना बड़ा दिखाई देना चाहिए.</translation>
+<translation id="2331464965008647960">आपके आस-पास के डिवाइस वेबपृष्‍ठों को ब्लूटूथ पर प्रसारित कर रहे हैं. जब आप अपने डिवाइस को सक्रिय करेंगे तो Chrome पृष्ठों के लिए स्कैन करेगा और उन्हें प्रदर्शित करेगा. पृष्ठ परिणामों की गुणवत्ता को बेहतर बनाने के लिए ये पृष्ठ Google सेवा से होकर गुजरेंगे.
+
+आप शारीरिक वेब को Chrome सेटिंग में नियंत्रित कर सकते हैं.
+
+<ph name="BEGIN_LINK" />अधिक जानें<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">इंस्टॉल जारी...</translation>
 <translation id="2351097562818989364">आपकी अनुवाद सेटिंग रीसेट कर दी गई हैं.</translation>
 <translation id="2359808026110333948">जारी रखें</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Google अनुवाद का उपयोग करके पृष्ठों का अनुवाद ऑफ़र करें</translation>
 <translation id="3089395242580810162">गुप्त टैब में खोलें</translation>
 <translation id="3090193911106258841">ऑडियो और वीडियो इनपुट ऐक्सेस हो रहा है</translation>
+<translation id="3117051980354074377">अपने अन्य डिवाइस पर अपने बुकमार्क प्राप्‍त करने के लिए, Chrome में प्रवेश करें.</translation>
 <translation id="3137521801621304719">गुप्त मोड छोड़ें</translation>
 <translation id="3149891296864842641">शिपिंग विकल्प</translation>
 <translation id="3162882791484435636">शिपिंग विकल्प चुनें</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">वैधानिक जानकारी</translation>
 <translation id="4089831646916293264">यह सुविधा आपके वाहक द्वारा प्रदान की जाने वाली प्रीमियम डेटा सुविधाओं की ऐक्‍सेस में हस्तक्षेप कर सकती है.</translation>
 <translation id="4099578267706723511">Google को उपयोग के आंकड़े और क्रैश रिपोर्ट भेजकर Chrome को बेहतर बनाने में सहायता करें.</translation>
+<translation id="410351446219883937">स्वतः चलाएं</translation>
 <translation id="411254640334432676">डाउनलोड विफल रहा.</translation>
 <translation id="4113030288477039509">आपके व्यवस्थापक द्वारा प्रबंधित</translation>
 <translation id="4165986682804962316">साइट सेटिंग</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">अधिक</translation>
 <translation id="604996488070107836">किसी अज्ञात त्रुटि के कारण <ph name="FILE_NAME" /> का डाउनलोड विफल रहा.</translation>
 <translation id="605721222689873409">YY</translation>
+<translation id="605904398899306450">साइटों को महत्वपूर्ण मीडिया स्वतः चलाने दें (अनुशंसित)</translation>
 <translation id="6075798973483050474">मुखपृष्ठ संपादित करें</translation>
 <translation id="6108923351542677676">सेटअप प्रगति में है…</translation>
 <translation id="6112702117600201073">पृष्‍ठ रीफ्रेश किया जा रहा है</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">विकल्प</translation>
 <translation id="656628257199996201"><ph name="SOURCE_LANGUAGE" /> का हमेशा अनुवाद करें</translation>
 <translation id="6571070086367343653">क्रेडिट कार्ड संपादित करें</translation>
+<translation id="6573431926118603307">आपके द्वारा अपने अन्य डिवाइस पर खोले गए टैब यहां दिखाई देंगे.</translation>
 <translation id="6575643671698722332">रीसेट विफल रहा. डिवाइस ऑनलाइन होना सुनिश्चित करें और पुन: प्रयास करें.</translation>
 <translation id="6600954340915313787">Chrome पर कॉपी किया गया</translation>
 <translation id="6612358246767739896">सुरक्षित सामग्री</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">जोड़ें</translation>
 <translation id="780301667611848630">जी नहीं, रहने दें </translation>
 <translation id="7829298379596169484">ऑडियो इनपुट ऐक्सेस हो रहा है</translation>
+<translation id="7837582000577464779">आपका आदेश संसाधित करने में कोई त्रुटि हुई.  कृपया अपना खाता जांचें और पुनः प्रयास करें.</translation>
+<translation id="7840369537802583269">विशिष्ट साइट के लिए महत्वपूर्ण मीडिया का पता लगाएं और प्लेबैक करें.</translation>
 <translation id="7846076177841592234">चयन हटाएं</translation>
 <translation id="7851858861565204677">अन्य डिवाइस</translation>
 <translation id="7876243839304621966">सभी को निकालें</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">अन्य ऐप्लिकेशन में डाउनलोड की गई सामग्री (फ़िल्में, संगीत, आदि) तब तक चलाने योग्य नहीं हो सकती, जब तक कि वे ऐप्लिकेशन नए डिवाइस प्रमाणिकता पर आधारित लाइसेंस पुन: प्राप्त नहीं कर लेते.
 
 नए लाइसेंस प्राप्त करने के लिए, इंटरनेट से कनेक्ट करें और अपनी डाउनलोड की गई सामग्री चलाएं.</translation>
+<translation id="8636825310635137004">अपने अन्य डिवाइस से अपने टैब प्राप्त करने के लिए, समन्वयन चालू करें.</translation>
 <translation id="8660471606262461360">Google पेमेंट्स से</translation>
 <translation id="8676374126336081632">इनपुट साफ़ करें</translation>
 <translation id="869891660844655955">समय समाप्ति दिनांक</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
index a447b2fa..8fb71de 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Chrome treba imati pristup mikrofonu da bi ga dijelio s ovom web-lokacijom.</translation>
 <translation id="1080790410959514870">Odjavljujete se s računa kojim upravlja <ph name="DOMAIN_NAME" />. Time će se izbrisati podaci preglednika Chrome pohranjeni na ovom uređaju, ali ti će podaci ostati na vašem Google računu.</translation>
 <translation id="1098052486217676340">Završeno</translation>
+<translation id="1111673857033749125">Ovdje će se prikazivati oznake koje ste spremili na drugim uređajima.</translation>
 <translation id="1121094540300013208">Izvješća o upotrebi i rušenju programa</translation>
 <translation id="1137305377394488060">od proteklog sata</translation>
 <translation id="1178581264944972037">Pauziraj</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Nikad nemoj prevoditi ovu web-lokaciju</translation>
 <translation id="1291207594882862231">Brisanje povijesti, kolačića, podataka web-lokacija, predmemorije...</translation>
 <translation id="129553762522093515">Nedavno zatvoreno</translation>
+<translation id="1326317727527857210">Da bi se prikazale kartice s vaših ostalih uređaja, prijavite se na Chrome.</translation>
 <translation id="13410144310025252">Pogledajte ih u Chromeu</translation>
 <translation id="1369915414381695676">Dodana je web-lokacija <ph name="SITE_NAME" /></translation>
 <translation id="1373696734384179344">Nema dovoljno memorije za preuzimanje odabranog sadržaja.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Pročišćavanje</translation>
 <translation id="2315043854645842844">Operativni sustav ne podržava odabir klijentskog certifikata.</translation>
 <translation id="2321958826496381788">Pomičite klizač dok ne budete mogli čitati ovaj tekst bez poteškoća. Tekst bi trebao biti barem ovoliko velik nakon što dvaput dodirnete odlomak.</translation>
+<translation id="2331464965008647960">Uređaji u blizini emitiraju web-stranice Bluetoothom. Chrome će tražiti stranice i prikazati ih kada aktivirate uređaj. Googleova služba obradit će te stranice radi poboljšanja kvalitete rezultata stranica.
+
+Fizičkim webom možete upravljati u Chromeovim postavkama.
+
+<ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Instaliranje…</translation>
 <translation id="2351097562818989364">Vaše su postavke prevođenja vraćene na zadano.</translation>
 <translation id="2359808026110333948">Nastavi</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Ponudi prijevod stranica pomoću Google prevoditelja</translation>
 <translation id="3089395242580810162">Otvori na kartici Anonimno</translation>
 <translation id="3090193911106258841">Pristupanje audio i videoulazu</translation>
+<translation id="3117051980354074377">Da bi se prikazale oznake s vaših ostalih uređaja, prijavite se na Chrome.</translation>
 <translation id="3137521801621304719">Izlaz iz anonimnog načina</translation>
 <translation id="3149891296864842641">Opcija otpreme</translation>
 <translation id="3162882791484435636">Odaberite opciju otpreme</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Pravne informacije</translation>
 <translation id="4089831646916293264">Ta značajka može ometati pristup premium podatkovnim uslugama koje pruža vaš mobilni operater.</translation>
 <translation id="4099578267706723511">Poboljšajte Chrome šaljući Googleu statistike upotrebe i izvješća o rušenju.</translation>
+<translation id="410351446219883937">Automatska reprodukcija</translation>
 <translation id="411254640334432676">Preuzimanje nije uspjelo.</translation>
 <translation id="4113030288477039509">Upravlja vaš administrator</translation>
 <translation id="4165986682804962316">Postavke web-lokacije</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">Više</translation>
 <translation id="604996488070107836">Preuzimanje datoteke <ph name="FILE_NAME" /> nije uspjelo zbog nepoznate pogreške.</translation>
 <translation id="605721222689873409">GG</translation>
+<translation id="605904398899306450">Web-lokacije mogu automatski reproducirati važne medije (preporučeno)</translation>
 <translation id="6075798973483050474">Uređivanje početne stranice</translation>
 <translation id="6108923351542677676">Postavljanje je u tijeku…</translation>
 <translation id="6112702117600201073">Osvježavanje stranice</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">Opcije</translation>
 <translation id="656628257199996201">Uvijek prevodi <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="6571070086367343653">Uređivanje kreditne kartice</translation>
+<translation id="6573431926118603307">Ovdje će se prikazati kartice koje ste otvorili u Chromeu na svojim ostalim uređajima.</translation>
 <translation id="6575643671698722332">Poništavanje nije uspjelo. Provjerite je li uređaj na mreži i ponovite.</translation>
 <translation id="6600954340915313787">Kopirano u Chrome</translation>
 <translation id="6612358246767739896">Zaštićeni sadržaj</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">Dodaj</translation>
 <translation id="780301667611848630">Ne, hvala</translation>
 <translation id="7829298379596169484">Pristupanje audioulazu</translation>
+<translation id="7837582000577464779">Prilikom obrade narudžbe dogodila se pogreška. Provjerite račun i pokušajte ponovo.</translation>
+<translation id="7840369537802583269">Otkrivanje i reprodukcija važnih medija za određenu web-lokaciju.</translation>
 <translation id="7846076177841592234">Poništi odabir</translation>
 <translation id="7851858861565204677">Ostali uređaji</translation>
 <translation id="7876243839304621966">Ukloni sve</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">Preuzeti sadržaj (filmovi, glazba itd.) u drugim aplikacijama možda se više neće moći reproducirati dok te aplikacije ponovo ne dobiju licence na temelju nove vjerodajnice uređaja.
 
 Da biste dobili nove licence, povežite se s internetom i reproducirajte preuzeti sadržaj.</translation>
+<translation id="8636825310635137004">Da bi se prikazale kartice s vaših ostalih uređaja, uključite sinkronizaciju.</translation>
 <translation id="8660471606262461360">S Google Paymentsa</translation>
 <translation id="8676374126336081632">Brisanje unosa</translation>
 <translation id="869891660844655955">Datum isteka</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
index 934b34c..50ed879 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">A Chrome-nak rendelkeznie kell hozzáféréssel a mikrofonhoz, hogy megoszthassa ezzel a webhellyel.</translation>
 <translation id="1080790410959514870">Kijelentkezik egy <ph name="DOMAIN_NAME" /> által felügyelt fiókból. Ezzel törli a Chrome-nak az eszközön tárolt adatait, Google-fiókjában azonban továbbra is megmaradnak.</translation>
 <translation id="1098052486217676340">Befejezve</translation>
+<translation id="1111673857033749125">A más eszközökön mentett könyvjelzők itt jelennek meg.</translation>
 <translation id="1121094540300013208">Használati és hibajelentések</translation>
 <translation id="1137305377394488060">elmúlt óra</translation>
 <translation id="1178581264944972037">Szünet</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Ezt a webhelyet soha ne fordítsa le</translation>
 <translation id="1291207594882862231">Előzmények, cookie-k, webhelyadatok és a gyorsítótár törlése…</translation>
 <translation id="129553762522093515">Mostanában bezárt</translation>
+<translation id="1326317727527857210">Ha hozzá szeretne férni lapjaihoz a többi eszközéről, jelentkezzen be a Chrome-ba.</translation>
 <translation id="13410144310025252">Megtekintés Chrome-ban</translation>
 <translation id="1369915414381695676">A(z) <ph name="SITE_NAME" /> webhely hozzáadva</translation>
 <translation id="1373696734384179344">Nincs elegendő memória a kiválasztott tartalom letöltéséhez.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Pontosítás</translation>
 <translation id="2315043854645842844">Az ügyféloldali tanúsítványválasztást az operációs rendszer nem támogatja.</translation>
 <translation id="2321958826496381788">Húzza a csúszkát, amíg kényelmesen nem tudja olvasni a szöveget; legalább ekkorának kell lennie, miután duplán koppint a bekezdésre.</translation>
+<translation id="2331464965008647960">Az Ön közelében található eszközök weboldalakat sugároznak Bluetooth-on keresztül. A Chrome megkeresi és megjeleníti ezeket a weboldalakat, miután Ön felébresztette eszközét. Ezek az oldalak egy Google-szolgáltatáson mennek keresztül az oldaltalálatok minőségének javítása érdekében.
+
+A Fizikai webet a Chrome-beállításokban szabályozhatja.
+
+<ph name="BEGIN_LINK" />További információ.<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Telepítés…</translation>
 <translation id="2351097562818989364">A fordítási beállítások visszaállítása megtörtént.</translation>
 <translation id="2359808026110333948">Folytatás</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Az oldalak Google Fordítóval történő lefordításának felajánlása</translation>
 <translation id="3089395242580810162">Megnyitás inkognitólapon</translation>
 <translation id="3090193911106258841">Hozzáférés a hang- és videobementhez</translation>
+<translation id="3117051980354074377">Ha a többi eszközén is szeretné elérni könyvjelzőit, jelentkezzen be a Chrome-ba.</translation>
 <translation id="3137521801621304719">Kilépés inkognitómódból</translation>
 <translation id="3149891296864842641">Szállítási lehetőség</translation>
 <translation id="3162882791484435636">Szállítási lehetőség kiválasztása</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Jogi információk</translation>
 <translation id="4089831646916293264">Ez a funkció megakadályozhatja a szolgáltatója által kínált prémium adatszolgáltatásokhoz való hozzáférést.</translation>
 <translation id="4099578267706723511">Használati statisztikák és hibajelentések küldésével segíthet a Google-nak a Chrome fejlesztésében.</translation>
+<translation id="410351446219883937">Automatikus lejátszás</translation>
 <translation id="411254640334432676">A letöltés sikertelen.</translation>
 <translation id="4113030288477039509">A rendszergazdája kezeli</translation>
 <translation id="4165986682804962316">Webhelybeállítások</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">Hosszabban</translation>
 <translation id="604996488070107836">A következő fájl letöltése ismeretlen hiba miatt nem sikerült: <ph name="FILE_NAME" />.</translation>
 <translation id="605721222689873409">ÉÉ</translation>
+<translation id="605904398899306450">Lehetővé teszi a webhelyek számára a fontos médiatartalmak automatikus lejátszását (ajánlott)</translation>
 <translation id="6075798973483050474">Kezdőoldal szerkesztése</translation>
 <translation id="6108923351542677676">A telepítés folyamatban...</translation>
 <translation id="6112702117600201073">Oldal frissítése</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">Beállítások</translation>
 <translation id="656628257199996201">Mindig fordítson <ph name="SOURCE_LANGUAGE" /> nyelvről</translation>
 <translation id="6571070086367343653">Hitelkártya szerkesztése</translation>
+<translation id="6573431926118603307">A más eszközökön futó Chrome böngészőben megnyitott lapok itt jelennek meg.</translation>
 <translation id="6575643671698722332">Nem sikerült. Ellenőrizze a hálózatot, és próbálja újra.</translation>
 <translation id="6600954340915313787">A Chrome-ba másolva</translation>
 <translation id="6612358246767739896">Védett tartalom</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">Hozzáadás</translation>
 <translation id="780301667611848630">Köszönöm, nem</translation>
 <translation id="7829298379596169484">Hozzáférés a hangbemenethez</translation>
+<translation id="7837582000577464779">Hiba történt a megrendelés feldolgozása közben. Ellenőrizze fiókját, majd próbálkozzon újra.</translation>
+<translation id="7840369537802583269">Fontos médiatartalom észlelése és lejátszása egy adott webhely esetében.</translation>
 <translation id="7846076177841592234">Kijelölés törlése</translation>
 <translation id="7851858861565204677">Egyéb eszközök</translation>
 <translation id="7876243839304621966">Összes eltávolítása</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">Az egyéb alkalmazásokban letöltött tartalmakat (filmek, zene stb.) valószínűleg nem lehet majd lejátszani, amíg az egyes alkalmazások új engedélyeket nem kapnak új eszközhitelesítési adatok alapján.
 
 Az új engedélyek beszerzéséhez kapcsolódjon az internethez, és játssza le a letöltött tartalmat.</translation>
+<translation id="8636825310635137004">Ha a többi eszközén is szeretné elérni lapjait, kapcsolja be a szinkronizálást</translation>
 <translation id="8660471606262461360">A Google Payments szolgáltatásból</translation>
 <translation id="8676374126336081632">Beírt szöveg törlése</translation>
 <translation id="869891660844655955">Lejárati dátum</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
index 2cfcf81..9984f02 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Chrome memerlukan akses mikrofon untuk berbagi dengan situs ini.</translation>
 <translation id="1080790410959514870">Anda keluar dari akun yang dikelola oleh <ph name="DOMAIN_NAME" />. Tindakan ini akan menghapus data Chrome yang tersimpan di perangkat ini, namun data akan tetap berada di Akun Google Anda.</translation>
 <translation id="1098052486217676340">Selesai</translation>
+<translation id="1111673857033749125">Bookmark yang tersimpan di perangkat lainnya akan muncul di sini.</translation>
 <translation id="1121094540300013208">Laporan kerusakan dan penggunaan</translation>
 <translation id="1137305377394488060">satu jam terakhir</translation>
 <translation id="1178581264944972037">Jeda</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Jangan pernah terjemahkan situs ini</translation>
 <translation id="1291207594882862231">Menghapus riwayat, cookie, data situs, cache...</translation>
 <translation id="129553762522093515">Barusan ditutup</translation>
+<translation id="1326317727527857210">Untuk mendapatkan tab dari perangkat lainnya, masuk ke Chrome.</translation>
 <translation id="13410144310025252">Lihat di Chrome</translation>
 <translation id="1369915414381695676">Situs <ph name="SITE_NAME" /> ditambahkan</translation>
 <translation id="1373696734384179344">Memori tidak cukup untuk mengunduh konten yang dipilih.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Saring</translation>
 <translation id="2315043854645842844">Pilihan sertifikat sisi klien tidak didukung oleh sistem operasi.</translation>
 <translation id="2321958826496381788">Seret penggeser sampai Anda dapat membacanya dengan nyaman. Teks harus terlihat setidaknya sebesar ini setelah paragraf diketuk dua kali.</translation>
+<translation id="2331464965008647960">Perangkat di sekitar Anda menyiarkan laman web melalui Bluetooth. Chrome akan memindai laman dan menampilkannya saat Anda membangunkan perangkat. Laman ini akan diproses melalui layanan Google untuk meningkatkan kualitas hasil laman.
+
+Anda dapat mengontrol Web Fisik di Setelan Chrome.
+
+<ph name="BEGIN_LINK" />Pelajari lebih lanjut<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Memasang...</translation>
 <translation id="2351097562818989364">Setelan terjemah telah disetel ulang.</translation>
 <translation id="2359808026110333948">Lanjut</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Tawarkan untuk menerjemahkan laman dengan Google Terjemahan</translation>
 <translation id="3089395242580810162">Buka di tab penyamaran</translation>
 <translation id="3090193911106258841">Mengakses masukan audio dan video</translation>
+<translation id="3117051980354074377">Untuk mendapatkan bookmark dari perangkat lainnya, masuk ke Chrome.</translation>
 <translation id="3137521801621304719">Tutup mode penyamaran</translation>
 <translation id="3149891296864842641">Opsi pengiriman</translation>
 <translation id="3162882791484435636">Pilih opsi pengiriman</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Informasi hukum</translation>
 <translation id="4089831646916293264">Fitur ini dapat mengganggu akses ke layanan data premium yang disediakan oleh operator Anda.</translation>
 <translation id="4099578267706723511">Bantu penyempurnaan Chrome dengan mengirimkan statistik penggunaan dan laporan kerusakan ke Google.</translation>
+<translation id="410351446219883937">Putar otomatis</translation>
 <translation id="411254640334432676">Unduhan gagal.</translation>
 <translation id="4113030288477039509">Dikelola oleh administrator</translation>
 <translation id="4165986682804962316">Setelan situs</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">Lainnya</translation>
 <translation id="604996488070107836">Unduhan <ph name="FILE_NAME" /> gagal karena kesalahan tak dikenal.</translation>
 <translation id="605721222689873409">TT</translation>
+<translation id="605904398899306450">Izinkan situs memutar media yang penting secara otomatis (disarankan)</translation>
 <translation id="6075798973483050474">Edit laman beranda</translation>
 <translation id="6108923351542677676">Penyiapan sedang berlangsung...</translation>
 <translation id="6112702117600201073">Menyegarkan laman</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">Opsi</translation>
 <translation id="656628257199996201">Selalu terjemahkan bahasa <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="6571070086367343653">Edit kartu kredit</translation>
+<translation id="6573431926118603307">Tab yang telah dibuka di Chrome pada perangkat lainnya akan muncul di sini.</translation>
 <translation id="6575643671698722332">Gagal menyetel ulang. Pastikan perangkat tersambung ke internet dan coba lagi.</translation>
 <translation id="6600954340915313787">Disalin ke Chrome</translation>
 <translation id="6612358246767739896">Konten dilindungi</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">Tambahkan</translation>
 <translation id="780301667611848630">Lain kali</translation>
 <translation id="7829298379596169484">Mengakses masukan audio</translation>
+<translation id="7837582000577464779">Terjadi kesalahan saat memproses pesanan.  Periksa akun Anda dan coba lagi.</translation>
+<translation id="7840369537802583269">Mendeteksi dan memutar media yang penting untuk situs tertentu.</translation>
 <translation id="7846076177841592234">Batalkan pilihan</translation>
 <translation id="7851858861565204677">Perangkat lain</translation>
 <translation id="7876243839304621966">Hapus semua</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">Konten (film, musik, dsb.) yang diunduh di aplikasi lain mungkin tidak dapat diputar lagi hingga aplikasi tersebut mendapatkan kembali lisensi berdasarkan kredensial perangkat yang baru.
 
 Untuk mendapatkan lisensi baru, sambungkan ke internet dan putar konten yang diunduh.</translation>
+<translation id="8636825310635137004">Untuk mendapatkan tab dari perangkat lainnya, aktifkan sinkronisasi.</translation>
 <translation id="8660471606262461360">Dari Google Payments</translation>
 <translation id="8676374126336081632">Hapus masukan</translation>
 <translation id="869891660844655955">Tanggal kedaluwarsa</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
index d990b79..be00889e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Chrome deve avere accesso al microfono per condividerla con questo sito.</translation>
 <translation id="1080790410959514870">Stai per uscire da un account gestito da <ph name="DOMAIN_NAME" />. Verranno eliminati i dati di Chrome memorizzati su questo dispositivo, ma i dati rimarranno nel tuo account Google.</translation>
 <translation id="1098052486217676340">Terminata</translation>
+<translation id="1111673857033749125">I preferiti salvati sugli altri dispositivi verranno visualizzati qui.</translation>
 <translation id="1121094540300013208">Rapporti sull'utilizzo e sugli arresti anomali</translation>
 <translation id="1137305377394488060">ultima ora</translation>
 <translation id="1178581264944972037">Pausa</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Non tradurre mai questo sito</translation>
 <translation id="1291207594882862231">Cancella la cronologia, i cookie, i dati dei siti, la cache…</translation>
 <translation id="129553762522093515">Chiuse di recente</translation>
+<translation id="1326317727527857210">Accedi a Chrome per trovare le tue schede degli altri dispositivi.</translation>
 <translation id="13410144310025252">Visualizzali in Chrome</translation>
 <translation id="1369915414381695676">Sito <ph name="SITE_NAME" /> aggiunto</translation>
 <translation id="1373696734384179344">Memoria non sufficiente per scaricare i contenuti selezionati.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Perfeziona</translation>
 <translation id="2315043854645842844">La selezione del certificato lato client non è supportata dal sistema operativo.</translation>
 <translation id="2321958826496381788">Trascina il cursore finché leggi il testo senza problemi. Il testo dovrebbe avere queste dimensioni minime quando tocchi due volte un paragrafo.</translation>
+<translation id="2331464965008647960">Alcuni dispositivi nelle tue vicinanze stanno trasmettendo pagine web tramite Bluetooth. Chrome cerca pagine nelle vicinanze quando attivi il tuo dispositivo. Tali pagine passeranno attraverso un servizio di Google per migliorare la qualità dei risultati.
+
+Puoi gestire il Physical Web nelle impostazioni di Chrome.
+
+<ph name="BEGIN_LINK" />Ulteriori informazioni<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Installazione…</translation>
 <translation id="2351097562818989364">Le impostazioni di traduzione sono state reimpostate.</translation>
 <translation id="2359808026110333948">Continua</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Proponi di tradurre le pagine utilizzando Google Traduttore</translation>
 <translation id="3089395242580810162">Apri in scheda in incognito</translation>
 <translation id="3090193911106258841">Accesso all'input audio e video in corso</translation>
+<translation id="3117051980354074377">Accedi a Chrome per trovare i tuoi preferiti degli altri dispositivi.</translation>
 <translation id="3137521801621304719">Esci dalla modalità di navigazione in incognito</translation>
 <translation id="3149891296864842641">Opzione di spedizione</translation>
 <translation id="3162882791484435636">Seleziona un'opzione di spedizione</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Informazioni legali</translation>
 <translation id="4089831646916293264">Questa funzione potrebbe interferire con l'accesso ai servizi di dati premium forniti dal tuo operatore.</translation>
 <translation id="4099578267706723511">Aiutaci a migliorare Chrome inviando a Google statistiche sull'utilizzo e rapporti sugli arresti anomali.</translation>
+<translation id="410351446219883937">Riproduzione automatica</translation>
 <translation id="411254640334432676">Download non riuscito.</translation>
 <translation id="4113030288477039509">Gestito dall'amministratore</translation>
 <translation id="4165986682804962316">Impostazioni sito</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">Più</translation>
 <translation id="604996488070107836">Download del file <ph name="FILE_NAME" /> non riuscito a causa di un errore sconosciuto.</translation>
 <translation id="605721222689873409">AA</translation>
+<translation id="605904398899306450">Consenti ai siti di riprodurre in automatico i video importanti (opzione consigliata)</translation>
 <translation id="6075798973483050474">Modifica Home page</translation>
 <translation id="6108923351542677676">Configurazione in corso…</translation>
 <translation id="6112702117600201073">Aggiornamento della pagina in corso</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">Opzioni</translation>
 <translation id="656628257199996201">Traduci sempre da <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="6571070086367343653">Modifica carta di credito</translation>
+<translation id="6573431926118603307">Le schede aperte in Chrome sugli altri dispositivi verranno visualizzate qui.</translation>
 <translation id="6575643671698722332">Reimpostazione non riuscita. Verifica che il dispositivo sia online e riprova.</translation>
 <translation id="6600954340915313787">Copiata in Chrome</translation>
 <translation id="6612358246767739896">Contenuti protetti</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">Aggiungi</translation>
 <translation id="780301667611848630">No grazie</translation>
 <translation id="7829298379596169484">Accesso all'input audio in corso</translation>
+<translation id="7837582000577464779">Si è verificato un errore durante l'elaborazione dell'ordine. Controlla il tuo conto e riprova.</translation>
+<translation id="7840369537802583269">Rileva e riproduci video importanti per un sito specifico.</translation>
 <translation id="7846076177841592234">Annulla selezione</translation>
 <translation id="7851858861565204677">Altri dispositivi</translation>
 <translation id="7876243839304621966">Rimuovi tutto</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">I contenuti (film, musica e così via) scaricati in altre applicazioni potrebbero non essere riproducibili finché tali applicazioni non riacquistano le licenze in base a nuove credenziali del dispositivo.
 
 Per ottenere nuove licenze, connettiti a Internet e riproduci i contenuti scaricati.</translation>
+<translation id="8636825310635137004">Attiva la sincronizzazione per trovare le tue schede degli altri dispositivi.</translation>
 <translation id="8660471606262461360">Da Google Payments</translation>
 <translation id="8676374126336081632">Cancella testo inserito</translation>
 <translation id="869891660844655955">Data di scadenza</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
index 372a7fac..84c8c2d 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">‏Chrome זקוק לגישה למיקרופון כדי לשתף אותו עם האתר הזה.</translation>
 <translation id="1080790410959514870">‏אתה מתנתק מחשבון המנוהל על ידי <ph name="DOMAIN_NAME" />. הפעולה הזו תמחק את נתוני Chrome המאוחסנים במכשיר הזה, אבל הנתונים יישמרו בחשבון Google שלך.</translation>
 <translation id="1098052486217676340">הסתיים</translation>
+<translation id="1111673857033749125">סימניות שנשמרו במכשירים האחרים שלך יופיעו כאן.</translation>
 <translation id="1121094540300013208">דוחות קריסה ושימוש</translation>
 <translation id="1137305377394488060">מהשעה האחרונה</translation>
 <translation id="1178581264944972037">השהה</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">לעולם אל תתרגם אתר זה</translation>
 <translation id="1291207594882862231">‏נקה את ההיסטוריה, קובצי ה-Cookie, נתוני האתרים, הקובץ השמור…</translation>
 <translation id="129553762522093515">נסגרו לאחרונה</translation>
+<translation id="1326317727527857210">‏כדי לקבל את הכרטיסיות מהמכשירים האחרים שלך, היכנס ל-Chrome.</translation>
 <translation id="13410144310025252">‏הצג אותם ב-Chrome</translation>
 <translation id="1369915414381695676">האתר <ph name="SITE_NAME" /> נוסף</translation>
 <translation id="1373696734384179344">אין מספיק זיכרון להורדת התוכן הנבחר.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">צמצם</translation>
 <translation id="2315043854645842844">מערכת ההפעלה אינה תומכת בבחירת אישור בצד הלקוח.</translation>
 <translation id="2321958826496381788">גרור את המחוון עד שתוכל לקרוא את הקטע הזה בצורה נוחה. לאחר שתקיש פעמיים על פיסקה, הטקסט אמור להיות מוצג בגודל הזה לפחות.</translation>
+<translation id="2331464965008647960">‏בסביבה הקרובה יש מכשירים שמשדרים דפי אינטרנט באמצעות Bluetooth. ‏Chrome יאתר את הדפים האלו בסריקה ויציג אותם כשתוציא את המכשיר ממצב שינה. הדפים יעברו דרך שירות של Google כדי לשפר את איכות התוצאות.
+
+ניתן לשלוט על האינטרנט הווירטופיזי בהגדרות של Chrome.
+
+<ph name="BEGIN_LINK" />למידע נוסף<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">מתקין...</translation>
 <translation id="2351097562818989364">הגדרות התרגום שלך אופסו.</translation>
 <translation id="2359808026110333948">המשך</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">‏הצע לתרגם דפים באמצעות Google Translate</translation>
 <translation id="3089395242580810162">פתח בכרטיסיית גלישה בסתר</translation>
 <translation id="3090193911106258841">גישה לקלט אודיו ווידאו</translation>
+<translation id="3117051980354074377">‏כדי לקבל את הסימניות מהמכשירים האחרים שלך, היכנס ל-Chrome.</translation>
 <translation id="3137521801621304719">צא ממצב גלישה בסתר</translation>
 <translation id="3149891296864842641">אפשרויות משלוח</translation>
 <translation id="3162882791484435636">בחר באפשרות משלוח</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">מידע משפטי</translation>
 <translation id="4089831646916293264">התכונה הזו עשויה להפריע לגישה אל שירותי נתונים בתשלום הניתנים על ידי הספק שלך.</translation>
 <translation id="4099578267706723511">‏עזור לשפר את Chrome על ידי שליחה של סטטיסטיקת שימוש ודוחות קריסה אל Google.</translation>
+<translation id="410351446219883937">הפעלה אוטומטית</translation>
 <translation id="411254640334432676">ההורדה נכשלה.</translation>
 <translation id="4113030288477039509">מנוהל על ידי מנהל המערכת שלך</translation>
 <translation id="4165986682804962316">הגדרות אתרים</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">עוד</translation>
 <translation id="604996488070107836">הורדת <ph name="FILE_NAME" /> נכשלה עקב שגיאה לא ידועה.</translation>
 <translation id="605721222689873409">YY</translation>
+<translation id="605904398899306450">אפשר לאתרים לבצע הפעלה אוטומטית של מדיה חשובה (מומלץ)</translation>
 <translation id="6075798973483050474">עריכת דף הבית</translation>
 <translation id="6108923351542677676">ההגדרה מתבצעת…</translation>
 <translation id="6112702117600201073">מרענן את הדף</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">אפשרויות</translation>
 <translation id="656628257199996201">תרגם <ph name="SOURCE_LANGUAGE" /> תמיד</translation>
 <translation id="6571070086367343653">ערוך כרטיס אשראי</translation>
+<translation id="6573431926118603307">‏כרטיסיות שפתחת ב-Chrome במכשירים האחרים שלך יופיעו כאן.</translation>
 <translation id="6575643671698722332">האיפוס נכשל. ודא שהמכשיר שלך במצב מקוון ונסה שוב.</translation>
 <translation id="6600954340915313787">‏הועתק אל Chrome</translation>
 <translation id="6612358246767739896">תוכן מוגן</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">הוסף</translation>
 <translation id="780301667611848630">לא תודה</translation>
 <translation id="7829298379596169484">גישה לקלט אודיו</translation>
+<translation id="7837582000577464779">אירעה שגיאה במהלך עיבוד ההזמנה. בדוק את החשבון שלך ונסה שוב.</translation>
+<translation id="7840369537802583269">זהה והפעל מדיה חשובה באתר מסוים.</translation>
 <translation id="7846076177841592234">בטל את הבחירה</translation>
 <translation id="7851858861565204677">מכשירים אחרים</translation>
 <translation id="7876243839304621966">הסר הכל</translation>
@@ -565,6 +578,7 @@
 <translation id="8617240290563765734">האם לעבור אל כתובת האתר שצוינה כהצעה בתוכן שהורדת?</translation>
 <translation id="8627706565932943526">שגיאת סנכרון</translation>
 <translation id="862875433388403934">ייתכן שלא תוכל עוד להפעיל תוכן (סרטים, מוזיקה וכו') שהורדת באפליקציות אחרות עד לרכישה מחדש של רישיונות באפליקציות אלה עם פרטי כניסה למכשיר חדש. כדי להשיג רישיונות חדשים, התחבר לאינטרנט והפעל את התוכן שהורדת.</translation>
+<translation id="8636825310635137004">כדי לקבל את הכרטיסיות מהמכשירים האחרים שלך, הפעל את הסנכרון.</translation>
 <translation id="8660471606262461360">‏מ-Google Payments</translation>
 <translation id="8676374126336081632">נקה קלט</translation>
 <translation id="869891660844655955">תאריך תפוגה</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
index 9a98a2ad..a1ee84d 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">このサイトとマイクを共有するには Chrome にマイクへのアクセスを許可する必要があります。</translation>
 <translation id="1080790410959514870"><ph name="DOMAIN_NAME" /> により管理されているアカウントからログアウトします。このデバイスに保存されている Chrome データは削除されますが、Google アカウントではデータが保持されます。</translation>
 <translation id="1098052486217676340">終了しました</translation>
+<translation id="1111673857033749125">他の端末に保存されているブックマークがここに表示されます。</translation>
 <translation id="1121094540300013208">利用状況と障害レポート</translation>
 <translation id="1137305377394488060">過去 1 時間</translation>
 <translation id="1178581264944972037">一時停止</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">このサイトは翻訳しない</translation>
 <translation id="1291207594882862231">履歴、Cookie、サイトデータ、キャッシュを消去…</translation>
 <translation id="129553762522093515">最近閉じたタブ</translation>
+<translation id="1326317727527857210">他の端末と同じタブを使用するには、Chrome にログインします。</translation>
 <translation id="13410144310025252">Chrome でページを表示</translation>
 <translation id="1369915414381695676">サイト <ph name="SITE_NAME" /> を追加しました</translation>
 <translation id="1373696734384179344">選択したコンテンツをダウンロードするにはメモリが不足しています。</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">絞り込み</translation>
 <translation id="2315043854645842844">オペレーティング システムでサポートされていないため、クライアント側で証明書を選択することはできません。</translation>
 <translation id="2321958826496381788">読みやすくなるまでスライダをドラッグしてください。段落をダブルタップするとテキストがこれより大きくなります。</translation>
+<translation id="2331464965008647960">近くの端末から Bluetooth を介してウェブページが送信されています。お使いの端末がアクティブになると、Chrome でこうしたページをスキャンして表示します。スキャンしたページは Google サービスに送られ、ページ結果の品質向上に使用されます。
+
+フィジカル ウェブの管理は Chrome の設定で行うことができます。
+
+<ph name="BEGIN_LINK" />詳細<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">インストール中...</translation>
 <translation id="2351097562818989364">翻訳設定をリセットしました。</translation>
 <translation id="2359808026110333948">続行</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Google 翻訳を使ってページを翻訳するかどうかを尋ねます</translation>
 <translation id="3089395242580810162">シークレット タブで開く</translation>
 <translation id="3090193911106258841">音声 / ビデオ入力にアクセスしています</translation>
+<translation id="3117051980354074377">他の端末と同じブックマークを使用するには Chrome にログインします。</translation>
 <translation id="3137521801621304719">シークレット モードを終了</translation>
 <translation id="3149891296864842641">配送オプション</translation>
 <translation id="3162882791484435636">配送オプションを選択</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">法的情報</translation>
 <translation id="4089831646916293264">この機能により、携帯通信会社が提供するプレミアム データサービスの利用に問題が発生する可能性があります。</translation>
 <translation id="4099578267706723511">使用統計情報と障害レポートを Google に送信して、Chrome の品質向上にご協力ください。</translation>
+<translation id="410351446219883937">自動再生</translation>
 <translation id="411254640334432676">ダウンロードできませんでした。</translation>
 <translation id="4113030288477039509">管理者により管理されています</translation>
 <translation id="4165986682804962316">サイトの設定</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">詳細表示</translation>
 <translation id="604996488070107836">不明なエラーが発生したため、<ph name="FILE_NAME" /> をダウンロードできませんでした。</translation>
 <translation id="605721222689873409">YY</translation>
+<translation id="605904398899306450">サイトに重要なメディアの自動再生を許可する(推奨)</translation>
 <translation id="6075798973483050474">ホームページの編集</translation>
 <translation id="6108923351542677676">設定しています...</translation>
 <translation id="6112702117600201073">ページを更新しています</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">オプション</translation>
 <translation id="656628257199996201"><ph name="SOURCE_LANGUAGE" />を常に翻訳</translation>
 <translation id="6571070086367343653">クレジットカードの編集</translation>
+<translation id="6573431926118603307">他の端末の Chrome で開いているタブがここに表示されます。</translation>
 <translation id="6575643671698722332">再設定できませんでした。デバイスがオンラインになっていることを確認してもう一度お試しください。</translation>
 <translation id="6600954340915313787">Chrome にコピー済み</translation>
 <translation id="6612358246767739896">保護されたコンテンツ</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">追加</translation>
 <translation id="780301667611848630">いいえ</translation>
 <translation id="7829298379596169484">音声入力にアクセスしています</translation>
+<translation id="7837582000577464779">注文の処理中にエラーが発生しました。アカウントを確認してから、もう一度お試しください。</translation>
+<translation id="7840369537802583269">特定のサイトの重要なメディアを検出して、再生します。</translation>
 <translation id="7846076177841592234">選択解除</translation>
 <translation id="7851858861565204677">その他のデバイス</translation>
 <translation id="7876243839304621966">すべて削除</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">他のアプリケーションでダウンロードしたコンテンツ(映画、音楽など)は再生できなくなっている可能性があります。再生するには、該当のアプリケーションで新しいデバイス認証情報に基づくライセンスを再取得する必要があります。
 
 新しいライセンスを取得するには、インターネットに接続し、ダウンロードしたコンテンツを再生してください。</translation>
+<translation id="8636825310635137004">他の端末と同じタブを使用するには、同期を有効にします。</translation>
 <translation id="8660471606262461360">Google ペイメントから取得</translation>
 <translation id="8676374126336081632">入力内容を消去</translation>
 <translation id="869891660844655955">有効期限</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
index 19668c9..9fabe67 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">이 사이트에 공유하려면 Chrome에 마이크 액세스 권한이 있어야 합니다.</translation>
 <translation id="1080790410959514870"><ph name="DOMAIN_NAME" />에서 관리하는 계정에서 로그아웃합니다. 로그아웃하면 이 기기에 저장된 Chrome 데이터는 삭제되지만 Google 계정에는 데이터가 남습니다.</translation>
 <translation id="1098052486217676340">완료</translation>
+<translation id="1111673857033749125">다른 기기에서 저장한 북마크가 여기에 표시됩니다.</translation>
 <translation id="1121094540300013208">사용 및 충돌 보고서</translation>
 <translation id="1137305377394488060">지난 1시간</translation>
 <translation id="1178581264944972037">일시중지</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">이 사이트 번역 안함</translation>
 <translation id="1291207594882862231">방문 기록, 쿠키, 사이트 데이터, 캐시 삭제…</translation>
 <translation id="129553762522093515">최근에 닫은 탭</translation>
+<translation id="1326317727527857210">다른 기기에서 탭을 가져오려면 Chrome에 로그인하세요.</translation>
 <translation id="13410144310025252">Chrome에서 보기</translation>
 <translation id="1369915414381695676"><ph name="SITE_NAME" /> 사이트 추가됨</translation>
 <translation id="1373696734384179344">선택한 콘텐츠를 다운로드할 공간이 부족합니다.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">상세검색</translation>
 <translation id="2315043854645842844">클라이언트측 인증서 선택이 운영체제에서 지원되지 않습니다.</translation>
 <translation id="2321958826496381788">편하게 읽을 수 있을 때까지 슬라이더를 드래그하세요. 단락을 두 번 탭하면 텍스트가 이 이상의 크기로 표시됩니다.</translation>
+<translation id="2331464965008647960">주변 기기에서 블루투스를 사용하여 웹페이지를 전송합니다. 내 기기의 대기 모드가 해제되었을 때 Chrome에서 페이지를 스캔하고 표시합니다. 이 페이지는 페이지 결과의 품질을 높이기 위해 Google 서비스를 거칩니다.
+
+Chrome 설정에서 피지컬 웹을 관리할 수 있습니다.
+
+<ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">설치 중...</translation>
 <translation id="2351097562818989364">번역 설정이 재설정되었습니다.</translation>
 <translation id="2359808026110333948">계속</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Google 번역을 사용하여 페이지를 번역할 것을 제안합니다.</translation>
 <translation id="3089395242580810162">시크릿 탭에서 열기</translation>
 <translation id="3090193911106258841">오디오 및 비디오 입력 장치에 액세스</translation>
+<translation id="3117051980354074377">다른 기기에서 북마크를 가져오려면 Chrome에 로그인하세요.</translation>
 <translation id="3137521801621304719">시크릿 모드 나가기</translation>
 <translation id="3149891296864842641">배송 옵션</translation>
 <translation id="3162882791484435636">배송 옵션 선택</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">법적 정보</translation>
 <translation id="4089831646916293264">이 기능을 사용하면 이동통신사에서 제공하는 프리미엄 데이터 서비스에 액세스하는 데 문제가 생길 수 있습니다.</translation>
 <translation id="4099578267706723511">사용 통계와 오류 보고서를 Google로 전송하면 Chrome 개선에 도움이 됩니다.</translation>
+<translation id="410351446219883937">자동재생</translation>
 <translation id="411254640334432676">다운로드에 실패했습니다.</translation>
 <translation id="4113030288477039509">관리자가 관리합니다.</translation>
 <translation id="4165986682804962316">사이트 설정</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">더보기</translation>
 <translation id="604996488070107836">알 수 없는 오류로 인해 <ph name="FILE_NAME" /> 다운로드에 실패했습니다.</translation>
 <translation id="605721222689873409">YY</translation>
+<translation id="605904398899306450">사이트에서 중요한 미디어를 자동재생하도록 허용(권장)</translation>
 <translation id="6075798973483050474">홈 페이지 수정</translation>
 <translation id="6108923351542677676">설정 진행 중...</translation>
 <translation id="6112702117600201073">페이지 새로고침</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">옵션</translation>
 <translation id="656628257199996201"><ph name="SOURCE_LANGUAGE" /> 항상 번역</translation>
 <translation id="6571070086367343653">신용카드 수정</translation>
+<translation id="6573431926118603307">다른 기기의 Chrome에서 연 탭이 여기에 표시됩니다.</translation>
 <translation id="6575643671698722332">재설정하지 못했습니다. 온라인 연결을 확인하고 다시 시도하세요.</translation>
 <translation id="6600954340915313787">Chrome에 복사됨</translation>
 <translation id="6612358246767739896">보호된 콘텐츠</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">추가</translation>
 <translation id="780301667611848630">아니요, 괜찮습니다.</translation>
 <translation id="7829298379596169484">오디오 입력 장치에 액세스 중</translation>
+<translation id="7837582000577464779">주문을 처리하는 중에 오류가 발생했습니다. 계정을 확인한 후 다시 시도해 주세요.</translation>
+<translation id="7840369537802583269">특정 사이트의 중요 미디어를 감지하고 재생합니다.</translation>
 <translation id="7846076177841592234">선택 취소</translation>
 <translation id="7851858861565204677">다른 기기</translation>
 <translation id="7876243839304621966">모두 삭제</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">다른 애플리케이션에서 다운로드한 콘텐츠(영화, 음악 등)는 해당 애플리케이션이 새로운 기기 사용자 인증 정보를 기반으로 라이선스를 다시 취득해야 재생할 수 있습니다.
 
 새로운 라이선스를 취득하려면 인터넷에 연결하고 다운로드한 콘텐츠를 재생하세요.</translation>
+<translation id="8636825310635137004">다른 기기에서 탭을 가져오려면 동기화를 사용 설정하세요.</translation>
 <translation id="8660471606262461360">출처: Google Payments</translation>
 <translation id="8676374126336081632">입력내용 지우기</translation>
 <translation id="869891660844655955">유효기간</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
index abf6747..e4ced4f 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">„Chrome“ reikia galimybės pasiekti mikrofoną, kad jį būtų galima bendrinti su šia svetaine.</translation>
 <translation id="1080790410959514870">Atsijungiate nuo <ph name="DOMAIN_NAME" /> tvarkomos paskyros. Bus ištrinti šiame įrenginyje saugomi „Chrome“ duomenys, bet jie išliks „Google“ paskyroje.</translation>
 <translation id="1098052486217676340">Baigta</translation>
+<translation id="1111673857033749125">Čia bus rodomos kituose įrenginiuose išsaugotos žymės.</translation>
 <translation id="1121094540300013208">Naudojimo ir strigčių ataskaitos</translation>
 <translation id="1137305377394488060">pastaroji valanda</translation>
 <translation id="1178581264944972037">Pristabdyti</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Niekada neversti šios svetainės</translation>
 <translation id="1291207594882862231">Išvalykite istoriją, slapukus, svetainės duomenis, talpyklą…</translation>
 <translation id="129553762522093515">Neseniai uždarytas</translation>
+<translation id="1326317727527857210">Prisijunkite prie „Chrome“, kad pasiektumėte skirtukus iš kitų įrenginių.</translation>
 <translation id="13410144310025252">Peržiūrėkite tinklalapius naršyklėje „Chrome“</translation>
 <translation id="1369915414381695676">Pridėta svetainė <ph name="SITE_NAME" /></translation>
 <translation id="1373696734384179344">Nepakanka atminties pasirinktam turiniui atsisiųsti.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Patikslinti</translation>
 <translation id="2315043854645842844">Kliento pasirinkto sertifikato nepalaiko operacinė sistema.</translation>
 <translation id="2321958826496381788">Vilkite šliaužiklį, kol bus patogu skaityti šį tekstą. Du kartus palietus pastraipą, tekstas turėtų būti mažiausiai tokio dydžio.</translation>
+<translation id="2331464965008647960">Netoliese esantys įrenginiai transliuoja tinklalapius „Bluetooth“ ryšiu. Kai suaktyvinsite įrenginį, „Chrome“ nuskaitys puslapius ir rodys juos. Šie puslapiai bus siunčiami naudojant „Google“ paslaugą siekiant patobulinti puslapių rezultatų kokybę.
+
+Fizinį žiniatinklį galite valdyti „Chrome“ nustatymuose.
+
+<ph name="BEGIN_LINK" />Sužinokite daugiau<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Diegiama...</translation>
 <translation id="2351097562818989364">Vertimo nustatymai buvo nustatyti iš naujo.</translation>
 <translation id="2359808026110333948">Tęsti</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Siūlyti versti puslapius naudojant „Google“ vertėją</translation>
 <translation id="3089395242580810162">Atidaryti inkognito skirtuko lape</translation>
 <translation id="3090193911106258841">Pasiekiama garso ir vaizdo įrašų įvestis</translation>
+<translation id="3117051980354074377">Prisijunkite prie „Chrome“, kad pasiektumėte žymes iš kitų įrenginių.</translation>
 <translation id="3137521801621304719">Išjungti inkognito režimą</translation>
 <translation id="3149891296864842641">Pristatymo parinktis</translation>
 <translation id="3162882791484435636">Pasirinkti pristatymo parinktį</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Teisinė informacija</translation>
 <translation id="4089831646916293264">Ši funkcija gali trukdyti pasiekti papildomas operatoriaus teikiamas duomenų paslaugas.</translation>
 <translation id="4099578267706723511">Padėkite tobulinti „Chrome“ siųsdami „Google“ naudojimo statistiką ir strigčių ataskaitas.</translation>
+<translation id="410351446219883937">Automatinis paleidimas</translation>
 <translation id="411254640334432676">Nepavyko atsisiųsti.</translation>
 <translation id="4113030288477039509">Tvarko jūsų administratorius</translation>
 <translation id="4165986682804962316">Svetainės nustatymai</translation>
@@ -374,6 +383,7 @@
 <translation id="6042308850641462728">Daugiau</translation>
 <translation id="604996488070107836">Nepavyko atsisiųsti „<ph name="FILE_NAME" />“ dėl nežinomos klaidos.</translation>
 <translation id="605721222689873409">MM</translation>
+<translation id="605904398899306450">Leisti svetainėms automatiškai paleisti svarbią mediją (rekomenduojama)</translation>
 <translation id="6075798973483050474">Redaguoti pagrindinį puslapį</translation>
 <translation id="6108923351542677676">Nustatoma…</translation>
 <translation id="6112702117600201073">Puslapio atnaujinimas</translation>
@@ -410,6 +420,7 @@
 <translation id="6550675742724504774">Parinktys</translation>
 <translation id="656628257199996201">Visada versti iš <ph name="SOURCE_LANGUAGE" /> k.</translation>
 <translation id="6571070086367343653">Kredito kortelės redagavimas</translation>
+<translation id="6573431926118603307">Čia bus rodomi kituose įrenginiuose atidaryti „Chrome“ skirtukai.</translation>
 <translation id="6575643671698722332">Nepavyko nustatyti iš naujo. Įsitikinkite, kad įrenginys prijungtas prie interneto, ir bandykite dar kartą.</translation>
 <translation id="6600954340915313787">Nukopijuota į „Chrome“</translation>
 <translation id="6612358246767739896">Apsaugotas turinys</translation>
@@ -512,6 +523,8 @@
 <translation id="7791543448312431591">Pridėti</translation>
 <translation id="780301667611848630">Ačiū, ne</translation>
 <translation id="7829298379596169484">Pasiekiama garso įrašų įvestis</translation>
+<translation id="7837582000577464779">Apdorojant jūsų užsakymą įvyko klaida. Patikrinkite paskyrą ir bandykite dar kartą.</translation>
+<translation id="7840369537802583269">Nustatyti ir atkurti svarbią mediją konkrečioje svetainėje.</translation>
 <translation id="7846076177841592234">Atšaukti pasirinkimą</translation>
 <translation id="7851858861565204677">Kiti įrenginiai</translation>
 <translation id="7876243839304621966">Pašalinti viską</translation>
@@ -568,6 +581,7 @@
 <translation id="862875433388403934">Nebegalėsite leisti kitose programose atsisiųsto turinio (filmų, muzikos ir pan.), kol tose programose nebus iš naujo gautos licencijos pagal naujus įrenginio prisijungimo duomenis.
 
 Jei norite gauti naujas licencijas, prisijunkite prie interneto ir leiskite atsisiųsti turinį.</translation>
+<translation id="8636825310635137004">Jei norite pasiekti skirtukus iš kitų įrenginių, įjunkite sinchronizavimą.</translation>
 <translation id="8660471606262461360">Iš „Google Payments“</translation>
 <translation id="8676374126336081632">Išvalyti įvestą tekstą</translation>
 <translation id="869891660844655955">Galiojimo data</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
index 7c9434ae..82c89982 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Chrome heeft microfoontoegang nodig om het item te delen met deze site.</translation>
 <translation id="1080790410959514870">Je logt uit van een account dat wordt beheerd door <ph name="DOMAIN_NAME" />. Hiermee worden de Chrome-gegevens verwijderd die zijn opgeslagen op dit apparaat, maar de gegevens blijven bewaard in je Google-account.</translation>
 <translation id="1098052486217676340">Afgelopen</translation>
+<translation id="1111673857033749125">Bladwijzers die je op andere apparaten hebt opgeslagen, worden hier weergegeven.</translation>
 <translation id="1121094540300013208">Gebruiks- en crashrapporten</translation>
 <translation id="1137305377394488060">het afgelopen uur</translation>
 <translation id="1178581264944972037">Onderbreken</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Deze site nooit vertalen</translation>
 <translation id="1291207594882862231">Geschiedenis, cookies, sitegegevens, cachegeheugen wissen…</translation>
 <translation id="129553762522093515">Recent gesloten</translation>
+<translation id="1326317727527857210">Log in bij Chrome om de tabbladen van je andere apparaten te bekijken.</translation>
 <translation id="13410144310025252">Bekijk ze in Chrome</translation>
 <translation id="1369915414381695676">Site <ph name="SITE_NAME" /> toegevoegd</translation>
 <translation id="1373696734384179344">Onvoldoende geheugen om de geselecteerde inhoud te downloaden.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Verfijnen</translation>
 <translation id="2315043854645842844">Certificaatselectie aan clientzijde wordt niet ondersteund door het besturingssysteem.</translation>
 <translation id="2321958826496381788">Sleep de schuifknop tot je deze tekst prettig kunt lezen. De tekst moet minimaal deze grootte hebben nadat je op een alinea hebt dubbelgetikt.</translation>
+<translation id="2331464965008647960">Apparaten bij je in de buurt verzenden webpagina's via Bluetooth. Chrome zoekt naar pagina's en geeft ze weer wanneer je je apparaat activeert uit de slaapstand. Deze pagina's worden verwerkt door een Google-service om de kwaliteit van paginaresultaten te verbeteren.
+
+Je kunt het Fysieke web beheren via de instellingen van Chrome.
+
+<ph name="BEGIN_LINK" />Meer informatie<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Installeren…</translation>
 <translation id="2351097562818989364">Je vertaalinstellingen zijn opnieuw ingesteld.</translation>
 <translation id="2359808026110333948">Doorgaan</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Aanbieden pagina's te vertalen met Google Translate</translation>
 <translation id="3089395242580810162">Openen op incognitotabblad</translation>
 <translation id="3090193911106258841">Audio- en video-invoer openen</translation>
+<translation id="3117051980354074377">Log in bij Chrome om de bladwijzers van je andere apparaten te bekijken.</translation>
 <translation id="3137521801621304719">Incognitomodus verlaten</translation>
 <translation id="3149891296864842641">Verzendoptie</translation>
 <translation id="3162882791484435636">Verzendoptie selecteren</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Juridische informatie</translation>
 <translation id="4089831646916293264">Deze functie kan problemen veroorzaken met toegang tot premium gegevensservices geleverd door je provider.</translation>
 <translation id="4099578267706723511">Verzend automatisch gebruiksstatistieken en crashmeldingen naar Google.</translation>
+<translation id="410351446219883937">Automatisch afspelen</translation>
 <translation id="411254640334432676">Downloaden mislukt.</translation>
 <translation id="4113030288477039509">Beheerd door je beheerder</translation>
 <translation id="4165986682804962316">Site-instellingen</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">Meer</translation>
 <translation id="604996488070107836">Download van <ph name="FILE_NAME" /> mislukt vanwege een onbekende fout.</translation>
 <translation id="605721222689873409">JJ</translation>
+<translation id="605904398899306450">Sites toestaan belangrijke media automatisch af te spelen (aanbevolen)</translation>
 <translation id="6075798973483050474">Startpagina bewerken</translation>
 <translation id="6108923351542677676">Instellen wordt uitgevoerd...</translation>
 <translation id="6112702117600201073">Pagina vernieuwen</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">Opties</translation>
 <translation id="656628257199996201">Altijd <ph name="SOURCE_LANGUAGE" /> vertalen</translation>
 <translation id="6571070086367343653">Creditcard bewerken</translation>
+<translation id="6573431926118603307">Tabbladen die je op andere apparaten in Chrome hebt geopend, worden hier weergegeven.</translation>
 <translation id="6575643671698722332">Herstel mislukt. Kijk of apparaat online is en probeer opnieuw.</translation>
 <translation id="6600954340915313787">Gekopieerd naar Chrome</translation>
 <translation id="6612358246767739896">Beveiligde inhoud</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">Toevoegen</translation>
 <translation id="780301667611848630">Nee, bedankt</translation>
 <translation id="7829298379596169484">Audio-invoer openen</translation>
+<translation id="7837582000577464779">Er is een fout opgetreden bij het verwerken van je bestelling. Controleer je account en probeer het opnieuw.</translation>
+<translation id="7840369537802583269">Belangrijke media voor een specifieke site detecteren en afspelen.</translation>
 <translation id="7846076177841592234">Selectie opheffen</translation>
 <translation id="7851858861565204677">Andere apparaten</translation>
 <translation id="7876243839304621966">Alles verwijderen</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">Inhoud (films, muziek, enzovoort) die is gedownload in andere apps kan mogelijk niet langer worden afgespeeld, totdat die apps opnieuw licenties verkrijgen op basis van nieuwe apparaatinloggegevens.
 
 Maak verbinding met internet en speel je gedownloade inhoud af om nieuwe licenties te krijgen.</translation>
+<translation id="8636825310635137004">Schakel synchronisatie in om de tabbladen op je andere apparaten te bekijken</translation>
 <translation id="8660471606262461360">Van Google Payments</translation>
 <translation id="8676374126336081632">Invoer wissen</translation>
 <translation id="869891660844655955">Vervaldatum</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
index a31399a..40c27fc 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Chrome må ha tilgang til mikrofonen for å kunne dele den med dette nettstedet.</translation>
 <translation id="1080790410959514870">Du er i ferd med å logge av en konto som er administrert av <ph name="DOMAIN_NAME" />. Dette fører til at Chrome-data som er lagret på enheten, slettes. Dataene er imidlertid fortsatt lagret i Google-kontoen din.</translation>
 <translation id="1098052486217676340">Ferdig</translation>
+<translation id="1111673857033749125">Bokmerker som er lagret på de andre enhetene dine, vises her.</translation>
 <translation id="1121094540300013208">Bruks- og programstopprapporter</translation>
 <translation id="1137305377394488060">den siste timen</translation>
 <translation id="1178581264944972037">Stans midlertidig</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Oversett aldri dette nettstedet</translation>
 <translation id="1291207594882862231">Slett loggoppføringer, informasjonskapsler, nettstedsdata, bufferen …</translation>
 <translation id="129553762522093515">Nylig lukket</translation>
+<translation id="1326317727527857210">For å få fanene dine fra de andre enhetene du bruker, logg på Chrome.</translation>
 <translation id="13410144310025252">Se dem i Chrome</translation>
 <translation id="1369915414381695676">Nettstedet <ph name="SITE_NAME" /> er lagt til</translation>
 <translation id="1373696734384179344">Det er ikke nok ledig minne til å laste ned det valgte innholdet.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Finstem</translation>
 <translation id="2315043854645842844">Operativsystemet har ikke støtte for sertifikatvalg på klientsiden.</translation>
 <translation id="2321958826496381788">Dra glidebryteren til du kan lese dette uten problemer. Når du har dobbelttrykket på et avsnitt, bør teksten være minst like stor som dette.</translation>
+<translation id="2331464965008647960">Enheter i nærheten av deg kringkaster nettsider via Bluetooth. Chrome søker etter sider og viser dem når du vekker enheten. Disse sidene går gjennom en Google-tjeneste for å forbedre kvaliteten på sideresultatene.
+
+Du kan kontrollere det fysiske nettet i Chrome-innstillingene.
+
+<ph name="BEGIN_LINK" />Finn ut mer<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Installerer …</translation>
 <translation id="2351097562818989364">Oversettelsesinnstillingene dine er tilbakestilt.</translation>
 <translation id="2359808026110333948">Fortsett</translation>
@@ -118,7 +125,7 @@
 <translation id="2526148617758225454">Datasparing er på. Du kan administrere denne funksjonen i Innstillinger.</translation>
 <translation id="2532336938189706096">Nettvisning</translation>
 <translation id="2536728043171574184">Ser på en lokalt lagret versjon av denne siden</translation>
-<translation id="2546283357679194313">Informasjonskapsler og nettsteddata</translation>
+<translation id="2546283357679194313">Informasjonskapsler og nettstedsdata</translation>
 <translation id="257931822824936280">Utvidet – klikk for å minimere.</translation>
 <translation id="2587052924345400782">En nyere versjon er tilgjengelig</translation>
 <translation id="2593272815202181319">Monospace</translation>
@@ -133,7 +140,7 @@
 <translation id="2762000892062317888">akkurat nå</translation>
 <translation id="2770465223704140727">Fjern fra listen</translation>
 <translation id="278029852808208386">Ingen Bluetooth-enheter ble funnet. <ph name="BEGIN_LINK" />Søk igjen<ph name="END_LINK" />.</translation>
-<translation id="2781389167600714117">Velg frakt</translation>
+<translation id="2781389167600714117">Velg levering</translation>
 <translation id="2811892995384186721">Ser du ikke enheten din? <ph name="BEGIN_LINK" />Få hjelp<ph name="END_LINK" /></translation>
 <translation id="2836148919159985482">Trykk på tilbakeknappen for å avslutte fullskjerm.</translation>
 <translation id="2842985007712546952">Overordnet mappe</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Tilby oversettelse av nettsider ved hjelp av Google Oversetter</translation>
 <translation id="3089395242580810162">Åpne i inkognitofane</translation>
 <translation id="3090193911106258841">Åpner lyd- og videoinngang</translation>
+<translation id="3117051980354074377">For å få bokmerkene dine fra de andre enhetene du bruker, logg på Chrome.</translation>
 <translation id="3137521801621304719">Avslutt inkognitomodus</translation>
 <translation id="3149891296864842641">Fraktalternativ</translation>
 <translation id="3162882791484435636">Velg fraktalternativ</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Juridisk informasjon</translation>
 <translation id="4089831646916293264">Det kan hende at dette elementet gjør at du ikke får tilgang til premium-datatjenester som tilbys av operatøren din.</translation>
 <translation id="4099578267706723511">Gjør Chrome bedre ved å sende bruksstatistikk og programstopprapporter til Google.</translation>
+<translation id="410351446219883937">Autoavspilling</translation>
 <translation id="411254640334432676">Nedlastingen mislyktes.</translation>
 <translation id="4113030288477039509">Styres av administratoren din</translation>
 <translation id="4165986682804962316">Nettstedsinnstillinger</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">Mer</translation>
 <translation id="604996488070107836">Nedlastingen av <ph name="FILE_NAME" /> ble avbrutt på grunn av en ukjent feil.</translation>
 <translation id="605721222689873409">ÅÅ</translation>
+<translation id="605904398899306450">Tillat nettsteder å spille av viktig medieinnhold automatisk (anbefales)</translation>
 <translation id="6075798973483050474">Endre startsiden</translation>
 <translation id="6108923351542677676">Konfigurasjon pågår …</translation>
 <translation id="6112702117600201073">Oppdaterer siden.</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">Alternativer</translation>
 <translation id="656628257199996201">Oversett alltid <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="6571070086367343653">Rediger kredittkort</translation>
+<translation id="6573431926118603307">Faner du har åpnet i Chrome på de andre enhetene dine, vises her.</translation>
 <translation id="6575643671698722332">Tilbakestillingen var mislykket. Sjekk at enheten din har Internett-tilkobling og prøv på nytt.</translation>
 <translation id="6600954340915313787">Kopiert til Chrome</translation>
 <translation id="6612358246767739896">Beskyttet innhold</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">Legg til</translation>
 <translation id="780301667611848630">Nei takk</translation>
 <translation id="7829298379596169484">Åpner lydinngang</translation>
+<translation id="7837582000577464779">Det oppsto en feil ved behandling av bestillingen din. Sjekk kontoen din og prøv igjen.</translation>
+<translation id="7840369537802583269">Oppdag og spill av viktig medieinnhold for et bestemt nettsted.</translation>
 <translation id="7846076177841592234">Opphev valget</translation>
 <translation id="7851858861565204677">Andre enheter</translation>
 <translation id="7876243839304621966">Fjern alle</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">Innhold (filmer, musikk osv.) som er lastet ned i andre apper, kan kanskje ikke spilles av lenger, før appene får nye lisenser basert på ny enhetslegitimasjon.
 
 For å få nye lisenser må du koble deg til Internett og spille av innholdet du har lastet ned.</translation>
+<translation id="8636825310635137004">For å få fanene dine fra de andre enhetene du bruker, slå på synkronisering.</translation>
 <translation id="8660471606262461360">Fra Google Payments</translation>
 <translation id="8676374126336081632">Slett teksten</translation>
 <translation id="869891660844655955">Utløpsdato</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
index d0c4928..902ecf30 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Aby zezwolić stronie na wykorzystanie mikrofonu, Chrome musi mieć do niego dostęp.</translation>
 <translation id="1080790410959514870">Wylogowujesz się z konta zarządzanego przez <ph name="DOMAIN_NAME" />. Spowoduje to usunięcie danych Chrome zapisanych na tym urządzeniu, jednak pozostaną one na Twoim koncie Google.</translation>
 <translation id="1098052486217676340">Zakończono</translation>
+<translation id="1111673857033749125">Tutaj wyświetlą się zakładki z innych urządzeń.</translation>
 <translation id="1121094540300013208">Raporty o użytkowaniu i awariach</translation>
 <translation id="1137305377394488060">z ostatniej godziny</translation>
 <translation id="1178581264944972037">Wstrzymaj</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Nigdy nie tłumacz tej witryny</translation>
 <translation id="1291207594882862231">Wyczyść historię, pliki cookie, dane witryn, pamięć podręczną…</translation>
 <translation id="129553762522093515">Ostatnio zamknięte</translation>
+<translation id="1326317727527857210">Aby korzystać z kart ze swoich innych urządzeń, zaloguj się w Chrome.</translation>
 <translation id="13410144310025252">Zobacz je w Chrome</translation>
 <translation id="1369915414381695676">Strona <ph name="SITE_NAME" /> została dodana</translation>
 <translation id="1373696734384179344">Za mało pamięci, by pobrać te treści.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Zawęź</translation>
 <translation id="2315043854645842844">Wybieranie certyfikatu klienta nie jest obsługiwane przez ten system operacyjny.</translation>
 <translation id="2321958826496381788">Przeciągaj suwak, by umożliwić wygodne czytanie. Gdy dwukrotnie klikniesz akapit, tekst powiększy się co najmniej do tej wielkości.</translation>
+<translation id="2331464965008647960">Urządzenia w pobliżu udostępniają strony internetowe przez Bluetooth. Chrome wyszuka je i wyświetli, gdy wybudzisz urządzenie. Strony te są przesyłane do usługi Google, która zwiększa trafność wyników.
+
+Internet rzeczy możesz skonfigurować w ustawieniach Chrome.
+
+<ph name="BEGIN_LINK" />Więcej informacji<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Instaluję…</translation>
 <translation id="2351097562818989364">Ustawienia tłumaczenia zostały zresetowane.</translation>
 <translation id="2359808026110333948">Kontynuuj</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Proponuj tłumaczenie stron w Tłumaczu Google</translation>
 <translation id="3089395242580810162">Otwórz w karcie incognito</translation>
 <translation id="3090193911106258841">Otwieram wejście audio i wideo</translation>
+<translation id="3117051980354074377">Aby korzystać z zakładek ze swoich innych urządzeń, zaloguj się w Chrome.</translation>
 <translation id="3137521801621304719">Wyłącz tryb incognito</translation>
 <translation id="3149891296864842641">Sposób dostawy</translation>
 <translation id="3162882791484435636">Wybierz sposób dostawy</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Informacje prawne</translation>
 <translation id="4089831646916293264">Ta funkcja może zakłócać dostęp do udostępnianych przez operatora płatnych usług transmisji danych.</translation>
 <translation id="4099578267706723511">Pomóż ulepszyć Chrome, wysyłając do Google statystyki użytkowania i raporty o awariach.</translation>
+<translation id="410351446219883937">Autoodtwarzanie</translation>
 <translation id="411254640334432676">Błąd pobierania.</translation>
 <translation id="4113030288477039509">Zarządzany przez administratora</translation>
 <translation id="4165986682804962316">Ustawienia witryny</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">Więcej</translation>
 <translation id="604996488070107836">Nie udało się pobrać pliku <ph name="FILE_NAME" /> z powodu nieznanego błędu.</translation>
 <translation id="605721222689873409">RR</translation>
+<translation id="605904398899306450">Zezwalaj witrynom na autoodtwarzanie ważnych multimediów (zalecane)</translation>
 <translation id="6075798973483050474">Edytuj stronę główną</translation>
 <translation id="6108923351542677676">Trwa konfigurowanie…</translation>
 <translation id="6112702117600201073">Odświeżam stronę</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">Opcje</translation>
 <translation id="656628257199996201">Zawsze tłumacz z języka: <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="6571070086367343653">Edytuj kartę kredytową</translation>
+<translation id="6573431926118603307">Tutaj wyświetlą się karty otwarte w Chrome na innych urządzeniach.</translation>
 <translation id="6575643671698722332">Błąd resetowania. Upewnij się, że urządzenie jest online, i spróbuj ponownie.</translation>
 <translation id="6600954340915313787">Skopiowana do Chrome</translation>
 <translation id="6612358246767739896">Treść chroniona</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">Dodaj</translation>
 <translation id="780301667611848630">Nie, dziękuję</translation>
 <translation id="7829298379596169484">Otwieram wejście audio</translation>
+<translation id="7837582000577464779">Podczas przetwarzania zamówienia wystąpił błąd. Sprawdź swoje konto i spróbuj ponownie.</translation>
+<translation id="7840369537802583269">Wykrywaj i odtwarzaj ważne multimedia w konkretnej witrynie.</translation>
 <translation id="7846076177841592234">Anuluj wybór</translation>
 <translation id="7851858861565204677">Inne urządzenia</translation>
 <translation id="7876243839304621966">Usuń wszystkie</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">Odtwarzanie pobranych treści (filmów, muzyki itp.) w innych aplikacjach może wymagać uzyskania licencji na podstawie nowych danych logowania urządzenia.
 
 Aby otrzymać nowe licencje, połącz się z internetem i odtwórz pobrane treści.</translation>
+<translation id="8636825310635137004">Aby korzystać z kart ze swoich innych urządzeń, włącz synchronizację</translation>
 <translation id="8660471606262461360">Z Google Payments</translation>
 <translation id="8676374126336081632">Wyczyść wpisany tekst</translation>
 <translation id="869891660844655955">Data wygaśnięcia</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
index 7e09f050..95bf3a6 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">O Chrome precisa ter acesso ao microfone para compartilhá-lo com este site.</translation>
 <translation id="1080790410959514870">Você está se desconectando de uma conta gerenciada por <ph name="DOMAIN_NAME" />. Essa ação excluirá os dados do Google Chrome armazenados neste dispositivo, mas os dados permanecerão na sua Conta do Google.</translation>
 <translation id="1098052486217676340">Concluído</translation>
+<translation id="1111673857033749125">Favoritos salvos nos seus outros dispositivos serão exibidos aqui.</translation>
 <translation id="1121094540300013208">Relatórios de uso e falhas</translation>
 <translation id="1137305377394488060">da última hora</translation>
 <translation id="1178581264944972037">Pausar</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Nunca traduzir este site</translation>
 <translation id="1291207594882862231">Limpar histórico, cookies, dados do site, cache…</translation>
 <translation id="129553762522093515">Recentemente fechadas</translation>
+<translation id="1326317727527857210">Para ver as guias dos seus outros dispositivos, faça login no Chrome.</translation>
 <translation id="13410144310025252">Ver no Chrome</translation>
 <translation id="1369915414381695676">Site <ph name="SITE_NAME" /> adicionado</translation>
 <translation id="1373696734384179344">Memória insuficiente para fazer o download do conteúdo selecionado.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Refinar</translation>
 <translation id="2315043854645842844">A seleção de certificado do cliente não é compatível com o sistema operacional.</translation>
 <translation id="2321958826496381788">Arraste o controle deslizante até que você possa ler confortavelmente. O texto deve ter pelo menos este tamanho após um toque duplo em um parágrafo.</translation>
+<translation id="2331464965008647960">Dispositivos próximos a você estão transmitindo páginas da Web por Bluetooth. O Chrome procurará e exibirá páginas quando você ativar seu dispositivo. Elas passarão por um serviço do Google para melhorar a qualidade dos resultados de páginas.
+
+É possível controlar a Web física nas configurações do Chrome.
+
+<ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Instalando...</translation>
 <translation id="2351097562818989364">As configurações de tradução foram redefinidas.</translation>
 <translation id="2359808026110333948">Continuar</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Oferecer para traduzir páginas usando o Google Tradutor</translation>
 <translation id="3089395242580810162">Abrir em guia anônima</translation>
 <translation id="3090193911106258841">Acessando entrada de áudio e vídeo</translation>
+<translation id="3117051980354074377">Para ver os favoritos dos seus outros dispositivos, faça login no Chrome.</translation>
 <translation id="3137521801621304719">Sair do modo de navegação anônima</translation>
 <translation id="3149891296864842641">Opção de envio</translation>
 <translation id="3162882791484435636">Selecionar opção de envio</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Informações legais</translation>
 <translation id="4089831646916293264">Este elemento pode interferir no acesso a serviços de dados Premium fornecidos pela sua operadora.</translation>
 <translation id="4099578267706723511">Ajude a melhorar o Chrome. Envie estatísticas de uso e relatório de falha ao Google.</translation>
+<translation id="410351446219883937">Reprodução automática</translation>
 <translation id="411254640334432676">Falha no download.</translation>
 <translation id="4113030288477039509">Gerenciado pelo seu administrador</translation>
 <translation id="4165986682804962316">Configurações do site</translation>
@@ -372,6 +381,7 @@
 <translation id="6042308850641462728">Mais</translation>
 <translation id="604996488070107836">Falha no download do arquivo <ph name="FILE_NAME" /> devido a um erro desconhecido.</translation>
 <translation id="605721222689873409">AA</translation>
+<translation id="605904398899306450">Permite que os sites reproduzam mídias importantes automaticamente (recomendado)</translation>
 <translation id="6075798973483050474">Editar página inicial</translation>
 <translation id="6108923351542677676">Configuração em andamento...</translation>
 <translation id="6112702117600201073">Atualizando página</translation>
@@ -408,6 +418,7 @@
 <translation id="6550675742724504774">Opções</translation>
 <translation id="656628257199996201">Sempre traduzir <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="6571070086367343653">Editar cartão de crédito</translation>
+<translation id="6573431926118603307">As guias que você abriu no Chrome nos seus outros dispositivos serão exibidas aqui.</translation>
 <translation id="6575643671698722332">Falha na redefinição. Veja se o dispositivo está on-line e tente novamente.</translation>
 <translation id="6600954340915313787">Copiado no Chrome</translation>
 <translation id="6612358246767739896">Conteúdo protegido</translation>
@@ -510,6 +521,8 @@
 <translation id="7791543448312431591">Adicionar</translation>
 <translation id="780301667611848630">Não</translation>
 <translation id="7829298379596169484">Acessando entrada de áudio</translation>
+<translation id="7837582000577464779">Ocorreu um erro ao processar seu pedido. Verifique sua conta e tente novamente.</translation>
+<translation id="7840369537802583269">Detectar e reproduzir mídias importantes para um site específico.</translation>
 <translation id="7846076177841592234">Cancelar seleção</translation>
 <translation id="7851858861565204677">Outros dispositivos</translation>
 <translation id="7876243839304621966">Remover tudo</translation>
@@ -565,6 +578,7 @@
 <translation id="8627706565932943526">Erro de sincronização</translation>
 <translation id="862875433388403934">Conteúdo (filmes, música, etc.) baixado em outros aplicativos pode não ser cobrado até que esses aplicativos readquiram licenças baseadas em uma nova credencial do dispositivo.
 Para receber novas licenças, conecte-se à Internet e use seu conteúdo baixado.</translation>
+<translation id="8636825310635137004">Para ver as guias dos seus outros dispositivos, ative a sincronização.</translation>
 <translation id="8660471606262461360">Do Google Payments</translation>
 <translation id="8676374126336081632">Limpar entrada</translation>
 <translation id="869891660844655955">Validade</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
index 90c91107..a16c9187 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">O Chrome necessita de acesso ao microfone para o partilhar com este site.</translation>
 <translation id="1080790410959514870">Está a terminar sessão numa conta gerida por <ph name="DOMAIN_NAME" />. Esta ação elimina os dados do Chrome armazenados neste dispositivo, mas os dados permanecem na sua Conta Google.</translation>
 <translation id="1098052486217676340">Concluído</translation>
+<translation id="1111673857033749125">Os marcadores guardados nos seus outros dispositivos são apresentados aqui.</translation>
 <translation id="1121094540300013208">Relatórios de utilização e falhas</translation>
 <translation id="1137305377394488060">da hora anterior</translation>
 <translation id="1178581264944972037">Pausa</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Nunca traduzir este site</translation>
 <translation id="1291207594882862231">Limpar histórico, cookies, dados de sites, cache…</translation>
 <translation id="129553762522093515">Fechados recentemente</translation>
+<translation id="1326317727527857210">Para obter os separadores dos seus outros dispositivos, inicie sessão no Chrome.</translation>
 <translation id="13410144310025252">Vê-los no Chrome</translation>
 <translation id="1369915414381695676">Site <ph name="SITE_NAME" /> adicionado</translation>
 <translation id="1373696734384179344">Memória insuficiente para transferir o conteúdo selecionado.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Refinar</translation>
 <translation id="2315043854645842844">O sistema operativo não suporta a seleção do certificado do lado do cliente.</translation>
 <translation id="2321958826496381788">Arraste o controlo de deslize até conseguir ler confortavelmente. O texto deve ter, pelo menos, este tamanho depois de tocar duas vezes num parágrafo.</translation>
+<translation id="2331464965008647960">Existem dispositivos próximos de si a transmitir páginas Web através de Bluetooth. O Chrome procura páginas e apresenta-as quando reativar o dispositivo. Estas páginas passam por um serviço Google para melhorar a qualidade dos resultados da página.
+
+Pode controlar a Web física nas Definições do Chrome.
+
+<ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">A instalar...</translation>
 <translation id="2351097562818989364">As definições de tradução foram repostas.</translation>
 <translation id="2359808026110333948">Continuar</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Oferecer-se para traduzir páginas com o Google Tradutor</translation>
 <translation id="3089395242580810162">Abrir no separador anónimo</translation>
 <translation id="3090193911106258841">A aceder à entrada de áudio e de vídeo</translation>
+<translation id="3117051980354074377">Para obter os marcadores dos seus outros dispositivos, inicie sessão no Chrome.</translation>
 <translation id="3137521801621304719">Sair do modo de navegação anónima</translation>
 <translation id="3149891296864842641">Opção de envio</translation>
 <translation id="3162882791484435636">Selecionar opção de envio</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Informações legais</translation>
 <translation id="4089831646916293264">Esta funcionalidade pode interferir com o acesso a serviços de dados premium fornecidos pelo seu operador.</translation>
 <translation id="4099578267706723511">Ajude a melhorar o Chrome ao enviar estatísticas de utilização e relatórios de falhas para a Google.</translation>
+<translation id="410351446219883937">Reprodução automática</translation>
 <translation id="411254640334432676">A transferência falhou.</translation>
 <translation id="4113030288477039509">Gerido pelo administrador</translation>
 <translation id="4165986682804962316">Definições de sites</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">Mais</translation>
 <translation id="604996488070107836">A transferência de <ph name="FILE_NAME" /> falhou devido a um erro desconhecido.</translation>
 <translation id="605721222689873409">AA</translation>
+<translation id="605904398899306450">Permitir que os sites reproduzam automaticamente conteúdos multimédia importantes (recomendado)</translation>
 <translation id="6075798973483050474">Editar página inicial</translation>
 <translation id="6108923351542677676">Configuração em curso…</translation>
 <translation id="6112702117600201073">A atualizar a página</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">Opções</translation>
 <translation id="656628257199996201">Traduzir sempre <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="6571070086367343653">Editar cartão de crédito</translation>
+<translation id="6573431926118603307">Os separadores que abriu no Chrome nos seus outros dispositivos são apresentados aqui.</translation>
 <translation id="6575643671698722332">Falha ao repor. Verifique se o dispositivo está online e tente novamente.</translation>
 <translation id="6600954340915313787">Copiado para o Chrome</translation>
 <translation id="6612358246767739896">Conteúdo protegido</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">Adicionar</translation>
 <translation id="780301667611848630">Não, obrigado</translation>
 <translation id="7829298379596169484">A aceder à entrada de áudio</translation>
+<translation id="7837582000577464779">Ocorreu um erro ao processar a encomenda. Verifique a sua conta e tente novamente.</translation>
+<translation id="7840369537802583269">Detetar e reproduzir conteúdos multimédia importantes de um site específico.</translation>
 <translation id="7846076177841592234">Cancelar seleção</translation>
 <translation id="7851858861565204677">Outros aparelhos</translation>
 <translation id="7876243839304621966">Remover tudo</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">É possível que os conteúdos (filmes, música, etc.) transferidos noutras aplicações deixem de ser reproduzíveis enquanto essas aplicações não voltarem a obter licenças com base numa nova credencial de dispositivo.
 
 Para obter licenças novas, ligue-se à Internet e reproduza o conteúdo transferido.</translation>
+<translation id="8636825310635137004">Para obter os separadores dos seus outros dispositivos, ative a sincronização.</translation>
 <translation id="8660471606262461360">Do Google Payments</translation>
 <translation id="8676374126336081632">Limpar texto</translation>
 <translation id="869891660844655955">Data de expiração</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
index bd3f0b2..7802a78 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Chrome are nevoie de acces la microfon pentru a-l acorda acestui site.</translation>
 <translation id="1080790410959514870">În prezent, te deconectezi de la un cont gestionat de <ph name="DOMAIN_NAME" />. Astfel, vor fi șterse datele Chrome stocate pe acest dispozitiv, dar datele vor rămâne în Contul Google.</translation>
 <translation id="1098052486217676340">Terminat</translation>
+<translation id="1111673857033749125">Marcajele salvate pe alte dispozitive vor apărea aici.</translation>
 <translation id="1121094540300013208">Statistici de utilizare și rapoarte de blocare</translation>
 <translation id="1137305377394488060">din ultima oră</translation>
 <translation id="1178581264944972037">Întrerupe</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Nu traduce niciodată acest site</translation>
 <translation id="1291207594882862231">Șterge istoricul, cookie-urile, datele privind site-urile și memoria cache…</translation>
 <translation id="129553762522093515">Închise recent</translation>
+<translation id="1326317727527857210">Pentru a accesa filele de pe alte dispozitive, conectează-te la Chrome.</translation>
 <translation id="13410144310025252">Afișează-le în Chrome</translation>
 <translation id="1369915414381695676">Site-ul <ph name="SITE_NAME" /> a fost adăugat</translation>
 <translation id="1373696734384179344">Memorie insuficientă pentru descărcarea conținutului selectat.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Rafinează</translation>
 <translation id="2315043854645842844">Selectarea certificatelor pe partea de client nu este acceptată de sistemul de operare.</translation>
 <translation id="2321958826496381788">Trage cursorul până poți citi textul cu ușurință. Textul trebuie să fie cel puțin la fel de mare ca acesta după o atingere dublă pe un paragraf.</translation>
+<translation id="2331464965008647960">Dispozitivele din apropiere difuzează pagini web prin Bluetooth. Chrome va căuta astfel de pagini și le va afișa când activezi dispozitivul. Aceste pagini vor fi procesate de un serviciu Google pentru a îmbunătăți calitatea rezultatelor cu pagini.
+
+Poți să controlezi Webul material din Setările Chrome.
+
+<ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Se instalează…</translation>
 <translation id="2351097562818989364">Setările de traducere au fost resetate.</translation>
 <translation id="2359808026110333948">Continuă</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Oferă traducerea paginilor folosind Google Traducere</translation>
 <translation id="3089395242580810162">Deschideți într-o filă incognito</translation>
 <translation id="3090193911106258841">Se accesează intrările audio și video</translation>
+<translation id="3117051980354074377">Pentru a accesa marcajele de pe alte dispozitive, conectează-te la Chrome.</translation>
 <translation id="3137521801621304719">Ieși din modul incognito</translation>
 <translation id="3149891296864842641">Opțiune de expediere</translation>
 <translation id="3162882791484435636">Selectează opțiunea de expediere</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Informații juridice</translation>
 <translation id="4089831646916293264">Această funcție poate afecta accesul la serviciile de date premium oferite de operator.</translation>
 <translation id="4099578267706723511">Contribuie la îmbunătățirea Chrome trimițând statistici de utilizare și rapoarte de blocare la Google.</translation>
+<translation id="410351446219883937">Redare automată</translation>
 <translation id="411254640334432676">Nu s-a descărcat.</translation>
 <translation id="4113030288477039509">Gestionat de administratorul tău</translation>
 <translation id="4165986682804962316">Setări pentru site-uri</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">Mai multe</translation>
 <translation id="604996488070107836">Fișierul <ph name="FILE_NAME" /> nu a fost descărcat din cauza unei erori necunoscute.</translation>
 <translation id="605721222689873409">AA</translation>
+<translation id="605904398899306450">Permite site-urilor să redea automat conținutul media important (recomandat)</translation>
 <translation id="6075798973483050474">Editează pagina de pornire</translation>
 <translation id="6108923351542677676">Configurare în curs...</translation>
 <translation id="6112702117600201073">Se actualizează pagina</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">Opțiuni</translation>
 <translation id="656628257199996201">Tradu întotdeauna din <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="6571070086367343653">Editează cardul de credit</translation>
+<translation id="6573431926118603307">Filele deschise în Chrome pe alte dispozitive vor apărea aici.</translation>
 <translation id="6575643671698722332">Nu s-a resetat. Asigură-te că ești online și încearcă din nou.</translation>
 <translation id="6600954340915313787">Copiat în Chrome</translation>
 <translation id="6612358246767739896">Conținut protejat</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">Adaugă</translation>
 <translation id="780301667611848630">Nu, mulțumesc</translation>
 <translation id="7829298379596169484">Se accesează intrarea audio</translation>
+<translation id="7837582000577464779">A apărut o eroare la procesarea comenzii. Verifică-ți contul și încearcă din nou.</translation>
+<translation id="7840369537802583269">Detectează și redă conținutul media important pentru un anumit site.</translation>
 <translation id="7846076177841592234">Anulează selecția</translation>
 <translation id="7851858861565204677">Alte dispozitive</translation>
 <translation id="7876243839304621966">Elimină tot</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">Conținutul (filme, muzică etc.) descărcat în alte aplicații nu va mai fi redat decât după ce aplicațiile obțin din nou licențe pe baza unor date de conectare noi pe dispozitiv.
 
 Pentru licențe noi, conectează-te la internet și redă conținutul descărcat.</translation>
+<translation id="8636825310635137004">Pentru a accesa filele de pe alte dispozitive, activează sincronizarea.</translation>
 <translation id="8660471606262461360">Din Google Payments</translation>
 <translation id="8676374126336081632">Șterge textul introdus</translation>
 <translation id="869891660844655955">Dată de expirare</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
index 739951f..9ce8967 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Предоставьте браузеру Chrome доступ к микрофону, чтобы пользоваться им на этом сайте.</translation>
 <translation id="1080790410959514870">Вы выходите из аккаунта, которым управляет администратор домена <ph name="DOMAIN_NAME" />. Все данные Chrome, хранящиеся на этом устройстве, будут удалены, но останутся в вашем аккаунте Google.</translation>
 <translation id="1098052486217676340">Завершено</translation>
+<translation id="1111673857033749125">Здесь появятся закладки, сохраненные на других устройствах.</translation>
 <translation id="1121094540300013208">Отчеты об использовании и сбоях</translation>
 <translation id="1137305377394488060">последний час</translation>
 <translation id="1178581264944972037">Пауза</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Никогда не переводить этот сайт</translation>
 <translation id="1291207594882862231">Удалить файлы cookie и данные сайтов, очистить историю и кеш…</translation>
 <translation id="129553762522093515">Недавно закрытые</translation>
+<translation id="1326317727527857210">Чтобы получить доступ к вкладкам на всех ваших устройствах, войдите в Chrome.</translation>
 <translation id="13410144310025252">Открыть в Chrome</translation>
 <translation id="1369915414381695676">Добавлен сайт <ph name="SITE_NAME" /></translation>
 <translation id="1373696734384179344">Недостаточно памяти для скачивания выбранного контента.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Уточнить</translation>
 <translation id="2315043854645842844">Сертификат, выбранный клиентом, не поддерживается операционной системой.</translation>
 <translation id="2321958826496381788">Перемещайте ползунок, пока текст не станет удобным для чтения. После двойного нажатия на абзац текст должен быть такого размера.</translation>
+<translation id="2331464965008647960">Просматривайте веб-страницы, связанные с объектами вокруг вас. Chrome будет искать их с помощью Bluetooth, когда ваше устройство разблокировано. Чтобы улучшить работу функции, страницы будут отправляться через сервис Google.
+
+Включить или отключить Интернет вокруг нас можно в настройках Chrome.
+
+<ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Установка…</translation>
 <translation id="2351097562818989364">Настройки перевода сброшены</translation>
 <translation id="2359808026110333948">Далее</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Предлагать переводить страницы с помощью Google Переводчика</translation>
 <translation id="3089395242580810162">Открыть в режиме инкогнито</translation>
 <translation id="3090193911106258841">Доступ к аудио- и видеовходу</translation>
+<translation id="3117051980354074377">Чтобы получить доступ к закладкам на всех ваших устройствах, войдите в Chrome.</translation>
 <translation id="3137521801621304719">Выключить режим инкогнито</translation>
 <translation id="3149891296864842641">Выберите вариант отправки</translation>
 <translation id="3162882791484435636">Выбрать вариант отправки</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Юридическая информация</translation>
 <translation id="4089831646916293264">Эта функция может мешать доступу к премиум-службам, которые предоставляет ваш оператор связи.</translation>
 <translation id="4099578267706723511">Отправлять в Google статистику использования и отчеты о сбоях</translation>
+<translation id="410351446219883937">Автовоспроизведение</translation>
 <translation id="411254640334432676">Ошибка при скачивании</translation>
 <translation id="4113030288477039509">Управляется администратором</translation>
 <translation id="4165986682804962316">Настройки сайта</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">Подробнее...</translation>
 <translation id="604996488070107836">Не удалось скачать файл <ph name="FILE_NAME" /> из-за неизвестной ошибки.</translation>
 <translation id="605721222689873409">ГГ</translation>
+<translation id="605904398899306450">Разрешить сайтам автовоспроизведение важных мультимедийных файлов (рекомендуется)</translation>
 <translation id="6075798973483050474">Изменение главной страницы</translation>
 <translation id="6108923351542677676">Настройка…</translation>
 <translation id="6112702117600201073">Обновление страницы</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">Параметры</translation>
 <translation id="656628257199996201">Всегда переводить <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="6571070086367343653">Изменить данные карты</translation>
+<translation id="6573431926118603307">Здесь появятся вкладки, открытые в Chrome на других устройствах.</translation>
 <translation id="6575643671698722332">Ошибка сброса. Подключитесь к Интернету и повторите попытку.</translation>
 <translation id="6600954340915313787">Скопировано в Chrome</translation>
 <translation id="6612358246767739896">Защищенное содержание</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">Добавить</translation>
 <translation id="780301667611848630">Спасибо, не надо</translation>
 <translation id="7829298379596169484">Доступ к аудиовходу</translation>
+<translation id="7837582000577464779">Не удалось обработать заказ. Проверьте аккаунт и повторите попытку.</translation>
+<translation id="7840369537802583269">Поиск важных мультимедийных файлов и их воспроизведение для конкретного сайта.</translation>
 <translation id="7846076177841592234">Отменить выбор</translation>
 <translation id="7851858861565204677">Другие устройства</translation>
 <translation id="7876243839304621966">Удалить все</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">Воспроизведение контента (фильмов, музыки и т. д.), скачанного в других приложениях, может не поддерживаться, пока не будут получены лицензии с новыми учетными данными устройства.
 
 Чтобы получить новые лицензии, подключитесь к Интернету и воспроизведите скачанный контент.</translation>
+<translation id="8636825310635137004">Чтобы получить доступ к вкладкам на всех ваших устройствах, включите синхронизацию.</translation>
 <translation id="8660471606262461360">Из Google Payments</translation>
 <translation id="8676374126336081632">Очистить</translation>
 <translation id="869891660844655955">Срок действия</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
index 692f507c..ec79837 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Na to, aby Chrome mohol s týmito webovými stránkami zdieľať mikrofón, musí mať k nemu prístup.</translation>
 <translation id="1080790410959514870">Odhlasujete sa z účtu spravovaného doménou <ph name="DOMAIN_NAME" />. Vymažú sa údaje prehliadača Chrome uložené na tomto zariadení, ale údaje uložené v účte Google zostanú zachované.</translation>
 <translation id="1098052486217676340">Dokončené</translation>
+<translation id="1111673857033749125">Tu sa zobrazia záložky, ktoré ste uložili na iných zariadeniach.</translation>
 <translation id="1121094540300013208">Správy o použití a o zlyhaní</translation>
 <translation id="1137305377394488060">poslednej hodiny</translation>
 <translation id="1178581264944972037">Pozastaviť</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Nikdy neprekladať tieto webové stránky</translation>
 <translation id="1291207594882862231">Vymazať históriu, súbory cookie, údaje stránok, vyrovnávaciu pamäť…</translation>
 <translation id="129553762522093515">Naposledy zatvorené</translation>
+<translation id="1326317727527857210">Ak chcete získať karty z ďalších svojich zariadení, prihláste sa do Chromu.</translation>
 <translation id="13410144310025252">Zobrazte si ich v Chrome</translation>
 <translation id="1369915414381695676">Boli pridané stránky <ph name="SITE_NAME" /></translation>
 <translation id="1373696734384179344">Vybraný obsah nie je možné stiahnuť z dôvodu nedostatku pamäte</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Upraviť</translation>
 <translation id="2315043854645842844">Operačný systém nepodporuje výber certifikátu na strane klienta.</translation>
 <translation id="2321958826496381788">Presúvajte posúvač, dokým nebude čítanie tohto textu pohodlné. Po dvojitom klepnutí na odsek by mal byť text aspoň takto veľký.</translation>
+<translation id="2331464965008647960">Zariadenia vo vašom okolí vysielajú webové stránky prostredníctvom funkcie Bluetooth. Chrome bude vyhľadávať stránky a zobrazí ich, keď zariadenie prebudíte z režimu spánku. Tieto stránky bude s cieľom zlepšenia kvality vyhľadávania spracovávať Google.
+
+Predvoľby Fyzického webu môžete ovládať v Nastaveniach Chromu.
+
+<ph name="BEGIN_LINK" />Ďalšie informácie<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Inštaluje sa…</translation>
 <translation id="2351097562818989364">Nastavenia prekladov boli resetované.</translation>
 <translation id="2359808026110333948">Pokračovať</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Ponúkať preklady stránok pomocou Prekladača Google</translation>
 <translation id="3089395242580810162">Otvoriť na karte inkognito</translation>
 <translation id="3090193911106258841">Pristupovanie k zvukovému vstupu a vstupu videa</translation>
+<translation id="3117051980354074377">Ak chcete získať svoje záložky z ostatných zariadení, prihláste sa do Chromu.</translation>
 <translation id="3137521801621304719">Ukončiť režim inkognito</translation>
 <translation id="3149891296864842641">Možnosť dodania</translation>
 <translation id="3162882791484435636">Vybrať možnosť dodania</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Právne informácie</translation>
 <translation id="4089831646916293264">Táto funkcia môže byť v konflikte s prémiovými dátovými službami poskytovanými vaším operátorom.</translation>
 <translation id="4099578267706723511">Odosielanie štatistík používania a prehľadu chýb pomôže Googlu zlepšiť Chrome.</translation>
+<translation id="410351446219883937">Automatické prehrávanie</translation>
 <translation id="411254640334432676">Sťahovanie zlyhalo.</translation>
 <translation id="4113030288477039509">Spravované vaším správcom</translation>
 <translation id="4165986682804962316">Nastavenia webu</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">Viac</translation>
 <translation id="604996488070107836">Súbor <ph name="FILE_NAME" /> sa nepodarilo stiahnuť z dôvodu neznámej chyby.</translation>
 <translation id="605721222689873409">RR</translation>
+<translation id="605904398899306450">Povoliť webom automaticky prehrávať dôležité médiá (odporúčané)</translation>
 <translation id="6075798973483050474">Úprava domovskej stránky</translation>
 <translation id="6108923351542677676">Inštaluje sa...</translation>
 <translation id="6112702117600201073">Obnovenie stránky</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">Možnosti</translation>
 <translation id="656628257199996201">Vždy prekladať jazyk <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="6571070086367343653">Upraviť kreditnú kartu</translation>
+<translation id="6573431926118603307">Tu sa zobrazia karty, ktoré ste otvorili v Chrome na iných zariadeniach.</translation>
 <translation id="6575643671698722332">Resetovanie zlyhalo. Uistite sa, že je zariadenie online, a skúste to znova.</translation>
 <translation id="6600954340915313787">Skopírovaná do prehliadača Chrome</translation>
 <translation id="6612358246767739896">Chránený obsah</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">Pridať</translation>
 <translation id="780301667611848630">Nie, ďakujem</translation>
 <translation id="7829298379596169484">Pristupovanie k zvukovému vstupu</translation>
+<translation id="7837582000577464779">Pri spracovaní vašej objednávky sa vyskytla chyba. Skontrolujte svoj účet a skúste to znova.</translation>
+<translation id="7840369537802583269">Detekcia a prehrávanie dôležitých médií pre konkrétny web.</translation>
 <translation id="7846076177841592234">Zrušiť výber</translation>
 <translation id="7851858861565204677">Ďalšie zariadenia</translation>
 <translation id="7876243839304621966">Odstrániť všetko</translation>
@@ -565,6 +578,7 @@
 <translation id="8617240290563765734">Otvoriť navrhovanú webovú adresu určenú v stiahnutom obsahu?</translation>
 <translation id="8627706565932943526">Chyba synchronizácie</translation>
 <translation id="862875433388403934">Obsah (filmy, hudba atď.) stiahnutý v iných aplikáciách sa nemusí dať prehrať, pokiaľ aplikácie opätovne nezískajú licencie na základe nových poverení zariadenia. Ak chcete získať nové licencie, pripojte sa k internetu a prehrajte stiahnutý obsah.</translation>
+<translation id="8636825310635137004">Ak chcete získať karty zo svojich ostatných zariadení, zapnite synchronizáciu.</translation>
 <translation id="8660471606262461360">Zo služby Google Payments</translation>
 <translation id="8676374126336081632">Vymazať vstup</translation>
 <translation id="869891660844655955">Koniec platnosti</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
index d4d4c6c..fc730ec0f 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Chrome potrebuje dostop do mikrofona, če želite, da temu spletnemu mestu omogoči dostop do njega.</translation>
 <translation id="1080790410959514870">Odjavljate se iz računa, ki ga upravlja <ph name="DOMAIN_NAME" />. S tem bodo izbrisani podatki, ki jih je Chrome shranil v tej napravi, vendar bodo podatki ostali v vašem Google Računu.</translation>
 <translation id="1098052486217676340">Končano</translation>
+<translation id="1111673857033749125">Tu bodo prikazani zaznamki, shranjeni v drugih napravah.</translation>
 <translation id="1121094540300013208">Poročila o uporabi in zrušitvah</translation>
 <translation id="1137305377394488060">zadnje ure</translation>
 <translation id="1178581264944972037">Prekini</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Nikoli ne prevedi tega spletnega mesta</translation>
 <translation id="1291207594882862231">Izbris zgodovine, piškotkov, podatkov spletnih mest, predpomnilnika …</translation>
 <translation id="129553762522093515">Nedavno zaprto</translation>
+<translation id="1326317727527857210">Če želite dostopati do zavihkov v drugih napravah, se prijavite v Chrome.</translation>
 <translation id="13410144310025252">Ogled v Chromu</translation>
 <translation id="1369915414381695676">Spletno mesto <ph name="SITE_NAME" /> je bilo dodano</translation>
 <translation id="1373696734384179344">Za prenos izbrane vsebine ni dovolj pomnilnika.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Izboljšaj iskanje</translation>
 <translation id="2315043854645842844">Operacijski sistem ne podpira izbire potrdila pri odjemalcu.</translation>
 <translation id="2321958826496381788">Drsnik povlecite do želene velikosti pisave. Besedilo naj bo po dvakratnem dotiku odstavka videti vsaj tolikšno.</translation>
+<translation id="2331464965008647960">Naprave v vaši bližini oddajajo spletne strani prek Bluetootha. Chrome bo iskal strani in jih prikazal, ko preklopite napravo iz stanja pripravljenosti. Te strani bo zaradi izboljšanja kakovosti rezultatov za strani obdelala Googlova storitev.
+
+Fizični splet lahko nadzirate v Chromovih nastavitvah.
+
+<ph name="BEGIN_LINK" />Več o tem<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Nameščanje ...</translation>
 <translation id="2351097562818989364">Nastavitve za prevajanje so ponastavljene.</translation>
 <translation id="2359808026110333948">Nadaljuj</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Ponudi prevajanje strani z Google Prevajalnikom</translation>
 <translation id="3089395242580810162">Odpri v zavihku brez beleženja zgodovine</translation>
 <translation id="3090193911106258841">Dostopanje do zvočnih vhodov in videovhodov</translation>
+<translation id="3117051980354074377">Če želite dostopati do zaznamkov v drugih napravah, se prijavite v Chrome.</translation>
 <translation id="3137521801621304719">Izklop načina brez beleženja zgodovine</translation>
 <translation id="3149891296864842641">Možnost pošiljanja</translation>
 <translation id="3162882791484435636">Izbira možnosti pošiljanja</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Pravne informacije</translation>
 <translation id="4089831646916293264">Ta funkcija lahko ovira dostop do plačljivih podatkovnih storitev operaterja.</translation>
 <translation id="4099578267706723511">Pomagajte izboljšati Chrome s pošiljanjem statističnih podatkov o uporabi in poročil o zrušitvah Googlu.</translation>
+<translation id="410351446219883937">Samodejno predvajanje</translation>
 <translation id="411254640334432676">Prenos ni uspel.</translation>
 <translation id="4113030288477039509">Upravlja skrbnik</translation>
 <translation id="4165986682804962316">Nastavitve spletnega mesta</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">Več</translation>
 <translation id="604996488070107836">Prenos datoteke <ph name="FILE_NAME" /> ni uspel zaradi neznane napake.</translation>
 <translation id="605721222689873409">LL</translation>
+<translation id="605904398899306450">Dovoli spletnim mestom samodejno predvajanje pomembne vsebine (priporočljivo)</translation>
 <translation id="6075798973483050474">Urejanje domače strani</translation>
 <translation id="6108923351542677676">Poteka nastavitev …</translation>
 <translation id="6112702117600201073">Osveževanje strani</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">Možnosti</translation>
 <translation id="656628257199996201">Vedno prevedi ta jezik: <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="6571070086367343653">Urejanje kreditne kartice</translation>
+<translation id="6573431926118603307">Zavihki, ki ste jih odprli v Chromu v drugih napravah, bodo prikazani tukaj.</translation>
 <translation id="6575643671698722332">Ponastavitev ni uspela. Vzpostavite povezavo in poskusite znova.</translation>
 <translation id="6600954340915313787">Kopirano v Chrome</translation>
 <translation id="6612358246767739896">Zaščitena vsebina</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">Dodaj</translation>
 <translation id="780301667611848630">Ne, hvala</translation>
 <translation id="7829298379596169484">Dostopanje do zvočnega vhoda</translation>
+<translation id="7837582000577464779">Pri obdelavi naročila je prišlo do napake. Preverite račun in poskusite znova.</translation>
+<translation id="7840369537802583269">Zaznavanje in predvajanje pomembne vsebine za določeno spletno mesto.</translation>
 <translation id="7846076177841592234">Prekliči izbor</translation>
 <translation id="7851858861565204677">Druge naprave</translation>
 <translation id="7876243839304621966">Odstrani vse</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">Prenesene vsebine (filmov, glasbe ipd.) morda ne bo mogoče več predvajati v drugih aplikacijah, dokler te znova ne pridobijo licenc na podlagi nove poverilnice naprave.
 
 Nove licence dobite tako, da se povežete v internet in predvajate preneseno vsebino.</translation>
+<translation id="8636825310635137004">Če želite dostopati do zavihkov iz drugih naprav, vklopite sinhronizacijo.</translation>
 <translation id="8660471606262461360">Iz storitve Google Payments</translation>
 <translation id="8676374126336081632">Izbriši vnos</translation>
 <translation id="869891660844655955">Datum izteka</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
index a8b505bd..e9b8d18 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Chrome-у је потребан приступ за микрофон да би га делио са овим сајтом.</translation>
 <translation id="1080790410959514870">Одјављујете се са налога којим управља <ph name="DOMAIN_NAME" />. То ће избрисати Chrome податке сачуване на овом уређају, али ће подаци остати на Google налогу.</translation>
 <translation id="1098052486217676340">Завршено је</translation>
+<translation id="1111673857033749125">Обележивачи сачувани на другим уређајима ће се приказати овде.</translation>
 <translation id="1121094540300013208">Извештаји о коришћењу и отказивању</translation>
 <translation id="1137305377394488060">прошли сат</translation>
 <translation id="1178581264944972037">Паузирај</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Никад не преводи овај сајт</translation>
 <translation id="1291207594882862231">Обришите историју, колачиће, податке о сајтовима, кеш...</translation>
 <translation id="129553762522093515">Недавно затворено</translation>
+<translation id="1326317727527857210">Да би вам картице биле доступне на другим уређајима, пријавите се у Chrome.</translation>
 <translation id="13410144310025252">Прегледајте их у Chrome-у</translation>
 <translation id="1369915414381695676">Сајт <ph name="SITE_NAME" /> је додат</translation>
 <translation id="1373696734384179344">Нема довољно меморије за преузимање изабраног садржаја.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Прецизирај</translation>
 <translation id="2315043854645842844">Оперативни систем не подржава избор сертификата за клијента.</translation>
 <translation id="2321958826496381788">Превлачите клизач док ово не будете могли лако да прочитате. Када двапут додирнете пасус, текст треба да буде бар оволики.</translation>
+<translation id="2331464965008647960">Уређаји у околини емитују веб-странице преко Bluetooth-а. Chrome скенира странице и приказује их када пробудите уређај. Те странице се шаљу Google услузи да би се побољшао квалитет резултата за странице.
+
+Интернет око нас можете да контролишете у Подешавањима Chrome-а.
+
+<ph name="BEGIN_LINK" />Сазнајте више<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Инсталира се...</translation>
 <translation id="2351097562818989364">Подешавања за превођење су ресетована.</translation>
 <translation id="2359808026110333948">Настави</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Нуди превод страница помоћу Google преводиоца</translation>
 <translation id="3089395242580810162">Отварање на картици без архивирања</translation>
 <translation id="3090193911106258841">Приступа се аудио и видео улазу</translation>
+<translation id="3117051980354074377">Да би вам обележивачи били доступни на другим уређајима, пријавите се у Chrome.</translation>
 <translation id="3137521801621304719">Изађи из режима без архивирања</translation>
 <translation id="3149891296864842641">Опције испоруке</translation>
 <translation id="3162882791484435636">Изабери опцију испоруке</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Правне информације</translation>
 <translation id="4089831646916293264">Ова функција може да омета приступ премијум услугама за пренос података које пружа мобилни оператер.</translation>
 <translation id="4099578267706723511">Побољшајте Chrome слањем статистике коришћења и извештаја о отказивању Google-у.</translation>
+<translation id="410351446219883937">Аутоплеј</translation>
 <translation id="411254640334432676">Преузимање није успело.</translation>
 <translation id="4113030288477039509">Овим управља администратор</translation>
 <translation id="4165986682804962316">Подешавања сајта</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">Више</translation>
 <translation id="604996488070107836">Преузимање датотеке <ph name="FILE_NAME" /> није успело због непознате грешке.</translation>
 <translation id="605721222689873409">ГГ</translation>
+<translation id="605904398899306450">Дозвољава сајтовима да аутоматски репродукују важне медијске датотеке (препоручено)</translation>
 <translation id="6075798973483050474">Измените почетну страницу</translation>
 <translation id="6108923351542677676">Подешавање је у току...</translation>
 <translation id="6112702117600201073">Освежавање странице</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">Опције</translation>
 <translation id="656628257199996201">Увек преводи <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="6571070086367343653">Измена кредитне картице</translation>
+<translation id="6573431926118603307">Овде ће се приказати картице које отворите у Chrome-у на другим уређајима.</translation>
 <translation id="6575643671698722332">Ресетовање није успело. Уверите се да је уређај онлајн и покушајте поново.</translation>
 <translation id="6600954340915313787">Копирана у Chrome</translation>
 <translation id="6612358246767739896">Заштићени садржај</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">Додај</translation>
 <translation id="780301667611848630">Не, хвала</translation>
 <translation id="7829298379596169484">Приступа се аудио улазу</translation>
+<translation id="7837582000577464779">Дошло је до грешке при обради захтева. Проверите налог и покушајте поново.</translation>
+<translation id="7840369537802583269">Открива и репродукује важне медијске датотеке за одређени сајт.</translation>
 <translation id="7846076177841592234">Откажи избор</translation>
 <translation id="7851858861565204677">Други уређаји</translation>
 <translation id="7876243839304621966">Уклони све</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">Можда више нећете моћи да пуштате садржај (филмови, музика итд.) преузет у другим апликацијама док оне поново не добију лиценце на основу новог акредитива уређаја.
 
 Да бисте добили нове лиценце, повежите се на интернет и пустите преузети садржај.</translation>
+<translation id="8636825310635137004">Да би вам картице биле доступне на другим уређајима, укључите синхронизацију.</translation>
 <translation id="8660471606262461360">Од Google Payments-а</translation>
 <translation id="8676374126336081632">Обриши унос</translation>
 <translation id="869891660844655955">Датум истека</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
index 6869f61..6978410c 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Chrome behöver tillgång till mikrofonen för att kunna dela den på den här webbplatsen.</translation>
 <translation id="1080790410959514870">Du loggar ut från ett konto som hanteras av <ph name="DOMAIN_NAME" />. Chrome-data som lagras på enheten kommer att tas bort, men all data finns kvar i ditt Google-konto.</translation>
 <translation id="1098052486217676340">Har avslutats</translation>
+<translation id="1111673857033749125">Här visas bokmärken som du har sparat på andra enheter.</translation>
 <translation id="1121094540300013208">Användning och felrapporter</translation>
 <translation id="1137305377394488060">den senaste timmen</translation>
 <translation id="1178581264944972037">Paus</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Översätt aldrig den här webbplatsen</translation>
 <translation id="1291207594882862231">Rensa historiken, cookies, webbplatsdata, cacheminnet …</translation>
 <translation id="129553762522093515">Nyligen stängda</translation>
+<translation id="1326317727527857210">Logga in i Chrome om du vill ha samma flikar tillgängliga på alla enheter.</translation>
 <translation id="13410144310025252">Visa dem i Chrome</translation>
 <translation id="1369915414381695676">Webbplatsen <ph name="SITE_NAME" /> har lagts till</translation>
 <translation id="1373696734384179344">Det finns inte tillräckligt med minne för att hämta det valda innehållet.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Finjustera</translation>
 <translation id="2315043854645842844">Val av certifikat på klienten stöds inte av operativsystemet.</translation>
 <translation id="2321958826496381788">Flytta reglaget tills du kan läsa texten ordentligt. Texten bör bli åtminstone så här stor när du trycker två gånger på ett stycke.</translation>
+<translation id="2331464965008647960">Enheter i närheten sänder webbsidor via Bluetooth. Chrome söker efter sidor och visar dem när du startar enheten. Sidorna skickas via en tjänst från Google för att förbättra kvaliteten på sidresultaten.
+
+Du kan styra Physical Web i inställningarna för Chrome
+
+<ph name="BEGIN_LINK" />Läs mer<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Installerar …</translation>
 <translation id="2351097562818989364">Översättningsinställningarna har återställts.</translation>
 <translation id="2359808026110333948">Fortsätt</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Erbjud att översätta sidor med Google Översätt</translation>
 <translation id="3089395242580810162">Öppna i inkognitoflik</translation>
 <translation id="3090193911106258841">Får åtkomst till ljud- och videoindata</translation>
+<translation id="3117051980354074377">Logga in i Chrome om du vill ha samma bokmärken tillgängliga på alla enheter.</translation>
 <translation id="3137521801621304719">Inaktivera inkognitoläge</translation>
 <translation id="3149891296864842641">Fraktalternativ</translation>
 <translation id="3162882791484435636">Välj fraktalternativ</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Juridisk information</translation>
 <translation id="4089831646916293264">Det kan hända att den här funktionen förhindrar åtkomst till premiumdatatjänster från operatören.</translation>
 <translation id="4099578267706723511">Hjälp till att förbättra Chrome genom att skicka användningsstatistik och felrapporter till Google.</translation>
+<translation id="410351446219883937">Automatisk uppspelning</translation>
 <translation id="411254640334432676">Nedladdningen misslyckades.</translation>
 <translation id="4113030288477039509">Hanteras av administratören</translation>
 <translation id="4165986682804962316">Platsinställningar</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">Mer</translation>
 <translation id="604996488070107836">Det gick inte att ladda ned <ph name="FILE_NAME" /> på grund av ett okänt fel.</translation>
 <translation id="605721222689873409">ÅÅ</translation>
+<translation id="605904398899306450">Tillåt att webbplatser spelar upp viktig media automatiskt (rekommenderas)</translation>
 <translation id="6075798973483050474">Redigera startsidan</translation>
 <translation id="6108923351542677676">Konfigurationen pågår ...</translation>
 <translation id="6112702117600201073">Uppdaterar sidan</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">Alternativ</translation>
 <translation id="656628257199996201">Översätt alltid <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="6571070086367343653">Redigera kreditkort</translation>
+<translation id="6573431926118603307">Här visas flikar som du har öppnat i Chrome på andra enheter.</translation>
 <translation id="6575643671698722332">Fel vid återställning. Kolla att enheten är online. Försök igen.</translation>
 <translation id="6600954340915313787">Kopierat till Chrome</translation>
 <translation id="6612358246767739896">Skyddat innehåll</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">Lägg till</translation>
 <translation id="780301667611848630">Nej tack</translation>
 <translation id="7829298379596169484">Får åtkomst till ljudindata</translation>
+<translation id="7837582000577464779">Det uppstod ett problem när din beställning behandlades. Kontrollera kontot och försök igen.</translation>
+<translation id="7840369537802583269">Identifiera och spela upp viktig media på en viss webbplats.</translation>
 <translation id="7846076177841592234">Rensa val</translation>
 <translation id="7851858861565204677">Andra enheter</translation>
 <translation id="7876243839304621966">Ta bort alla</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">Det kan hända att det inte går att spela upp innehåll (t.ex. filmer och musik) som har hämtats i andra appar förrän dessa appar får nya licenser som baseras på nya användaruppgifter för enheten.
 
 Du hämtar nya licenser genom att ansluta till internet och spela upp det nedladdade innehållet.</translation>
+<translation id="8636825310635137004">Aktivera synkronisering om du vill ha samma flikar tillgängliga på alla enheter.</translation>
 <translation id="8660471606262461360">Från Google Payments</translation>
 <translation id="8676374126336081632">Radera inmatning</translation>
 <translation id="869891660844655955">Utgångsdatum</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
index 4cb90d4..2abb664 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Chrome inahitaji idhini ya kufikia maikrofoni ili iishiriki na tovuti hii.</translation>
 <translation id="1080790410959514870">Unaondoka katika akaunti inayodhibitiwa na <ph name="DOMAIN_NAME" />. Hii itafuta data ya Chrome iliyohifadhiwa kwenye kifaa hiki, lakini data itasalia katika Akaunti yako ya Google.</translation>
 <translation id="1098052486217676340">Imekamilika</translation>
+<translation id="1111673857033749125">Alamisho zilizohifadhiwa katika vifaa vyako vingine zitaonekana hapa.</translation>
 <translation id="1121094540300013208">Ripoti za matumizi na za kuacha kufanya kazi</translation>
 <translation id="1137305377394488060">saa moja iliyopita</translation>
 <translation id="1178581264944972037">Sitisha</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Kamwe usitafsiri tovuti hii</translation>
 <translation id="1291207594882862231">Futa historia, vidakuzi, data ya tovuti, akiba…</translation>
 <translation id="129553762522093515">Vilivyofungwa hivi karibuni</translation>
+<translation id="1326317727527857210">Ili upate vichupo kutoka vifaa vyako vingine, ingia katika Chrome.</translation>
 <translation id="13410144310025252">Viangalie katika Chrome</translation>
 <translation id="1369915414381695676">Tovuti <ph name="SITE_NAME" /> imeongezwa</translation>
 <translation id="1373696734384179344">Hakuna hifadhi ya kutosha ya kupakua maudhui yaliyochaguliwa.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Chuja</translation>
 <translation id="2315043854645842844">Uchaguzi wa cheti cha sehemu ya seva teja hautumiwi na mfumo wa uendeshaji.</translation>
 <translation id="2321958826496381788">Buruta kitelezi hadi uweze kusoma haya kwa starehe. Maandishi yanapaswa kuonekana angalau kwa ukubwa huu baada ya kugonga mara mbili kwenye aya.</translation>
+<translation id="2331464965008647960">Vifaa vilivyo karibu nawe vinatuma kurasa za wavuti kupitia Bluetooth. Chrome itachanganua kurasa na kuzionyesha ukifungua kifaa chako. Kurasa hizi zitaboreshwa katika huduma za Google ili kuimarisha ubora wa matokeo ya kurasa.
+
+Unaweza kudhibiti Wavuti Kila Mahali katika Mipangilio ya Chrome.
+
+<ph name="BEGIN_LINK" />Pata maelezo zaidi<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Inasakinisha...</translation>
 <translation id="2351097562818989364">Mipangilio yako ya kutafsiri imewekwa upya.</translation>
 <translation id="2359808026110333948">Endelea</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Jitolee kutafsiri kurasa kwa kutumia huduma ya Google Tafsiri</translation>
 <translation id="3089395242580810162">Fungua kwenye kichupo fiche</translation>
 <translation id="3090193911106258841">Inafikia vifaa vya kuingiza sauti na video</translation>
+<translation id="3117051980354074377">Ili upate alamisho kutoka vifaa vyako vingine, ingia katika Chrome.</translation>
 <translation id="3137521801621304719">Ondoka kwenye hali fiche</translation>
 <translation id="3149891296864842641">Chaguo la usafirishaji</translation>
 <translation id="3162882791484435636">Teua chaguo la usafirishaji</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Maelezo ya kisheria</translation>
 <translation id="4089831646916293264">Kipengele hiki kinaweza kutatiza ufikiaji wa huduma za data za kulipia unazopata kutoka kwa mtoa huduma wako.</translation>
 <translation id="4099578267706723511">Saidia kuboresha Chrome kwa kutumia Google takwimu za matumizi na ripoti wakati wowote kivinjari hiki kinapoacha kufanya kazi.</translation>
+<translation id="410351446219883937">Kucheza kiotomatiki</translation>
 <translation id="411254640334432676">Upakuaji haujafaulu.</translation>
 <translation id="4113030288477039509">Inadhibitiwa na msimamizi wako</translation>
 <translation id="4165986682804962316">Mipangilio ya tovuti</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">Zaidi</translation>
 <translation id="604996488070107836">Kipakuliwa cha <ph name="FILE_NAME" /> hakijafaulu kwa sababu ya hitilafu isiyojulikana.</translation>
 <translation id="605721222689873409">MK</translation>
+<translation id="605904398899306450">Ruhusu tovuti zicheze maudhui muhimu kiotomatiki (imependekezwa)</translation>
 <translation id="6075798973483050474">Badilisha ukurasa wa mwanzo</translation>
 <translation id="6108923351542677676">Usanidi unaendelea...</translation>
 <translation id="6112702117600201073">Inaonyesha upya ukurasa</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">Chaguo</translation>
 <translation id="656628257199996201">Tafsiri <ph name="SOURCE_LANGUAGE" /> kila wakati</translation>
 <translation id="6571070086367343653">Hariri kadi ya mkopo</translation>
+<translation id="6573431926118603307">Vichupo ulivyofungua katika Chrome kwenye vifaa vyako vingine vitaonekana hapa.</translation>
 <translation id="6575643671698722332">Imeshindwa kuweka upya. Hakikisha kuwa kifaa chako kiko mtandaoni na ujaribu tena.</translation>
 <translation id="6600954340915313787">Imenakiliwa kwenye Chrome</translation>
 <translation id="6612358246767739896">Maudhui yanayolindwa</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">Ongeza</translation>
 <translation id="780301667611848630">Sitaki</translation>
 <translation id="7829298379596169484">Inafikia vifaa vya kuingiza sauti</translation>
+<translation id="7837582000577464779">Hitilafu ilitokea wakati wa kushughulikia agizo lako. Tafadhali angalia akaunti yako na ujaribu tena.</translation>
+<translation id="7840369537802583269">Gundua na ucheze maudhui muhimu ya tovuti mahsusi.</translation>
 <translation id="7846076177841592234">Ghairi uchaguzi</translation>
 <translation id="7851858861565204677">Vifaa vingine</translation>
 <translation id="7876243839304621966">Ondoa yote</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">Maudhui (filamu, muziki, n.k.) yaliyopakuliwa katika programu nyingine huenda yasichezeke tena hadi programu hizo zipate upya leseni kulingana na kitambulisho kipya cha kifaa.
 
 Ili kupata leseni mpya, unganisha kwenye intaneti na ucheze maudhui yako yaliyopakuliwa.</translation>
+<translation id="8636825310635137004">Ili upate vichupo kutoka vifaa vyako vingine, washa kipengele cha usawazishaji.</translation>
 <translation id="8660471606262461360">Kutoka Google Payments</translation>
 <translation id="8676374126336081632">Futa uingizaji wa maandishi</translation>
 <translation id="869891660844655955">Muda wake unakwisha tarehe</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
index 6a14b31..7ac3e41 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Chrome ต้องการเข้าถึงไมโครโฟนเพื่อแชร์กับเว็บไซต์นี้</translation>
 <translation id="1080790410959514870">คุณกำลังออกจากระบบบัญชีที่จัดการโดย <ph name="DOMAIN_NAME" /> การออกจากระบบจะลบข้อมูล Chrome ที่จัดเก็บในอุปกรณ์นี้ แต่ข้อมูลดังกล่าวจะยังคงอยู่ในบัญชี Google ของคุณ</translation>
 <translation id="1098052486217676340">เสร็จแล้ว</translation>
+<translation id="1111673857033749125">บุ๊กมาร์กที่บันทึกไว้ในอุปกรณ์เครื่องอื่นๆ ของคุณจะปรากฏที่นี่</translation>
 <translation id="1121094540300013208">รายงานการใช้งานและข้อขัดข้อง</translation>
 <translation id="1137305377394488060">ชั่วโมงที่ผ่านมา</translation>
 <translation id="1178581264944972037">หยุดชั่วคราว</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">ไม่ต้องแปลไซต์นี้</translation>
 <translation id="1291207594882862231">ล้างประวัติการเข้าชม คุกกี้ ข้อมูลเว็บไซต์ แคช…</translation>
 <translation id="129553762522093515">เพิ่งปิด</translation>
+<translation id="1326317727527857210">ลงชื่อเข้าใช้ Chrome เพื่อรับแท็บจากอุปกรณ์เครื่องอื่นๆ ของคุณ</translation>
 <translation id="13410144310025252">ดูใน Chrome</translation>
 <translation id="1369915414381695676">เพิ่มเว็บไซต์ <ph name="SITE_NAME" /> แล้ว</translation>
 <translation id="1373696734384179344">หน่วยความจำไม่เพียงพอที่จะดาวน์โหลดเนื้อหาที่เลือก</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">ปรับแต่ง</translation>
 <translation id="2315043854645842844">ระบบปฏิบัติการไม่สนับสนุนการเลือกใบรับรองฝั่งลูกค้า</translation>
 <translation id="2321958826496381788">ลากแถบเลื่อนจนกว่าคุณจะสามารถอ่านได้อย่างสะดวก ข้อความควรมีขนาดเท่านี้เป็นอย่างน้อยหลังจากแตะ 2 ครั้งบนย่อหน้า</translation>
+<translation id="2331464965008647960">อุปกรณ์ใกล้เคียงคุณกำลังเผยแพร่หน้าเว็บผ่านบลูทูธ Chrome จะสแกนหาและแสดงหน้าเว็บดังกล่าวเมื่อคุณเรียกให้อุปกรณ์ทำงาน หน้าเหล่านี้จะแสดงผ่านบริการของ Google เพื่อปรับปรุงคุณภาพผลการค้นหาหน้าเว็บ
+
+คุณควบคุม Physical Web ได้ในการตั้งค่า Chrome
+
+<ph name="BEGIN_LINK" />เรียนรู้เพิ่มเติม<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">กำลังติดตั้ง…</translation>
 <translation id="2351097562818989364">รีเซ็ตการตั้งค่าการแปลภาษาของคุณแล้ว</translation>
 <translation id="2359808026110333948">ดำเนินการต่อ</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">เสนอให้แปลหน้าเว็บโดยใช้ Google แปลภาษา</translation>
 <translation id="3089395242580810162">เปิดในแท็บไม่ระบุตัวตน</translation>
 <translation id="3090193911106258841">กำลังเข้าถึงอินพุตเสียงและวิดีโอ</translation>
+<translation id="3117051980354074377">ลงชื่อเข้าใช้ Chrome เพื่อรับบุ๊กมาร์กในอุปกรณ์เครื่องอื่นๆ ของคุณ</translation>
 <translation id="3137521801621304719">ออกจากโหมดไม่ระบุตัวตน</translation>
 <translation id="3149891296864842641">ตัวเลือกการจัดส่ง</translation>
 <translation id="3162882791484435636">เลือกตัวเลือกในการจัดส่ง</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">ข้อมูลทางกฎหมาย</translation>
 <translation id="4089831646916293264">คุณลักษณะนี้อาจรบกวนการเข้าถึงบริการข้อมูลพรีเมียมที่ผู้ให้บริการของคุณจัดหาให้</translation>
 <translation id="4099578267706723511">ช่วยให้ Chrome ทำงานได้ดีขึ้นโดยส่งสถิติการใช้งานและรายงานข้อขัดข้องให้กับ Google</translation>
+<translation id="410351446219883937">เล่นอัตโนมัติ</translation>
 <translation id="411254640334432676">การดาวน์โหลดล้มเหลว</translation>
 <translation id="4113030288477039509">มีการจัดการโดยผู้ดูแลระบบ</translation>
 <translation id="4165986682804962316">การตั้งค่าไซต์</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">เพิ่มเติม</translation>
 <translation id="604996488070107836">การดาวน์โหลด <ph name="FILE_NAME" /> ล้มเหลวเนื่องจากข้อผิดพลาดที่ไม่รู้จัก</translation>
 <translation id="605721222689873409">ปป</translation>
+<translation id="605904398899306450">อนุญาตให้เว็บไซต์เล่นสื่อที่สำคัญโดยอัตโนมัติ (แนะนำ)</translation>
 <translation id="6075798973483050474">แก้ไขหน้าแรก</translation>
 <translation id="6108923351542677676">กำลังดำเนินการตั้งค่า…</translation>
 <translation id="6112702117600201073">กำลังรีเฟรชหน้า</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">ตัวเลือก</translation>
 <translation id="656628257199996201">แปลภาษา<ph name="SOURCE_LANGUAGE" />เสมอ</translation>
 <translation id="6571070086367343653">แก้ไขบัตรเครดิต</translation>
+<translation id="6573431926118603307">แท็บที่คุณเปิดไว้ใน Chrome ในอุปกรณ์เครื่องอื่นๆ จะปรากฏที่นี่</translation>
 <translation id="6575643671698722332">การรีเซ็ตล้มเหลว ตรวจสอบว่าอุปกรณ์ของคุณออนไลน์และลองอีกครั้ง</translation>
 <translation id="6600954340915313787">คัดลอกไปยัง Chrome แล้ว</translation>
 <translation id="6612358246767739896">เนื้อหาที่ได้รับความคุ้มครอง</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">เพิ่ม</translation>
 <translation id="780301667611848630">ไม่ ขอบคุณ</translation>
 <translation id="7829298379596169484">กำลังเข้าถึงอินพุตเสียง</translation>
+<translation id="7837582000577464779">เกิดข้อผิดพลาดในการดำเนินการกับคำสั่งซื้อของคุณ โปรดตรวจสอบบัญชี แล้วลองอีกครั้ง</translation>
+<translation id="7840369537802583269">ตรวจหาและเล่นสื่อที่สำคัญสำหรับเว็บไซต์บางแห่งโดยเฉพาะ</translation>
 <translation id="7846076177841592234">ยกเลิกการเลือก</translation>
 <translation id="7851858861565204677">อุปกรณ์อื่นๆ</translation>
 <translation id="7876243839304621966">ลบทั้งหมด</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">เนื้อหา (ภาพยนตร์ เพลง ฯลฯ) ที่ดาวน์โหลดในแอปพลิเคชันอื่นๆ อาจไม่สามารถเล่นได้อีกต่อไปจนกว่าแอปพลิเคชันเหล่านั้นจะได้รับใบอนุญาตอีกครั้งโดยขึ้นอยู่กับข้อมูลรับรองของอุปกรณ์ใหม่
 
 ในการรับใบอนุญาตใหม่ ให้เชื่อมต่ออินเทอร์เน็ตและเล่นเนื้อหาที่ดาวน์โหลดไว้ของคุณ</translation>
+<translation id="8636825310635137004">เปิดการซิงค์เพื่อรับแท็บจากอุปกรณ์เครื่องอื่นๆ ของคุณ</translation>
 <translation id="8660471606262461360">จาก Google Payments</translation>
 <translation id="8676374126336081632">ล้างข้อมูลที่ป้อน</translation>
 <translation id="869891660844655955">วันหมดอายุ</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
index 7d6f3a7..0ab8ba57 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Chrome'un mikrofonu bu siteyle paylaşması için mikrofon erişimine ihtiyacı var.</translation>
 <translation id="1080790410959514870"><ph name="DOMAIN_NAME" /> tarafından yönetilen bir hesaptan çıkış yapıyorsunuz. Bu işlem, bu cihazda depolanan Chrome verilerini siler, ancak veriler Google Hesabınızda kalmaya devam eder.</translation>
 <translation id="1098052486217676340">Bitti</translation>
+<translation id="1111673857033749125">Diğer cihazlarınızda kaydedilmiş yer işaretleri burada görünür.</translation>
 <translation id="1121094540300013208">Kullanım ve kilitlenme raporları</translation>
 <translation id="1137305377394488060">son 1 saat</translation>
 <translation id="1178581264944972037">Duraklat</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Bu siteyi hiçbir zaman çevirme</translation>
 <translation id="1291207594882862231">Geçmişi, çerezleri, site verilerini, önbelleği temizleyin…</translation>
 <translation id="129553762522093515">Son kapatılan</translation>
+<translation id="1326317727527857210">Diğer cihazlarınızdaki sekmelerinize ulaşmak için Chrome'da oturum açın.</translation>
 <translation id="13410144310025252">Bunları Chrome'da görüntüle</translation>
 <translation id="1369915414381695676"><ph name="SITE_NAME" /> sitesi eklendi</translation>
 <translation id="1373696734384179344">Seçilen içeriği indirmek için bellek yetersiz.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Hassaslaştır</translation>
 <translation id="2315043854645842844">İstemci tarafı sertifika seçimi, işletim sistemi tarafından desteklenmiyor.</translation>
 <translation id="2321958826496381788">Bu yazıyı rahatça okuyana kadar kaydırma çubuğunu sürükleyin. Bir paragrafa iki kez hafifçe dokunduğunuzda metin en az bunun kadar büyük görünmelidir.</translation>
+<translation id="2331464965008647960">Etrafınızdaki cihazlar Bluetooth üzerinden web sayfaları yayınlıyor. Chrome sayfaları tarayacak ve cihazınızı uyku modundan çıkardığınızda bu sayfaları görüntüleyecek. Sayfa sonuçlarının kalitesini iyileştirmek için bu sayfalar bir Google hizmetiyle işlenerek sunulacaktır.
+
+Chrome Ayarları'ndan Fiziksel Web'i kontrol edebilirsiniz.
+
+<ph name="BEGIN_LINK" />Daha fazla bilgi edinin<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Yükleniyor…</translation>
 <translation id="2351097562818989364">Çeviri ayarlarınız sıfırlandı.</translation>
 <translation id="2359808026110333948">Devam Et</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Sayfaları Google Çeviri ile çevirmeyi öner</translation>
 <translation id="3089395242580810162">Gizli sekmede aç</translation>
 <translation id="3090193911106258841">Ses ve video girişlerine erişiliyor</translation>
+<translation id="3117051980354074377">Diğer cihazlarınızdaki yer işaretlerinizi almak için Chrome'da oturum açın.</translation>
 <translation id="3137521801621304719">Gizli moddan çık</translation>
 <translation id="3149891296864842641">Gönderim seçeneği</translation>
 <translation id="3162882791484435636">Gönderim seçeneğini belirleyin</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Yasal bilgiler</translation>
 <translation id="4089831646916293264">Bu özellik, operatörünüz tarafından sağlanan birinci sınıf veri hizmetlerine erişime engel olabilir.</translation>
 <translation id="4099578267706723511">Google'a kullanım istatistikleri ve kilitlenme raporları göndererek Chrome'u iyileştirmeye yardımcı olun.</translation>
+<translation id="410351446219883937">Otomatik oynatma</translation>
 <translation id="411254640334432676">İndirme başarısız oldu.</translation>
 <translation id="4113030288477039509">Yöneticiniz tarafından yönetiliyor</translation>
 <translation id="4165986682804962316">Site ayarları</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">Daha fazla</translation>
 <translation id="604996488070107836">Bilinmeyen bir hata nedeniyle <ph name="FILE_NAME" /> dosyası indirilemedi.</translation>
 <translation id="605721222689873409">YY</translation>
+<translation id="605904398899306450">Sitelerin, önemli medyaları otomatik olarak oynatmasına izin verir (önerilen)</translation>
 <translation id="6075798973483050474">Ana sayfayı düzenle</translation>
 <translation id="6108923351542677676">Kurulum devam ediyor…</translation>
 <translation id="6112702117600201073">Sayfa yenileniyor</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">Seçenekler</translation>
 <translation id="656628257199996201"><ph name="SOURCE_LANGUAGE" /> dilini her zaman çevir</translation>
 <translation id="6571070086367343653">Kredi kartını düzenle</translation>
+<translation id="6573431926118603307">Diğer cihazlarınızda Chrome ile açtığınız sekmeler burada görünür.</translation>
 <translation id="6575643671698722332">Sıfırlanamadı. Cihazınızın çevrimiçi olduğundan emin olun ve tekrar deneyin.</translation>
 <translation id="6600954340915313787">Chrome'a kopyalandı</translation>
 <translation id="6612358246767739896">Korunan içerik</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">Ekle</translation>
 <translation id="780301667611848630">Hayır, teşekkürler</translation>
 <translation id="7829298379596169484">Ses girişine erişiliyor</translation>
+<translation id="7837582000577464779">Siparişiniz işlenirken bir hata oldu. Lütfen hesabınızı kontrol edin ve tekrar deneyin.</translation>
+<translation id="7840369537802583269">Belirli bir site için önemli medyaları algılayın ve oynatın.</translation>
 <translation id="7846076177841592234">Seçimi iptal et</translation>
 <translation id="7851858861565204677">Diğer cihazlar</translation>
 <translation id="7876243839304621966">Tümünü kaldır</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">Diğer uygulamalarda indirilen içerikler (film, müzik vb.), ilgili uygulamalar cihazın yeni kimlik bilgilerine dayanarak yeniden lisans alana kadar oynatılmayabilir.
 
 Yeni lisansları edinmek için İnternet'e bağlanın ve indirdiğiniz içeriği oynatın.</translation>
+<translation id="8636825310635137004">Diğer cihazlarınızdaki sekmelerinize ulaşmak için senkronizasyonu etkinleştirin.</translation>
 <translation id="8660471606262461360">Google Payments'tan</translation>
 <translation id="8676374126336081632">Girişi temizle</translation>
 <translation id="869891660844655955">Son kullanma tarihi</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
index 23f89d28..5f064d8 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Chrome потрібен доступ до мікрофона, щоб дозволити цьому сайту використовувати його.</translation>
 <translation id="1080790410959514870">Ви виходите з облікового запису, яким керує домен <ph name="DOMAIN_NAME" />. Дані Chrome, які зберігаються на цьому пристрої, буде видалено, але вони залишаться у вашому обліковому записі Google.</translation>
 <translation id="1098052486217676340">Завершено</translation>
+<translation id="1111673857033749125">Тут відображатимуться закладки, збережені на інших ваших пристроях.</translation>
 <translation id="1121094540300013208">Звіти про використання й аварійне завершення роботи</translation>
 <translation id="1137305377394488060">останню годину</translation>
 <translation id="1178581264944972037">Пауза</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Ніколи не перекладати цей сайт</translation>
 <translation id="1291207594882862231">Очистити історію, файли cookie, дані сайтів, кеш…</translation>
 <translation id="129553762522093515">Нещодавно закриті</translation>
+<translation id="1326317727527857210">Щоб мати доступ до вкладок з інших пристроїв, увійдіть в обліковий запис Chrome.</translation>
 <translation id="13410144310025252">Перегляньте їх у Chrome</translation>
 <translation id="1369915414381695676">Сайт <ph name="SITE_NAME" /> додано</translation>
 <translation id="1373696734384179344">Недостатньо пам’яті, щоб завантажити вибраний вміст.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Уточнити</translation>
 <translation id="2315043854645842844">Операційна система не підтримує сертифікат, вибраний на стороні клієнта.</translation>
 <translation id="2321958826496381788">Перетягуйте повзунок, доки розмір тексту не стане зручним для читання. Якщо двічі торкнутись абзацу, розмір тексту має стати принаймні таким, як цей.</translation>
+<translation id="2331464965008647960">Пристрої поруч транслюють веб-сторінки через Bluetooth. Chrome шукатиме та показуватиме сторінки, коли ви активуєте пристрій. Google оброблятиме ці сторінки, щоб покращити якість результатів.
+
+Ви можете керувати сервісом Інтернет навколо нас у налаштуваннях Chrome.
+
+<ph name="BEGIN_LINK" />Докладніше<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Встановлення…</translation>
 <translation id="2351097562818989364">Налаштування перекладу скинуто.</translation>
 <translation id="2359808026110333948">Продовжити</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Пропонувати перекладати сторінки в Перекладачі Google</translation>
 <translation id="3089395242580810162">Відкрити в анонімній вкладці</translation>
 <translation id="3090193911106258841">Отримання доступу до аудіо- й відеовходу</translation>
+<translation id="3117051980354074377">Щоб мати доступ до закладок з інших пристроїв, увійдіть в обліковий запис Chrome.</translation>
 <translation id="3137521801621304719">Вийти з режиму анонімного перегляду</translation>
 <translation id="3149891296864842641">Варіант доставки</translation>
 <translation id="3162882791484435636">Вибрати варіант доставки</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Правова інформація</translation>
 <translation id="4089831646916293264">Ця функція може перешкоджати доступу до платних служб передавання даних, які надаються вашим оператором.</translation>
 <translation id="4099578267706723511">Допоможіть покращити Chrome, надсилаючи статистику та звіти про збої в Google.</translation>
+<translation id="410351446219883937">Автовідтворення</translation>
 <translation id="411254640334432676">Не завантажено.</translation>
 <translation id="4113030288477039509">Керується адміністратором</translation>
 <translation id="4165986682804962316">Налаштування сайту</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">Більше</translation>
 <translation id="604996488070107836">Не вдалося завантажити файл <ph name="FILE_NAME" />. Сталася невідома помилка.</translation>
 <translation id="605721222689873409">РР</translation>
+<translation id="605904398899306450">Дозволити сайтам автоматично відтворювати важливі медіа-файли (рекомендується)</translation>
 <translation id="6075798973483050474">Змінити домашню сторінку</translation>
 <translation id="6108923351542677676">Виконується налаштування…</translation>
 <translation id="6112702117600201073">Оновлення сторінки</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">Параметри</translation>
 <translation id="656628257199996201">Завжди перекладати з такої мови: <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="6571070086367343653">Редагувати дані кредитної картки</translation>
+<translation id="6573431926118603307">Тут відображатимуться вкладки, відкриті в Chrome на інших ваших пристроях.</translation>
 <translation id="6575643671698722332">Помилка скидання. Перевірте, чи пристрій онлайн і спробуйте ще.</translation>
 <translation id="6600954340915313787">Скопійовано в Chrome</translation>
 <translation id="6612358246767739896">Захищений вміст</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">Додати</translation>
 <translation id="780301667611848630">Ні, дякую</translation>
 <translation id="7829298379596169484">Отримання доступу до аудіовходу</translation>
+<translation id="7837582000577464779">Під час обробки вашого замовлення сталася помилка. Перевірте свій рахунок і спробуйте ще раз.</translation>
+<translation id="7840369537802583269">Визначати важливі медіа-файли з певного сайту та відтворювати їх.</translation>
 <translation id="7846076177841592234">Скасувати вибір</translation>
 <translation id="7851858861565204677">Інші пристрої</translation>
 <translation id="7876243839304621966">Видалити все</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">Завантажений в інші додатки вміст (фільми, музика тощо) може не відтворюватися, доки ці додатки самі не отримають ліцензії на основі нових облікових даних пристрою.
 
 Щоб отримати нові ліцензії, під’єднайте пристрій до Інтернету та відтворіть завантажений вміст.</translation>
+<translation id="8636825310635137004">Щоб мати доступ до вкладок з інших пристроїв, увімкніть синхронізацію.</translation>
 <translation id="8660471606262461360">З Google Payments</translation>
 <translation id="8676374126336081632">Видалити введений текст</translation>
 <translation id="869891660844655955">Діє до</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
index 92d161dc..62ab59b 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Chrome cần quyền truy cập micrô để chia sẻ micrô với trang web này.</translation>
 <translation id="1080790410959514870">Bạn đang đăng xuất tài khoản do <ph name="DOMAIN_NAME" /> quản lý. Thao tác này sẽ xóa dữ liệu Chrome được lưu trữ trên thiết bị này nhưng dữ liệu sẽ vẫn còn trong tài khoản Google của bạn.</translation>
 <translation id="1098052486217676340">Đã hoàn thành</translation>
+<translation id="1111673857033749125">Dấu trang được lưu trên thiết bị khác của bạn sẽ xuất hiện tại đây.</translation>
 <translation id="1121094540300013208">Báo cáo sử dụng và sự cố</translation>
 <translation id="1137305377394488060">giờ trước</translation>
 <translation id="1178581264944972037">Tạm dừng</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">Không bao giờ dịch trang web này</translation>
 <translation id="1291207594882862231">Xóa lịch sử, cookie, dữ liệu trang web, bộ nhớ cache…</translation>
 <translation id="129553762522093515">Các tab đã đóng gần đây</translation>
+<translation id="1326317727527857210">Để có các tab từ các thiết bị khác của bạn, hãy đăng nhập vào Chrome.</translation>
 <translation id="13410144310025252">Xem các URL trong Chrome</translation>
 <translation id="1369915414381695676">Đã thêm trang web <ph name="SITE_NAME" /></translation>
 <translation id="1373696734384179344">Không đủ bộ nhớ để tải xuống nội dung được chọn.</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">Tinh chỉnh</translation>
 <translation id="2315043854645842844">Lựa chọn chứng chỉ phía ứng dụng khách không được hệ điều hành hỗ trợ.</translation>
 <translation id="2321958826496381788">Kéo thanh trượt cho đến khi bạn có thể đọc nội dung này thoải mái. Chữ tối thiểu phải to như này sau khi bấm đúp vào một đoạn.</translation>
+<translation id="2331464965008647960">Các thiết bị lân cận mà bạn đang truyền trang web qua Bluetooth. Chrome sẽ quét tìm các trang và hiển thị chúng khi bạn khởi động thiết bị của mình. Các trang này sẽ được chuyển tới một dịch vụ của Google để cải thiện chất lượng của kết quả trang.
+
+Bạn có thể kiểm soát cài đặt Web trong cuộc sống trên Chrome.
+
+<ph name="BEGIN_LINK" />Tìm hiểu thêm<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">Đang cài đặt…</translation>
 <translation id="2351097562818989364">Đã đặt lại cài đặt dịch của bạn.</translation>
 <translation id="2359808026110333948">Tiếp tục</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">Đề xuất dịch các trang bằng Google Dịch</translation>
 <translation id="3089395242580810162">Mở bằng tab ẩn danh</translation>
 <translation id="3090193911106258841">Đang truy cập thiết bị đầu vào video và âm thanh</translation>
+<translation id="3117051980354074377">Để nhận dấu trang trên các thiết bị khác của bạn, hãy đăng nhập vào Chrome.</translation>
 <translation id="3137521801621304719">Thoát chế độ ẩn danh</translation>
 <translation id="3149891296864842641">Tùy chọn giao hàng</translation>
 <translation id="3162882791484435636">Chọn tùy chọn giao hàng</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">Thông tin pháp lý</translation>
 <translation id="4089831646916293264">Tính năng này có thể ảnh hưởng đến quyền truy cập vào các dịch vụ dữ liệu cao cấp được nhà cung cấp dịch vụ của bạn cung cấp.</translation>
 <translation id="4099578267706723511">Giúp cải thiện Chrome bằng cách gửi số liệu thống kê sử dụng và báo cáo sự cố cho Google.</translation>
+<translation id="410351446219883937">Tự động phát</translation>
 <translation id="411254640334432676">Tải xuống không thành công.</translation>
 <translation id="4113030288477039509">Do quản trị viên của bạn quản lý</translation>
 <translation id="4165986682804962316">Cài đặt trang web</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">Thêm</translation>
 <translation id="604996488070107836">Không tải xuống được <ph name="FILE_NAME" /> do lỗi không xác định.</translation>
 <translation id="605721222689873409">YY</translation>
+<translation id="605904398899306450">Cho phép trang web tự động phát phương tiện quan trọng (được đề xuất)</translation>
 <translation id="6075798973483050474">Chỉnh sửa trang chủ</translation>
 <translation id="6108923351542677676">Đang thiết lập…</translation>
 <translation id="6112702117600201073">Làm mới trang</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">Tùy chọn</translation>
 <translation id="656628257199996201">Luôn dịch <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="6571070086367343653">Chỉnh sửa thẻ tín dụng</translation>
+<translation id="6573431926118603307">Các tab bạn đã mở trong Chrome trên thiết bị khác sẽ xuất hiện tại đây.</translation>
 <translation id="6575643671698722332">Không đặt lại được. Hãy đảm bảo thiết bị ở chế độ trực tuyến và thử lại.</translation>
 <translation id="6600954340915313787">Đã sao chép vào Chrome</translation>
 <translation id="6612358246767739896">Nội dung được bảo vệ</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">Thêm</translation>
 <translation id="780301667611848630">Không, cảm ơn</translation>
 <translation id="7829298379596169484">Đang truy cập thiết bị đầu vào âm thanh</translation>
+<translation id="7837582000577464779">Đã xảy ra lỗi trong khi xử lý đơn đặt hàng của bạn. Vui lòng kiểm tra tài khoản của bạn và thử lại.</translation>
+<translation id="7840369537802583269">Phát hiện và phát lại phương tiện quan trọng cho trang web cụ thể.</translation>
 <translation id="7846076177841592234">Hủy chọn</translation>
 <translation id="7851858861565204677">Thiết bị khác</translation>
 <translation id="7876243839304621966">Xóa tất cả</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">Nội dung (phim, nhạc, v.v.) được tải xuống trong các ứng dụng khác có thể không còn phát được cho tới khi ứng dụng đó nhận lại giấy phép dựa theo thông tin đăng nhập thiết bị mới.
 
 Để nhận được giấy phép mới, hãy kết nối Internet và phát nội dung đã tải xuống của bạn.</translation>
+<translation id="8636825310635137004">Để có các tab từ các thiết bị khác của bạn, hãy bật đồng bộ hóa.</translation>
 <translation id="8660471606262461360">Từ Google Payments</translation>
 <translation id="8676374126336081632">Xóa văn bản nhập</translation>
 <translation id="869891660844655955">Ngày hết hạn</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
index 3c4a571..dac83c7 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Chrome 需要具有麦克风使用权限,才能批准此网站的分享请求。</translation>
 <translation id="1080790410959514870">您要退出某个由 <ph name="DOMAIN_NAME" /> 管理的帐户。这会导致系统删除此设备上存储的 Chrome 数据,但这些数据仍会保留在您的 Google 帐户中。</translation>
 <translation id="1098052486217676340">已完成</translation>
+<translation id="1111673857033749125">您在其他设备上保存的书签将列在此处。</translation>
 <translation id="1121094540300013208">使用情况统计信息和崩溃报告</translation>
 <translation id="1137305377394488060">过去 1 小时</translation>
 <translation id="1178581264944972037">暂停</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">一律不翻译此网站</translation>
 <translation id="1291207594882862231">清除历史记录、Cookie、网站数据、缓存内容…</translation>
 <translation id="129553762522093515">最近关闭的标签页</translation>
+<translation id="1326317727527857210">要在您的其他设备上访问您的标签页,请登录 Chrome。</translation>
 <translation id="13410144310025252">您可以在 Chrome 中浏览这些网页</translation>
 <translation id="1369915414381695676">网站 <ph name="SITE_NAME" /> 已添加</translation>
 <translation id="1373696734384179344">内存不足,无法下载所选内容。</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">优化</translation>
 <translation id="2315043854645842844">操作系统不支持选择客户端证书。</translation>
 <translation id="2321958826496381788">拖动该滑块,将文字调整到适合您阅读的大小。点按两次某段落后,显示的文字至少应是这么大。</translation>
+<translation id="2331464965008647960">附近有设备在通过蓝牙播报网页。当您唤醒自己的设备时,Chrome 将会搜索并显示这些网页。这些网页将经由 Google 服务进行处理,以让网页搜索结果的展示效果更理想。
+
+您可以在 Chrome 设置部分中控制实物网。
+
+<ph name="BEGIN_LINK" />了解详情<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">正在安装…</translation>
 <translation id="2351097562818989364">您的翻译设置已重置。</translation>
 <translation id="2359808026110333948">继续</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">询问是否要使用“Google 翻译”来翻译网页内容</translation>
 <translation id="3089395242580810162">在隐身标签页中打开</translation>
 <translation id="3090193911106258841">正在存取音频和视频输入</translation>
+<translation id="3117051980354074377">要在您的其他设备上访问您的书签,请登录 Chrome。</translation>
 <translation id="3137521801621304719">退出隐身模式</translation>
 <translation id="3149891296864842641">送货方式</translation>
 <translation id="3162882791484435636">选择送货方式</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">法律信息</translation>
 <translation id="4089831646916293264">此功能可能会导致您无法使用运营商提供的付费数据网络服务。</translation>
 <translation id="4099578267706723511">将使用情况统计信息和崩溃报告发送给 Google,帮助我们完善 Chrome。</translation>
+<translation id="410351446219883937">自动播放</translation>
 <translation id="411254640334432676">下载失败。</translation>
 <translation id="4113030288477039509">由您的管理员管理</translation>
 <translation id="4165986682804962316">网站设置</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">更多</translation>
 <translation id="604996488070107836">出现未知错误,未能下载 <ph name="FILE_NAME" />。</translation>
 <translation id="605721222689873409">YY</translation>
+<translation id="605904398899306450">允许网站自动播放重要的媒体(推荐)</translation>
 <translation id="6075798973483050474">修改主页</translation>
 <translation id="6108923351542677676">正在设置…</translation>
 <translation id="6112702117600201073">正在刷新页面</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">选项</translation>
 <translation id="656628257199996201">一律翻译<ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="6571070086367343653">修改信用卡</translation>
+<translation id="6573431926118603307">您在其他设备上的 Chrome 中打开的标签页将列在此处。</translation>
 <translation id="6575643671698722332">重置失败。请确保您的设备已联网,然后重试。</translation>
 <translation id="6600954340915313787">已复制到 Chrome</translation>
 <translation id="6612358246767739896">受保护的内容</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">添加</translation>
 <translation id="780301667611848630">不用了,谢谢</translation>
 <translation id="7829298379596169484">正在存取音频输入</translation>
+<translation id="7837582000577464779">处理您的订单时出错。请检查您的帐户,然后重试。</translation>
+<translation id="7840369537802583269">检测并播放特定网站的重要媒体。</translation>
 <translation id="7846076177841592234">取消选择</translation>
 <translation id="7851858861565204677">来自其他设备的同步</translation>
 <translation id="7876243839304621966">全部删除</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">其他应用中下载的内容(例如电影、音乐等)将无法再播放,除非这些应用根据新的设备凭据重新获得许可。
 
 要获得新的许可,请连接到互联网并播放您下载的内容。</translation>
+<translation id="8636825310635137004">要在您的其他设备上访问您的标签页,请开启同步功能。</translation>
 <translation id="8660471606262461360">来自 Google Payments</translation>
 <translation id="8676374126336081632">清除输入的内容</translation>
 <translation id="869891660844655955">截止日期</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
index ee8c1a98..f8dc79a 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -7,6 +7,7 @@
 <translation id="1061441684050139317">Chrome 需要存取麥克風,才能與這個網站分享。</translation>
 <translation id="1080790410959514870">您即將登出由 <ph name="DOMAIN_NAME" /> 所管理的帳戶。儲存在這個裝置上的 Chrome 資料將因此遭到刪除,但這些資料仍會保留在您的 Google 帳戶中。</translation>
 <translation id="1098052486217676340">已結束</translation>
+<translation id="1111673857033749125">儲存在您其他裝置上的書籤會顯示在這裡。</translation>
 <translation id="1121094540300013208">使用資料和當機報告</translation>
 <translation id="1137305377394488060">過去 1 小時</translation>
 <translation id="1178581264944972037">暫停</translation>
@@ -25,6 +26,7 @@
 <translation id="1285320974508926690">一律不翻譯此網站</translation>
 <translation id="1291207594882862231">清除歷史紀錄、Cookie、網站資料、快取…</translation>
 <translation id="129553762522093515">最近關閉的分頁</translation>
+<translation id="1326317727527857210">如要存取您在其他裝置上開啟的分頁,請登入 Chrome。</translation>
 <translation id="13410144310025252">您可以使用 Chrome 瀏覽這些網址</translation>
 <translation id="1369915414381695676">已新增 <ph name="SITE_NAME" /> 網站</translation>
 <translation id="1373696734384179344">記憶體不足,無法下載您選取的這項內容。</translation>
@@ -99,6 +101,11 @@
 <translation id="2268044343513325586">修正搜尋</translation>
 <translation id="2315043854645842844">作業系統不允許您在用戶端選取憑證。</translation>
 <translation id="2321958826496381788">拖曳滑桿,將文字調整到您可以舒適閱讀的大小。當您輕觸兩下文字段落,文字至少應呈現這樣的大小。</translation>
+<translation id="2331464965008647960">您附近的裝置正在透過藍牙播送網頁。Chrome 會在您的裝置結束休眠狀態時掃瞄並顯示這些網頁。這些網頁經由 Google 服務處理過後,可讓網頁搜尋結果的品質更臻完善。
+
+您可以在 Chrome 設定中控管「實體化網路」設定。
+
+<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation>
 <translation id="2343328333327081434">安裝中…</translation>
 <translation id="2351097562818989364">您的翻譯設定已重設。</translation>
 <translation id="2359808026110333948">繼續</translation>
@@ -156,6 +163,7 @@
 <translation id="307329814453917357">可使用「Google 翻譯」翻譯網頁內容</translation>
 <translation id="3089395242580810162">在無痕式分頁中開啟</translation>
 <translation id="3090193911106258841">正在存取音訊和視訊輸入</translation>
+<translation id="3117051980354074377">如要存取您在其他裝置上建立的書籤,請登入 Chrome。</translation>
 <translation id="3137521801621304719">離開無痕模式</translation>
 <translation id="3149891296864842641">運送方式</translation>
 <translation id="3162882791484435636">選取運送方式</translation>
@@ -220,6 +228,7 @@
 <translation id="4062305924942672200">法律資訊</translation>
 <translation id="4089831646916293264">這項功能可能會讓您無法存取行動通訊業者提供的付費數據服務。</translation>
 <translation id="4099578267706723511">將使用統計資料及當機報告傳送給 Google,助我們一臂之力,讓 Chrome 更臻完美。</translation>
+<translation id="410351446219883937">自動播放</translation>
 <translation id="411254640334432676">下載失敗。</translation>
 <translation id="4113030288477039509">您的管理員已停用這項功能</translation>
 <translation id="4165986682804962316">網站設定</translation>
@@ -373,6 +382,7 @@
 <translation id="6042308850641462728">詳細資訊</translation>
 <translation id="604996488070107836">發生不明錯誤,因此無法下載 <ph name="FILE_NAME" />。</translation>
 <translation id="605721222689873409">年</translation>
+<translation id="605904398899306450">允許網站自動播放重要的媒體 (建議)</translation>
 <translation id="6075798973483050474">編輯首頁</translation>
 <translation id="6108923351542677676">設定中…</translation>
 <translation id="6112702117600201073">重新整理網頁</translation>
@@ -409,6 +419,7 @@
 <translation id="6550675742724504774">選項</translation>
 <translation id="656628257199996201">一律翻譯<ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="6571070086367343653">編輯信用卡</translation>
+<translation id="6573431926118603307">您在其他裝置上透過 Chrome 開啟的分頁會顯示在這裡。</translation>
 <translation id="6575643671698722332">重設失敗。請確認裝置已連上網路,然後再試一次。</translation>
 <translation id="6600954340915313787">已複製到 Chrome</translation>
 <translation id="6612358246767739896">受保護內容</translation>
@@ -511,6 +522,8 @@
 <translation id="7791543448312431591">新增</translation>
 <translation id="780301667611848630">不用了,謝謝</translation>
 <translation id="7829298379596169484">正在存取音訊輸入</translation>
+<translation id="7837582000577464779">處理您的訂單時發生錯誤。請檢查您的帳戶,然後再試一次。</translation>
+<translation id="7840369537802583269">偵測並播放特定網站的重要媒體。</translation>
 <translation id="7846076177841592234">全部取消選取</translation>
 <translation id="7851858861565204677">其他裝置</translation>
 <translation id="7876243839304621966">全部移除</translation>
@@ -567,6 +580,7 @@
 <translation id="862875433388403934">其他應用程式必須以新的裝置憑證重新取得授權,才能順利播放已下載的內容 (例如電影、音樂等)。
 
 如要取得新授權,請先連線至網際網路,然後再播放您已下載的內容。</translation>
+<translation id="8636825310635137004">如要存取您在其他裝置上開啟的分頁,請開啟同步處理功能。</translation>
 <translation id="8660471606262461360">來自 Google Payments</translation>
 <translation id="8676374126336081632">清除輸入</translation>
 <translation id="869891660844655955">到期日</translation>
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni
index a66fcce..39432a0 100644
--- a/chrome/android/java_sources.gni
+++ b/chrome/android/java_sources.gni
@@ -20,6 +20,7 @@
   "java/src/org/chromium/chrome/browser/ChromeActivity.java",
   "java/src/org/chromium/chrome/browser/ChromeApplication.java",
   "java/src/org/chromium/chrome/browser/ChromeBackgroundService.java",
+  "java/src/org/chromium/chrome/browser/ChromeBackupAgent.java",
   "java/src/org/chromium/chrome/browser/ChromeFeatureList.java",
   "java/src/org/chromium/chrome/browser/ChromeHttpAuthHandler.java",
   "java/src/org/chromium/chrome/browser/ChromeLifetimeController.java",
@@ -132,7 +133,6 @@
   "java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java",
   "java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContentFactory.java",
   "java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContentViewDelegate.java",
-  "java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelHost.java",
   "java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelInflater.java",
   "java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManager.java",
   "java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarControl.java",
@@ -147,7 +147,6 @@
   "java/src/org/chromium/chrome/browser/compositor/bottombar/readermode/ReaderModeBarControl.java",
   "java/src/org/chromium/chrome/browser/compositor/bottombar/readermode/ReaderModePanel.java",
   "java/src/org/chromium/chrome/browser/compositor/layouts/ChromeAnimation.java",
-  "java/src/org/chromium/chrome/browser/compositor/layouts/ContextualSearchSupportedLayout.java",
   "java/src/org/chromium/chrome/browser/compositor/layouts/EdgeSwipeHandlerLayoutDelegate.java",
   "java/src/org/chromium/chrome/browser/compositor/layouts/EmptyOverviewModeObserver.java",
   "java/src/org/chromium/chrome/browser/compositor/layouts/GestureHandlerLayoutDelegate.java",
@@ -176,7 +175,6 @@
   "java/src/org/chromium/chrome/browser/compositor/layouts/eventfilter/AreaGestureEventFilter.java",
   "java/src/org/chromium/chrome/browser/compositor/layouts/eventfilter/BlackHoleEventFilter.java",
   "java/src/org/chromium/chrome/browser/compositor/layouts/eventfilter/CascadeEventFilter.java",
-  "java/src/org/chromium/chrome/browser/compositor/layouts/eventfilter/ContextualSearchEventFilter.java",
   "java/src/org/chromium/chrome/browser/compositor/layouts/eventfilter/EdgeSwipeEventFilter.java",
   "java/src/org/chromium/chrome/browser/compositor/layouts/eventfilter/EdgeSwipeHandler.java",
   "java/src/org/chromium/chrome/browser/compositor/layouts/eventfilter/EmptyEdgeSwipeHandler.java",
@@ -185,7 +183,6 @@
   "java/src/org/chromium/chrome/browser/compositor/layouts/eventfilter/GestureEventFilter.java",
   "java/src/org/chromium/chrome/browser/compositor/layouts/eventfilter/GestureHandler.java",
   "java/src/org/chromium/chrome/browser/compositor/layouts/eventfilter/OverlayPanelEventFilter.java",
-  "java/src/org/chromium/chrome/browser/compositor/layouts/phone/ContextualSearchLayout.java",
   "java/src/org/chromium/chrome/browser/compositor/layouts/phone/SimpleAnimationLayout.java",
   "java/src/org/chromium/chrome/browser/compositor/layouts/phone/StackLayout.java",
   "java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java",
@@ -230,7 +227,6 @@
   "java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchRequest.java",
   "java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java",
   "java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionHandler.java",
-  "java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchStaticEventFilter.java",
   "java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper.java",
   "java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTranslateController.java",
   "java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTranslateInterface.java",
@@ -923,6 +919,7 @@
   "java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelListItem.java",
   "java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelListView.java",
   "java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelWrapper.java",
+  "java/src/org/chromium/chrome/browser/widget/animation/AnimatorProperties.java",
   "java/src/org/chromium/chrome/browser/widget/emptybackground/EmptyBackgroundViewTablet.java",
   "java/src/org/chromium/chrome/browser/widget/emptybackground/EmptyBackgroundViewWrapper.java",
   "java/src/org/chromium/chrome/browser/widget/findinpage/FindResultBar.java",
@@ -950,6 +947,7 @@
   "javatests/src/org/chromium/chrome/browser/BluetoothChooserDialogTest.java",
   "javatests/src/org/chromium/chrome/browser/ChromeActivityTest.java",
   "javatests/src/org/chromium/chrome/browser/ChromeBackgroundServiceTest.java",
+  "javatests/src/org/chromium/chrome/browser/ChromeBackupIntegrationTest.java",
   "javatests/src/org/chromium/chrome/browser/ChromeTabbedActivityLollipopAndAboveTest.java",
   "javatests/src/org/chromium/chrome/browser/ContentViewFocusTest.java",
   "javatests/src/org/chromium/chrome/browser/FocusedEditableTextFieldZoomTest.java",
@@ -992,6 +990,7 @@
   "javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkModelTest.java",
   "javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java",
   "javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBaseTest.java",
+  "javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelEventFilterTest.java",
   "javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManagerTest.java",
   "javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManagerWrapper.java",
   "javatests/src/org/chromium/chrome/browser/compositor/eventfilter/MockEventFilterHost.java",
@@ -1002,7 +1001,6 @@
   "javatests/src/org/chromium/chrome/browser/compositor/layouts/MockResourcesForLayout.java",
   "javatests/src/org/chromium/chrome/browser/compositor/overlays/strip/TabStripTest.java",
   "javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuTest.java",
-  "javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchEventFilterTest.java",
   "javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFakeServer.java",
   "javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java",
   "javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicyTest.java",
@@ -1203,6 +1201,7 @@
 ]
 
 chrome_junit_test_java_sources = [
+  "junit/src/org/chromium/chrome/browser/ChromeBackupAgentTest.java",
   "junit/src/org/chromium/chrome/browser/ShortcutHelperTest.java",
   "junit/src/org/chromium/chrome/browser/SSLClientCertificateRequestTest.java",
   "junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ChromeBackupIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ChromeBackupIntegrationTest.java
new file mode 100644
index 0000000..11b8bfd
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ChromeBackupIntegrationTest.java
@@ -0,0 +1,120 @@
+// 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.
+
+package org.chromium.chrome.browser;
+
+import android.accounts.Account;
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.os.Build;
+import android.preference.PreferenceManager;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.MinAndroidSdkLevel;
+import org.chromium.chrome.browser.firstrun.FirstRunSignInProcessor;
+import org.chromium.chrome.browser.firstrun.FirstRunStatus;
+import org.chromium.chrome.browser.signin.AccountIdProvider;
+import org.chromium.chrome.test.ChromeTabbedActivityTestBase;
+import org.chromium.sync.signin.AccountManagerHelper;
+import org.chromium.sync.signin.ChromeSigninController;
+import org.chromium.sync.test.util.MockAccountManager;
+
+/**
+ * Android backup tests.
+ */
+@TargetApi(Build.VERSION_CODES.LOLLIPOP)
+@CommandLineFlags.Remove({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+public class ChromeBackupIntegrationTest extends ChromeTabbedActivityTestBase {
+
+    private static final String GOOGLE_ACCOUNT_TYPE = "com.google";
+
+    @Override
+    public void startMainActivity() throws InterruptedException {
+        // Do nothing here, the tests need to do some per-test setup before they start the main
+        // activity.
+    }
+
+    private static final class MockAccountIdProvider extends AccountIdProvider {
+        @Override
+        public String getAccountId(Context ctx, String accountName) {
+            return accountName;
+        }
+
+        @Override
+        public boolean canBeUsed(Context ctx) {
+            return true;
+        }
+    }
+
+    static class ChromeTestBackupAgent extends ChromeBackupAgent {
+        ChromeTestBackupAgent(Context context) {
+            // This is protected in ContextWrapper, so can only be called within a derived
+            // class.
+            attachBaseContext(context);
+        }
+    }
+
+    @SmallTest
+    @MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP)
+    public void testSimpleRestore() throws InterruptedException {
+        Context targetContext = getInstrumentation().getTargetContext();
+
+        // Fake having previously gone through FRE and signed in.
+        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(targetContext);
+        SharedPreferences.Editor preferenceEditor = prefs.edit();
+        preferenceEditor.putBoolean(FirstRunStatus.FIRST_RUN_FLOW_COMPLETE, true);
+        preferenceEditor.putBoolean(FirstRunSignInProcessor.FIRST_RUN_FLOW_SIGNIN_SETUP, true);
+        preferenceEditor.putString(ChromeSigninController.SIGNED_IN_ACCOUNT_KEY, "user1@gmail.com");
+        preferenceEditor.commit();
+
+        Account account = new Account("user1@gmail.com", GOOGLE_ACCOUNT_TYPE);
+        MockAccountManager accountManager =
+                new MockAccountManager(targetContext, getInstrumentation().getContext(), account);
+        AccountManagerHelper.overrideAccountManagerHelperForTests(targetContext, accountManager);
+        AccountIdProvider.setInstanceForTest(new MockAccountIdProvider());
+
+        // Run Chrome's restore code.
+        new ChromeTestBackupAgent(targetContext).onRestoreFinished();
+
+        // Start Chrome and check that it signs in.
+        startMainActivityFromLauncher();
+
+        assertTrue(ChromeSigninController.get(targetContext).isSignedIn());
+        assertEquals("user1@gmail.com",
+                ChromeSigninController.get(targetContext).getSignedInAccountName());
+    }
+
+    @SmallTest
+    @MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP)
+    public void testRestoreAccountMissing() throws InterruptedException {
+        Context targetContext = getInstrumentation().getTargetContext();
+
+        // Fake having previously gone through FRE and signed in.
+        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(targetContext);
+        SharedPreferences.Editor preferenceEditor = prefs.edit();
+        preferenceEditor.putBoolean(FirstRunStatus.FIRST_RUN_FLOW_COMPLETE, true);
+        preferenceEditor.putBoolean(FirstRunSignInProcessor.FIRST_RUN_FLOW_SIGNIN_SETUP, true);
+        preferenceEditor.putString(ChromeSigninController.SIGNED_IN_ACCOUNT_KEY, "user1@gmail.com");
+        preferenceEditor.commit();
+
+        // Create a mock account manager with a different account
+        Account account = new Account("user2@gmail.com", GOOGLE_ACCOUNT_TYPE);
+        MockAccountManager accountManager =
+                new MockAccountManager(targetContext, getInstrumentation().getContext(), account);
+        AccountManagerHelper.overrideAccountManagerHelperForTests(targetContext, accountManager);
+        AccountIdProvider.setInstanceForTest(new MockAccountIdProvider());
+
+        // Run Chrome's restore code.
+        new ChromeTestBackupAgent(targetContext).onRestoreFinished();
+
+        // Start Chrome.
+        startMainActivityFromLauncher();
+
+        // Since the account didn't exist, Chrome should not be signed in.
+        assertFalse(ChromeSigninController.get(targetContext).isSignedIn());
+    }
+
+}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBaseTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBaseTest.java
index 30d1f4d1..0f6f8c2 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBaseTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBaseTest.java
@@ -31,7 +31,7 @@
      */
     private static class MockOverlayPanel extends OverlayPanel {
         public MockOverlayPanel(Context context, OverlayPanelManager manager) {
-            super(context, null, manager);
+            super(context, null, null, manager);
         }
 
         /**
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelEventFilterTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelEventFilterTest.java
new file mode 100644
index 0000000..f560b5f0
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelEventFilterTest.java
@@ -0,0 +1,492 @@
+// 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.
+
+package org.chromium.chrome.browser.compositor.bottombar;
+
+import android.content.Context;
+import android.test.InstrumentationTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.view.MotionEvent;
+import android.view.ViewConfiguration;
+import android.view.ViewGroup;
+
+import org.chromium.base.test.util.Feature;
+import org.chromium.chrome.browser.compositor.layouts.eventfilter.EventFilterHost;
+import org.chromium.chrome.browser.compositor.layouts.eventfilter.OverlayPanelEventFilter;
+import org.chromium.content.browser.ContentViewCore;
+
+/**
+ * Class responsible for testing the OverlayPanelEventFilter.
+ */
+public class OverlayPanelEventFilterTest extends InstrumentationTestCase {
+
+    private static final float PANEL_ALMOST_MAXIMIZED_OFFSET_Y_DP = 50.f;
+    private static final float BAR_HEIGHT_DP = 100.f;
+
+    private static final float LAYOUT_WIDTH_DP = 600.f;
+    private static final float LAYOUT_HEIGHT_DP = 800.f;
+
+    // A small value used to check whether two floats are almost equal.
+    private static final float EPSILON = 1e-04f;
+
+    private float mTouchSlopDp;
+    private float mDpToPx;
+
+    private float mAlmostMaximizedContentOffsetYDp;
+    private float mMaximizedContentOffsetYDp;
+
+    private float mContentVerticalScroll;
+
+    private boolean mWasTapDetectedOnContent;
+    private boolean mWasScrollDetectedOnContent;
+
+    private MockOverlayPanel mPanel;
+    private OverlayPanelEventFilterWrapper mEventFilter;
+
+    private boolean mShouldLockHorizontalMotionInContent;
+    private MotionEvent mEventPropagatedToContent;
+    private boolean mEventWasScroll;
+    private boolean mEventWasTap;
+
+    // --------------------------------------------------------------------------------------------
+    // OverlayPanelEventFilterWrapper
+    // --------------------------------------------------------------------------------------------
+
+    /**
+     * Wrapper around OverlayPanelEventFilter used by tests.
+     */
+    public final class OverlayPanelEventFilterWrapper extends OverlayPanelEventFilter {
+        public OverlayPanelEventFilterWrapper(Context context, EventFilterHost host,
+                OverlayPanel panel) {
+            super(context, host, panel);
+        }
+
+        @Override
+        protected float getContentViewVerticalScroll() {
+            return mContentVerticalScroll;
+        }
+
+        @Override
+        protected void propagateEventToContentViewCore(MotionEvent e) {
+            mEventPropagatedToContent = MotionEvent.obtain(e);
+            super.propagateEventToContentViewCore(e);
+            mEventPropagatedToContent.recycle();
+        }
+
+        @Override
+        protected boolean handleSingleTapUp(MotionEvent e) {
+            boolean handled = super.handleSingleTapUp(e);
+            mEventWasTap = true;
+            return handled;
+        }
+
+        @Override
+        protected boolean handleScroll(MotionEvent e1, MotionEvent e2, float distanceY) {
+            boolean handled = super.handleScroll(e1, e2, distanceY);
+            mEventWasScroll = true;
+            return handled;
+        }
+    }
+
+    // --------------------------------------------------------------------------------------------
+    // StubbedContentViewCore
+    // --------------------------------------------------------------------------------------------
+
+    private final class StubbedContentViewCore extends ContentViewCore {
+        public StubbedContentViewCore(Context context) {
+            super(context);
+        }
+
+        @Override
+        public ViewGroup getContainerView() {
+            return new ViewGroup(getContext()) {
+                @Override
+                public boolean dispatchTouchEvent(MotionEvent e) {
+                    if (e.getActionMasked() != MotionEvent.ACTION_CANCEL) {
+                        mWasScrollDetectedOnContent = mEventWasScroll;
+                        mWasTapDetectedOnContent = mEventWasTap;
+
+                        // Check that the event offset is correct.
+                        if (!mShouldLockHorizontalMotionInContent) {
+                            float propagatedEventY = mEventPropagatedToContent.getY();
+                            float offsetY = mPanel.getContentY() * mDpToPx;
+                            assertEquals(propagatedEventY - offsetY, e.getY(), EPSILON);
+                        }
+                    } else {
+                        mWasScrollDetectedOnContent = false;
+                        mWasTapDetectedOnContent = false;
+                    }
+                    return super.dispatchTouchEvent(e);
+                }
+
+                @Override
+                public void onLayout(boolean changed, int l, int t, int r, int b) {}
+            };
+        }
+    }
+
+    // --------------------------------------------------------------------------------------------
+    // MockOverlayPanel
+    // --------------------------------------------------------------------------------------------
+
+    /**
+     * Mocks an OverlayPanel, so it doesn't create ContentViewCore.
+     */
+    public final class MockOverlayPanel extends OverlayPanel {
+        private boolean mWasTapDetectedOnPanel = false;
+        private boolean mWasScrollDetectedOnPanel = false;
+        private ContentViewCore mContentViewCore;
+
+        public MockOverlayPanel(Context context, OverlayPanelManager panelManager) {
+            super(context, null, null, panelManager);
+            mContentViewCore = new StubbedContentViewCore(context);
+        }
+
+        @Override
+        public OverlayPanelContent createNewOverlayPanelContent() {
+            return new MockOverlayPanelContent();
+        }
+
+        /**
+         * Override creation and destruction of the ContentViewCore as they rely on native methods.
+         */
+        private class MockOverlayPanelContent extends OverlayPanelContent {
+            public MockOverlayPanelContent() {
+                super(null, null, null);
+            }
+
+            @Override
+            public void removeLastHistoryEntry(String url, long timeInMs) {}
+        }
+
+        @Override
+        public ContentViewCore getContentViewCore() {
+            return mContentViewCore;
+        }
+
+        public boolean getWasTapDetected() {
+            return mWasTapDetectedOnPanel;
+        }
+
+        public boolean getWasScrollDetected() {
+            return mWasScrollDetectedOnPanel;
+        }
+
+        // GestureHandler overrides.
+
+        @Override
+        public void onDown(float x, float y, boolean fromMouse, int buttons) {}
+
+        @Override
+        public void onUpOrCancel() {}
+
+        @Override
+        public void drag(float x, float y, float dx, float dy, float tx, float ty) {
+            mWasScrollDetectedOnPanel = true;
+        }
+
+        @Override
+        public void click(float x, float y, boolean fromMouse, int buttons) {
+            mWasTapDetectedOnPanel = true;
+        }
+
+        @Override
+        public void fling(float x, float y, float velocityX, float velocityY) {}
+
+        @Override
+        public void onLongPress(float x, float y) {}
+
+        @Override
+        public void onPinch(float x0, float y0, float x1, float y1, boolean firstEvent) {}
+    }
+
+    // --------------------------------------------------------------------------------------------
+    // Test Suite
+    // --------------------------------------------------------------------------------------------
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        Context context = getInstrumentation().getTargetContext();
+
+        mDpToPx = context.getResources().getDisplayMetrics().density;
+        mTouchSlopDp = ViewConfiguration.get(context).getScaledTouchSlop() / mDpToPx;
+
+        mPanel = new MockOverlayPanel(context, new OverlayPanelManager());
+        mEventFilter = new OverlayPanelEventFilterWrapper(context, null, mPanel);
+
+        mPanel.setSearchBarHeightForTesting(BAR_HEIGHT_DP);
+        mPanel.setHeightForTesting(LAYOUT_HEIGHT_DP);
+        mPanel.setIsFullWidthSizePanelForTesting(true);
+
+        // NOTE(pedrosimonetti): This should be called after calling the method
+        // setIsFullWidthSizePanelForTesting(), otherwise it will crash the test.
+        mPanel.onSizeChanged(LAYOUT_WIDTH_DP, LAYOUT_HEIGHT_DP);
+
+        setContentViewVerticalScroll(0);
+
+        mAlmostMaximizedContentOffsetYDp =
+                PANEL_ALMOST_MAXIMIZED_OFFSET_Y_DP + BAR_HEIGHT_DP;
+        mMaximizedContentOffsetYDp = BAR_HEIGHT_DP;
+
+        mWasTapDetectedOnContent = false;
+        mWasScrollDetectedOnContent = false;
+
+        mShouldLockHorizontalMotionInContent = false;
+    }
+
+    @SmallTest
+    @Feature({"OverlayPanel"})
+    public void testTapContentView() {
+        positionPanelInAlmostMaximizedState();
+
+        // Simulate tap.
+        simulateActionDownEvent(0.f, mAlmostMaximizedContentOffsetYDp + 1.f);
+        simulateActionUpEvent(0.f, mAlmostMaximizedContentOffsetYDp + 1.f);
+
+        assertFalse(mPanel.getWasScrollDetected());
+        assertFalse(mPanel.getWasTapDetected());
+
+        assertTrue(mWasTapDetectedOnContent);
+        assertFalse(mWasScrollDetectedOnContent);
+    }
+
+    @SmallTest
+    @Feature({"OverlayPanel"})
+    public void testScrollingContentViewDragsPanel() {
+        positionPanelInAlmostMaximizedState();
+
+        // Simulate swipe up sequence.
+        simulateActionDownEvent(0.f, mAlmostMaximizedContentOffsetYDp + 1.f);
+        simulateActionMoveEvent(0.f, mMaximizedContentOffsetYDp);
+        simulateActionUpEvent(0.f, mMaximizedContentOffsetYDp);
+
+        assertTrue(mPanel.getWasScrollDetected());
+        assertFalse(mPanel.getWasTapDetected());
+
+        assertFalse(mWasScrollDetectedOnContent);
+        assertFalse(mWasTapDetectedOnContent);
+    }
+
+    @SmallTest
+    @Feature({"OverlayPanel"})
+    public void testScrollUpContentView() {
+        positionPanelInMaximizedState();
+
+        // Simulate swipe up sequence.
+        simulateActionDownEvent(0.f, mAlmostMaximizedContentOffsetYDp + 1.f);
+        simulateActionMoveEvent(0.f, mMaximizedContentOffsetYDp);
+        simulateActionUpEvent(0.f, mMaximizedContentOffsetYDp);
+
+        assertFalse(mPanel.getWasScrollDetected());
+        assertFalse(mPanel.getWasTapDetected());
+
+        assertTrue(mWasScrollDetectedOnContent);
+        assertFalse(mWasTapDetectedOnContent);
+    }
+
+    @SmallTest
+    @Feature({"OverlayPanel"})
+    public void testScrollDownContentView() {
+        positionPanelInMaximizedState();
+
+        // When the Panel is maximized and the scroll position is greater than zero, a swipe down
+        // on the ContentView should trigger a scroll on it.
+        setContentViewVerticalScroll(100.f);
+
+        // Simulate swipe down sequence.
+        simulateActionDownEvent(0.f, mMaximizedContentOffsetYDp + 1.f);
+        simulateActionMoveEvent(0.f, mAlmostMaximizedContentOffsetYDp);
+        simulateActionUpEvent(0.f, mAlmostMaximizedContentOffsetYDp);
+
+        assertFalse(mPanel.getWasScrollDetected());
+        assertFalse(mPanel.getWasTapDetected());
+
+        assertTrue(mWasScrollDetectedOnContent);
+        assertFalse(mWasTapDetectedOnContent);
+    }
+
+    @SmallTest
+    @Feature({"OverlayPanel"})
+    public void testDragByOverscrollingContentView() {
+        positionPanelInMaximizedState();
+
+        // When the Panel is maximized and the scroll position is zero, a swipe down on the
+        // ContentView should trigger a swipe on the Panel.
+        setContentViewVerticalScroll(0.f);
+
+        // Simulate swipe down sequence.
+        simulateActionDownEvent(0.f, mMaximizedContentOffsetYDp + 1.f);
+        simulateActionMoveEvent(0.f, mAlmostMaximizedContentOffsetYDp);
+        simulateActionUpEvent(0.f, mAlmostMaximizedContentOffsetYDp);
+
+        assertTrue(mPanel.getWasScrollDetected());
+        assertFalse(mPanel.getWasTapDetected());
+
+        assertFalse(mWasScrollDetectedOnContent);
+        assertFalse(mWasTapDetectedOnContent);
+    }
+
+    @SmallTest
+    @Feature({"OverlayPanel"})
+    public void testUnwantedScrollDoesNotHappenInContentView() {
+        positionPanelInAlmostMaximizedState();
+
+        float contentViewOffsetYStart = mAlmostMaximizedContentOffsetYDp + 1.f;
+        float contentViewOffsetYEnd = mMaximizedContentOffsetYDp - 1.f;
+
+        // Simulate swipe up to maximized position.
+        simulateActionDownEvent(0.f, contentViewOffsetYStart);
+        simulateActionMoveEvent(0.f, mMaximizedContentOffsetYDp);
+        positionPanelInMaximizedState();
+
+        // Confirm that the Panel got a scroll event.
+        assertTrue(mPanel.getWasScrollDetected());
+
+        // Continue the swipe up for one more dp. From now on, the events might be forwarded
+        // to the ContentView.
+        simulateActionMoveEvent(0.f, contentViewOffsetYEnd);
+        simulateActionUpEvent(0.f, contentViewOffsetYEnd);
+
+        // But 1 dp is not enough to trigger a scroll in the ContentView, and in this
+        // particular case, it should also not trigger a tap because the total displacement
+        // of the touch gesture is greater than the touch slop.
+        float contentViewOffsetDelta =
+                contentViewOffsetYStart - contentViewOffsetYEnd;
+        assertTrue(Math.abs(contentViewOffsetDelta) > mTouchSlopDp);
+
+        assertFalse(mPanel.getWasTapDetected());
+
+        assertFalse(mWasScrollDetectedOnContent);
+        assertFalse(mWasTapDetectedOnContent);
+    }
+
+    @SmallTest
+    @Feature({"OverlayPanel"})
+    public void testDragPanelThenContinuouslyScrollContentView() {
+        positionPanelInAlmostMaximizedState();
+
+        // Simulate swipe up to maximized position.
+        simulateActionDownEvent(0.f, mAlmostMaximizedContentOffsetYDp + 1.f);
+        simulateActionMoveEvent(0.f, mMaximizedContentOffsetYDp);
+        positionPanelInMaximizedState();
+
+        // Confirm that the Panel got a scroll event.
+        assertTrue(mPanel.getWasScrollDetected());
+
+        // Continue the swipe up for one more dp. From now on, the events might be forwarded
+        // to the ContentView.
+        simulateActionMoveEvent(0.f, mMaximizedContentOffsetYDp - 1.f);
+
+        // Now keep swiping up an amount greater than the touch slop. In this case a scroll
+        // should be triggered in the ContentView.
+        simulateActionMoveEvent(0.f, mMaximizedContentOffsetYDp - 2 * mTouchSlopDp);
+        simulateActionUpEvent(0.f, mMaximizedContentOffsetYDp - 2 * mTouchSlopDp);
+
+        assertFalse(mPanel.getWasTapDetected());
+
+        assertTrue(mWasScrollDetectedOnContent);
+        assertFalse(mWasTapDetectedOnContent);
+    }
+
+    @SmallTest
+    @Feature({"OverlayPanel"})
+    public void testTapPanel() {
+        positionPanelInAlmostMaximizedState();
+
+        // Simulate tap.
+        simulateActionDownEvent(0.f, mAlmostMaximizedContentOffsetYDp - 1.f);
+        simulateActionUpEvent(0.f, mAlmostMaximizedContentOffsetYDp - 1.f);
+
+        assertFalse(mPanel.getWasScrollDetected());
+        assertTrue(mPanel.getWasTapDetected());
+
+        assertFalse(mWasScrollDetectedOnContent);
+        assertFalse(mWasTapDetectedOnContent);
+    }
+
+    @SmallTest
+    @Feature({"OverlayPanel"})
+    public void testScrollPanel() {
+        positionPanelInAlmostMaximizedState();
+
+        // Simulate swipe up sequence.
+        simulateActionDownEvent(0.f, mAlmostMaximizedContentOffsetYDp - 1.f);
+        simulateActionMoveEvent(0.f, mMaximizedContentOffsetYDp);
+        simulateActionUpEvent(0.f, mMaximizedContentOffsetYDp);
+
+        assertTrue(mPanel.getWasScrollDetected());
+        assertFalse(mPanel.getWasTapDetected());
+
+        assertFalse(mWasScrollDetectedOnContent);
+        assertFalse(mWasTapDetectedOnContent);
+    }
+
+    // --------------------------------------------------------------------------------------------
+    // Helpers
+    // --------------------------------------------------------------------------------------------
+
+    /**
+     * Positions the Panel in the almost maximized state.
+     */
+    private void positionPanelInAlmostMaximizedState() {
+        mPanel.setMaximizedForTesting(false);
+        mPanel.setOffsetYForTesting(PANEL_ALMOST_MAXIMIZED_OFFSET_Y_DP);
+    }
+
+    /**
+     * Positions the Panel in the maximized state.
+     */
+    private void positionPanelInMaximizedState() {
+        mPanel.setMaximizedForTesting(true);
+        mPanel.setOffsetYForTesting(0);
+    }
+
+    /**
+     * Sets the vertical scroll position of the ContentView.
+     * @param contentViewVerticalScroll The vertical scroll position.
+     */
+    private void setContentViewVerticalScroll(float contentViewVerticalScroll) {
+        mContentVerticalScroll = contentViewVerticalScroll;
+    }
+
+    /**
+     * Simulates a MotionEvent in the OverlayPanelEventFilter.
+     * @param action The event's action.
+     * @param x The event's x coordinate in dps.
+     * @param y The event's y coordinate in dps.
+     */
+    private void simulateEvent(int action, float x, float y) {
+        MotionEvent motionEvent = MotionEvent.obtain(0, 0, action, x * mDpToPx, y * mDpToPx, 0);
+        mEventFilter.onTouchEventInternal(motionEvent);
+    }
+
+    /**
+     * Simulates a MotionEvent.ACTION_DOWN in the OverlayPanelEventFilter.
+     * @param x The event's x coordinate in dps.
+     * @param y The event's y coordinate in dps.
+     */
+    private void simulateActionDownEvent(float x, float y) {
+        simulateEvent(MotionEvent.ACTION_DOWN, x, y);
+    }
+
+    /**
+     * Simulates a MotionEvent.ACTION_MOVE in the OverlayPanelEventFilter.
+     * @param x The event's x coordinate in dps.
+     * @param y The event's y coordinate in dps.
+     */
+    private void simulateActionMoveEvent(float x, float y) {
+        simulateEvent(MotionEvent.ACTION_MOVE, x, y);
+    }
+
+    /**
+     * Simulates a MotionEvent.ACTION_UP in the OverlayPanelEventFilter.
+     * @param x The event's x coordinate in dps.
+     * @param y The event's y coordinate in dps.
+     */
+    private void simulateActionUpEvent(float x, float y) {
+        simulateEvent(MotionEvent.ACTION_UP, x, y);
+    }
+}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManagerTest.java
index b65a094..385479e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManagerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManagerTest.java
@@ -32,29 +32,18 @@
 
         private PanelPriority mPriority;
         private boolean mCanBeSuppressed;
-        private OverlayPanelHost mHost;
         private ViewGroup mContainerView;
         private DynamicResourceLoader mResourceLoader;
 
         public MockOverlayPanel(Context context, LayoutUpdateHost updateHost,
                 OverlayPanelManager panelManager, PanelPriority priority,
                 boolean canBeSuppressed) {
-            super(context, updateHost, panelManager);
+            super(context, updateHost, null, panelManager);
             mPriority = priority;
             mCanBeSuppressed = canBeSuppressed;
         }
 
         @Override
-        public void setHost(OverlayPanelHost host) {
-            super.setHost(host);
-            mHost = host;
-        }
-
-        public OverlayPanelHost getHost() {
-            return mHost;
-        }
-
-        @Override
         public void setContainerView(ViewGroup container) {
             super.setContainerView(container);
             mContainerView = container;
@@ -222,22 +211,13 @@
         MockOverlayPanel earlyPanel =
                 new MockOverlayPanel(context, null, panelManager, PanelPriority.MEDIUM, true);
 
-        OverlayPanelHost host = new OverlayPanelHost() {
-                    @Override
-                    public void hideLayout(boolean immediately) {
-                        // Intentionally do nothing.
-                    }
-                };
-
         // Set necessary vars before any other panels are registered in the manager.
-        panelManager.setPanelHost(host);
         panelManager.setContainerView(new LinearLayout(getInstrumentation().getTargetContext()));
         panelManager.setDynamicResourceLoader(new DynamicResourceLoader(0, null));
 
         MockOverlayPanel latePanel =
                 new MockOverlayPanel(context, null, panelManager, PanelPriority.MEDIUM, true);
 
-        assertTrue(earlyPanel.getHost() == latePanel.getHost());
         assertTrue(earlyPanel.getContainerView() == latePanel.getContainerView());
         assertTrue(earlyPanel.getDynamicResourceLoader() == latePanel.getDynamicResourceLoader());
     }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchEventFilterTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchEventFilterTest.java
deleted file mode 100644
index f0243629..0000000
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchEventFilterTest.java
+++ /dev/null
@@ -1,514 +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.
-
-package org.chromium.chrome.browser.contextualsearch;
-
-import android.content.Context;
-import android.test.InstrumentationTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.view.GestureDetector;
-import android.view.GestureDetector.SimpleOnGestureListener;
-import android.view.MotionEvent;
-import android.view.ViewConfiguration;
-
-import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel;
-import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelContent;
-import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager;
-import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchPanel;
-import org.chromium.chrome.browser.compositor.eventfilter.MockEventFilterHost;
-import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost;
-import org.chromium.chrome.browser.compositor.layouts.eventfilter.ContextualSearchEventFilter;
-import org.chromium.chrome.browser.compositor.layouts.eventfilter.EventFilterHost;
-import org.chromium.chrome.browser.compositor.layouts.eventfilter.GestureHandler;
-import org.chromium.chrome.browser.compositor.scene_layer.ContextualSearchSceneLayer;
-
-/**
- * Class responsible for testing the ContextualSearchEventFilter.
- */
-public class ContextualSearchEventFilterTest extends InstrumentationTestCase
-        implements GestureHandler {
-
-    private static final float SEARCH_PANEL_ALMOST_MAXIMIZED_OFFSET_Y_DP = 50.f;
-    private static final float SEARCH_BAR_HEIGHT_DP = 100.f;
-
-    private static final float LAYOUT_WIDTH_DP = 600.f;
-    private static final float LAYOUT_HEIGHT_DP = 800.f;
-
-    // A small value used to check whether two floats are almost equal.
-    private static final float EPSILON = 1e-04f;
-
-    private float mTouchSlopDp;
-    private float mDpToPx;
-
-    private float mAlmostMaximizedSearchContentViewOffsetYDp;
-    private float mMaximizedSearchContentViewOffsetYDp;
-
-    private float mSearchContentViewVerticalScroll;
-
-    private boolean mWasTapDetectedOnSearchPanel;
-    private boolean mWasScrollDetectedOnSearchPanel;
-    private boolean mWasTapDetectedOnSearchContentView;
-    private boolean mWasScrollDetectedOnSearchContentView;
-
-    private ContextualSearchPanel mContextualSearchPanel;
-    private ContextualSearchEventFilterWrapper mEventFilter;
-
-    private boolean mShouldLockHorizontalMotionInSearchContentView;
-    private MotionEvent mEventPropagatedToSearchContentView;
-
-    // --------------------------------------------------------------------------------------------
-    // MockEventFilterHostWrapper
-    // --------------------------------------------------------------------------------------------
-
-    /**
-     * Wrapper around MockEventFilterHost used to mimic the event forwarding mechanism
-     * of the EventFilterHost.
-     */
-    public class MockEventFilterHostWrapper extends MockEventFilterHost {
-        GestureDetector mGestureDetector;
-
-        public MockEventFilterHostWrapper(Context context) {
-            mGestureDetector = new GestureDetector(context, new SimpleOnGestureListener() {
-                @Override
-                public boolean onSingleTapUp(MotionEvent e) {
-                    mWasTapDetectedOnSearchContentView = true;
-                    return true;
-                }
-
-                @Override
-                public boolean onScroll(MotionEvent e1, MotionEvent e2, float dx, float dy) {
-                    mWasScrollDetectedOnSearchContentView = true;
-                    return true;
-                }
-            });
-        }
-
-        @Override
-        public boolean propagateEvent(MotionEvent e) {
-            // Check that the event offset is correct.
-            if (!mShouldLockHorizontalMotionInSearchContentView) {
-                float propagatedEventY = mEventPropagatedToSearchContentView.getY();
-                float offsetY = mContextualSearchPanel.getContentY() * mDpToPx;
-                assertEquals(propagatedEventY - offsetY, e.getY(), EPSILON);
-            }
-
-            // Propagates the event to the GestureDetector in order to be able to tell
-            // if the gesture was properly triggered in the SearchContentView.
-            return mGestureDetector.onTouchEvent(e);
-        }
-
-    }
-
-    // --------------------------------------------------------------------------------------------
-    // ContextualSearchEventFilterWrapper
-    // --------------------------------------------------------------------------------------------
-
-    /**
-     * Wrapper around ContextualSearchEventFilter used by tests.
-     */
-    public class ContextualSearchEventFilterWrapper extends ContextualSearchEventFilter {
-        public ContextualSearchEventFilterWrapper(Context context, EventFilterHost host,
-                GestureHandler handler, OverlayPanelManager panelManager) {
-            super(context, host, handler, panelManager);
-        }
-
-        @Override
-        protected float getSearchContentViewVerticalScroll() {
-            return mSearchContentViewVerticalScroll;
-        }
-
-        @Override
-        protected void propagateEventToSearchContentView(MotionEvent e) {
-            mEventPropagatedToSearchContentView = MotionEvent.obtain(e);
-            super.propagateEventToSearchContentView(e);
-            mEventPropagatedToSearchContentView.recycle();
-        }
-    }
-
-    // --------------------------------------------------------------------------------------------
-    // MockContextualSearchPanel
-    // --------------------------------------------------------------------------------------------
-
-    /**
-     * Mocks the ContextualSearchPanel, so it doesn't create ContentViewCore.
-     */
-    public static class MockContextualSearchPanel extends ContextualSearchPanel {
-
-        public MockContextualSearchPanel(Context context, LayoutUpdateHost updateHost,
-                OverlayPanelManager panelManager) {
-            super(context, updateHost, panelManager);
-        }
-
-        @Override
-        public OverlayPanelContent createNewOverlayPanelContent() {
-            return new MockOverlayPanelContent();
-        }
-
-        @Override
-        protected ContextualSearchSceneLayer createNewContextualSearchSceneLayer() {
-            return null;
-        }
-
-        /**
-         * Override creation and destruction of the ContentViewCore as they rely on native methods.
-         */
-        private static class MockOverlayPanelContent extends OverlayPanelContent {
-            public MockOverlayPanelContent() {
-                super(null, null, null);
-            }
-
-            @Override
-            public void removeLastHistoryEntry(String url, long timeInMs) {}
-        }
-    }
-
-    // --------------------------------------------------------------------------------------------
-    // MockOverlayPanelManager
-    // --------------------------------------------------------------------------------------------
-
-    /**
-     * OverlayPanelManager that always returns the MockContextualSearchPanel as the active
-     * panel.
-     */
-    private static class MockOverlayPanelManager extends OverlayPanelManager {
-        private OverlayPanel mPanel;
-
-        public MockOverlayPanelManager() {
-        }
-
-        public void setOverlayPanel(OverlayPanel panel) {
-            mPanel = panel;
-        }
-
-        @Override
-        public OverlayPanel getActivePanel() {
-            return mPanel;
-        }
-    }
-
-    // --------------------------------------------------------------------------------------------
-    // Test Suite
-    // --------------------------------------------------------------------------------------------
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        Context context = getInstrumentation().getTargetContext();
-
-        mDpToPx = context.getResources().getDisplayMetrics().density;
-        mTouchSlopDp = ViewConfiguration.get(context).getScaledTouchSlop() / mDpToPx;
-
-        EventFilterHost eventFilterHost = new MockEventFilterHostWrapper(context);
-        MockOverlayPanelManager panelManager = new MockOverlayPanelManager();
-        mContextualSearchPanel = new MockContextualSearchPanel(context, null, panelManager);
-        panelManager.setOverlayPanel(mContextualSearchPanel);
-        mEventFilter = new ContextualSearchEventFilterWrapper(context, eventFilterHost, this,
-                panelManager);
-
-        mContextualSearchPanel.setSearchBarHeightForTesting(SEARCH_BAR_HEIGHT_DP);
-        mContextualSearchPanel.setHeightForTesting(LAYOUT_HEIGHT_DP);
-        mContextualSearchPanel.setIsFullWidthSizePanelForTesting(true);
-
-        // NOTE(pedrosimonetti): This should be called after calling the method
-        // setIsFullWidthSizePanelForTesting(), otherwise it will crash the test.
-        mContextualSearchPanel.onSizeChanged(LAYOUT_WIDTH_DP, LAYOUT_HEIGHT_DP);
-
-        setSearchContentViewVerticalScroll(0);
-
-        mAlmostMaximizedSearchContentViewOffsetYDp =
-                SEARCH_PANEL_ALMOST_MAXIMIZED_OFFSET_Y_DP + SEARCH_BAR_HEIGHT_DP;
-        mMaximizedSearchContentViewOffsetYDp = SEARCH_BAR_HEIGHT_DP;
-
-        mWasTapDetectedOnSearchPanel = false;
-        mWasScrollDetectedOnSearchPanel = false;
-        mWasTapDetectedOnSearchContentView = false;
-        mWasScrollDetectedOnSearchContentView = false;
-
-        mShouldLockHorizontalMotionInSearchContentView = false;
-    }
-
-    @SmallTest
-    @Feature({"ContextualSearch"})
-    public void testTapSearchContentView() {
-        positionSearchPanelInAlmostMaximizedState();
-
-        // Simulate tap.
-        simulateActionDownEvent(0.f, mAlmostMaximizedSearchContentViewOffsetYDp + 1.f);
-        simulateActionUpEvent(0.f, mAlmostMaximizedSearchContentViewOffsetYDp + 1.f);
-
-        assertFalse(mWasScrollDetectedOnSearchPanel);
-        assertFalse(mWasTapDetectedOnSearchPanel);
-
-        assertTrue(mWasTapDetectedOnSearchContentView);
-        assertFalse(mWasScrollDetectedOnSearchContentView);
-    }
-
-    @SmallTest
-    @Feature({"ContextualSearch"})
-    public void testScrollingSearchContentViewDragsSearchPanel() {
-        positionSearchPanelInAlmostMaximizedState();
-
-        // Simulate swipe up sequence.
-        simulateActionDownEvent(0.f, mAlmostMaximizedSearchContentViewOffsetYDp + 1.f);
-        simulateActionMoveEvent(0.f, mMaximizedSearchContentViewOffsetYDp);
-        simulateActionUpEvent(0.f, mMaximizedSearchContentViewOffsetYDp);
-
-        assertTrue(mWasScrollDetectedOnSearchPanel);
-        assertFalse(mWasTapDetectedOnSearchPanel);
-
-        assertFalse(mWasScrollDetectedOnSearchContentView);
-        assertFalse(mWasTapDetectedOnSearchContentView);
-    }
-
-    @SmallTest
-    @Feature({"ContextualSearch"})
-    public void testScrollUpSearchContentView() {
-        positionSearchPanelInMaximizedState();
-
-        // Simulate swipe up sequence.
-        simulateActionDownEvent(0.f, mAlmostMaximizedSearchContentViewOffsetYDp + 1.f);
-        simulateActionMoveEvent(0.f, mMaximizedSearchContentViewOffsetYDp);
-        simulateActionUpEvent(0.f, mMaximizedSearchContentViewOffsetYDp);
-
-        assertFalse(mWasScrollDetectedOnSearchPanel);
-        assertFalse(mWasTapDetectedOnSearchPanel);
-
-        assertTrue(mWasScrollDetectedOnSearchContentView);
-        assertFalse(mWasTapDetectedOnSearchContentView);
-    }
-
-    @SmallTest
-    @Feature({"ContextualSearch"})
-    public void testScrollDownSearchContentView() {
-        positionSearchPanelInMaximizedState();
-
-        // When the Panel is maximized and the scroll position is greater than zero, a swipe down
-        // on the SearchContentView should trigger a scroll on it.
-        setSearchContentViewVerticalScroll(100.f);
-
-        // Simulate swipe down sequence.
-        simulateActionDownEvent(0.f, mMaximizedSearchContentViewOffsetYDp + 1.f);
-        simulateActionMoveEvent(0.f, mAlmostMaximizedSearchContentViewOffsetYDp);
-        simulateActionUpEvent(0.f, mAlmostMaximizedSearchContentViewOffsetYDp);
-
-        assertFalse(mWasScrollDetectedOnSearchPanel);
-        assertFalse(mWasTapDetectedOnSearchPanel);
-
-        assertTrue(mWasScrollDetectedOnSearchContentView);
-        assertFalse(mWasTapDetectedOnSearchContentView);
-    }
-
-    @SmallTest
-    @Feature({"ContextualSearch"})
-    public void testDragByOverscrollingSearchContentView() {
-        positionSearchPanelInMaximizedState();
-
-        // When the Panel is maximized and the scroll position is zero, a swipe down on the
-        // SearchContentView should trigger a swipe on the SearchPanel.
-        setSearchContentViewVerticalScroll(0.f);
-
-        // Simulate swipe down sequence.
-        simulateActionDownEvent(0.f, mMaximizedSearchContentViewOffsetYDp + 1.f);
-        simulateActionMoveEvent(0.f, mAlmostMaximizedSearchContentViewOffsetYDp);
-        simulateActionUpEvent(0.f, mAlmostMaximizedSearchContentViewOffsetYDp);
-
-        assertTrue(mWasScrollDetectedOnSearchPanel);
-        assertFalse(mWasTapDetectedOnSearchPanel);
-
-        assertFalse(mWasScrollDetectedOnSearchContentView);
-        assertFalse(mWasTapDetectedOnSearchContentView);
-    }
-
-    @SmallTest
-    @Feature({"ContextualSearch"})
-    public void testUnwantedTapDoesNotHappenInSearchContentView() {
-        positionSearchPanelInAlmostMaximizedState();
-
-        float searchContentViewOffsetYStart = mAlmostMaximizedSearchContentViewOffsetYDp + 1.f;
-        float searchContentViewOffsetYEnd = mMaximizedSearchContentViewOffsetYDp - 1.f;
-
-        // Simulate swipe up to maximized position.
-        simulateActionDownEvent(0.f, searchContentViewOffsetYStart);
-        simulateActionMoveEvent(0.f, mMaximizedSearchContentViewOffsetYDp);
-        positionSearchPanelInMaximizedState();
-
-        // Confirm that the SearchPanel got a scroll event.
-        assertTrue(mWasScrollDetectedOnSearchPanel);
-
-        // Continue the swipe up for one more dp. From now on, the events might be forwarded
-        // to the SearchContentView.
-        simulateActionMoveEvent(0.f, searchContentViewOffsetYEnd);
-        simulateActionUpEvent(0.f, searchContentViewOffsetYEnd);
-
-        // But 1 dp is not enough to trigger a scroll in the SearchContentView, and in this
-        // particular case, it should also not trigger a tap because the total displacement
-        // of the touch gesture is greater than the touch slop.
-        float searchContentViewOffsetDelta =
-                searchContentViewOffsetYStart - searchContentViewOffsetYEnd;
-        assertTrue(Math.abs(searchContentViewOffsetDelta) > mTouchSlopDp);
-
-        assertFalse(mWasTapDetectedOnSearchPanel);
-
-        assertFalse(mWasScrollDetectedOnSearchContentView);
-        assertFalse(mWasTapDetectedOnSearchContentView);
-    }
-
-    @SmallTest
-    @Feature({"ContextualSearch"})
-    public void testDragSearchPanelThenContinuouslyScrollSearchContentView() {
-        positionSearchPanelInAlmostMaximizedState();
-
-        // Simulate swipe up to maximized position.
-        simulateActionDownEvent(0.f, mAlmostMaximizedSearchContentViewOffsetYDp + 1.f);
-        simulateActionMoveEvent(0.f, mMaximizedSearchContentViewOffsetYDp);
-        positionSearchPanelInMaximizedState();
-
-        // Confirm that the SearchPanel got a scroll event.
-        assertTrue(mWasScrollDetectedOnSearchPanel);
-
-        // Continue the swipe up for one more dp. From now on, the events might be forwarded
-        // to the SearchContentView.
-        simulateActionMoveEvent(0.f, mMaximizedSearchContentViewOffsetYDp - 1.f);
-
-        // Now keep swiping up an amount greater than the touch slop. In this case a scroll
-        // should be triggered in the SearchContentView.
-        simulateActionMoveEvent(0.f, mMaximizedSearchContentViewOffsetYDp - 2 * mTouchSlopDp);
-        simulateActionUpEvent(0.f, mMaximizedSearchContentViewOffsetYDp - 2 * mTouchSlopDp);
-
-        assertFalse(mWasTapDetectedOnSearchPanel);
-
-        assertTrue(mWasScrollDetectedOnSearchContentView);
-        assertFalse(mWasTapDetectedOnSearchContentView);
-    }
-
-    @SmallTest
-    @Feature({"ContextualSearch"})
-    public void testTapSearchPanel() {
-        positionSearchPanelInAlmostMaximizedState();
-
-        // Simulate tap.
-        simulateActionDownEvent(0.f, mAlmostMaximizedSearchContentViewOffsetYDp - 1.f);
-        simulateActionUpEvent(0.f, mAlmostMaximizedSearchContentViewOffsetYDp - 1.f);
-
-        assertFalse(mWasScrollDetectedOnSearchPanel);
-        assertTrue(mWasTapDetectedOnSearchPanel);
-
-        assertFalse(mWasScrollDetectedOnSearchContentView);
-        assertFalse(mWasTapDetectedOnSearchContentView);
-    }
-
-    @SmallTest
-    @Feature({"ContextualSearch"})
-    public void testScrollSearchPanel() {
-        positionSearchPanelInAlmostMaximizedState();
-
-        // Simulate swipe up sequence.
-        simulateActionDownEvent(0.f, mAlmostMaximizedSearchContentViewOffsetYDp - 1.f);
-        simulateActionMoveEvent(0.f, mMaximizedSearchContentViewOffsetYDp);
-        simulateActionUpEvent(0.f, mMaximizedSearchContentViewOffsetYDp);
-
-        assertTrue(mWasScrollDetectedOnSearchPanel);
-        assertFalse(mWasTapDetectedOnSearchPanel);
-
-        assertFalse(mWasScrollDetectedOnSearchContentView);
-        assertFalse(mWasTapDetectedOnSearchContentView);
-    }
-
-    // --------------------------------------------------------------------------------------------
-    // Helpers
-    // --------------------------------------------------------------------------------------------
-
-    /**
-     * Positions the SearchPanel in the almost maximized state.
-     */
-    private void positionSearchPanelInAlmostMaximizedState() {
-        mContextualSearchPanel.setMaximizedForTesting(false);
-        mContextualSearchPanel.setOffsetYForTesting(SEARCH_PANEL_ALMOST_MAXIMIZED_OFFSET_Y_DP);
-    }
-
-    /**
-     * Positions the SearchPanel in the maximized state.
-     */
-    private void positionSearchPanelInMaximizedState() {
-        mContextualSearchPanel.setMaximizedForTesting(true);
-        mContextualSearchPanel.setOffsetYForTesting(0);
-    }
-
-    /**
-     * Sets the vertical scroll position of the SearchContentView.
-     * @param searchContentViewVerticalScroll The vertical scroll position.
-     */
-    private void setSearchContentViewVerticalScroll(float searchContentViewVerticalScroll) {
-        mSearchContentViewVerticalScroll = searchContentViewVerticalScroll;
-    }
-
-    /**
-     * Simulates a MotionEvent in the ContextualSearchEventFilter.
-     * @param action The event's action.
-     * @param x The event's x coordinate in dps.
-     * @param y The event's y coordinate in dps.
-     */
-    private void simulateEvent(int action, float x, float y) {
-        MotionEvent motionEvent = MotionEvent.obtain(0, 0, action, x * mDpToPx, y * mDpToPx, 0);
-        mEventFilter.onTouchEventInternal(motionEvent);
-    }
-
-    /**
-     * Simulates a MotionEvent.ACTION_DOWN in the ContextualSearchEventFilter.
-     * @param x The event's x coordinate in dps.
-     * @param y The event's y coordinate in dps.
-     */
-    private void simulateActionDownEvent(float x, float y) {
-        simulateEvent(MotionEvent.ACTION_DOWN, x, y);
-    }
-
-    /**
-     * Simulates a MotionEvent.ACTION_MOVE in the ContextualSearchEventFilter.
-     * @param x The event's x coordinate in dps.
-     * @param y The event's y coordinate in dps.
-     */
-    private void simulateActionMoveEvent(float x, float y) {
-        simulateEvent(MotionEvent.ACTION_MOVE, x, y);
-    }
-
-    /**
-     * Simulates a MotionEvent.ACTION_UP in the ContextualSearchEventFilter.
-     * @param x The event's x coordinate in dps.
-     * @param y The event's y coordinate in dps.
-     */
-    private void simulateActionUpEvent(float x, float y) {
-        simulateEvent(MotionEvent.ACTION_UP, x, y);
-    }
-
-    // --------------------------------------------------------------------------------------------
-    // SearchPanel GestureHandler
-    // --------------------------------------------------------------------------------------------
-
-    @Override
-    public void onDown(float x, float y, boolean fromMouse, int buttons) {}
-
-    @Override
-    public void onUpOrCancel() {}
-
-    @Override
-    public void drag(float x, float y, float dx, float dy, float tx, float ty) {
-        mWasScrollDetectedOnSearchPanel = true;
-    }
-
-    @Override
-    public void click(float x, float y, boolean fromMouse, int buttons) {
-        mWasTapDetectedOnSearchPanel = true;
-    }
-
-    @Override
-    public void fling(float x, float y, float velocityX, float velocityY) {}
-
-    @Override
-    public void onLongPress(float x, float y) {}
-
-    @Override
-    public void onPinch(float x0, float y0, float x1, float y1, boolean firstEvent) {}
-}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTapEventTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTapEventTest.java
index 36ebe18..53578e7 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTapEventTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTapEventTest.java
@@ -14,8 +14,11 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManagerWrapper;
 import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchPanel;
+import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost;
+import org.chromium.chrome.browser.compositor.layouts.eventfilter.EventFilterHost;
 import org.chromium.chrome.test.ChromeActivityTestCaseBase;
 import org.chromium.content.browser.ContentViewCore;
 import org.chromium.content.browser.ContextualSearchClient;
@@ -53,6 +56,21 @@
     // --------------------------------------------------------------------------------------------
 
     /**
+     * ContextualSearchPanel wrapper that prevents native calls.
+     */
+    private static class ContextualSearchPanelWrapper extends ContextualSearchPanel {
+        public ContextualSearchPanelWrapper(Context context, LayoutUpdateHost updateHost,
+                EventFilterHost eventHost, OverlayPanelManager panelManager) {
+            super(context, updateHost, eventHost, panelManager);
+        }
+
+        @Override
+        public void setBasePageTextControlsVisibility(boolean visible) {}
+    }
+
+    // --------------------------------------------------------------------------------------------
+
+    /**
      * ContextualSearchManager wrapper that prevents network requests and most native calls.
      */
     private static class ContextualSearchManagerWrapper extends ContextualSearchManager {
@@ -166,7 +184,7 @@
 
         mContextualSearchManager =
                 new ContextualSearchManagerWrapper(getActivity(), getActivity().getWindowAndroid());
-        mPanel = new ContextualSearchPanel(getActivity(), null, mPanelManager);
+        mPanel = new ContextualSearchPanelWrapper(getActivity(), null, null, mPanelManager);
         mPanel.setManagementDelegate(mContextualSearchManager);
         mContextualSearchManager.setContextualSearchPanel(mPanel);
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManagerTest.java
index d49b77e..960cc42 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManagerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManagerTest.java
@@ -106,7 +106,7 @@
      */
     private static class MockReaderModePanel extends ReaderModePanel {
         public MockReaderModePanel(Context context, OverlayPanelManager manager) {
-            super(context, null, manager, null);
+            super(context, null, null, manager, null);
         }
 
         @Override
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java
index c4980f8..5daf927a 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java
@@ -162,12 +162,12 @@
                 sharedPrefs, DownloadNotificationService.PENDING_DOWNLOAD_NOTIFICATIONS);
         assertEquals(3, entries.size());
 
-        service.notifyDownloadSuccessful(guid1, null);
+        service.notifyDownloadSuccessful(3, guid1, "success", null);
         entries = DownloadManagerService.getStoredDownloadInfo(
                 sharedPrefs, DownloadNotificationService.PENDING_DOWNLOAD_NOTIFICATIONS);
         assertEquals(2, entries.size());
 
-        service.notifyDownloadFailed(guid2);
+        service.notifyDownloadFailed(4, guid2, "failed");
         entries = DownloadManagerService.getStoredDownloadInfo(
                 sharedPrefs, DownloadNotificationService.PENDING_DOWNLOAD_NOTIFICATIONS);
         assertEquals(1, entries.size());
@@ -178,6 +178,21 @@
     }
 
     /**
+     * Tests that notification is updated if download success comes without any prior progress.
+     */
+    @SmallTest
+    @Feature({"Download"})
+    public void testDownloadSuccessNotification() {
+        setupService();
+        startNotificationService();
+        DownloadNotificationService service = bindNotificationService();
+        String guid = UUID.randomUUID().toString();
+        service.notifyDownloadSuccessful(1, guid, "test", null);
+        assertEquals(1, getService().getNotificationIds().size());
+        assertTrue(getService().getNotificationIds().contains(1));
+    }
+
+    /**
      * Tests resume all pending downloads.
      */
     @SmallTest
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/ChromeBackupAgentTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/ChromeBackupAgentTest.java
new file mode 100644
index 0000000..20e1cb0
--- /dev/null
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/ChromeBackupAgentTest.java
@@ -0,0 +1,56 @@
+// 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.
+
+package org.chromium.chrome.browser;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertThat;
+
+import android.content.SharedPreferences;
+import android.preference.PreferenceManager;
+
+import org.chromium.testing.local.LocalRobolectricTestRunner;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.Robolectric;
+import org.robolectric.annotation.Config;
+
+/**
+ * Unit tests for {@link org.chromium.chrome.browser.ChromeBackupAgent}.
+ */
+@RunWith(LocalRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class ChromeBackupAgentTest {
+
+    static class ChromeTestBackupAgent extends ChromeBackupAgent {
+        ChromeTestBackupAgent() {
+            // This is protected in ContextWrapper, so can only be called within a derived
+            // class.
+            attachBaseContext(Robolectric.application);
+        }
+    }
+
+    @Test
+    public void testOnRestoreFinished() {
+        SharedPreferences sharedPrefs =
+                PreferenceManager.getDefaultSharedPreferences(Robolectric.application);
+        SharedPreferences.Editor editor = sharedPrefs.edit();
+        editor.putBoolean("crash_dump_upload", false);
+        editor.putString("google.services.username", "user1");
+        editor.putString("junk", "junk");
+        editor.commit();
+
+        new ChromeTestBackupAgent().onRestoreFinished();
+
+        // Check that we have only restored the correct preferences
+        assertThat(sharedPrefs.getBoolean("crash_dump_upload", true), equalTo(false));
+        assertThat(sharedPrefs.getString("google.services.username", null), nullValue());
+        assertThat(sharedPrefs.getString("junk", null), nullValue());
+
+        // Check that the preferences for which there is special code are correct
+        assertThat(sharedPrefs.getString("first_run_signin_account_name", null), equalTo("user1"));
+    }
+
+}
diff --git a/chrome/app/chrome_main_delegate.cc b/chrome/app/chrome_main_delegate.cc
index f039f45..6f4f7a3 100644
--- a/chrome/app/chrome_main_delegate.cc
+++ b/chrome/app/chrome_main_delegate.cc
@@ -519,7 +519,6 @@
     base::debug::InstallHandleHooks();
   else
     base::win::DisableHandleVerifier();
-
 #endif
 
   chrome::RegisterPathProvider();
@@ -724,7 +723,8 @@
 
   // Register component_updater PathProvider after DIR_USER_DATA overidden by
   // command line flags. Maybe move the chrome PathProvider down here also?
-  component_updater::RegisterPathProvider(chrome::DIR_USER_DATA);
+  component_updater::RegisterPathProvider(chrome::DIR_COMPONENTS,
+                                          chrome::DIR_USER_DATA);
 
   // Enable Message Loop related state asap.
   if (command_line.HasSwitch(switches::kMessageLoopHistogrammer))
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index f8bce30..1d4087f 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -460,6 +460,9 @@
   <message name="IDS_FILE_BROWSER_SHARE_BUTTON_LABEL" desc="Menu item label, showing dialog to share the selected file.">
     Share
   </message>
+  <message name="IDS_FILE_BROWSER_SHARE_WITH_ACTION_LABEL" desc="Menu item label, describing the action of sharing/attaching/sending files with the given application.">
+    Share with <ph name="APPLICATION_NAME">$1<ex>GMail</ex></ph>
+  </message>
   <message name="IDS_FILE_BROWSER_TOGGLE_HIDDEN_FILES_COMMAND_LABEL" desc="Label for menu or button with checkmark that toggles visibility of hidden files.">
     Show hidden files
   </message>
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index d68cd204..13393e94 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -5833,11 +5833,11 @@
       <message name="IDS_FLAGS_EXPERIMENTAL_POINTER_EVENT_DESCRIPTION" desc="Description for the flag to enable the experimental pointer events.">
         Enables partial experimental support for the Pointer Events API.  This is intended only for testing by web developers, it will cause some websites to be subtly broken.
       </message>
-      <message name="IDS_FLAGS_EXPERIMENTAL_FRAMEWORK_NAME" desc="Name for the flag to enable the Experimental Framework.">
-        Experimental Framework.
+      <message name="IDS_FLAGS_ORIGIN_TRIALS_NAME" desc="Name for the flag to enable origin trials.">
+        Origin Trials
       </message>
-      <message name="IDS_FLAGS_EXPERIMENTAL_FRAMEWORK_DESCRIPTION" desc="Description for the flag to enable the Experimental Framework.">
-        Enables the Experimental Framework for controlling access to API experiments.
+      <message name="IDS_FLAGS_ORIGIN_TRIALS_DESCRIPTION" desc="Description for the flag to enable origin trials.">
+        Enables origin trials for controlling access to feature/API experiments.
       </message>
       <message name="IDS_FLAGS_WEB_BLUETOOTH_NAME" desc="Name for the flag to enable Web Bluetooth.">
         Web Bluetooth
@@ -11705,7 +11705,7 @@
           Never translate this site
         </message>
         <message name="IDS_TRANSLATE_BUBBLE_TRANSLATING" desc="Text to show for the translate bubble label when page is currently being translated by servers">
-          This page is being translated ...
+          This page is being translated...
         </message>
         <message name="IDS_TRANSLATE_BUBBLE_TRANSLATED" desc="Text to show for the translate bubble label when the page has been translated from one language to another">
           This page has been translated.
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index fc5f2df..bda5783f 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (የቅጥያ መታወቂያ «<ph name="EXTENSION_ID" />») በዚህ የክፍለ-ጊዜ አይነት ላይ አይፈቀድም።</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">አይይ! RSA የግል ኩልፍ በዘፈቀደ ለመፍጠር አልተቻለም።</translation>
+<translation id="1421115928968836111">ይሄ ለተጠበቀ ይዘት የFlash Player ፈቃዶች ፈቀዳን ያነሳል።</translation>
 <translation id="1425734930786274278">የሚከተሉት ኩኪዎች ታግደዋል (የሶስተኛ ወገን ኩኪዎች ሳይገለግሉ እየታገዱ ናቸው)፦</translation>
 <translation id="1426410128494586442">አዎ</translation>
 <translation id="1427049173708736891">የእርስዎ Android ስልክ ሲከፈት እና አጠገብ ሲሆን የእርስዎን <ph name="DEVICE_TYPE" /> እንደተከፈተ ያቆዩት—የይለፍ ቃልዎን መተየብ አያስፈልገዎትም።</translation>
@@ -521,6 +522,7 @@
 <translation id="1707463636381878959">ይህን አውታረ መረብ ለሌሎች ተጠቃሚዎች ያጋሩ</translation>
 <translation id="1708199901407471282">በአዲስ የትር ገጽ የተጠቆመ ድረ-ገጽ በሚከፈቱበት ጊዜ አንድ ትር አስቀድሞ ለተጠቆመው የተከፈተ ከሆነ ጥቆማውን በአዲስ ትር ከመክፈት ይልቅ ወደዚያ ይቀይሩት።</translation>
 <translation id="1708338024780164500">(የቦዘነ)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (መታወቂያ፦ <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">መጭመቅ አልተሳካም፣ ያልተጠበቀ ስህተት፦ $1</translation>
 <translation id="1715941336038158809">የተሳሳተ የተጠቃሚ ስም ወይም የይለፍ ቃል።</translation>
 <translation id="1717733954209022288">የGoogle ክፍያዎች ካርድ ቁጠባ አመልካች ሳጥን</translation>
@@ -798,6 +800,7 @@
 <translation id="2168214441502403371">የፋርስ ቁልፍ ሰሌዳ</translation>
 <translation id="2168725742002792683">የፋይል ቅጥያዎች</translation>
 <translation id="2169062631698640254">ለማንኛውም ግባ</translation>
+<translation id="2175042898143291048">ሁልጊዜ ይህን አድርግ</translation>
 <translation id="2175607476662778685">የፈጣን አጀማመር አሞሌ</translation>
 <translation id="2176045495080708525">የሚከተሉት ቅጥያዎች አሁን ተጭነዋል።</translation>
 <translation id="2177950615300672361">ማንነት የማያሳውቅ ትር፦ <ph name="TAB_NAME" /></translation>
@@ -1937,7 +1940,6 @@
 <translation id="3688507211863392146">በመተግበሪያው ውስጥ በሚከፍቷቸው ፋይሎች እና አቃፊዎች ላይ ይጽፋል</translation>
 <translation id="3688526734140524629">ሰርጥ ቀይር</translation>
 <translation id="3688578402379768763">የተዘመነ</translation>
-<translation id="3690976161240450479">መግባት አልተሳካም። እባክዎ የእርስዎን አስተዳዳሪ ያነጋግሩ ወይም እንደገና ይሞክሩ።</translation>
 <translation id="3693415264595406141">የይለፍ ቃል፦</translation>
 <translation id="3694027410380121301">ቀዳሚ ትርን ምረጥ</translation>
 <translation id="3694678678240097321">በገጹ ላይ ስክሪፕት የሚያሄድ ቅጥያ የተጠቃሚ ፍቃድ ይጠይቁ፣ ቅጥያው በሁሉም ዩአርኤሎች ላይ ለማሄድ ፍቃድ ከጠየቀ።</translation>
@@ -2231,6 +2233,7 @@
 <translation id="4116663294526079822">ሁልጊዜ በዚህ ጣቢያ ላይ ፍቀድ</translation>
 <translation id="411666854932687641">የግል ማህደረ ትውስታ</translation>
 <translation id="4118990158415604803">ከሌላ አውታረመረቦች ጋር መገናኘት በአስተዳዳሪ ተወግዷል።</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{እና 1 ተጨማሪ}one{እና # ተጨማሪ}other{እና # ተጨማሪ}}</translation>
 <translation id="4119828560634133962">የህትመት ቅድመ እይታ ምዝገባ ማስተዋወቂያዎች</translation>
 <translation id="4120329147617730038">አንድ አስተዳዳሪ ለ<ph name="USER_EMAIL" /> በርካታ በመለያ-መግቢያዎችን ከልክሏል።
 ለመቀጠል ሁሉም ተጠቃሚዎች ዘግተው መውጣት አለባቸው።</translation>
@@ -2370,9 +2373,11 @@
 <translation id="4345703751611431217">ሶፍትዌር ተኳሃኝ አለመሆን፦ ተጨማሪ ለመረዳት</translation>
 <translation id="4348766275249686434">ስህተቶችን ሰብስብ</translation>
 <translation id="4350019051035968019">ይህ መሣሪያ በተለየ ጎራ የሚተዳደር መሆኑ ምልክት ስለተደረገበት የእርስዎ መለያ ባለበት ጎራ መመዝገብ አይችልም።</translation>
+<translation id="4354806558096370704">የቤተኛ CUPS ማተሚያ ደጀን መጠቀምን ያነቃል።</translation>
 <translation id="4358697938732213860">አድራሻ አክል</translation>
 <translation id="4359408040881008151">በጥገኛ ቅጥያ(ዎች) ምክንያት ተጭኗል።</translation>
 <translation id="4361190688154226069">በእይታዎች ውስጥ በa ላይ የተመሠረተ ማነጣጠር</translation>
+<translation id="4364414793200746179">የAndroid MediaStyle ማሳወቂያ</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> ወርዷል</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> አንድ መስኮት እያጋራ ነው።</translation>
 <translation id="4364830672918311045">ማሳወቂያዎችን አሳይ</translation>
@@ -2776,6 +2781,7 @@
 <translation id="4988792151665380515">ህዝባዊ ቁልፍን መላክ አልተሳካም።</translation>
 <translation id="49896407730300355">በሰዓት መዞሪያ አቅጣጫ &amp;ተቃራኒ አሽከርክር</translation>
 <translation id="4989966318180235467">&amp;የጀርባ ገጽ ይመርምሩ</translation>
+<translation id="4990343175649730969">የChrome ማጽጃ መሣሪያን አውርድ</translation>
 <translation id="4991420928586866460">የላይኛው ረድፍ ቁልፎች እንደ የተግባር ቁልፍ ተጠቀምባቸው</translation>
 <translation id="499165176004408815">ባለከፍተኛ ንፅፅር ሁነታ ተጠቀም</translation>
 <translation id="4992066212339426712">ድምጸ-ከል አንሳ</translation>
@@ -3299,6 +3305,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />፦ አርትዕ ለማድረግ ይምረጡ</translation>
 <translation id="5741454054957165976">ለWebFonts ጭነት አዲስ የተጠቃሚ ወኪል ጣልቃ-ገብነት ስሪቱን ያንቁ።</translation>
 <translation id="574392208103952083">መካከለኛ</translation>
+<translation id="5744368829843057748">2016Q2 በይነገጽን ተርጉም</translation>
 <translation id="5745056705311424885">የUSB ማህደረ ትውስታ መሰኪያ ተገኝቷል</translation>
 <translation id="5746169159649715125">እንደ PDF አስቀምጥ</translation>
 <translation id="5747611503456050045">ይዘት በአቀባዊ አልፎ በማሸብለል የሚቀሰቀሱ የገጽ ዳግም ጭነቶች።</translation>
@@ -3405,6 +3412,7 @@
 <translation id="5884474295213649357">ይህ ትር ከአንድ የዩኤስቢ መሣሪያ ጋር የተገናኘ ነው።</translation>
 <translation id="5885324376209859881">የማህደረ መረጃ ቅንብሮችን ያቀናብሩ...</translation>
 <translation id="5889282057229379085">ከፍተኛ የመሃከለኛ CAዎች ብዛት፦ <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">ምን እየተከሰተ እንዳለ ይንገሩን።</translation>
 <translation id="5892290200158927959">የፈረንሳይኛ BÉPO ቁልፍ ሰሌዳ</translation>
 <translation id="5892507820957994680">አብሮ የተሰራውን የሶፍትዌር ማሳያ ዝርዝሩን የሚሽርና ባልተደገፉ የስርዓት ውቅሮች ላይ በጂፒዩ ማጣደፍን የሚያነቃ ነው።</translation>
 <translation id="5895138241574237353">እንደገና ጀምር</translation>
@@ -3548,6 +3556,7 @@
 <translation id="6122093587541546701">ኢሜይል (ከተፈለገ)፦</translation>
 <translation id="6122875415561139701">የመጻፍ ክወና በዚህ ላይ አይፈቀድም፦ «<ph name="DEVICE_NAME" />»።</translation>
 <translation id="6124650939968185064">የሚከተሉት ቅጥያዎች በዚህ ቅጥያ ላይ ይወሰናሉ፦</translation>
+<translation id="6127945163801765632">በዕልባት አቀናባሪ ውስጥ የ«ሁሉም ዕልባቶች» ክፍሉን ያንቁ።</translation>
 <translation id="6129938384427316298">የNetscape ሰርቲፊኬት አስተያየት</translation>
 <translation id="6129953537138746214">ባዶ ቦታ</translation>
 <translation id="6132383530370527946">ትንሹ እትም</translation>
@@ -3574,6 +3583,7 @@
 <translation id="6164005077879661055">ይህ ክትትል የሚደረግበት ተጠቃሚ አንዴ ከተወገደ በኋላ ሁሉም ከዚህ ክትትል የሚደረግበት ተጠቃሚ ጋር የተጎዳኙ ፋይሎች እና አካባቢያዊ ውሂብ እስከመጨረሻው ይሰረዛሉ። አስተዳዳሪው የዚህ ክትትል የሚደረግበት ተጠቃሚ የጎበኛቸው ድር ጣቢያዎች እና ቅንብሮች <ph name="MANAGEMENT_URL" /> ላይ ሊያዩት ይችላሉ።</translation>
 <translation id="6165508094623778733">ተጨማሪ ለመረዳት</translation>
 <translation id="6166185671393271715">የይለፍ ቃላትን ወደ Chrome ያስመጡ</translation>
+<translation id="6169666352732958425">ዴስክቶፕን cast ማድረግ አልተቻለም።</translation>
 <translation id="6171550060231646388">የተመሳሰሉ ሃርድዌር የ«Ok Google» ባህሪያትን አንቃ</translation>
 <translation id="6175314957787328458">Microsoft Domain GUID</translation>
 <translation id="6178664161104547336">የዕውቅና ማረጋገጫ ምረጥ/ሰርቲፊኬት</translation>
@@ -3767,6 +3777,7 @@
 <translation id="6458308652667395253">JavaScript እገዳን አቀናብር…</translation>
 <translation id="6459488832681039634">ለማግኘት የተመረጡትን ተጠቀም</translation>
 <translation id="6460423884798879930">በመጀመሪያው የSYN ጥቅል ውስጥ ከዚህ ቀደም ለተገናኘ ደንበኛ ትርፍ የማረጋገጫ መረጃ የመላክ አማራጩን ያንቁ፣ ይህም የበለጠ ፈጣን የውሂብ መላክ መጀመር ያስችላል።</translation>
+<translation id="6460474910028274178">የመተርጎሚያ አረፋ በይነገጽ መቀስቀሻ አመክንዮ እና መልክ ተሻሽሏል</translation>
 <translation id="6460601847208524483">ቀጣዩን አግኝ</translation>
 <translation id="6462080265650314920">መተግበሪያዎች በይዘት አይነት «<ph name="CONTENT_TYPE" />» ሊቀርቡ ይገባል።</translation>
 <translation id="6462082050341971451">አሁንም እዛው ነዎት?</translation>
@@ -3896,6 +3907,7 @@
 <translation id="6663792236418322902">የመረጡት የይለፍ ቃል ይህን ፋይል በኋላ ላይ ለማስመለስ ያስፈልጋል።  እባክዎ ደህንነቱ በተጠበቀ ቦታ ላይ ይመዝግቡት።</translation>
 <translation id="6664237456442406323">የአጋጣሚ ነገር ሆኖ ኮምፒውተርዎ በተበላሸ የሃርድዌር መታወቂያ ነው የተዋቀረው። ይሄ Chrome ስርዓተ ክወና በቅርብ ጊዜዎቹ የደህንነት ጥገናዎች እንዳይዘመን ያግደዋል፣ እና የእርስዎ ኮምፒውተር <ph name="BEGIN_BOLD" />ለተንኮል-አዘል ጥቃቶች የተጋለጠ ሊሆን ይችላል<ph name="END_BOLD" />።</translation>
 <translation id="6666647326143344290">በGoogle መለያዎ</translation>
+<translation id="667517062706956822">Google ይህን ገጽ ከ<ph name="SOURCE_LANGUAGE" /> ወደ <ph name="TARGET_LANGUAGE" /> እንዲተረጉመው ይፈልጋሉ?</translation>
 <translation id="6675665718701918026">መጠቆሚያ መሣሪያ ተገናኝቷል</translation>
 <translation id="6677037229676347494">የተጠበቀው መታወቂያ «<ph name="EXPECTED_ID" />» ግን መታወቂያዎ «<ph name="NEW_ID" />» ነበር።</translation>
 <translation id="6680028776254050810">ተጠቃሚዎችን ይቀያይር</translation>
@@ -3947,6 +3959,7 @@
 <translation id="6746392203843147041">ድምጽ ጨምር</translation>
 <translation id="6748140994595080445"><ph name="APP_NAME" /> ቋንቋዎችን እንዴት እንደሚይዝ እና እንደሚያሳይ ይቀይሩ።</translation>
 <translation id="6748465660675848252">መቀጠል ይችላሉ፣ ነገር ግን የእርስዎ የተመሳሰለ ውሂብ እና ቅንብሮች ብቻ እንደነበሩ ይመለሳሉ። ሁሉም አካባቢያዊ ውሂብ ይጠፋል።</translation>
+<translation id="6751256176799620176">1 አቃፊ ተመርጧል</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (ማንነትን የማያሳውቅ)</translation>
 <translation id="6759193508432371551">የፋብሪካ ዳግም ማስጀመር</translation>
 <translation id="6760765581316020278">የቪዬትናምኛ ቁልፍ ሰሌዳ (ቪኤንአይ)</translation>
@@ -4588,6 +4601,7 @@
 <translation id="7717014941119698257">በማውረድ ላይ፦ <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">ማሰልጠን ጊዜ አልፎበታል</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262">ይህን ሰው ለመከታተል <ph name="BEGIN_LINK" />ወደ Chrome ይግቡ<ph name="END_LINK" />።</translation>
 <translation id="7724603315864178912">ቁረጥ</translation>
 <translation id="7730449930968088409">የእርስዎ ማያ ገጽ ይዘት ይቀርጻል</translation>
 <translation id="7730494089396812859">የክላውድ ምትኬ ዝርዝሮችን አሳይ</translation>
@@ -4681,7 +4695,6 @@
 <translation id="7859704718976024901">የአሰሳ ታሪክ</translation>
 <translation id="7861215335140947162">&amp;የወረዱ</translation>
 <translation id="7864539943188674973">ብሉቱዝን ያሰናክሉ</translation>
-<translation id="7868891395842935202">የኤፒአይ ሙከራዎች መዳረሻን ለመቆጣጠር የሙከራ መዋቅርን ያነቃል።</translation>
 <translation id="7870576007982733437">ተገቢነት ሲሆን የሥርዓት ውርድ አስተዳዳሪውን ይጠቀሙ።</translation>
 <translation id="7870790288828963061">ምንም አዲስ ስሪት ያላቸው የKiosk መተግበሪያዎች አልተገኙም። ምንም የሚዘምን ነገር የለም። እባክዎ የዩ.ኤስ.ቢ. ስቲኩን ያስወግዱ።</translation>
 <translation id="787150342916295244">ክሬዲት ካርድን መቃኘት</translation>
@@ -5017,7 +5030,6 @@
 <translation id="8309505303672555187">አውታረ መረብ ይምረጡ፦</translation>
 <translation id="8312871300878166382">ወደ አቃፊ ውስጥ ይለጥፉ</translation>
 <translation id="8314013494437618358">የጥንክር ፈለግ</translation>
-<translation id="8314576811984836978">የሙከራ መዋቅር።</translation>
 <translation id="8319414634934645341">የተስፋፋ ቁልፍ አጠቃቀም</translation>
 <translation id="8322814362483282060">ይህ ገጽ ማይክሮፎንዎን እንዳይደርስበት ታግዷል።</translation>
 <translation id="8326478304147373412">PKCS #7፣ የሰርቲፊኬት ሰንሰለት</translation>
@@ -5078,7 +5090,6 @@
 <translation id="8418240940464873056">የሃንጃ ሁነታ</translation>
 <translation id="8418445294933751433">&amp;በትር አሳይ</translation>
 <translation id="8420060421540670057">የGoogle ሰነዶች ፋይሎችን አሳይ</translation>
-<translation id="8420728540268437431">ይህ ገጽ በመተርጎም ላይ ነው ...</translation>
 <translation id="842274098655511832">የWebGL ረቂቅ ቅጥያዎችን</translation>
 <translation id="8424039430705546751">ታች</translation>
 <translation id="8425213833346101688">ለውጥ</translation>
@@ -5265,6 +5276,7 @@
 <translation id="8690754533598178758">Adobe Flash Player ማይክሮፎን ልዩዎች የተለዩ ናቸው።</translation>
 <translation id="8691686986795184760">(በድርጅት መመሪያ የነቃ)</translation>
 <translation id="869257642790614972">መጨረሻ ላይ የተዘጋውን ትር ዳግም ክፈት</translation>
+<translation id="8695770993395462321">ቤተኛ CUPS</translation>
 <translation id="8695825812785969222">&amp;ቦታ ክፈት…</translation>
 <translation id="8698464937041809063">Google ስዕል</translation>
 <translation id="869884720829132584">የመተግበሪያዎች ምናሌ</translation>
@@ -5607,6 +5619,7 @@
 <translation id="9189690067274055051">ለመግባት ስልክዎን ያስከፍቱት እና ከእርስዎ <ph name="DEVICE_TYPE" /> አጠገብ ያምጡት።</translation>
 <translation id="9190063653747922532">L2TP/IPsec + ቅድሚያ የተጋራ ቁልፍ</translation>
 <translation id="9201305942933582053">Google Now ለChrome!</translation>
+<translation id="9202646163273566462">የሁሉም ዕልባቶች እይታ እንደ ነባሪው የዕልባት አቀናባሪው መድረሻው አድርጎ ያነቃዋል።</translation>
 <translation id="9203398526606335860">&amp;መገለጫ መስራት ነቅቷል</translation>
 <translation id="9203478404496196495">የትሮች ድምጸ-ከል አንሳ</translation>
 <translation id="9203962528777363226">የዚህ መሣሪያ አስተዳዳሪ አዲስ ተጠቃሚዎች እንዳይታከሉ አሰናክሏል</translation>
@@ -5633,6 +5646,7 @@
 <translation id="939736085109172342">አዲስ ዓቃፊ</translation>
 <translation id="940425055435005472">የቅርጸ-ቁምፊ መጠን፦</translation>
 <translation id="941543339607623937">ልክ ያልሆነ ግላዊ ቁልፍ።</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{ምንም}=1{1 መተግበሪያ ($1)}=2{2 መተግበሪያዎች ($1፣ $2)}one{# መተግበሪያዎች ($1፣ $2፣ $3)}other{# መተግበሪያዎች ($1፣ $2፣ $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> የChrome ትር እና ኦዲዮ እያጋራ ነው።</translation>
 <translation id="942954117721265519">በዚህ አቃፊ ውስጥ ምንም ምስሎች የሉም።</translation>
 <translation id="945522503751344254">ግብረ መልስ ላክ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index 54b344f6..d135b16 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (معرف الإضافة "<ph name="EXTENSION_ID" />") غير مسموح بها في هذا النوع من الجلسات.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">‏عذرًا! أخفق إنشاء ملف خاص RSA عشوائي.</translation>
+<translation id="1421115928968836111">‏سيؤدي هذا إلى إلغاء التصريح بتراخيص Flash Player للمحتوى المحمي.</translation>
 <translation id="1425734930786274278">تم منع ملفات تعريف الارتباط التالية (يتم منع ملفات تعريف الارتباط التي تنتمي لجهات خارجية دون استثناء):</translation>
 <translation id="1426410128494586442">نعم</translation>
 <translation id="1427049173708736891">‏الإبقاء على <ph name="DEVICE_TYPE" /> غير مقفل عندما يكون هاتف Android غير مقفل وقريب - فليس هناك حاجة لكتابة كلمة المرور لديك.</translation>
@@ -522,6 +523,7 @@
 <translation id="1707463636381878959">مشاركة هذه الشبكة مع مستخدمين آخرين</translation>
 <translation id="1708199901407471282">عند فتح صفحة ويب مقترحة من صفحة علامة تبويب جديدة، إذا كانت علامة تبويب مفتوحة بالفعل للاقتراح، فبدِّل إلى علامة التبويب تلك بدلاً من تحميل الاقتراح في علامة التبويب الجديدة.</translation>
 <translation id="1708338024780164500">(غير نشطة)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (رقم التعريف: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">أخفق الضغط، خطأ غير متوقع: $1</translation>
 <translation id="1715941336038158809">اسم المستخدم أو كلمة المرور غير صالحة.</translation>
 <translation id="1717733954209022288">‏مربع اختيار حفظ Google Payments</translation>
@@ -798,6 +800,7 @@
 <translation id="2168214441502403371">لوحة المفاتيح الفارسية</translation>
 <translation id="2168725742002792683">إضافات الملف</translation>
 <translation id="2169062631698640254">تسجيل الدخول على أية حال</translation>
+<translation id="2175042898143291048">أجرِ ذلك دائمًا</translation>
 <translation id="2175607476662778685">شريط التشغيل السريع</translation>
 <translation id="2176045495080708525">يتم الآن تثبيت الإضافات التالية:</translation>
 <translation id="2177950615300672361">علامة تبويب التصفح المتخفي: <ph name="TAB_NAME" /></translation>
@@ -1933,7 +1936,6 @@
 <translation id="3688507211863392146">تحرير الملفات التي تفتحها في التطبيق</translation>
 <translation id="3688526734140524629">تغيير القناة</translation>
 <translation id="3688578402379768763">مُحَدّث</translation>
-<translation id="3690976161240450479">فشل تسجيل الدخول، يُرجى الاتصال بالمسؤول أو إعادة المحاولة.</translation>
 <translation id="3693415264595406141">كلمة المرور:</translation>
 <translation id="3694027410380121301">تحديد علامة التبويب السابقة</translation>
 <translation id="3694678678240097321">‏يطلب موافقة المستخدم على الإضافة التي تشغّل نصًّا برمجيًّا على الصفحة، في حالة ما إذا تطلبت الإضافة إذنًا لتعمل على كل عناوين url.</translation>
@@ -2226,6 +2228,7 @@
 <translation id="4116663294526079822">إلغاء الحظر دومًا على هذا الموقع</translation>
 <translation id="411666854932687641">ذاكرة خاصة</translation>
 <translation id="4118990158415604803">تم تعطيل الربط بالشبكات الأخرى من قبل مشرفك.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{وتطبيق آخر}zero{و# تطبيق آخر}two{وتطبيقان (#) آخران}few{و# تطبيقات أخرى}many{و# تطبيقًا آخر}other{و# تطبيق آخر}}</translation>
 <translation id="4119828560634133962">العروض الترويجية لتسجيل معاينة الطباعة</translation>
 <translation id="4120329147617730038">منع مشرف الدخول المتعدد لـ <ph name="USER_EMAIL" />.
 يجب على المستخدمين الخروج للمتابعة.</translation>
@@ -2365,9 +2368,11 @@
 <translation id="4345703751611431217">عدم توافق البرامج: مزيد من المعلومات</translation>
 <translation id="4348766275249686434">جمع الأخطاء</translation>
 <translation id="4350019051035968019">لا يمكن تسجيل هذا الجهاز في النطاق الذي ينتمي له حسابك نظرًا لأنه تم تصنيف الجهاز للعمل تحت إدارة نطاق آخر.</translation>
+<translation id="4354806558096370704">‏تمكين استخدام الواجهة الخلفية لنظام الطباعة CUPS الأصلي.</translation>
 <translation id="4358697938732213860">إضافة عنوان</translation>
 <translation id="4359408040881008151">تم التثبيت بسبب الإضافة (الإضافات) التابعة.</translation>
 <translation id="4361190688154226069">استهداف المستطيل في المشاهدات</translation>
+<translation id="4364414793200746179">‏إشعار نمط الوسائط لنظام التشغيل Android</translation>
 <translation id="4364444725319685468">تم تنزيل <ph name="FILE_NAME" /></translation>
 <translation id="4364567974334641491">يشارك <ph name="APP_NAME" /> نافذة.</translation>
 <translation id="4364830672918311045">عرض الإشعارات</translation>
@@ -2770,6 +2775,7 @@
 <translation id="4988792151665380515">أخفق تصدير المفتاح العام.</translation>
 <translation id="49896407730300355">تدوير ع&amp;كس اتجاه عقارب الساعة</translation>
 <translation id="4989966318180235467">فحص &amp;صفحة الخلفية</translation>
+<translation id="4990343175649730969">‏تنزيل أداة إزالة البرامج من Chrome</translation>
 <translation id="4991420928586866460">معالجة مفاتيح الصف العلوي باعتبارها مفاتيح الوظائف</translation>
 <translation id="499165176004408815">استخدام وضع التباين العالي</translation>
 <translation id="4992066212339426712">إعادة الصوت</translation>
@@ -3292,6 +3298,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: حدد للتعديل</translation>
 <translation id="5741454054957165976">‏تمكين الإصدار الجديد المتاح من تحميل تدخل وكيل المستخدم لـ WebFonts.</translation>
 <translation id="574392208103952083">متوسط</translation>
+<translation id="5744368829843057748">Translate 2016Q2 UI</translation>
 <translation id="5745056705311424885">‏اكتشاف رقاقة ذاكرة USB</translation>
 <translation id="5746169159649715125">‏حفظ بتنسيق ملف PDF</translation>
 <translation id="5747611503456050045">إعادة تحميلات الصفحة الناجمة عن محتوى التمرير لأسفل رأسيًا.</translation>
@@ -3399,6 +3406,7 @@
 <translation id="5884474295213649357">‏علامة التبويب هذه متصلة بجهاز USB.</translation>
 <translation id="5885324376209859881">إدارة إعدادات الوسائط...</translation>
 <translation id="5889282057229379085">‏أقصى عدد من المراجع المصدقة المتوسطة (CA): <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">أخبرنا بما يحدث.</translation>
 <translation id="5892290200158927959">‏لوحة مفاتيح BÉPO الفرنسية</translation>
 <translation id="5892507820957994680">لتجاوز قائمة عرض البرامج المضمنة وتمكين التسارع عبر وحدة معالجة الرسومات في تهيئات غير متوافقة.</translation>
 <translation id="5895138241574237353">إعادة التشغيل</translation>
@@ -3540,6 +3548,7 @@
 <translation id="6122093587541546701">البريد الإلكتروني (اختياري):</translation>
 <translation id="6122875415561139701">لا يُسمح بعملية الكتابة على: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="6124650939968185064">تعتمد الإضافات التالية على هذه الإضافة:</translation>
+<translation id="6127945163801765632">تمكين قسم "كل الإشارات" في مدير الإشارات.</translation>
 <translation id="6129938384427316298">‏التعليق على شهادة Netscape</translation>
 <translation id="6129953537138746214">مسافة</translation>
 <translation id="6132383530370527946">اتفاقية المستخدم</translation>
@@ -3567,6 +3576,7 @@
 إزالة هذا المستخدم الذي يخضع للإشراف. وقد تظل مواقع الويب التي تم الانتقال إليها والإعدادات التابعة للمستخدم الذي يخضع للإشراف مرئية للمدير على <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">مزيد من المعلومات</translation>
 <translation id="6166185671393271715">‏استيراد كلمات المرور إلى Chrome</translation>
+<translation id="6169666352732958425">تعذر إرسال سطح المكتب.</translation>
 <translation id="6171550060231646388">‏أجهزة تمت محاكاتها لميزات "Ok Google"</translation>
 <translation id="6175314957787328458">‏المعرّف الفريد العمومي لنطاق Microsoft</translation>
 <translation id="6178664161104547336">تحديد شهادة</translation>
@@ -3760,6 +3770,7 @@
 <translation id="6458308652667395253">إدارة منع تشغيل جافا سكريبت...</translation>
 <translation id="6459488832681039634">استخدام التحديد للبحث</translation>
 <translation id="6460423884798879930">‏يمكنك تمكين هذا الخيار لإرسال معلومات مصادقة إضافية في حزمة SYN الأولية لعميل متصل سابقًا، مما يتيح بدء أسرع لإرسال البيانات.</translation>
+<translation id="6460474910028274178">‏مظهر ومنطق تشغيل محسّنان لـ Translate Bubble UI</translation>
 <translation id="6460601847208524483">البحث عن التالي</translation>
 <translation id="6462080265650314920">يجب تقديم التطبيقات باستخدام نوع المحتوى "<ph name="CONTENT_TYPE" />".</translation>
 <translation id="6462082050341971451">هل ما زلت هناك؟</translation>
@@ -3889,6 +3900,7 @@
 <translation id="6663792236418322902">ستكون كلمة المرور التي تختارها مطلوبة لاستعادة هذا الملف لاحقًا.  الرجاء تسجيلها في مكان آمن.</translation>
 <translation id="6664237456442406323">‏للأسف، تمت تهيئة جهاز الكمبيوتر باستخدام معرف جهاز غير صحيح. وهذا يمنع تحديث نظام التشغيل Chrome بأحدث إصلاحات الأمان، وقد يكون جهاز الكمبيوتر <ph name="BEGIN_BOLD" />عرضة للهجمات الضارة<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">‏باستخدام حساب Google</translation>
+<translation id="667517062706956822">‏هل تريد أن يترجم Google هذه الصفحة من <ph name="SOURCE_LANGUAGE" /> إلى <ph name="TARGET_LANGUAGE" />؟</translation>
 <translation id="6675665718701918026">الإشارة إلى الأجهزة المتصلة</translation>
 <translation id="6677037229676347494">المعرف المتوقع "<ph name="EXPECTED_ID" />"، ولكن المعرف كان "<ph name="NEW_ID" />".</translation>
 <translation id="6680028776254050810">التبديل بين المستخدمين</translation>
@@ -3940,6 +3952,7 @@
 <translation id="6746392203843147041">رفع الصوت</translation>
 <translation id="6748140994595080445">تغيير كيفية معالجة <ph name="APP_NAME" /> للغات وعرضه لها.</translation>
 <translation id="6748465660675848252">يمكنك المتابعة، ولكن لن تتم استعادة إلا البيانات والإعدادات المتزامنة فقط. وسيتم فقد جميع البيانات المحلية.</translation>
+<translation id="6751256176799620176">تم تحديد مجلد واحد</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (التصفح المتخفي)</translation>
 <translation id="6759193508432371551">إعادة تعيين إعدادات المصنع</translation>
 <translation id="6760765581316020278">‏لوحة المفاتيح الفيتنامية (VNI)</translation>
@@ -4581,6 +4594,7 @@
 <translation id="7717014941119698257">تنزيل: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">انتهاء وقت التدريب</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262">‏للإشراف على هذا الشخص، <ph name="BEGIN_LINK" />سجّل الدخول إلى Chrome<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">قص</translation>
 <translation id="7730449930968088409">التقاط محتوى الشاشة</translation>
 <translation id="7730494089396812859">عرض تفاصيل النسخ الاحتياطي عبر السحاب</translation>
@@ -4674,7 +4688,6 @@
 <translation id="7859704718976024901">سجل التصفح</translation>
 <translation id="7861215335140947162">ال&amp;تنزيلات</translation>
 <translation id="7864539943188674973">تعطيل البلوتوث</translation>
-<translation id="7868891395842935202">تُمكن إطار العمل التجريبي للتحكُّم في الدخول إلى تجارب واجهة برمجة التطبيقات.</translation>
 <translation id="7870576007982733437">استخدم مدير تنزيل النظام عندما يكون ذلك مناسبًا.</translation>
 <translation id="7870790288828963061">‏لا توجد إصدارات أحدث لتطبيق Kiosk. لا يوجد شيء لتحديثه. يُرجى إزالة جهاز USB.</translation>
 <translation id="787150342916295244">المسح الضوئي لبطاقة الائتمان</translation>
@@ -5004,7 +5017,6 @@
 <translation id="8309505303672555187">حدّد شبكة:</translation>
 <translation id="8312871300878166382">لصق في مجلد</translation>
 <translation id="8314013494437618358">إنشاء سلسلة رسائل</translation>
-<translation id="8314576811984836978">إطار العمل التجريبي.</translation>
 <translation id="8319414634934645341">استخدام المفتاح الموسع</translation>
 <translation id="8322814362483282060">تم حظر دخول هذه الصفحة إلى الميكروفون التابع لك.</translation>
 <translation id="8326478304147373412">‏PKCS #7، سلسلة شهادات</translation>
@@ -5065,7 +5077,6 @@
 <translation id="8418240940464873056">وضع الحروف الصينية</translation>
 <translation id="8418445294933751433">&amp;العرض في علامة تبويب</translation>
 <translation id="8420060421540670057">‏عرض ملفات مستندات Google</translation>
-<translation id="8420728540268437431">تجري ترجمة هذه الصفحة ...</translation>
 <translation id="842274098655511832">‏إضافات مسودة WebGL</translation>
 <translation id="8424039430705546751">لأسفل</translation>
 <translation id="8425213833346101688">تغيير</translation>
@@ -5252,6 +5263,7 @@
 <translation id="8690754533598178758">‏يستخدم ميكروفون Adobe Flash Player استثناءات مختلفة.</translation>
 <translation id="8691686986795184760">(تمكّنه حاليًا سياسة المؤسسة)</translation>
 <translation id="869257642790614972">إعادة فتح آخر علامة تبويب تم إغلاقها</translation>
+<translation id="8695770993395462321">‏CUPS الأصلي</translation>
 <translation id="8695825812785969222">فتح ال&amp;موقع...</translation>
 <translation id="8698464937041809063">‏رسم Google</translation>
 <translation id="869884720829132584">قائمة التطبيقات</translation>
@@ -5594,6 +5606,7 @@
 <translation id="9189690067274055051">ألغ قفل هاتفك وقرِّبه من جهاز <ph name="DEVICE_TYPE" /> للدخول.</translation>
 <translation id="9190063653747922532">‏L2TP/IPSec + المفتاح المشترك مسبقًا</translation>
 <translation id="9201305942933582053">‏Google Now لـ Chrome!</translation>
+<translation id="9202646163273566462">تمكين "عرض كل الإشارات" كوجهة افتراضية لمدير الإشارات.</translation>
 <translation id="9203398526606335860">&amp;التوصيف ممكّن</translation>
 <translation id="9203478404496196495">إلغاء تجاهل علامة التبويب</translation>
 <translation id="9203962528777363226">عطل مشرف هذا الجهاز إمكانية إضافة مستخدمين جدد.</translation>
@@ -5620,6 +5633,7 @@
 <translation id="939736085109172342">مجلد جديد</translation>
 <translation id="940425055435005472">حجم الخط:</translation>
 <translation id="941543339607623937">المفتاح الخاص غير صالح.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{لا شيء}=1{تطبيق واحد ($1)}=2{تطبيقان (2) ($1, $2)}few{# تطبيقات ($1, $2, $3)}many{# تطبيقًا ($1, $2, $3)}other{# تطبيق ($1, $2, $3)}}</translation>
 <translation id="942532530371314860">‏يشارك <ph name="APP_NAME" /> علامة تبويب متصفح Chrome والصوت.</translation>
 <translation id="942954117721265519">لا تتوفر أية صور في هذا الدليل.</translation>
 <translation id="945522503751344254">إرسال تعليقات</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index b8004e4..09a6a8e 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608">Разширението <ph name="EXTENSION_NAME" /> (с идентификационен номер „<ph name="EXTENSION_ID" />“) не е разрешено в този тип сесия.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Олеле! Генерирането на произволен RSA личен ключ не бе успешно.</translation>
+<translation id="1421115928968836111">Така ще отмените упълномощаването на лицензите на Flash Player за защитено съдържание.</translation>
 <translation id="1425734930786274278">Следните „бисквитки“ бяха блокирани („бисквитките“ на трети страни се блокират без изключение):</translation>
 <translation id="1426410128494586442">Да</translation>
 <translation id="1427049173708736891">Поддържайте своя <ph name="DEVICE_TYPE" /> отключен, когато телефонът ви с Android е наблизо и е отключен – няма нужда да въвеждате паролата си.</translation>
@@ -518,6 +519,7 @@
 <translation id="1707463636381878959">Тази мрежа да се споделя с други потребители</translation>
 <translation id="1708199901407471282">При отваряне на предложена уеб страница от нов раздел в браузъра ще се превключва към вече отворения раздел за предложението, ако има такъв, вместо то да се зарежда в новия раздел.</translation>
 <translation id="1708338024780164500">(Неактивно)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (идент. №: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Компресирането не бе успешно. Неочаквана грешка: $1</translation>
 <translation id="1715941336038158809">Невалидно потребителско име или парола.</translation>
 <translation id="1717733954209022288">Квадратче за отметка за запазване на картите от Google Payments</translation>
@@ -794,6 +796,7 @@
 <translation id="2168214441502403371">Персийска клавиатура</translation>
 <translation id="2168725742002792683">Разширения на файловете</translation>
 <translation id="2169062631698640254">Влизане въпреки това</translation>
+<translation id="2175042898143291048">Превеждане винаги</translation>
 <translation id="2175607476662778685">Лента за бързо стартиране</translation>
 <translation id="2176045495080708525">Следните разширения вече са инсталирани:</translation>
 <translation id="2177950615300672361">Раздел в режим „инкогнито“: <ph name="TAB_NAME" /></translation>
@@ -1932,7 +1935,6 @@
 <translation id="3688507211863392146">Запис във файлове и папки, които сте отворили в приложението</translation>
 <translation id="3688526734140524629">Промяна на канала</translation>
 <translation id="3688578402379768763">Актуално</translation>
-<translation id="3690976161240450479">Влизането не бе успешно. Моля, свържете се с администратора си или опитайте отново.</translation>
 <translation id="3693415264595406141">Парола:</translation>
 <translation id="3694027410380121301">Избор на предишния раздел</translation>
 <translation id="3694678678240097321">Изисква съгласието на потребителя за изпълняване на скрипт от разширение, ако то е поискало разрешение да работи на всички URL адреси.</translation>
@@ -2228,6 +2230,7 @@
 <translation id="4116663294526079822">Разрешаване винаги на този сайт</translation>
 <translation id="411666854932687641">Лична памет</translation>
 <translation id="4118990158415604803">Връзката с други мрежи е деактивирана от администратора ви.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{и още 1}other{и още #}}</translation>
 <translation id="4119828560634133962">Подканящи съобщения за регистриране във визуализацията за печат</translation>
 <translation id="4120329147617730038">Администратор е деактивирал централизирания вход за <ph name="USER_EMAIL" />.
 За да се продължи, всички потребители трябва да излязат.</translation>
@@ -2367,9 +2370,11 @@
 <translation id="4345703751611431217">Софтуерна несъвместимост: Научете повече</translation>
 <translation id="4348766275249686434">Събиране на грешките</translation>
 <translation id="4350019051035968019">Това устройство не може да бъде регистрирано в домейна, към който принадлежи профилът ви, защото е означено за управление от друг домейн.</translation>
+<translation id="4354806558096370704">Активира използването на задния слой за отпечатване със стандартната система CUPS.</translation>
 <translation id="4358697938732213860">Добавяне на адрес</translation>
 <translation id="4359408040881008151">Инсталирано заради зависимо разширение или съответно разширения.</translation>
 <translation id="4361190688154226069">Основано на правоъгълник насочване в изгледите</translation>
+<translation id="4364414793200746179">Известия с MediaStyle на Android</translation>
 <translation id="4364444725319685468">„<ph name="FILE_NAME" />“ се изтегли</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> споделя прозорец.</translation>
 <translation id="4364830672918311045">Показване на известия</translation>
@@ -2772,6 +2777,7 @@
 <translation id="4988792151665380515">Експортирането на публичен ключ не бе успешно.</translation>
 <translation id="49896407730300355">Завъртане о&amp;братно на часовниковата стрелка</translation>
 <translation id="4989966318180235467">Инспектиране на &amp;фоновата страница</translation>
+<translation id="4990343175649730969">Изтегляне на инструмента за почистване на Chrome</translation>
 <translation id="4991420928586866460">Третиране на клавишите от най-горния ред като функционални</translation>
 <translation id="499165176004408815">Използване на режима на висок контраст</translation>
 <translation id="4992066212339426712">Включване на звука</translation>
@@ -3296,6 +3302,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: Изберете, за да редактирате</translation>
 <translation id="5741454054957165976">Активирайте новата версия на функцията за намеса на потребителския агент при зареждане на уеб шрифтове.</translation>
 <translation id="574392208103952083">Среден</translation>
+<translation id="5744368829843057748">Потребителски интерфейс на Преводач от второто тримесечие на 2016 г.</translation>
 <translation id="5745056705311424885">Открита е USB памет</translation>
 <translation id="5746169159649715125">Запазване като PDF файл</translation>
 <translation id="5747611503456050045">Презарежданията на страница се задействат от продължаващо вертикално превъртане на съдържанието.</translation>
@@ -3403,6 +3410,7 @@
 <translation id="5884474295213649357">Този раздел е свързан с USB устройство.</translation>
 <translation id="5885324376209859881">Управление на настройките за медия...</translation>
 <translation id="5889282057229379085">Максимален брой междинни сертифициращи органи: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Кажете ни какво се случва.</translation>
 <translation id="5892290200158927959">Френска (BÉPO) клавиатура</translation>
 <translation id="5892507820957994680">Отменя вградения списък за софтуерно изобразяване и активира графичното ускорение на неподдържаните системни конфигурации.</translation>
 <translation id="5895138241574237353">Рестартиране</translation>
@@ -3544,6 +3552,7 @@
 <translation id="6122093587541546701">Имейл адрес (по избор):</translation>
 <translation id="6122875415561139701">Операцията за запис не е разрешена на: <ph name="DEVICE_NAME" />.</translation>
 <translation id="6124650939968185064">От това разширение зависят следните разширения:</translation>
+<translation id="6127945163801765632">Активиране на секцията „Всички отметки“ в диспечера на отметките.</translation>
 <translation id="6129938384427316298">Коментар на сертификат на Netscape</translation>
 <translation id="6129953537138746214">Интервал</translation>
 <translation id="6132383530370527946">Дребният шрифт</translation>
@@ -3570,6 +3579,7 @@
 <translation id="6164005077879661055">Всички файлове и локални данни, свързани с контролирания потребител, ще бъдат изтрити за постоянно, щом той бъде премахнат. Посетените уебсайтове и настройките за него може все още да се виждат от мениджъра на адрес <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Научете повече</translation>
 <translation id="6166185671393271715">Импортиране на пароли в Chrome</translation>
+<translation id="6169666352732958425">Предаването на работния плот не е възможно.</translation>
 <translation id="6171550060231646388">Симулирани хардуерни функции за „Ok Google“</translation>
 <translation id="6175314957787328458">GUID на домейн от Microsoft</translation>
 <translation id="6178664161104547336">Избор на сертификат</translation>
@@ -3763,6 +3773,7 @@
 <translation id="6458308652667395253">Управление на блокирането на JavaScript...</translation>
 <translation id="6459488832681039634">Използване на избраното за търсене</translation>
 <translation id="6460423884798879930">Активирайте опцията, с чиято помощ в първоначалния SYN пакет за клиентска програма, с която вече е установена връзка, се изпраща допълнителна информация за удостоверяване. Така изпращането на данни ще започва по-бързо.</translation>
+<translation id="6460474910028274178">Подобрения в логиката на задействане и облика на потребителския интерфейс на балончето на Преводач</translation>
 <translation id="6460601847208524483">Търсене на следващото</translation>
 <translation id="6462080265650314920">Приложенията трябва да се показват с тип съдържание „<ph name="CONTENT_TYPE" />“.</translation>
 <translation id="6462082050341971451">Там ли сте още?</translation>
@@ -3892,6 +3903,7 @@
 <translation id="6663792236418322902">Паролата, която изберете, ще се изисква за възстановяване на файла по-късно.  Моля, запишете я на сигурно място.</translation>
 <translation id="6664237456442406323">За съжаление компютърът ви е конфигуриран с неправилно образуван идентификационен номер на хардуера. Това не позволява на Chrome OS да се актуализира с най-новите корекции за сигурност и машината ви <ph name="BEGIN_BOLD" />може да е уязвима към злонамерени атаки<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">с профила си в Google</translation>
+<translation id="667517062706956822">Искате ли Google да преведе тази страница от <ph name="SOURCE_LANGUAGE" /> на <ph name="TARGET_LANGUAGE" />?</translation>
 <translation id="6675665718701918026">Свързано е посочващо устройство</translation>
 <translation id="6677037229676347494">Очакваният идентификационен номер е „<ph name="EXPECTED_ID" />“, но той бе „<ph name="NEW_ID" />“.</translation>
 <translation id="6680028776254050810">Превключване на потребителите</translation>
@@ -3943,6 +3955,7 @@
 <translation id="6746392203843147041">сила на звука: увел.</translation>
 <translation id="6748140994595080445">Промяна на начина, по който <ph name="APP_NAME" /> обработва и показва езиците.</translation>
 <translation id="6748465660675848252">Може да продължите, но само синхронизираните ви данни и настройки ще бъдат възстановени. Цялата локална информация ще бъде заличена.</translation>
+<translation id="6751256176799620176">Избрахте 1 папка</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Инкогнито)</translation>
 <translation id="6759193508432371551">Възстановяване на фабричните настройки</translation>
 <translation id="6760765581316020278">Виетнамска клавиатура (VNI)</translation>
@@ -4581,6 +4594,7 @@
 <translation id="7717014941119698257">Изтегля се: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">Времето за изчакване на обучението изтече</translation>
 <translation id="771953673318695590">КК</translation>
+<translation id="7720375555307821262"><ph name="BEGIN_LINK" />Влезте в Chrome<ph name="END_LINK" />, за да контролирате сърфирането на този човек.</translation>
 <translation id="7724603315864178912">Изрязване</translation>
 <translation id="7730449930968088409">Заснемане на съдържанието на екрана ви</translation>
 <translation id="7730494089396812859">Показване на подробностите за резервните копия в облака</translation>
@@ -4674,7 +4688,6 @@
 <translation id="7859704718976024901">История на сърфирането</translation>
 <translation id="7861215335140947162">&amp;За изтегляне</translation>
 <translation id="7864539943188674973">Деактивиране на Bluetooth</translation>
-<translation id="7868891395842935202">Активира експерименталната рамка за контролиране на достъпа до експериментите с приложни програмни интерфейси (API).</translation>
 <translation id="7870576007982733437">Използване на системния мениджър на изтеглянията, когато е приложимо.</translation>
 <translation id="7870790288828963061">Няма намерени павилионни приложения с по-нова версия. Няма нищо за актуализиране. Моля, извадете USB паметта.</translation>
 <translation id="787150342916295244">Сканиране на кредитни карти</translation>
@@ -5004,7 +5017,6 @@
 <translation id="8309505303672555187">Изберете мрежа:</translation>
 <translation id="8312871300878166382">Поставяне в папка</translation>
 <translation id="8314013494437618358">Изграждане чрез нишка</translation>
-<translation id="8314576811984836978">Експериментална рамка.</translation>
 <translation id="8319414634934645341">Удължена употреба на ключа</translation>
 <translation id="8322814362483282060">Достъпът на тази страница до микрофона ви е блокиран.</translation>
 <translation id="8326478304147373412">PKCS 7, верига сертификати</translation>
@@ -5065,7 +5077,6 @@
 <translation id="8418240940464873056">режим за ханджа</translation>
 <translation id="8418445294933751433">&amp;Показване като раздел</translation>
 <translation id="8420060421540670057">Показване на файлове от Google Документи</translation>
-<translation id="8420728540268437431">Тази страница се превежда...</translation>
 <translation id="842274098655511832">Чернови разширения на WebGL</translation>
 <translation id="8424039430705546751">надолу</translation>
 <translation id="8425213833346101688">Промяна</translation>
@@ -5252,6 +5263,7 @@
 <translation id="8690754533598178758">Изключенията за микрофона за Adobe Flash Player са различни.</translation>
 <translation id="8691686986795184760">(Активирано съгласно корпоративно правило)</translation>
 <translation id="869257642790614972">Повторно отваряне на последно затворения раздел</translation>
+<translation id="8695770993395462321">Стандартна система CUPS</translation>
 <translation id="8695825812785969222">Отваряне на &amp;местоположение...</translation>
 <translation id="8698464937041809063">Рисунка в Google</translation>
 <translation id="869884720829132584">Меню „Applications“</translation>
@@ -5594,6 +5606,7 @@
 <translation id="9189690067274055051">Отключете телефона си и го приближете до своя <ph name="DEVICE_TYPE" />, за да влезете.</translation>
 <translation id="9190063653747922532">L2TP/IPSec с предварително споделен ключ</translation>
 <translation id="9201305942933582053">Google Now за Chrome!</translation>
+<translation id="9202646163273566462">Задава изгледа с всички отметки като стандартен за диспечера на отметките.</translation>
 <translation id="9203398526606335860">&amp;Профилирането е активирано</translation>
 <translation id="9203478404496196495">Включване отново на звука на раздела</translation>
 <translation id="9203962528777363226">Администраторът на това устройство е деактивирал добавянето на нови потребители</translation>
@@ -5620,6 +5633,7 @@
 <translation id="939736085109172342">Нова папка</translation>
 <translation id="940425055435005472">Размер на шрифта:</translation>
 <translation id="941543339607623937">Невалиден личен ключ.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{няма}=1{1 приложение ($1)}=2{2 приложения ($1, $2)}other{# приложения ($1, $2, $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> споделя раздел в Chrome и звук.</translation>
 <translation id="942954117721265519">Няма изображения в тази директория.</translation>
 <translation id="945522503751344254">Изпращане на отзиви</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index 8f09d364f5..62f0c5c 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (এক্সটেনশান ID " <ph name="EXTENSION_ID" /> ") এই ধরনের সেশনে অনুমোদিত নয়৷</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">এ বাবা! র‌্যান্ডম RSA ব্যক্তিগত কী জেনারেট করতে ব্যর্থ৷</translation>
+<translation id="1421115928968836111">এটা সুরক্ষিত সামগ্রীর জন্য Flash Player লাইসেন্সগুলির অনুমোদন ফিরিয়ে নেবে।</translation>
 <translation id="1425734930786274278">নিম্নোক্ত কুকিগুলি অবরুদ্ধ আছে (প্রত্যাশা ছাড়াই তৃতীয়-পক্ষ কুকিগুলি অবরুদ্ধ হচ্ছে):</translation>
 <translation id="1426410128494586442">হ্যাঁ</translation>
 <translation id="1427049173708736891">আপনার Android ফোন আনলক এবং আশেপাশে থাকাকালীন আপনার  <ph name="DEVICE_TYPE" /> আনলক করে রাখুন-আপনার পাসওয়ার্ড টাইপ করার দরকার নেই৷</translation>
@@ -521,6 +522,7 @@
 <translation id="1707463636381878959">অন্য ব্যবহারকারীদের সাথে এই নেটওয়ার্ক শেয়ার করুন</translation>
 <translation id="1708199901407471282">নতুন ট্যাব পৃষ্ঠা থেকে একটি প্রস্তাবিত ওয়েবপৃষ্ঠা খোলার সময় যদি প্রস্তাবটির জন্য ইতোমধ্যে একটি ট্যাব খোলা থাকে, তাহলে নতুন ট্যাবে প্রস্তাবটি খোলার পরিবর্তে যেটি খোলা আছে সেটিতে চলে যায়।</translation>
 <translation id="1708338024780164500">(নিষ্ক্রিয়)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (আইডি: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">জিপ করা ব্যর্থ হয়েছে, অপ্রত্যাশিত ত্রুটি: $1</translation>
 <translation id="1715941336038158809">অবৈধ ব্যবহারকারী নাম বা পাসওয়ার্ড৷</translation>
 <translation id="1717733954209022288">Google Payments কার্ড সংরক্ষণের চেকবাক্স</translation>
@@ -797,6 +799,7 @@
 <translation id="2168214441502403371">ফার্সি কীবোর্ড</translation>
 <translation id="2168725742002792683">ফাইল এক্সটেনশস </translation>
 <translation id="2169062631698640254">যেকোনো প্রকারে সাইন ইন করুন</translation>
+<translation id="2175042898143291048">সর্বদা এটিই করুন</translation>
 <translation id="2175607476662778685">দ্রুত প্রবর্তন দণ্ড</translation>
 <translation id="2176045495080708525">নিম্নলিখিত এক্সটেনশান এখন ইনস্টল হয়েছে:</translation>
 <translation id="2177950615300672361">ছদ্মবেশী ট্যাব: <ph name="TAB_NAME" /></translation>
@@ -1930,7 +1933,6 @@
 <translation id="3688507211863392146">আপনি অ্যাপ্লিকেশানটিতে খোলেন এমন ফাইল এবং ফোল্ডারগুলি লিখুন</translation>
 <translation id="3688526734140524629">চ্যানেল পরিবর্তন করুন</translation>
 <translation id="3688578402379768763">আপ-টু-ডেট</translation>
-<translation id="3690976161240450479">সাইন ইন ব্যর্থ হয়েছে। দয়া করে আপনার প্রশাসকের সাথে যোগাযোগ করুন অথবা আবার চেষ্টা করুন।</translation>
 <translation id="3693415264595406141">পাসওয়ার্ড:</translation>
 <translation id="3694027410380121301">পূর্ববর্তী ট্যাব নির্বাচন করুন</translation>
 <translation id="3694678678240097321">যদি এক্সটেনশনটি সমস্ত url এ চলার জন্য অনুমতির অনুরোধ করে, তাহলে কোনো এক্সটেনশানের জন্য পৃষ্ঠাটিতে একটি স্ক্রিপ্ট চালাতে ব্যবহারকারীর সম্মতির প্রয়োজন হয়৷</translation>
@@ -2225,6 +2227,7 @@
 <translation id="4116663294526079822">এই সাইটে সর্বদা মঞ্জুরি দিন</translation>
 <translation id="411666854932687641">ব্যক্তিগত স্মৃতি</translation>
 <translation id="4118990158415604803">অন্যান্য নেটওয়ার্কে সংযোগ স্থাপন আপনার প্রশাসক দ্বারা অক্ষম করা হয়েছে।</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{এবং আরো ১টি}one{এবং আরো #টি}other{এবং আরো #টি}}</translation>
 <translation id="4119828560634133962">প্রিন্ট পূর্বরূপ নিবন্ধীকরণ প্রচারগুলি</translation>
 <translation id="4120329147617730038">একজন প্রশাসক <ph name="USER_EMAIL" /> এর জন্য একাধিক সাইন ইন অননুমোদিত করেছে।
 চালিয়ে যেতে সমস্ত ব্যবহারকারীদের সাইন আউট করা আবশ্যক।</translation>
@@ -2363,9 +2366,11 @@
 <translation id="4345703751611431217">সফ্টওয়্যার অসামঞ্জস্যতা: আরো জানুন</translation>
 <translation id="4348766275249686434">ত্রুটিগুলি সংগ্রহ</translation>
 <translation id="4350019051035968019">এই ডিভাইসটি একটি ভিন্ন ডোমেনের দ্বারা পরিচালনার জন্য চিহ্নিত হওয়ায় আপনার অ্যাকাউন্টটি যে ডোমেনের আওতায় রয়েছে তাতে নথিভুক্ত করা যাবে না৷</translation>
+<translation id="4354806558096370704">ব্যাকএন্ডে নেটিভ CUPS মুদ্রণের ব্যবহার সক্ষম করে।</translation>
 <translation id="4358697938732213860">একটি ঠিকানা যুক্ত করুন</translation>
 <translation id="4359408040881008151">নির্ভরশীল এক্সটেনশান(গুলি) হওয়ার কারণে ইনস্টল রয়েছে৷</translation>
 <translation id="4361190688154226069">দর্শনগুলিতে আয়তক্ষেত্র-ভিত্তিক টার্গেট</translation>
+<translation id="4364414793200746179">Android মিডিয়া-শৈলী বিজ্ঞপ্তি</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> ডাউনলোড করা হয়েছে</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> একটি উইন্ডো শেয়ার করছে।</translation>
 <translation id="4364830672918311045">বিজ্ঞপ্তিগুলি প্রদর্শন করুন</translation>
@@ -2767,6 +2772,7 @@
 <translation id="4988792151665380515">ব্যক্তিগত কী-টি রপ্তানি করতে ব্যর্থ৷</translation>
 <translation id="49896407730300355">ঘড়ির কাঁটার &amp;বিপরীত দিকে ঘোরান</translation>
 <translation id="4989966318180235467">&amp;পশ্চাদপট পৃষ্ঠা পরিদর্শন করুন</translation>
+<translation id="4990343175649730969">Chrome পরিষ্কারের সরঞ্জাম ডাউনলোড করুন</translation>
 <translation id="4991420928586866460">উপরের-সারির কীগুলিকে ফাংশন কী হিসেবে ব্যবহার করুন</translation>
 <translation id="499165176004408815">উচ্চ কনট্রাস্ট মোড ব্যবহার করুন</translation>
 <translation id="4992066212339426712">সশব্দ করুন</translation>
@@ -3290,6 +3296,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: সম্পাদনার জন্য নির্বাচন করুন</translation>
 <translation id="5741454054957165976">WebFonts লোডিংয়ের জন্য ব্যবহারকারি-এজেন্টের হস্তক্ষেপের নতুন সংস্করণ সক্ষম করে</translation>
 <translation id="574392208103952083">মাঝারি</translation>
+<translation id="5744368829843057748">অনুবাদ 2016Q2 UI</translation>
 <translation id="5745056705311424885">USB মেমরি স্টিক সনাক্ত হয়েছে</translation>
 <translation id="5746169159649715125">PDF রূপে সংরক্ষণ করুন</translation>
 <translation id="5747611503456050045">সামগ্রীকে উল্লম্ব অবস্থায় অবিচ্ছিন্নভাবে রেখে পৃষ্ঠা পুনরায় লোড করে৷</translation>
@@ -3397,6 +3404,7 @@
 <translation id="5884474295213649357">এই ট্যাব একটি USB ডিভাইসের সাথে সংযুক্ত করা আছে।</translation>
 <translation id="5885324376209859881">মিডিয়া সেটিংস পরিচালনা করুন...</translation>
 <translation id="5889282057229379085">ইন্টারমিডিয়েট CAগুলির সর্বাধিক সংখ্যা: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">কী ঘটছে তা আমাদের বলুন।</translation>
 <translation id="5892290200158927959">ফরাসি BÉPO কীবোর্ড</translation>
 <translation id="5892507820957994680">বিল্ট-ইন সফ্টওয়্যার উপস্থাপন তালিকা ওভাররাইড করে ও অসমর্থিত সিস্টেম কনফিগারেশনে GPU-ত্বরণ সক্ষম করে৷</translation>
 <translation id="5895138241574237353">পুনর্সূচনা</translation>
@@ -3538,6 +3546,7 @@
 <translation id="6122093587541546701">ইমেল (ঐচ্ছিক):</translation>
 <translation id="6122875415561139701">"<ph name="DEVICE_NAME" />" এ লেখার ক্রিয়াকলাপ অনুমোদিত নয়।</translation>
 <translation id="6124650939968185064">নিম্নলিখিত এক্সটেনশানগুলি এই এক্সটেনশানটির উপর নির্ভর করে:</translation>
+<translation id="6127945163801765632">বুকমার্ক পরিচালকে "সমস্ত বুকমার্ক" বিভাগ সক্ষম করে।</translation>
 <translation id="6129938384427316298">Netscape শংসাপত্র মন্তব্য</translation>
 <translation id="6129953537138746214">ব্যবধান</translation>
 <translation id="6132383530370527946">ছোট প্রিন্ট</translation>
@@ -3565,6 +3574,7 @@
 স্থানীয় ডেটা স্থায়ীভাবে মুছে ফেলা হবে৷ এই তত্ত্বাবধানে থাকা ব্যবহারকারীর জন্য পরিদর্শিত এবং সেটিংস <ph name="MANAGEMENT_URL" /> এ পরিচালকের কাছে এখনো দৃশ্যমান হতে পারে৷</translation>
 <translation id="6165508094623778733">আরো জানুন</translation>
 <translation id="6166185671393271715">Chrome এ পাসওয়ার্ড আমদানি করুন</translation>
+<translation id="6169666352732958425">ডেস্কটপ কাস্ট করতে ব্যর্থ হয়েছে।</translation>
 <translation id="6171550060231646388">সিমুলেটেড হার্ডওয়্যারের 'Ok Google' বৈশিষ্ট্যগুলি</translation>
 <translation id="6175314957787328458">Microsoft Domain GUID</translation>
 <translation id="6178664161104547336">একটি শংসাপত্র নির্বাচন করুন</translation>
@@ -3757,6 +3767,7 @@
 <translation id="6458308652667395253">JavaScript ব্লক করা পরিচালনা করুন...</translation>
 <translation id="6459488832681039634">খোঁজার জন্য নির্বাচন ব্যবহার করুন</translation>
 <translation id="6460423884798879930">পূর্বে সংযুক্ত থাকা একটি ক্লায়েন্টের জন্য প্রারম্ভিক SYN প্যাকেটে অতিরিক্ত প্রমাণীকরণ তথ্য পাঠাতে বিকল্পটি সক্ষম করুন, মঞ্জুরিপ্রাপ্ত দ্রুততর ডেটা পাঠানো শুরু করা যাবে৷</translation>
+<translation id="6460474910028274178">অনুবাদ বুদবুদ UI এর জন্য উন্নত ট্রিগারিং যুক্তি ও চেহারা</translation>
 <translation id="6460601847208524483">পরবর্তী খুঁজুন</translation>
 <translation id="6462080265650314920">অ্যাপ্লিকেশনগুলি "<ph name="CONTENT_TYPE" />" সামগ্রী-প্রকার সহ সংরক্ষিত হওয়া উচিত৷</translation>
 <translation id="6462082050341971451">আপনি কি এখনও সেখানে আছেন?</translation>
@@ -3886,6 +3897,7 @@
 <translation id="6663792236418322902">আপনার চয়ন করা পাসওয়ার্ডটি এই ফাইলটিকে পরে পুনরুদ্ধার করার জন্য রক্ষণের কাজে লাগবে৷  দয়া করে এটিকে একটি সুরক্ষিত স্থানে রেকর্ড করুন৷</translation>
 <translation id="6664237456442406323">দুর্ভাগ্যবশত, আপনার কম্পিউটার একটি ত্রুটিপূর্ণ হার্ডওয়্যার ID এর মাধ্যমে কনফিগার করা হয়েছে৷ এটি Chrome OS কে সাম্প্রতিক সুরক্ষা সমাধানে আপডেট করা থেকে বিরত করেছে এবং আপনার কম্পিউটার <ph name="BEGIN_BOLD" />অনিষ্টকারী আক্রমণগুলির ফলে অরক্ষিত হতে পারে<ph name="END_BOLD" />৷</translation>
 <translation id="6666647326143344290">আপনার Google অ্যাকাউন্ট সহ</translation>
+<translation id="667517062706956822">আপনি কি চান যে Google এই পৃষ্ঠাটি <ph name="SOURCE_LANGUAGE" /> থেকে <ph name="TARGET_LANGUAGE" /> এ অনুবাদ করুক?</translation>
 <translation id="6675665718701918026">পয়েন্টিং ডিভাইস সংযুক্ত হয়েছে</translation>
 <translation id="6677037229676347494">প্রত্যাশিত ID "<ph name="EXPECTED_ID" />", কিন্তু ID হল "<ph name="NEW_ID" />"৷</translation>
 <translation id="6680028776254050810">ব্যবহারকারী স্যুইচ করুন</translation>
@@ -3939,6 +3951,7 @@
 <translation id="6746392203843147041">আওয়াজ বাড়ান</translation>
 <translation id="6748140994595080445"><ph name="APP_NAME" /> কীভাবে ভাষা পরিচালনা ও প্রদর্শন করে তা পরিবর্তন করুন৷</translation>
 <translation id="6748465660675848252">আপনি এগিয়ে যেতে পারেন, কিন্তু শুধুমাত্র আপনার সিঙ্ক হওয়া ডেটা এবং সেটিংস পুনরুদ্ধার করা হবে৷ সমস্ত স্থানীয় ডেটা হারিয়ে যাবে৷</translation>
+<translation id="6751256176799620176">১টি ফোল্ডার নির্বাচন করা হয়েছে</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" />(ছদ্মবেশী)</translation>
 <translation id="6759193508432371551">ফ্যাক্টরি রিসেট</translation>
 <translation id="6760765581316020278">ভিয়েতনামি কীবোর্ড (VNI)</translation>
@@ -4576,6 +4589,7 @@
 <translation id="7717014941119698257">ডাউনলোড হচ্ছে: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">প্রশিক্ষণের সময় শেষ হয়েছে</translation>
 <translation id="771953673318695590">প্রশ্ন-উত্তর</translation>
+<translation id="7720375555307821262">এই ব্যক্তিকে তত্ত্বাবধান করার জন্য, <ph name="BEGIN_LINK" />Chrome এ সাইন ইন করুন<ph name="END_LINK" />।</translation>
 <translation id="7724603315864178912">কাটুন</translation>
 <translation id="7730449930968088409">আপনার স্ক্রীনের সামগ্রী ক্যাপচার করতে চায়</translation>
 <translation id="7730494089396812859">ক্লাউড ব্যাকআপের বিশদ বিবরণ দেখায়</translation>
@@ -4669,7 +4683,6 @@
 <translation id="7859704718976024901">ব্রাউজিং ইতিহাস</translation>
 <translation id="7861215335140947162">&amp;ডাউনলোডগুলি</translation>
 <translation id="7864539943188674973">ব্লুটুথ অক্ষম করুন</translation>
-<translation id="7868891395842935202">API পরীক্ষাগুলিতে অ্যাক্সেস নিয়ন্ত্রণের জন্য পরীক্ষামূলক ফ্রেমওয়ার্ক সক্ষম করে।</translation>
 <translation id="7870576007982733437">প্রযোজ্য হলে, সিস্টেম ডাউনলোড পরিচালক ব্যবহার করুন।</translation>
 <translation id="7870790288828963061">এর থেকে আরো নতুন সংস্করণের ওনো কিয়স্ক অ্যাপ্লিকেশান পাওয়া যায়নি৷ দয়া করে USB স্টিক সরান৷</translation>
 <translation id="787150342916295244">ক্রেডিট কার্ড স্ক্যান করা</translation>
@@ -5000,7 +5013,6 @@
 <translation id="8309505303672555187">একটি নেটওয়ার্ক নির্বাচন করুন:</translation>
 <translation id="8312871300878166382">ফোল্ডারের মধ্যে আটকে দিন</translation>
 <translation id="8314013494437618358">থ্রেডেড কম্পোজিটিং</translation>
-<translation id="8314576811984836978">পরীক্ষামূলক ফ্রেমওয়ার্ক।</translation>
 <translation id="8319414634934645341">প্রসারিত কী ব্যবহার</translation>
 <translation id="8322814362483282060">এই পৃষ্ঠাটিকে আপনার মাইক্রোফোন অ্যাক্সেস করা থেকে অবরুদ্ধ করা হয়েছে৷</translation>
 <translation id="8326478304147373412">PKCS #7, শংসাপত্র শৃঙ্খল</translation>
@@ -5061,7 +5073,6 @@
 <translation id="8418240940464873056">হাঞ্জা মোড</translation>
 <translation id="8418445294933751433">ট্যাব রূপে &amp;দেখান</translation>
 <translation id="8420060421540670057">Google দস্তাবেজ ফাইলগুলি দেখান</translation>
-<translation id="8420728540268437431">এই পৃষ্ঠাটি অনুবাদ করা হচ্ছে...</translation>
 <translation id="842274098655511832">WebGL খসড়া এক্সটেনশানগুলি</translation>
 <translation id="8424039430705546751">নীচে</translation>
 <translation id="8425213833346101688">পরিবর্তন</translation>
@@ -5248,6 +5259,7 @@
 <translation id="8690754533598178758">Adobe Flash Player মাইক্রোফোন ব্যতিক্রমগুলি ভিন্ন।</translation>
 <translation id="8691686986795184760">(এন্টারপ্রাইজ নীতি দ্বারা সক্ষমিত)</translation>
 <translation id="869257642790614972">শেষে বন্ধ হওয়া ট্যাবটি পুনরায় খুলুন</translation>
+<translation id="8695770993395462321">নেটিভ CUPS</translation>
 <translation id="8695825812785969222">Open &amp;Location...</translation>
 <translation id="8698464937041809063">Google অঙ্কন</translation>
 <translation id="869884720829132584">অ্যাপ্লিকেশনস মেনু</translation>
@@ -5590,6 +5602,7 @@
 <translation id="9189690067274055051">আপনার ফোন আনলক করুন এবং প্রবেশ করতে আপনার <ph name="DEVICE_TYPE" />-এর কাছাকাছি আনুন।</translation>
 <translation id="9190063653747922532">L2TP/IPসেকে + পূর্বে-শেয়ার করা কী</translation>
 <translation id="9201305942933582053">Chrome এর জন্য Google Now!</translation>
+<translation id="9202646163273566462">বুকমার্ক পরিচালকের ডিফল্ট গন্তব্য হিসেবে ‘সকল বুকমার্ক দৃশ্য’ সক্ষম করে।</translation>
 <translation id="9203398526606335860">&amp;প্রোফাইলিং সক্ষমিত</translation>
 <translation id="9203478404496196495">ট্যাব সশব্দ করুন</translation>
 <translation id="9203962528777363226">এই ডিভাইসের প্রশাসক নতুন ব্যবহারকারী জোড়া অক্ষম করেছে</translation>
@@ -5616,6 +5629,7 @@
 <translation id="939736085109172342">নতুন ফোল্ডার</translation>
 <translation id="940425055435005472">হরফের মাপ:</translation>
 <translation id="941543339607623937">অবৈধ ব্যক্তিগত কী৷</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{কিছুই নেই}=1{১টি অ্যাপ্লিকেশান ($1)}=2{২টি অ্যাপ্লিকেশান ($1, $2)}one{#টি অ্যাপ্লিকেশান ($1, $2, $3)}other{#টি অ্যাপ্লিকেশান ($1, $2, $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> একটি Chrome ট্যাব ও অডিও শেয়ার করছে।</translation>
 <translation id="942954117721265519">এই ডিরেক্টরিতে কোনো চিত্র নেই৷</translation>
 <translation id="945522503751344254">প্রতিক্রিয়া পাঠান</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index 3f5e872..9470171 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (amb identificador d'extensió "<ph name="EXTENSION_ID" />") no es permet en aquest tipus de sessions.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Error. No s'ha pogut generar la clau privada RSA aleatòria.</translation>
+<translation id="1421115928968836111">Amb aquesta acció es desautoritzaran les llicències de Flash Player per a contingut protegit.</translation>
 <translation id="1425734930786274278">S'han bloquejat les galetes següents (es bloquegen sempre totes les galetes de tercers):</translation>
 <translation id="1426410128494586442">Sí</translation>
 <translation id="1427049173708736891">Manteniu el dispositiu <ph name="DEVICE_TYPE" /> desbloquejat quan el telèfon Android estigui desbloquejat i a prop, sense haver d'escriure la contrasenya.</translation>
@@ -521,6 +522,7 @@
 <translation id="1707463636381878959">Comparteix aquesta xarxa amb altres usuaris</translation>
 <translation id="1708199901407471282">En obrir un suggeriment de pàgina web des de la pàgina Pestanya nova, si ja hi ha una pestanya oberta per al suggeriment, utilitza aquesta pestanya oberta en lloc de carregar el contingut a la pestanya nova.</translation>
 <translation id="1708338024780164500">(Inactiva)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (identificador: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">S'ha produït un error en la compressió; error inesperat: $1</translation>
 <translation id="1715941336038158809">El nom d'usuari o la contrasenya no són vàlids.</translation>
 <translation id="1717733954209022288">Casella de selecció per desar la targeta de Google Payments</translation>
@@ -797,6 +799,7 @@
 <translation id="2168214441502403371">Teclat persa</translation>
 <translation id="2168725742002792683">Extensions de fitxer</translation>
 <translation id="2169062631698640254">Inicia la sessió de tota manera</translation>
+<translation id="2175042898143291048">Fes sempre igual</translation>
 <translation id="2175607476662778685">Barra d'inici ràpid</translation>
 <translation id="2176045495080708525">Les extensions següents ja estan instal·lades:</translation>
 <translation id="2177950615300672361">Pestanya d'incògnit: <ph name="TAB_NAME" /></translation>
@@ -1934,7 +1937,6 @@
 <translation id="3688507211863392146">Escriure en fitxers i carpetes que s'obrin a l'aplicació</translation>
 <translation id="3688526734140524629">Canvia el canal</translation>
 <translation id="3688578402379768763">Actualitzat</translation>
-<translation id="3690976161240450479">S'ha produït un problema en iniciar la sessió. Contacteu amb l'administrador o torneu a provar-ho.</translation>
 <translation id="3693415264595406141">Contrasenya:</translation>
 <translation id="3694027410380121301">Selecciona la pestanya anterior</translation>
 <translation id="3694678678240097321">Demana el consentiment de l'usuari per a les extensions que executin un script a la pàgina si l'extensió ha sol·licitat permís per executar-se en tots els URL.</translation>
@@ -2229,6 +2231,7 @@
 <translation id="4116663294526079822">Permet sempre en aquest lloc</translation>
 <translation id="411666854932687641">Memòria privada</translation>
 <translation id="4118990158415604803">L'administrador ha desactivat la possibilitat de connectar-se amb altres xarxes.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{i 1 més}other{i # més}}</translation>
 <translation id="4119828560634133962">Promocions de registre de la previsualització d'impressió</translation>
 <translation id="4120329147617730038">Un administrador ha desactivat l'inici de sessió múltiple per a <ph name="USER_EMAIL" />.
 Tots els usuaris han de tancar la sessió per continuar.</translation>
@@ -2368,9 +2371,11 @@
 <translation id="4345703751611431217">Incompatibilitat de programari: més informació</translation>
 <translation id="4348766275249686434">Recopila els errors</translation>
 <translation id="4350019051035968019">No es pot inscriure aquest dispositiu al domini del vostre compte perquè s'ha indicat que el dispositiu es gestiona en un altre domini.</translation>
+<translation id="4354806558096370704">Permet utilitzar la interfície d'impressió del sistema CUPS natiu.</translation>
 <translation id="4358697938732213860">Afegir una adreça</translation>
 <translation id="4359408040881008151">S'ha instal·lat perquè té extensions que en depenen.</translation>
 <translation id="4361190688154226069">Orientació basada en rectangle a les visualitzacions</translation>
+<translation id="4364414793200746179">Notificació tipus MediaStyle d'Android</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> s'ha baixat</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> està compartint una finestra.</translation>
 <translation id="4364830672918311045">Mostra les notificacions</translation>
@@ -2771,6 +2776,7 @@
 <translation id="4988792151665380515">No s'ha pogut exportar la clau pública.</translation>
 <translation id="49896407730300355">Gira en el sentit con&amp;trari a les agulles del rellotge</translation>
 <translation id="4989966318180235467">Inspecciona la &amp;pàgina de fons</translation>
+<translation id="4990343175649730969">Baixa l'Eina per netejar Chrome</translation>
 <translation id="4991420928586866460">Tracta les tecles de la fila superior com a tecles de funció</translation>
 <translation id="499165176004408815">Utilitza el mode de contrast elevat</translation>
 <translation id="4992066212339426712">Deixa de silenciar</translation>
@@ -3294,6 +3300,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: selecciona per editar-lo</translation>
 <translation id="5741454054957165976">Activa la nova versió de la intervenció de l'agent d'usuari per carregar tipus de lletra web.</translation>
 <translation id="574392208103952083">Mitjà</translation>
+<translation id="5744368829843057748">Interfície d'usuari del Traductor per a 2016T2</translation>
 <translation id="5745056705311424885">S'ha detectat un llapis de memòria USB</translation>
 <translation id="5746169159649715125">Desa com a PDF</translation>
 <translation id="5747611503456050045">Recàrrega de pàgines que s'activa en desplaçar-se verticalment per sobre del contingut.</translation>
@@ -3402,6 +3409,7 @@
 <translation id="5884474295213649357">Aquesta pestanya està connectada a un dispositiu USB</translation>
 <translation id="5885324376209859881">Gestiona la configuració dels elements multimèdia...</translation>
 <translation id="5889282057229379085">Nombre màxim de CA intermèdies: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Indiqueu-nos el problema.</translation>
 <translation id="5892290200158927959">Teclat BÉPO francès</translation>
 <translation id="5892507820957994680">Sobreescriu la llista de renderització de programari integrat i activa l'acceleració de la GPU en configuracions de sistema no admeses.</translation>
 <translation id="5895138241574237353">Reinicia</translation>
@@ -3543,6 +3551,7 @@
 <translation id="6122093587541546701">Adreça electrònica (opcional):</translation>
 <translation id="6122875415561139701">L'operació d'escriptura no es permet a <ph name="DEVICE_NAME" />.</translation>
 <translation id="6124650939968185064">D'aquesta extensió en depenen les extensions següents:</translation>
+<translation id="6127945163801765632">Activa la secció Totes les adreces d'interès al gestor d'adreces d'interès.</translation>
 <translation id="6129938384427316298">Comentari de certificat de Netscape</translation>
 <translation id="6129953537138746214">Espai</translation>
 <translation id="6132383530370527946">La imatge petita</translation>
@@ -3569,6 +3578,7 @@
 <translation id="6164005077879661055">Tots els fitxers i les dades locals associats amb l'usuari supervisat se suprimiran de manera permanent quan aquest usuari supervisat se suprimeixi. És possible que el gestor encara pugui veure els llocs web visitats i la configuració d'aquest usuari supervisat a la pàgina <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Més informació</translation>
 <translation id="6166185671393271715">Importeu contrasenyes a Chrome</translation>
+<translation id="6169666352732958425">L'escriptori no es pot emetre.</translation>
 <translation id="6171550060231646388">Funcions "Ok Google" per a maquinari simulat</translation>
 <translation id="6175314957787328458">GUID de domini de Microsoft</translation>
 <translation id="6178664161104547336">Seleccioneu un certificat</translation>
@@ -3761,6 +3771,7 @@
 <translation id="6458308652667395253">Gestiona el bloqueig de JavaScript...</translation>
 <translation id="6459488832681039634">Utilitza la selecció per a la cerca</translation>
 <translation id="6460423884798879930">Activa l'opció per enviar informació d'autenticació addicional al paquet SYN inicial per a un client ja connectat, de manera que permet que s'iniciï l'enviament de dades més ràpidament.</translation>
+<translation id="6460474910028274178">Millora de la lògica d'activació i de l'aspecte a la interfície d'usuari per al quadre del Traductor</translation>
 <translation id="6460601847208524483">Cerca el següent</translation>
 <translation id="6462080265650314920">Les aplicacions s'han de distribuir amb el tipus de contingut "<ph name="CONTENT_TYPE" />".</translation>
 <translation id="6462082050341971451">Encara hi ets?</translation>
@@ -3890,6 +3901,7 @@
 <translation id="6663792236418322902">La contrasenya que trieu es demanarà per restaurar aquest fitxer més endavant. Registreu-la en un lloc segur.</translation>
 <translation id="6664237456442406323">L'ordinador està configurat amb un ID de maquinari amb un format incorrecte. Això impedeix a Chrome OS actualitzar-se amb les darreres correccions de seguretat i <ph name="BEGIN_BOLD" />pot ser que l'ordinador sigui vulnerable a atacs maliciosos<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">amb el vostre Compte de Google</translation>
+<translation id="667517062706956822">Voleu que Google tradueixi a <ph name="TARGET_LANGUAGE" /> aquesta pàgina escrita en <ph name="SOURCE_LANGUAGE" />?</translation>
 <translation id="6675665718701918026">S'ha connectat un dispositiu per apuntar</translation>
 <translation id="6677037229676347494">L'ID esperat era "<ph name="EXPECTED_ID" />", però el real era "<ph name="NEW_ID" />".</translation>
 <translation id="6680028776254050810">Canvia els usuaris</translation>
@@ -3941,6 +3953,7 @@
 <translation id="6746392203843147041">més vol.</translation>
 <translation id="6748140994595080445">Canvia la gestió i la visualització d'idiomes de <ph name="APP_NAME" />.</translation>
 <translation id="6748465660675848252">Podeu continuar, però només es restauraran les dades i la configuració sincronitzades. Es perdran totes les dades locals.</translation>
+<translation id="6751256176799620176">1 carpeta seleccionada</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Incògnit)</translation>
 <translation id="6759193508432371551">Restabliment de fàbrica</translation>
 <translation id="6760765581316020278">Teclat vietnamita (VNI)</translation>
@@ -4572,6 +4585,7 @@
 <translation id="7717014941119698257">S'està baixant: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">S'ha esgotat el temps d'espera de l'entrenament</translation>
 <translation id="771953673318695590">Control de qualitat</translation>
+<translation id="7720375555307821262"><ph name="BEGIN_LINK" />Inicieu la sessió a Chrome<ph name="END_LINK" /> per supervisar aquesta persona.</translation>
 <translation id="7724603315864178912">Retalla</translation>
 <translation id="7730449930968088409">Captura del contingut de la pantalla</translation>
 <translation id="7730494089396812859">Mostra els detalls de la còpia de seguretat a Cloud</translation>
@@ -4665,7 +4679,6 @@
 <translation id="7859704718976024901">Historial de navegació</translation>
 <translation id="7861215335140947162">&amp;Baixades</translation>
 <translation id="7864539943188674973">Desactiva el Bluetooth</translation>
-<translation id="7868891395842935202">Activa l'entorn de treball experimental per controlar l'accés als experiments de l'API.</translation>
 <translation id="7870576007982733437">Utilitza el gestor de baixades del sistema quan sigui pertinent.</translation>
 <translation id="7870790288828963061">No s'ha trobat cap aplicació de Quiosc amb una versió més nova. No hi ha res per actualitzar. Extraieu la memòria USB.</translation>
 <translation id="787150342916295244">Escaneig de targetes de crèdit</translation>
@@ -4994,7 +5007,6 @@
 <translation id="8309505303672555187">Seleccioneu una xarxa:</translation>
 <translation id="8312871300878166382">Enganxa a la carpeta</translation>
 <translation id="8314013494437618358">Composició per subprocessos</translation>
-<translation id="8314576811984836978">Entorn experimental.</translation>
 <translation id="8319414634934645341">Ús ampliat de claus</translation>
 <translation id="8322814362483282060">Aquesta pàgina no té permís per accedir al micròfon.</translation>
 <translation id="8326478304147373412">PKCS #7, cadena de certificats</translation>
@@ -5055,7 +5067,6 @@
 <translation id="8418240940464873056">Mode hanja</translation>
 <translation id="8418445294933751433">&amp;Mostra com a pestanya</translation>
 <translation id="8420060421540670057">Mostra els fitxers de Google Docs</translation>
-<translation id="8420728540268437431">Aquesta pàgina s'està traduint...</translation>
 <translation id="842274098655511832">Extensions d'esborrany WebGL</translation>
 <translation id="8424039430705546751">avall</translation>
 <translation id="8425213833346101688">Canvia</translation>
@@ -5242,6 +5253,7 @@
 <translation id="8690754533598178758">Les excepcions del micròfon d'Adobe Flash Player són diferents.</translation>
 <translation id="8691686986795184760">(Activat per la política d'empresa)</translation>
 <translation id="869257642790614972">Torna a obrir l'última pestanya tancada</translation>
+<translation id="8695770993395462321">CUPS natiu</translation>
 <translation id="8695825812785969222">Obre la &amp;ubicació...</translation>
 <translation id="8698464937041809063">Dibuix de Google</translation>
 <translation id="869884720829132584">Menú d'aplicacions</translation>
@@ -5583,6 +5595,7 @@
 <translation id="9189690067274055051">Desbloquegeu el telèfon i acosteu-lo a <ph name="DEVICE_TYPE" /> per entrar</translation>
 <translation id="9190063653747922532">L2TP/IPsec + clau precompartida d'IPSec</translation>
 <translation id="9201305942933582053">Google Now per a Chrome</translation>
+<translation id="9202646163273566462">Activa la visualització Totes les adreces d'interès com a destinació predeterminada del gestor d'adreces d'interès.</translation>
 <translation id="9203398526606335860">Creació de &amp;perfils activada</translation>
 <translation id="9203478404496196495">Activa el so de la pestanya</translation>
 <translation id="9203962528777363226">L'administrador d'aquest dispositiu ha desactivat la possibilitat d'afegir-hi usuaris nous</translation>
@@ -5609,6 +5622,7 @@
 <translation id="939736085109172342">Carpeta nova</translation>
 <translation id="940425055435005472">Mida de la lletra:</translation>
 <translation id="941543339607623937">Clau privada no vàlida.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{cap}=1{1 aplicació ($1)}=2{2 aplicacions ($1, $2)}other{# aplicacions ($1, $2 $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> està compartint una pestanya de Chrome i l'àudio.</translation>
 <translation id="942954117721265519">No hi ha cap imatge en aquest directori.</translation>
 <translation id="945522503751344254">Envia suggeriments</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb
index 301142e..ceeaf672 100644
--- a/chrome/app/resources/generated_resources_cs.xtb
+++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608">Rozšíření <ph name="EXTENSION_NAME" /> (ID <ph name="EXTENSION_ID" />) není pro tento typ relace povoleno.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Nezdařilo se vytvořit náhodný soukromý klíč RSA.</translation>
+<translation id="1421115928968836111">Toto nastavení zruší autorizaci licencí přehrávače Flash Player na chráněný obsah.</translation>
 <translation id="1425734930786274278">Tyto soubory cookie byly zablokovány (soubory cookie třetí strany jsou blokovány bez výjimky):</translation>
 <translation id="1426410128494586442">Ano</translation>
 <translation id="1427049173708736891">Mějte zařízení <ph name="DEVICE_TYPE" /> odemknuté, když je poblíž váš odemknutý telefon Android, aniž byste museli zadávat heslo.</translation>
@@ -522,6 +523,7 @@
 <translation id="1707463636381878959">Sdílet tuto síť s ostatními uživateli</translation>
 <translation id="1708199901407471282">Když uživatel otevře návrh ze stránky Nová karta a návrh už je otevřen na některé kartě, přepne se na tuto kartu (návrh se nebude načítat na nové kartě).</translation>
 <translation id="1708338024780164500">(Neaktivní)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Komprimace se nezdařila, neočekávaná chyba: $1</translation>
 <translation id="1715941336038158809">Neplatné uživatelské jméno nebo heslo.</translation>
 <translation id="1717733954209022288">Zaškrtávací políčko k uložení karty do služby Google Payments</translation>
@@ -799,6 +801,7 @@
 <translation id="2168214441502403371">Perská klávesnice</translation>
 <translation id="2168725742002792683">Přípony souborů</translation>
 <translation id="2169062631698640254">Přesto se přihlásit</translation>
+<translation id="2175042898143291048">Vždy provádět tuto akci</translation>
 <translation id="2175607476662778685">panel Snadné spuštění</translation>
 <translation id="2176045495080708525">Následující rozšíření jsou nyní nainstalována:</translation>
 <translation id="2177950615300672361">Anonymní karta: <ph name="TAB_NAME" /></translation>
@@ -1931,7 +1934,6 @@
 <translation id="3688507211863392146">Zapisovat do souborů a složek, které v aplikaci otevřete</translation>
 <translation id="3688526734140524629">Změnit kanál</translation>
 <translation id="3688578402379768763">Aktuální</translation>
-<translation id="3690976161240450479">Přihlášení se nezdařilo. Kontaktujte administrátora nebo to zkuste znovu.</translation>
 <translation id="3693415264595406141">Heslo:</translation>
 <translation id="3694027410380121301">Vybrat předchozí kartu</translation>
 <translation id="3694678678240097321">Vyžadovat souhlas uživatele, když rozšíření spustí skript na stránce a požádá o oprávnění k jeho spuštění na všech adresách URL.</translation>
@@ -2226,6 +2228,7 @@
 <translation id="4116663294526079822">Povolit vždy na tomto webu</translation>
 <translation id="411666854932687641">Privátní paměť</translation>
 <translation id="4118990158415604803">Připojení k jiným sítím je administrátorem zakázáno.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{a 1 další}few{a # další}many{a # další}other{a # dalších}}</translation>
 <translation id="4119828560634133962">Propagace registrace v náhledu tisku</translation>
 <translation id="4120329147617730038">Administrátor zakázal vícenásobné přihlášení pro účet <ph name="USER_EMAIL" />.
 Všichni uživatelé se před pokračováním musejí odhlásit.</translation>
@@ -2365,9 +2368,11 @@
 <translation id="4345703751611431217">Nekompatibilní software: další informace</translation>
 <translation id="4348766275249686434">Shromažďování chyb</translation>
 <translation id="4350019051035968019">Toto zařízení nelze zaregistrovat do domény, do které patří váš účet, protože je označeno pro správu jinou doménou.</translation>
+<translation id="4354806558096370704">Povolí použití nativního back-endu pro tisk CUPS.</translation>
 <translation id="4358697938732213860">Přidat adresu</translation>
 <translation id="4359408040881008151">Rozšíření bylo nainstalováno kvůli závislým rozšířením.</translation>
 <translation id="4361190688154226069">Cílení založené na obdélníku v zobrazeních</translation>
+<translation id="4364414793200746179">Oznámení Android MediaStyle</translation>
 <translation id="4364444725319685468">Soubor <ph name="FILE_NAME" /> byl stažen</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> sdílí okno.</translation>
 <translation id="4364830672918311045">Zobrazování oznámení</translation>
@@ -2769,6 +2774,7 @@
 <translation id="4988792151665380515">Export veřejného klíče se nezdařil.</translation>
 <translation id="49896407730300355">Otočit &amp;proti směru hodinových ručiček</translation>
 <translation id="4989966318180235467">Prozkoumat stránku na &amp;pozadí</translation>
+<translation id="4990343175649730969">Stáhnout nástroj Chrome Cleanup Tool</translation>
 <translation id="4991420928586866460">Považovat klávesy v horní řadě za funkční klávesy</translation>
 <translation id="499165176004408815">Použít režim s vysokým kontrastem</translation>
 <translation id="4992066212339426712">Zapnout zvuk</translation>
@@ -3290,6 +3296,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: kliknutím upravte</translation>
 <translation id="5741454054957165976">Povolí novou verzi intervence uživatelského agenta pro načítání webových písem.</translation>
 <translation id="574392208103952083">Střední</translation>
+<translation id="5744368829843057748">Uživatelské rozhraní Překladače z 2. čtvrtletí roku 2016</translation>
 <translation id="5745056705311424885">Byla rozpoznána paměťová jednotka USB</translation>
 <translation id="5746169159649715125">Uložit jako PDF</translation>
 <translation id="5747611503456050045">Opětovně načítat stránky aktivované svislým posunutím obsahu přes limit.</translation>
@@ -3397,6 +3404,7 @@
 <translation id="5884474295213649357">Tato karta je připojena k zařízení USB.</translation>
 <translation id="5885324376209859881">Spravovat nastavení médií...</translation>
 <translation id="5889282057229379085">Maximální počet zprostředkujících certifikačních autorit: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Řekněte nám, co se děje.</translation>
 <translation id="5892290200158927959">Francouzská klávesnice BÉPO</translation>
 <translation id="5892507820957994680">Přepíše seznam softwarového vykreslování a zapne urychlení pomocí grafické karty v systémech s nepodporovanými konfiguracemi.</translation>
 <translation id="5895138241574237353">Restartovat</translation>
@@ -3540,6 +3548,7 @@
 <translation id="6122093587541546701">E-mail (nepovinné):</translation>
 <translation id="6122875415561139701">Operace zápisu v zařízení <ph name="DEVICE_NAME" /> není povolena.</translation>
 <translation id="6124650939968185064">Na tomto rozšíření závisejí následující rozšíření:</translation>
+<translation id="6127945163801765632">Povolit ve správci záložek sekci Všechny záložky</translation>
 <translation id="6129938384427316298">Komentář certifikátu Netscape</translation>
 <translation id="6129953537138746214">Mezera</translation>
 <translation id="6132383530370527946">Smluvní podmínky</translation>
@@ -3566,6 +3575,7 @@
 <translation id="6164005077879661055">Po odebrání dozorovaného uživatele budou trvale smazány všechny soubory a místní data, která jsou k němu přiřazena. Navštívené weby a nastavení tohoto dozorovaného uživatele může správce i nadále zobrazit na adrese <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Další informace</translation>
 <translation id="6166185671393271715">Import hesel do Chromu</translation>
+<translation id="6169666352732958425">Plochu nelze odeslat.</translation>
 <translation id="6171550060231646388">Simulované hardwarové funkce „Ok Google“</translation>
 <translation id="6175314957787328458">Identifikátor GUID domény Microsoft</translation>
 <translation id="6178664161104547336">Vyberte certifikát</translation>
@@ -3759,6 +3769,7 @@
 <translation id="6458308652667395253">Spravovat blokování JavaScriptu...</translation>
 <translation id="6459488832681039634">Pro hledání použít výběr</translation>
 <translation id="6460423884798879930">U klienta, který již byl dříve připojen, bude aktivována možnost odeslání dodatečných ověřovacích údajů v počátečním paketu SYN, což zvyšuje rychlost zahájení odesílání dat.</translation>
+<translation id="6460474910028274178">Vylepšená logika spouštění a vzhled uživatelského rozhraní bublin Překladače</translation>
 <translation id="6460601847208524483">Najít další</translation>
 <translation id="6462080265650314920">Aplikace musí být poskytovány s typem obsahu <ph name="CONTENT_TYPE" />.</translation>
 <translation id="6462082050341971451">Jste tam ještě?</translation>
@@ -3888,6 +3899,7 @@
 <translation id="6663792236418322902">Heslo, které si vyberete, budete později potřebovat k obnovení souboru. Bezpečně je uschovejte.</translation>
 <translation id="6664237456442406323">Váš počítač je bohužel nakonfigurován pomocí chybného čísla hardwaru. Systému Chrome OS to zabraňuje získat aktualizace s nejnovějšími bezpečnostními opravami, a počítač tak <ph name="BEGIN_BOLD" />může být zranitelnější vůči škodlivým úrokům<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">pomocí účtu Google</translation>
+<translation id="667517062706956822">Chcete, aby Google tuto stránku přeložil z jazyka <ph name="SOURCE_LANGUAGE" /> do jazyka <ph name="TARGET_LANGUAGE" />?</translation>
 <translation id="6675665718701918026">Je připojeno polohovací zařízení</translation>
 <translation id="6677037229676347494">Očekávané ID bylo <ph name="EXPECTED_ID" />. Skutečné ID bylo <ph name="NEW_ID" />.</translation>
 <translation id="6680028776254050810">Přepnout uživatele</translation>
@@ -3939,6 +3951,7 @@
 <translation id="6746392203843147041">zvýšit hlasitost</translation>
 <translation id="6748140994595080445">Umožňuje změnit způsob, jakým <ph name="APP_NAME" /> zpracovává a zobrazuje jazyky.</translation>
 <translation id="6748465660675848252">Můžete pokračovat. Obnoví se však pouze synchronizovaná data a nastavení. Veškerá místní data budou ztracena.</translation>
+<translation id="6751256176799620176">Je vybrána 1 složka</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Anonymní režim)</translation>
 <translation id="6759193508432371551">Tovární nastavení</translation>
 <translation id="6760765581316020278">Vietnamská klávesnice (VNI)</translation>
@@ -4575,6 +4588,7 @@
 <translation id="7717014941119698257">Stahování: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">Časový limit učení vypršel.</translation>
 <translation id="771953673318695590">Kontrola kvality</translation>
+<translation id="7720375555307821262">Chcete-li tohoto uživatele dozorovat, <ph name="BEGIN_LINK" />přihlaste se do Chromu<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">Vyjmout</translation>
 <translation id="7730449930968088409">Zachycení obsahu obrazovky</translation>
 <translation id="7730494089396812859">Zobrazit podrobnosti zálohování do cloudu</translation>
@@ -4668,7 +4682,6 @@
 <translation id="7859704718976024901">Historie procházení</translation>
 <translation id="7861215335140947162">&amp;Stažené soubory</translation>
 <translation id="7864539943188674973">Vypnout Bluetooth</translation>
-<translation id="7868891395842935202">Aktivuje experimentální platformu ke kontrole přístupu k experimentálním rozhraním API.</translation>
 <translation id="7870576007982733437">Pokud je to možné, použít systémového správce stahování</translation>
 <translation id="7870790288828963061">Nebyly nalezeny žádné novější verze terminálových aplikací. Aktualizaci není třeba provést. Vyjměte jednotku USB.</translation>
 <translation id="787150342916295244">Skenování platebních karet</translation>
@@ -4999,7 +5012,6 @@
 <translation id="8309505303672555187">Vyberte síť:</translation>
 <translation id="8312871300878166382">Vložit do složky</translation>
 <translation id="8314013494437618358">Postupné skládání</translation>
-<translation id="8314576811984836978">Experimentální platforma</translation>
 <translation id="8319414634934645341">Rozšířené použití klíče</translation>
 <translation id="8322814362483282060">Přístup této stránky k vašemu mikrofonu je zablokován.</translation>
 <translation id="8326478304147373412">PKCS #7, řetězec certifikátu</translation>
@@ -5060,7 +5072,6 @@
 <translation id="8418240940464873056">Režim čínských znaků</translation>
 <translation id="8418445294933751433">Zobrazit jako kartu</translation>
 <translation id="8420060421540670057">Zobrazit soubory Dokumentů Google</translation>
-<translation id="8420728540268437431">Probíhá překlad této stránky...</translation>
 <translation id="842274098655511832">Rozšíření WebGL ve stavu konceptu</translation>
 <translation id="8424039430705546751">dolů</translation>
 <translation id="8425213833346101688">Změnit</translation>
@@ -5247,6 +5258,7 @@
 <translation id="8690754533598178758">Výjimky mikrofonu v přehrávači Adobe Flash Player se liší.</translation>
 <translation id="8691686986795184760">(Aktivováno podnikovými zásadami)</translation>
 <translation id="869257642790614972">Znovu otevřít naposledy zavřenou kartu</translation>
+<translation id="8695770993395462321">Nativní CUPS</translation>
 <translation id="8695825812785969222">&amp;Otevřít umístění...</translation>
 <translation id="8698464937041809063">Nákres Google</translation>
 <translation id="869884720829132584">Nabídka Aplikace</translation>
@@ -5589,6 +5601,7 @@
 <translation id="9189690067274055051">Chcete-li zařízení <ph name="DEVICE_TYPE" /> odemknout, umístěte telefon blíže k němu a odemkněte jej.</translation>
 <translation id="9190063653747922532">L2TP/IPsec + předsdílený klíč</translation>
 <translation id="9201305942933582053">Chytré karty Google pro Chrome!</translation>
+<translation id="9202646163273566462">Výchozím zobrazením správce záložek bude sekce Všechny záložky.</translation>
 <translation id="9203398526606335860">&amp;Profilování povoleno</translation>
 <translation id="9203478404496196495">Zapnout zvuk karty</translation>
 <translation id="9203962528777363226">Správce zařízení zakázal přidávat nové uživatele.</translation>
@@ -5615,6 +5628,7 @@
 <translation id="939736085109172342">Nová složka</translation>
 <translation id="940425055435005472">Velikost písma:</translation>
 <translation id="941543339607623937">Neplatný soukromý klíč</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{žádná aplikace}=1{1 aplikace ($1)}=2{2 aplikace ($1, $2)}few{# aplikace ($1, $2, $3)}many{# aplikace ($1, $2, $3)}other{# aplikací ($1, $2, $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> sdílí kartu Chrome a zvuk.</translation>
 <translation id="942954117721265519">Adresář neobsahuje žádné obrázky.</translation>
 <translation id="945522503751344254">Odeslat zpětnou vazbu</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index a041139..86544be 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (udvidelses-id'et "<ph name="EXTENSION_ID" />") er ikke tilladt i denne sessionstype.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Gisp! Den tilfældige personlige RSA-nøgle kunne ikke genereres.</translation>
+<translation id="1421115928968836111">Dette fjerner godkendelsen af Flash Player-licenser til beskyttet indhold.</translation>
 <translation id="1425734930786274278">Følgende cookies blev blokeret (cookies fra tredjeparter blokeres uden undtagelse):</translation>
 <translation id="1426410128494586442">Ja</translation>
 <translation id="1427049173708736891">Lad din <ph name="DEVICE_TYPE" /> forblive låst op, når din Android-telefon er låst op og i nærheden – indtastning af adgangskode er ikke nødvendigt.</translation>
@@ -518,6 +519,7 @@
 <translation id="1707463636381878959">Del dette netværk med andre brugere</translation>
 <translation id="1708199901407471282">Når du åbner en foreslået webside fra siden Ny fane, og der allerede er en åben fane med forslaget, skiftes der til den, i stedet for at forslaget indlæses i den nye fane.</translation>
 <translation id="1708338024780164500">(inaktiv)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (id: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Komprimering mislykkedes. Der opstod en uventet fejl: $1</translation>
 <translation id="1715941336038158809">Ugyldigt brugernavn eller ugyldig adgangskode.</translation>
 <translation id="1717733954209022288">Afkrydsningsfelt til lagring af Google Payments-kort</translation>
@@ -794,6 +796,7 @@
 <translation id="2168214441502403371">Persisk tastatur</translation>
 <translation id="2168725742002792683">Filudvidelser</translation>
 <translation id="2169062631698640254">Log ind alligevel</translation>
+<translation id="2175042898143291048">Gør altid dette</translation>
 <translation id="2175607476662778685">Hurtig start</translation>
 <translation id="2176045495080708525">Disse udvidelser er nu installeret:</translation>
 <translation id="2177950615300672361">Inkognitofane: <ph name="TAB_NAME" /></translation>
@@ -1936,7 +1939,6 @@
 <translation id="3688507211863392146">Skrive til filer og mapper, som du åbner i applikationen</translation>
 <translation id="3688526734140524629">Skift kanal</translation>
 <translation id="3688578402379768763">Opdateret</translation>
-<translation id="3690976161240450479">Login mislykkedes. Kontakt din administrator, eller prøv igen.</translation>
 <translation id="3693415264595406141">Adgangskode:</translation>
 <translation id="3694027410380121301">Vælg forrige fane</translation>
 <translation id="3694678678240097321">Kræve brugerens samtykke til en udvidelse, der kører et script på siden, hvis udvidelsen har anmodet om tilladelse til at køre på alle webadresser.</translation>
@@ -2232,6 +2234,7 @@
 <translation id="4116663294526079822">Tillad altid på dette website</translation>
 <translation id="411666854932687641">Privat hukommelse</translation>
 <translation id="4118990158415604803">Din administrator har deaktiveret tilslutning til andre netværk.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{og 1 mere}one{og # mere}other{og # mere}}</translation>
 <translation id="4119828560634133962">Registreringspromoveringer i Vis udskrift</translation>
 <translation id="4120329147617730038">En administrator har afvist samlet login fra flere konti for <ph name="USER_EMAIL" />. Alle brugere skal logge ud for at fortsætte.</translation>
 <translation id="4120817667028078560">Stien er for lang</translation>
@@ -2370,9 +2373,11 @@
 <translation id="4345703751611431217">Manglende softwarekompatibilitet: Få flere oplysninger</translation>
 <translation id="4348766275249686434">Saml fejl</translation>
 <translation id="4350019051035968019">Denne enhed kan ikke tilmeldes det domæne, som din konto hører under, da enheden er markeret til administration på et andet domæne.</translation>
+<translation id="4354806558096370704">Aktiverer brugen af den indbyggede backend til CUPS-udskrivning.</translation>
 <translation id="4358697938732213860">Tilføj en adresse</translation>
 <translation id="4359408040881008151">Installeret på grund af andre udvidelser, der er afhængige af den.</translation>
 <translation id="4361190688154226069">Visning af målretningsområde i rektangel</translation>
+<translation id="4364414793200746179">Underretning om Android MediaStyle</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> er downloadet</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> deler et vindue.</translation>
 <translation id="4364830672918311045">Vis underretninger</translation>
@@ -2775,6 +2780,7 @@
 <translation id="4988792151665380515">Den offentlige nøgle kunne ikke eksporteres.</translation>
 <translation id="49896407730300355">Roter m&amp;od uret</translation>
 <translation id="4989966318180235467">Undersøg &amp;baggrundsside</translation>
+<translation id="4990343175649730969">Download Oprydningsværktøj til Chrome</translation>
 <translation id="4991420928586866460">Brug tasterne på øverste række som funktionstaster</translation>
 <translation id="499165176004408815">Brug tilstanden Høj kontrast</translation>
 <translation id="4992066212339426712">Slå lyden til</translation>
@@ -3297,6 +3303,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: vælg for at redigere</translation>
 <translation id="5741454054957165976">Aktivér ny version af indgriben fra brugeragent i forbindelse med indlæsning af WebFonts.</translation>
 <translation id="574392208103952083">Mellem</translation>
+<translation id="5744368829843057748">Translate 2016Q2 UI</translation>
 <translation id="5745056705311424885">USB-nøgle er registreret</translation>
 <translation id="5746169159649715125">Gem som PDF</translation>
 <translation id="5747611503456050045">Sidegenindlæsninger, der udløses af lodret overrulning af indhold.</translation>
@@ -3404,6 +3411,7 @@
 <translation id="5884474295213649357">Denne fane er sluttet til en USB-enhed.</translation>
 <translation id="5885324376209859881">Administrer medieindstillinger...</translation>
 <translation id="5889282057229379085">Maksimalt antal mellemliggende CA'er: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Fortæl os, hvad der sker.</translation>
 <translation id="5892290200158927959">Fransk BÉPO-tastatur</translation>
 <translation id="5892507820957994680">Tilsidesætter listen over indbygget softwaregengivelse og aktiverer GPU-acceleration på systemkonfigurationer, der ikke understøttes.</translation>
 <translation id="5895138241574237353">Genstart</translation>
@@ -3545,6 +3553,7 @@
 <translation id="6122093587541546701">E-mail (valgfri):</translation>
 <translation id="6122875415561139701">Skrivehandlingen er ikke tilladt på: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="6124650939968185064">Følgende udvidelser er afhængige af denne udvidelse:</translation>
+<translation id="6127945163801765632">Aktivér sektionen "alle bogmærker" i bogmærkeadministrator.</translation>
 <translation id="6129938384427316298">Kommentar til Netscape-certifikat</translation>
 <translation id="6129953537138746214">Mellemrum</translation>
 <translation id="6132383530370527946">Det med småt</translation>
@@ -3572,6 +3581,7 @@
 slettes permanent, når den administrerede bruger fjernes. Besøgte websites og indstillinger for denne administrerede bruger er muligvis stadig synlige for administratoren på <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Flere oplysninger</translation>
 <translation id="6166185671393271715">Importér adgangskoder til Chrome</translation>
+<translation id="6169666352732958425">Skrivebordet kunne ikke castes.</translation>
 <translation id="6171550060231646388">Simulerede hardwarefunktioner for "Ok Google"</translation>
 <translation id="6175314957787328458">Microsoft-domæne-GUID</translation>
 <translation id="6178664161104547336">Vælg et certifikat</translation>
@@ -3765,6 +3775,7 @@
 <translation id="6458308652667395253">Administrer blokering af JavaScript...</translation>
 <translation id="6459488832681039634">Brug valg til Find</translation>
 <translation id="6460423884798879930">Aktivér muligheden for at sende ekstra godkendelsesoplysninger i den oprindelige SYN-pakke for en tidligere tilsluttet klient, hvilket vil resultere i en hurtigere dataafsendelse.</translation>
+<translation id="6460474910028274178">Forbedret udløserlogik. Kig efter Translate Bubble UI</translation>
 <translation id="6460601847208524483">Find næste</translation>
 <translation id="6462080265650314920">Apps skal leveres med indholdstypen "<ph name="CONTENT_TYPE" />".</translation>
 <translation id="6462082050341971451">Er du der stadig?</translation>
@@ -3894,6 +3905,7 @@
 <translation id="6663792236418322902">Den valgte adgangskode kræves for at gendanne denne fil senere. Gem den et sikkert sted.</translation>
 <translation id="6664237456442406323">Din computer er desværre konfigureret med et hardware-id i forkert format. Dette forhindrer Chrome OS i at opdatere med de nyeste sikkerhedsrettelser, og din computer <ph name="BEGIN_BOLD" />kan være sårbar over for ondartede angreb<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">med din Google-konto</translation>
+<translation id="667517062706956822">Skal Google oversætte denne side fra <ph name="SOURCE_LANGUAGE" /> til <ph name="TARGET_LANGUAGE" />?</translation>
 <translation id="6675665718701918026">Pegeredskabet er tilsluttet</translation>
 <translation id="6677037229676347494">Det forventede id er "<ph name="EXPECTED_ID" />", men id'et var "<ph name="NEW_ID" />".</translation>
 <translation id="6680028776254050810">Skift bruger</translation>
@@ -3945,6 +3957,7 @@
 <translation id="6746392203843147041">lyd op</translation>
 <translation id="6748140994595080445">Angiv, hvordan <ph name="APP_NAME" /> skal håndtere og vise sprog</translation>
 <translation id="6748465660675848252">Du kan fortsætte, men kun dine synkroniserede data og indstillinger gendannes. Alle lokale data går tabt.</translation>
+<translation id="6751256176799620176">1 mappe er valgt</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Inkognito)</translation>
 <translation id="6759193508432371551">Gendannelse af fabriksindstillinger</translation>
 <translation id="6760765581316020278">Vietnamesisk tastatur (VNI)</translation>
@@ -4583,6 +4596,7 @@
 <translation id="7717014941119698257">Downloader: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">Træningen har fået timeout</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262"><ph name="BEGIN_LINK" />Log ind på Chrome<ph name="END_LINK" /> for at administrere denne person.</translation>
 <translation id="7724603315864178912">Klip</translation>
 <translation id="7730449930968088409">Tage et skærmbillede af dit indhold</translation>
 <translation id="7730494089396812859">Vis oplysninger om sikkerhedskopiering i skyen</translation>
@@ -4676,7 +4690,6 @@
 <translation id="7859704718976024901">Browserhistorik</translation>
 <translation id="7861215335140947162">&amp;Downloads</translation>
 <translation id="7864539943188674973">Deaktiver Bluetooth</translation>
-<translation id="7868891395842935202">Aktiverer den eksperimentelle struktur for styring af adgang til API-eksperimenter.</translation>
 <translation id="7870576007982733437">Brug systemets downloadadministrator, når det er relevant.</translation>
 <translation id="7870790288828963061">Der blev ikke fundet nogen terminalapps med en nyere version. Intet at opdatere. Fjern USB-stikket.</translation>
 <translation id="787150342916295244">Scanning af kreditkort</translation>
@@ -5006,7 +5019,6 @@
 <translation id="8309505303672555187">Vælg et netværk:</translation>
 <translation id="8312871300878166382">Indsæt i mappe</translation>
 <translation id="8314013494437618358">Trådet sammensætning</translation>
-<translation id="8314576811984836978">Eksperimentel struktur.</translation>
 <translation id="8319414634934645341">Udvidet brug af nøgle</translation>
 <translation id="8322814362483282060">Denne side er blokeret fra at få adgang til din mikrofon.</translation>
 <translation id="8326478304147373412">PKCS #7, certifikatkæde</translation>
@@ -5067,7 +5079,6 @@
 <translation id="8418240940464873056">Tilstand med kinesiske tegn</translation>
 <translation id="8418445294933751433">&amp;Vis som fane</translation>
 <translation id="8420060421540670057">Vis filer fra Google Docs</translation>
-<translation id="8420728540268437431">Denne side er ved at blive oversat...</translation>
 <translation id="842274098655511832">WebGL-udvidelser i kladdeversion</translation>
 <translation id="8424039430705546751">ned</translation>
 <translation id="8425213833346101688">Skift</translation>
@@ -5254,6 +5265,7 @@
 <translation id="8690754533598178758">Mikrofonundtagelserne for Adobe Flash Player er forskellige.</translation>
 <translation id="8691686986795184760">(Aktiveret af virksomhedspolitikken)</translation>
 <translation id="869257642790614972">Genåbn den senest lukkede fane</translation>
+<translation id="8695770993395462321">Indbygget CUPS</translation>
 <translation id="8695825812785969222">Åbn &amp;placering...</translation>
 <translation id="8698464937041809063">Google-tegning</translation>
 <translation id="869884720829132584">Programmenu</translation>
@@ -5597,6 +5609,7 @@
 <translation id="9189690067274055051">Lås din telefon op, og flyt den tættere på din <ph name="DEVICE_TYPE" /> for at åbne den.</translation>
 <translation id="9190063653747922532">L2TP/IPsec + forhåndsdelt nøgle</translation>
 <translation id="9201305942933582053">Google Nu til Chrome.</translation>
+<translation id="9202646163273566462">Aktiverer visningen "alle bogmærker" som standarddestination for bogmærkeadministratoren.</translation>
 <translation id="9203398526606335860">&amp;Profilering aktiveret</translation>
 <translation id="9203478404496196495">Slå fanens lyd til</translation>
 <translation id="9203962528777363226">Administratoren af ​​denne enhed har deaktiveret tilføjelse af nye brugere</translation>
@@ -5623,6 +5636,7 @@
 <translation id="939736085109172342">Ny mappe</translation>
 <translation id="940425055435005472">Skriftstørrelse:</translation>
 <translation id="941543339607623937">Ugyldig personlig nøgle.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{ingen}=1{1 app ($1)}=2{2 apps ($1, $2)}one{# apps ($1, $2 $3)}other{# apps ($1, $2 $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> deler en Chrome-fane og lyd.</translation>
 <translation id="942954117721265519">Ingen billeder i denne mappe.</translation>
 <translation id="945522503751344254">Send feedback</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index cd00512..0bc66365 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (Erweiterungs-ID "<ph name="EXTENSION_ID" />") ist bei diesem Sitzungstyp nicht zulässig.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Der per Zufallsauswahl generierte private RSA-Schlüssel konnte nicht erstellt werden.</translation>
+<translation id="1421115928968836111">Hiermit wird die Autorisierung von Flash Player-Lizenzen für geschützte Inhalte aufgehoben.</translation>
 <translation id="1425734930786274278">Die folgenden Cookies wurden blockiert (Cookies von Drittanbietern werden ausnahmslos blockiert):</translation>
 <translation id="1426410128494586442">Ja</translation>
 <translation id="1427049173708736891">Ihr <ph name="DEVICE_TYPE" /> bleibt entsperrt, solange Ihr entsperrtes Android-Telefon in der Nähe ist. Sie brauchen kein Passwort einzugeben.</translation>
@@ -518,6 +519,7 @@
 <translation id="1707463636381878959">Dieses Netzwerk für andere freigeben</translation>
 <translation id="1708199901407471282">Wenn eine vorgeschlagene Webseite von der "Neuer Tab"-Seite geöffnet wird und für den Vorschlag bereits ein Tab geöffnet ist, wird statt des neuen Tabs der bereits geöffnete Tab verwendet.</translation>
 <translation id="1708338024780164500">(Inaktiv)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Fehler beim Zippen, unerwarteter Fehler: $1</translation>
 <translation id="1715941336038158809">Ungültiger Nutzername oder ungültiges Passwort</translation>
 <translation id="1717733954209022288">Kästchen zum Speichern von Google Payments-Karten</translation>
@@ -794,6 +796,7 @@
 <translation id="2168214441502403371">Persische Tastatur</translation>
 <translation id="2168725742002792683">Dateiendungen</translation>
 <translation id="2169062631698640254">Trotzdem anmelden</translation>
+<translation id="2175042898143291048">Immer so verfahren</translation>
 <translation id="2175607476662778685">Schnellstartleiste</translation>
 <translation id="2176045495080708525">Die folgenden Erweiterungen sind nun installiert:</translation>
 <translation id="2177950615300672361">Inkognito-Tab: <ph name="TAB_NAME" /></translation>
@@ -1932,7 +1935,6 @@
 <translation id="3688507211863392146">In Dateien und Ordner schreiben, die Sie in der Anwendung öffnen</translation>
 <translation id="3688526734140524629">Version ändern</translation>
 <translation id="3688578402379768763">Auf dem neusten Stand</translation>
-<translation id="3690976161240450479">Fehler bei der Anmeldung. Bitte wenden Sie sich an Ihren Administrator oder versuchen Sie es erneut.</translation>
 <translation id="3693415264595406141">Passwort:</translation>
 <translation id="3694027410380121301">Vorherigen Tab auswählen</translation>
 <translation id="3694678678240097321">Für die Ausführung eines Skripts auf der Seite durch eine Erweiterung ist die Zustimmung des Nutzers erforderlich, falls die Erweiterung die Berechtigung zur Ausführung auf allen URLs angefordert hat.</translation>
@@ -2228,6 +2230,7 @@
 <translation id="4116663294526079822">Auf dieser Website immer zulassen</translation>
 <translation id="411666854932687641">Privater Speicher</translation>
 <translation id="4118990158415604803">Die Möglichkeit einer Verbindung zu anderen Netzwerken wurde von Ihrem Administrator deaktiviert.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{und 1 weiteres}other{und # weitere}}</translation>
 <translation id="4119828560634133962">Werbeaktionen für Druckvorschauregistrierung</translation>
 <translation id="4120329147617730038">Ein Administrator hat die Mehrfachanmeldung für <ph name="USER_EMAIL" /> deaktiviert.
 Alle Nutzer müssen sich abmelden, um fortfahren zu können.</translation>
@@ -2367,9 +2370,11 @@
 <translation id="4345703751611431217">Softwareinkompatibilität: weitere Informationen</translation>
 <translation id="4348766275249686434">Fehler erfassen</translation>
 <translation id="4350019051035968019">Dieses Gerät kann nicht in der Domain registriert werden, zu der Ihr Konto gehört, weil das Gerät für die Verwaltung in einer anderen Domain gekennzeichnet wurde.</translation>
+<translation id="4354806558096370704">Aktiviert die Verwendung des nativen CUPS-Druck-Back-Ends.</translation>
 <translation id="4358697938732213860">Adresse hinzufügen</translation>
 <translation id="4359408040881008151">Wurde aufgrund der abhängigen Erweiterungen installiert</translation>
 <translation id="4361190688154226069">Zielbestimmung in Ansichten mithilfe von Rechtecken</translation>
+<translation id="4364414793200746179">Android MediaStyle-Benachrichtigung</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> heruntergeladen</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> hat ein Fenster freigegeben.</translation>
 <translation id="4364830672918311045">Benachrichtigungen einblenden</translation>
@@ -2770,6 +2775,7 @@
 <translation id="4988792151665380515">Öffentlicher Schlüssel konnte nicht exportiert werden.</translation>
 <translation id="49896407730300355">&amp;Gegen den Uhrzeigersinn drehen</translation>
 <translation id="4989966318180235467">&amp;Hintergrundseite prüfen</translation>
+<translation id="4990343175649730969">Chrome Software Cleaner herunterladen</translation>
 <translation id="4991420928586866460">Tasten in der obersten Reihe als Funktionstasten behandeln</translation>
 <translation id="499165176004408815">Modus mit hohem Kontrast verwenden</translation>
 <translation id="4992066212339426712">Stummschaltung aufheben</translation>
@@ -3291,6 +3297,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: zum Bearbeiten auswählen</translation>
 <translation id="5741454054957165976">Neue Version des User-Agent-Eingriffs zum Laden von WebFonts aktivieren.</translation>
 <translation id="574392208103952083">Mittel</translation>
+<translation id="5744368829843057748">Translate-Oberfläche 2016Q2</translation>
 <translation id="5745056705311424885">USB-Speicherstick gefunden</translation>
 <translation id="5746169159649715125">Als PDF speichern</translation>
 <translation id="5747611503456050045">Durch ein vertikales Überscrollen von Inhalten ausgelöste Seitenaktualisierungen.</translation>
@@ -3398,6 +3405,7 @@
 <translation id="5884474295213649357">Dieser Tab ist mit einem USB-Gerät verbunden.</translation>
 <translation id="5885324376209859881">Medieneinstellungen verwalten...</translation>
 <translation id="5889282057229379085">Maximal zulässige Anzahl an Zwischenzertifizierungsstellen: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Sagen Sie uns, was los ist.</translation>
 <translation id="5892290200158927959">Französische Bépo-Tastatur</translation>
 <translation id="5892507820957994680">Überschreibt die integrierte Software-Rendering-Liste und aktiviert GPU Acceleration auf nicht unterstützten Systemkonfigurationen</translation>
 <translation id="5895138241574237353">Neu starten</translation>
@@ -3539,6 +3547,7 @@
 <translation id="6122093587541546701">E-Mail-Adresse (optional):</translation>
 <translation id="6122875415561139701">Der Schreibvorgang ist auf folgendem Gerät nicht erlaubt: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="6124650939968185064">Die folgenden Erweiterungen hängen von dieser Erweiterung ab:</translation>
+<translation id="6127945163801765632">Aktiviert den Bereich "Alle Lesezeichen" im Lesezeichenmanager.</translation>
 <translation id="6129938384427316298">Kommentar zu Netscape-Zertifikaten</translation>
 <translation id="6129953537138746214">Leerzeichen</translation>
 <translation id="6132383530370527946">Das Kleingedruckte</translation>
@@ -3565,6 +3574,7 @@
 <translation id="6164005077879661055">Durch das Entfernen des betreuten Nutzers werden alle mit ihm verknüpften Dateien und lokalen Daten endgültig gelöscht. Besuchte Websites und Einstellungen des betreuten Nutzers kann der Manager möglicherweise weiterhin unter <ph name="MANAGEMENT_URL" /> einsehen.</translation>
 <translation id="6165508094623778733">Weitere Informationen</translation>
 <translation id="6166185671393271715">Passwörter in Chrome importieren</translation>
+<translation id="6169666352732958425">Der Desktop kann nicht übertragen werden</translation>
 <translation id="6171550060231646388">"Ok Google"-Funktionen für simulierte Hardware</translation>
 <translation id="6175314957787328458">Microsoft-Domain-GUID</translation>
 <translation id="6178664161104547336">Zertifikat auswählen</translation>
@@ -3758,6 +3768,7 @@
 <translation id="6458308652667395253">JavaScript-Blockierung verwalten...</translation>
 <translation id="6459488832681039634">Auswahl suchen</translation>
 <translation id="6460423884798879930">Aktiviert die Option zum Senden zusätzlicher Authentifizierungsinformationen im ersten SYN-Paket für Clients, zu denen bereits eine Verbindung bestand. Dadurch beginnt das Senden der Daten schneller.</translation>
+<translation id="6460474910028274178">Verbesserte Auslöselogik und ansprechenderes Aussehen für die Translate-Ballonoberfläche.</translation>
 <translation id="6460601847208524483">Nächste Übereinstimmung suchen</translation>
 <translation id="6462080265650314920">Für Apps muss der Inhaltstyp "<ph name="CONTENT_TYPE" />" bereitgestellt werden.</translation>
 <translation id="6462082050341971451">Sind Sie noch da?</translation>
@@ -3887,6 +3898,7 @@
 <translation id="6663792236418322902">Das gewählte Passwort wird später zur Wiederherstellung dieser Datei benötigt. Bewahren Sie es an einem sicheren Ort auf.</translation>
 <translation id="6664237456442406323">Ihr Computer wurde mit einer ungültigen Hardware-ID konfiguriert. Daher kann Chrome OS keine aktuellen Sicherheitsupdates installieren und Ihr Computer ist <ph name="BEGIN_BOLD" />möglicherweise anfällig für schädliche Angriffe<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">mit Ihrem Google-Konto</translation>
+<translation id="667517062706956822">Soll Google diese Seite von <ph name="SOURCE_LANGUAGE" /> nach <ph name="TARGET_LANGUAGE" /> übersetzen?</translation>
 <translation id="6675665718701918026">Zeigegerät verbunden</translation>
 <translation id="6677037229676347494">Erwartete ID: "<ph name="EXPECTED_ID" />", tatsächliche ID: "<ph name="NEW_ID" />"</translation>
 <translation id="6680028776254050810">Nutzer wechseln</translation>
@@ -3938,6 +3950,7 @@
 <translation id="6746392203843147041">Lauter</translation>
 <translation id="6748140994595080445">Legen Sie fest, wie <ph name="APP_NAME" /> Sprachen verarbeitet und anzeigt.</translation>
 <translation id="6748465660675848252">Sie können den Vorgang fortsetzen, allerdings werden nur Ihre synchronisierten Daten und Einstellungen wiederhergestellt. Alle lokalen Daten gehen verloren.</translation>
+<translation id="6751256176799620176">1 Ordner ausgewählt</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (anonym)</translation>
 <translation id="6759193508432371551">Zurücksetzen auf Werkseinstellungen</translation>
 <translation id="6760765581316020278">Vietnamesische Tastatur (VNI)</translation>
@@ -4578,6 +4591,7 @@
 <translation id="7717014941119698257">Download wird ausgeführt: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">Zeitüberschreitung beim Training</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262">Zum Überwachen dieses Nutzers <ph name="BEGIN_LINK" />melden Sie sich bei Chrome an<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">Ausschneiden</translation>
 <translation id="7730449930968088409">Inhalt Ihres Bildschirms erfassen</translation>
 <translation id="7730494089396812859">Details der Cloud-Sicherung anzeigen</translation>
@@ -4671,7 +4685,6 @@
 <translation id="7859704718976024901">Browserverlauf</translation>
 <translation id="7861215335140947162">&amp;Downloads</translation>
 <translation id="7864539943188674973">Bluetooth deaktivieren</translation>
-<translation id="7868891395842935202">Aktiviert Experimental Framework, sodass der Zugriff auf API-Experimente überprüft werden kann.</translation>
 <translation id="7870576007982733437">Downloadmanager des Systems sofern möglich verwenden</translation>
 <translation id="7870790288828963061">Es wurden keine Kiosk-Apps mit neuerer Version gefunden. Es sind keine Updates vorhanden. Bitte entfernen Sie den USB-Stick.</translation>
 <translation id="787150342916295244">Kreditkartenscan</translation>
@@ -5000,7 +5013,6 @@
 <translation id="8309505303672555187">Netzwerk auswählen:</translation>
 <translation id="8312871300878166382">In Ordner einfügen</translation>
 <translation id="8314013494437618358">Aufbau mit Thread</translation>
-<translation id="8314576811984836978">Experimental Framework.</translation>
 <translation id="8319414634934645341">Erweiterte Schlüsselverwendung</translation>
 <translation id="8322814362483282060">Diese Seite darf nicht auf Ihr Mikrofon zugreifen.</translation>
 <translation id="8326478304147373412">PKCS #7, Zertifikatkette</translation>
@@ -5061,7 +5073,6 @@
 <translation id="8418240940464873056">Hanja-Modus</translation>
 <translation id="8418445294933751433">Al&amp;s Tab anzeigen</translation>
 <translation id="8420060421540670057">Google Docs-Dateien zeigen</translation>
-<translation id="8420728540268437431">Diese Seite wird gerade übersetzt...</translation>
 <translation id="842274098655511832">WebGL-Erweiterungsentwürfe</translation>
 <translation id="8424039430705546751">Nach unten</translation>
 <translation id="8425213833346101688">Ändern</translation>
@@ -5248,6 +5259,7 @@
 <translation id="8690754533598178758">Die Adobe Flash Player-Mikrofonausnahmen unterscheiden sich von den angegebenen.</translation>
 <translation id="8691686986795184760">(durch Unternehmensrichtlinien aktiviert)</translation>
 <translation id="869257642790614972">Zuletzt geschlossenen Tab öffnen</translation>
+<translation id="8695770993395462321">Natives CUPS</translation>
 <translation id="8695825812785969222">&amp;Adresse öffnen...</translation>
 <translation id="8698464937041809063">Google-Zeichnung</translation>
 <translation id="869884720829132584">Apps-Menü</translation>
@@ -5589,6 +5601,7 @@
 <translation id="9189690067274055051">Entsperren Sie Ihr Smartphone und verringern Sie die Entfernung zu Ihrem <ph name="DEVICE_TYPE" />.</translation>
 <translation id="9190063653747922532">L2TP/IPSec + vorinstallierter Schlüssel</translation>
 <translation id="9201305942933582053">Google Now für Chrome</translation>
+<translation id="9202646163273566462">Aktiviert die Ansicht "Alle Lesezeichen" als Standardziel des Lesezeichenmanagers.</translation>
 <translation id="9203398526606335860">&amp;Profilerstellung aktiviert</translation>
 <translation id="9203478404496196495">Stummschaltung des Tabs aufheben</translation>
 <translation id="9203962528777363226">Der Administrator dieses Geräts hat die Funktion zum Hinzufügen neuer Nutzer deaktiviert.</translation>
@@ -5615,6 +5628,7 @@
 <translation id="939736085109172342">Neuer Ordner</translation>
 <translation id="940425055435005472">Schriftgröße:</translation>
 <translation id="941543339607623937">Ungültiger privater Schlüssel</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{keine}=1{1 App ($1)}=2{2 Apps ($1, $2)}other{# Apps ($1, $2, $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> hat einen Chrome-Tab und Audio freigegeben.</translation>
 <translation id="942954117721265519">Dieses Verzeichnis enthält keine Bilder.</translation>
 <translation id="945522503751344254">Feedback geben</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index 94adf06..cf65ac4 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -294,6 +294,7 @@
 <translation id="1415990189994829608">Η επέκταση <ph name="EXTENSION_NAME" /> (αναγνωριστικό επέκτασης "<ph name="EXTENSION_ID" />") δεν επιτρέπεται σε αυτόν τον τύπο περιόδου σύνδεσης.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Αποτυχία δημιουργίας τυχαίου ιδιωτικού κλειδιού RSA.</translation>
+<translation id="1421115928968836111">Με αυτήν την ενέργεια, θα καταργηθεί η εξουσιοδότηση των αδειών του Flash Player για προστατευμένο περιεχόμενο.</translation>
 <translation id="1425734930786274278">Τα cookie που ακολουθούν αποκλείστηκαν (τα cookie τρίτων μερών αποκλείονται χωρίς εξαιρέσεις):</translation>
 <translation id="1426410128494586442">Ναι</translation>
 <translation id="1427049173708736891">Διατηρήστε τη συσκευή σας <ph name="DEVICE_TYPE" /> ξεκλείδωτη όταν το τηλέφωνο Android σας είναι ξεκλειδωμένο και σε κοντινή απόσταση, ώστε να μην χρειάζεται να πληκτρολογείτε τον κωδικό πρόσβασής σας.</translation>
@@ -523,6 +524,7 @@
 <translation id="1707463636381878959">Κοινή χρήση αυτού του δικτύου με άλλους χρήστες</translation>
 <translation id="1708199901407471282">Κατά το άνοιγμα μιας προτεινόμενης ιστοσελίδας από τη Σελίδα σε νέα καρτέλα, αν η καρτέλα είναι ήδη ανοιχτή για την πρόταση, να γίνεται εναλλαγή σε αυτήν την καρτέλα αντί να φορτώνει η πρόταση σε νέα καρτέλα.</translation>
 <translation id="1708338024780164500">(Ανενεργή)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (Αναγνωριστικό: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Αποτυχία συμπίεσης, μη αναμενόμενο σφάλμα: $1</translation>
 <translation id="1715941336038158809">Μη έγκυρο όνομα χρήση ή κωδικός πρόσβασης.</translation>
 <translation id="1717733954209022288">Πλαίσιο ελέγχου αποθήκευσης κάρτας Google Payments</translation>
@@ -801,6 +803,7 @@
 <translation id="2168214441502403371">Πληκτρολόγιο Περσικών</translation>
 <translation id="2168725742002792683">Επεκτάσεις αρχείων</translation>
 <translation id="2169062631698640254">Σύνδεση</translation>
+<translation id="2175042898143291048">Να γίνεται πάντα</translation>
 <translation id="2175607476662778685">Γραμμή γρήγορης εκκίνησης</translation>
 <translation id="2176045495080708525">Εγκαταστάθηκαν οι εξής επεκτάσεις:</translation>
 <translation id="2177950615300672361">Καρτέλα ανώνυμης περιήγησης: <ph name="TAB_NAME" /></translation>
@@ -1945,7 +1948,6 @@
 <translation id="3688507211863392146">Εγγραφή σε αρχεία και φακέλους που ανοίγετε στην εφαρμογή</translation>
 <translation id="3688526734140524629">Αλλαγή καναλιού</translation>
 <translation id="3688578402379768763">Ενημερωμένη</translation>
-<translation id="3690976161240450479">Αποτυχία σύνδεσης. Επικοινωνήστε με τον διαχειριστή σας ή προσπαθήστε ξανά.</translation>
 <translation id="3693415264595406141">Κωδικός πρόσβασης:</translation>
 <translation id="3694027410380121301">Επιλογή Προηγούμενης Καρτέλας</translation>
 <translation id="3694678678240097321">Να απαιτείται η συγκατάθεση του χρήστη για μια επέκταση που εκτελεί ένα σενάριο στη σελίδα, εάν η επέκταση ζήτησε άδεια να εκτελείται σε όλες τις διευθύνσεις URL.</translation>
@@ -2242,6 +2244,7 @@
 <translation id="4116663294526079822">Να επιτρέπεται πάντα σε αυτόν τον ιστότοπο</translation>
 <translation id="411666854932687641">Ιδιωτική μνήμη</translation>
 <translation id="4118990158415604803">Η σύνδεση με άλλα δίκτυα έχει απενεργοποιηθεί από το διαχειριστή σας.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{και άλλο 1 άτομο}other{και άλλα # άτομα}}</translation>
 <translation id="4119828560634133962">Προωθήσεις εγγραφής προεπισκόπησης εκτύπωσης</translation>
 <translation id="4120329147617730038">Ένας διαχειριστής δεν επιτρέπει την πολλαπλή σύνδεση για το χρήστη <ph name="USER_EMAIL" />.
 Όλοι οι χρήστες πρέπει να αποσυνδεθούν για να συνεχίσετε.</translation>
@@ -2381,9 +2384,11 @@
 <translation id="4345703751611431217">Ασυμβατότητα λογισμικού: Μάθετε περισσότερα</translation>
 <translation id="4348766275249686434">Συλλογή σφαλμάτων</translation>
 <translation id="4350019051035968019">Δεν είναι δυνατή η εγγραφή αυτής της συσκευής στον τομέα στον οποίο ανήκει ο λογαριασμός σας, επειδή η συσκευή έχει επισημανθεί για διαχείριση από κάποιον άλλο τομέα.</translation>
+<translation id="4354806558096370704">Επιτρέπει τη χρήση του εγγενούς υπόβαθρου εκτύπωσης CUPS.</translation>
 <translation id="4358697938732213860">Προσθήκη διεύθυνσης</translation>
 <translation id="4359408040881008151">Εγκαταστάθηκε λόγω των εξαρτώμενων επεκτάσεων</translation>
 <translation id="4361190688154226069">Στόχευση σε σχήμα ορθογωνίου στις προβολές</translation>
+<translation id="4364414793200746179">Ειδοποίηση MediaStyle του Android</translation>
 <translation id="4364444725319685468">Έγινε λήψη του αρχείου <ph name="FILE_NAME" /></translation>
 <translation id="4364567974334641491">Η εφαρμογή <ph name="APP_NAME" /> μοιράζεται ένα παράθυρο.</translation>
 <translation id="4364830672918311045">Εμφάνιση ειδοποιήσεων</translation>
@@ -2789,6 +2794,7 @@
 <translation id="4988792151665380515">Αποτυχία εξαγωγής δημόσιου κλειδιού.</translation>
 <translation id="49896407730300355">Περιστροφή προς τα &amp;αριστερά</translation>
 <translation id="4989966318180235467">Έλεγχος &amp;σελίδας παρασκηνίου</translation>
+<translation id="4990343175649730969">Λήψη του Εργαλείου καθαρισμού του Chrome</translation>
 <translation id="4991420928586866460">Χρήση πλήκτρων πρώτης σειράς ως πλήκτρων ενεργειών</translation>
 <translation id="499165176004408815">Χρήση λειτουργίας υψηλής αντίθεσης</translation>
 <translation id="4992066212339426712">Κατάργηση σίγασης</translation>
@@ -3316,6 +3322,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: επιλέξτε για επεξεργασία</translation>
 <translation id="5741454054957165976">Ενεργοποίηση της νέας έκδοσης παρέμβασης παράγοντα χρήστη για τη φόρτωση γραμματοσειρών ιστού.</translation>
 <translation id="574392208103952083">Μέτριο</translation>
+<translation id="5744368829843057748">Μετάφραση διεπαφής χρήστη 2016Q2</translation>
 <translation id="5745056705311424885">Εντοπίστηκε συσκευή αποθήκευσης USB</translation>
 <translation id="5746169159649715125">Αποθήκευση ως PDF</translation>
 <translation id="5747611503456050045">Επαναλήψεις φόρτωσης σελίδας που προκαλούνται από περιεχόμενο κάθετης πλήρους κύλισης.</translation>
@@ -3423,6 +3430,7 @@
 <translation id="5884474295213649357">Αυτή η καρτέλα είναι συνδεδεμένη σε μια συσκευή USB.</translation>
 <translation id="5885324376209859881">Διαχείριση ρυθμίσεων μέσων…</translation>
 <translation id="5889282057229379085">Μέγιστος αριθμός ενδιάμεσων CA: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Πείτε μας τι συμβαίνει.</translation>
 <translation id="5892290200158927959">Πληκτρολόγιο BÉPO Γαλλικών</translation>
 <translation id="5892507820957994680">Παρακάμπτει τη λίστα απόδοσης ενσωματωμένου λογισμικού και επιτρέπει την επιτάχυνση GPU σε μη υποστηριζόμενες διαμορφώσεις συστημάτων.</translation>
 <translation id="5895138241574237353">Επανεκκίνηση</translation>
@@ -3564,6 +3572,7 @@
 <translation id="6122093587541546701">Διεύθυνση ηλεκτρονικού ταχυδρομείου (προαιρετικά):</translation>
 <translation id="6122875415561139701">Η λειτουργία εγγραφής δεν επιτρέπεται στη συσκευή: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="6124650939968185064">Οι ακόλουθες επεκτάσεις εξαρτώνται από αυτήν την επέκταση:</translation>
+<translation id="6127945163801765632">Ενεργοποίηση ενότητας "όλοι οι σελιδοδείκτες" στη διαχείριση σελιδοδεικτών.</translation>
 <translation id="6129938384427316298">Σχόλιο πιστοποιητικού Netscape</translation>
 <translation id="6129953537138746214">Κενό</translation>
 <translation id="6132383530370527946">Τα "ψιλά γράμματα"</translation>
@@ -3590,6 +3599,7 @@
 <translation id="6164005077879661055">Όλα τα αρχεία και τα τοπικά δεδομένα που σχετίζονται με το χρήστη υπό επίβλεψη θα διαγραφούν οριστικά μόλις καταργηθεί ο χρήστης υπό επίβλεψη. Οι ιστοσελίδες που έχει επισκεφτεί και οι ρυθμίσεις που έχει επιλέξει ενδεχομένως να εξακολουθούν να εμφανίζονται στο διαχειριστή στη διεύθυνση <ph name="MANAGEMENT_URL" /> .</translation>
 <translation id="6165508094623778733">Μάθετε περισσότερα</translation>
 <translation id="6166185671393271715">Εισαγωγή κωδικών πρόσβασης στο Chrome</translation>
+<translation id="6169666352732958425">Αδυναμία μετάδοσης επιφάνειας εργασίας.</translation>
 <translation id="6171550060231646388">Προσομοιωμένες λειτουργίες "Ok Google" εξοπλισμού</translation>
 <translation id="6175314957787328458">Microsoft Domain GUID</translation>
 <translation id="6178664161104547336">Επιλογή πιστοποιητικού</translation>
@@ -3783,6 +3793,7 @@
 <translation id="6458308652667395253">Διαχείριση αποκλεισμού JavaScript...</translation>
 <translation id="6459488832681039634">Χρήση Επιλογής για Εύρεση</translation>
 <translation id="6460423884798879930">Ενεργοποιήστε την επιλογή για να αποστείλετε επιπλέον πληροφορίες ελέγχου ταυτότητας στο αρχικό πακέτο SYN για έναν πρώην συνδεδεμένο πελάτη, επιτρέποντας την ταχύτερη έναρξη αποστολής δεδομένων.</translation>
+<translation id="6460474910028274178">Βελτιωμένη λογική ενεργοποίησης και αναζήτηση Μετάφρασης διεπαφής χρήστη Bubble</translation>
 <translation id="6460601847208524483">Εύρεση επόμενου</translation>
 <translation id="6462080265650314920">Οι εφαρμογές θα πρέπει να προβάλλονται με τον τύπο περιεχομένου "<ph name="CONTENT_TYPE" />".</translation>
 <translation id="6462082050341971451">Είστε ακόμα εκεί;</translation>
@@ -3912,6 +3923,7 @@
 <translation id="6663792236418322902">Ο κωδικός που επιλέγετε θα χρειαστεί αργότερα για την επαναφορά αυτού του αρχείου. Καταγράψτε τον σε ασφαλές μέρος.</translation>
 <translation id="6664237456442406323">Δυστυχώς, ο υπολογιστής σας έχει διαμορφωθεί με ένα εσφαλμένο αναγνωριστικό υλικού. Αυτό παρεμποδίζει την ενημέρωση του Chrome OS με τις πιο πρόσφατες επιδιορθώσεις ασφαλείας και ο υπολογιστής σας <ph name="BEGIN_BOLD" />ενδέχεται να είναι ευάλωτος σε κακόβουλες επιθέσεις<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">με τον Λογαριασμός σας Google</translation>
+<translation id="667517062706956822">Θέλετε να μεταφράσει η Google αυτήν τη σελίδα από <ph name="SOURCE_LANGUAGE" /> σε <ph name="TARGET_LANGUAGE" />;</translation>
 <translation id="6675665718701918026">Η συσκευή κατάδειξης είναι συνδεδεμένη</translation>
 <translation id="6677037229676347494">Αναμενόταν το αναγνωριστικό "<ph name="EXPECTED_ID" />", ωστόσο το αναγνωριστικό ήταν το "<ph name="NEW_ID" />".</translation>
 <translation id="6680028776254050810">Εναλλαγή χρηστών</translation>
@@ -3963,6 +3975,7 @@
 <translation id="6746392203843147041">αύξηση έντασης</translation>
 <translation id="6748140994595080445">Αλλάζει τον τρόπο διαχείρισης και προβολής γλωσσών από το <ph name="APP_NAME" />.</translation>
 <translation id="6748465660675848252">Μπορείτε να συνεχίσετε, αλλά μόνο τα συγχρονισμένα δεδομένα και οι ρυθμίσεις σας θα αποκατασταθούν. Όλα τα τοπικά δεδομένα θα χαθούν.</translation>
+<translation id="6751256176799620176">Επιλέχθηκε 1 φάκελος</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Ανώνυμη περιήγηση)</translation>
 <translation id="6759193508432371551">Επαναφορά εργοστασιακών ρυθμίσεων</translation>
 <translation id="6760765581316020278">Πληκτρολόγιο Βιετναμικών (VNI)</translation>
@@ -4608,6 +4621,7 @@
 <translation id="7717014941119698257">Λήψη: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">Το χρονικό όριο για την εκπαίδευση έληξε</translation>
 <translation id="771953673318695590">Εγγύηση Ποιότητας</translation>
+<translation id="7720375555307821262">Προκειμένου να επιβλέπετε αυτό το άτομο, <ph name="BEGIN_LINK" />συνδεθείτε στο Chrome<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">Αποκοπή</translation>
 <translation id="7730449930968088409">Εγγραφή του περιεχομένου της οθόνης σας</translation>
 <translation id="7730494089396812859">Εμφάνιση λεπτομερειών αντιγράφου ασφαλείας στο cloud</translation>
@@ -4701,7 +4715,6 @@
 <translation id="7859704718976024901">Ιστορικό περιήγησης</translation>
 <translation id="7861215335140947162">&amp;Λήψεις</translation>
 <translation id="7864539943188674973">Απενεργοποίηση Bluetooth</translation>
-<translation id="7868891395842935202">Ενεργοποιεί το Πειραματικό πλαίσιο εργασίας για τον έλεγχο της πρόσβασης σε πειράματα API.</translation>
 <translation id="7870576007982733437">Να γίνεται χρήση της λειτουργίας διαχείρισης λήψεων συστήματος, όπου υπάρχει αυτή η δυνατότητα.</translation>
 <translation id="7870790288828963061">Δεν βρέθηκαν εφαρμογές kiosk με νεότερη έκδοση. Δεν υπάρχουν στοιχεία προς ενημέρωση. Αφαιρέστε τη συσκευή USB.</translation>
 <translation id="787150342916295244">Σάρωση πιστωτικής κάρτας</translation>
@@ -5034,7 +5047,6 @@
 <translation id="8309505303672555187">Επιλέξτε δίκτυο:</translation>
 <translation id="8312871300878166382">Επικόλληση στο φάκελο</translation>
 <translation id="8314013494437618358">Σύνθεση σε μορφή νήματος</translation>
-<translation id="8314576811984836978">Πειραματικό πλαίσιο εργασίας.</translation>
 <translation id="8319414634934645341">Εκτεταμένη χρήση κλειδιού</translation>
 <translation id="8322814362483282060">Αυτή η σελίδα δεν έχει πρόσβαση στο μικρόφωνό σας.</translation>
 <translation id="8326478304147373412">PKCS #7, αλυσίδα πιστοποιητικού</translation>
@@ -5095,7 +5107,6 @@
 <translation id="8418240940464873056">Λειτουργία Χάντζα</translation>
 <translation id="8418445294933751433">&amp;Εμφάνιση ως καρτέλα</translation>
 <translation id="8420060421540670057">Εμφάνιση αρχείων Εγγράφων Google</translation>
-<translation id="8420728540268437431">Γίνεται μετάφραση αυτής της σελίδας…</translation>
 <translation id="842274098655511832">Πρόχειρες επεκτάσεις WebGL</translation>
 <translation id="8424039430705546751">κάτω</translation>
 <translation id="8425213833346101688">Αλλαγή</translation>
@@ -5284,6 +5295,7 @@
 <translation id="8690754533598178758">Οι εξαιρέσεις Adobe Flash Player μικροφώνου είναι διαφορετικές.</translation>
 <translation id="8691686986795184760">(Ενεργοποιημένη λόγω πολιτικής επιχείρησης)</translation>
 <translation id="869257642790614972">Εκ νέου άνοιγμα της καρτέλας που έκλεισε τελευταία</translation>
+<translation id="8695770993395462321">Εγγενές CUPS</translation>
 <translation id="8695825812785969222">Άνοιγμα τοποθεσίας...</translation>
 <translation id="8698464937041809063">Σχέδιο Google</translation>
 <translation id="869884720829132584">Μενού εφαρμογών</translation>
@@ -5626,6 +5638,7 @@
 <translation id="9189690067274055051">Πλησιάστε το τηλέφωνό σας στο <ph name="DEVICE_TYPE" /> για εισαγωγή.</translation>
 <translation id="9190063653747922532">L2TP/IPsec + ήδη κοινόχρηστο κλειδί</translation>
 <translation id="9201305942933582053">Google Now για το Chrome!</translation>
+<translation id="9202646163273566462">Ενεργοποιεί την προβολή όλων των σελιδοδεικτών ως προεπιλεγμένου προορισμού της διαχείρισης σελιδοδεικτών.</translation>
 <translation id="9203398526606335860">Ενεργοποιημένη &amp;δυνατότητα δημιουργίας προφίλ</translation>
 <translation id="9203478404496196495">Κατάργηση σίγασης καρτέλας</translation>
 <translation id="9203962528777363226">Ο διαχειριστής αυτής της συσκευής έχει απενεργοποιήσει την προσθήκη νέων χρηστών</translation>
@@ -5652,6 +5665,7 @@
 <translation id="939736085109172342">Νέος φάκελος</translation>
 <translation id="940425055435005472">Μέγεθος γραμματοσειράς:</translation>
 <translation id="941543339607623937">Μη έγκυρο ιδιωτικό κλειδί.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{καμία}=1{1 εφαρμογή ($1)}=2{2 εφαρμογές ($1, $2)}other{# εφαρμογές ($1, $2, $3)}}</translation>
 <translation id="942532530371314860">Η εφαρμογή <ph name="APP_NAME" /> μοιράζεται μια καρτέλα Chrome και ήχο.</translation>
 <translation id="942954117721265519">Δεν υπάρχουν εικόνες σε αυτόν τον κατάλογο.</translation>
 <translation id="945522503751344254">Αποστολή σχολίων</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index cde9b1f5..6ded086 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (extension ID "<ph name="EXTENSION_ID" />") is not allowed in this type of session.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Yikes! Failed to generate random RSA private key.</translation>
+<translation id="1421115928968836111">This will deauthorise Flash Player licenses for protected content.</translation>
 <translation id="1425734930786274278">The following cookies were blocked (third-party cookies are being blocked without exception):</translation>
 <translation id="1426410128494586442">Yes</translation>
 <translation id="1427049173708736891">Keep your <ph name="DEVICE_TYPE" /> unlocked when your Android phone is unlocked and nearby – no need to type your password.</translation>
@@ -522,6 +523,7 @@
 <translation id="1707463636381878959">Share this network with other users</translation>
 <translation id="1708199901407471282">When opening a suggested webpage from the New Tab Page, if a tab is already open for the suggestion, switch to that one instead of loading the suggestion in the new tab.</translation>
 <translation id="1708338024780164500">(Inactive)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Zipping failed, unexpected error: $1</translation>
 <translation id="1715941336038158809">Invalid user name or password.</translation>
 <translation id="1717733954209022288">Google Payments card saving tick box</translation>
@@ -799,6 +801,7 @@
 <translation id="2168214441502403371">Persian keyboard</translation>
 <translation id="2168725742002792683">File extensions</translation>
 <translation id="2169062631698640254">Sign in anyway</translation>
+<translation id="2175042898143291048">Always do this</translation>
 <translation id="2175607476662778685">Quick launch bar</translation>
 <translation id="2176045495080708525">The following extensions are now installed:</translation>
 <translation id="2177950615300672361">Incognito Tab: <ph name="TAB_NAME" /></translation>
@@ -1937,7 +1940,6 @@
 <translation id="3688507211863392146">Write to files and folders that you open in the application</translation>
 <translation id="3688526734140524629">Change channel</translation>
 <translation id="3688578402379768763">Up-to-date</translation>
-<translation id="3690976161240450479">Sign-in failed. Please contact your administrator or try again.</translation>
 <translation id="3693415264595406141">Password:</translation>
 <translation id="3694027410380121301">Select Previous Tab</translation>
 <translation id="3694678678240097321">Require user consent for an extension running a script on the page, if the extension requested permission to run on all URLs.</translation>
@@ -2233,6 +2235,7 @@
 <translation id="4116663294526079822">Always allow on this site</translation>
 <translation id="411666854932687641">Private Memory</translation>
 <translation id="4118990158415604803">Connecting to other networks is disabled by your administrator.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{and 1 more}other{and # more}}</translation>
 <translation id="4119828560634133962">Print Preview Registration Promos</translation>
 <translation id="4120329147617730038">An administrator has disallowed multiple sign-in for <ph name="USER_EMAIL" />.
 All users must sign out to continue.</translation>
@@ -2372,9 +2375,11 @@
 <translation id="4345703751611431217">Software incompatibility: Learn more</translation>
 <translation id="4348766275249686434">Collect errors</translation>
 <translation id="4350019051035968019">This device cannot be enrolled to the domain that your account belongs to because the device is marked for management by a different domain.</translation>
+<translation id="4354806558096370704">Enables the use of the native CUPS printing backend.</translation>
 <translation id="4358697938732213860">Add an address</translation>
 <translation id="4359408040881008151">Installed because of dependent extension(s).</translation>
 <translation id="4361190688154226069">Rect-based targeting in views</translation>
+<translation id="4364414793200746179">Android MediaStyle notification</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> downloaded</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> is sharing a window.</translation>
 <translation id="4364830672918311045">Display notifications</translation>
@@ -2778,6 +2783,7 @@
 <translation id="4988792151665380515">Failed to export public key.</translation>
 <translation id="49896407730300355">Rotate a&amp;nti-clockwise</translation>
 <translation id="4989966318180235467">Inspect &amp;background page</translation>
+<translation id="4990343175649730969">Download Chrome Clean-Up Tool</translation>
 <translation id="4991420928586866460">Treat top-row keys as function keys</translation>
 <translation id="499165176004408815">Use high contrast mode</translation>
 <translation id="4992066212339426712">Unmute</translation>
@@ -3301,6 +3307,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: select to edit</translation>
 <translation id="5741454054957165976">Enable new version of User Agent Intervention for WebFonts loading.</translation>
 <translation id="574392208103952083">Medium</translation>
+<translation id="5744368829843057748">Translate 2016Q2 UI</translation>
 <translation id="5745056705311424885">USB memory stick detected</translation>
 <translation id="5746169159649715125">Save as PDF</translation>
 <translation id="5747611503456050045">Page reloads triggered by vertically over-scrolling content.</translation>
@@ -3408,6 +3415,7 @@
 <translation id="5884474295213649357">This tab is connected to a USB device.</translation>
 <translation id="5885324376209859881">Manage media settings...</translation>
 <translation id="5889282057229379085">Maximum number of intermediate CAs: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Tell us what's happening.</translation>
 <translation id="5892290200158927959">French BÉPO keyboard</translation>
 <translation id="5892507820957994680">Overrides the built-in software rendering list and enables GPU acceleration on unsupported system configurations.</translation>
 <translation id="5895138241574237353">Restart</translation>
@@ -3551,6 +3559,7 @@
 <translation id="6122093587541546701">Email (optional):</translation>
 <translation id="6122875415561139701">Write operation is not permitted on: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="6124650939968185064">The following extensions depend on this extension:</translation>
+<translation id="6127945163801765632">Enable "all bookmarks" section in bookmark manager.</translation>
 <translation id="6129938384427316298">Netscape Certificate Comment</translation>
 <translation id="6129953537138746214">Space</translation>
 <translation id="6132383530370527946">The small print</translation>
@@ -3577,6 +3586,7 @@
 <translation id="6164005077879661055">All files and local data associated with the supervised user will be permanently deleted once this supervised user is removed. Visited websites and settings for this supervised user may still be visible by the manager at <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Learn more</translation>
 <translation id="6166185671393271715">Import Passwords To Chrome</translation>
+<translation id="6169666352732958425">Unable to cast desktop.</translation>
 <translation id="6171550060231646388">Simulated hardware 'OK Google' features</translation>
 <translation id="6175314957787328458">Microsoft Domain GUID</translation>
 <translation id="6178664161104547336">Select a certificate</translation>
@@ -3770,6 +3780,7 @@
 <translation id="6458308652667395253">Manage JavaScript blocking...</translation>
 <translation id="6459488832681039634">Use Selection for Find</translation>
 <translation id="6460423884798879930">Enable the option to send extra authentication information in the initial SYN packet for a previously connected client, allowing faster data send start.</translation>
+<translation id="6460474910028274178">Improved triggering logic and look for Translate Bubble UI</translation>
 <translation id="6460601847208524483">Find Next</translation>
 <translation id="6462080265650314920">Apps must be served with content-type "<ph name="CONTENT_TYPE" />".</translation>
 <translation id="6462082050341971451">Are you still there?</translation>
@@ -3899,6 +3910,7 @@
 <translation id="6663792236418322902">The password that you choose will be required to restore this file later. Please record it in a safe location.</translation>
 <translation id="6664237456442406323">Unfortunately, your computer is configured with a malformed hardware ID. This prevents Chrome OS from updating with the latest security fixes and your computer <ph name="BEGIN_BOLD" />may be vulnerable to malicious attacks<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">with your Google Account</translation>
+<translation id="667517062706956822">Do you want Google to translate this page from <ph name="SOURCE_LANGUAGE" /> to <ph name="TARGET_LANGUAGE" />?</translation>
 <translation id="6675665718701918026">Pointing device connected</translation>
 <translation id="6677037229676347494">Expected ID "<ph name="EXPECTED_ID" />", but ID was "<ph name="NEW_ID" />".</translation>
 <translation id="6680028776254050810">Change Users</translation>
@@ -3950,6 +3962,7 @@
 <translation id="6746392203843147041">vol. up</translation>
 <translation id="6748140994595080445">Change how <ph name="APP_NAME" /> handles and displays languages.</translation>
 <translation id="6748465660675848252">You may proceed, but only your synced data and settings will be restored. All local data will be lost.</translation>
+<translation id="6751256176799620176">1 folder selected</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Incognito)</translation>
 <translation id="6759193508432371551">Factory reset</translation>
 <translation id="6760765581316020278">Vietnamese keyboard (VNI)</translation>
@@ -4591,6 +4604,7 @@
 <translation id="7717014941119698257">Downloading: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">Training timed out</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262">To supervise this person, <ph name="BEGIN_LINK" />sign in to Chrome<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">Cut</translation>
 <translation id="7730449930968088409">Capture content of your screen</translation>
 <translation id="7730494089396812859">Show Cloud backup details</translation>
@@ -4684,7 +4698,6 @@
 <translation id="7859704718976024901">Browsing history</translation>
 <translation id="7861215335140947162">&amp;Downloads</translation>
 <translation id="7864539943188674973">Disable Bluetooth</translation>
-<translation id="7868891395842935202">Enables the Experimental Framework for controlling access to API experiments.</translation>
 <translation id="7870576007982733437">Use system download manager when applicable.</translation>
 <translation id="7870790288828963061">No Kiosk apps with newer version found. Nothing to update. Please remove the USB stick.</translation>
 <translation id="787150342916295244">Credit card scanning</translation>
@@ -5015,7 +5028,6 @@
 <translation id="8309505303672555187">Select a network:</translation>
 <translation id="8312871300878166382">Paste into folder</translation>
 <translation id="8314013494437618358">Threaded compositing</translation>
-<translation id="8314576811984836978">Experimental Framework.</translation>
 <translation id="8319414634934645341">Extended Key Usage</translation>
 <translation id="8322814362483282060">This page has been blocked from accessing your microphone.</translation>
 <translation id="8326478304147373412">PKCS #7, certificate chain</translation>
@@ -5076,7 +5088,6 @@
 <translation id="8418240940464873056">Hanja mode</translation>
 <translation id="8418445294933751433">&amp;Show as tab</translation>
 <translation id="8420060421540670057">Show Google Docs files</translation>
-<translation id="8420728540268437431">This page is being translated ...</translation>
 <translation id="842274098655511832">WebGL Draft Extensions</translation>
 <translation id="8424039430705546751">down</translation>
 <translation id="8425213833346101688">Change</translation>
@@ -5263,6 +5274,7 @@
 <translation id="8690754533598178758">Adobe Flash Player microphone exceptions are different.</translation>
 <translation id="8691686986795184760">(Enabled by enterprise policy)</translation>
 <translation id="869257642790614972">Reopen last closed tab</translation>
+<translation id="8695770993395462321">Native CUPS</translation>
 <translation id="8695825812785969222">Open &amp;Location...</translation>
 <translation id="8698464937041809063">Google drawing</translation>
 <translation id="869884720829132584">Applications menu</translation>
@@ -5605,6 +5617,7 @@
 <translation id="9189690067274055051">Unlock your phone and bring it closer to your <ph name="DEVICE_TYPE" /> to enter.</translation>
 <translation id="9190063653747922532">L2TP/IPSec + Preshared key</translation>
 <translation id="9201305942933582053">Google Now for Chrome!</translation>
+<translation id="9202646163273566462">Enables the "all bookmarks" view as the default destination of the bookmark manager.</translation>
 <translation id="9203398526606335860">&amp;Profiling enabled</translation>
 <translation id="9203478404496196495">Unmute tab</translation>
 <translation id="9203962528777363226">The administrator of this device has disabled new users from being added</translation>
@@ -5631,6 +5644,7 @@
 <translation id="939736085109172342">New folder</translation>
 <translation id="940425055435005472">Font size:</translation>
 <translation id="941543339607623937">Invalid private key.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{none}=1{1 app ($1)}=2{2 apps ($1, $2)}other{# apps ($1, $2, $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> is sharing a Chrome tab and audio.</translation>
 <translation id="942954117721265519">No images in this directory.</translation>
 <translation id="945522503751344254">Send feedback</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index be3366b9..741427c 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608">No se permite <ph name="EXTENSION_NAME" /> (ID de extensión "<ph name="EXTENSION_ID" />") en este tipo de sesión.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">¡Ay! Error al generar clave privada RSA aleatoria.</translation>
+<translation id="1421115928968836111">Esta opción anulará la autorización de las licencias de Flash Player para el contenido protegido.</translation>
 <translation id="1425734930786274278">Se bloquearon las siguientes cookies (las cookies de terceros se bloquean sin excepción):</translation>
 <translation id="1426410128494586442">Sí</translation>
 <translation id="1427049173708736891">Mantén el dispositivo <ph name="DEVICE_TYPE" /> desbloqueado cuando el teléfono Android se encuentre cerca y desbloqueado; no es necesario escribir la contraseña.</translation>
@@ -518,6 +519,7 @@
 <translation id="1707463636381878959">Compartir esta red con otros usuarios</translation>
 <translation id="1708199901407471282">Cuando se abre una sugerencia de la página Nueva pestaña, si ya hay una pestaña abierta para la sugerencia, se usa esa en lugar de cargar la sugerencia en la nueva pestaña.</translation>
 <translation id="1708338024780164500">(Inactiva)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Se produjo un error inesperado al comprimir $1.</translation>
 <translation id="1715941336038158809">Nombre de usuario o contraseña no válidos</translation>
 <translation id="1717733954209022288">Casilla de verificación para guardar tarjetas de Google Payments</translation>
@@ -794,6 +796,7 @@
 <translation id="2168214441502403371">Teclado persa</translation>
 <translation id="2168725742002792683">Extensiones de archivo</translation>
 <translation id="2169062631698640254">Acceder de todos modos</translation>
+<translation id="2175042898143291048">Realizar siempre esta acción</translation>
 <translation id="2175607476662778685">Barra de inicio rápido</translation>
 <translation id="2176045495080708525">Las siguientes extensiones ya están instaladas:</translation>
 <translation id="2177950615300672361">Pestaña de incógnito: <ph name="TAB_NAME" /></translation>
@@ -1933,7 +1936,6 @@
 <translation id="3688507211863392146">Escribir en archivos y carpetas que abras en la aplicación</translation>
 <translation id="3688526734140524629">Cambiar canal</translation>
 <translation id="3688578402379768763">Actualizado</translation>
-<translation id="3690976161240450479">Se produjo un error de acceso. Comunícate con el administrador o vuelve a intentarlo.</translation>
 <translation id="3693415264595406141">Contraseña:</translation>
 <translation id="3694027410380121301">Seleccionar la pestaña anterior</translation>
 <translation id="3694678678240097321">Requiere el consentimiento del usuario para utilizar una extensión que ejecuta una secuencia de comandos en la página si la extensión solicitó permiso para ejecutarse en todas las URL.</translation>
@@ -2229,6 +2231,7 @@
 <translation id="4116663294526079822">Permitir siempre en este sitio</translation>
 <translation id="411666854932687641">Memoria privada</translation>
 <translation id="4118990158415604803">El administrador inhabilitó la conexión a otras redes.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{y 1 más}other{y # más}}</translation>
 <translation id="4119828560634133962">Promociones de registro a la vista previa de impresión</translation>
 <translation id="4120329147617730038">Un administrador inhabilitó el acceso múltiple para <ph name="USER_EMAIL" />.
 Todos los usuarios deben salir de sus cuentas para continuar.</translation>
@@ -2368,9 +2371,11 @@
 <translation id="4345703751611431217">Incompatibilidad de software: más información</translation>
 <translation id="4348766275249686434">Recopilar errores</translation>
 <translation id="4350019051035968019">Este dispositivo no se puede registrar en el dominio al que pertenece tu cuenta porque ya lo administra otro dominio.</translation>
+<translation id="4354806558096370704">Permite el uso del backend de impresión CUPS nativo.</translation>
 <translation id="4358697938732213860">Agregar una dirección</translation>
 <translation id="4359408040881008151">Instalada a causa de las extensiones dependientes</translation>
 <translation id="4361190688154226069">Destino basado en rectángulo en las vistas</translation>
+<translation id="4364414793200746179">Notificación de MediaStyle de Android</translation>
 <translation id="4364444725319685468">Se descargó <ph name="FILE_NAME" />.</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> comparte una ventana.</translation>
 <translation id="4364830672918311045">Mostrar notificaciones</translation>
@@ -2773,6 +2778,7 @@
 <translation id="4988792151665380515">Error al exportar la clave pública.</translation>
 <translation id="49896407730300355">Girar &amp;a la izquierda</translation>
 <translation id="4989966318180235467">Inspeccionar página &amp;de fondo</translation>
+<translation id="4990343175649730969">Descargar la Herramienta para limpiar Chrome</translation>
 <translation id="4991420928586866460">Tratar las teclas de la fila superior como teclas de función</translation>
 <translation id="499165176004408815">Usar el modo de contraste alto</translation>
 <translation id="4992066212339426712">Dejar de silenciar</translation>
@@ -3296,6 +3302,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: seleccionar para editar</translation>
 <translation id="5741454054957165976">Habilita la nueva versión de la intervención usuario-agente para la carga de WebFonts.</translation>
 <translation id="574392208103952083">Mediano</translation>
+<translation id="5744368829843057748">Traducir la interfaz de usuario de 2016Q2</translation>
 <translation id="5745056705311424885">Se detectó una tarjeta de memoria USB.</translation>
 <translation id="5746169159649715125">Guardar como PDF</translation>
 <translation id="5747611503456050045">Recarga de páginas activadas mediante el desplazamiento vertical por el contenido</translation>
@@ -3403,6 +3410,7 @@
 <translation id="5884474295213649357">Esta pestaña está conectada a un dispositivo USB.</translation>
 <translation id="5885324376209859881">Administrar configuración de medios...</translation>
 <translation id="5889282057229379085">Cantidad máxima de certificados intermedios: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Cuéntanos cuál es el problema.</translation>
 <translation id="5892290200158927959">Teclado francés BÉPO</translation>
 <translation id="5892507820957994680">Cancela la lista de renderización de software integrado y habilita la aceleración por GPU en configuraciones de sistemas admitidos.</translation>
 <translation id="5895138241574237353">Reiniciar</translation>
@@ -3544,6 +3552,7 @@
 <translation id="6122093587541546701">Correo electrónico (opcional):</translation>
 <translation id="6122875415561139701">No se permite la operación de escritura en: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="6124650939968185064">Las siguientes extensiones dependen de esta extensión:</translation>
+<translation id="6127945163801765632">Habilita la sección "Todos los marcadores" en el Administrador de marcadores.</translation>
 <translation id="6129938384427316298">Comentario sobre el certificado Netscape</translation>
 <translation id="6129953537138746214">Google Space</translation>
 <translation id="6132383530370527946">La letra pequeña</translation>
@@ -3570,6 +3579,7 @@
 <translation id="6164005077879661055">Todos los archivos y los datos locales asociados al usuario supervisado se eliminarán de forma permanente una vez que se elimine este usuario supervisado. Es posible que el administrador pueda seguir viendo la configuración y los sitios web visitados de este usuario supervisado en <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Más información</translation>
 <translation id="6166185671393271715">Importar contraseñas a Chrome</translation>
+<translation id="6169666352732958425">No se puede transmitir el escritorio.</translation>
 <translation id="6171550060231646388">Funciones "Ok Google" de hardware simulado</translation>
 <translation id="6175314957787328458">GUID de dominio de Microsoft</translation>
 <translation id="6178664161104547336">Seleccionar un certificado</translation>
@@ -3763,6 +3773,7 @@
 <translation id="6458308652667395253">Administrar el bloqueo de JavaScript...</translation>
 <translation id="6459488832681039634">Usar la selección para buscar</translation>
 <translation id="6460423884798879930">Habilita la opción de envío de información adicional de autenticación en el paquete SYN inicial de un cliente conectado anteriormente, lo que permite un inicio más rápido del envío de datos.</translation>
+<translation id="6460474910028274178">Lógica de activación y búsqueda de la interfaz de usuario del cuadro de Traductor mejoradas</translation>
 <translation id="6460601847208524483">Buscar siguiente</translation>
 <translation id="6462080265650314920">Las aplicaciones deben incluir el encabezado content-type "<ph name="CONTENT_TYPE" />".</translation>
 <translation id="6462082050341971451">¿Todavía estás ahí?</translation>
@@ -3892,6 +3903,7 @@
 <translation id="6663792236418322902">La contraseña que selecciones se te pedirá para restablecer este archivo más tarde. Guárdalo en un lugar seguro.</translation>
 <translation id="6664237456442406323">Desafortunadamente, la computadora está configurada con un identificador de hardware incorrecto. Esto impide que el Sistema operativo Chrome se actualice con las últimas correcciones de seguridad, y la computadora <ph name="BEGIN_BOLD" />puede quedar vulnerable a ataques maliciosos<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">con tu Cuenta de Google</translation>
+<translation id="667517062706956822">¿Deseas que Google traduzca esta página de <ph name="SOURCE_LANGUAGE" /> a <ph name="TARGET_LANGUAGE" />?</translation>
 <translation id="6675665718701918026">Dispositivo señalador conectado</translation>
 <translation id="6677037229676347494">Se esperaba un ID "<ph name="EXPECTED_ID" />", pero el ID fue "<ph name="NEW_ID" />".</translation>
 <translation id="6680028776254050810">Cambiar usuario</translation>
@@ -3943,6 +3955,7 @@
 <translation id="6746392203843147041">subir volumen</translation>
 <translation id="6748140994595080445">Cambiar cómo administra y muestra <ph name="APP_NAME" /> los idiomas</translation>
 <translation id="6748465660675848252">Puedes continuar, pero se restaurarán únicamente la configuración y los datos sincronizados. Se perderán todos los datos locales.</translation>
+<translation id="6751256176799620176">1 carpeta seleccionada</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Incógnito)</translation>
 <translation id="6759193508432371551">Restablecer configuración de fábrica</translation>
 <translation id="6760765581316020278">Teclado vietnamita (VNI)</translation>
@@ -4581,6 +4594,7 @@
 <translation id="7717014941119698257">Descargando: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">Se agotó el tiempo de espera para la capacitación.</translation>
 <translation id="771953673318695590">Control de calidad</translation>
+<translation id="7720375555307821262">Para supervisar a esta persona, <ph name="BEGIN_LINK" />accede a Chrome<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">Cortar</translation>
 <translation id="7730449930968088409">Capturar contenido de la pantalla</translation>
 <translation id="7730494089396812859">Mostrar detalles de la copia de seguridad en la nube</translation>
@@ -4674,7 +4688,6 @@
 <translation id="7859704718976024901">Historial de navegación</translation>
 <translation id="7861215335140947162">&amp;Descargas</translation>
 <translation id="7864539943188674973">Desactivar Bluetooth</translation>
-<translation id="7868891395842935202">Habilita el marco experimental para controlar el acceso a los experimentos de API.</translation>
 <translation id="7870576007982733437">Usa el administrador de descargas del sistema (si es posible).</translation>
 <translation id="7870790288828963061">No se encontraron aplicaciones de kiosco con una versión más reciente. No hay nada para actualizar. Desconecta el dispositivo USB.</translation>
 <translation id="787150342916295244">Escaneo de la tarjeta de crédito</translation>
@@ -5003,7 +5016,6 @@
 <translation id="8309505303672555187">Selecciona una red:</translation>
 <translation id="8312871300878166382">Pegar en la carpeta</translation>
 <translation id="8314013494437618358">Composición por subprocesos</translation>
-<translation id="8314576811984836978">Marco experimental</translation>
 <translation id="8319414634934645341">Uso extendido de la clave</translation>
 <translation id="8322814362483282060">Esta página no tiene permiso para acceder al micrófono.</translation>
 <translation id="8326478304147373412">PKCS N. º 7, cadena de certificados</translation>
@@ -5064,7 +5076,6 @@
 <translation id="8418240940464873056">Modo Hanja</translation>
 <translation id="8418445294933751433">Mo&amp;strar como pestaña</translation>
 <translation id="8420060421540670057">Mostrar archivos de Documentos de Google</translation>
-<translation id="8420728540268437431">Traduciendo página…</translation>
 <translation id="842274098655511832">Extensiones de borrador WebGL</translation>
 <translation id="8424039430705546751">abajo</translation>
 <translation id="8425213833346101688">Cambiar</translation>
@@ -5251,6 +5262,7 @@
 <translation id="8690754533598178758">Las excepciones del micrófono de Adobe Flash Player son diferentes.</translation>
 <translation id="8691686986795184760">(Activado por la política de empresa)</translation>
 <translation id="869257642790614972">Vuelve a abrir la última pestaña que se cerró</translation>
+<translation id="8695770993395462321">CUPS nativos</translation>
 <translation id="8695825812785969222">Abrir &amp;ubicación...</translation>
 <translation id="8698464937041809063">Dibujo de Google</translation>
 <translation id="869884720829132584">Menú Aplicaciones</translation>
@@ -5592,6 +5604,7 @@
 <translation id="9189690067274055051">Desbloquea el teléfono y acércalo a tu <ph name="DEVICE_TYPE" /> para acceder.</translation>
 <translation id="9190063653747922532">L2TP/IPsec + clave previamente compartida</translation>
 <translation id="9201305942933582053">Google Now para Chrome</translation>
+<translation id="9202646163273566462">Permite ver todos los marcadores de forma predeterminada en el Administrador de marcadores.</translation>
 <translation id="9203398526606335860">&amp;Perfiles activados</translation>
 <translation id="9203478404496196495">Activar sonido de la pestaña</translation>
 <translation id="9203962528777363226">El administrador de este dispositivo ha inhabilitado a nuevos usuarios para evitar que se agreguen.</translation>
@@ -5618,6 +5631,7 @@
 <translation id="939736085109172342">Nueva carpeta</translation>
 <translation id="940425055435005472">Tamaño de la fuente:</translation>
 <translation id="941543339607623937">Clave privada no válida</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{ninguna}=1{1 app ($1)}=2{2 apps ($1, $2)}other{# apps ($1, $2, $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> comparte una pestaña de Chrome y audio.</translation>
 <translation id="942954117721265519">No hay imágenes en este directorio.</translation>
 <translation id="945522503751344254">Enviar comentarios</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index 49bbc4f1..bb161e1b 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (ID de extensión "<ph name="EXTENSION_ID" />") no se puede utilizar en este tipo de sesión.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">¡Vaya! Se ha producido un error al generar una clave privada RSA aleatoria.</translation>
+<translation id="1421115928968836111">Se desautorizarán las licencias de Flash Player del contenido protegido.</translation>
 <translation id="1425734930786274278">Se han bloqueado las siguientes cookies (las cookies de terceros se bloquean sin excepción):</translation>
 <translation id="1426410128494586442">Sí</translation>
 <translation id="1427049173708736891">Mantén tu <ph name="DEVICE_TYPE" /> desbloqueado mientras tu teléfono Android esté desbloqueado y se encuentre cerca, sin necesidad de tener que introducir la contraseña.</translation>
@@ -521,6 +522,7 @@
 <translation id="1707463636381878959">Compartir esta red con otros usuarios</translation>
 <translation id="1708199901407471282">Si abres una página web sugerida desde la página Nueva pestaña y ya hay una pestaña abierta para la sugerencia, cambia a esta en lugar de cargarla en la nueva pestaña.</translation>
 <translation id="1708338024780164500">(Inactiva)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Error al comprimir: error inesperado ($1)</translation>
 <translation id="1715941336038158809">El nombre de usuario o la contraseña no son válidos.</translation>
 <translation id="1717733954209022288">Casilla de verificación para guardar tarjetas de Google Payments</translation>
@@ -798,6 +800,7 @@
 <translation id="2168214441502403371">Teclado persa</translation>
 <translation id="2168725742002792683">Extensiones de archivo</translation>
 <translation id="2169062631698640254">Iniciar sesión de todas formas</translation>
+<translation id="2175042898143291048">Hacer esto siempre</translation>
 <translation id="2175607476662778685">Barra de inicio rápido</translation>
 <translation id="2176045495080708525">Se han instalado las siguientes extensiones:</translation>
 <translation id="2177950615300672361">Pestaña de incógnito: <ph name="TAB_NAME" /></translation>
@@ -1936,7 +1939,6 @@
 <translation id="3688507211863392146">Escribe en archivos y carpetas que abras en la aplicación</translation>
 <translation id="3688526734140524629">Cambiar canal</translation>
 <translation id="3688578402379768763">Actualizado</translation>
-<translation id="3690976161240450479">Error al iniciar sesión. Ponte en contacto con el administrador o vuelve a intentarlo.</translation>
 <translation id="3693415264595406141">Contraseña:</translation>
 <translation id="3694027410380121301">Seleccionar pestaña anterior</translation>
 <translation id="3694678678240097321">Requiere el consentimiento del usuario para utilizar una extensión que ejecute una secuencia de comandos en la página si la extensión ha solicitado permiso para ejecutarse en todas las URL.</translation>
@@ -2231,6 +2233,7 @@
 <translation id="4116663294526079822">Permitir siempre en este sitio</translation>
 <translation id="411666854932687641">Memoria</translation>
 <translation id="4118990158415604803">El administrador ha inhabilitado la conexión a otras redes.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{y 1 más}other{y # más}}</translation>
 <translation id="4119828560634133962">Vista previa de impresión de promociones de registro</translation>
 <translation id="4120329147617730038">Un administrador ha inhabilitado el inicio de sesión múltiple para <ph name="USER_EMAIL" />.
 Todos los usuarios deben cerrar sesión para continuar.</translation>
@@ -2370,9 +2373,11 @@
 <translation id="4345703751611431217">Incompatibilidad de software: más información</translation>
 <translation id="4348766275249686434">Recopilar errores</translation>
 <translation id="4350019051035968019">Este dispositivo no se puede registrar en el dominio al que pertenece tu cuenta porque ya lo administra otro dominio.</translation>
+<translation id="4354806558096370704">Habilita el uso del servidor de impresión CUPS nativo.</translation>
 <translation id="4358697938732213860">Añadir una dirección</translation>
 <translation id="4359408040881008151">Instalada debido a las extensiones dependientes</translation>
 <translation id="4361190688154226069">Destino basado en rectángulo en las vistas</translation>
+<translation id="4364414793200746179">Notificación MediaStyle de Android</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> descargado</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> está compartiendo una ventana.</translation>
 <translation id="4364830672918311045">Mostrar notificaciones</translation>
@@ -2775,6 +2780,7 @@
 <translation id="4988792151665380515">Se ha producido un error al exportar la clave pública.</translation>
 <translation id="49896407730300355">Girar a la &amp;izquierda</translation>
 <translation id="4989966318180235467">Inspeccionar página &amp;en segundo plano</translation>
+<translation id="4990343175649730969">Descargar el Limpiador de Chrome</translation>
 <translation id="4991420928586866460">Tratar las teclas de la fila superior como teclas de función</translation>
 <translation id="499165176004408815">Usar el modo de contraste alto</translation>
 <translation id="4992066212339426712">Activar sonido</translation>
@@ -3295,6 +3301,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: seleccionar para editar</translation>
 <translation id="5741454054957165976">Habilita la nueva versión de la intervención de user-agent para cargar WebFonts.</translation>
 <translation id="574392208103952083">Mediano</translation>
+<translation id="5744368829843057748">Interfaz de usuario de Translate 2016Q2</translation>
 <translation id="5745056705311424885">Memoria USB detectada</translation>
 <translation id="5746169159649715125">Guardar como PDF</translation>
 <translation id="5747611503456050045">La página se recarga como respuesta al desplazamiento con rebote vertical.</translation>
@@ -3402,6 +3409,7 @@
 <translation id="5884474295213649357">Esta pestaña está conectada a un dispositivo USB.</translation>
 <translation id="5885324376209859881">Administrar configuración de medios...</translation>
 <translation id="5889282057229379085">Número máximo de entidades emisoras de certificados intermediarias: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Indícanos el problema.</translation>
 <translation id="5892290200158927959">Teclado francés (BÉPO)</translation>
 <translation id="5892507820957994680">Ignora la lista de renderización por software y habilita la aceleración por GPU si el sistema lo permite.</translation>
 <translation id="5895138241574237353">Reiniciar</translation>
@@ -3545,6 +3553,7 @@
 <translation id="6122093587541546701">Correo electrónico (opcional):</translation>
 <translation id="6122875415561139701">No se permite la operación de escritura en "<ph name="DEVICE_NAME" />".</translation>
 <translation id="6124650939968185064">Las siguientes extensiones dependen de esta extensión:</translation>
+<translation id="6127945163801765632">Habilitar la sección Todos los marcadores en el administrador de marcadores.</translation>
 <translation id="6129938384427316298">Comentario del certificado de Netscape</translation>
 <translation id="6129953537138746214">Espacio</translation>
 <translation id="6132383530370527946">Letra pequeña</translation>
@@ -3571,6 +3580,7 @@
 <translation id="6164005077879661055">Todos los archivos y datos locales asociados al usuario supervisado se eliminarán de forma permanente una vez que se haya eliminado este usuario supervisado. Es posible que el administrador pueda seguir viendo la configuración y los sitios web visitados de este usuario supervisado en la página <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Más información</translation>
 <translation id="6166185671393271715">Importar contraseñas a Chrome</translation>
+<translation id="6169666352732958425">No se ha podido enviar el escritorio.</translation>
 <translation id="6171550060231646388">Funciones de "Ok Google" de hardware simulado</translation>
 <translation id="6175314957787328458">GUID de dominio de Microsoft</translation>
 <translation id="6178664161104547336">Seleccionar un certificado</translation>
@@ -3763,6 +3773,7 @@
 <translation id="6458308652667395253">Administrar bloqueo de JavaScript...</translation>
 <translation id="6459488832681039634">Usar selección para buscar</translation>
 <translation id="6460423884798879930">Permite habilitar la opción de envío de información adicional de autenticación en el paquete SYN inicial de un cliente conectado previamente, lo que permite que el envío de datos se inicie más rápido.</translation>
+<translation id="6460474910028274178">Se han mejorado la lógica de activación y el aspecto de la interfaz de usuario de Translate Bubble</translation>
 <translation id="6460601847208524483">Buscar siguiente</translation>
 <translation id="6462080265650314920">Las aplicaciones deben incluir el encabezado content-type "<ph name="CONTENT_TYPE" />".</translation>
 <translation id="6462082050341971451">¿Sigues ahí?</translation>
@@ -3892,6 +3903,7 @@
 <translation id="6663792236418322902">La contraseña que selecciones será necesaria para restablecer este archivo más adelante, por lo que debes guardarla en una ubicación segura.</translation>
 <translation id="6664237456442406323">Lamentablemente, tu ordenador está configurado con un identificador de hardware incorrecto. Esto impide que Chrome OS se actualice con los últimos parches de seguridad y hace que el ordenador <ph name="BEGIN_BOLD" />pueda ser vulnerable a ataques maliciosos<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">con tu cuenta de Google</translation>
+<translation id="667517062706956822">¿Quieres que Google traduzca esta página de <ph name="SOURCE_LANGUAGE" /> a <ph name="TARGET_LANGUAGE" />?</translation>
 <translation id="6675665718701918026">Dispositivo señalador conectado</translation>
 <translation id="6677037229676347494">Se esperaba un ID "<ph name="EXPECTED_ID" />", pero el ID fue "<ph name="NEW_ID" />".</translation>
 <translation id="6680028776254050810">Cambiar usuario</translation>
@@ -3943,6 +3955,7 @@
 <translation id="6746392203843147041">aumentar volumen</translation>
 <translation id="6748140994595080445">Cambiar cómo administra y muestra <ph name="APP_NAME" /> los idiomas</translation>
 <translation id="6748465660675848252">Puedes continuar, pero solo se restaurarán tu configuración y tus datos sincronizados. Se perderán todos los datos locales.</translation>
+<translation id="6751256176799620176">1 carpeta seleccionada</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (incógnito)</translation>
 <translation id="6759193508432371551">Restablecer datos de fábrica</translation>
 <translation id="6760765581316020278">Teclado vietnamita (VNI)</translation>
@@ -4581,6 +4594,7 @@
 <translation id="7717014941119698257">Descargando: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">Se ha agotado el tiempo del entrenamiento</translation>
 <translation id="771953673318695590">Control de calidad</translation>
+<translation id="7720375555307821262"><ph name="BEGIN_LINK" />Inicia sesión en Chrome<ph name="END_LINK" /> para supervisar a este usuario.</translation>
 <translation id="7724603315864178912">Cortar</translation>
 <translation id="7730449930968088409">Captura contenido de la pantalla</translation>
 <translation id="7730494089396812859">Muestra detalles de la copia de seguridad en la nube</translation>
@@ -4674,7 +4688,6 @@
 <translation id="7859704718976024901">Historial de navegación</translation>
 <translation id="7861215335140947162">&amp;Descargas</translation>
 <translation id="7864539943188674973">Inhabilitar Bluetooth</translation>
-<translation id="7868891395842935202">Habilita el framework experimental para controlar el acceso a los experimentos API.</translation>
 <translation id="7870576007982733437">Utilizar el administrador de descargas del sistema (si procede).</translation>
 <translation id="7870790288828963061">No se ha encontrado ninguna aplicación de kiosco con una versión más reciente. No hay nada que actualizar. Extrae el dispositivo USB.</translation>
 <translation id="787150342916295244">Escaneado de tarjetas de crédito</translation>
@@ -5005,7 +5018,6 @@
 <translation id="8309505303672555187">Selecciona una red:</translation>
 <translation id="8312871300878166382">Pegar en la carpeta</translation>
 <translation id="8314013494437618358">Composición por subprocesos</translation>
-<translation id="8314576811984836978">Marco experimental.</translation>
 <translation id="8319414634934645341">Uso mejorado de clave</translation>
 <translation id="8322814362483282060">Esta página no tiene permiso para acceder al micrófono</translation>
 <translation id="8326478304147373412">PKCS #7, cadena de certificados</translation>
@@ -5066,7 +5078,6 @@
 <translation id="8418240940464873056">Modo Hanja</translation>
 <translation id="8418445294933751433">Mo&amp;strar como pestaña</translation>
 <translation id="8420060421540670057">Mostrar archivos de Google Docs</translation>
-<translation id="8420728540268437431">Esta página se está traduciendo...</translation>
 <translation id="842274098655511832">Extensiones de borrador WebGL</translation>
 <translation id="8424039430705546751">abajo</translation>
 <translation id="8425213833346101688">Cambiar</translation>
@@ -5253,6 +5264,7 @@
 <translation id="8690754533598178758">Las excepciones del micrófono de Adobe Flash Player son diferentes.</translation>
 <translation id="8691686986795184760">(Habilitado por política de empresa)</translation>
 <translation id="869257642790614972">Volver a abrir última pestaña cerrada</translation>
+<translation id="8695770993395462321">CUPS nativo</translation>
 <translation id="8695825812785969222">Abrir &amp;ubicación...</translation>
 <translation id="8698464937041809063">Dibujo de Google</translation>
 <translation id="869884720829132584">Menú de aplicaciones</translation>
@@ -5595,6 +5607,7 @@
 <translation id="9189690067274055051">Desbloquea el teléfono y acerca tu <ph name="DEVICE_TYPE" /> para acceder.</translation>
 <translation id="9190063653747922532">L2TP/IPsec + Clave precompartida</translation>
 <translation id="9201305942933582053">¡Google Now para Chrome!</translation>
+<translation id="9202646163273566462">Habilita la vista Todos los marcadores como destino predeterminado del administrador de marcadores.</translation>
 <translation id="9203398526606335860">&amp;Perfiles habilitados</translation>
 <translation id="9203478404496196495">Activar sonido de pestaña</translation>
 <translation id="9203962528777363226">El administrador de este dispositivo ha desactivado la opción de añadir nuevos usuarios.</translation>
@@ -5621,6 +5634,7 @@
 <translation id="939736085109172342">Nueva carpeta</translation>
 <translation id="940425055435005472">Tamaño de fuente:</translation>
 <translation id="941543339607623937">La clave privada no es válida.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{ninguna}=1{1 aplicación ($1)}=2{2 aplicaciones ($1, $2)}other{# aplicaciones ($1, $2, $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> está compartiendo audio y una pestaña de Chrome.</translation>
 <translation id="942954117721265519">No hay imágenes en este directorio.</translation>
 <translation id="945522503751344254">Enviar comentarios</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index 96e97f0..1e6f099c 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (laienduse ID „<ph name="EXTENSION_ID" />”) ei ole seda tüüpi seansi puhul lubatud.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Oih! RSA juhusliku privaatvõtme genereerimine ebaõnnestus.</translation>
+<translation id="1421115928968836111">See tühistab kaitstud sisu puhul Flash Playeri litsentside volitused.</translation>
 <translation id="1425734930786274278">Blokeeriti järgmised küpsisefailid (kolmandate osapoolte küpsised blokeeriti ühegi erandita):</translation>
 <translation id="1426410128494586442">Jah</translation>
 <translation id="1427049173708736891">Hoidke seade <ph name="DEVICE_TYPE" /> avatuna ilma parooli sisestamata, kui teie Android-telefon on avatud ja seadme läheduses.</translation>
@@ -521,6 +522,7 @@
 <translation id="1707463636381878959">Jaga seda võrku teiste kasutajatega</translation>
 <translation id="1708199901407471282">Kui avate uuel vahelehel soovitatud veebilehe ja soovituse vaheleht on juba avatud, lülitatakse sellele ja soovitust uuel vahelehel ei laadita.</translation>
 <translation id="1708338024780164500">(Passiivne)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Pakkimine ebaõnnestus, ootamatu viga: $1</translation>
 <translation id="1715941336038158809">Kehtetu kasutaja nimi või parool.</translation>
 <translation id="1717733954209022288">Google Paymentsi kaardi salvestamise märkeruut</translation>
@@ -798,6 +800,7 @@
 <translation id="2168214441502403371">Pärsia klaviatuur</translation>
 <translation id="2168725742002792683">Faililaiendid</translation>
 <translation id="2169062631698640254">Logi ikkagi sisse</translation>
+<translation id="2175042898143291048">Tee seda alati</translation>
 <translation id="2175607476662778685">Kiirkäivitusriba</translation>
 <translation id="2176045495080708525">Järgmised laiendused on nüüd installitud:</translation>
 <translation id="2177950615300672361">Inkognito vaheleht: <ph name="TAB_NAME" /></translation>
@@ -1937,7 +1940,6 @@
 <translation id="3688507211863392146">Failidesse ja kaustadesse kirjutamine, mille rakenduses avate</translation>
 <translation id="3688526734140524629">Vaheta kanalit</translation>
 <translation id="3688578402379768763">Ajakohane</translation>
-<translation id="3690976161240450479">Sisselogimine ebaõnnestus. Võtke ühendust administraatoriga või proovige uuesti.</translation>
 <translation id="3693415264595406141">Parool:</translation>
 <translation id="3694027410380121301">Vali eelmine vaheleht</translation>
 <translation id="3694678678240097321">Laiendusel on sellel lehel skripti käitamiseks vaja kasutaja nõusolekut, kui laiendus taotles luba käitamiseks kõigil URL-idel.</translation>
@@ -2233,6 +2235,7 @@
 <translation id="4116663294526079822">Luba sellel saidil alati</translation>
 <translation id="411666854932687641">Privaatmälu</translation>
 <translation id="4118990158415604803">Administraator on muude võrkudega ühenduse loomise keelanud.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{ja veel 1}other{ja veel #}}</translation>
 <translation id="4119828560634133962">Printimise eelvaate registreerimise pakkumised</translation>
 <translation id="4120329147617730038">Administraator on keelanud e-posti aadressi <ph name="USER_EMAIL" /> puhul mitmele kontole sisselogimise.
 Jätkamiseks peavad kõik kasutajad välja logima.</translation>
@@ -2371,9 +2374,11 @@
 <translation id="4345703751611431217">Tarkvara ühildumatus: lisateave</translation>
 <translation id="4348766275249686434">Kogu vigu</translation>
 <translation id="4350019051035968019">Seda seadet ei saa registreerida domeenil, kuhu teie konto kuulub, sest seade on märgitud teisel domeenil haldamiseks.</translation>
+<translation id="4354806558096370704">Lubab CUPS-omasüsteemi printimise tagaosa kasutamise.</translation>
 <translation id="4358697938732213860">Lisa aadress</translation>
 <translation id="4359408040881008151">Installitud sõltuva(te) laiendus(t)e tõttu.</translation>
 <translation id="4361190688154226069">Ristkülikul põhinev sihtimine kuvades.</translation>
+<translation id="4364414793200746179">Android MediaStyle'i märguanne</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> on alla laaditud</translation>
 <translation id="4364567974334641491">Rakendus <ph name="APP_NAME" /> jagab akent.</translation>
 <translation id="4364830672918311045">Kuva märguanded</translation>
@@ -2777,6 +2782,7 @@
 <translation id="4988792151665380515">Avalikku võtit ei õnnestunud eksportida.</translation>
 <translation id="49896407730300355">Pööra &amp;vastupäeva</translation>
 <translation id="4989966318180235467">Uuri &amp;taustalehte</translation>
+<translation id="4990343175649730969">Laadi alla Chrome Cleanup Tool</translation>
 <translation id="4991420928586866460">Kasuta ülarea klahve funktsiooniklahvidena</translation>
 <translation id="499165176004408815">Kasuta kõrge kontrastiga režiimi</translation>
 <translation id="4992066212339426712">Tühista vaigistus</translation>
@@ -3300,6 +3306,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: muutmiseks valige</translation>
 <translation id="5741454054957165976">Lubatakse funktsiooni Kasutaja-agendi sekkumine WebFontsi laadimisel uus versioon.</translation>
 <translation id="574392208103952083">Keskmine</translation>
+<translation id="5744368829843057748">2016Q2 kasutajaliidese tõlkimine</translation>
 <translation id="5745056705311424885">Tuvastati USB-mälupulk</translation>
 <translation id="5746169159649715125">Salvesta PDF-ina</translation>
 <translation id="5747611503456050045">Lehe uuesti laadimine sisu vertikaalse ülekerimise tõttu.</translation>
@@ -3407,6 +3414,7 @@
 <translation id="5884474295213649357">See vaheleht on ühendatud USB-seadmega.</translation>
 <translation id="5885324376209859881">Meediaseadete haldamine ...</translation>
 <translation id="5889282057229379085">Vahe CA-de maksimaalne arv: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Andke meile teada, mis toimub.</translation>
 <translation id="5892290200158927959">Prantsuse BÉPO-klaviatuur</translation>
 <translation id="5892507820957994680">Alistab sisseehitatud tarkvara renderdusloendi ja võimaldab GPU-kiirendust toetamata süsteemikonfiguratsioonides.</translation>
 <translation id="5895138241574237353">Taaskäivitamine</translation>
@@ -3550,6 +3558,7 @@
 <translation id="6122093587541546701">E-post (valikuline):</translation>
 <translation id="6122875415561139701">Kirjutamistoiming pole seadmes „<ph name="DEVICE_NAME" />” lubatud.</translation>
 <translation id="6124650939968185064">Sellest laiendusest sõltuvad järgmised laiendused:</translation>
+<translation id="6127945163801765632">Järjehoidjate halduris jaotise „Kõik järjehoidjad” lubamine.</translation>
 <translation id="6129938384427316298">Netscape'i sertifikaadi kommentaar</translation>
 <translation id="6129953537138746214">Tühik</translation>
 <translation id="6132383530370527946">Väikses kirjas</translation>
@@ -3576,6 +3585,7 @@
 <translation id="6164005077879661055">Kõik jälgitava kasutajaga seotud failid ja kohalikud andmed kustutatakse jäädavalt kohe, kui jälgitav kasutaja eemaldatakse. Selle jälgitava kasutaja külastatud veebisaite ja seadeid näeb haldur endiselt aadressil <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Lisateave</translation>
 <translation id="6166185671393271715">Paroolide importimine Chrome'i</translation>
+<translation id="6169666352732958425">Töölauda ei saa üle kanda.</translation>
 <translation id="6171550060231646388">Fraasi „Ok Google” simuleeritud riistvarapõhised funktsioonid</translation>
 <translation id="6175314957787328458">Microsofti domeeni GUID</translation>
 <translation id="6178664161104547336">Sertifikaadi valimine</translation>
@@ -3769,6 +3779,7 @@
 <translation id="6458308652667395253">JavaScripti blokeerimise haldamine...</translation>
 <translation id="6459488832681039634">Kasuta otsimiseks valikut</translation>
 <translation id="6460423884798879930">Andmete saatmise kiiremaks käivitamiseks tehke valik, mis lubab algses SYN-paketis saata autentimise lisateavet varem ühendatud kliendi jaoks.</translation>
+<translation id="6460474910028274178">Täiustatud käivitamisloogika ja tõlkemulli kasutajaliidese välimus</translation>
 <translation id="6460601847208524483">Otsi järgmine</translation>
 <translation id="6462080265650314920">Rakendusi tuleb esitada sisu tüübiga „<ph name="CONTENT_TYPE" />”.</translation>
 <translation id="6462082050341971451">Kas olete veel seal?</translation>
@@ -3898,6 +3909,7 @@
 <translation id="6663792236418322902">Teie valitavat parooli on vaja selle faili hilisemaks taastamiseks. Salvestage see turvalisse asukohta.</translation>
 <translation id="6664237456442406323">Kahjuks on teie arvuti seadistatud vigase riistvara ID-ga. See ei lase Chrome OS-i värskendada uusimate turvaparandustega ja teie arvuti <ph name="BEGIN_BOLD" />võib pahatahtlike rünnakute osas haavatav olla<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">oma Google'i kontoga</translation>
+<translation id="667517062706956822">Kas soovite lasta Google'il selle lehe tõlkida <ph name="SOURCE_LANGUAGE" /> keelest <ph name="TARGET_LANGUAGE" /> keelde?</translation>
 <translation id="6675665718701918026">Ühendati kursoriseade</translation>
 <translation id="6677037229676347494">Eeldatav ID oli „<ph name="EXPECTED_ID" />”, kuid ID oli „<ph name="NEW_ID" />”.</translation>
 <translation id="6680028776254050810">Kasutaja vahetamine</translation>
@@ -3949,6 +3961,7 @@
 <translation id="6746392203843147041">heli valjemaks</translation>
 <translation id="6748140994595080445">Muutke, kuidas <ph name="APP_NAME" /> keeli käsitleb ja kuvab.</translation>
 <translation id="6748465660675848252">Võite jätkata, kuid taastatakse ainult teie sünkroonitud andmed ja seaded. Kõik kohalikud andmed lähevad kaotsi.</translation>
+<translation id="6751256176799620176">Valitud on üks kaust</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Inkognito)</translation>
 <translation id="6759193508432371551">Tehaseseadete lähtestamine</translation>
 <translation id="6760765581316020278">Vietnami klaviatuur (VNI)</translation>
@@ -4589,6 +4602,7 @@
 <translation id="7717014941119698257">Allalaadimine: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">Koolitus aegus</translation>
 <translation id="771953673318695590">Kvaliteedikontroll</translation>
+<translation id="7720375555307821262">Selle inimese jälgimiseks <ph name="BEGIN_LINK" />logige Chrome'i sisse<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">Lõika</translation>
 <translation id="7730449930968088409">Ekraanil oleva sisu jäädvustamine</translation>
 <translation id="7730494089396812859">Pilvepõhise varunduse üksikasjade kuvamine</translation>
@@ -4682,7 +4696,6 @@
 <translation id="7859704718976024901">Sirvimisajalugu</translation>
 <translation id="7861215335140947162">&amp;Allalaadimised</translation>
 <translation id="7864539943188674973">Keela Bluetooth</translation>
-<translation id="7868891395842935202">API katsetele juurdepääsu juhtimiseks lubatakse katseline raamistik.</translation>
 <translation id="7870576007982733437">Võimaluse korral kasuta süsteemi allalaadimiste haldurit.</translation>
 <translation id="7870790288828963061">Ühtegi uuema versiooniga kioski rakendust ei leitud. Midagi pole värskendada. Eemaldage USB-mälupulk.</translation>
 <translation id="787150342916295244">Krediitkaardi skannimine</translation>
@@ -5012,7 +5025,6 @@
 <translation id="8309505303672555187">Valige võrk:</translation>
 <translation id="8312871300878166382">Kleebi kausta</translation>
 <translation id="8314013494437618358">Lõimitud koostamine</translation>
-<translation id="8314576811984836978">Katseline raamistik.</translation>
 <translation id="8319414634934645341">Laiendatud võtmekasutus</translation>
 <translation id="8322814362483282060">Sellel lehel on juurdepääs teie mikrofonile blokeeritud.</translation>
 <translation id="8326478304147373412">PKCS 7, sertifikaadiahel</translation>
@@ -5073,7 +5085,6 @@
 <translation id="8418240940464873056">Hiina kirjatähtede režiim</translation>
 <translation id="8418445294933751433">&amp;Kuva vahelehena</translation>
 <translation id="8420060421540670057">Kuva Google Docsi failid</translation>
-<translation id="8420728540268437431">Seda lehte tõlgitakse ...</translation>
 <translation id="842274098655511832">WebGL-i mustandlaiendid</translation>
 <translation id="8424039430705546751">alla</translation>
 <translation id="8425213833346101688">Muuda</translation>
@@ -5260,6 +5271,7 @@
 <translation id="8690754533598178758">Adobe Flash Playeri mikrofonierandid on erinevad.</translation>
 <translation id="8691686986795184760">(Ettevõtte eeskirjadega lubatud)</translation>
 <translation id="869257642790614972">Avab uuesti viimati suletud vahekaardi</translation>
+<translation id="8695770993395462321">CUPS-omasüsteem</translation>
 <translation id="8695825812785969222">Ava a&amp;sukoht ...</translation>
 <translation id="8698464937041809063">Google joonistus</translation>
 <translation id="869884720829132584">Rakenduste menüü</translation>
@@ -5602,6 +5614,7 @@
 <translation id="9189690067274055051">Sisenemiseks eemaldage telefoni võrgulukk ja tooge see seadmele <ph name="DEVICE_TYPE" /> lähemale.</translation>
 <translation id="9190063653747922532">L2TP/IPSec + eeljagatud võti</translation>
 <translation id="9201305942933582053">Google Now Chrome'ile.</translation>
+<translation id="9202646163273566462">Lubab kõikide järjehoidjate vaate järjehoidjate halduri vaikesihtkohana.</translation>
 <translation id="9203398526606335860">&amp;Profileerimine lubatud</translation>
 <translation id="9203478404496196495">Tühista vahekaardi summutus</translation>
 <translation id="9203962528777363226">Selle seadme administraator on keelanud uute kasutajate lisamise</translation>
@@ -5628,6 +5641,7 @@
 <translation id="939736085109172342">Uus kaust</translation>
 <translation id="940425055435005472">Fondi suurus:</translation>
 <translation id="941543339607623937">Vale privaatvõti.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{mitte ühtegi}=1{1 rakendus ($1)}=2{2 rakendust ($1, $2)}other{# rakendust ($1, $2, $3)}}</translation>
 <translation id="942532530371314860">Rakendus <ph name="APP_NAME" /> jagab Chrome'i vahelehte ja heli.</translation>
 <translation id="942954117721265519">Selles kataloogis pilte pole.</translation>
 <translation id="945522503751344254">Saada tagasisidet</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index 1007693..7dcc61b 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -294,6 +294,7 @@
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (شناسه برنامه افزودنی «<ph name="EXTENSION_ID" />») در این نوع جلسه مجاز نیست.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">‏اوه! ایجاد کلید خصوصی RSA تصادفی ناموفق بود.</translation>
+<translation id="1421115928968836111">‏این گزینه مجوزهای Flash Player را برای محتوای محافظت‌شده لغو می‌کند.</translation>
 <translation id="1425734930786274278">کوکی‌های زیر مسدود شدند (کوکی‌های شخص ثالث بدون استثنا مسدود می‌شوند):</translation>
 <translation id="1426410128494586442">بله</translation>
 <translation id="1427049173708736891">‏وقتی تلفن Android شما قفل نباشد و در همین اطراف باشد، قفل <ph name="DEVICE_TYPE" /> خودتان را باز نگه‌دارید— لازم نیست گذرواژه‌تان را تایپ کنید.</translation>
@@ -519,6 +520,7 @@
 <translation id="1707463636381878959">به اشتراک گذاشتن این شبکه با سایر کاربران</translation>
 <translation id="1708199901407471282">هنگام باز کردن صفحه وب پیشنهادی از صفحه «برگه جدید»، اگر برگه‌ای از قبل برای آن پیشنهاد باز باشد، به‌جای بار کردن پیشنهاد در برگه‌ای جدید، به برگه‌ای که از قبل باز است می‌رود.</translation>
 <translation id="1708338024780164500">(غیرفعال)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (شناسه: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">فشرده‌سازی انجام نشد، خطای غیرمنتظره: $1</translation>
 <translation id="1715941336038158809">نام کاربری یا گذرواژه نامعتبر است.</translation>
 <translation id="1717733954209022288">‏کادر تأیید ذخیره کارت Google Payments</translation>
@@ -795,6 +797,7 @@
 <translation id="2168214441502403371">صفحه‌کلید فارسی</translation>
 <translation id="2168725742002792683">پسوندهای فایل</translation>
 <translation id="2169062631698640254">در هر صورت وارد سیستم شود</translation>
+<translation id="2175042898143291048">همیشه این کار انجام شود</translation>
 <translation id="2175607476662778685">نوار راه‌اندازی سریع</translation>
 <translation id="2176045495080708525">افزودنه‌های زیر در حال حاضر نصب هستند:</translation>
 <translation id="2177950615300672361">برگه ناشناس: <ph name="TAB_NAME" /></translation>
@@ -1933,7 +1936,6 @@
 <translation id="3688507211863392146">نوشتن بر روی فایل‌ها و پوشه‌هایی که در برنامه باز می‌کنید</translation>
 <translation id="3688526734140524629">تغییر کانال</translation>
 <translation id="3688578402379768763">به‌روز</translation>
-<translation id="3690976161240450479">ورود به سیستم انجام نشد. لطفاً با سرپرستتان تماس بگیرید یا دوباره امتحان کنید.</translation>
 <translation id="3693415264595406141">گذرواژه:</translation>
 <translation id="3694027410380121301">انتخاب برگه قبلی</translation>
 <translation id="3694678678240097321">اگر برنامه افزودنی برای اجرا در همه نشانی‌های وب مجوز درخواست کرده باشد، به رضایت کاربر برای اجرای یک اسکریپت توسط برنامه افزودنی در صفحه نیاز است.</translation>
@@ -2229,6 +2231,7 @@
 <translation id="4116663294526079822">همیشه مجاز در این سایت</translation>
 <translation id="411666854932687641">حافظه خصوصی</translation>
 <translation id="4118990158415604803">اتصال به شبکه‌های دیگر توسط سرپرست شما غیرفعال شده است.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{و ۱ مورد دیگر}one{و # مورد دیگر}other{و # مورد دیگر}}</translation>
 <translation id="4119828560634133962">تبلیغات ثبت پیش‌نمایش چاپ</translation>
 <translation id="4120329147617730038">یکی از سرپرستان ورود چندگانه به سیستم را برای <ph name="USER_EMAIL" /> غیرمجاز کرده است.
 برای ادامه همه کاربران باید از سیستم خارج شوند.</translation>
@@ -2368,9 +2371,11 @@
 <translation id="4345703751611431217">ناسازگاری نرم‌افزار: بیشتر بیاموزید</translation>
 <translation id="4348766275249686434">جمع‌آوری خطاها</translation>
 <translation id="4350019051035968019">این دستگاه نمی‌تواند در دامنه‌ای که حسابتان متعلق به آن است، ثبت نام کند زیرا دستگاه برای مدیریت توسط دامنه دیگری علامت‌گذاری شده است.</translation>
+<translation id="4354806558096370704">‏استفاده از مرحله نهایی چاپ CUPS محلی را امکان‌پذیر می‌کند.</translation>
 <translation id="4358697938732213860">افزودن آدرس</translation>
 <translation id="4359408040881008151">به دلیل برنامه(های) افزودنی وابسته نصب شد.</translation>
 <translation id="4361190688154226069">هدف‌یابی بر مبنای مستطیل در بازدیدها</translation>
+<translation id="4364414793200746179">‏اعلان Android MediaStyle</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> بارگیری شد</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> در حال اشتراک‌گذاری یک پنجره است.</translation>
 <translation id="4364830672918311045">نمایش اعلان‌ها</translation>
@@ -2772,6 +2777,7 @@
 <translation id="4988792151665380515">صادر کردن کلید عمومی ناموفق بود.</translation>
 <translation id="49896407730300355">چرخاندن خلاف جهت ع&amp;قربه‌های ساعت</translation>
 <translation id="4989966318180235467">بازرسی صفحه &amp;پس‌زمینه</translation>
+<translation id="4990343175649730969">‏بارگیری ابزار پاک‌سازی Chrome</translation>
 <translation id="4991420928586866460">در نظر گرفتن کلیدهای ردیف بالا به عنوان کلیدهای عملکرد</translation>
 <translation id="499165176004408815">استفاده از حالت کنتراست بالا</translation>
 <translation id="4992066212339426712">باصدا کردن</translation>
@@ -3296,6 +3302,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: انتخاب برای ویرایش</translation>
 <translation id="5741454054957165976">‏نسخه جدید مداخله نماینده کاربر را برای بار کردن WebFonts فعال کنید.</translation>
 <translation id="574392208103952083">متوسط</translation>
+<translation id="5744368829843057748">‏ترجمه 2016Q2 UI</translation>
 <translation id="5745056705311424885">‏کارت حافظهٔ USB شناسایی شد</translation>
 <translation id="5746169159649715125">‏ذخیره به‌عنوان PDF</translation>
 <translation id="5747611503456050045">تازه‌سازی‌های صفحه که با پیمایش عمودی محتوا فعال می‌شوند.</translation>
@@ -3403,6 +3410,7 @@
 <translation id="5884474295213649357">‏این برگه به دستگاه USB متصل است.</translation>
 <translation id="5885324376209859881">مدیریت تنظیمات رسانه...</translation>
 <translation id="5889282057229379085">‏حداکثر تعداد CA های متوسط: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">به ما بگویید چه اتفاقی افتاده است.</translation>
 <translation id="5892290200158927959">‏صفحه‌کلید BÉPO فرانسوی</translation>
 <translation id="5892507820957994680">‏فهرست تفسیر و اجرای نرم‌افزار داخلی را لغو می‌کند و شتاب دهنده GPU را در پیکربندی های سیستم پشتیبانی نشده فعال می‌کند.</translation>
 <translation id="5895138241574237353">راه‌اندازی مجدد</translation>
@@ -3544,6 +3552,7 @@
 <translation id="6122093587541546701">ایمیل (اختیاری):</translation>
 <translation id="6122875415561139701">عملیات نوشتن در این دستگاه مجاز نیست: «<ph name="DEVICE_NAME" />».</translation>
 <translation id="6124650939968185064">افزودنه‌های زیر به این برنامه افزودنی وابسته هستند:</translation>
+<translation id="6127945163801765632">بخش «همه نشانک‌ها» در مدیر نشانک فعال شود.</translation>
 <translation id="6129938384427316298">‏نظر گواهی Netscape</translation>
 <translation id="6129953537138746214">فضا</translation>
 <translation id="6132383530370527946">چاپ کوچک</translation>
@@ -3570,6 +3579,7 @@
 <translation id="6164005077879661055">با حذف این کاربر نظارت‌شده، کلیه فایل‌ها و داده‌های محلی مربوط به کاربر نظارت‌شده برای همیشه حذف خواهند شد. وب‌سایت‌های بازدید شده و تنظیمات این کاربر نظارت‌شده همچنان برای مدیر در <ph name="MANAGEMENT_URL" /> قابل مشاهده خواهد بود.</translation>
 <translation id="6165508094623778733">بیشتر بدانید</translation>
 <translation id="6166185671393271715">‏وارد کردن گذرواژه‌ها به Chrome</translation>
+<translation id="6169666352732958425">ارسال محتوای میز کار امکان‌پذیر نیست.</translation>
 <translation id="6171550060231646388">‏قابلیت‌های سخت‌افزاری شبیه‌سازی‌شده «Ok Google»</translation>
 <translation id="6175314957787328458">‏GUID دامنه Microsoft</translation>
 <translation id="6178664161104547336">انتخاب گواهی</translation>
@@ -3763,6 +3773,7 @@
 <translation id="6458308652667395253">مدیریت انسداد جاوا اسکریپت...</translation>
 <translation id="6459488832681039634">استفاده از انتخاب برای یافتن</translation>
 <translation id="6460423884798879930">‏قابلیت ارسال اطلاعات تأیید هویت اضافی در بسته اولیه SYN را برای سرویس‌گیرنده‌ای که قبلاً متصل شده است به کار می‌اندازد و باعث می‌شود ارسال داده سریع‌تر آغاز شود.</translation>
+<translation id="6460474910028274178">بهبود منطق فعال‌سازی و جستجو برای واسط کاربری ابزارک اعلان ترجمه</translation>
 <translation id="6460601847208524483">یافتن بعدی</translation>
 <translation id="6462080265650314920">نوع محتوای برنامه باید «<ph name="CONTENT_TYPE" />» باشد.</translation>
 <translation id="6462082050341971451">آیا هنوز آنجا هستید؟</translation>
@@ -3892,6 +3903,7 @@
 <translation id="6663792236418322902">برای بازیابی این فایل در فرصتی دیگر به گذرواژه انتخابی شما لازم است. لطفاً آن را در مکانی امن نگهداری کنید.</translation>
 <translation id="6664237456442406323">‏متأسفانه، رایانه شما با یک شناسه سخت‌افزار ناقص پیکربندی شده است. این موضوح سیستم عامل Chrome را از به‌روزرسانی با جدیدترین اصلاحات امنیتی باز می‌دارد که <ph name="BEGIN_BOLD" />می‌تواند رایانه شما را در برابر حملات مخرب آسیب‌پذیر نماید<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">‏با حساب Google خود</translation>
+<translation id="667517062706956822">‏می‌خواهید Google این صفحه را از <ph name="SOURCE_LANGUAGE" /> به <ph name="TARGET_LANGUAGE" /> ترجمه کند؟</translation>
 <translation id="6675665718701918026">دستگاه نشانگر متصل شد</translation>
 <translation id="6677037229676347494">شناسه مورد انتظار «<ph name="EXPECTED_ID" />» است، اما شناسه «<ph name="NEW_ID" />» بود.</translation>
 <translation id="6680028776254050810">تغییر کاربران</translation>
@@ -3943,6 +3955,7 @@
 <translation id="6746392203843147041">افزایش صدا</translation>
 <translation id="6748140994595080445">نحوه بکارگیری و نمایش زبان‌ها توسط <ph name="APP_NAME" /> را تغییر دهید.</translation>
 <translation id="6748465660675848252">می‌توانید ادامه دهید، اما تنها تنظیمات و داده‌های همگام‌سازی شده شما بازیابی می‌شوند. همه داده‌های محلی از دست می‌روند.</translation>
+<translation id="6751256176799620176">۱ پوشه انتخاب شد</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (ناشناس)</translation>
 <translation id="6759193508432371551">بازنشانی به تنظیمات کارخانه</translation>
 <translation id="6760765581316020278">‏صفحه‌کلید ویتنامی (VNI)</translation>
@@ -4582,6 +4595,7 @@
 <translation id="7717014941119698257">دانلود: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">مهلت آموزش تمام شد</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262">‏برای نظارت بر این شخص، <ph name="BEGIN_LINK" />به سیستم Chrome وارد شوید<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">برش</translation>
 <translation id="7730449930968088409">ثبت محتوا از صفحه شما</translation>
 <translation id="7730494089396812859">‏نمایش جزئیات پشتیبان‌گیری Cloud</translation>
@@ -4675,7 +4689,6 @@
 <translation id="7859704718976024901">سابقه مرور</translation>
 <translation id="7861215335140947162">&amp;فایلهای بارگیری‌شده</translation>
 <translation id="7864539943188674973">غیرفعال کردن بلوتوث</translation>
-<translation id="7868891395842935202">‏«چارچوب آزمایشی» را برای کنترل دسترسی به آزمایش‌های API فعال می‌کند.</translation>
 <translation id="7870576007982733437">در صورت امکان از مدیر بارگیری سیستم استفاده کنید.</translation>
 <translation id="7870790288828963061">‏برنامه‌های کیوسکی با نسخه جدیدتر پیدا نشد. موردی برای به‌روزرسانی وجود ندارد. لطفاً فلش USB را خارج کنید.</translation>
 <translation id="787150342916295244">اسکن کارت اعتباری</translation>
@@ -5004,7 +5017,6 @@
 <translation id="8309505303672555187">انتخاب شبکه:</translation>
 <translation id="8312871300878166382">جای‌گذاری در پوشه</translation>
 <translation id="8314013494437618358">ترکیب رشته‌ای</translation>
-<translation id="8314576811984836978">چارچوب آزمایشی.</translation>
 <translation id="8319414634934645341">کاربرد کلید توسعه یافته</translation>
 <translation id="8322814362483282060">این صفحه از دسترسی به میکروفون شما بازداشته شده است.</translation>
 <translation id="8326478304147373412">‏PKCS #7، زنجیره گواهی</translation>
@@ -5065,7 +5077,6 @@
 <translation id="8418240940464873056">حالت هانجا</translation>
 <translation id="8418445294933751433">&amp;نمایش به‌صورت برگه</translation>
 <translation id="8420060421540670057">‏نمایش فایل‌های سندنگار Google</translation>
-<translation id="8420728540268437431">این صفحه در حال ترجمه شدن است …</translation>
 <translation id="842274098655511832">‏افزونه‌های پیش‌نویس WebGL</translation>
 <translation id="8424039430705546751">پایین</translation>
 <translation id="8425213833346101688">تغییر</translation>
@@ -5252,6 +5263,7 @@
 <translation id="8690754533598178758">‏استثناهای میکروفون Adobe Flash Player فرق می‌کند.</translation>
 <translation id="8691686986795184760">(توسط خط‌مشی سازمانی فعال شده است)</translation>
 <translation id="869257642790614972">باز کردن مجدد آخرین برگه بسته شده</translation>
+<translation id="8695770993395462321">‏CUPS محلی</translation>
 <translation id="8695825812785969222">باز کردن &amp;مکان...</translation>
 <translation id="8698464937041809063">‏طراحی Google </translation>
 <translation id="869884720829132584">منوی برنامه</translation>
@@ -5594,6 +5606,7 @@
 <translation id="9189690067274055051">برای ورود، قفل تلفنتان را باز کرده و آن را به <ph name="DEVICE_TYPE" /> نزدیک‌تر کنید.</translation>
 <translation id="9190063653747922532">‏L2TP/IPSec + کلید از قبل مشترک شده</translation>
 <translation id="9201305942933582053">‏Google Now برای Chrome!</translation>
+<translation id="9202646163273566462">مشاهده همه نشانک‌ها را به‌عنوان مقصد پیش‌فرض مدیر نشانک امکان‌پذیر می‌کند.</translation>
 <translation id="9203398526606335860">&amp;نمایه سازی فعال شد</translation>
 <translation id="9203478404496196495">وصل کردن صدای برگه</translation>
 <translation id="9203962528777363226">سرپرست این دستگاه امکان افزوده شدن کاربران جدید را غیرفعال کرده است</translation>
@@ -5620,6 +5633,7 @@
 <translation id="939736085109172342">پوشهٔ جدید</translation>
 <translation id="940425055435005472">اندازه قلم:</translation>
 <translation id="941543339607623937">کلید خصوصی نامعتبر.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{هیچ‌}=1{۱ برنامه ($1)}=2{۲ برنامه ($1،‏ $2)}one{# برنامه ($1،‏ $2،‏ $3)}other{# برنامه ($1،‏ $2،‏ $3)}}</translation>
 <translation id="942532530371314860">‏<ph name="APP_NAME" /> در حال اشتراک‌گذاری یک برگه Chrome و صوت است.</translation>
 <translation id="942954117721265519">تصویری در دایرکتوری وجود ندارد.</translation>
 <translation id="945522503751344254">ارسال بازخورد</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index 8be57a386..21fea12b 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608">Laajennusta <ph name="EXTENSION_NAME" /> (laajennustunnus <ph name="EXTENSION_ID" />) ei sallita tämäntyyppisessä ístunnossa.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Hups! Satunnaisen yksityisen RSA-avaimen luominen epäonnistui.</translation>
+<translation id="1421115928968836111">Tämän seurauksena suojatun sisällön Flash Player -käyttöluvat evätään.</translation>
 <translation id="1425734930786274278">Estettiin seuraavat evästeet (kolmannen osapuolen evästeet estetään poikkeuksetta):</translation>
 <translation id="1426410128494586442">Kyllä</translation>
 <translation id="1427049173708736891">Pidä <ph name="DEVICE_TYPE" /> auki, kun Android-puhelimesi lukitus on auki ja se on lähellä – salasanaa ei tarvitse kirjoittaa.</translation>
@@ -521,6 +522,7 @@
 <translation id="1707463636381878959">Jaa tämä verkosto muiden käyttäjien kanssa</translation>
 <translation id="1708199901407471282">Jos Uusi välilehti ‑sivun ehdotus on jo auki välilehdellä, käyttäjä siirtyy sen avatessaan avoimelle välilehdelle uuden avaamisen sijaan.</translation>
 <translation id="1708338024780164500">(Ei-aktiivinen)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (tunnus: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Pakkaus epäonnistui, odottamaton virhe: $1</translation>
 <translation id="1715941336038158809">Virheellinen käyttäjänimi tai salasana.</translation>
 <translation id="1717733954209022288">Google Payments -kortin tallennuksen valintaruutu</translation>
@@ -797,6 +799,7 @@
 <translation id="2168214441502403371">Persialainen näppäimistö</translation>
 <translation id="2168725742002792683">Tiedostotunnisteet</translation>
 <translation id="2169062631698640254">Kirjaudu silti sisään</translation>
+<translation id="2175042898143291048">Käännä aina</translation>
 <translation id="2175607476662778685">Pikakäynnistysvalikko</translation>
 <translation id="2176045495080708525">Seuraavat laajennukset on asennettu:</translation>
 <translation id="2177950615300672361">Incognito-välilehti: <ph name="TAB_NAME" /></translation>
@@ -1936,7 +1939,6 @@
 <translation id="3688507211863392146">Kirjoittaa sovelluksessa avaamiisi tiedostoihin ja kansioihin.</translation>
 <translation id="3688526734140524629">Vaihda kanavaa</translation>
 <translation id="3688578402379768763">Ajan tasalla</translation>
-<translation id="3690976161240450479">Sisäänkirjautuminen epäonnistui. Ota yhteyttä järjestelmänvalvojaan tai yritä uudelleen.</translation>
 <translation id="3693415264595406141">Salasana:</translation>
 <translation id="3694027410380121301">Valitse edellinen välilehti</translation>
 <translation id="3694678678240097321">Pyydä käyttäjältä lupaa laajennuksen halutessa suorittaa sivulla koodia, jos laajennus pyysi lupaa suorittaa koodia kaikissa URL-osoitteissa.</translation>
@@ -2229,6 +2231,7 @@
 <translation id="4116663294526079822">Salli aina tässä sivustossa</translation>
 <translation id="411666854932687641">Yksityinen muisti</translation>
 <translation id="4118990158415604803">Järjestelmänvalvoja on estänyt yhteyden muodostamisen muihin verkkoihin.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{ja 1 muu}other{ja # muuta}}</translation>
 <translation id="4119828560634133962">Rekisteröintikehotus tulostuksen esikatselussa</translation>
 <translation id="4120329147617730038">Järjestelmänvalvoja on kieltänyt käyttäjää <ph name="USER_EMAIL" /> kirjautumasta sisään useisiin tileihin.
 Kaikkien käyttäjien täytyy kirjautua ulos jatkaakseen käyttöä.</translation>
@@ -2367,9 +2370,11 @@
 <translation id="4345703751611431217">Ohjelmistojen yhteensopimattomuus: lisätietoja</translation>
 <translation id="4348766275249686434">Kerää virheet</translation>
 <translation id="4350019051035968019">Tätä laitetta ei voi rekisteröidä verkkotunnukselle, johon tilisi kuuluu, koska laite on merkitty eri verkkotunnuksen hallinnoitavaksi.</translation>
+<translation id="4354806558096370704">Ottaa käyttöön natiivi-CUPS-tulostuksen taustaosan.</translation>
 <translation id="4358697938732213860">Lisää osoite</translation>
 <translation id="4359408040881008151">Asennettiin, koska muut laajennukset ovat riippuvaisia tästä laajennuksesta.</translation>
 <translation id="4361190688154226069">Suorakulmaan perustuva kohdistaminen näkymissä</translation>
+<translation id="4364414793200746179">Android MediaStyle -ilmoitus</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> ladattiin.</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> jakaa ikkunan.</translation>
 <translation id="4364830672918311045">Näytä ilmoitukset</translation>
@@ -2768,6 +2773,7 @@
 <translation id="4988792151665380515">Julkisen avaimen vienti epäonnistui.</translation>
 <translation id="49896407730300355">Käännä &amp;vastapäivään</translation>
 <translation id="4989966318180235467">Tarkista &amp;taustasivu</translation>
+<translation id="4990343175649730969">Lataa Chrome Cleanup Tool</translation>
 <translation id="4991420928586866460">Käytä ylärivin näppäimiä toimintanäppäiminä</translation>
 <translation id="499165176004408815">Käytä suuri kontrasti -tilaa</translation>
 <translation id="4992066212339426712">Poista mykistys</translation>
@@ -3289,6 +3295,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: valitse ja muokkaa</translation>
 <translation id="5741454054957165976">Ota käyttöön uusi versio verkkokirjasinten lataamiseen käytettävästä käyttäjäagentin toimenpiteestä.</translation>
 <translation id="574392208103952083">Keskikoko</translation>
+<translation id="5744368829843057748">Kääntäjän 2016Q2-käyttöliittymä</translation>
 <translation id="5745056705311424885">USB-muistitikku havaittu</translation>
 <translation id="5746169159649715125">Tallenna PDF-muodossa</translation>
 <translation id="5747611503456050045">Poista käytöstä sisällön yli vierittämisen aiheuttama uudelleenlataus.</translation>
@@ -3396,6 +3403,7 @@
 <translation id="5884474295213649357">Tämä välilehti on yhdistetty USB-laitteeseen.</translation>
 <translation id="5885324376209859881">Media-asetusten hallinta…</translation>
 <translation id="5889282057229379085">Keskitason varmenteiden myöntäjien enimmäismäärä: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Kerro, mitä tapahtuu.</translation>
 <translation id="5892290200158927959">Ranskalainen BÉPO-näppäimistö</translation>
 <translation id="5892507820957994680">Ohittaa sisäänrakennetun ohjelmistohahmonnuksen luettelon ja ottaa GPU-kiihdytyksen käyttöön ei-tuetuissa järjestelmäkokoonpanoissa.</translation>
 <translation id="5895138241574237353">Käynnistä uudelleen</translation>
@@ -3537,6 +3545,7 @@
 <translation id="6122093587541546701">Sähköpostiosoite (valinnainen):</translation>
 <translation id="6122875415561139701">Kirjoitustoiminto ei ole sallittu laitteella <ph name="DEVICE_NAME" />.</translation>
 <translation id="6124650939968185064">Seuraavat laajennukset ovat riippuvaisia tästä laajennuksesta:</translation>
+<translation id="6127945163801765632">Ottaa käyttöön Kaikki kirjanmerkit -osion kirjanmerkkien hallinnassa.</translation>
 <translation id="6129938384427316298">Netscape-varmenteen kommentti</translation>
 <translation id="6129953537138746214">Välilyönti</translation>
 <translation id="6132383530370527946">Pienellä painettu teksti</translation>
@@ -3565,6 +3574,7 @@
  valvotun käyttäjän asetukset saattavat silti vielä näkyä hallinnoijalle osoitteessa <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Lisätietoja</translation>
 <translation id="6166185671393271715">Tuo salasanat Chromeen</translation>
+<translation id="6169666352732958425">Työpöydän suoratoisto ei onnistu.</translation>
 <translation id="6171550060231646388">Simuloidun laitteiston Ok Google -toiminnot</translation>
 <translation id="6175314957787328458">Microsoftin toimialueen GUID-tunnus</translation>
 <translation id="6178664161104547336">Valitse varmenne</translation>
@@ -3758,6 +3768,7 @@
 <translation id="6458308652667395253">Hallinnoi JavaScriptin estoa...</translation>
 <translation id="6459488832681039634">Hae valinnan avulla</translation>
 <translation id="6460423884798879930">Kun tämä asetus on käytössä, edellisen asiakasyhteyden SYN-paketissa lähetetään lisätodennustietoja, mikä nopeuttaa tiedonlähetyksen aloitusta.</translation>
+<translation id="6460474910028274178">Kääntäjän kuplakäyttöliittymän käynnistyminen on älykkäämpää ja ulkoasua parannettu.</translation>
 <translation id="6460601847208524483">Hae seuraava</translation>
 <translation id="6462080265650314920">Sovellusten näyttämiseen tulee käyttää sisältötyyppiä <ph name="CONTENT_TYPE" />.</translation>
 <translation id="6462082050341971451">Oletko vielä siellä?</translation>
@@ -3887,6 +3898,7 @@
 <translation id="6663792236418322902">Valitsemasi salasana vaaditaan tämän tiedoston palauttamiseen myöhemmin. Tallenna se varmaan paikkaan.</translation>
 <translation id="6664237456442406323">Tietokoneesi on valitettavasti määritetty virheellisellä laitetunnuksella. Siksi Chrome-käyttöjärjestelmä ei voi asentaa uusimpia tietoturvapäivityksiä ja tietokoneesi <ph name="BEGIN_BOLD" />voi altistua hyökkäyksille<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">Google-tilisi avulla</translation>
+<translation id="667517062706956822">Haluatko, että Google kääntää tämän sivun kielestä <ph name="SOURCE_LANGUAGE" /> kieleen <ph name="TARGET_LANGUAGE" />?</translation>
 <translation id="6675665718701918026">Osoitinlaite yhdistetty.</translation>
 <translation id="6677037229676347494">Odotettiin tunnusta <ph name="EXPECTED_ID" />, mutta tunnus oli <ph name="NEW_ID" />.</translation>
 <translation id="6680028776254050810">Vaihda käyttäjää</translation>
@@ -3938,6 +3950,7 @@
 <translation id="6746392203843147041">lisää äänenvoim.</translation>
 <translation id="6748140994595080445">Muuta tapaa, jolla <ph name="APP_NAME" /> käsittelee ja näyttää kieliä.</translation>
 <translation id="6748465660675848252">Voit jatkaa, mutta vain synkronoidut tietosi ja asetuksesi palautetaan. Kaikki paikalliset tiedot menetetään.</translation>
+<translation id="6751256176799620176">1 kansio valittu</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Incognito)</translation>
 <translation id="6759193508432371551">Tehdasasetusten palauttaminen</translation>
 <translation id="6760765581316020278">Vietnamilainen näppäimistö (VNI)</translation>
@@ -4574,6 +4587,7 @@
 <translation id="7717014941119698257">Ladataan: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">Koulutus aikakatkaistiin.</translation>
 <translation id="771953673318695590">Laadunvalvonta</translation>
+<translation id="7720375555307821262"><ph name="BEGIN_LINK" />Kirjaudu Chromeen<ph name="END_LINK" />, niin voit valvoa tätä käyttäjää.</translation>
 <translation id="7724603315864178912">Leikkaa</translation>
 <translation id="7730449930968088409">Ota ruutukaappaus</translation>
 <translation id="7730494089396812859">Näytä pilvivarmuuskopioinnin tiedot.</translation>
@@ -4667,7 +4681,6 @@
 <translation id="7859704718976024901">Selaushistoria</translation>
 <translation id="7861215335140947162">&amp;Lataukset</translation>
 <translation id="7864539943188674973">Poista Bluetooth käytöstä</translation>
-<translation id="7868891395842935202">Ottaa käyttöön Experimental Framework -tilan, jolla hallitaan pääsyä sovellusliittymäkokeiluihin.</translation>
 <translation id="7870576007982733437">Käytä järjestelmän latauksienhallintaa, kun mahdollista</translation>
 <translation id="7870790288828963061">Ei löytynyt kioskisovelluksia, joiden versio on uudempi. Ei päivitettävää. Irrota USB-tikku.</translation>
 <translation id="787150342916295244">Luottokortin skannaus</translation>
@@ -4996,7 +5009,6 @@
 <translation id="8309505303672555187">Valitse verkko:</translation>
 <translation id="8312871300878166382">Liitä kansioon</translation>
 <translation id="8314013494437618358">Monisäikeinen koostaminen</translation>
-<translation id="8314576811984836978">Experimental Framework</translation>
 <translation id="8319414634934645341">Laajennettu avaimen käyttö</translation>
 <translation id="8322814362483282060">Tältä sivulta on estetty mikrofonin käyttö.</translation>
 <translation id="8326478304147373412">PKCS #7, varmenneketju</translation>
@@ -5057,7 +5069,6 @@
 <translation id="8418240940464873056">Kiinalaiset kirjaimet -tila</translation>
 <translation id="8418445294933751433">&amp;Näytä välilehtenä</translation>
 <translation id="8420060421540670057">Näytä Google Docs -tiedostot</translation>
-<translation id="8420728540268437431">Tätä sivua käännetään…</translation>
 <translation id="842274098655511832">WebGL-luonnoslaajennukset</translation>
 <translation id="8424039430705546751">alas</translation>
 <translation id="8425213833346101688">Vaihda</translation>
@@ -5244,6 +5255,7 @@
 <translation id="8690754533598178758">Adobe Flash Player käyttää eri poikkeuksia mikrofonille.</translation>
 <translation id="8691686986795184760">(Yrityskäytännön käyttöön ottama)</translation>
 <translation id="869257642790614972">Avaa viimeksi suljettu välilehti uudelleen</translation>
+<translation id="8695770993395462321">Natiivi-CUPS</translation>
 <translation id="8695825812785969222">&amp;Avaa sijainti...</translation>
 <translation id="8698464937041809063">Google-piirros</translation>
 <translation id="869884720829132584">Sovellusvalikko</translation>
@@ -5585,6 +5597,7 @@
 <translation id="9189690067274055051">Avaa puhelimesi lukitus ja tuo se lähemmäs laitetta <ph name="DEVICE_TYPE" />, jotta voit kirjoittaa.</translation>
 <translation id="9190063653747922532">L2TP/IPsec + esijaettu avain</translation>
 <translation id="9201305942933582053">Googlen Nyt-palvelu Chromelle.</translation>
+<translation id="9202646163273566462">Sallii Kaikki kirjanmerkit -näkymän käytön kirjanmerkkien hallinnan oletuskohteena.</translation>
 <translation id="9203398526606335860">&amp;Profilointi on käytössä</translation>
 <translation id="9203478404496196495">Poista välilehden mykistys</translation>
 <translation id="9203962528777363226">Tämän laitteen järjestelmänvalvoja on estänyt uusien käyttäjien lisäämisen</translation>
@@ -5611,6 +5624,7 @@
 <translation id="939736085109172342">Uusi kansio</translation>
 <translation id="940425055435005472">Kirjasimen koko:</translation>
 <translation id="941543339607623937">Virheellinen yksityinen avain.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{ei yhtään}=1{1 sovellus ($1)}=2{2 sovellusta ($1, $2)}other{# sovellusta ($1, $2 ja $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> jakaa Chrome-välilehden ja ääntä.</translation>
 <translation id="942954117721265519">Tässä hakemistossa ei ole kuvia.</translation>
 <translation id="945522503751344254">Lähetä palautetta</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index 5597444..10bbd69 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -294,6 +294,7 @@
 <translation id="1415990189994829608">Ang <ph name="EXTENSION_NAME" /> (extension ID "<ph name="EXTENSION_ID" />") ay hindi pinapayagan sa ganitong uri ng session.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Hala! Nabigong mabuo ang random RSA pribadong key.</translation>
+<translation id="1421115928968836111">Aalisan nito ng pahintulot ang mga lisensya ng Flash Player para sa pinoprotektahang content.</translation>
 <translation id="1425734930786274278">Na-block ang sumusunod na cookies (bina-block ang third-party na cookies nang walang pagbubukod):</translation>
 <translation id="1426410128494586442">Oo</translation>
 <translation id="1427049173708736891">Panatilihing naka-unlock ang iyong <ph name="DEVICE_TYPE" /> kapag naka-unlock at nasa malapit ang iyong Android phone—hindi mo na kailangang i-type ang iyong password.</translation>
@@ -522,6 +523,7 @@
 <translation id="1707463636381878959">Ibahagi ang network na ito sa iba pang mga user</translation>
 <translation id="1708199901407471282">Kapag nagbubukas ng iminungkahing webpage mula sa Page ng Bagong Tab, kung may nakabukas nang tab para sa suhestyon, lumipat sa isang iyon sa halip na i-load ang suhestyon sa bagong tab.</translation>
 <translation id="1708338024780164500">(Hindi aktibo)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Nabigo ang pag-zip, hindi inaasahang error: $1</translation>
 <translation id="1715941336038158809">Hindi wastong user name o password.</translation>
 <translation id="1717733954209022288">Checkbox para sa pagse-save ng Google Payments card</translation>
@@ -800,6 +802,7 @@
 <translation id="2168214441502403371">Persian keyboard</translation>
 <translation id="2168725742002792683">Mga file extension</translation>
 <translation id="2169062631698640254">Mag-sign in pa rin</translation>
+<translation id="2175042898143291048">Palagi itong gawin</translation>
 <translation id="2175607476662778685">Quick launch bar</translation>
 <translation id="2176045495080708525">Naka-install na ngayon ang sumusunod na mga extension:</translation>
 <translation id="2177950615300672361">Tab na Incognito: <ph name="TAB_NAME" /></translation>
@@ -1939,7 +1942,6 @@
 <translation id="3688507211863392146">Mag-write sa mga file at folder na iyong bubuksan sa application</translation>
 <translation id="3688526734140524629">Lumipat ng channel</translation>
 <translation id="3688578402379768763">Napapanahon</translation>
-<translation id="3690976161240450479">Hindi nakapag-sign in. Mangyaring makipag-ugnayan sa iyong administrator o subukang muli.</translation>
 <translation id="3693415264595406141">Password:</translation>
 <translation id="3694027410380121301">Select Previous Tab</translation>
 <translation id="3694678678240097321">Nangangailangan ng pahintulot ng user para sa isang extension na nagpapagana ng script sa page, kung humiling ng pahintulot ang extension na gumana sa lahat ng url.</translation>
@@ -2236,6 +2238,7 @@
 <translation id="4116663294526079822">Palaging payagan sa site na ito</translation>
 <translation id="411666854932687641">Pribadong Memorya</translation>
 <translation id="4118990158415604803">Ang pagkonekta sa iba pang mga network ay na-disable ng iyong administrator.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{at 1 pa}one{at # pa}other{at # pa}}</translation>
 <translation id="4119828560634133962">Mga Promo sa Pagpaparehistro ng Print Preview</translation>
 <translation id="4120329147617730038">Hindi pinayagan ng isang administrator ang multiple na pag-sign in para sa <ph name="USER_EMAIL" />.
 Dapat mag-sign out ang lahat ng user upang magpatuloy.</translation>
@@ -2375,9 +2378,11 @@
 <translation id="4345703751611431217">Pagiging hindi tugma ng software: Matuto nang higit pa</translation>
 <translation id="4348766275249686434">Kumolekta ng mga error</translation>
 <translation id="4350019051035968019">Hindi maaaring i-enroll ang device na ito sa domain kung saan nabibilang ang iyong account dahil minarkahan ang iyong device para mapamahalaan ng ibang domain.</translation>
+<translation id="4354806558096370704">Ine-enable ang paggamit ng backend ng pagpi-print ng native na CUPS.</translation>
 <translation id="4358697938732213860">Magdagdag ng isang address</translation>
 <translation id="4359408040881008151">Na-install dahil sa (mga) nakadependeng extension.</translation>
 <translation id="4361190688154226069">Rect-based na pag-target sa mga view</translation>
+<translation id="4364414793200746179">Notification ng Android MediaStyle</translation>
 <translation id="4364444725319685468">Na-download na ang <ph name="FILE_NAME" /></translation>
 <translation id="4364567974334641491">Nagbabahagi ng window ang <ph name="APP_NAME" />.</translation>
 <translation id="4364830672918311045">Ipakita ang mga notification</translation>
@@ -2781,6 +2786,7 @@
 <translation id="4988792151665380515">Nabigong i-export ang pampublikong key.</translation>
 <translation id="49896407730300355">I-rotate p&amp;akaliwa</translation>
 <translation id="4989966318180235467">Siyasatin ang pahina ng &amp;background</translation>
+<translation id="4990343175649730969">I-download ang Chrome Cleanup Tool</translation>
 <translation id="4991420928586866460">Ituring ang mga top-row key bilang mga function key</translation>
 <translation id="499165176004408815">Gamitin ang high contrast mode</translation>
 <translation id="4992066212339426712">I-unmute</translation>
@@ -3086,7 +3092,7 @@
 <translation id="5425722269016440406">Online ka dapat upang i-off ang Smart Lock dahil naka-sync ang setting na ito sa iyong telepono at iba pang mga device. Mangyaring kumonekta muna sa isang network.</translation>
 <translation id="5425863515030416387">Mag-sign in nang madali sa lahat ng device</translation>
 <translation id="5427459444770871191">I-rotate &amp;Pakanan</translation>
-<translation id="5428105026674456456">Espanyol</translation>
+<translation id="5428105026674456456">Spanish</translation>
 <translation id="542872847390508405">Nagba-browse ka bilang isang Bisita</translation>
 <translation id="5428850089342283580"><ph name="ACCNAME_APP" /> (Available ang update)</translation>
 <translation id="5429818411180678468">Fullwidth</translation>
@@ -3304,6 +3310,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: piliin upang i-edit</translation>
 <translation id="5741454054957165976">I-enable ang Bagong bersyon ng User Agent Intervention para sa paglo-load ng WebFonts.</translation>
 <translation id="574392208103952083">Katamtaman</translation>
+<translation id="5744368829843057748">I-translate ang 2016Q2 UI</translation>
 <translation id="5745056705311424885">Nakita ang USB memory stick</translation>
 <translation id="5746169159649715125">I-save bilang PDF</translation>
 <translation id="5747611503456050045">Mati-trigger ang mga pag-reload ng page kapag nag-overscroll sa content nang pa-vertical.</translation>
@@ -3411,6 +3418,7 @@
 <translation id="5884474295213649357">Nakakonekta ang tab na ito sa isang USB device.</translation>
 <translation id="5885324376209859881">Pamahalaan ang mga setting ng media...</translation>
 <translation id="5889282057229379085">Maximum na bilang ng intermediate CAs: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Sabihin sa amin kung ano ang nangyayari.</translation>
 <translation id="5892290200158927959">French na BÉPO keyboard</translation>
 <translation id="5892507820957994680">Ino-override ang built-in na listahan ng pag-render ng software at pinapagana ang GPU-acceleration sa mga hindi sinusuportahang configuration ng system.</translation>
 <translation id="5895138241574237353">I-restart</translation>
@@ -3554,6 +3562,7 @@
 <translation id="6122093587541546701">Email (opsyonal):</translation>
 <translation id="6122875415561139701">Hindi pinapahintulutan ang write na operation sa: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="6124650939968185064">Nakadepende ang mga sumusunod na extension sa extension na ito:</translation>
+<translation id="6127945163801765632">I-enable ang seksyong "lahat ng bookmark" sa bookmark manager.</translation>
 <translation id="6129938384427316298">Komento sa Netscape Certificate</translation>
 <translation id="6129953537138746214">Puwang</translation>
 <translation id="6132383530370527946">Ang maliit na naka-print</translation>
@@ -3580,6 +3589,7 @@
 <translation id="6164005077879661055">Permanenteng matatanggal ang lahat ng file at lokal na data na kaugnay ng pinangangasiwaang user sa oras na alisin ang pinangangasiwaang user na ito. Maaari pa ring makita ng manager ang mga nabisitang website at setting para sa pinangangasiwaang user na ito sa <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Matuto nang higit pa</translation>
 <translation id="6166185671393271715">Mag-import ng Mga Password sa Chrome</translation>
+<translation id="6169666352732958425">Hindi ma-cast ang desktop.</translation>
 <translation id="6171550060231646388">Mga simulated na feature ng hardware para sa 'Ok Google'</translation>
 <translation id="6175314957787328458">Microsoft Domain GUID</translation>
 <translation id="6178664161104547336">Pumili ng certificate</translation>
@@ -3773,6 +3783,7 @@
 <translation id="6458308652667395253">Pamahalaan ang pagharang ng JavaScript...</translation>
 <translation id="6459488832681039634">Use Selection for Find</translation>
 <translation id="6460423884798879930">I-enable ang pagpipiliang ito upang magpadala ng karagdagang impormasyon sa pagpapatunay sa unang SYN packet para sa isang client na nakakonekta dati, na nagbibigay-daan sa mas mabilis na pagsisimula ng pagpapadala ng data.</translation>
+<translation id="6460474910028274178">Pinahusay ang logic ng pagti-trigger at dating para sa Translate Bubble UI</translation>
 <translation id="6460601847208524483">Find Next</translation>
 <translation id="6462080265650314920">Dapat maihatid ang apps gamit ang uri ng nilalaman na "<ph name="CONTENT_TYPE" />."</translation>
 <translation id="6462082050341971451">Nariyan ka pa ba?</translation>
@@ -3902,6 +3913,7 @@
 <translation id="6663792236418322902">Kakailanganin ang pipiliin mong password upang ibalik ang file na ito sa ibang pagkakataon.  Pakitala ito sa isang ligtas na lokasyon.</translation>
 <translation id="6664237456442406323">Sa kasamaang-palad, na-configure ang iyong computer gamit ang isang hardware ID na mali ang pagkakabuo. Pinipigilan nitong mag-update ang Chrome OS upang magkaroon ng mga pinakabagong pag-aayos sa seguridad at <ph name="BEGIN_BOLD" />maaaring mawalan ng proteksyon laban sa mga nakakahamak na pag-atake<ph name="END_BOLD" /> ang iyong computer.</translation>
 <translation id="6666647326143344290">gamit ang iyong Google Account</translation>
+<translation id="667517062706956822">Gusto mo bang i-translate ng Google ang page na ito mula sa <ph name="SOURCE_LANGUAGE" /> patungo sa <ph name="TARGET_LANGUAGE" />?</translation>
 <translation id="6675665718701918026">May nakakonektang pointing device</translation>
 <translation id="6677037229676347494">"<ph name="EXPECTED_ID" />" ang inaasahang ID, ngunit "<ph name="NEW_ID" />" ang ID.</translation>
 <translation id="6680028776254050810">Magpalit ng mga User</translation>
@@ -3953,6 +3965,7 @@
 <translation id="6746392203843147041">lakasan ang volume</translation>
 <translation id="6748140994595080445">Baguhin kung paano namamahala at nagpapakita ang <ph name="APP_NAME" /> ng mga wika.</translation>
 <translation id="6748465660675848252">Maaari kang magpatuloy ngunit ang iyong naka-sync na data at mga setting lang ang maibabalik. Mawawala ang lahat ng iyong lokal na data.</translation>
+<translation id="6751256176799620176">1 folder ang napili</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Incognito)</translation>
 <translation id="6759193508432371551">Factory reset</translation>
 <translation id="6760765581316020278">Vietnamese keyboard (VNI)</translation>
@@ -4595,6 +4608,7 @@
 <translation id="7717014941119698257">Nagda-download: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">Nag-time out ang pagsasanay</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262">Upang pangasiwaan ang taong ito, <ph name="BEGIN_LINK" />mag-sign in sa Chrome<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">I-cut</translation>
 <translation id="7730449930968088409">Kunan ang nilalaman ng iyong screen</translation>
 <translation id="7730494089396812859">Ipakita ang mga detalye ng pag-back up sa Cloud</translation>
@@ -4688,7 +4702,6 @@
 <translation id="7859704718976024901">History ng Pagba-browse</translation>
 <translation id="7861215335140947162">&amp;Mga download</translation>
 <translation id="7864539943188674973">Huwag Paganahin ang Bluetooth</translation>
-<translation id="7868891395842935202">Ine-enable ang Pang-eksperimentong Framework para sa pagkontrol sa access sa mga eksperimento sa API.</translation>
 <translation id="7870576007982733437">Gamitin ang system download manager kapag naaangkop.</translation>
 <translation id="7870790288828963061">Walang nahanap na mga Kiosk app na may mas bagong bersyon. Walang ia-update. Mangyaring alisin ang USB stick.</translation>
 <translation id="787150342916295244">Pagsa-scan ng credit card</translation>
@@ -5019,7 +5032,6 @@
 <translation id="8309505303672555187">Pumili ng network:</translation>
 <translation id="8312871300878166382">I-paste sa loob ng folder</translation>
 <translation id="8314013494437618358">Naka-thread na pag-composite</translation>
-<translation id="8314576811984836978">Pang-eksperimentong Framework.</translation>
 <translation id="8319414634934645341">Extended na Paggamit ng Key</translation>
 <translation id="8322814362483282060">Na-block na ang pahinang ito sa pag-access sa iyong mikropono.</translation>
 <translation id="8326478304147373412">PKCS #7, certificate chain</translation>
@@ -5081,7 +5093,6 @@
 <translation id="8418240940464873056">Mode na Hanja</translation>
 <translation id="8418445294933751433">&amp;Ipakita bilang tab</translation>
 <translation id="8420060421540670057">Ipakita ang mga file ng Google Docs</translation>
-<translation id="8420728540268437431">Isinasalin ang pahinang ito ...</translation>
 <translation id="842274098655511832">Mga Draft na Extension ng WebGL</translation>
 <translation id="8424039430705546751">pababa</translation>
 <translation id="8425213833346101688">Baguhin</translation>
@@ -5269,6 +5280,7 @@
 <translation id="8690754533598178758">Magkakaiba ang mga exception ng mikropono sa Adobe Flash Player.</translation>
 <translation id="8691686986795184760">(Pinapagana ng patakaran ng enterprise)</translation>
 <translation id="869257642790614972">Muling buksan ang huling nakasarang tab</translation>
+<translation id="8695770993395462321">Native na CUPS</translation>
 <translation id="8695825812785969222">Buksan ang &amp;Lokasyon...</translation>
 <translation id="8698464937041809063">Drawing ng Google</translation>
 <translation id="869884720829132584">Menu ng mga application</translation>
@@ -5612,6 +5624,7 @@
 <translation id="9189690067274055051">I-unlock ang iyong telepono at ilapit ito sa <ph name="DEVICE_TYPE" /> mo upang makapasok.</translation>
 <translation id="9190063653747922532">L2TP/IPsec + paunang nakabahaging key</translation>
 <translation id="9201305942933582053">Google Now para sa Chrome!</translation>
+<translation id="9202646163273566462">Ine-enable ang view ng lahat ng bookmark bilang default na patutunguhan ng bookmark manager.</translation>
 <translation id="9203398526606335860">&amp;Pinagana ang pag-profile</translation>
 <translation id="9203478404496196495">Alisin sa pagkaka-mute ang tab</translation>
 <translation id="9203962528777363226">Hindi pinagana ng administrator ng device na ito ang pagdaragdag ng mga bagong user</translation>
@@ -5638,6 +5651,7 @@
 <translation id="939736085109172342">Bagong folder</translation>
 <translation id="940425055435005472">Laki ng Font:</translation>
 <translation id="941543339607623937">Di-wastong pribadong key.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{wala}=1{1 app ($1)}=2{2 app ($1, $2)}one{# app ($1, $2, $3)}other{# na app ($1, $2, $3)}}</translation>
 <translation id="942532530371314860">Nagbabahagi ng tab ng Chrome at audio ang <ph name="APP_NAME" />.</translation>
 <translation id="942954117721265519">Walang mga larawan sa direktoryong ito.</translation>
 <translation id="945522503751344254">Magpadala ng feedback...</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index bb1c496c..1a54ea9 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (ID d'extension "<ph name="EXTENSION_ID" />") n'est pas autorisé à se joindre à ce type de session.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Échec de génération de clé privée RSA aléatoire</translation>
+<translation id="1421115928968836111">Cette option annule l'autorisation des licences Flash Player pour le contenu protégé.</translation>
 <translation id="1425734930786274278">Les cookies suivants ont été bloqués (tous les cookies tiers sont bloqués, sans exception) :</translation>
 <translation id="1426410128494586442">Oui</translation>
 <translation id="1427049173708736891">Votre <ph name="DEVICE_TYPE" /> reste déverrouillé lorsque votre téléphone Android est déverrouillé et se trouve à proximité ; nul besoin de saisir votre mot de passe.</translation>
@@ -521,6 +522,7 @@
 <translation id="1707463636381878959">Partager ce réseau avec d'autres utilisateurs</translation>
 <translation id="1708199901407471282">Lorsque vous ouvrez une page Web suggérée à partir de la page Nouvel onglet, si un onglet est déjà ouvert pour cette suggestion, passez à cet onglet au lieu de charger la suggestion dans le nouvel onglet.</translation>
 <translation id="1708338024780164500">(Inactive)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (ID : <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Échec de la compression au format .zip, en raison d'une erreur inattendue : $1.</translation>
 <translation id="1715941336038158809">Nom d'utilisateur ou mot de passe incorrect</translation>
 <translation id="1717733954209022288">Case à cocher permettant d'enregistrer des cartes Google Payments</translation>
@@ -797,6 +799,7 @@
 <translation id="2168214441502403371">Clavier persan</translation>
 <translation id="2168725742002792683">Extensions de fichier</translation>
 <translation id="2169062631698640254">Se connecter quand même</translation>
+<translation id="2175042898143291048">Toujours procéder ainsi</translation>
 <translation id="2175607476662778685">Barre de lancement rapide</translation>
 <translation id="2176045495080708525">Les extensions suivantes ont été installées :</translation>
 <translation id="2177950615300672361">Onglet de navigation privée : <ph name="TAB_NAME" /></translation>
@@ -1936,7 +1939,6 @@
 <translation id="3688507211863392146">Accéder en écriture aux fichiers et aux dossiers ouverts dans l'application</translation>
 <translation id="3688526734140524629">Changer de version</translation>
 <translation id="3688578402379768763">Mise à jour effectuée</translation>
-<translation id="3690976161240450479">Échec de la connexion. Veuillez contacter votre administrateur ou réessayer.</translation>
 <translation id="3693415264595406141">Mot de passe :</translation>
 <translation id="3694027410380121301">Sélectionner l'onglet précédent</translation>
 <translation id="3694678678240097321">Demander à l'utilisateur d'autoriser une extension exécutant un script sur la page, si l'extension a demandé l'autorisation d'être exécutée pour toutes les URL.</translation>
@@ -2232,6 +2234,7 @@
 <translation id="4116663294526079822">Toujours autoriser sur ce site</translation>
 <translation id="411666854932687641">Mémoire privée</translation>
 <translation id="4118990158415604803">Votre administrateur a désactivé la connexion à d'autres réseaux.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{et 1 autre}one{et # autre}other{et # autres}}</translation>
 <translation id="4119828560634133962">Messages invitant à activer l'aperçu avant impression</translation>
 <translation id="4120329147617730038">Un administrateur a désactivé la connexion multicompte pour <ph name="USER_EMAIL" />.
 Tous les utilisateurs doivent se déconnecter pour continuer.</translation>
@@ -2371,9 +2374,11 @@
 <translation id="4345703751611431217">Incompatibilité logicielle : En savoir plus</translation>
 <translation id="4348766275249686434">Recueillir les erreurs</translation>
 <translation id="4350019051035968019">Impossible d'enregistrer cet appareil dans le domaine auquel appartient votre compte, car il est marqué pour être géré par un autre domaine.</translation>
+<translation id="4354806558096370704">Active l'utilisation du backend d'impression CUPS natif.</translation>
 <translation id="4358697938732213860">Ajouter une adresse</translation>
 <translation id="4359408040881008151">Installée, car une ou plusieurs extensions dépendent de celle-ci.</translation>
 <translation id="4361190688154226069">Ciblage basé sur un rectangle</translation>
+<translation id="4364414793200746179">Notification MediaStyle Android</translation>
 <translation id="4364444725319685468">"<ph name="FILE_NAME" />" téléchargé</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> partage une fenêtre.</translation>
 <translation id="4364830672918311045">Afficher les notifications</translation>
@@ -2776,6 +2781,7 @@
 <translation id="4988792151665380515">Échec d'exportation de la clé publique</translation>
 <translation id="49896407730300355">Rotation d&amp;ans le sens contraire des aiguilles d'une montre</translation>
 <translation id="4989966318180235467">Inspecter la page d'&amp;arrière-plan</translation>
+<translation id="4990343175649730969">Télécharger l'outil de nettoyage Chrome</translation>
 <translation id="4991420928586866460">Considérer les touches de la rangée supérieure comme des touches de fonction</translation>
 <translation id="499165176004408815">Utiliser le mode Contraste élevé</translation>
 <translation id="4992066212339426712">Réactiver le son</translation>
@@ -3300,6 +3306,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" /> : sélectionner pour modifier</translation>
 <translation id="5741454054957165976">Activer la nouvelle version de l'intervention du user-agent pour le chargement des polices Web.</translation>
 <translation id="574392208103952083">Moyenne</translation>
+<translation id="5744368829843057748">Traduire l'interface utilisateur du 2e trimestre 2016</translation>
 <translation id="5745056705311424885">Mémoire USB détectée</translation>
 <translation id="5746169159649715125">Enregistrer au format PDF</translation>
 <translation id="5747611503456050045">L'actualisation des pages est déclenchée par un défilement vertical prolongé du contenu.</translation>
@@ -3407,6 +3414,7 @@
 <translation id="5884474295213649357">Cet onglet est associé à un périphérique USB.</translation>
 <translation id="5885324376209859881">Gérer les paramètres multimédias…</translation>
 <translation id="5889282057229379085">Le nombre maximal d'autorités de certification intermédiaires a été dépassé : <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Décrivez-nous le problème rencontré</translation>
 <translation id="5892290200158927959">Clavier BÉPO français</translation>
 <translation id="5892507820957994680">Remplace la liste intégrée de rendu logiciel et active l'accélération graphique pour les configurations système non compatibles.</translation>
 <translation id="5895138241574237353">Redémarrer</translation>
@@ -3550,6 +3558,7 @@
 <translation id="6122093587541546701">E-mail (facultatif) :</translation>
 <translation id="6122875415561139701">L'opération d'écriture n'est pas autorisée sur l'appareil <ph name="DEVICE_NAME" />.</translation>
 <translation id="6124650939968185064">Les extensions suivantes dépendent de cette extension :</translation>
+<translation id="6127945163801765632">Activer la section "Tous les favoris" dans le gestionnaire de favoris.</translation>
 <translation id="6129938384427316298">Commentaire du certificat Netscape</translation>
 <translation id="6129953537138746214">Espace</translation>
 <translation id="6132383530370527946">Conditions générales</translation>
@@ -3576,6 +3585,7 @@
 <translation id="6164005077879661055">Tous les fichiers et les données locales associés à l'utilisateur supervisé seront définitivement supprimés en même temps que cet utilisateur. Le gestionnaire peut toujours accéder aux sites Web consultés par l'utilisateur supervisé et aux paramètres de celui-ci à l'adresse <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">En savoir plus</translation>
 <translation id="6166185671393271715">Importer des mots de passe dans Chrome</translation>
+<translation id="6169666352732958425">Impossible de caster le bureau</translation>
 <translation id="6171550060231646388">Fonctionnalités "Ok Google" de matériel simulé</translation>
 <translation id="6175314957787328458">GUID de domaine Microsoft</translation>
 <translation id="6178664161104547336">Sélectionner un certificat</translation>
@@ -3769,6 +3779,7 @@
 <translation id="6458308652667395253">Configurer le blocage de JavaScript...</translation>
 <translation id="6459488832681039634">Rechercher la sélection</translation>
 <translation id="6460423884798879930">Activez cette option pour envoyer des informations d'authentification supplémentaires dans le paquet SYN initial d'un client connecté précédemment. Cela vous garantit un démarrage plus rapide de l'envoi de données.</translation>
+<translation id="6460474910028274178">Aspect visuel et logique de déclenchement améliorés pour l'interface utilisateur Traduction par info-bulle</translation>
 <translation id="6460601847208524483">Rechercher le suivant</translation>
 <translation id="6462080265650314920">Les applications doivent être diffusées avec le type de contenu <ph name="CONTENT_TYPE" />.</translation>
 <translation id="6462082050341971451">Êtes-vous toujours là ?</translation>
@@ -3898,6 +3909,7 @@
 <translation id="6663792236418322902">Le mot de passe choisi vous sera demandé pour restaurer le fichier. Veillez à le conserver en lieu sûr.</translation>
 <translation id="6664237456442406323">Malheureusement, votre ordinateur est configuré avec un ID matériel incorrect. Cette défaillance empêche l'installation des derniers correctifs de sécurité sur Chrome OS et rend votre ordinateur <ph name="BEGIN_BOLD" />potentiellement vulnérable aux attaques malveillantes<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">avec votre compte Google</translation>
+<translation id="667517062706956822">Souhaitez-vous que Google traduise cette page de la langue "<ph name="SOURCE_LANGUAGE" />" vers la langue "<ph name="TARGET_LANGUAGE" />" ?</translation>
 <translation id="6675665718701918026">Dispositif de pointage connecté</translation>
 <translation id="6677037229676347494">Identifiant "<ph name="NEW_ID" />" reçu au lieu de l'identifiant "<ph name="EXPECTED_ID" />" attendu.</translation>
 <translation id="6680028776254050810">Changer d'utilisateur</translation>
@@ -3949,6 +3961,7 @@
 <translation id="6746392203843147041">augmenter le volume</translation>
 <translation id="6748140994595080445">Modifier la gestion et l'affichage des langues dans <ph name="APP_NAME" /></translation>
 <translation id="6748465660675848252">Vous pouvez continuer, mais seules les données que vous avez synchronisées seront restaurées (de même que vos paramètres). Toutes les données stockées en local seront perdues.</translation>
+<translation id="6751256176799620176">1 dossier sélectionné</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Navigation privée)</translation>
 <translation id="6759193508432371551">Rétablir la configuration d'usine</translation>
 <translation id="6760765581316020278">Clavier vietnamien (VNI)</translation>
@@ -4587,6 +4600,7 @@
 <translation id="7717014941119698257">Téléchargement : <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">La formation a expiré.</translation>
 <translation id="771953673318695590">Contrôle qualité</translation>
+<translation id="7720375555307821262">Pour superviser cette personne, <ph name="BEGIN_LINK" />connectez-vous à Chrome<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">Couper</translation>
 <translation id="7730449930968088409">Effectuer une capture d'écran</translation>
 <translation id="7730494089396812859">Afficher les détails de la sauvegarde Cloud</translation>
@@ -4680,7 +4694,6 @@
 <translation id="7859704718976024901">Historique de navigation</translation>
 <translation id="7861215335140947162">&amp;Téléchargements</translation>
 <translation id="7864539943188674973">Désactiver le Bluetooth</translation>
-<translation id="7868891395842935202">Active le cadre expérimental permettant de contrôler l'accès aux expériences de l'API.</translation>
 <translation id="7870576007982733437">Utiliser le gestionnaire des téléchargements du système le cas échéant</translation>
 <translation id="7870790288828963061">Aucune nouvelle version d'une application kiosque n'a été trouvée. Aucune mise à jour n'est disponible. Veuillez débrancher la clé USB.</translation>
 <translation id="787150342916295244">Lecture de cartes de paiement</translation>
@@ -5010,7 +5023,6 @@
 <translation id="8309505303672555187">Sélectionnez un réseau :</translation>
 <translation id="8312871300878166382">Coller dans le dossier</translation>
 <translation id="8314013494437618358">Composition à plusieurs fils de discussion</translation>
-<translation id="8314576811984836978">Cadre expérimental</translation>
 <translation id="8319414634934645341">Utilisation étendue de la clé</translation>
 <translation id="8322814362483282060">L'accès à votre micro est bloqué pour cette page</translation>
 <translation id="8326478304147373412">PKCS #7, chaîne de certificats</translation>
@@ -5071,7 +5083,6 @@
 <translation id="8418240940464873056">Caractères chinois</translation>
 <translation id="8418445294933751433">Afficher dan&amp;s un onglet</translation>
 <translation id="8420060421540670057">Afficher les fichiers Google Docs</translation>
-<translation id="8420728540268437431">Traduction de la page en cours…</translation>
 <translation id="842274098655511832">Extensions WebGL brouillon</translation>
 <translation id="8424039430705546751">bas</translation>
 <translation id="8425213833346101688">Modifier</translation>
@@ -5258,6 +5269,7 @@
 <translation id="8690754533598178758">Les exceptions Adobe Flash Player utilisées pour le micro sont différentes.</translation>
 <translation id="8691686986795184760">(Activé par une stratégie d'entreprise)</translation>
 <translation id="869257642790614972">Rouvrir le dernier onglet fermé</translation>
+<translation id="8695770993395462321">CUPS natif</translation>
 <translation id="8695825812785969222">Ouvrir une &amp;adresse...</translation>
 <translation id="8698464937041809063">Dessin Google</translation>
 <translation id="869884720829132584">Menu Applications</translation>
@@ -5600,6 +5612,7 @@
 <translation id="9189690067274055051">Déverrouiller votre téléphone et l'approcher de votre <ph name="DEVICE_TYPE" /> pour accéder à celui-ci</translation>
 <translation id="9190063653747922532">L2TP/IPSec + Clé pré-partagée</translation>
 <translation id="9201305942933582053">Google Now pour Chrome</translation>
+<translation id="9202646163273566462">Active la vue "Tous les favoris" en tant que destination par défaut du gestionnaire de favoris.</translation>
 <translation id="9203398526606335860">&amp;Profilage activé</translation>
 <translation id="9203478404496196495">Réactiver le son de l'onglet</translation>
 <translation id="9203962528777363226">L'administrateur de cet appareil a désactivé la fonctionnalité d'ajout de nouveaux utilisateurs</translation>
@@ -5626,6 +5639,7 @@
 <translation id="939736085109172342">Nouveau dossier</translation>
 <translation id="940425055435005472">Taille de police :</translation>
 <translation id="941543339607623937">Clé privée non valide.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{aucun}=1{1 application ($1)}=2{2 applications ($1, $2)}one{# application ($1, $2, $3)}other{# applications ($1, $2, $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> partage un onglet Chrome et un contenu audio.</translation>
 <translation id="942954117721265519">Pas d'image dans ce répertoire.</translation>
 <translation id="945522503751344254">Envoyer le commentaire</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index 5d12216..6998b51d 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (એક્સ્ટેન્શન ID "<ph name="EXTENSION_ID" />") ને આ પ્રકારના સત્રમાં મંજૂરી નથી.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">અરેરે! રેંડમ RSA ખાનગી કી જનરેટ કરવામાં નિષ્ફળ.</translation>
+<translation id="1421115928968836111">આ સુરક્ષિત સામગ્રી માટે Flash Player લાઇસન્સની અધિકૃતિને નામંજૂર કરશે.</translation>
 <translation id="1425734930786274278">નીચેની કૂકીઝ અવરોધિત કરવામાં આવી હતી (તૃતીય-પક્ષ કૂકીઝ કોઈપણ અપવાદ સિવાય અવરોધિત કરવામાં આવી રહી છે):</translation>
 <translation id="1426410128494586442">હા</translation>
 <translation id="1427049173708736891">જ્યારે તમારો Android ફોન અનલૉક હોય અને નજીકમાં હોય ત્યારે તમારા <ph name="DEVICE_TYPE" /> ને અનલૉક કરેલું રાખો—તમારો પાસવર્ડ લખવાની જરૂર નથી.</translation>
@@ -517,6 +518,7 @@
 <translation id="1707463636381878959">અન્ય વપરાશકર્તાઓ સાથે આ નેટવર્ક શેર કરો</translation>
 <translation id="1708199901407471282">નવા ટેબ પૃષ્ઠ પરથી કોઈ સૂચન ખોલવા માટે, જો કોઈ ટેબ સૂચન માટે પહેલાંથી ખુલ્લું હોય, તો નવા ટેબમાં સૂચનને લોડ કરવાને બદલે તે એક પર સ્વિચ કરો.</translation>
 <translation id="1708338024780164500">(નિષ્ક્રિય)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">ઝિપ કરવાનું નિષ્ફળ, અનપેક્ષિત ભૂલ: $1</translation>
 <translation id="1715941336038158809">અમાન્ય લૉગિન નામ અથવા પાસવર્ડ.</translation>
 <translation id="1717733954209022288">Google Payments કાર્ડ સાચવવાનું ચેકબોક્સ</translation>
@@ -794,6 +796,7 @@
 <translation id="2168214441502403371">ફારસી કીબોર્ડ</translation>
 <translation id="2168725742002792683">ફાઇલ એક્સ્ટેંશન</translation>
 <translation id="2169062631698640254">કોઈપણ રીતે સાઇન ઇન કરો</translation>
+<translation id="2175042898143291048">હંમેશાં આ કરો</translation>
 <translation id="2175607476662778685">ઝડપી લૉંચ બાર</translation>
 <translation id="2176045495080708525">નીચેના એક્સ્ટેંશન્સ હવે ઇન્સ્ટોલ થઈ ગયા છે:</translation>
 <translation id="2177950615300672361">છુપો ટેબ: <ph name="TAB_NAME" /></translation>
@@ -1933,7 +1936,6 @@
 <translation id="3688507211863392146">તમે એપ્લિકેશનમાં ખોલી છે તે ફાઇલો અને ફોલ્ડર્સમાં લખો</translation>
 <translation id="3688526734140524629">ચેનલ બદલો</translation>
 <translation id="3688578402379768763">અપ-ટુ-ડેટ</translation>
-<translation id="3690976161240450479">સાઇન-ઇન નિષ્ફળ થયું. કૃપા કરીને તમારા વ્યવસ્થાપકનો સંપર્ક કરો અથવા ફરી પ્રયાસ કરો.</translation>
 <translation id="3693415264595406141">પાસવર્ડ:</translation>
 <translation id="3694027410380121301">પહેલાનું ટૅબ પસંદ કરો</translation>
 <translation id="3694678678240097321">જો એક્સ્ટેન્શને બધા url પર ચાલવા માટેની પરવાનગીની વિનંતી કરી છે, તો પૃષ્ઠ પર ચાલી રહેલા એક્સ્ટેન્શન માટે વપરાશકર્તા સંમતિની જરૂર રહે છે.</translation>
@@ -2229,6 +2231,7 @@
 <translation id="4116663294526079822">હંમેશા આ સાઇટ પર મંજૂરી આપો</translation>
 <translation id="411666854932687641">ખાનગી મેમરી</translation>
 <translation id="4118990158415604803">તમારા વ્યવસ્થાપક દ્વારા અન્ય નેટવર્ક્સને કનેક્ટ કરવાનું અક્ષમ કરેલ છે.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{અને 1 વધુ}one{અને # વધુ}other{અને # વધુ}}</translation>
 <translation id="4119828560634133962">પ્રિંટ પૂર્વાવલોકન નોંધણી પ્રોમોઝ</translation>
 <translation id="4120329147617730038">વ્યવસ્થાપકે <ph name="USER_EMAIL" /> માટે બહુવિધ સાઇન-ઇનને નામંજૂર કર્યું છે.
 બધા વપરાશકર્તાઓએ ચાલુ રાખવા માટે સાઇન આઉટ થવું આવશ્યક છે.</translation>
@@ -2368,9 +2371,11 @@
 <translation id="4345703751611431217">સૉફ્ટવેર અસંગતતા: વધુ જાણો</translation>
 <translation id="4348766275249686434">ભૂલો એકત્રિત કરો</translation>
 <translation id="4350019051035968019">તમારું એકાઉન્ટ જે ડોમેનથી સંબંધિત છે તેમાં આ ઉપકરણની નોંધણી કરી શકાતી નથી કારણ કે ઉપકરણને સંચાલન માટે કોઈ ભિન્ન ડોમેન દ્વારા ચિહ્નિત કરેલ છે.</translation>
+<translation id="4354806558096370704">મૂળ CUPS છાપ બેકએન્ડના ઉપયોગને સક્ષમ કરે છે.</translation>
 <translation id="4358697938732213860">એક સરનામું ઉમેરો</translation>
 <translation id="4359408040881008151">નિર્ભર એક્સ્ટેન્શન(એક્સ્ટેન્શન્સ)ને લીધે ઇન્સ્ટોલ કર્યું.</translation>
 <translation id="4361190688154226069">દૃશ્યોમાં લંબ-આધારિત લક્ષ્યીકરણ</translation>
+<translation id="4364414793200746179">Android MediaStyle સૂચના</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> ડાઉનલોડ કર્યું</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" />, એક વિંડો શેર કરી રહી છે.</translation>
 <translation id="4364830672918311045">સૂચનાઓ પ્રદર્શિત કરો</translation>
@@ -2773,6 +2778,7 @@
 <translation id="4988792151665380515">ખાનગી કી નિકાસ કરવામાં નિષ્ફળ.</translation>
 <translation id="49896407730300355">ઘ&amp;ડિયાળની વિપરિત દિશામાં ફેરવો</translation>
 <translation id="4989966318180235467">&amp;પૃષ્ઠભૂમિ પૃષ્ઠની તપાસ કરો</translation>
+<translation id="4990343175649730969">Chrome સફાઈ સાધન ડાઉનલોડ કરો</translation>
 <translation id="4991420928586866460">શીર્ષ-પંક્તિની કીઝને ફંક્શન કીઝ તરીકે ધ્યાનમાં લો</translation>
 <translation id="499165176004408815">ઉચ્ચ કોન્ટ્રાસ્ટ મોડનો ઉપયોગ કરો</translation>
 <translation id="4992066212339426712">અનમ્યૂટ કરો</translation>
@@ -3295,6 +3301,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: સંપાદિત કરવા માટે પસંદ કરો</translation>
 <translation id="5741454054957165976">WebFonts લોડિંગ માટે વપરાશકર્તા એજન્ટ હસ્તક્ષેપનું નવું સંસ્કરણ સક્ષમ કરો.</translation>
 <translation id="574392208103952083">મધ્યમ</translation>
+<translation id="5744368829843057748">અનુવાદ 2016Q2 UI</translation>
 <translation id="5745056705311424885">USB મેમરી સ્ટિક મળ્યું</translation>
 <translation id="5746169159649715125">PDF તરીકે સાચવો</translation>
 <translation id="5747611503456050045">ઊભી રીતે ઓવરસ્ક્રોલ થતી સામગ્રી દ્વારા ટ્રિગર કરવામાં આવેલ પૃષ્ઠ ફરીથી લોડ.</translation>
@@ -3402,6 +3409,7 @@
 <translation id="5884474295213649357">આ ટૅબ USB ઉપકરણ સાથે કનેક્ટ થયેલ છે.</translation>
 <translation id="5885324376209859881">મીડિયા સેટિંગ્સ સંચાલિત કરો...</translation>
 <translation id="5889282057229379085">ઇન્ટરમિડિયેટ CA ની મહત્તમ સંખ્યા: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">શું થઈ રહ્યું છે તે અમને કહો.</translation>
 <translation id="5892290200158927959">ફ્રેંચ BÉPO કીબોર્ડ</translation>
 <translation id="5892507820957994680">બિલ્ટ-ઇન સૉફ્ટવેર રેંડરિંગ સૂચિને ઓવરરાઇડ કરે છે અને અનસપોર્ટેડ સિસ્ટમ ગોઠવણી પર  GPU-એક્સિલરેશનને સક્ષમ કરે છે.</translation>
 <translation id="5895138241574237353">પુનઃપ્રારંભ કરો</translation>
@@ -3543,6 +3551,7 @@
 <translation id="6122093587541546701">ઇમેઇલ (વૈકલ્પિક):</translation>
 <translation id="6122875415561139701">આના પર લેખન ઓપરેશનને મંજૂરી નથી: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="6124650939968185064">નીચેના એક્સ્ટેન્શન્સ આ એક્સ્ટેન્શન પર નિર્ભર કરે છે:</translation>
+<translation id="6127945163801765632">બુકમાર્ક મેનેજરમાં "તમામ બુકમાર્ક્સ" વિભાગને સક્ષમ કરો.</translation>
 <translation id="6129938384427316298">નેટસ્કેપ પ્રમાણપત્ર ટિપ્પણી</translation>
 <translation id="6129953537138746214">જગ્યા</translation>
 <translation id="6132383530370527946">નાનું પ્રિંટ</translation>
@@ -3569,6 +3578,7 @@
 <translation id="6164005077879661055">એકવાર આ નિરીક્ષણ કરેલ વપરાશકર્તાને દૂર કરવામાં આવે પછી નિરીક્ષણ કરેલ વપરાશકર્તા સાથે સંકળાયેલી બધી ફાઇલો અને સ્થાનિક ડેટા કાયમી રૂપે કાઢી નાંખવામાં આવશે. નિરીક્ષણ કરેલ વપરાશકર્તા માટે મુલાકાત લીધેલી વેબસાઇટ્સ અને સેટિંગ્સ <ph name="MANAGEMENT_URL" /> પરના સંચાલકને હજી પણ દૃશ્યમાન હોઈ શકે છે.</translation>
 <translation id="6165508094623778733">વધુ જાણો</translation>
 <translation id="6166185671393271715">Chrome માં પાસવર્ડ્સને આયાત કરો</translation>
+<translation id="6169666352732958425">ડેસ્કટૉપને કાસ્ટ કરવામાં અસમર્થ.</translation>
 <translation id="6171550060231646388">સિમ્યુલેટ કરેલ હાર્ડવેર 'Ok Google' સુવિધાઓ</translation>
 <translation id="6175314957787328458">Microsoft ડોમેન GUID</translation>
 <translation id="6178664161104547336">એક પ્રમાણપત્ર પસંદ કરો</translation>
@@ -3762,6 +3772,7 @@
 <translation id="6458308652667395253">JavaScript અવરોધિત કરવાનું મેનેજ કરો...</translation>
 <translation id="6459488832681039634">શોધવા માટે પસંદગીનો ઉપયોગ કરો</translation>
 <translation id="6460423884798879930">ઝડપી ડેટા મોકલો પ્રારંભ કરીને, પહેલાંથી કનેક્ટ થયેલા ક્લાયંટ માટે પ્રારંભિક SYN પૅકેટમાં વધારાની અધિકૃતતા માહિતી મોકલવાનો વિકલ્પ સક્ષમ કરો.</translation>
+<translation id="6460474910028274178">અનુવાદ બબલ UI માટે બહેતર બનાવેલ ટ્રિગરિંગ તર્ક અને દેખાવ</translation>
 <translation id="6460601847208524483">આગલું શોધો</translation>
 <translation id="6462080265650314920">એપ્લિકેશનો "<ph name="CONTENT_TYPE" />" સામગ્રી-પ્રકાર સાથેસામગ્રી-પ્રકાર સાથે પ્રદાન થવી જોઈએ.</translation>
 <translation id="6462082050341971451">શું તમે હજી પણ ત્યાં જ છો?</translation>
@@ -3892,6 +3903,7 @@
 <translation id="6663792236418322902">પછીથી આ ફાઇલની પુનઃપ્રાપ્તિ માટે તમે પસંદ કરો છો તે પાસવર્ડની જરૂર પડશે. કૃપા કરીને તેને સુરક્ષિત સ્થાન પર નોંધો.</translation>
 <translation id="6664237456442406323">દુર્ભાગ્યપણે, તમારું કમ્પ્યુટર દૂષિત હાર્ડવેર ID સાથે ગોઠવવમાં આવેલું છે. આ Chrome OS ને નવીનતમ સુરક્ષા સુધારાથી અપડેટ થવાથી અટકાવે છે અને તમારું કમ્પ્યુટર <ph name="BEGIN_BOLD" />દુર્ભાવનાપૂર્ણ હુમલાઓ માટે ભેદ્ય<ph name="END_BOLD" /> હોઈ શકે છે.</translation>
 <translation id="6666647326143344290">તમારા Google એકાઉન્ટથી </translation>
+<translation id="667517062706956822">શું તમે ઇચ્છો છો કે Google, <ph name="SOURCE_LANGUAGE" /> થી <ph name="TARGET_LANGUAGE" /> માં આ પૃષ્ઠનો અનુવાદ કરે?</translation>
 <translation id="6675665718701918026">પોઇંટિંગ ઉપકરણ કનેક્ટ કર્યું</translation>
 <translation id="6677037229676347494">અપેક્ષિત ID "<ph name="EXPECTED_ID" />", પરંતુ ID "<ph name="NEW_ID" />" હતો.</translation>
 <translation id="6680028776254050810">વપરાશકર્તાઓને સ્વિચ કરો</translation>
@@ -3943,6 +3955,7 @@
 <translation id="6746392203843147041">વૉલ્યુમ વધારો</translation>
 <translation id="6748140994595080445"><ph name="APP_NAME" /> કેવી રીતે ભાષાઓને હેન્ડલ અને પ્રદર્શિત કરે છે તે બદલો.</translation>
 <translation id="6748465660675848252">તમે આગળ વધી શકો છો, પરંતુ માત્ર તમારો સમન્વયિત ડેટા અને સેટિંગ્સ પુનઃસ્થાપિત કરવામાં આવશે. બધો સ્થાનિક ડેટા ગુમ થઈ જશે.</translation>
+<translation id="6751256176799620176">1 ફોલ્ડર પસંદ કર્યું</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (છૂપી)</translation>
 <translation id="6759193508432371551">ફેક્ટરી ફરીથી સેટ કરો</translation>
 <translation id="6760765581316020278">વિયેતનામીસ કીબોર્ડ (VNI)</translation>
@@ -4582,6 +4595,7 @@
 <translation id="7717014941119698257">ડાઉનલોડ કરી રહ્યું છે: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">તાલીમ સમય સમાપ્ત</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262">આ વ્યક્તિનું નિરીક્ષણ કરવા માટે, <ph name="BEGIN_LINK" />Chrome માં સાઇન ઇન કરો<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">કાપો</translation>
 <translation id="7730449930968088409">તમારી સ્ક્રીનની સામગ્રી કેપ્ચર કરો</translation>
 <translation id="7730494089396812859">મેઘ બેકઅપ વિગતો દર્શાવો</translation>
@@ -4675,7 +4689,6 @@
 <translation id="7859704718976024901">બ્રાઉઝિંગ ઇતિહાસ</translation>
 <translation id="7861215335140947162">&amp;ડાઉનલોડ્સ</translation>
 <translation id="7864539943188674973">Bluetooth અક્ષમ કરો</translation>
-<translation id="7868891395842935202">API પ્રયોગો પર ઍક્સેસને નિયંત્રિત કરવા માટે પ્રાયોગિક ફ્રેમવર્કને સક્ષમ કરે છે.</translation>
 <translation id="7870576007982733437">લાગુ હોય ત્યારે સિસ્ટમ ડાઉનલોડ સંચાલકનો ઉપયોગ કરો.</translation>
 <translation id="7870790288828963061">નવા સંસ્કરણ સાથેની કોઇ કિઓસ્ક એપ્લિકેશનો મળી નથી. અપડેટ કરવા માટે કંઇ નથી. કૃપા કરીને USB સ્ટીક દૂર કરો.</translation>
 <translation id="787150342916295244">ક્રેડિટ કાર્ડ સ્કેન કરી રહ્યાં છે</translation>
@@ -5001,7 +5014,6 @@
 <translation id="8309505303672555187">નેટવર્ક પસંદ કરો:</translation>
 <translation id="8312871300878166382">ફોલ્ડરમાં પેસ્ટ કરો</translation>
 <translation id="8314013494437618358">થ્રેડેડ સંમિશ્રણ</translation>
-<translation id="8314576811984836978">પ્રાયોગિક ફ્રેમવર્ક.</translation>
 <translation id="8319414634934645341">વિસ્તૃત કી ઉપયોગ</translation>
 <translation id="8322814362483282060">આ પૃષ્ઠને તમારા માઇક્રોફોનને ઍક્સેસ કરવાથી અવરોધિત કરવામાં આવ્યું છે.</translation>
 <translation id="8326478304147373412">PKCS #7, પ્રમાણપત્ર ચેન</translation>
@@ -5063,7 +5075,6 @@
 <translation id="8418240940464873056">હંજા મોડ</translation>
 <translation id="8418445294933751433">ટૅબ તરીકે &amp;બતાવો</translation>
 <translation id="8420060421540670057">Google દસ્તાવેજ ફાઇલો બતાવો</translation>
-<translation id="8420728540268437431">આ પૃષ્ઠનો અનુવાદ કરવામાં આવી રહ્યો છે...</translation>
 <translation id="842274098655511832">WebGL ડ્રાફ્ટ એક્સ્ટેન્શન્સ</translation>
 <translation id="8424039430705546751">નીચે</translation>
 <translation id="8425213833346101688">બદલો</translation>
@@ -5250,6 +5261,7 @@
 <translation id="8690754533598178758">Adobe Flash Player માઇક્રોફોન અપવાદો અલગ છે.</translation>
 <translation id="8691686986795184760">(સંગઠન નીતિ દ્વારા સક્ષમ)</translation>
 <translation id="869257642790614972">છેલ્લે બંધ કરેલો ટૅબ ફરીથી ખોલો</translation>
+<translation id="8695770993395462321">મૂળ CUPS</translation>
 <translation id="8695825812785969222">Open &amp;Location...</translation>
 <translation id="8698464937041809063">Google રેખાંકન</translation>
 <translation id="869884720829132584">એપ્લિકેશનો મેનૂ</translation>
@@ -5592,6 +5604,7 @@
 <translation id="9189690067274055051">તમારા ફોનને અનલૉક કરો અને દાખલ થવા માટે તેને તમારા <ph name="DEVICE_TYPE" /> ની નજીક લાવો.</translation>
 <translation id="9190063653747922532">L2TP/IPsec + પૂર્વ-શેર કરેલી કી</translation>
 <translation id="9201305942933582053">Chrome માટે Google Now!</translation>
+<translation id="9202646163273566462">તમામ બુકમાર્ક્સ દૃશ્યને બુકમાર્ક મેનેજરના ડિફોલ્ટ ગંતવ્ય તરીકે સક્ષમ કરે છે.</translation>
 <translation id="9203398526606335860">&amp;પ્રોફાઇલિંગ સક્ષમ</translation>
 <translation id="9203478404496196495">ટૅબને અનમ્યૂટ કરો</translation>
 <translation id="9203962528777363226">આ ઉપકરણનાં વ્યવસ્થાપકે નવા વપરાશકર્તાઓને ઉમેરવાથી અક્ષમ કર્યા છે</translation>
@@ -5618,6 +5631,7 @@
 <translation id="939736085109172342">નવું ફોલ્ડર</translation>
 <translation id="940425055435005472">ફોન્ટનું કદ:</translation>
 <translation id="941543339607623937">અમાન્ય ખાનગી કી.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{કોઈ નહીં}=1{1 ઍપ્લિકેશન ($1)}=2{2 ઍપ્લિકેશન ($1, $2)}one{# ઍપ્લિકેશન ($1, $2, $3)}other{# ઍપ્લિકેશન ($1, $2, $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" />, Chrome ટૅબ અને ઑડિઓને શેર કરી રહી છે.</translation>
 <translation id="942954117721265519">આ ડાયરેક્ટરીમાં છબીઓ નથી.</translation>
 <translation id="945522503751344254">પ્રતિસાદ મોકલો</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index 3f805a9b..3c23d0e1 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608">इस प्रकार के सत्र में <ph name="EXTENSION_NAME" /> (एक्‍सटेंशन आईडी "<ph name="EXTENSION_ID" />") की अनुमति नहीं है.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">ओह! यादृच्छिक RSA निजी कुंजी जेनरेट करने में विफल.</translation>
+<translation id="1421115928968836111">यह सुरक्षित सामग्री के लिए Flash Player लाइसेंस का प्राधिकरण हटा देगा.</translation>
 <translation id="1425734930786274278">निम्न कुकी अवरोधित कर दी गई हैं (तृतीय-पक्ष की कुकी को बिना किसी अपवाद के अवरोधित किया जा रहा है):</translation>
 <translation id="1426410128494586442">हां</translation>
 <translation id="1427049173708736891">अपने Android डिवाइस के अनलॉक होने और आस-पास होने पर अपने <ph name="DEVICE_TYPE" /> को अनलॉक बनाए रखें—अपना पासवर्ड लिखने की कोई आवश्‍यकता नहीं.</translation>
@@ -521,6 +522,7 @@
 <translation id="1707463636381878959">इस नेटवर्क को अन्य उपयोगकर्ताओं के साथ साझा करें</translation>
 <translation id="1708199901407471282">नया टैब पृष्ठ से कोई सुझाया गया वेबपृष्ठ खोलते समय, यदि सुझाव के लिए कोई टैब पहले से खुला है, तो नए टैब में सुझाव लोड करने के बजाय उस पर स्विच करें.</translation>
 <translation id="1708338024780164500">(प्रयोग में नहीं)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (आईडी: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">ज़िप करना विफल रहा, अप्रत्याशित त्रुटि: $1</translation>
 <translation id="1715941336038158809">अमान्य उपयोगकर्ता नाम या पासवर्ड.</translation>
 <translation id="1717733954209022288">Google पेमेंट्स कार्ड सहेजने का चेकबॉक्स</translation>
@@ -797,6 +799,7 @@
 <translation id="2168214441502403371">पारसी कीबोर्ड</translation>
 <translation id="2168725742002792683">फ़ाइल एक्सटेंशन</translation>
 <translation id="2169062631698640254">किसी भी तरह प्रवेश करें</translation>
+<translation id="2175042898143291048">हमेशा ऐसा करें</translation>
 <translation id="2175607476662778685">त्वरित लॉन्च बार</translation>
 <translation id="2176045495080708525">निम्‍न एक्‍सटेंशन अब इंस्‍टॉल हो गए हैं:</translation>
 <translation id="2177950615300672361">गुप्त टैब: <ph name="TAB_NAME" /></translation>
@@ -1936,7 +1939,6 @@
 <translation id="3688507211863392146">आपके द्वारा ऐप्लिकेशन में खोली गईं फ़ाइलों और फ़ोल्डर में लिखें</translation>
 <translation id="3688526734140524629">चैनल बदलें</translation>
 <translation id="3688578402379768763">अद्यतित</translation>
-<translation id="3690976161240450479">प्रवेश करना विफल रहा. कृपया अपने नियंत्रक से संपर्क करें या पुनः प्रयास करें.</translation>
 <translation id="3693415264595406141">पासवर्ड:</translation>
 <translation id="3694027410380121301">पिछला टैब को चुनें</translation>
 <translation id="3694678678240097321">यदि एक्सटेंशन ने सभी url पर चलाने की अनुमति मांगी हो, तो पृष्ठ पर चल रही स्क्रिप्ट के लिए उपयोगकर्ता की सहमति आवश्यक है.</translation>
@@ -2231,6 +2233,7 @@
 <translation id="4116663294526079822">इस साइट पर हमेशा अनुमति दें</translation>
 <translation id="411666854932687641">गोपनीय मेमोरी</translation>
 <translation id="4118990158415604803">अन्य नेटवर्क से कनेक्ट करना आपके व्यवस्थापक द्वारा अक्षम किया गया है.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{तथा 1 और}one{तथा # और}other{तथा # और}}</translation>
 <translation id="4119828560634133962">प्रिंट पूर्वावलोकन पंजीयन प्रोमो</translation>
 <translation id="4120329147617730038">किसी व्यवस्थापक ने <ph name="USER_EMAIL" /> के लिए एकाधिक प्रवेश अस्वीकार कर दिए हैं.
 जारी रखने के लिए सभी उपयोगकर्ताओं को प्रस्थान करना होगा.</translation>
@@ -2370,9 +2373,11 @@
 <translation id="4345703751611431217">सॉफ़्टवेयर असंगतता: अधिक जानें</translation>
 <translation id="4348766275249686434">त्रुटियां एकत्रित करें</translation>
 <translation id="4350019051035968019">इस डिवाइस को उस डोमेन पर नामांकित नहीं किया जा सकता जिससे आपका खाता संबंधित है क्योंकि डिवाइस को भिन्न डोमेन द्वारा प्रबंधित करने के लिए चिह्नित किया गया है.</translation>
+<translation id="4354806558096370704">स्थानीय CUPS प्रिंटिंग बैकएंड का उपयोग सक्षम करता है.</translation>
 <translation id="4358697938732213860">कोई पता जोड़ें</translation>
 <translation id="4359408040881008151">निर्भर एक्सटेंशन के कारण इंस्टॉल किया गया.</translation>
 <translation id="4361190688154226069">दृश्यों में रेक्ट-आधारित लक्ष्यीकरण</translation>
+<translation id="4364414793200746179">Android MediaStyle नोटिफ़िकेशन</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> डाउनलोड किया गया</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> किसी विंडो को साझा कर रहा है.</translation>
 <translation id="4364830672918311045">प्रदर्शन नोटिफिकेशन</translation>
@@ -2776,6 +2781,7 @@
 <translation id="4988792151665380515">सार्वजनिक कुंजी निर्यात करने में विफल.</translation>
 <translation id="49896407730300355">घड़ी की &amp;विपरीत दिशा में घुमाएं</translation>
 <translation id="4989966318180235467">निरीक्षण और पृष्ठभूमि पृष्ठ</translation>
+<translation id="4990343175649730969">Chrome साॅफ्टवेयर क्‍लीनअप यंत्र डाउनलोड करें</translation>
 <translation id="4991420928586866460">शीर्ष पंक्ति कुंजियों को फ़ंक्शन कुंजियों के रूप में मानें</translation>
 <translation id="499165176004408815">उच्च कंट्रास्ट मोड उपयोग करें</translation>
 <translation id="4992066212339426712">अनम्यूट करें</translation>
@@ -3299,6 +3305,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: संपादित करने के लिए चुनें</translation>
 <translation id="5741454054957165976">WebFonts लोडिंग के लिए उपयोगकर्ता एजेंट हस्तक्षेप का नया वर्शन सक्षम करें.</translation>
 <translation id="574392208103952083">मध्यम</translation>
+<translation id="5744368829843057748">2016Q2 UI  का अनुवाद करें</translation>
 <translation id="5745056705311424885">USB मेमोरी स्‍टिक का पता चला है</translation>
 <translation id="5746169159649715125">PDF के रूप में सहेजें</translation>
 <translation id="5747611503456050045">लम्बवत ओवरस्‍क्रॉल करने वाली सामग्री द्वारा ट्रिगर किए गए पृष्‍ठ रीलोड.</translation>
@@ -3406,6 +3413,7 @@
 <translation id="5884474295213649357">यह टैब किसी USB डिवाइस से कनेक्ट है.</translation>
 <translation id="5885324376209859881">मीडिया सेटिंग प्रबंधित करें...</translation>
 <translation id="5889282057229379085">मध्यवर्ती CA की अधिकतम संख्या: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">हमें बताएं कि क्‍या हो रहा है.</translation>
 <translation id="5892290200158927959">फ़्रेंच बेपो कीबोर्ड</translation>
 <translation id="5892507820957994680">अंतर्निहित सॉफ़्टवेयर रेंडरिंग सूची ओवरराइड करता है और असमर्थित सिस्टम कॉन्फ़िगरेशन पर GPU-त्वरण सक्षम करता है.</translation>
 <translation id="5895138241574237353">पुन: प्रारंभ करें</translation>
@@ -3549,6 +3557,7 @@
 <translation id="6122093587541546701">ईमेल (वैकल्पिक):</translation>
 <translation id="6122875415561139701">लिखें कार्रवाई की इस पर अनुमति नहीं है: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="6124650939968185064">निम्न एक्सटेंशन इस एक्सटेंशन पर निर्भर हैं:</translation>
+<translation id="6127945163801765632">बुकमार्क प्रबंधक में "सभी बुकमार्क" अनुभाग सक्षम करें.</translation>
 <translation id="6129938384427316298">Netscape प्रमाणपत्र टिप्पणी</translation>
 <translation id="6129953537138746214">Space</translation>
 <translation id="6132383530370527946">लघु प्रिंट</translation>
@@ -3575,6 +3584,7 @@
 <translation id="6164005077879661055">इस पर्यवेक्षित उपयोगकर्ता को निकाले जाने के बाद, पर्यवेक्षित उपयोगकर्ता से संबद्ध सभी फ़ाइलें और स्थानीय डेटा को स्थायी रूप से हटा दिया जाएगा. प्रबंधक द्वारा अब भी इस पर्यवेक्षित उपयोगकर्ता द्वारा देखी गईं वेबसाइटें और सेटिंग <ph name="MANAGEMENT_URL" /> पर देखी जा सकेंगी.</translation>
 <translation id="6165508094623778733">अधिक जानें</translation>
 <translation id="6166185671393271715">Chrome में पासवर्ड आयात करें</translation>
+<translation id="6169666352732958425">डेस्‍कटॉप कास्ट करने में असमर्थ.</translation>
 <translation id="6171550060231646388">सिम्युलेट की गईं हार्डवेयर 'Ok Google' सुविधाएं</translation>
 <translation id="6175314957787328458">Microsoft Domain GUID</translation>
 <translation id="6178664161104547336">किसी प्रमाणपत्र को चुनें</translation>
@@ -3768,6 +3778,7 @@
 <translation id="6458308652667395253">JavaScript अवरोधन प्रबंधित करें...</translation>
 <translation id="6459488832681039634">ढूंढने के लिए चयन का उपयोग करें</translation>
 <translation id="6460423884798879930">पहले से कनेक्ट किसी क्लाइंट के लिए आरंभिक SYN पैकेट में अतिरिक्त प्रमाणीकरण जानकारी भेजने के लिए विकल्प सक्षम करें, ताकि तेज़ी से डेटा भेजा जाना प्रारंभ हो जाए.</translation>
+<translation id="6460474910028274178">ट्रिगर करने संबंधी तर्क और Translate Bubble UI के स्वरूप में सुधार</translation>
 <translation id="6460601847208524483">अगला ढूंढें</translation>
 <translation id="6462080265650314920">ऐप्स  को सामग्री-प्रकार "<ph name="CONTENT_TYPE" />" के साथ प्रदान किया जाना चाहिए.</translation>
 <translation id="6462082050341971451">क्या आप अब भी वहां हैं?</translation>
@@ -3897,6 +3908,7 @@
 <translation id="6663792236418322902">आपके द्वारा चुने गए पासवर्ड की आवश्यकता इस फ़ाइल को बाद में पुनर्स्थापित करने के लिए होगी. कृपया इसे किसी सुरक्षित स्थान पर रिकॉर्ड करें.</translation>
 <translation id="6664237456442406323">दुर्भाग्यवश, आपका कंप्यूटर किसी विकृत हार्डवेयर आईडी द्वारा कॉन्फ़िगर किया हुआ है. इससे Chrome OS को नवीनतम सुरक्षा सुधारों से अपडेट होने में बाधा आ रही है और आपका कंप्यूटर <ph name="BEGIN_BOLD" />दुर्भावनापूर्ण हमलों की चपेट में आ सकता है<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">अपने Google खाते के साथ</translation>
+<translation id="667517062706956822">क्या आप चाहते हैं कि Google इस पृष्ठ का <ph name="SOURCE_LANGUAGE" /> से <ph name="TARGET_LANGUAGE" /> में अनुवाद करे?</translation>
 <translation id="6675665718701918026">सूचक डिवाइस कनेक्ट किया गया</translation>
 <translation id="6677037229676347494">अपेक्षित आईडी "<ph name="EXPECTED_ID" />" है, लेकिन आईडी "<ph name="NEW_ID" />" थी.</translation>
 <translation id="6680028776254050810">उपयोगकर्ताओं को स्विच करें</translation>
@@ -3948,6 +3960,7 @@
 <translation id="6746392203843147041">वॉल्‍यूम बढ़ाएं</translation>
 <translation id="6748140994595080445"><ph name="APP_NAME" /> द्वारा भाषाओं को प्रबंधित करने और दिखाने का तरीका बदलें.</translation>
 <translation id="6748465660675848252">आप आगे बढ़ सकते हैं, लेकिन केवल आपके समन्वयित डेटा और सेटिंग को पुनर्स्थापित किया जाएगा. सभी स्थानीय डेटा खो जाएगा.</translation>
+<translation id="6751256176799620176">1 फ़ोल्डर चयनित</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (गुप्त)</translation>
 <translation id="6759193508432371551">फैक्टरी रीसेट करें</translation>
 <translation id="6760765581316020278">वियतनामी कीबोर्ड (VNI)</translation>
@@ -4589,6 +4602,7 @@
 <translation id="7717014941119698257">डाउनलोड हो रहा है: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">प्रशिक्षण का समय समाप्‍त हो गया</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262">इस व्यक्ति का निरीक्षण करने के लिए, <ph name="BEGIN_LINK" />Chrome में प्रवेश करें<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">काटें</translation>
 <translation id="7730449930968088409">अपनी स्क्रीन की सामग्री कैप्चर करें</translation>
 <translation id="7730494089396812859">क्‍लाउड बैकअप विवरण दिखाएं</translation>
@@ -4682,7 +4696,6 @@
 <translation id="7859704718976024901">ब्राउज़िंग इतिहास</translation>
 <translation id="7861215335140947162">&amp;डाउनलोड</translation>
 <translation id="7864539943188674973">ब्लूटूथ अक्षम करें</translation>
-<translation id="7868891395842935202">API प्रयोगों का एक्‍सेस नियंत्रित करने के लिए प्रयोगात्‍मक फ़्रेमवर्क सक्षम करता है.</translation>
 <translation id="7870576007982733437">लागू होने पर सिस्टम डाउनलोड प्रबंधक का उपयोग करें.</translation>
 <translation id="7870790288828963061">अधिक नए वर्शन वाला कोई भी कियोस्‍क ऐप नहीं मिला. अपडेट करने के लिए कुछ नहीं है. कृपया USB स्‍टिक को निकालें.</translation>
 <translation id="787150342916295244">क्रेडिट कार्ड स्‍कैन करना</translation>
@@ -5011,7 +5024,6 @@
 <translation id="8309505303672555187">किसी नेटवर्क को चुनें:</translation>
 <translation id="8312871300878166382">फ़ोल्डर में चिपकाएं</translation>
 <translation id="8314013494437618358">थ्रेडेड कंपोज़िटिंग</translation>
-<translation id="8314576811984836978">प्रयोगात्मक फ़्रेमवर्क.</translation>
 <translation id="8319414634934645341">विस्तृत कुंजी उपयोग</translation>
 <translation id="8322814362483282060">इस पृष्ठ को आपके कैमरे और माइक्रोफ़ोन को एक्सेस करने से अवरोधित कर दिया गया है.</translation>
 <translation id="8326478304147373412">PKCS #7, प्रमाणपत्र चेन</translation>
@@ -5072,7 +5084,6 @@
 <translation id="8418240940464873056">हैंजा मोड</translation>
 <translation id="8418445294933751433">टैब के रूप में &amp;दिखाएं</translation>
 <translation id="8420060421540670057">Google डॉक्‍स फ़ाइलें दिखाएं</translation>
-<translation id="8420728540268437431">इस पृष्ठ का अनुवाद किया जा रहा है ...</translation>
 <translation id="842274098655511832">WebGL ड्राफ़्ट एक्सटेंशन</translation>
 <translation id="8424039430705546751">नीचे</translation>
 <translation id="8425213833346101688">बदलें</translation>
@@ -5259,6 +5270,7 @@
 <translation id="8690754533598178758">Adobe Flash Player के माइक्रोफ़ोन अपवाद अलग हैं.</translation>
 <translation id="8691686986795184760">(एंटरप्राइज़ नीति द्वारा सक्षम)</translation>
 <translation id="869257642790614972">अंतिम-बंद टैब फिर से खोलें</translation>
+<translation id="8695770993395462321">स्थानीय CUPS</translation>
 <translation id="8695825812785969222">&amp;स्‍थान खोलें...</translation>
 <translation id="8698464937041809063">Google ड्रॉइंग</translation>
 <translation id="869884720829132584">ऐप्स  मेनू</translation>
@@ -5600,6 +5612,7 @@
 <translation id="9189690067274055051">प्रवेश करने के लिए अपना फ़ोन अनलॉक करें और उसे अपने <ph name="DEVICE_TYPE" /> के पास लाएं.</translation>
 <translation id="9190063653747922532">L2TP/IPsec + पूर्व-साझा कुंजी</translation>
 <translation id="9201305942933582053">Chrome के लिए Google नाओ!</translation>
+<translation id="9202646163273566462">सभी बुकमार्क दृश्य को बुकमार्क प्रबंधक के डिफ़ॉल्ट गंतव्य के रूप में सक्षम करता है.</translation>
 <translation id="9203398526606335860">&amp;प्रोफ़ाइलिंग सक्षम</translation>
 <translation id="9203478404496196495">टैब अनम्‍यूट करें</translation>
 <translation id="9203962528777363226">इस डिवाइस के व्यवस्थापक ने नए उपयोगकर्ता जोड़े जाना अक्षम कर दिया है</translation>
@@ -5626,6 +5639,7 @@
 <translation id="939736085109172342">नया फ़ोल्डर</translation>
 <translation id="940425055435005472">अक्षरों का आकार:</translation>
 <translation id="941543339607623937">अमान्य निजी कुंजी.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{कोई नहीं}=1{1 ऐप्लिकेशन ($1)}=2{2 ऐप्लिकेशन ($1, $2)}one{# ऐप्लिकेशन ($1, $2, $3)}other{# ऐप्लिकेशन ($1, $2, $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> एक Chrome टैब और ऑडियो साझा कर रहा है.</translation>
 <translation id="942954117721265519">इस निर्देशिका में कोई चित्र नहीं है.</translation>
 <translation id="945522503751344254">सुझाव भेजें</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index b613397..1c277537 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (ID proširenja "<ph name="EXTENSION_ID" />") nije dopušten u ovoj vrsti sesije.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Šteta! Nije uspjelo generiranje nasumičnog RSA osobnog ključa.</translation>
+<translation id="1421115928968836111">Poništit će se autorizacija licenci Flash Playera za zaštićeni sadržaj.</translation>
 <translation id="1425734930786274278">Blokirani su sljedeći kolačići (kolačići treće strane blokiraju se bez iznimke):</translation>
 <translation id="1426410128494586442">Da</translation>
 <translation id="1427049173708736891">Vaš uređaj <ph name="DEVICE_TYPE" /> može ostati otključan kada je vaš Android telefon otključan i u blizini, a ne morate unositi zaporku.</translation>
@@ -521,6 +522,7 @@
 <translation id="1707463636381878959">Dijeli ovu mrežu s drugim korisnicima</translation>
 <translation id="1708199901407471282">Ako je prilikom otvaranja predložene web-stranice s web-stranice nove kartice već otvorena kartica za prijedlog, prijedlog se ne učitava na novoj kartici, već se prelazi na onu koja je već otvorena.</translation>
 <translation id="1708338024780164500">(Neaktivno)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Komprimiranje nije uspjelo, neočekivana pogreška: $1</translation>
 <translation id="1715941336038158809">Nevažeće korisničko ime ili zaporka.</translation>
 <translation id="1717733954209022288">Potvrdni okvir za spremanje kartice Google Paymentsa</translation>
@@ -797,6 +799,7 @@
 <translation id="2168214441502403371">perzijska tipkovnica</translation>
 <translation id="2168725742002792683">Proširenja datoteke</translation>
 <translation id="2169062631698640254">Ipak se prijavi</translation>
+<translation id="2175042898143291048">Učini to uvijek</translation>
 <translation id="2175607476662778685">Traka za brzo pokretanje</translation>
 <translation id="2176045495080708525">Sada su instalirana sljedeća proširenja:</translation>
 <translation id="2177950615300672361">Anonimna kartica: <ph name="TAB_NAME" /></translation>
@@ -1935,7 +1938,6 @@
 <translation id="3688507211863392146">pisati u datoteke i mape koje otvorite u aplikaciji</translation>
 <translation id="3688526734140524629">Promijeni kanal</translation>
 <translation id="3688578402379768763">Ažurno</translation>
-<translation id="3690976161240450479">Prijava nije uspjela. Obratite se administratoru ili pokušajte ponovo.</translation>
 <translation id="3693415264595406141">Zaporka:</translation>
 <translation id="3694027410380121301">Odaberi prethodnu karticu</translation>
 <translation id="3694678678240097321">Traženje pristanka od korisnika za proširenje koje izvodi skriptu na stranici ako je proširenje tražilo dopuštenje za izvođenje na svim URL-ovima.</translation>
@@ -2231,6 +2233,7 @@
 <translation id="4116663294526079822">Uvijek dopusti na ovoj web-lokaciji</translation>
 <translation id="411666854932687641">Privatna memorija</translation>
 <translation id="4118990158415604803">Povezivanje s drugim mrežama onemogućio je administrator.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{i još 1}one{i još #}few{i još #}other{i još #}}</translation>
 <translation id="4119828560634133962">Promocije za registraciju pregleda ispisa</translation>
 <translation id="4120329147617730038">Administrator je odbio višestruku prijavu na <ph name="USER_EMAIL" />.
 Svi se korisnici moraju prijaviti za nastavak.</translation>
@@ -2370,9 +2373,11 @@
 <translation id="4345703751611431217">Nekompatibilnost softvera: saznajte više</translation>
 <translation id="4348766275249686434">Prikupljaj pogreške</translation>
 <translation id="4350019051035968019">Uređaj se ne može prijaviti na domenu kojoj pripada vaš račun jer je postavljen za upravljanje na nekoj drugoj domeni.</translation>
+<translation id="4354806558096370704">Omogućuje upotrebu nativnog pozadinskog sustava CUPS za ispis.</translation>
 <translation id="4358697938732213860">Dodaj adresu</translation>
 <translation id="4359408040881008151">Instalirano zbog ovisnih proširenja.</translation>
 <translation id="4361190688154226069">Ciljanje na temelju pravokutnika u prikazima</translation>
+<translation id="4364414793200746179">Obavijesti Android MediaStylea</translation>
 <translation id="4364444725319685468">Datoteka <ph name="FILE_NAME" /> je preuzeta</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> dijeli prozor.</translation>
 <translation id="4364830672918311045">Prikaži obavijesti</translation>
@@ -2776,6 +2781,7 @@
 <translation id="4988792151665380515">Izvoz javnog ključa nije uspio.</translation>
 <translation id="49896407730300355">Zakreni u smjeru suprotnom od &amp;kretanja kazaljke na satu</translation>
 <translation id="4989966318180235467">Provjeri &amp;pozadinsku stranicu</translation>
+<translation id="4990343175649730969">Preuzmite Chromeov alat za čišćenje</translation>
 <translation id="4991420928586866460">Smatraj tipke najvišeg retka funkcijskim tipkama</translation>
 <translation id="499165176004408815">Upotrijebi način visokog kontrasta</translation>
 <translation id="4992066212339426712">Uključi zvuk</translation>
@@ -3299,6 +3305,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: odaberi za uređivanje</translation>
 <translation id="5741454054957165976">Omogućuje novu verziju intervencije korisničkog agenta za učitavanje web-fontova.</translation>
 <translation id="574392208103952083">Srednje</translation>
+<translation id="5744368829843057748">Korisničko sučelje Prevoditelja 2016Q2</translation>
 <translation id="5745056705311424885">Otkriven je USB memorijski privjesak</translation>
 <translation id="5746169159649715125">Spremi kao PDF</translation>
 <translation id="5747611503456050045">Ponovna učitavanja stranica uzrokovana vertikalnim pomicanjem sadržaja preko ruba stranice.</translation>
@@ -3406,6 +3413,7 @@
 <translation id="5884474295213649357">Kartica je povezana s USB uređajem.</translation>
 <translation id="5885324376209859881">Upravljanje postavkama medija...</translation>
 <translation id="5889282057229379085">Maksimalni broj srednjih CA-ova: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Recite nam što se događa.</translation>
 <translation id="5892290200158927959">Francuska BÉPO tipkovnica</translation>
 <translation id="5892507820957994680">Nadjačava ugrađeni popis izvođenja softvera i omogućuje GPU ubrzanje na nepodržanim konfiguracijama sustava.</translation>
 <translation id="5895138241574237353">Ponovno pokreni</translation>
@@ -3547,6 +3555,7 @@
 <translation id="6122093587541546701">E-adresa (nije obavezno):</translation>
 <translation id="6122875415561139701">Operacija zapisivanja nije dopuštena na uređaju: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="6124650939968185064">O tom proširenju ovise sljedeća proširenja:</translation>
+<translation id="6127945163801765632">Omogući odjeljak "Sve oznake" u upravitelju oznaka.</translation>
 <translation id="6129938384427316298">Komentar Netscape certifikata</translation>
 <translation id="6129953537138746214">Razmak</translation>
 <translation id="6132383530370527946">Sitna slova</translation>
@@ -3573,6 +3582,7 @@
 <translation id="6164005077879661055">Sve datoteke i lokalni podaci povezani sa zaštićenim korisnikom trajno će se izbrisati kada se taj korisnik ukloni. Web-lokacije koje je taj korisnik posjetio i njegove postavke mogu i dalje biti vidljive upravitelju na adresi <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Saznajte više</translation>
 <translation id="6166185671393271715">Uvoz zaporki u Chrome</translation>
+<translation id="6169666352732958425">Emitiranje radne površine nije moguće.</translation>
 <translation id="6171550060231646388">Simulirane hardverske značajke za "OK Google"</translation>
 <translation id="6175314957787328458">Microsoft Domain GUID</translation>
 <translation id="6178664161104547336">Odabir certifikata</translation>
@@ -3766,6 +3776,7 @@
 <translation id="6458308652667395253">Upravljanje blokiranjem za JavaScript...</translation>
 <translation id="6459488832681039634">Koristi odabir za traženje</translation>
 <translation id="6460423884798879930">Omogućuje opciju slanja dodatnih podataka za autentifikaciju u početnom paketu SYN za prethodno povezani klijent dopuštajući brže pokretanje slanja podataka.</translation>
+<translation id="6460474910028274178">Poboljšana logika pokretanja i izgled korisničkog sučelja za oblačić Prevoditelja</translation>
 <translation id="6460601847208524483">Traži sljedeće</translation>
 <translation id="6462080265650314920">Aplikacije moraju biti poslužene s vrstom sadržaja "<ph name="CONTENT_TYPE" />".</translation>
 <translation id="6462082050341971451">Jeste li još tamo?</translation>
@@ -3895,6 +3906,7 @@
 <translation id="6663792236418322902">Zaporka koju odaberete bit će potrebna za kasnije vraćanje ove datoteke. Sačuvajte je na sigurnom mjestu.</translation>
 <translation id="6664237456442406323">Nažalost, vaše je računalo konfigurirano pogrešno oblikovanim ID-om hardvera. To sprječava ažuriranje OS-a Chrome najnovijim sigurnosnim popravcima pa bi vaše računalo <ph name="BEGIN_BOLD" />moglo biti ranjivo na zlonamjerne napade<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">sa svojim Google Računom</translation>
+<translation id="667517062706956822">Želite li da Google prevede ovu stranicu (<ph name="SOURCE_LANGUAGE" /> – <ph name="TARGET_LANGUAGE" />)?</translation>
 <translation id="6675665718701918026">Pokazivački je uređaj povezan</translation>
 <translation id="6677037229676347494">Očekivan je ID "<ph name="EXPECTED_ID" />", ali je ID bio "<ph name="NEW_ID" />".</translation>
 <translation id="6680028776254050810">Promjena korisnika</translation>
@@ -3946,6 +3958,7 @@
 <translation id="6746392203843147041">pojačavanje glasnoće</translation>
 <translation id="6748140994595080445">Promijenite kako aplikacija <ph name="APP_NAME" /> obrađuje i prikazuje jezike.</translation>
 <translation id="6748465660675848252">Možete nastaviti, no vratit će se samo sinkronizirani podaci i postavke. Izgubit će se svi lokalni podaci.</translation>
+<translation id="6751256176799620176">Odabrana je 1 mapa</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Anonimno)</translation>
 <translation id="6759193508432371551">Vraćanje na tvorničke postavke</translation>
 <translation id="6760765581316020278">vijetnamska tipkovnica (VNI)</translation>
@@ -4582,6 +4595,7 @@
 <translation id="7717014941119698257">Preuzimanje: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">Obuka je istekla</translation>
 <translation id="771953673318695590">Osiguranje kvalitete</translation>
+<translation id="7720375555307821262">Da biste nadzirali tu osobu, <ph name="BEGIN_LINK" />prijavite se na Chrome<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">Izreži</translation>
 <translation id="7730449930968088409">snimiti sadržaj vašeg zaslona</translation>
 <translation id="7730494089396812859">Prikaz pojedinosti sigurnosnog kopiranja u oblaku</translation>
@@ -4675,7 +4689,6 @@
 <translation id="7859704718976024901">Povijest pregledavanja</translation>
 <translation id="7861215335140947162">&amp;Preuzimanje</translation>
 <translation id="7864539943188674973">Onemogući Bluetooth</translation>
-<translation id="7868891395842935202">Omogućuje eksperimentalni okvir za kontrolu pristupa eksperimentima API-ja.</translation>
 <translation id="7870576007982733437">Upotrijebi upravitelj preuzimanja sustava kada je to primjenjivo</translation>
 <translation id="7870790288828963061">Nisu pronađene aplikacije kioska s novijom verzijom. Nema ažuriranja. Uklonite USB privjesak.</translation>
 <translation id="787150342916295244">Skeniranje kreditne kartice</translation>
@@ -5004,7 +5017,6 @@
 <translation id="8309505303672555187">Odaberite mrežu:</translation>
 <translation id="8312871300878166382">Zalijepi u mapu</translation>
 <translation id="8314013494437618358">Slaganje nitima</translation>
-<translation id="8314576811984836978">Eksperimentalni okvir.</translation>
 <translation id="8319414634934645341">Produžena upotreba ključa</translation>
 <translation id="8322814362483282060">Stranici je zabranjen pristup vašem mikrofonu.</translation>
 <translation id="8326478304147373412">PKCS br. 7, lanac certifikata</translation>
@@ -5065,7 +5077,6 @@
 <translation id="8418240940464873056">Način kineskog pisma</translation>
 <translation id="8418445294933751433">&amp;Prikaži kao karticu</translation>
 <translation id="8420060421540670057">Prikaži datoteke Google dokumenata</translation>
-<translation id="8420728540268437431">Ta se stranica prevodi...</translation>
 <translation id="842274098655511832">Skice proširenja WebGL-a</translation>
 <translation id="8424039430705546751">dolje</translation>
 <translation id="8425213833346101688">Promijeni</translation>
@@ -5252,6 +5263,7 @@
 <translation id="8690754533598178758">Adobe Flash Player upotrebljava različite iznimke za mikrofon.</translation>
 <translation id="8691686986795184760">(Omogućeno pravilom tvrtke)</translation>
 <translation id="869257642790614972">Ponovno otvori posljednju zatvorenu karticu</translation>
+<translation id="8695770993395462321">Nativni CUPS</translation>
 <translation id="8695825812785969222">Open &amp;Location... (Otvori Lokaciju...)</translation>
 <translation id="8698464937041809063">Googleov crtež</translation>
 <translation id="869884720829132584">Izbornik aplikacija</translation>
@@ -5593,6 +5605,7 @@
 <translation id="9189690067274055051">Otključajte telefon i približite ga uređaju <ph name="DEVICE_TYPE" /> da biste omogućili pristup.</translation>
 <translation id="9190063653747922532">L2TP/IPsec + unaprijed dijeljeni ključ</translation>
 <translation id="9201305942933582053">Google Now za Chrome!</translation>
+<translation id="9202646163273566462">Omogućuje prikaz svih oznaka kao zadano odredište upravitelja oznaka.</translation>
 <translation id="9203398526606335860">&amp;Profiliranje omogućeno</translation>
 <translation id="9203478404496196495">Uključi zvuk kartice</translation>
 <translation id="9203962528777363226">Administrator ovog uređaja onemogućio je dodavanje novih korisnika</translation>
@@ -5619,6 +5632,7 @@
 <translation id="939736085109172342">Nova mapa</translation>
 <translation id="940425055435005472">Veličina fonta:</translation>
 <translation id="941543339607623937">Nevažeći osobni ključ.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{ništa}=1{1 aplikacija ($1)}=2{2 aplikacije ($1, $2)}one{# aplikacija ($1, $2, $3)}few{# aplikacije ($1, $2, $3)}other{# aplikacija ($1, $2, $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> dijeli Chromeovu karticu i zvuk.</translation>
 <translation id="942954117721265519">Nema slika u ovom direktoriju.</translation>
 <translation id="945522503751344254">Slanje povratnih informacija</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index caf6240..1bb1eec 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608">Az ilyen jellegű munkamenetekben a(z) <ph name="EXTENSION_NAME" /> (bővítményazonosító: „<ph name="EXTENSION_ID" />”) nem engedélyezett.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Ajjaj! Nem sikerült a véletlenszerű RSA privát kulcs generálása.</translation>
+<translation id="1421115928968836111">Engedélyezi a védett tartalmakra vonatkozó Flash Player-engedélyek törlését.</translation>
 <translation id="1425734930786274278">Az alábbi cookie-kat letiltottuk (a harmadik féltől származó cookie-kat kivétel nélkül letiltjuk).</translation>
 <translation id="1426410128494586442">Igen</translation>
 <translation id="1427049173708736891"><ph name="DEVICE_TYPE" /> eszközét feloldva tarthatja olyankor, amikor androidos telefonja fel van oldva és a közelben található – nem kell begépelnie a jelszavát.</translation>
@@ -521,6 +522,7 @@
 <translation id="1707463636381878959">A hálózat megosztása más felhasználókkal</translation>
 <translation id="1708199901407471282">Amikor Ön az Új lap oldal egyik javasolt weboldalára kattint, akkor a böngésző az új lapon történő betöltés helyett azt a lapot nyitja meg, amelyiken már meg van nyitva a javaslat (ha van ilyen).</translation>
 <translation id="1708338024780164500">(Inaktív)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (azonosító: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">A tömörítés sikertelen, váratlan hiba: $1</translation>
 <translation id="1715941336038158809">Érvénytelen felhasználónév vagy jelszó.</translation>
 <translation id="1717733954209022288">Google Payments-kártya mentése jelölőnégyzet</translation>
@@ -797,6 +799,7 @@
 <translation id="2168214441502403371">Perzsa billentyűzet</translation>
 <translation id="2168725742002792683">Fájlkiterjesztések</translation>
 <translation id="2169062631698640254">Bejelentkezés mindenképp</translation>
+<translation id="2175042898143291048">Mindig ezt tegye</translation>
 <translation id="2175607476662778685">Gyorsindító sáv</translation>
 <translation id="2176045495080708525">A következő bővítményeket telepítette:</translation>
 <translation id="2177950615300672361">Inkognitólap: <ph name="TAB_NAME" /></translation>
@@ -1937,7 +1940,6 @@
 <translation id="3688507211863392146">Az alkalmazásban megnyitott fájlok és mappák írása</translation>
 <translation id="3688526734140524629">Csatornaváltás</translation>
 <translation id="3688578402379768763">Naprakész</translation>
-<translation id="3690976161240450479">Sikertelen bejelentkezés. Kérjük, forduljon rendszergazdájához, vagy próbálja újra.</translation>
 <translation id="3693415264595406141">Jelszó:</translation>
 <translation id="3694027410380121301">Előző lap kiválasztása</translation>
 <translation id="3694678678240097321">Kérje a felhasználó beleegyezését olyan bővítményekhez, amelyek szkripteket futtatnak az oldalon, ha a bővítmény engedélyt kért arra, hogy valamennyi URL-en fusson.</translation>
@@ -2232,6 +2234,7 @@
 <translation id="4116663294526079822">Mindig engedélyezze ezen az oldalon</translation>
 <translation id="411666854932687641">Saját memória</translation>
 <translation id="4118990158415604803">A rendszergazda nem teszi lehetővé a csatlakozást más hálózatokhoz.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{és 1 további}other{és # további}}</translation>
 <translation id="4119828560634133962">Nyomtatási előnézet regisztrációs ajánlatai</translation>
 <translation id="4120329147617730038">Egy rendszergazda letiltotta a többfiókos bejelentkezést <ph name="USER_EMAIL" /> számára.
 Az összes felhasználónak ki kell jelentkeznie a folytatáshoz.</translation>
@@ -2370,9 +2373,11 @@
 <translation id="4345703751611431217">Nem kompatibilis szoftver: további információ</translation>
 <translation id="4348766275249686434">Hibák gyűjtése</translation>
 <translation id="4350019051035968019">Ez az eszköz nem regisztrálható annál a domainnél, amelyhez fiókja tartozik, mert az eszköz felügyeletére egy másik domain van kijelölve.</translation>
+<translation id="4354806558096370704">Engedélyezi a natív CUPS nyomtatási háttéralkalmazást.</translation>
 <translation id="4358697938732213860">Cím hozzáadása</translation>
 <translation id="4359408040881008151">Telepítve az ezt nélkülözni nem tudó bővítmény(ek) miatt.</translation>
 <translation id="4361190688154226069">Téglalap alapú célzás a nézetekben</translation>
+<translation id="4364414793200746179">Android MediaStyle-értesítés</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> letöltve</translation>
 <translation id="4364567974334641491">A(z) <ph name="APP_NAME" /> megoszt egy ablakot.</translation>
 <translation id="4364830672918311045">Értesítések megjelenítése</translation>
@@ -2776,6 +2781,7 @@
 <translation id="4988792151665380515">Nem sikerült a nyilvános kulcs exportálása.</translation>
 <translation id="49896407730300355">Forgatás &amp;balra</translation>
 <translation id="4989966318180235467">&amp;Háttéroldal vizsgálata</translation>
+<translation id="4990343175649730969">A Chrome Szoftvereltávolító eszköz letöltése</translation>
 <translation id="4991420928586866460">A legfelső sor billentyűi legyenek funkcióbillentyűk</translation>
 <translation id="499165176004408815">Nagy kontrasztú mód használata</translation>
 <translation id="4992066212339426712">Némítás feloldása</translation>
@@ -3300,6 +3306,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: a szerkesztéshez válassza ki</translation>
 <translation id="5741454054957165976">A Felhasználói ügynök beavatkozásának (új verzió) engedélyezése a WebFonts betöltése esetén.</translation>
 <translation id="574392208103952083">Közepes</translation>
+<translation id="5744368829843057748">Fordító 2016Q2-kezelőfelület</translation>
 <translation id="5745056705311424885">USB-memóriakártya észlelve</translation>
 <translation id="5746169159649715125">Mentés PDF-ként</translation>
 <translation id="5747611503456050045">Oldalújratöltések kiváltása a tartalmak függőlegesen történő túlgörgetése által.</translation>
@@ -3407,6 +3414,7 @@
 <translation id="5884474295213649357">Ez a lap USB-eszközhöz csatlakozik.</translation>
 <translation id="5885324376209859881">Médiabeállítások kezelése...</translation>
 <translation id="5889282057229379085">A köztes tanúsítványkibocsátók maximális száma: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Mondja el, mi a probléma.</translation>
 <translation id="5892290200158927959">Francia BÉPO-billentyűzet</translation>
 <translation id="5892507820957994680">Felülbírálja a beépített szoftveres megjelenítési listát, és lehetővé teszi a GPU-gyorsítást a nem támogatott rendszerkonfigurációkon.</translation>
 <translation id="5895138241574237353">Újraindítás</translation>
@@ -3548,6 +3556,7 @@
 <translation id="6122093587541546701">E-mail cím (nem kötelező):</translation>
 <translation id="6122875415561139701">Az írási művelet nem engedélyezett a következőn: „<ph name="DEVICE_NAME" />”.</translation>
 <translation id="6124650939968185064">Ettől a bővítménytől a következő bővítmények függnek:</translation>
+<translation id="6127945163801765632">A „Minden könyvjelző” szakasz engedélyezése a könyvjelzőkezelőben.</translation>
 <translation id="6129938384427316298">Netscape tanúsítvány - megjegyzés</translation>
 <translation id="6129953537138746214">Szóköz</translation>
 <translation id="6132383530370527946">Az apró betűs</translation>
@@ -3574,6 +3583,7 @@
 <translation id="6164005077879661055">Amikor ezt a felügyelt felhasználót eltávolítják, minden hozzá tartozó fájl és helyi adat véglegesen törlődik. A felügyelt felhasználó felkeresett webhelyeit és beállításait a kezelő továbbra is láthatja a következő címen: <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">További információ</translation>
 <translation id="6166185671393271715">Jelszavak importálása a Chrome-ba</translation>
+<translation id="6169666352732958425">Nem lehet átküldeni az asztalt.</translation>
 <translation id="6171550060231646388">Szimulált hardver „Ok Google” funkciói</translation>
 <translation id="6175314957787328458">Microsoft Domain GUID</translation>
 <translation id="6178664161104547336">Tanúsítvány kiválasztása</translation>
@@ -3767,6 +3777,7 @@
 <translation id="6458308652667395253">JavaScript letiltásának kezelése...</translation>
 <translation id="6459488832681039634">Keresés a kijelölésben</translation>
 <translation id="6460423884798879930">Lehetővé teszi plusz hitelesítési információk küldését a kezdeti SYN csomagban korábban kapcsolódott ügyfelek esetén, amivel az adatküldés gyorsabb elindítása válik lehetővé.</translation>
+<translation id="6460474910028274178">Továbbfejlesztett aktiválási logikájú és megjelenésű Translate Bubble kezelőfelület</translation>
 <translation id="6460601847208524483">Következő keresése</translation>
 <translation id="6462080265650314920">Az alkalmazásokat "<ph name="CONTENT_TYPE" />" tartalomtípussal kell ellátni.</translation>
 <translation id="6462082050341971451">Ott van még?</translation>
@@ -3896,6 +3907,7 @@
 <translation id="6663792236418322902">A most választott jelszó ahhoz szükséges, hogy ezt a fájlt később visszaállíthassa. Tárolja biztonságos helyen.</translation>
 <translation id="6664237456442406323">Sajnos számítógépe nem megfelelő formátumú hardverazonosítóval van konfigurálva. Emiatt a Chrome OS nem tud frissülni a legújabb biztonsági javításokkal, és számítógépét <ph name="BEGIN_BOLD" />rosszindulatú támadások érhetik<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">Google Fiókjával</translation>
+<translation id="667517062706956822">Szeretné, hogy a Google lefordítsa az oldalt <ph name="SOURCE_LANGUAGE" /> nyelvről <ph name="TARGET_LANGUAGE" /> nyelvre?</translation>
 <translation id="6675665718701918026">Mutatóeszköz csatlakoztatva</translation>
 <translation id="6677037229676347494">A várt azonosító "<ph name="EXPECTED_ID" />", de a kapott azonosító "<ph name="NEW_ID" />".</translation>
 <translation id="6680028776254050810">Felhasználóváltás</translation>
@@ -3947,6 +3959,7 @@
 <translation id="6746392203843147041">hangosítás</translation>
 <translation id="6748140994595080445">Módosítja, hogy a <ph name="APP_NAME" /> hogyan kezeli és jeleníti meg a nyelveket.</translation>
 <translation id="6748465660675848252">Továbbléphet, de csak szinkronizált adatait és beállításait állítjuk helyre. Összes helyi adata elvész.</translation>
+<translation id="6751256176799620176">1 mappa kiválasztva</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Inkognitómód)</translation>
 <translation id="6759193508432371551">Gyári beállítások visszaállítása</translation>
 <translation id="6760765581316020278">Vietnami billentyűzet (VNI)</translation>
@@ -4585,6 +4598,7 @@
 <translation id="7717014941119698257">Letöltés: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">A képzés időtúllépésbe ütközött.</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262">A személy felügyeletéhez <ph name="BEGIN_LINK" />jelentkezzen be a Chrome-ba<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">Kivágás</translation>
 <translation id="7730449930968088409">Képernyőtartalom rögzítése</translation>
 <translation id="7730494089396812859">Felhőbe történő biztonsági mentés részleteinek megjelenítése</translation>
@@ -4678,7 +4692,6 @@
 <translation id="7859704718976024901">Böngészési előzmények</translation>
 <translation id="7861215335140947162">&amp;Letöltések</translation>
 <translation id="7864539943188674973">Bluetooth letiltása</translation>
-<translation id="7868891395842935202">Engedélyezi a kísérleti keretrendszert, amellyel szabályozható az API-kísérletekhez történő hozzáférés.</translation>
 <translation id="7870576007982733437">A rendszer letöltéskezelőjének használata, amikor alkalmazható.</translation>
 <translation id="7870790288828963061">Nem található újabb verziójú kioszkalkalmazás, ezért nincs mit frissíteni. Kérjük, távolítsa el az USB-meghajtót.</translation>
 <translation id="787150342916295244">Hitelkártya beolvasása</translation>
@@ -5007,7 +5020,6 @@
 <translation id="8309505303672555187">Hálózat kiválasztása:</translation>
 <translation id="8312871300878166382">Beillesztés mappába</translation>
 <translation id="8314013494437618358">Összeállítás külön szálon</translation>
-<translation id="8314576811984836978">Kísérleti keretrendszer.</translation>
 <translation id="8319414634934645341">Bővített kulcshasználat</translation>
 <translation id="8322814362483282060">Az oldal nem férhet hozzá az Ön mikrofonjához.</translation>
 <translation id="8326478304147373412">PKCS #7, tanúsítványlánc</translation>
@@ -5068,7 +5080,6 @@
 <translation id="8418240940464873056">Hanja (kínai betűk) mód</translation>
 <translation id="8418445294933751433">&amp;Megjelenítés lapként</translation>
 <translation id="8420060421540670057">Google Dokumentumok-fájlok megjelenítése</translation>
-<translation id="8420728540268437431">Az oldal fordítása folyamatban van...</translation>
 <translation id="842274098655511832">WebGL-vázlatbővítmények</translation>
 <translation id="8424039430705546751">lefelé</translation>
 <translation id="8425213833346101688">Módosítás</translation>
@@ -5256,6 +5267,7 @@
 <translation id="8690754533598178758">Az Adobe Flash Player mikrofonnal kapcsolatos kivételei eltérőek.</translation>
 <translation id="8691686986795184760">(A vállalat bekapcsolta)</translation>
 <translation id="869257642790614972">A legutóbb bezárt lap újranyitása</translation>
+<translation id="8695770993395462321">Natív CUPS</translation>
 <translation id="8695825812785969222">&amp;Hely megnyitása...</translation>
 <translation id="8698464937041809063">Google-rajz</translation>
 <translation id="869884720829132584">Alkalmazások menü</translation>
@@ -5597,6 +5609,7 @@
 <translation id="9189690067274055051">A belépéshez oldja fel telefonja lezárását, és helyezze közelebb azt <ph name="DEVICE_TYPE" /> eszközéhez.</translation>
 <translation id="9190063653747922532">L2TP/IPSec + előre megosztott kulcs</translation>
 <translation id="9201305942933582053">Google Asszisztens Chrome-hoz!</translation>
+<translation id="9202646163273566462">Lehetővé teszi, hogy a Minden könyvjelző nézet legyen a könyvjelzőkezelő alapértelmezés szerinti célja.</translation>
 <translation id="9203398526606335860">&amp;Profilozás bekapcsolva</translation>
 <translation id="9203478404496196495">Lap némításának feloldása</translation>
 <translation id="9203962528777363226">Az eszköz rendszergazdája letiltotta az új felhasználók hozzáadását</translation>
@@ -5623,6 +5636,7 @@
 <translation id="939736085109172342">Új mappa</translation>
 <translation id="940425055435005472">Betűméret:</translation>
 <translation id="941543339607623937">Érvénytelen privát kulcs.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{nincsen}=1{1 alkalmazás ($1)}=2{2 alkalmazás ($1, $2)}other{# alkalmazás ($1, $2 és $3)}}</translation>
 <translation id="942532530371314860">A(z) <ph name="APP_NAME" /> megosztja a Chrome egy lapját és a hangot.</translation>
 <translation id="942954117721265519">Nincs kép ebben a könyvtárban.</translation>
 <translation id="945522503751344254">Visszajelzés küldése</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index 2c0b0b7..a3f79860 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (ID ekstensi "<ph name="EXTENSION_ID" />") tidak diizinkan dalam jenis sesi ini.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Wah! Gagal membuat kunci pribadi RSA acak.</translation>
+<translation id="1421115928968836111">Tindakan ini akan membatalkan otorisasi lisensi Flash Player untuk konten yang dilindungi.</translation>
 <translation id="1425734930786274278">Cookie berikut dicekal (cookie pihak ketiga sedang dicekal tanpa pengecualian):</translation>
 <translation id="1426410128494586442">Ya</translation>
 <translation id="1427049173708736891">Buat <ph name="DEVICE_TYPE" /> Anda tetap terbuka saat ponsel Android dibuka dan berada di dekat Anda—tidak perlu mengetikkan sandi.</translation>
@@ -521,6 +522,7 @@
 <translation id="1707463636381878959">Bagikan jaringan ini dengan pengguna lain</translation>
 <translation id="1708199901407471282">Saat membuka laman web yang disarankan dari Laman Tab Baru, jika sebuah tab sudah terbuka untuk saran, alihkan ke tab tersebut alih-alih memuat saran di tab baru.</translation>
 <translation id="1708338024780164500">(Tidak aktif)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Gagal membuat file zip, kesalahan tidak terduga: $1</translation>
 <translation id="1715941336038158809">Nama pengguna atau sandi tidak valid.</translation>
 <translation id="1717733954209022288">Kotak centang penyimpanan kartu Google Payments</translation>
@@ -797,6 +799,7 @@
 <translation id="2168214441502403371">Keyboard Persia</translation>
 <translation id="2168725742002792683">Ekstensi file</translation>
 <translation id="2169062631698640254">Tetap masuk</translation>
+<translation id="2175042898143291048">Selalu lakukan tindakan ini</translation>
 <translation id="2175607476662778685">Bilah luncur cepat</translation>
 <translation id="2176045495080708525">Ekstensi berikut telah terpasang sekarang:</translation>
 <translation id="2177950615300672361">Tab Penyamaran: <ph name="TAB_NAME" /></translation>
@@ -1936,7 +1939,6 @@
 <translation id="3688507211863392146">Menulis ke file dan folder yang Anda buka di aplikasi</translation>
 <translation id="3688526734140524629">Ubah saluran</translation>
 <translation id="3688578402379768763">Terbaru</translation>
-<translation id="3690976161240450479">Proses masuk gagal. Hubungi administrator Anda atau coba lagi.</translation>
 <translation id="3693415264595406141">Sandi:</translation>
 <translation id="3694027410380121301">Pilih Tab Sebelumnya</translation>
 <translation id="3694678678240097321">Perlu persetujuan pengguna untuk ekstensi yang menjalankan skrip di laman, jika ekstensi meminta izin untuk berjalan di semua URL.</translation>
@@ -2232,6 +2234,7 @@
 <translation id="4116663294526079822">Selalu izinkan di situs ini</translation>
 <translation id="411666854932687641">Memori Pribadi</translation>
 <translation id="4118990158415604803">Terhubung ke jaringan lainnya dinonaktifkan oleh administrator Anda.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{dan 1 lainnya}other{dan # lainnya}}</translation>
 <translation id="4119828560634133962">Promo Pendaftaran Pratinjau Cetak</translation>
 <translation id="4120329147617730038">Administrator telah melarang fitur masuk banyak akun untuk <ph name="USER_EMAIL" />.
 Semua pengguna harus keluar untuk melanjutkan.</translation>
@@ -2371,9 +2374,11 @@
 <translation id="4345703751611431217">Perangkat lunak tidak kompatibel: Pelajari lebih lanjut</translation>
 <translation id="4348766275249686434">Kumpulkan kesalahan</translation>
 <translation id="4350019051035968019">Perangkat ini tidak dapat didaftarkan ke domain tempat akun Anda berada karena perangkat ditandai untuk dikelola oleh domain lain.</translation>
+<translation id="4354806558096370704">Mengaktifkan penggunaan backend pencetakan CUPS asli.</translation>
 <translation id="4358697938732213860">Tambahkan alamat</translation>
 <translation id="4359408040881008151">Dipasang karena ekstensi dependen.</translation>
 <translation id="4361190688154226069">Penargetan berbasis kotak pada tampilan</translation>
+<translation id="4364414793200746179">Notifikasi MediaStyle Android</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> diunduh</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> membagikan jendela.</translation>
 <translation id="4364830672918311045">Tampilkan notifikasi</translation>
@@ -2777,6 +2782,7 @@
 <translation id="4988792151665380515">Gagal mengekspor kunci publik.</translation>
 <translation id="49896407730300355">Putar &amp;berlawanan arah jarum jam</translation>
 <translation id="4989966318180235467">Periksa laman latar &amp;belakang</translation>
+<translation id="4990343175649730969">Unduh Alat Pembersih Chrome</translation>
 <translation id="4991420928586866460">Gunakan tombol baris atas sebagai tombol fungsi</translation>
 <translation id="499165176004408815">Gunakan mode kontras tinggi</translation>
 <translation id="4992066212339426712">Bunyikan</translation>
@@ -3300,6 +3306,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: pilih untuk mengedit</translation>
 <translation id="5741454054957165976">Mengaktifkan Versi baru Intervensi Agen Pengguna untuk pemuatan WebFont.</translation>
 <translation id="574392208103952083">Sedang</translation>
+<translation id="5744368829843057748">UI 2016Q2 Terjemahan</translation>
 <translation id="5745056705311424885">Stik memori USB terdeteksi.</translation>
 <translation id="5746169159649715125">Simpan sebagai PDF</translation>
 <translation id="5747611503456050045">Fitur pemuatan ulang laman yang dipicu oleh konten yang digulir secara vertikal dengan cepat.</translation>
@@ -3407,6 +3414,7 @@
 <translation id="5884474295213649357">Tab ini terhubung dengan perangkat USB.</translation>
 <translation id="5885324376209859881">Kelola setelan media...</translation>
 <translation id="5889282057229379085">Jumlah maksimum CA perantara: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Beri tahu kami apa yang terjadi.</translation>
 <translation id="5892290200158927959">Keyboard BÉPO Prancis</translation>
 <translation id="5892507820957994680">Mengganti daftar penguraian perangkat lunak yang tertanam dan mengaktifkan akselerasi GPU pada konfigurasi sistem yang tidak didukung.</translation>
 <translation id="5895138241574237353">Mulai Ulang</translation>
@@ -3548,6 +3556,7 @@
 <translation id="6122093587541546701">Email (opsional):</translation>
 <translation id="6122875415561139701">Operasi menulis tidak diizinkan di: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="6124650939968185064">Ekstensi berikut bergantung pada ekstensi ini:</translation>
+<translation id="6127945163801765632">Aktifkan bagian "semua bookmark" di pengelola bookmark.</translation>
 <translation id="6129938384427316298">Netscape Certificate Comment</translation>
 <translation id="6129953537138746214">Spasi</translation>
 <translation id="6132383530370527946">Cetak kecil</translation>
@@ -3574,6 +3583,7 @@
 <translation id="6164005077879661055">Semua file dan data lokal yang terkait dengan pengguna yang dilindungi akan dihapus secara permanen setelah pengguna yang dilindungi ini dihapus. Situs web yang dikunjungi dan setelan untuk pengguna yang dilindungi ini mungkin tetap dapat dilihat oleh pengelola di <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Pelajari lebih lanjut</translation>
 <translation id="6166185671393271715">Impor Sandi ke Chrome</translation>
+<translation id="6169666352732958425">Tidak dapat mentransmisi desktop.</translation>
 <translation id="6171550060231646388">Simulasi fitur 'Ok Google' perangkat keras</translation>
 <translation id="6175314957787328458">Microsoft Domain GUID</translation>
 <translation id="6178664161104547336">Pilih sertifikat</translation>
@@ -3767,6 +3777,7 @@
 <translation id="6458308652667395253">Kelola pencekalan JavaScript...</translation>
 <translation id="6459488832681039634">Gunakan Pilihan untuk Temukan</translation>
 <translation id="6460423884798879930">Mengaktifkan opsi untuk mengirim informasi autentikasi ekstra pada paket SYN awal bagi klien yang sebelumnya telah tersambung, mengizinkan pemulaian pengiriman data dengan lebih cepat.</translation>
+<translation id="6460474910028274178">Logika pemicuan dan tampilan yang ditingkatkan untuk UI Gelembung Terjemahan</translation>
 <translation id="6460601847208524483">Temukan Berikutnya</translation>
 <translation id="6462080265650314920">Aplikasi harus disediakan dengan jenis konten "<ph name="CONTENT_TYPE" />".</translation>
 <translation id="6462082050341971451">Anda masih di sana?</translation>
@@ -3896,6 +3907,7 @@
 <translation id="6663792236418322902">Sandi yang Anda pilih akan dibutuhkan untuk mengembalikan file ini nanti.  Harap catat sandi di lokasi yang aman.</translation>
 <translation id="6664237456442406323">Sayangnya, komputer Anda dikonfigurasi dengan ID perangkat keras yang rusak. Hal ini mencegah Chrome OS memperbarui dengan perbaikan keamanan terbaru dan komputer Anda <ph name="BEGIN_BOLD" />mungkin rentan terhadap serangan berbahaya<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">dengan Akun Google Anda</translation>
+<translation id="667517062706956822">Ingin Google menerjemahkan laman ini dari <ph name="SOURCE_LANGUAGE" /> ke <ph name="TARGET_LANGUAGE" />?</translation>
 <translation id="6675665718701918026">Perangkat penunjuk telah tersambung</translation>
 <translation id="6677037229676347494">ID yang diharapkan "<ph name="EXPECTED_ID" />", tapi ID-nya adalah "<ph name="NEW_ID" />".</translation>
 <translation id="6680028776254050810">Alihkan Pengguna</translation>
@@ -3947,6 +3959,7 @@
 <translation id="6746392203843147041">keraskan vol.</translation>
 <translation id="6748140994595080445">Mengubah cara <ph name="APP_NAME" /> menangani dan menampilkan bahasa.</translation>
 <translation id="6748465660675848252">Anda dapat melanjutkan, namun hanya setelan dan data yang disinkronkan yang akan dipulihkan. Semua data lokal akan hilang.</translation>
+<translation id="6751256176799620176">1 folder dipilih</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Penyamaran)</translation>
 <translation id="6759193508432371551">Kembalikan ke setelan pabrik</translation>
 <translation id="6760765581316020278">Keyboard Vietnam (VNI)</translation>
@@ -4585,6 +4598,7 @@
 <translation id="7717014941119698257">Mengunduh: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">Waktu tunggu latihan telah berakhir</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262">Untuk melindungi orang ini, <ph name="BEGIN_LINK" />masuk ke Chrome<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">Potong</translation>
 <translation id="7730449930968088409">Menangkap konten layar Anda</translation>
 <translation id="7730494089396812859">Tampilkan detail cadangan Awan</translation>
@@ -4678,7 +4692,6 @@
 <translation id="7859704718976024901">Riwayat Penjelajahan</translation>
 <translation id="7861215335140947162">Un&amp;duhan</translation>
 <translation id="7864539943188674973">Nonaktifkan Bluetooth</translation>
-<translation id="7868891395842935202">Mengaktifkan Kerangka Kerja Eksperimental untuk mengontrol akses ke eksperimen API.</translation>
 <translation id="7870576007982733437">Gunakan pengelola unduhan sistem jika berlaku.</translation>
 <translation id="7870790288828963061">Tidak ada aplikasi Kios dengan versi lebih baru yang ditemukan. Tidak ada yang akan diperbarui. Lepaskan stik USB.</translation>
 <translation id="787150342916295244">Pemindaian kartu kredit</translation>
@@ -5007,7 +5020,6 @@
 <translation id="8309505303672555187">Pilih jaringan:</translation>
 <translation id="8312871300878166382">Tempelkan ke folder</translation>
 <translation id="8314013494437618358">Pengomposisian berutas</translation>
-<translation id="8314576811984836978">Kerangka Kerja Eksperimental.</translation>
 <translation id="8319414634934645341">Extended Key Usage</translation>
 <translation id="8322814362483282060">Laman ini telah diblokir agar tidak dapat mengakses mikrofon Anda.</translation>
 <translation id="8326478304147373412">PKCS #7, rantai sertifikat</translation>
@@ -5068,7 +5080,6 @@
 <translation id="8418240940464873056">Mode Hanja</translation>
 <translation id="8418445294933751433">Tampilkan &amp;sebagai tab</translation>
 <translation id="8420060421540670057">Tampilkan file Google Dokumen</translation>
-<translation id="8420728540268437431">Laman ini sedang diterjemahkan ...</translation>
 <translation id="842274098655511832">Ekstensi Draf WebGL</translation>
 <translation id="8424039430705546751">ke bawah</translation>
 <translation id="8425213833346101688">Ubah</translation>
@@ -5255,6 +5266,7 @@
 <translation id="8690754533598178758">Pengecualian untuk mikrofon Adobe Flash Player dapat berbeda.</translation>
 <translation id="8691686986795184760">(Diaktifkan oleh kebijakan perusahaan)</translation>
 <translation id="869257642790614972">Buka ulang tab yang terakhir ditutup</translation>
+<translation id="8695770993395462321">CUPS asli</translation>
 <translation id="8695825812785969222">Buka &amp;Lokasi...</translation>
 <translation id="8698464937041809063">Gambar Google</translation>
 <translation id="869884720829132584">Menu aplikasi</translation>
@@ -5596,6 +5608,7 @@
 <translation id="9189690067274055051">Buka kunci ponsel dan dekatkan dengan <ph name="DEVICE_TYPE" /> untuk masuk.</translation>
 <translation id="9190063653747922532">L2TP/IPSec + kunci yang dibagikan sebelumnya</translation>
 <translation id="9201305942933582053">Google Now untuk Chrome!</translation>
+<translation id="9202646163273566462">Mengaktifkan tampilan semua bookmark sebagai tujuan default pengelola bookmark.</translation>
 <translation id="9203398526606335860">&amp;Penyidikan diaktifkan</translation>
 <translation id="9203478404496196495">Aktifkan tab</translation>
 <translation id="9203962528777363226">Administrator perangkat ini telah menonaktifkan pengguna baru agar tidak ditambahkan</translation>
@@ -5622,6 +5635,7 @@
 <translation id="939736085109172342">Folder baru</translation>
 <translation id="940425055435005472">Ukuran font:</translation>
 <translation id="941543339607623937">Kunci pribadi tidak valid.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{tidak ada}=1{1 aplikasi ($1)}=2{2 aplikasi ($1, $2)}other{# aplikasi ($1, $2, $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> membagikan audio dan tab Chrome.</translation>
 <translation id="942954117721265519">Tidak ada gambar dalam direktori ini.</translation>
 <translation id="945522503751344254">Kirim masukan</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index 90b37579..c72f7d8 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608">L'estensione <ph name="EXTENSION_NAME" /> (ID estensione "<ph name="EXTENSION_ID" />") non è consentita in questo tipo di sessione.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Spiacenti, operazione di generazione della chiave privata RSA casuale non riuscita.</translation>
+<translation id="1421115928968836111">L'opzione comporta la revoca dell'autorizzazione delle licenze di Flash Player per i contenuti protetti.</translation>
 <translation id="1425734930786274278">I seguenti cookie sono stati bloccati (i cookie di terze parti vengono bloccati senza eccezioni):</translation>
 <translation id="1426410128494586442">Sì</translation>
 <translation id="1427049173708736891">Mantieni sbloccato il tuo <ph name="DEVICE_TYPE" /> quando il telefono Android è anch'esso sbloccato e nelle vicinanze: in questo modo, non sarà necessario digitare la password.</translation>
@@ -521,6 +522,7 @@
 <translation id="1707463636381878959">Condividi questa rete con altri utenti</translation>
 <translation id="1708199901407471282">Se apri una pagina web suggerita dalla pagina Nuova scheda ed è già aperta una scheda relativa al suggerimento, quest'ultimo non viene caricato nella nuova scheda, ma viene attivata la scheda aperta.</translation>
 <translation id="1708338024780164500">(Non attiva)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Compressione non riuscita. Errore imprevisto: $1</translation>
 <translation id="1715941336038158809">Password o nome utente non valido.</translation>
 <translation id="1717733954209022288">Casella di controllo per salvare carte Google Payments</translation>
@@ -797,6 +799,7 @@
 <translation id="2168214441502403371">Tastiera Persiano</translation>
 <translation id="2168725742002792683">Estensioni file</translation>
 <translation id="2169062631698640254">Accedi comunque</translation>
+<translation id="2175042898143291048">Traduci sempre</translation>
 <translation id="2175607476662778685">Barra Avvio veloce</translation>
 <translation id="2176045495080708525">Le seguenti estensioni sono ora installate:</translation>
 <translation id="2177950615300672361">Scheda di navigazione in incognito: <ph name="TAB_NAME" /></translation>
@@ -1932,7 +1935,6 @@
 <translation id="3688507211863392146">Accedere in modalità di scrittura a file e cartelle aperte nell'applicazione</translation>
 <translation id="3688526734140524629">Cambia canale</translation>
 <translation id="3688578402379768763">Aggiornato</translation>
-<translation id="3690976161240450479">Accesso non riuscito. Contatta l'amministratore o riprova.</translation>
 <translation id="3693415264595406141">Password:</translation>
 <translation id="3694027410380121301">Seleziona scheda precedente</translation>
 <translation id="3694678678240097321">Richiedi il consenso dell'utente per un'estensione che esegue uno script sulla pagina, se l'estensione ha richiesto l'autorizzazione per essere eseguita su tutti gli URL.</translation>
@@ -2228,6 +2230,7 @@
 <translation id="4116663294526079822">Consenti sempre su questo sito</translation>
 <translation id="411666854932687641">Memoria privata</translation>
 <translation id="4118990158415604803">La connessione ad altre reti è stata disattivata dall'amministratore.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{e un'altra}other{e altre #}}</translation>
 <translation id="4119828560634133962">Promozioni di registrazione nell'anteprima di stampa</translation>
 <translation id="4120329147617730038">Un amministratore ha vietato l'accesso simultaneo per <ph name="USER_EMAIL" />.
 Per continuare, devono disconnettersi tutti gli utenti.</translation>
@@ -2367,9 +2370,11 @@
 <translation id="4345703751611431217">Incompatibilità software: ulteriori informazioni</translation>
 <translation id="4348766275249686434">Raccogli errori</translation>
 <translation id="4350019051035968019">Questo dispositivo non può essere registrato sul dominio a cui appartiene il tuo account perché è contrassegnato per essere gestito da un altro dominio.</translation>
+<translation id="4354806558096370704">Consente di attivare l'utilizzo del backend di stampa nativo CUPS.</translation>
 <translation id="4358697938732213860">Aggiungi un indirizzo</translation>
 <translation id="4359408040881008151">Installata a causa di estensioni dipendenti.</translation>
 <translation id="4361190688154226069">Targeting basato su rettangolo nelle visualizzazioni</translation>
+<translation id="4364414793200746179">Notifica di Android MediaStyle</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> scaricato</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> condivide una finestra.</translation>
 <translation id="4364830672918311045">Mostra notifiche</translation>
@@ -2770,6 +2775,7 @@
 <translation id="4988792151665380515">Operazione di esportazione della chiave pubblica non riuscita.</translation>
 <translation id="49896407730300355">Ruota in senso anti&amp;orario</translation>
 <translation id="4989966318180235467">Ispeziona pagina in &amp;background</translation>
+<translation id="4990343175649730969">Scarica Chrome Software Cleaner</translation>
 <translation id="4991420928586866460">Considera i tasti della fila superiore come tasti funzione</translation>
 <translation id="499165176004408815">Usa modalità ad alto contrasto</translation>
 <translation id="4992066212339426712">Riattiva audio</translation>
@@ -3293,6 +3299,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: seleziona per modificare</translation>
 <translation id="5741454054957165976">Attiva nuova versione di intervento di user-agent per il caricamento di web font.</translation>
 <translation id="574392208103952083">Medie</translation>
+<translation id="5744368829843057748">Interfaccia di Traduttore 2016Q2</translation>
 <translation id="5745056705311424885">Chiavetta USB rilevata</translation>
 <translation id="5746169159649715125">Salva come PDF</translation>
 <translation id="5747611503456050045">Ricaricamenti delle pagine attivati dallo scorrimento in verticale oltre i contenuti.</translation>
@@ -3400,6 +3407,7 @@
 <translation id="5884474295213649357">La scheda è connessa a un dispositivo USB.</translation>
 <translation id="5885324376209859881">Gestisci impostazioni dei dispositivi multimediali...</translation>
 <translation id="5889282057229379085">Numero massimo di CA intermedie: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Comunicaci cosa succede</translation>
 <translation id="5892290200158927959">Tastiera francese BÉPO</translation>
 <translation id="5892507820957994680">Esegue l'override dell'elenco di rendering integrato e attiva l'accelerazione GPU per le configurazioni di sistema non supportate.</translation>
 <translation id="5895138241574237353">Riavvia</translation>
@@ -3541,6 +3549,7 @@
 <translation id="6122093587541546701">Email (facoltativo):</translation>
 <translation id="6122875415561139701">Scrittura non consentita su: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="6124650939968185064">Le seguenti estensioni dipendono da questa estensione:</translation>
+<translation id="6127945163801765632">Attiva sezione "Tutti i preferiti" in Gestione Preferiti.</translation>
 <translation id="6129938384427316298">Commento certificato Netscape</translation>
 <translation id="6129953537138746214">Spazio</translation>
 <translation id="6132383530370527946">Clausole</translation>
@@ -3567,6 +3576,7 @@
 <translation id="6164005077879661055">Tutti i file e i dati locali associati all'utente controllato verranno eliminati definitivamente in seguito alla rimozione dell'utente. Le impostazioni e i siti web visitati relativi all'utente controllato potrebbero essere ancora visibili al gestore all'indirizzo <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Ulteriori informazioni</translation>
 <translation id="6166185671393271715">Importa le password in Chrome</translation>
+<translation id="6169666352732958425">Impossibile trasmettere il desktop.</translation>
 <translation id="6171550060231646388">Funzioni "Ok Google" per hardware simulato</translation>
 <translation id="6175314957787328458">GUID di dominio Microsoft</translation>
 <translation id="6178664161104547336">Seleziona un certificato</translation>
@@ -3760,6 +3770,7 @@
 <translation id="6458308652667395253">Gestisci il blocco di JavaScript...</translation>
 <translation id="6459488832681039634">Utilizza selezione per Trova</translation>
 <translation id="6460423884798879930">Attiva l'opzione per inviare informazioni di autenticazione aggiuntive nel pacchetto SYN iniziale per un client precedentemente connesso, consentendo un avvio dell'invio dei dati più veloce.</translation>
+<translation id="6460474910028274178">Logica di attivazione migliorata e ricerca del fumetto nell'interfaccia di Traduttore</translation>
 <translation id="6460601847208524483">Trova successivo</translation>
 <translation id="6462080265650314920">Le applicazioni devono essere pubblicate con content-type "<ph name="CONTENT_TYPE" />".</translation>
 <translation id="6462082050341971451">Sei ancora lì?</translation>
@@ -3889,6 +3900,7 @@
 <translation id="6663792236418322902">La password scelta sarà necessaria per recuperare il file in un secondo momento. Registrala in una posizione sicura.</translation>
 <translation id="6664237456442406323">Purtroppo il tuo computer è configurato con un ID hardware non valido. Ciò impedisce a Chrome OS di aggiornarsi con le ultime correzioni relative alla sicurezza e il tuo computer <ph name="BEGIN_BOLD" />potrebbe essere vulnerabile ad attacchi dannosi<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">con il tuo account Google</translation>
+<translation id="667517062706956822">Vuoi che Google traduca la pagina da <ph name="SOURCE_LANGUAGE" /> in <ph name="TARGET_LANGUAGE" />?</translation>
 <translation id="6675665718701918026">Dispositivo di puntamento collegato</translation>
 <translation id="6677037229676347494">L'ID previsto era "<ph name="EXPECTED_ID" />", ma in realtà era "<ph name="NEW_ID" />".</translation>
 <translation id="6680028776254050810">Scambia utenti</translation>
@@ -3940,6 +3952,7 @@
 <translation id="6746392203843147041">aumenta volume</translation>
 <translation id="6748140994595080445">Cambia la modalità di gestione e visualizzazione delle lingue in <ph name="APP_NAME" />.</translation>
 <translation id="6748465660675848252">Puoi continuare, tuttavia verranno ripristinati soltanto le impostazioni e i dati sincronizzati. Tutti i dati locali andranno persi.</translation>
+<translation id="6751256176799620176">1 cartella selezionata</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (In incognito)</translation>
 <translation id="6759193508432371551">Ripristino dati di fabbrica</translation>
 <translation id="6760765581316020278">Tastiera Vietnamita (VNI)</translation>
@@ -4570,6 +4583,7 @@
 <translation id="7717014941119698257">Download in corso: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">Preparazione scaduta</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262"><ph name="BEGIN_LINK" />Accedi a Chrome<ph name="END_LINK" /> per supervisionare questo utente.</translation>
 <translation id="7724603315864178912">Taglia</translation>
 <translation id="7730449930968088409">Acquisizione dei contenuti dello schermo</translation>
 <translation id="7730494089396812859">Mostra dettagli backup nella cloud</translation>
@@ -4663,7 +4677,6 @@
 <translation id="7859704718976024901">Cronologia di navigazione</translation>
 <translation id="7861215335140947162">&amp;Download</translation>
 <translation id="7864539943188674973">Disattiva Bluetooth</translation>
-<translation id="7868891395842935202">Consente di attivare il Framework sperimentale per controllare l'accesso agli esperimenti dell'API.</translation>
 <translation id="7870576007982733437">Quando possibile, utilizza la gestione dei download del sistema.</translation>
 <translation id="7870790288828963061">Nessuna app kiosk con versione più recente trovata. Non c'è nulla da aggiornare. Rimuovi la chiavetta USB.</translation>
 <translation id="787150342916295244">Scansione di carte di credito</translation>
@@ -4992,7 +5005,6 @@
 <translation id="8309505303672555187">Seleziona una rete:</translation>
 <translation id="8312871300878166382">Incolla nella cartella</translation>
 <translation id="8314013494437618358">Composizione con thread</translation>
-<translation id="8314576811984836978">Framework sperimentale.</translation>
 <translation id="8319414634934645341">Utilizzo chiave esteso</translation>
 <translation id="8322814362483282060">A questa pagina è stato impedito l'accesso al microfono.</translation>
 <translation id="8326478304147373412">PKCS #7, catena di certificati</translation>
@@ -5053,7 +5065,6 @@
 <translation id="8418240940464873056">Modalità hanja</translation>
 <translation id="8418445294933751433">&amp;Mostra come scheda</translation>
 <translation id="8420060421540670057">Visualizza file Google Documenti</translation>
-<translation id="8420728540268437431">Traduzione della pagina in corso...</translation>
 <translation id="842274098655511832">Estensioni bozza WebGL</translation>
 <translation id="8424039430705546751">giù</translation>
 <translation id="8425213833346101688">Cambia</translation>
@@ -5240,6 +5251,7 @@
 <translation id="8690754533598178758">Le eccezioni relative al microfono di Adobe Flash Player sono diverse.</translation>
 <translation id="8691686986795184760">(Attivato in base a norma aziendale)</translation>
 <translation id="869257642790614972">Riapri ultima scheda chiusa</translation>
+<translation id="8695770993395462321">CUPS nativo</translation>
 <translation id="8695825812785969222">Apri &amp;percorso...</translation>
 <translation id="8698464937041809063">Disegno Google</translation>
 <translation id="869884720829132584">Menu Applicazioni</translation>
@@ -5581,6 +5593,7 @@
 <translation id="9189690067274055051">Per accedere, sblocca il telefono e avvicinalo al dispositivo <ph name="DEVICE_TYPE" />.</translation>
 <translation id="9190063653747922532">L2TP/IPSec + chiave precondivisa</translation>
 <translation id="9201305942933582053">Google Now per Chrome</translation>
+<translation id="9202646163273566462">Consente di attivare la visualizzazione Tutti i preferiti come destinazione predefinita di Gestione Preferiti.</translation>
 <translation id="9203398526606335860">&amp;Profiling attivato</translation>
 <translation id="9203478404496196495">Riattiva audio scheda</translation>
 <translation id="9203962528777363226">L'amministratore di questo dispositivo ha disattivato l'aggiunta di nuovi utenti</translation>
@@ -5607,6 +5620,7 @@
 <translation id="939736085109172342">Nuova cartella</translation>
 <translation id="940425055435005472">Dimensioni dei caratteri:</translation>
 <translation id="941543339607623937">Chiave privata non valida.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{nessuna}=1{1 app ($ 1)}=2{2 app ($ 1, $ 2)}other{# app ($ 1, $ 2, $ 3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> condivide l'audio e una scheda Chrome.</translation>
 <translation id="942954117721265519">Non ci sono immagini in questa directory.</translation>
 <translation id="945522503751344254">Invia feedback</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index 41c90d79..b5eea123 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -292,6 +292,7 @@
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (מזהה תוסף "<ph name="EXTENSION_ID" />") אסור בסוג ההפעלה הזה.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">‏אוי לא! אירע כשל ביצירת מפתח RSA פרטי אקראי.</translation>
+<translation id="1421115928968836111">‏אפשרות זו תבטל את התוקף של רישיונות Flash Player לתוכן מוגן.</translation>
 <translation id="1425734930786274278">‏קובצי ה-Cookie הבאים נחסמו (קובצי Cookie מצד שלישי נחסמו ללא יוצא מן הכלל):</translation>
 <translation id="1426410128494586442">כן</translation>
 <translation id="1427049173708736891">‏השאר את ה-<ph name="DEVICE_TYPE" /> לא נעול בזמן שטלפון ה-Android שלך נמצא בקרבתך ואינו נעול - אין צורך להקליד סיסמה.</translation>
@@ -517,6 +518,7 @@
 <translation id="1707463636381878959">שתף רשת זו עם משתמשים אחרים</translation>
 <translation id="1708199901407471282">בפתיחה של דף אינטרנט המוגש כהצעה מדף הכרטיסייה החדשה, אם כבר קיימת כרטיסייה פתוחה להצעה הזו, עבור לכרטיסייה הזו במקום לטעון את ההצעה בכרטיסייה חדשה.</translation>
 <translation id="1708338024780164500">(לא פעיל)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (מזהה: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">הכיווץ נכשל, שגיאה לא צפויה: $1</translation>
 <translation id="1715941336038158809">שם משתמש או סיסמה לא חוקיים.</translation>
 <translation id="1717733954209022288">‏תיבת הסימון לשמירה של כרטיס Google Payments</translation>
@@ -793,6 +795,7 @@
 <translation id="2168214441502403371">מקלדת פרסית</translation>
 <translation id="2168725742002792683">סיומות קבצים </translation>
 <translation id="2169062631698640254">היכנס בכל זאת</translation>
+<translation id="2175042898143291048">עשה זאת תמיד</translation>
 <translation id="2175607476662778685">סרגל הפעלה מהירה</translation>
 <translation id="2176045495080708525">התוספים הבאים כבר מותקנים:</translation>
 <translation id="2177950615300672361">כרטיסיית גלישה בסתר: <ph name="TAB_NAME" /></translation>
@@ -1926,7 +1929,6 @@
 <translation id="3688507211863392146">כתיבה לקבצים ותיקיות שאתה פותח ביישום</translation>
 <translation id="3688526734140524629">שנה ערוץ</translation>
 <translation id="3688578402379768763">מעודכן</translation>
-<translation id="3690976161240450479">הכניסה נכשלה. צור קשר עם מנהל המערכת או נסה שוב.</translation>
 <translation id="3693415264595406141">סיסמה:</translation>
 <translation id="3694027410380121301">בחר כרטיסייה קודמת</translation>
 <translation id="3694678678240097321">דרוש הסכמת משתמש עבור תוסף המפעיל סקריפט בדף, אם התוסף ביקש הרשאה לפעול בכל כתובות האתרים.</translation>
@@ -2222,6 +2224,7 @@
 <translation id="4116663294526079822">אפשר תמיד באתר זה</translation>
 <translation id="411666854932687641">זיכרון פרטי</translation>
 <translation id="4118990158415604803">החיבור לרשתות אחרות הושבת על ידי מנהל המערכת.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{ועוד אחת}two{ועוד שתיים}many{ועוד #}other{ועוד #}}</translation>
 <translation id="4119828560634133962">קידומי מכירות לרישום לתצוגה מקדימה לפני הדפסה</translation>
 <translation id="4120329147617730038">מנהל מערכת ביטל הרשאה של כניסה עם מספר חשבונות עבור <ph name="USER_EMAIL" />.
 כדי להמשיך, כל המשתמשים חייבים לבצע יציאה.</translation>
@@ -2361,9 +2364,11 @@
 <translation id="4345703751611431217">חוסר תאימות של תוכנה: למידע נוסף</translation>
 <translation id="4348766275249686434">תעד שגיאות</translation>
 <translation id="4350019051035968019">לא ניתן לרשום את המכשיר הזה לדומיין שאליו שייך החשבון שלך מפני שהמכשיר מסומן לניהול על ידי דומיין אחר.</translation>
+<translation id="4354806558096370704">‏מאפשר את השימוש בהדפסה עורפית של מערכת CUPS המקורית.</translation>
 <translation id="4358697938732213860">הוסף כתובת</translation>
 <translation id="4359408040881008151">הותקן מפני שיש תוספים התלויים בו.</translation>
 <translation id="4361190688154226069">מיקוד מבוסס-מלבן בתצוגות</translation>
+<translation id="4364414793200746179">‏הודעה של Android MediaStyle</translation>
 <translation id="4364444725319685468">ההורדה של <ph name="FILE_NAME" /> בוצעה</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> משתף חלון.</translation>
 <translation id="4364830672918311045">הצגת הודעות</translation>
@@ -2767,6 +2772,7 @@
 <translation id="4988792151665380515">נכשל ייצוא מפתח ציבורי.</translation>
 <translation id="49896407730300355">סובב נ&amp;גד כיוון השעון</translation>
 <translation id="4989966318180235467">בדוק את דף ה&amp;רקע</translation>
+<translation id="4990343175649730969">‏הורד את Chrome Cleanup Tool</translation>
 <translation id="4991420928586866460">התייחס למקשים בשורה העליונה כאל מקשי פונקציה</translation>
 <translation id="499165176004408815">השתמש במצב ניגודיות גבוהה</translation>
 <translation id="4992066212339426712">בטל השתקה</translation>
@@ -3290,6 +3296,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: בחר כדי לערוך</translation>
 <translation id="5741454054957165976">‏הפעל גירסה חדשה של התערבות סוכן משתמש לטעינת WebFonts.</translation>
 <translation id="574392208103952083">בינוני</translation>
+<translation id="5744368829843057748">‏ממשק משתמש של Translate 2016Q2</translation>
 <translation id="5745056705311424885">‏זוהה מקל זיכרון USB</translation>
 <translation id="5746169159649715125">‏שמור כקובץ PDF</translation>
 <translation id="5747611503456050045">טעינות דפים מחדש כתוצאה מגלילה אנכית רבה מדי של תוכן.</translation>
@@ -3397,6 +3404,7 @@
 <translation id="5884474295213649357">‏הכרטיסייה הזו מחוברת להתקן USB.</translation>
 <translation id="5885324376209859881">נהל הגדרות מדיה...</translation>
 <translation id="5889282057229379085">המספר המרבי של רשויות אישורים ברמת ביניים: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">ספר לנו מה קורה.</translation>
 <translation id="5892290200158927959">‏מקלדת צרפתית בפריסת BÉPO</translation>
 <translation id="5892507820957994680">‏עוקף את רשימת עיבוד התוכנה המובנית ומאפשר האצת GPU בתצורות מערכת בלתי נתמכות.</translation>
 <translation id="5895138241574237353">הפעל מחדש</translation>
@@ -3538,6 +3546,7 @@
 <translation id="6122093587541546701">אימייל (אופציונלי):</translation>
 <translation id="6122875415561139701">פעולת כתיבה אסורה במכשיר: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="6124650939968185064">התוספים הבאים תלויים בתוסף הזה:</translation>
+<translation id="6127945163801765632">הפעל את המקטע "כל הסימניות" במנהל הסימניות.</translation>
 <translation id="6129938384427316298">‏הערה לאישור Netscape</translation>
 <translation id="6129953537138746214">רווח</translation>
 <translation id="6132383530370527946">האותיות הקטנות</translation>
@@ -3564,6 +3573,7 @@
 <translation id="6164005077879661055">כל הקבצים והנתונים המקומיים המשויכים למשתמש בפיקוח יימחקו לצמיתות לאחר שמשתמש בפיקוח זה יוסר. המנהל עדיין יוכל לראות את האתרים שבהם משתמש בפיקוח זה ביקר, ואת ההגדרות שלו, בכתובת <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">למידע נוסף</translation>
 <translation id="6166185671393271715">‏ייבוא סיסמאות אל Chrome</translation>
+<translation id="6169666352732958425">לא ניתן להעביר את המחשב השולחני.</translation>
 <translation id="6171550060231646388">‏הדמיית תכונות החומרה של Ok Google</translation>
 <translation id="6175314957787328458">Microsoft Domain GUID</translation>
 <translation id="6178664161104547336">בחר אישור</translation>
@@ -3757,6 +3767,7 @@
 <translation id="6458308652667395253">‏ניהול חסימת JavaScript...</translation>
 <translation id="6459488832681039634">השתמש בבחירה כדי לחפש</translation>
 <translation id="6460423884798879930">‏הפעל את האפשרות לשלוח מידע נוסף לאימות במנת ה-SYN הראשונה עבור לקוח שכבר התחבר בעבר, כדי לאפשר התחלה של שליחת נתונים מהירה.</translation>
+<translation id="6460474910028274178">‏לוגיקה משופרת להפעלה ומראה משופר לממשק המשתמש של בועת Translate</translation>
 <translation id="6460601847208524483">חפש את הבא</translation>
 <translation id="6462080265650314920">היישומים חייבים להיות מוצגים עם סוג תוכן "<ph name="CONTENT_TYPE" />".</translation>
 <translation id="6462082050341971451">האם אתה עדיין שם?</translation>
@@ -3886,6 +3897,7 @@
 <translation id="6663792236418322902">הסיסמה שבחרת תידרש כדי לשחזר את הקובץ מאוחר יותר. תעד אותה במקום בטוח.</translation>
 <translation id="6664237456442406323">‏לצערנו, המחשב שלך מוגדר עם זיהוי חומרה פגום. המצב הזה מונע ממערכת ההפעלה של Chrome להתקין את עדכוני האבטחה האחרונים, וייתכן שהמחשב שלך יהיה <ph name="BEGIN_BOLD" />חשוף להתקפות זדוניות<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">‏עם חשבון Google שלך</translation>
+<translation id="667517062706956822">‏האם תרצה ש-Google תתרגם דף זה מ<ph name="SOURCE_LANGUAGE" /> ל<ph name="TARGET_LANGUAGE" />?</translation>
 <translation id="6675665718701918026">התקן הצבעה מחובר</translation>
 <translation id="6677037229676347494">המזהה הצפוי הוא "<ph name="EXPECTED_ID" />", אך המזהה היה "<ph name="NEW_ID" />".</translation>
 <translation id="6680028776254050810">החלף משתמשים</translation>
@@ -3937,6 +3949,7 @@
 <translation id="6746392203843147041">הגברת עוצמת הקול</translation>
 <translation id="6748140994595080445">שנה את הדרך שבה <ph name="APP_NAME" /> מטפל בשפות ומציג אותן.</translation>
 <translation id="6748465660675848252">אתה יכול להמשיך, אולם רק הנתונים וההגדרות המסונכרנים שלך ישוחזרו. כל הנתונים המקומיים יאבדו.</translation>
+<translation id="6751256176799620176">תיקייה אחת נבחרה</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (גלישה בסתר)</translation>
 <translation id="6759193508432371551">איפוס להגדרות היצרן</translation>
 <translation id="6760765581316020278">‏מקלדת וייטנאמית (VNI)</translation>
@@ -4566,6 +4579,7 @@
 <translation id="7717014941119698257">מוריד: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">תם הזמן הקצוב לאימון</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262">‏כדי לפקח על אדם זה, <ph name="BEGIN_LINK" />היכנס ל-Chrome<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">חתוך</translation>
 <translation id="7730449930968088409">צילום של תוכן המסך</translation>
 <translation id="7730494089396812859">הצג פרטים של גיבוי בענן</translation>
@@ -4659,7 +4673,6 @@
 <translation id="7859704718976024901">היסטוריית הגלישה</translation>
 <translation id="7861215335140947162">&amp;הורדות</translation>
 <translation id="7864539943188674973">‏השבת Bluetooth</translation>
-<translation id="7868891395842935202">‏מפעיל את 'המסגרת הניסיונית' לקביעת גישה לניסויי API.</translation>
 <translation id="7870576007982733437">שימוש במנהל ההורדות של המערכת כשניתן.</translation>
 <translation id="7870790288828963061">לא נמצאו אפליקציות קיוסק בגרסה חדשה יותר. אין צורך בעדכון. הסר את הדיסק און קי.</translation>
 <translation id="787150342916295244">סריקת כרטיס אשראי</translation>
@@ -4988,7 +5001,6 @@
 <translation id="8309505303672555187">בחר רשת:</translation>
 <translation id="8312871300878166382">הדבק בתיקייה</translation>
 <translation id="8314013494437618358">איחוד שרשור</translation>
-<translation id="8314576811984836978">מסגרת ניסיונית.</translation>
 <translation id="8319414634934645341">שימוש מורחב במפתח</translation>
 <translation id="8322814362483282060">דף זה נחסם לגישה למיקרופון שלך.</translation>
 <translation id="8326478304147373412">‏PKCS #7, שרשרת אישורים</translation>
@@ -5049,7 +5061,6 @@
 <translation id="8418240940464873056">‏מצב Hanja</translation>
 <translation id="8418445294933751433">&amp;הצג ככרטיסייה</translation>
 <translation id="8420060421540670057">‏הצג קובצי Google Docs</translation>
-<translation id="8420728540268437431">תרגום הדף הזה מתבצע...</translation>
 <translation id="842274098655511832">‏תוספי טיוטה של WebGL</translation>
 <translation id="8424039430705546751">למטה</translation>
 <translation id="8425213833346101688">שנה</translation>
@@ -5236,6 +5247,7 @@
 <translation id="8690754533598178758">‏חריגי המיקרופון בשביל Adobe Flash Player הם שונים.</translation>
 <translation id="8691686986795184760">(מופעל על ידי מדיניות הארגון)</translation>
 <translation id="869257642790614972">פתח מחדש את הכרטיסייה האחרונה שנסגרה</translation>
+<translation id="8695770993395462321">‏מערכת CUPS מקורית</translation>
 <translation id="8695825812785969222">פתח &amp;מיקום...</translation>
 <translation id="8698464937041809063">‏איור של Google</translation>
 <translation id="869884720829132584">תפריט יישומים</translation>
@@ -5577,6 +5589,7 @@
 <translation id="9189690067274055051">בטל את נעילת הטלפון וקרב אותו אל ה-<ph name="DEVICE_TYPE" /> כדי להיכנס.</translation>
 <translation id="9190063653747922532">‏L2TP/‏IPSec + מפתח משותף מראש</translation>
 <translation id="9201305942933582053">‏Google Now עבור Chrome!</translation>
+<translation id="9202646163273566462">מפעיל את התצוגה 'כל הסימניות' כיעד ברירת המחדל של מנהל הסימניות.</translation>
 <translation id="9203398526606335860">&amp;יצירת פרופילים מופעלת</translation>
 <translation id="9203478404496196495">בטל השתקת כרטיסייה</translation>
 <translation id="9203962528777363226">מנהל המערכת של מכשיר זה השבית את ההוספה של משתמשים חדשים</translation>
@@ -5603,6 +5616,7 @@
 <translation id="939736085109172342">תיקייה חדשה</translation>
 <translation id="940425055435005472">גודל גופן:</translation>
 <translation id="941543339607623937">מפתח פרטי לא חוקי.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{ללא}=1{אפליקציה אחת ($1)}=2{שתי אפליקציות ($1, $2)}many{# אפליקציות ($1, $2, $3)}other{# אפליקציות ($1, $2, $3)}}</translation>
 <translation id="942532530371314860">‏<ph name="APP_NAME" /> משתף כרטיסייה ואודיו של Chrome.</translation>
 <translation id="942954117721265519">אין תמונות בספריה הזו.</translation>
 <translation id="945522503751344254">שלח משוב</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index e5d1abf..39ca937 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608">このタイプのセッションでは、<ph name="EXTENSION_NAME" />(拡張機能 ID「<ph name="EXTENSION_ID" />」)は使用できません。</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">ランダムな RSA 秘密鍵を生成できませんでした。</translation>
+<translation id="1421115928968836111">この操作により、保護されたコンテンツに対する Flash Player ライセンスが取り消されます。</translation>
 <translation id="1425734930786274278">以下の Cookie がブロックされました(サードパーティの Cookie は例外なくブロックされます):</translation>
 <translation id="1426410128494586442">はい</translation>
 <translation id="1427049173708736891">Android 搭載端末がロック解除された状態で近くにある場合、<ph name="DEVICE_TYPE" /> のロックを解除したままにします。パスワードの入力は不要です。</translation>
@@ -522,6 +523,7 @@
 <translation id="1707463636381878959">他のユーザーとネットワークを共有</translation>
 <translation id="1708199901407471282">候補として提示されたウェブページを新しいタブページで表示しようとしたときに、そのページが既に別のタブで開かれている場合は、新しいタブでページを開く代わりにそのタブに切り替えます。</translation>
 <translation id="1708338024780164500">(無効)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" />(ID: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">圧縮できませんでした。予期しないエラーが発生しました: $1</translation>
 <translation id="1715941336038158809">ユーザー名またはパスワードが無効です。</translation>
 <translation id="1717733954209022288">Google ペイメントのカードの保存チェックボックス</translation>
@@ -798,6 +800,7 @@
 <translation id="2168214441502403371">ペルシャ語キーボード</translation>
 <translation id="2168725742002792683">ファイル拡張子</translation>
 <translation id="2169062631698640254">このままログインする</translation>
+<translation id="2175042898143291048">常に翻訳する</translation>
 <translation id="2175607476662778685">クイック起動バー</translation>
 <translation id="2176045495080708525">次の拡張機能がインストールされます:</translation>
 <translation id="2177950615300672361">シークレット タブ: <ph name="TAB_NAME" /></translation>
@@ -1937,7 +1940,6 @@
 <translation id="3688507211863392146">アプリケーションで開いたファイルとフォルダに書き込む</translation>
 <translation id="3688526734140524629">チャンネルを変更</translation>
 <translation id="3688578402379768763">最新</translation>
-<translation id="3690976161240450479">ログインできませんでした。管理者に問い合わせるか、もう一度お試しください。</translation>
 <translation id="3693415264595406141">パスワード:</translation>
 <translation id="3694027410380121301">前のタブを選択</translation>
 <translation id="3694678678240097321">ページ上でスクリプトを実行する拡張機能が全 URL での実行許可をリクエストした場合、ユーザーの同意を求めます。</translation>
@@ -2233,6 +2235,7 @@
 <translation id="4116663294526079822">このサイトでは常に許可</translation>
 <translation id="411666854932687641">専有メモリ</translation>
 <translation id="4118990158415604803">他のネットワークへの接続は管理者によって無効にされています。</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{他 1 個}other{他 # 個}}</translation>
 <translation id="4119828560634133962">印刷プレビューからの登録プロモーション</translation>
 <translation id="4120329147617730038"><ph name="USER_EMAIL" /> のマルチ ログインは、管理者によって禁止されています。
 続行するには、すべてのユーザーがログアウトする必要があります。</translation>
@@ -2372,9 +2375,11 @@
 <translation id="4345703751611431217">ソフトウェア非互換性: 詳細</translation>
 <translation id="4348766275249686434">エラーを収集する</translation>
 <translation id="4350019051035968019">このデバイスは、別のドメインの管理対象として指定されているため、現在のアカウントの所属先ドメインに登録することはできません。</translation>
+<translation id="4354806558096370704">ネイティブ CUPS 印刷バックエンドの使用を有効にします。</translation>
 <translation id="4358697938732213860">住所を追加</translation>
 <translation id="4359408040881008151">依存関係にある拡張機能によってインストールされました。</translation>
 <translation id="4361190688154226069">目標を四角形のエリアから認識する</translation>
+<translation id="4364414793200746179">Android MediaStyle の通知</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> をダウンロードしました</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> がウィンドウを共有しています。</translation>
 <translation id="4364830672918311045">通知を表示</translation>
@@ -2778,6 +2783,7 @@
 <translation id="4988792151665380515">公開鍵をエクスポートできませんでした。</translation>
 <translation id="49896407730300355">反時計回りに回転(&amp;O)</translation>
 <translation id="4989966318180235467">バックグラウンド ページの検証(&amp;B)</translation>
+<translation id="4990343175649730969">Chrome クリーンアップ ツールをダウンロード</translation>
 <translation id="4991420928586866460">キーボードの最上段のキーをファンクション キーとして使用する</translation>
 <translation id="499165176004408815">ハイコントラスト モードを使用</translation>
 <translation id="4992066212339426712">ミュートを解除</translation>
@@ -3301,6 +3307,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: 選択して編集</translation>
 <translation id="5741454054957165976">WebFonts を読み込むユーザー エージェント処理の新しいバージョンを有効にします。</translation>
 <translation id="574392208103952083">中</translation>
+<translation id="5744368829843057748">翻訳 2016Q2 UI</translation>
 <translation id="5745056705311424885">USB メモリ スティックが検出されました</translation>
 <translation id="5746169159649715125">PDF に保存</translation>
 <translation id="5747611503456050045">コンテンツを上または下にオーバー スクロールしたときにページの再読み込みを行います。</translation>
@@ -3408,6 +3415,7 @@
 <translation id="5884474295213649357">このタブは USB デバイスに接続されています。</translation>
 <translation id="5885324376209859881">メディア設定を管理...</translation>
 <translation id="5889282057229379085">中間認証局の最大数: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">問題の詳細をお知らせください。</translation>
 <translation id="5892290200158927959">フランス語 BÉPO キーボード</translation>
 <translation id="5892507820957994680">組み込みのソフトウェア レンダリング リストを上書きし、サポートされていないシステム設定で GPU アクセラレーションを有効にします。</translation>
 <translation id="5895138241574237353">再起動</translation>
@@ -3549,6 +3557,7 @@
 <translation id="6122093587541546701">メール(省略可):</translation>
 <translation id="6122875415561139701">「<ph name="DEVICE_NAME" />」での書き込み操作は許可されていません。</translation>
 <translation id="6124650939968185064">次の拡張機能は、この拡張機能に依存しています:</translation>
+<translation id="6127945163801765632">ブックマーク マネージャで [すべてのブックマーク] セクションを有効にする。</translation>
 <translation id="6129938384427316298">Netscape 証明書コメント</translation>
 <translation id="6129953537138746214">スペース</translation>
 <translation id="6132383530370527946">利用規約</translation>
@@ -3575,6 +3584,7 @@
 <translation id="6164005077879661055">この監視対象ユーザーを削除すると、このユーザーに関連付けられたすべてのファイルとローカル データも完全に削除されます。この監視対象ユーザーがアクセスしたウェブサイトやこのユーザーの設定は引き続き、管理者が <ph name="MANAGEMENT_URL" /> で見ることができます。</translation>
 <translation id="6165508094623778733">詳しく見る</translation>
 <translation id="6166185671393271715">Chrome にパスワードをインポート</translation>
+<translation id="6169666352732958425">デスクトップをキャストできません。</translation>
 <translation id="6171550060231646388">ハードウェア シミュレーションを使った「OK Google」機能</translation>
 <translation id="6175314957787328458">Microsoft ドメイン GUID</translation>
 <translation id="6178664161104547336">証明書の選択</translation>
@@ -3768,6 +3778,7 @@
 <translation id="6458308652667395253">Javascript のブロックを管理...</translation>
 <translation id="6459488832681039634">選択部分を検索に使用</translation>
 <translation id="6460423884798879930">以前接続したクライアントの認証情報を最初の SYN パケットで送信し、データ送信が迅速に開始されるようにするには、このオプションを有効にします。</translation>
+<translation id="6460474910028274178">トリガー ロジックと翻訳バルーンの UI デザインが改善されました</translation>
 <translation id="6460601847208524483">次を検索</translation>
 <translation id="6462080265650314920">アプリは、コンテンツタイプ「<ph name="CONTENT_TYPE" />」で提供する必要があります。</translation>
 <translation id="6462082050341971451">まもなくログアウトされます</translation>
@@ -3897,6 +3908,7 @@
 <translation id="6663792236418322902">選択したパスワードは、このファイルを後で復元するときに必要です。安全な場所に記録しておいてください。</translation>
 <translation id="6664237456442406323">パソコンに設定されているハードウェア ID の形式が正しくありません。このため、Chrome OS に最新のセキュリティ修正を適用することができません。お使いのパソコンは、<ph name="BEGIN_BOLD" />悪意のある攻撃を受けやすくなる可能性があります<ph name="END_BOLD" />。</translation>
 <translation id="6666647326143344290">Google アカウントを使用</translation>
+<translation id="667517062706956822">Google でこのページを <ph name="SOURCE_LANGUAGE" /> から <ph name="TARGET_LANGUAGE" /> に翻訳しますか?</translation>
 <translation id="6675665718701918026">ポインティング デバイスが接続されました</translation>
 <translation id="6677037229676347494">期待される ID は「<ph name="EXPECTED_ID" />」ですが、「<ph name="NEW_ID" />」になっています。</translation>
 <translation id="6680028776254050810">ユーザーを切り替え</translation>
@@ -3948,6 +3960,7 @@
 <translation id="6746392203843147041">音量を上げる</translation>
 <translation id="6748140994595080445"><ph name="APP_NAME" /> による言語の処理と表示の方法を変更する</translation>
 <translation id="6748465660675848252">続行した場合、同期済みのデータと設定のみが復元され、ローカルデータはすべて失われます。</translation>
+<translation id="6751256176799620176">フォルダを 1 個選択しました</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" />(シークレット モード)</translation>
 <translation id="6759193508432371551">初期状態へのリセット</translation>
 <translation id="6760765581316020278">ベトナム語キーボード(VNI) </translation>
@@ -4589,6 +4602,7 @@
 <translation id="7717014941119698257">ダウンロード: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">音声登録がタイムアウトになりました</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262">このユーザーを監視するには、<ph name="BEGIN_LINK" />Chrome にログイン<ph name="END_LINK" />します。</translation>
 <translation id="7724603315864178912">切り取り</translation>
 <translation id="7730449930968088409">画面のコンテンツをキャプチャする</translation>
 <translation id="7730494089396812859">クラウド バックアップの詳細を表示します</translation>
@@ -4682,7 +4696,6 @@
 <translation id="7859704718976024901">閲覧履歴</translation>
 <translation id="7861215335140947162">ダウンロード(&amp;D)</translation>
 <translation id="7864539943188674973">Bluetooth を無効にする</translation>
-<translation id="7868891395842935202">API ウェブテストへのアクセスを制御するために試験運用版フレームワークを有効にします。</translation>
 <translation id="7870576007982733437">可能な場合はシステムのダウンロード マネージャーを使用する。</translation>
 <translation id="7870790288828963061">新しいバージョンのキオスクアプリが見つかりませんでした。更新するものはありません。USB スティックを取り外してください。</translation>
 <translation id="787150342916295244">クレジット カードのスキャン</translation>
@@ -5011,7 +5024,6 @@
 <translation id="8309505303672555187">ネットワークの選択:</translation>
 <translation id="8312871300878166382">フォルダに貼り付け</translation>
 <translation id="8314013494437618358">スレッド合成</translation>
-<translation id="8314576811984836978">試験運用版フレームワーク</translation>
 <translation id="8319414634934645341">拡張キーの用途</translation>
 <translation id="8322814362483282060">このページはマイクへのアクセスを禁止されています。</translation>
 <translation id="8326478304147373412">PKCS #7、証明書チェーン</translation>
@@ -5072,7 +5084,6 @@
 <translation id="8418240940464873056">漢字モード</translation>
 <translation id="8418445294933751433">タブで表示(&amp;S)</translation>
 <translation id="8420060421540670057">Google ドキュメントのファイルを表示する</translation>
-<translation id="8420728540268437431">このページは翻訳中です...</translation>
 <translation id="842274098655511832">WebGL ドラフト拡張機能</translation>
 <translation id="8424039430705546751">下</translation>
 <translation id="8425213833346101688">変更</translation>
@@ -5259,6 +5270,7 @@
 <translation id="8690754533598178758">Adobe Flash Player のマイクの例外が異なります。</translation>
 <translation id="8691686986795184760">(会社のポリシーにより有効)</translation>
 <translation id="869257642790614972">最後に閉じたタブを開く</translation>
+<translation id="8695770993395462321">ネイティブ CUPS</translation>
 <translation id="8695825812785969222">場所を開く(&amp;L)...</translation>
 <translation id="8698464937041809063">Google 図形描画</translation>
 <translation id="869884720829132584">アプリケーション メニュー</translation>
@@ -5600,6 +5612,7 @@
 <translation id="9189690067274055051">ログインするには、スマートフォンのロックを解除して <ph name="DEVICE_TYPE" /> に近づけます。</translation>
 <translation id="9190063653747922532">L2TP/IPSec + 事前共有鍵</translation>
 <translation id="9201305942933582053">Chrome 版 Google Now</translation>
+<translation id="9202646163273566462">ブックマーク マネージャのデフォルトのリンク先としてすべてのブックマーク表示を有効にします。</translation>
 <translation id="9203398526606335860">プロファイル記録の開始(&amp;P)</translation>
 <translation id="9203478404496196495">タブのミュートを解除</translation>
 <translation id="9203962528777363226">このデバイスの管理者は新規ユーザーの追加を無効にしています</translation>
@@ -5626,6 +5639,7 @@
 <translation id="939736085109172342">新しいフォルダ</translation>
 <translation id="940425055435005472">フォント サイズ:</translation>
 <translation id="941543339607623937">秘密鍵が無効です。</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{なし}=1{1 個のアプリ($1)}=2{2 個のアプリ($1、$2)}other{# 個のアプリ($1、$2、$3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> が Chrome タブと音声を共有しています。</translation>
 <translation id="942954117721265519">このディレクトリには画像がありません。</translation>
 <translation id="945522503751344254">フィードバックを送信</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb
index 12279c6..faed371 100644
--- a/chrome/app/resources/generated_resources_kn.xtb
+++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (ವಿಸ್ತರಣೆ ID "<ph name="EXTENSION_ID" />") ಈ ರೀತಿಯ ಸೆಶನ್‌ನಲ್ಲಿ ಅನುಮತಿಸುವುದಿಲ್ಲ.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">ಅಯ್ಯೋ! ಯಾದೃಚ್ಛಿಕ RSA ಖಾಸಗಿ ಕೀಲಿಯನ್ನು ರಚಿಸಲು ವಿಫಲವಾಗಿದೆ.</translation>
+<translation id="1421115928968836111">ಇದು ಸುರಕ್ಷಿತ ವಿಷಯಕ್ಕಾಗಿ ಫ್ಲ್ಯಾಶ್ ಪ್ಲೇಯರ್ ಪರವಾನಗಿಗಳ ದೃಢೀಕರಣ ರದ್ದು ಮಾಡುತ್ತದೆ.</translation>
 <translation id="1425734930786274278">ಕೆಳಗಿನ ಕುಕೀಸ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ (ಮೂರನೇ-ಪಾರ್ಟಿ ಕುಕೀಸ್‌ಗಳನ್ನು ಹೊರತುಪಡಿಸದೇ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ):</translation>
 <translation id="1426410128494586442">ಹೌದು</translation>
 <translation id="1427049173708736891">ನಿಮ್ಮ Android ಫೋನ್ ಅನ್‌ಲಾಕ್ ಮಾಡಿರುವಾಗ ಮತ್ತು ಹತ್ತಿರದಲ್ಲಿರುವಾಗ ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಅನ್ನು ಅನ್‌ಲಾಕ್ ಸ್ಥಿತಿಯಲ್ಲಿರಿಸಿ—ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ಟೈಪ್ ಮಾಡಬೇಕಾದ ಅಗತ್ಯವಿಲ್ಲ.</translation>
@@ -522,6 +523,7 @@
 <translation id="1707463636381878959">ಇತರೆ ಬಳಕೆದಾರರೊಂದಿಗೆ ಈ ನೆಟ್‌ವರ್ಕ್ ಅನ್ನು ಹಂಚಿಕೊಳ್ಳಿ</translation>
 <translation id="1708199901407471282">ಹೊಸ ಟ್ಯಾಬ್ ಪುಟದಿಂದ ಸಲಹೆ ಮಾಡಲಾದ ವೆಬ್‌ಪುಟವನ್ನು ತೆರೆಯುವಾಗ, ಸಲಹೆಗಾಗಿ ಟ್ಯಾಬ್ ಈಗಾಗಲೇ ತೆರೆದಿದ್ದರೆ, ಹೊಸ ಟ್ಯಾಬ್‌ನಲ್ಲಿ ಸಲಹೆಯನ್ನು ಲೋಡ್ ಮಾಡುವ ಬದಲು ಅದಕ್ಕೆ ಬದಲಾಯಿಸಿ.</translation>
 <translation id="1708338024780164500">(ಸಕ್ರಿಯವಲ್ಲದ)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">ಜಿಪ್ ಮಾಡುವಿಕೆಯು ವಿಫಲವಾಗಿದೆ, ಅನಿರೀಕ್ಷಿತ ದೋಷ: $1</translation>
 <translation id="1715941336038158809">ಅಮಾನ್ಯ ಬಳಕೆದಾರ ಹೆಸರು ಅಥವಾ ಪಾಸ್‌ವರ್ಡ್.</translation>
 <translation id="1717733954209022288">Google Payments ಕಾರ್ಡ್ ಉಳಿಸುವಿಕೆ ಚೆಕ್‌ಬಾಕ್ಸ್</translation>
@@ -798,6 +800,7 @@
 <translation id="2168214441502403371">ಪರ್ಷಿಯನ್ ಕೀಬೋರ್ಡ್</translation>
 <translation id="2168725742002792683">ಫೈಲ್ ವಿಸ್ತರಣೆಗಳು</translation>
 <translation id="2169062631698640254">ಹೇಗಾದರೂ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation>
+<translation id="2175042898143291048">ಯಾವಾಗಲೂ ಹೀಗೆ ಮಾಡಿ</translation>
 <translation id="2175607476662778685">ಶೀಘ್ರ ಆರಂಭಗೊಳ್ಳುವ ಬಾರ್</translation>
 <translation id="2176045495080708525">ಮುಂದಿನ ವಿಸ್ತರಣೆಗಳನ್ನು ಇದೀಗ ಸ್ಥಾಪಿಸಲಾಗಿದೆ:</translation>
 <translation id="2177950615300672361">ಅಜ್ಞಾತ ಟ್ಯಾಬ್: <ph name="TAB_NAME" /></translation>
@@ -1935,7 +1938,6 @@
 <translation id="3688507211863392146">ಅಪ್ಲಿಕೇಶನ್‌ನಲ್ಲಿ ನೀವು ತೆರೆಯುವಂತಹ ಫೈಲ್‌ಗಳು ಮತ್ತು ಫೋಲ್ಡರ್‌ಗಳಲ್ಲಿ ಬರೆಯಿರಿ</translation>
 <translation id="3688526734140524629">ಚಾನಲ್ ಬದಲಿಸಿ</translation>
 <translation id="3688578402379768763">ನವೀಕೃತವಾಗಿದೆ</translation>
-<translation id="3690976161240450479">ಸೈನ್ ಇನ್ ವಿಫಲವಾಗಿದೆ. ದಯವಿಟ್ಟು ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ ಅಥವಾ ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="3693415264595406141">ಪಾಸ್‌ವರ್ಡ್:</translation>
 <translation id="3694027410380121301">ಹಿಂದಿನ ಟ್ಯಾಬ್ ಆಯ್ಕೆಮಾಡಿ</translation>
 <translation id="3694678678240097321">ಒಂದು ವೇಳೆ ಎಲ್ಲಾ url ಗಳಲ್ಲಿ ರನ್ ಮಾಡಲು ವಿಸ್ತರಣೆ ಅನುಮತಿಯನ್ನು ವಿನಂತಿಸಿಕೊಂಡಿದ್ದರೆ, ಪುಟದಲ್ಲಿನ ಸ್ಕ್ರಿಪ್ಟ್ ರನ್ ಮಾಡುವ ವಿಸ್ತರಣೆಗೆ ಬಳಕೆದಾರ ಸಮ್ಮತಿ ಅಗತ್ಯವಿರುತ್ತದೆ.</translation>
@@ -2231,6 +2233,7 @@
 <translation id="4116663294526079822">ಈ ಸೈಟ್‌ನಲ್ಲಿ ಯಾವಾಗಲೂ ಅನುಮತಿಸು</translation>
 <translation id="411666854932687641">ಖಾಸಗಿ ಸ್ಮರಣೆ</translation>
 <translation id="4118990158415604803">ಇತರ ನೆಟ್‌ವರ್ಕ್‌ಗಳಿಗೆ ಸಂಪರ್ಕಗೊಳಿಸುವುದನ್ನು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{ಮತ್ತು1 ಇನ್ನಷ್ಟು}one{ಮತ್ತು # ಇನ್ನಷ್ಟು}other{ಮತ್ತು # ಇನ್ನಷ್ಟು}}</translation>
 <translation id="4119828560634133962">ಮುದ್ರಣ ಪೂರ್ವವೀಕ್ಷಣೆ ನೋಂದಣಿ ಪ್ರೋಮೋಗಳು</translation>
 <translation id="4120329147617730038"><ph name="USER_EMAIL" /> ಗೆ ಬಹು ಸೈನ್‌-ಇನ್‌ ಅನುಮತಿಯನ್ನು ನಿರ್ವಾಹಕರು ರದ್ದುಗೊಳಿಸಿದ್ದಾರೆ.
 ಮುಂದುವರಿಯಲು ಎಲ್ಲ ಬಳಕೆದಾರರು ಸೈನ್‌ ಔಟ್‌ ಮಾಡಬೇಕು.</translation>
@@ -2370,9 +2373,11 @@
 <translation id="4345703751611431217">ಸಾಫ್ಟ್‌ವೇರ್ ಅನನುರೂಪತೆ: ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ</translation>
 <translation id="4348766275249686434">ದೋಷಗಳನ್ನು ಸಂಗ್ರಹಿಸಿ</translation>
 <translation id="4350019051035968019">ಈ ಸಾಧನವನ್ನು ನಿಮ್ಮ ಖಾತೆಗೆ ಸಂಬಂಧಿಸಿದ ಡೊಮೇನ್‌ಗೆ ಸೇರಿಸಿಕೊಳ್ಳಲು ಸಾಧ್ಯವಿಲ್ಲ ಏಕೆಂದರೆ ಈ ಸಾಧನವನ್ನು ನಿರ್ವಹಿಸಲು ಬೇರೊಂದು ಡೊಮೇ‌ನ್ ಮೂಲಕ ಗುರುತಿಸಲಾಗಿದೆ.</translation>
+<translation id="4354806558096370704">ಸ್ಥಳೀಯ CUPS ಮುದ್ರಿಸುವಿಕೆಯ ಬ್ಯಾಕೆಂಡ್ ಬಳಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ.</translation>
 <translation id="4358697938732213860">ವಿಳಾಸವೊಂದನ್ನು ಸೇರಿಸಿ</translation>
 <translation id="4359408040881008151">ಅವಲಂಬಿತ ವಿಸ್ತರಣೆ(ಗಳು) ಯಿಂದಾಗಿ ಸ್ಥಾಪಿಸಲಾಗಿದೆ.</translation>
 <translation id="4361190688154226069">ವೀಕ್ಷಣೆಗಳಲ್ಲಿ  ಆಯತಾಧಾರಿತ ಗುರಿಗಳು</translation>
+<translation id="4364414793200746179">Android MediaStyle ಅಧಿಸೂಚನೆ</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾಗಿದೆ</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> ವಿಂಡೋವನ್ನು ಹಂಚಿಕೊಳ್ಳುತ್ತಿದೆ.</translation>
 <translation id="4364830672918311045">ಅಧಿಸೂಚನೆಗಳನ್ನು ಪ್ರದರ್ಶಿಸಿ</translation>
@@ -2777,6 +2782,7 @@
 <translation id="4988792151665380515">ಸಾರ್ವಜನಿಕ ಕೀಲಿಯನ್ನು ರಫ್ತು ಮಾಡಲು ವಿಫಲವಾಗಿದೆ.</translation>
 <translation id="49896407730300355">ಅಪ್ರ&amp;ದಕ್ಷಿಣೆಯಂತೆ ತಿರುಗಿಸಿ</translation>
 <translation id="4989966318180235467">&amp;ಹಿನ್ನಲೆ ಪುಟವನ್ನು ಪರಿಶೀಲಿಸಿ</translation>
+<translation id="4990343175649730969">Chrome ಸ್ವಚ್ಛತಾ ಸಾಧನ ಡೌನ್‌ಲೋಡ್‌ ಮಾಡು</translation>
 <translation id="4991420928586866460">ಮೇಲಿನ-ಸಾಲು ಕೀಲಿಗಳನ್ನು ಕಾರ್ಯದ ಕೀಲಿಗಳಂತೆ ಪರಿಗಣಿಸಿ</translation>
 <translation id="499165176004408815">ಉನ್ನತ ಕಾಂಟ್ರಾಸ್ಟ್ ಮೋಡ್ ಬಳಸಿ</translation>
 <translation id="4992066212339426712">ಅನ್‌ಮ್ಯೂಟ್</translation>
@@ -3303,6 +3309,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: ಸಂಪಾದಿಸಲು ಆಯ್ಕೆಮಾಡಿ</translation>
 <translation id="5741454054957165976">ಹೊಸ ಆವೃತ್ತಿ WebFonts ಲೋಡ್ ಆಗುವಿಕೆಗೆ ಬಳಕೆದಾರ-ಏಜೆಂಟ್ ಮಧ್ಯಸ್ಥಿಕೆ ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation>
 <translation id="574392208103952083">ಮಧ್ಯಮ</translation>
+<translation id="5744368829843057748">Translate 2016Q2 UI</translation>
 <translation id="5745056705311424885">USB ಸ್ಮರಣೆಯ ಸ್ಟಿಕ್ ಅನ್ನು ಪತ್ತೆಹಚ್ಚಲಾಗಿದೆ</translation>
 <translation id="5746169159649715125">PDF ನಂತೆ ಉಳಿಸಿ</translation>
 <translation id="5747611503456050045">ಓವರ್‌ಸ್ಕ್ರಾಲಿಂಗ್ ವಿಷಯವನ್ನು ಲಂಬವಾಗಿ ಟ್ರಿಗ್ಗರ್‌ ಮಾಡುವ ಮೂಲಕ ಪುಟ ಮರುಲೋಡ್‌ ಮಾಡುತ್ತದೆ.</translation>
@@ -3410,6 +3417,7 @@
 <translation id="5884474295213649357">ಈ ಟ್ಯಾಬ್ USB ಸಾಧನಕ್ಕೆ ಸಂಪರ್ಕಗೊಂಡಿದೆ.</translation>
 <translation id="5885324376209859881">ಮಾಧ್ಯಮ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸಿ...</translation>
 <translation id="5889282057229379085">ಮಧ್ಯಂತರ CA ಗಳ ಗರಿಷ್ಠ ಸಂಖ್ಯೆ: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">ಏನಾಗುತ್ತಿದೆ ಎಂಬುದನ್ನು ನಮಗೆ ತಿಳಿಸಿ.</translation>
 <translation id="5892290200158927959">ಫ್ರೆಂಚ್ BÉPO ಕೀಬೋರ್ಡ್</translation>
 <translation id="5892507820957994680">ಆಂತರಿಕ ಸಾಫ್ಟ್‌ವೇರ್ ಸಲ್ಲಿಸುವಿಕೆ ಪಟ್ಟಿಯನ್ನು ಅತಿಕ್ರಮಿಸುತ್ತದೆ ಮತ್ತು ಬೆಂಬಲಿಸದೆ ಇರುವ ಸಿಸ್ಟಂ ಕಾನ್ಫಿಗರೇಶನ್‌ಗಳಲ್ಲಿ GPU-ವೇಗವರ್ಧನೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ.</translation>
 <translation id="5895138241574237353">ಮರುಪ್ರಾರಂಭಿಸಿ</translation>
@@ -3551,6 +3559,7 @@
 <translation id="6122093587541546701">ಇಮೇಲ್ (ಐಚ್ಛಿಕ):</translation>
 <translation id="6122875415561139701">ಈ ಸಾಧನದಲ್ಲಿ ಬರೆಯುವಿಕೆ ಕಾರ್ಯಾಚರಣೆಯನ್ನು ಅನುಮತಿಸಲಾಗಿಲ್ಲ: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="6124650939968185064">ಕೆಳಗಿನ ವಿಸ್ತರಣೆಗಳು ಈ ವಿಸ್ತರಣೆಯ ಮೇಲೆ ಅವಲಂಬಿತವಾಗಿವೆ:</translation>
+<translation id="6127945163801765632">ಬುಕ್‌ಮಾರ್ಕ್‌ ನಿರ್ವಾಹಕದಲ್ಲಿನ "ಎಲ್ಲಾ ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳು" ವಿಭಾಗವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation>
 <translation id="6129938384427316298">Netscape ಪ್ರಮಾಣಪತ್ರ ಕಾಮೆಂಟ್</translation>
 <translation id="6129953537138746214">ಸ್ಪೇಸ್</translation>
 <translation id="6132383530370527946">ಚಿಕ್ಕ ಮುದ್ರಣ</translation>
@@ -3577,6 +3586,7 @@
 <translation id="6164005077879661055">ಈ ಮೇಲ್ವಿಚಾರಣೆ ಬಳಕೆದಾರರನ್ನು ಒಮ್ಮೆ ತೆಗೆದುಹಾಕಿದರೆ, ಮೇಲ್ವಿಚಾರಣೆ ಬಳಕೆದಾರರೊಂದಿಗೆ ಸಂಯೋಜಿತವಾಗಿರುವ ಎಲ್ಲ ಫೈಲ್‌ಗಳು ಮತ್ತು ಸ್ಥಳೀಯ ಡೇಟಾವನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಲಾಗುತ್ತದೆ. ಈ ಮೇಲ್ವಿಚಾರಣೆ ಬಳಕೆದಾರಿಗಾಗಿ ಭೇಟಿ ನೀಡಲಾದ ವೆಬ್‌ಸೈಟ್‌ಗಳು ಮತ್ತು ಸೆಟ್ಟಿಂಗ್‌ಗಳು <ph name="MANAGEMENT_URL" /> ನಲ್ಲಿ ನಿರ್ವಾಹಕರಿಗೆ ಈಗಲೂ ಗೋಚರಿಸಬಹುದು.</translation>
 <translation id="6165508094623778733">ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ</translation>
 <translation id="6166185671393271715">Chrome ಗೆ ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ಆಮದು ಮಾಡಿ</translation>
+<translation id="6169666352732958425">ಡೆಸ್ಕ್‌ಟಾಪ್‌ ಬಿತ್ತರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.</translation>
 <translation id="6171550060231646388">ಸಿಮ್ಯುಲೇಟ್ ಮಾಡಲಾದ ಹಾರ್ಡ್‌ವೇರ್ 'Ok Google' ವೈಶಿಷ್ಟ್ಯಗಳು</translation>
 <translation id="6175314957787328458">Microsoft ಡೊಮೇನ್ GUID</translation>
 <translation id="6178664161104547336">ಒಂದು ಪ್ರಮಾಣಪತ್ರವನ್ನು ಆಯ್ಕೆ ಮಾಡಿ</translation>
@@ -3769,6 +3779,7 @@
 <translation id="6458308652667395253">JavaScript ನಿರ್ಬಂಧಿಸುವಿಕೆಯನ್ನು ನಿರ್ವಹಿಸಿ...</translation>
 <translation id="6459488832681039634">ಹುಡುಕಲು ಆಯ್ಕೆಯನ್ನು ಬಳಸಿ</translation>
 <translation id="6460423884798879930">ಈ ಹಿಂದೆ ಸಂಪರ್ಕಗೊಳಿಸಲಾದ ಕ್ಲೈಂಟ್‌ಗಾಗಿ ಇರುವ ಪ್ರಾರಂಭಿಕ SYN ಪ್ಯಾಕೆಟ್‌ನಲ್ಲಿರುವ ಹೆಚ್ಚುವರಿ ದೃಢೀಕರಣ ಮಾಹಿತಿಯನ್ನು ಕಳುಹಿಸಲು ಆಯ್ಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ, ಈ ಮೂಲಕ ವೇಗವಾದ ಡೇಟಾ ಕಳುಹಿಸುವಿಕೆ ಪ್ರಾರಂಭಿಸಲು ಅನುಮತಿಸುತ್ತದೆ.</translation>
+<translation id="6460474910028274178">ಟ್ರಿಗರಿಂಗ್ ಲಾಜಿಕ್ ಸುಧಾರಿಸಲಾಗಿದೆ ಮತ್ತು ಅನುವಾದ ಬಬಲ್ UI ಅನ್ನು ಹುಡುಕಿ</translation>
 <translation id="6460601847208524483">ಮುಂದಿನದು ಕಂಡುಹಿಡಿಯಿರಿ</translation>
 <translation id="6462080265650314920">"<ph name="CONTENT_TYPE" />" ಪ್ರಕಾರದ ವಿಷಯದೊಂದಿಗೆ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಒದಗಿಸಬೇಕು.</translation>
 <translation id="6462082050341971451">ನೀವಿನ್ನೂ ಅಲ್ಲಿಯೇ ಇದ್ದೀರಾ?</translation>
@@ -3898,6 +3909,7 @@
 <translation id="6663792236418322902">ನಂತರ ಈ ಫೈಲ್ ಅನ್ನು ಮರುಸಂಗ್ರಹಿಸಲು ನೀವು ಆಯ್ಕೆಮಾಡಿದ ಪಾಸ್‌ವರ್ಡ್ ಅಗತ್ಯವಿದೆ. ದಯವಿಟ್ಟು ಸುರಕ್ಷಿತ ಸ್ಥಳದಲ್ಲಿ ರೆಕಾರ್ಡ್ ಮಾಡಿ.</translation>
 <translation id="6664237456442406323">ದುರದೃಷ್ಟವಶಾತ್, ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ ಅನ್ನು ತಪ್ಪಾಗಿ ರಚಿಸಲಾದ ಹಾರ್ಡ್‌ವೇರ್ ID ಯೊಂದಿಗೆ ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗಿದೆ. ಇದು Chrome OS ಅನ್ನು ಇತ್ತೀಚಿನ ಭದ್ರತೆ ಸರಿಪಡಿಸುವಿಕೆಗಳೊಂದಿಗೆ ನವೀಕರಿಸುವುದನ್ನು ತಡೆಯುತ್ತದೆ ಮತ್ತು ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ <ph name="BEGIN_BOLD" />ದುರುದ್ದೇಶದ ದಾಳಿಗಳಿಗೆ ಗುರಿಯಾಗುವ ಸಾಧ್ಯತೆಯಿದೆ<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">ನಿಮ್ಮ Google ಖಾತೆಯೊಂದಿಗೆ </translation>
+<translation id="667517062706956822"><ph name="SOURCE_LANGUAGE" /> ಭಾಷೆಯಿಂದ <ph name="TARGET_LANGUAGE" /> ಭಾಷೆಗೆ ಈ ಪುಟವನ್ನು ಅನುವಾದಿಸಲು ನಿಮಗೆ Google ಸಹಾಯ ಬೇಕೇ?</translation>
 <translation id="6675665718701918026">ಪಾಯಿಂಟಿಂಗ್ ಸಾಧನ ಸಂಪರ್ಕಿಸಲಾಗಿದೆ</translation>
 <translation id="6677037229676347494">ನಿರೀಕ್ಷಿಸಲಾದ ID "<ph name="EXPECTED_ID" />", ಆದರೆ ID ಯು "<ph name="NEW_ID" />" ಆಗಿದೆ.</translation>
 <translation id="6680028776254050810">ಬಳಕೆದಾರರನ್ನು ಬದಲಿಸಿ</translation>
@@ -3949,6 +3961,7 @@
 <translation id="6746392203843147041">ವಾ. ಹೆಚ್ಚು ಮಾಡಿ</translation>
 <translation id="6748140994595080445"><ph name="APP_NAME" /> ಹೇಗೆ ಭಾಷೆಗಳನ್ನು ನಿರ್ವಹಿಸಬೇಕು ಹಾಗೂ ಪ್ರದರ್ಶಿಸಬೇಕು ಎಂಬುದನ್ನು ಬದಲಾಯಿಸಿ.</translation>
 <translation id="6748465660675848252">ನೀವು ಮುಂದುವರಿಯಬಹುದು, ಆದರೆ ನಿಮ್ಮ ಸಿಂಕ್ ಮಾಡಲಾದ ಡೇಟಾ ಮತ್ತು ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಮಾತ್ರ ಮರುಸ್ಥಾಪಿಸಲಾಗುವುದು. ಎಲ್ಲಾ ಸ್ಥಳೀಯ ಡೇಟಾ ಕಳೆದು ಹೋಗುತ್ತದೆ.</translation>
+<translation id="6751256176799620176">1 ಫೋಲ್ಡರ್ ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (ಅಜ್ಞಾತ)</translation>
 <translation id="6759193508432371551">ಫ್ಯಾಕ್ಟರಿ ಮರುಹೊಂದಿಸು</translation>
 <translation id="6760765581316020278">ವಿಯೆಟ್ನಾಮೀಸ್ ಕೀಬೋರ್ಡ್ (VNI)</translation>
@@ -4589,6 +4602,7 @@
 <translation id="7717014941119698257">ಡೌನ್‌ಲೋಡ್ ಆಗುತ್ತಿರುವ: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">ತರಬೇತಿ ಸಮಯ ಮೀರಿದೆ</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262">ಈ ವ್ಯಕ್ತಿಯನ್ನು ಮೇಲ್ವಿಚಾರಿಸಲು, <ph name="BEGIN_LINK" />Chromeಗೆ ಸೈನ್‌ ಇನ್ ಮಾಡಿ<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">ಕತ್ತರಿಸು</translation>
 <translation id="7730449930968088409">ನಿಮ್ಮ ಪರದೆಯ ವಿಷಯವನ್ನು ಸೆರೆಹಿಡಿಯಿರಿ</translation>
 <translation id="7730494089396812859">ಮೇಘ ಬ್ಯಾಕಪ್ ವಿವರಗಳನ್ನು ತೋರಿಸು</translation>
@@ -4682,7 +4696,6 @@
 <translation id="7859704718976024901">ಬ್ರೌಸಿಂಗ್ ಇತಿಹಾಸ</translation>
 <translation id="7861215335140947162">&amp;ಡೌನ್‌ಲೋಡ್‌ಗಳು</translation>
 <translation id="7864539943188674973">bluetooth ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ</translation>
-<translation id="7868891395842935202">API ಪ್ರಯೋಗಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ನಿಯಂತ್ರಿಸಲು ಪ್ರಾಯೋಗಿಕ ಫ್ರೇಮ್‌ವರ್ಕ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ.</translation>
 <translation id="7870576007982733437">ಅನ್ವಯವಾಗುವಾಗ ಸಿಸ್ಟಂ ಡೌನ್‌ಲೋಡ್ ಮ್ಯಾನೇಜರ್‌ ಬಳಸಿ.</translation>
 <translation id="7870790288828963061">ಹೊಸ ಆವೃತ್ತಿಯೊಂದಿಗೆ ಯಾವುದೇ ಕಿಯೋಸ್ಕ್ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಕಂಡುಬಂದಿಲ್ಲ. ನವೀಕರಿಸಲು ಏನೂ ಇಲ್ಲ. ದಯವಿಟ್ಟು USB ಸ್ಟಿಕ್ ತೆಗೆದುಹಾಕಿ.</translation>
 <translation id="787150342916295244">ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್ ಸ್ಕ್ಯಾನ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation>
@@ -5008,7 +5021,6 @@
 <translation id="8309505303672555187">ನೆಟ್‌ವರ್ಕ್ ಆಯ್ಕೆ ಮಾಡಿ:</translation>
 <translation id="8312871300878166382">ಫೋಲ್ಡರ್‌ಗೆ ಅಂಟಿಸಿ</translation>
 <translation id="8314013494437618358">ಸಂಯೋಜನೆಯನ್ನು ಥ್ರೆಡ್ ಮಾಡಲಾಗಿದೆ</translation>
-<translation id="8314576811984836978">ಪ್ರಾಯೋಗಿಕ ಫ್ರೇಮ್‌ವರ್ಕ್.</translation>
 <translation id="8319414634934645341">ವಿಸ್ತರಿತ ಕೀಲಿ ಬಳಕೆ</translation>
 <translation id="8322814362483282060">ಈ ಪುಟವನ್ನು ನಿಮ್ಮ ಮೈಕ್ರೋಫೋನ್ ಪ್ರವೇಶದಿಂದ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ.</translation>
 <translation id="8326478304147373412">PKCS #7, ಪ್ರಮಾಣಪತ್ರ ಸರಣಿ</translation>
@@ -5069,7 +5081,6 @@
 <translation id="8418240940464873056">ಹಂಜಾ ಮೋಡ್</translation>
 <translation id="8418445294933751433">ಟ್ಯಾಬ್‌ನಂತೆ &amp;ತೋರಿಸಿ</translation>
 <translation id="8420060421540670057">Google ಡಾಕ್ಸ್ ಫೈಲ್‌ಗಳನ್ನು ತೋರಿಸಿ</translation>
-<translation id="8420728540268437431">ಈ ಪುಟವನ್ನು ಭಾಷಾಂತರ ಮಾಡಲಾಗುತ್ತಿದೆ...</translation>
 <translation id="842274098655511832">WebGL ಡ್ರಾಫ್ಟ್ ವಿಸ್ತರಣೆಗಳು</translation>
 <translation id="8424039430705546751">ಕೆಳಗೆ</translation>
 <translation id="8425213833346101688">ಬದಲಿಸಿ</translation>
@@ -5256,6 +5267,7 @@
 <translation id="8690754533598178758">Adobe ಫ್ಲ್ಯಾಶ್ ಪ್ಲೇಯರ್ ಮೈಕ್ರೊಫೋನ್ ವಿನಾಯಿತಿಗಳು ವಿಭಿನ್ನವಾಗಿವೆ.</translation>
 <translation id="8691686986795184760">(ಎಂಟರ್‌ಪ್ರೈಸ್ ನೀತಿಗಳಿಂದ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ)</translation>
 <translation id="869257642790614972">ಕೊನೆಯದಾಗಿ ಮುಚ್ಚಿದ ಟ್ಯಾಬ್ ಅನ್ನು ಮರುತೆರೆಯಿರಿ</translation>
+<translation id="8695770993395462321">ಸ್ಥಳೀಯ CUPS</translation>
 <translation id="8695825812785969222">&amp;ಸ್ಥಾನವನ್ನು ತೆರೆಯಿರಿ...</translation>
 <translation id="8698464937041809063">Google ರೇಖಾಚಿತ್ರ</translation>
 <translation id="869884720829132584">ಅಪ್ಲಿಕೇಶನ್‌ಗಳ ಮೆನು</translation>
@@ -5598,6 +5610,7 @@
 <translation id="9189690067274055051">ನಮೂದಿಸಲು ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ಅನ್‌ಲಾಕ್ ಮಾಡಿ ಮತ್ತು ಅದನ್ನು ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಸಾಧನದ ಹತ್ತಿರ ಇರಿಸಿ.</translation>
 <translation id="9190063653747922532">L2TP/IPSec + ಪೂರ್ವ ಹಂಚಿತ ಕೀಲಿ</translation>
 <translation id="9201305942933582053">Chrome ಗಾಗಿ Google Now!</translation>
+<translation id="9202646163273566462">ಬುಕ್‌ಮಾರ್ಕ್‌ ನಿರ್ವಾಹಕದ ಡೀಫಾಲ್ಟ್ ಗಮ್ಯಸ್ಥಾನವಾಗಿ ಎಲ್ಲಾ ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳ ವೀಕ್ಷಣೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ.</translation>
 <translation id="9203398526606335860">&amp;ಪ್ರೊಫೈಲಿಂಗ್ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ
 </translation>
 <translation id="9203478404496196495">ಟ್ಯಾಬ್ ಅನ್ನು ಅನ್ ಮ್ಯೂಟ್ ಮಾಡಿ</translation>
@@ -5625,6 +5638,7 @@
 <translation id="939736085109172342">ಹೊಸ ಫೋಲ್ಡರ್</translation>
 <translation id="940425055435005472">ಫಾಂಟ್ ಗಾತ್ರ:</translation>
 <translation id="941543339607623937">ಅಮಾನ್ಯ ಖಾಸಗಿ ಕೀಲಿ.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{ಯಾವುದೂ ಇಲ್ಲ}=1{1 ಅಪ್ಲಿಕೇಶನ್‌ ($1)}=2{2 ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ($1, $2)}one{# ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ($1, $2, $3)}other{# ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ($1, $2, $3)}}</translation>
 <translation id="942532530371314860">Chrome ಟ್ಯಾಬ್ ಮತ್ತು ಆಡಿಯೋವನ್ನು <ph name="APP_NAME" /> ಹಂಚಿಕೊಳ್ಳುತ್ತಿದೆ.</translation>
 <translation id="942954117721265519">ಈ ಡೈರೆಕ್ಟರಿಯಲ್ಲಿ ಯಾವುದೇ ಚಿತ್ರಗಳಿಲ್ಲ.</translation>
 <translation id="945522503751344254">ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಕಳುಹಿಸಿ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index ac840d4..3eff59f 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" />(확장 프로그램 ID '<ph name="EXTENSION_ID" />')은(는) 이 세션 유형에서 허용되지 않습니다.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">임의의 RSA 비공개 키를 생성하지 못했습니다.</translation>
+<translation id="1421115928968836111">이렇게 하면 보호된 콘텐츠의 Flash Player 라이선스를 승인 취소하게 됩니다.</translation>
 <translation id="1425734930786274278">다음 쿠키가 차단됨(타사의 쿠키도 예외 없이 차단됨):</translation>
 <translation id="1426410128494586442">예</translation>
 <translation id="1427049173708736891">Android 휴대전화가 잠금 해제된 상태로 가까이에 있는 경우 <ph name="DEVICE_TYPE" />도 잠금 해제 상태로 유지되며 비밀번호를 입력할 필요가 없습니다.</translation>
@@ -522,6 +523,7 @@
 <translation id="1707463636381878959">다른 사용자와 네트워크 공유</translation>
 <translation id="1708199901407471282">새 탭 페이지에서 추천 웹페이지를 여는 경우 이미 추천 항목 탭이 열려 있다면 새 탭에서 추천 항목을 여는 대신 해당 탭으로 전환합니다.</translation>
 <translation id="1708338024780164500">(비활성)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" />(ID: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">압축에 실패했습니다. 예기치 않은 오류: $1</translation>
 <translation id="1715941336038158809">사용자 이름 또는 비밀번호가 잘못되었습니다.</translation>
 <translation id="1717733954209022288">Google Payments 카드 저장 체크박스</translation>
@@ -799,6 +801,7 @@
 <translation id="2168214441502403371">페르시아어 키보드</translation>
 <translation id="2168725742002792683">파일 확장명</translation>
 <translation id="2169062631698640254">로그인</translation>
+<translation id="2175042898143291048">항상 번역</translation>
 <translation id="2175607476662778685">빠른 실행 표시줄</translation>
 <translation id="2176045495080708525">현재 설치된 확장 프로그램:</translation>
 <translation id="2177950615300672361">시크릿 탭: <ph name="TAB_NAME" /></translation>
@@ -1938,7 +1941,6 @@
 <translation id="3688507211863392146">애플리케이션에서 연 파일 및 폴더에 쓰기</translation>
 <translation id="3688526734140524629">채널 변경</translation>
 <translation id="3688578402379768763">최신</translation>
-<translation id="3690976161240450479">로그인하지 못했습니다. 관리자에게 문의하거나 다시 시도해 보세요.</translation>
 <translation id="3693415264595406141">비밀번호:</translation>
 <translation id="3694027410380121301">이전 탭 선택</translation>
 <translation id="3694678678240097321">확장 프로그램이 모든 URL에서 실행되기 위한 권한을 요청한 경우, 페이지에서 스크립트를 실행하기 위해 사용자 동의가 필요합니다.</translation>
@@ -2233,6 +2235,7 @@
 <translation id="4116663294526079822">이 사이트에서 항상 허용</translation>
 <translation id="411666854932687641">개별 메모리</translation>
 <translation id="4118990158415604803">관리자가 다른 네트워크에 연결하지 못하도록 설정했습니다.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{외 1개}other{외 #개}}</translation>
 <translation id="4119828560634133962">인쇄 미리보기 등록 프로모션</translation>
 <translation id="4120329147617730038">관리자가 <ph name="USER_EMAIL" />의 멀티 로그인을 허용하지 않았습니다.
 계속하려면 모든 사용자가 로그아웃해야 합니다.</translation>
@@ -2372,9 +2375,11 @@
 <translation id="4345703751611431217">소프트웨어 비호환성: 자세히 알아보기</translation>
 <translation id="4348766275249686434">오류 수집</translation>
 <translation id="4350019051035968019">이 기기는 다른 도메인에서 관리하는 것으로 표시되어 있기 때문에 사용자의 계정이 속한 도메인에 등록할 수 없습니다.</translation>
+<translation id="4354806558096370704">기본 CUPS 인쇄 백엔드를 사용하도록 설정합니다.</translation>
 <translation id="4358697938732213860">주소 추가</translation>
 <translation id="4359408040881008151">함께 설치된 확장 프로그램입니다.</translation>
 <translation id="4361190688154226069">보기에 사각형 기반 타겟팅 사용</translation>
+<translation id="4364414793200746179">Android MediaStyle 알림</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" />(이)가 다운로드됨</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" />이(가) 창을 공유합니다.</translation>
 <translation id="4364830672918311045">알림 표시</translation>
@@ -2778,6 +2783,7 @@
 <translation id="4988792151665380515">공개 키를 내보내지 못했습니다.</translation>
 <translation id="49896407730300355">반시계 방향으로 회전(&amp;O)</translation>
 <translation id="4989966318180235467">백그라운드 페이지 검사(&amp;B)</translation>
+<translation id="4990343175649730969">Chrome 정리도구 다운로드</translation>
 <translation id="4991420928586866460">맨 위 키를 기능 키로 사용</translation>
 <translation id="499165176004408815">고대비 모드 사용</translation>
 <translation id="4992066212339426712">음소거 해제</translation>
@@ -3301,6 +3307,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: 수정하려면 선택</translation>
 <translation id="5741454054957165976">WebFonts 로딩을 위해 사용자 에이전트 개입의 새 버전을 사용합니다.</translation>
 <translation id="574392208103952083">보통</translation>
+<translation id="5744368829843057748">2016Q2 UI 번역</translation>
 <translation id="5745056705311424885">USB 메모리가 감지되었습니다.</translation>
 <translation id="5746169159649715125">PDF로 저장</translation>
 <translation id="5747611503456050045">콘텐츠를 세로로 오버스크롤할 때 페이지가 새로고침됩니다.</translation>
@@ -3408,6 +3415,7 @@
 <translation id="5884474295213649357">이 탭이 USB 기기에 연결되었습니다.</translation>
 <translation id="5885324376209859881">미디어 설정 관리...</translation>
 <translation id="5889282057229379085">중간 인증기관(CA)의 최대 개수: <ph name="NUM_INTERMEDIATE_CA" />개</translation>
+<translation id="5891822366999803429">어떤 문제인지 설명해 주세요.</translation>
 <translation id="5892290200158927959">프랑스어 BÉPO 키보드</translation>
 <translation id="5892507820957994680">내장된 소프트웨어 렌더링 목록을 무시하고 지원되지 않는 시스템 설정에 GPU 가속 사용</translation>
 <translation id="5895138241574237353">다시 시작</translation>
@@ -3551,6 +3559,7 @@
 <translation id="6122093587541546701">이메일(선택사항):</translation>
 <translation id="6122875415561139701">기기(<ph name="DEVICE_NAME" />)에서 쓰기 작업이 허용되지 않습니다.</translation>
 <translation id="6124650939968185064">이 확장 프로그램에 종속되는 확장 프로그램:</translation>
+<translation id="6127945163801765632">북마크 관리자에서 '모든 북마크' 섹션을 사용 설정합니다.</translation>
 <translation id="6129938384427316298">Netscape Certificate Comment</translation>
 <translation id="6129953537138746214">공백</translation>
 <translation id="6132383530370527946">이용약관</translation>
@@ -3577,6 +3586,7 @@
 <translation id="6164005077879661055">관리 대상 사용자를 제거하면 해당 관리 대상 사용자와 연결되어 있는 모든 파일 및 로컬 데이터가 영구적으로 삭제됩니다. 하지만 관리자는 관리 대상 사용자의 방문한 웹사이트 및 설정을 <ph name="MANAGEMENT_URL" /> 페이지에서 계속 볼 수 있습니다.</translation>
 <translation id="6165508094623778733">자세히 알아보기</translation>
 <translation id="6166185671393271715">Chrome으로 비밀번호 가져오기</translation>
+<translation id="6169666352732958425">데스크톱을 전송할 수 없음</translation>
 <translation id="6171550060231646388">시뮬레이션된 하드웨어 'Ok Google' 기능</translation>
 <translation id="6175314957787328458">Microsoft Domain GUID</translation>
 <translation id="6178664161104547336">인증서 선택</translation>
@@ -3770,6 +3780,7 @@
 <translation id="6458308652667395253">자바스크립트 차단 관리...</translation>
 <translation id="6459488832681039634">선택 부분으로 찾기</translation>
 <translation id="6460423884798879930">이전에 연결된 클라이언트가 초기 SYN 패킷에 추가 인증 정보를 전송할 수 있도록 옵션을 사용 설정하여 데이터에서 신속하게 '시작' 명령을 보낼 수 있도록 합니다.</translation>
+<translation id="6460474910028274178">개선된 로직 트리거 및 번역 도움말 풍선 UI 찾기</translation>
 <translation id="6460601847208524483">다음 찾기</translation>
 <translation id="6462080265650314920">앱은 '<ph name="CONTENT_TYPE" />' 콘텐츠 유형으로 제공되어야 합니다.</translation>
 <translation id="6462082050341971451">아직 온라인이세요?</translation>
@@ -3899,6 +3910,7 @@
 <translation id="6663792236418322902">선택한 비밀번호는 나중에 이 파일을 복원할 때 필요하므로 안전한 위치에 기록해 두세요.</translation>
 <translation id="6664237456442406323">컴퓨터가 잘못된 형식의 하드웨어 ID로 구성되어 있습니다. 이렇게 하면 Chrome OS가 최신 보안 수정사항을 업데이트할 수 없으며 컴퓨터가<ph name="BEGIN_BOLD" />악의적인 공격에 취약해 집니다<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290" />
+<translation id="667517062706956822">Google에서 이 페이지를 <ph name="SOURCE_LANGUAGE" />에서 <ph name="TARGET_LANGUAGE" />로 번역할까요?</translation>
 <translation id="6675665718701918026">포인팅 기기 연결됨</translation>
 <translation id="6677037229676347494">ID로 '<ph name="EXPECTED_ID" />'을(를) 예상했으나 '<ph name="NEW_ID" />'이(가) 표시되었습니다.</translation>
 <translation id="6680028776254050810">사용자 전환</translation>
@@ -3950,6 +3962,7 @@
 <translation id="6746392203843147041">볼륨 크게</translation>
 <translation id="6748140994595080445"><ph name="APP_NAME" />에서 언어를 처리하고 표시하는 방법 변경</translation>
 <translation id="6748465660675848252">계속 진행할 수 있지만 동기화된 데이터와 설정만 복원됩니다. 모든 로컬 데이터가 손실됩니다.</translation>
+<translation id="6751256176799620176">폴더 1개 선택됨</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (시크릿 모드)</translation>
 <translation id="6759193508432371551">초기화</translation>
 <translation id="6760765581316020278">베트남어 키보드(VNI)</translation>
@@ -4590,6 +4603,7 @@
 <translation id="7717014941119698257">다운로드: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">교육 시간 초과</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262">이 사용자를 관리하려면 <ph name="BEGIN_LINK" />Chrome에 로그인<ph name="END_LINK" />하세요.</translation>
 <translation id="7724603315864178912">잘라내기</translation>
 <translation id="7730449930968088409">화면의 콘텐츠 캡쳐</translation>
 <translation id="7730494089396812859">클라우드 백업 상세정보를 표시합니다.</translation>
@@ -4683,7 +4697,6 @@
 <translation id="7859704718976024901">인터넷 사용 기록</translation>
 <translation id="7861215335140947162">다운로드(&amp;D)</translation>
 <translation id="7864539943188674973">블루투스 사용 안 함</translation>
-<translation id="7868891395842935202">API 실험에 대한 액세스를 제어하는 실험용 프레임워크를 사용합니다.</translation>
 <translation id="7870576007982733437">해당하는 경우 시스템 다운로드 관리자 사용</translation>
 <translation id="7870790288828963061">새로운 버전의 Kiosk 앱을 찾을 수 없습니다. 업데이트할 대상이 없습니다. USB 메모리를 제거하세요.</translation>
 <translation id="787150342916295244">신용카드 스캐닝</translation>
@@ -5014,7 +5027,6 @@
 <translation id="8309505303672555187">네트워크 선택:</translation>
 <translation id="8312871300878166382">폴더에 붙여넣기</translation>
 <translation id="8314013494437618358">스레드 합성</translation>
-<translation id="8314576811984836978">실험용 프레임워크</translation>
 <translation id="8319414634934645341">확장된 키 사용</translation>
 <translation id="8322814362483282060">마이크 액세스가 차단된 페이지입니다.</translation>
 <translation id="8326478304147373412">PKCS #7, 인증서 체인</translation>
@@ -5075,7 +5087,6 @@
 <translation id="8418240940464873056">한자 모드</translation>
 <translation id="8418445294933751433">탭으로 표시(&amp;S)</translation>
 <translation id="8420060421540670057">Google 문서도구 파일 표시</translation>
-<translation id="8420728540268437431">이 페이지를 번역 중입니다 ...</translation>
 <translation id="842274098655511832">WebGL 초안 확장 프로그램</translation>
 <translation id="8424039430705546751">아래</translation>
 <translation id="8425213833346101688">변경</translation>
@@ -5262,6 +5273,7 @@
 <translation id="8690754533598178758">Adobe Flash Player 마이크 예외가 다릅니다.</translation>
 <translation id="8691686986795184760">(엔터프라이즈 정책에 의해 사용하도록 설정)</translation>
 <translation id="869257642790614972">마지막으로 닫은 탭 다시 열기</translation>
+<translation id="8695770993395462321">기본 CUPS</translation>
 <translation id="8695825812785969222">위치 열기(&amp;L)...</translation>
 <translation id="8698464937041809063">Google 드로잉</translation>
 <translation id="869884720829132584">애플리케이션 메뉴</translation>
@@ -5604,6 +5616,7 @@
 <translation id="9189690067274055051">휴대전화를 잠금 해제하고 <ph name="DEVICE_TYPE" />에 가까이 가져와서 사용을 시작합니다.</translation>
 <translation id="9190063653747922532">L2TP/IPSec + 사전 공유 키</translation>
 <translation id="9201305942933582053">Chrome용 Google Now</translation>
+<translation id="9202646163273566462">모든 북마크 보기를 북마크 관리자의 기본 목적지로 사용 설정합니다.</translation>
 <translation id="9203398526606335860">프로파일링 사용(&amp;P)</translation>
 <translation id="9203478404496196495">탭 음소거 해제</translation>
 <translation id="9203962528777363226">이 기기의 관리자가 새로운 사용자를 추가하지 못하도록 설정함</translation>
@@ -5630,6 +5643,7 @@
 <translation id="939736085109172342">새 폴더</translation>
 <translation id="940425055435005472">글꼴 크기:</translation>
 <translation id="941543339607623937">비공개 키가 잘못되었습니다.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{없음}=1{앱 1개($1)}=2{앱 2개($1, $2)}other{앱 #개($1, $2, $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" />에서 Chrome 탭과 오디오를 공유 중입니다.</translation>
 <translation id="942954117721265519">이 디렉토리에 이미지가 없습니다.</translation>
 <translation id="945522503751344254">의견 보내기</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index ef260160f..28a223ae 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608">„<ph name="EXTENSION_NAME" />“ (plėtinio ID „<ph name="EXTENSION_ID" />“) neleidžiamas vykstant šio tipo seansui.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Oi! Nepavyko sukurti atsitiktinio RSA privačiojo rakto.</translation>
+<translation id="1421115928968836111">Bus neleidžiamos apsaugoto turinio „Flash“ leistuvės licencijos.</translation>
 <translation id="1425734930786274278">Buvo užblokuoti toliau nurodyti slapukai (trečiųjų šalių slapukai blokuojami be išimčių):</translation>
 <translation id="1426410128494586442">Taip</translation>
 <translation id="1427049173708736891">Jei „Android“ telefonas yra atrakintas ir netoliese, įrenginys „<ph name="DEVICE_TYPE" />“ bus atrakintas net ir neįvedus slaptažodžio.</translation>
@@ -521,6 +522,7 @@
 <translation id="1707463636381878959">Bendrinti šį tinklą su kitais naudotojais</translation>
 <translation id="1708199901407471282">Kai atidaromas siūlomas tinklalapis iš naujo skirtuko puslapio, jei skirtukas jau atidarytas pateikti pasiūlymą, perjunkite į tą skirtuką neįkeldami pasiūlymo naujame skirtuke.</translation>
 <translation id="1708338024780164500">(Neaktyvus)</translation>
+<translation id="1708713382908678956">„<ph name="NAME_PH" />“ (ID: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Archyvuojant įvyko netikėta klaida: $1</translation>
 <translation id="1715941336038158809">Neteisingas naudotojo vardas ar slaptažodis.</translation>
 <translation id="1717733954209022288">„Google Payments“ kortelės išsaugojimo žymimasis laukelis</translation>
@@ -798,6 +800,7 @@
 <translation id="2168214441502403371">Persiška klaviatūra</translation>
 <translation id="2168725742002792683">Failo plėtiniai</translation>
 <translation id="2169062631698640254">Vis tiek prisijungti</translation>
+<translation id="2175042898143291048">Visada tai atlikti</translation>
 <translation id="2175607476662778685">Sparčiosios paleisties juosta</translation>
 <translation id="2176045495080708525">Jau įdiegti nurodyti plėtiniai:</translation>
 <translation id="2177950615300672361">Inkognito skirtukas: „<ph name="TAB_NAME" />“</translation>
@@ -1936,7 +1939,6 @@
 <translation id="3688507211863392146">Rašyti failuose ir aplankuose, kuriuos atidarėte programoje</translation>
 <translation id="3688526734140524629">Keisti kanalą</translation>
 <translation id="3688578402379768763">Atnaujinta</translation>
-<translation id="3690976161240450479">Nepavyko prisijungti. Susisiekite su administratoriumi arba bandykite dar kartą.</translation>
 <translation id="3693415264595406141">Slaptažodis:</translation>
 <translation id="3694027410380121301">Pasirinkti ankstesnį skirtuką</translation>
 <translation id="3694678678240097321">Prašyti naudotojo sutikimo dėl plėtinio, vykdančio scenarijų puslapyje, jei plėtinys pateikė užklausą dėl leidimo vykdyti visuose URL.</translation>
@@ -2232,6 +2234,7 @@
 <translation id="4116663294526079822">Visada leisti šioje svetainėje</translation>
 <translation id="411666854932687641">Asmeninė atmintis</translation>
 <translation id="4118990158415604803">Prisijungimo prie kitų tinklų funkciją išjungė jūsų administratorius.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{ir dar 1}one{ir dar #}few{ir dar #}many{ir dar #}other{ir dar #}}</translation>
 <translation id="4119828560634133962">Spaudinio peržiūros registracijos reklamos</translation>
 <translation id="4120329147617730038">Administratorius neleido <ph name="USER_EMAIL" /> prisijungti prie kelių paskyrų.
 Norint tęsti, visi naudotojai turi atsijungti.</translation>
@@ -2371,9 +2374,11 @@
 <translation id="4345703751611431217">Nesuderinama programinė įranga: sužinokite daugiau</translation>
 <translation id="4348766275249686434">Kaupti klaidas</translation>
 <translation id="4350019051035968019">Šio įrenginio negalima užregistruoti domene, kuriam priklauso paskyra, nes pažymėta, kad įrenginys tvarkomas kito domeno.</translation>
+<translation id="4354806558096370704">Leidžiama naudoti savąją CUPS spausdinimo vidinę pusę.</translation>
 <translation id="4358697938732213860">Pridėti adresą</translation>
 <translation id="4359408040881008151">Įdiegta, nes priklauso nuo plėtinio (-ių).</translation>
 <translation id="4361190688154226069">Stačiakampio pagrindu nustatomas taikymas rodiniuose</translation>
+<translation id="4364414793200746179">„Android MediaStyle“ pranešimas</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> atsisiųstas</translation>
 <translation id="4364567974334641491">„<ph name="APP_NAME" />“ bendrina langą.</translation>
 <translation id="4364830672918311045">Pateikti pranešimus</translation>
@@ -2776,6 +2781,7 @@
 <translation id="4988792151665380515">Nepavyko eksportuoti viešojo rakto.</translation>
 <translation id="49896407730300355">Sukti prieš l&amp;aikrodžio rodyklę</translation>
 <translation id="4989966318180235467">Tikrinti fono puslapį</translation>
+<translation id="4990343175649730969">Atsisiųsti „Chrome“ valymo įrankį</translation>
 <translation id="4991420928586866460">Viršutinės eilutės klavišus naudoti kaip funkcijų klavišus</translation>
 <translation id="499165176004408815">Naudoti didelio kontrasto režimą</translation>
 <translation id="4992066212339426712">Įjungti garsą</translation>
@@ -3300,6 +3306,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: pasirinkite, jei norite redaguoti</translation>
 <translation id="5741454054957165976">Įgalinti naują naudotojo priemonės įsikišimo įkeliant žiniatinklio šriftus versiją.</translation>
 <translation id="574392208103952083">Vidutinis</translation>
+<translation id="5744368829843057748">Išversti 2016Q2 naudotojo sąsają</translation>
 <translation id="5745056705311424885">Aptikta USB atminties kortelė</translation>
 <translation id="5746169159649715125">Išsaugoti kaip PDF</translation>
 <translation id="5747611503456050045">Puslapio įkėlimai iš naujo, kai turinys užslenkamas vertikaliai.</translation>
@@ -3407,6 +3414,7 @@
 <translation id="5884474295213649357">Šis skirtukas susietas su USB įrenginiu.</translation>
 <translation id="5885324376209859881">Valdyti medijos nustatymus...</translation>
 <translation id="5889282057229379085">Didžiausias tarpinių CA skaičius: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Aprašykite problemą.</translation>
 <translation id="5892290200158927959">Prancūziška BÉPO klaviatūra</translation>
 <translation id="5892507820957994680">Nepaisoma įtaisytosios programinės įrangos nuskaitymo sąrašo ir įgalinamas GPU spartinimas esant nepalaikomoms sistemos konfigūracijoms.</translation>
 <translation id="5895138241574237353">Paleisti iš naujo</translation>
@@ -3550,6 +3558,7 @@
 <translation id="6122093587541546701">El. paštas (pasirenkama):</translation>
 <translation id="6122875415561139701">Rašymo operacija neleidžiama įrenginyje „<ph name="DEVICE_NAME" />“.</translation>
 <translation id="6124650939968185064">Toliau pateikti plėtiniai priklauso nuo šio plėtinio:</translation>
+<translation id="6127945163801765632">Įgalinkite skiltį „Visos žymės“ žymių tvarkytuvėje.</translation>
 <translation id="6129938384427316298">„Netscape“ sertifikato komentaras</translation>
 <translation id="6129953537138746214">Tarpas</translation>
 <translation id="6132383530370527946">Smulkus šriftas</translation>
@@ -3576,6 +3585,7 @@
 <translation id="6164005077879661055">Visi failai ir su prižiūrimu naudotoju susiję duomenys bus ištrinti visam laikui, kai bus pašalintas šis prižiūrimas naudotojas. Valdytojas vis tiek gali peržiūrėti šio prižiūrimo naudotojo aplankytas svetaines ir nustatymus adresu <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Sužinokite daugiau</translation>
 <translation id="6166185671393271715">Slaptažodžių importavimas į „Chrome“</translation>
+<translation id="6169666352732958425">Nepavyko perduoti stalinio kompiuterio ekrano.</translation>
 <translation id="6171550060231646388">Imituojamos aparatinės įrangos funkcijos „Ok Google“</translation>
 <translation id="6175314957787328458">„Microsoft“ domeno GUID</translation>
 <translation id="6178664161104547336">Pasirinkite sertifikatą</translation>
@@ -3769,6 +3779,7 @@
 <translation id="6458308652667395253">Valdyti „JavaScript“ blokavimą...</translation>
 <translation id="6459488832681039634">Paieškai naudoti pasirinkimą</translation>
 <translation id="6460423884798879930">Įgalinkite parinktį siųsti papildomą autentifikavimo informaciją pradiniame anksčiau prijungto kliento programos SYN pakete, kad duomenys būtų pradedami siųsti greičiau.</translation>
+<translation id="6460474910028274178">Pagerinta Vertėjo debesėlio naudotojo sąsajos suaktyvinimo logika ir išvaizda</translation>
 <translation id="6460601847208524483">Rasti kitą</translation>
 <translation id="6462080265650314920">Teikiamų programų turinys turi būti „<ph name="CONTENT_TYPE" />“ tipo.</translation>
 <translation id="6462082050341971451">Ar jūs vis dar čia?</translation>
@@ -3898,6 +3909,7 @@
 <translation id="6663792236418322902">Pasirenkamas slaptažodis vėliau bus reikalingas atkuriant šį failą. Įrašykite jį saugioje vietoje.</translation>
 <translation id="6664237456442406323">Deja, jūsų kompiuteris yra sukonfigūruotas naudojant netinkamai suformuotą aparatinės įrangos ID. Tai neleidžia „Chrome“ OS atnaujinti naujausiais saugos pataisymais ir jūsų kompiuteris <ph name="BEGIN_BOLD" />gali būti neatsparus kenkėjiškoms programoms<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">naudodami „Google“ paskyrą</translation>
+<translation id="667517062706956822">Ar norite, kad „Google“ išverstų puslapį iš <ph name="SOURCE_LANGUAGE" /> į <ph name="TARGET_LANGUAGE" />?</translation>
 <translation id="6675665718701918026">Manipuliatorius prijungtas</translation>
 <translation id="6677037229676347494">ID turėjo būti <ph name="EXPECTED_ID" />, o buvo pateiktas – <ph name="NEW_ID" />.</translation>
 <translation id="6680028776254050810">Perjungti naudotojus</translation>
@@ -3949,6 +3961,7 @@
 <translation id="6746392203843147041">did. garsumą</translation>
 <translation id="6748140994595080445">Keiskite, kaip „<ph name="APP_NAME" />“ tvarko ir pateikia kalbas.</translation>
 <translation id="6748465660675848252">Galite tęsti, bet bus atkurti tik sinchronizuoti duomenys ir nustatymai. Visi vietiniai duomenys bus prarasti.</translation>
+<translation id="6751256176799620176">Pasirinktas 1 aplankas</translation>
 <translation id="6751344591405861699">„<ph name="WINDOW_TITLE" />“ (Inkognito)</translation>
 <translation id="6759193508432371551">Gamykliniai nustatymai</translation>
 <translation id="6760765581316020278">Vietnamietiška klaviatūra (VNI)</translation>
@@ -4591,6 +4604,7 @@
 <translation id="7717014941119698257">Atsisiunčiama: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">Baigėsi skirtasis mokymo laikas</translation>
 <translation id="771953673318695590">KU</translation>
+<translation id="7720375555307821262">Jei norite prižiūrėti šį asmenį, <ph name="BEGIN_LINK" />prisijunkite prie „Chrome“<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">Iškirpti</translation>
 <translation id="7730449930968088409">Fiksuokite savo ekrano turinį</translation>
 <translation id="7730494089396812859">Rodyti išsamią atsarginių kopijų kūrimo debesyje informaciją</translation>
@@ -4684,7 +4698,6 @@
 <translation id="7859704718976024901">Naršymo istorija</translation>
 <translation id="7861215335140947162">&amp;Atsisiuntimai</translation>
 <translation id="7864539943188674973">Neleisti „Bluetooth“</translation>
-<translation id="7868891395842935202">Įgalinama eksperimentinė struktūra, skirta prieigai prie API eksperimentų valdyti.</translation>
 <translation id="7870576007982733437">Naudoti sistemos atsisiuntimų tvarkytuvę, kai tai įmanoma.</translation>
 <translation id="7870790288828963061">Nerasta jokių naujesnių versijų viešojo terminalo programų. Naujinių nėra. Atjunkite USB atmintuką.</translation>
 <translation id="787150342916295244">Kredito kortelės nuskaitymas</translation>
@@ -5015,7 +5028,6 @@
 <translation id="8309505303672555187">Pasirinkti tinklą:</translation>
 <translation id="8312871300878166382">Įklijuoti į aplanką</translation>
 <translation id="8314013494437618358">Kūrimas gijų pagrindu</translation>
-<translation id="8314576811984836978">Eksperimentinė struktūra.</translation>
 <translation id="8319414634934645341">Išplėstinis rakto naudojimas</translation>
 <translation id="8322814362483282060">Šis puslapis užblokuotas, kad nepasiektų jūsų mikrofono.</translation>
 <translation id="8326478304147373412">PKCS Nr. 7, sertifikato grandinė</translation>
@@ -5076,7 +5088,6 @@
 <translation id="8418240940464873056">Hanja režimas</translation>
 <translation id="8418445294933751433">&amp;Rodyti kaip skirtuką</translation>
 <translation id="8420060421540670057">Rodyti „Google“ dokumentų failus</translation>
-<translation id="8420728540268437431">Šis puslapis verčiamas...</translation>
 <translation id="842274098655511832">„WebGL“ juodraščio plėtiniai</translation>
 <translation id="8424039430705546751">žemyn</translation>
 <translation id="8425213833346101688">Keisti</translation>
@@ -5263,6 +5274,7 @@
 <translation id="8690754533598178758">„Adobe Flash Player“ mikrofono išimtys skiriasi.</translation>
 <translation id="8691686986795184760">(Įgalinta pagal įmonės politiką)</translation>
 <translation id="869257642790614972">Iš naujo atidaryti vėliausiai uždarytą skirtuką</translation>
+<translation id="8695770993395462321">Savasis CUPS</translation>
 <translation id="8695825812785969222">Atidaryti &amp;vietą...</translation>
 <translation id="8698464937041809063">„Google“ piešinys</translation>
 <translation id="869884720829132584">Programų meniu</translation>
@@ -5605,6 +5617,7 @@
 <translation id="9189690067274055051">Kad pasiektumėte, atrakinkite telefoną ir arčiau padėkite „<ph name="DEVICE_TYPE" />“.</translation>
 <translation id="9190063653747922532">L2TP / „IPSec“ ir iš anksto bendrinamas raktas</translation>
 <translation id="9201305942933582053">„Chrome“ skirta „Google“ dabar!</translation>
+<translation id="9202646163273566462">Visų žymių rodinys bus numatytoji žymių tvarkytuvės paskirties vieta.</translation>
 <translation id="9203398526606335860">&amp;Profiliavimas įgalintas</translation>
 <translation id="9203478404496196495">Įjungti garsą skirtuke</translation>
 <translation id="9203962528777363226">Šio įrenginio administratorius neleido pridėti naujų naudotojų</translation>
@@ -5631,6 +5644,7 @@
 <translation id="939736085109172342">Naujas aplankas</translation>
 <translation id="940425055435005472">Šrifto dydis:</translation>
 <translation id="941543339607623937">Negaliojantis privatus raktas.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{nėra}=1{1 programa („$1“)}=2{2 programos („$1“, „$2“)}one{# programa („$1“, „$2“, „$3“)}few{# programos („$1“, „$2“, „$3“)}many{# programos („$1“, „$2“, „$3“)}other{# programų („$1“, „$2“, „$3“)}}</translation>
 <translation id="942532530371314860">„<ph name="APP_NAME" />“ bendrina „Chrome“ skirtuką ir garsą.</translation>
 <translation id="942954117721265519">Šiame kataloge nėra vaizdų.</translation>
 <translation id="945522503751344254">Siųsti atsiliepimą</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index bef20bb..e069935 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -1938,7 +1938,6 @@
 <translation id="3688507211863392146">Rakstīt failos un mapēs, kurus atverat lietojumprogrammā</translation>
 <translation id="3688526734140524629">Mainīt kanālu</translation>
 <translation id="3688578402379768763">Atjaunināts</translation>
-<translation id="3690976161240450479">Neizdevās pierakstīties. Lūdzu, sazinieties ar administratoru vai mēģiniet vēlreiz.</translation>
 <translation id="3693415264595406141">Parole:</translation>
 <translation id="3694027410380121301">Atlasīt iepriekšējo cilni</translation>
 <translation id="3694678678240097321">Ja paplašinājums, kas lapā izpilda skriptu, lūdza atļauju darboties visos vietrāžos URL, ir nepieciešama lietotāja piekrišana.</translation>
@@ -4685,7 +4684,6 @@
 <translation id="7859704718976024901">Pārlūkošanas vēsture</translation>
 <translation id="7861215335140947162">Lejupielādes</translation>
 <translation id="7864539943188674973">Atspējot Bluetooth</translation>
-<translation id="7868891395842935202">Iespējo eksperimentālo struktūru, lai pārvaldītu piekļuvi API eksperimentiem.</translation>
 <translation id="7870576007982733437">Izmantot sistēmas lejupielāžu pārvaldnieku, kad tas ir iespējams.</translation>
 <translation id="7870790288828963061">Netika atrasta neviena Kioska lietotne ar jaunāku versiju. Nav jāatjaunina neviena lietotne. Lūdzu, izņemiet USB atmiņas karti.</translation>
 <translation id="787150342916295244">Kredītkartes skenēšana</translation>
@@ -5016,7 +5014,6 @@
 <translation id="8309505303672555187">Atlasīt tīklu:</translation>
 <translation id="8312871300878166382">Ielīmēt mapē</translation>
 <translation id="8314013494437618358">Pavedienu kompozicionēšana</translation>
-<translation id="8314576811984836978">Eksperimentālā struktūra</translation>
 <translation id="8319414634934645341">Paplašināta atslēgas lietošana</translation>
 <translation id="8322814362483282060">Šīs lapas piekļuve jūsu mikrofonam ir bloķēta.</translation>
 <translation id="8326478304147373412">PKCS #7, sertificēšanas ķēde</translation>
@@ -5077,7 +5074,6 @@
 <translation id="8418240940464873056">Ķīniešu valodas režīms</translation>
 <translation id="8418445294933751433">Rādīt kā cilni</translation>
 <translation id="8420060421540670057">Rādīt Google dokumentu failus</translation>
-<translation id="8420728540268437431">Šī lapa tiek tulkota...</translation>
 <translation id="842274098655511832">WebGL melnraksta paplašinājumi</translation>
 <translation id="8424039430705546751">uz leju</translation>
 <translation id="8425213833346101688">Mainīt</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index d57ab61..6958f04 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608">ഇത്തരം സെഷനിൽ <ph name="EXTENSION_NAME" /> (വിപുലീകരണ ഐഡി "<ph name="EXTENSION_ID" />") അനുവദനീയമല്ല.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">അയ്യോ! ക്രമരഹിത RSA സ്വകാര്യ കീ ജനറേറ്റ് ചെയ്യുന്നതിന് പരാജയപ്പെട്ടു. </translation>
+<translation id="1421115928968836111">ഇത് പരിരക്ഷിതമായ ഉള്ളടക്കത്തിന്റെ Flash Player ലൈസൻസുകളുടെ അംഗീകാരം ഇല്ലാതാക്കും.</translation>
 <translation id="1425734930786274278">ഇനിപ്പറയുന്ന കുക്കികളെ തടഞ്ഞു (മൂന്നാം-കക്ഷി കുക്കികളെ വേര്‍തിരിവ് ഇല്ലാതെ തടഞ്ഞു):</translation>
 <translation id="1426410128494586442">അതെ</translation>
 <translation id="1427049173708736891">നിങ്ങളുടെ Android ഫോൺ അൺലോക്ക് ചെയ്‌ത് വിളിപ്പാടരികെയായിരിക്കുമ്പോൾ, <ph name="DEVICE_TYPE" /> അൺലോക്കുചെയ്‌ത് സൂക്ഷിക്കുക - നിങ്ങളുടെ പാസ്‌വേഡ് ടൈപ്പുചെയ്യേണ്ടതില്ല.</translation>
@@ -519,6 +520,7 @@
 <translation id="1707463636381878959">മറ്റ് ഉപയോക്താക്കളുമായി ഈ നെറ്റ്‌വര്‍ക്ക് പങ്കിടുക</translation>
 <translation id="1708199901407471282">പുതിയ ടാബ് പേജിൽ നിന്ന് നിർദ്ദേശിക്കപ്പെട്ട വെബ്‌പേജ് തുറക്കുമ്പോൾ, നിർദ്ദേശത്തിനായി ടാബ് ഇതിനകം തുറന്നിട്ടുണ്ടെങ്കിൽ, പുതിയ ടാബിൽ നിർദ്ദേശിക്കപ്പെട്ടവ ലോഡുചെയ്യുന്നതിനുപകരം അതിലേക്ക് മാറുക.</translation>
 <translation id="1708338024780164500">(നിഷ്‌ക്രിയം)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (ഐഡി: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">സിപ്പുചെയ്യൽ പരാജയപ്പെട്ടു, അപ്രതീക്ഷിത പിശക്: $1</translation>
 <translation id="1715941336038158809">ഉപയോക്തൃ നാമം അല്ലെങ്കില്‍ പാസ്‌വേഡ് അസാധുവാണ്.</translation>
 <translation id="1717733954209022288">Google പേയ്‌മെന്റ് കാർഡ് സംരക്ഷിക്കൽ ചെക്ക്‌ബോക്‌സ്</translation>
@@ -796,6 +798,7 @@
 <translation id="2168214441502403371">പേർഷ്യൻ കീബോർഡ്</translation>
 <translation id="2168725742002792683">ഫയല്‍‌ വിപുലീകരണങ്ങള്‍‌</translation>
 <translation id="2169062631698640254">ഏതുവിധേനയും സൈൻ ഇൻ ചെയ്യുക</translation>
+<translation id="2175042898143291048">എല്ലായ്‌പ്പോഴും ഇങ്ങനെ ചെയ്യുക</translation>
 <translation id="2175607476662778685">ക്വിക്ക് ലോഞ്ച് ബാര്‍</translation>
 <translation id="2176045495080708525">ഇനിപ്പറയുന്ന വിപുലീകരണങ്ങൾ ഇപ്പോൾ ഇൻസ്റ്റാൾ ചെയ്തതാണ്:</translation>
 <translation id="2177950615300672361">ആൾമാറാട്ട ടാബ്: <ph name="TAB_NAME" /></translation>
@@ -1936,7 +1939,6 @@
 <translation id="3688507211863392146">അപ്ലിക്കേഷനിൽ നിങ്ങൾ തുറക്കുന്ന ഫയലുകളിലും ഫോൾഡറുകളിലും റൈറ്റുചെയ്യുക.</translation>
 <translation id="3688526734140524629">ചാനൽ മാറ്റുക</translation>
 <translation id="3688578402379768763">അപ്‌ടുഡാറ്റാണ്</translation>
-<translation id="3690976161240450479">സൈൻ ഇൻ പരാജയപ്പെട്ടു. നിങ്ങളുടെ അഡ്‌മിനിസ്‌ട്രേറ്ററെ ബന്ധപ്പെടുക അല്ലെങ്കിൽ വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="3693415264595406141">പാസ്‌വേഡ്:</translation>
 <translation id="3694027410380121301">മുമ്പത്തെ ടാബ് തിരഞ്ഞെടുക്കുക</translation>
 <translation id="3694678678240097321">എല്ലാ url-കളിലും പ്രവർത്തിപ്പിക്കുന്നതിന് വിപുലികരണം അനുമതി അഭ്യർത്ഥിച്ചെങ്കിൽ, പേജിൽ ഒരു സ്‌ക്രിപ്‌റ്റ് പ്രവർത്തിപ്പിക്കാൻ വിപുലീകരണത്തിന് ഉപയോക്തൃ അനുമതി ആവശ്യമുണ്ട്.</translation>
@@ -2231,6 +2233,7 @@
 <translation id="4116663294526079822">ഈ സൈറ്റിൽ എല്ലായ്‌പ്പോഴും അനുവദിക്കുക</translation>
 <translation id="411666854932687641">സ്വകാര്യ മെമ്മറി</translation>
 <translation id="4118990158415604803">അഡ്‌മിനിസ്‌ട്രേറ്റർ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്ന മറ്റ് നെറ്റ്‌വർക്കുകളിലേക്ക് കണക്റ്റുചെയ്യുന്നു.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{കൂടാതെ 1 കൂടി}other{എന്നിവയും # എണ്ണവും കൂടി}}</translation>
 <translation id="4119828560634133962">പ്രിന്റ് പ്രിവ്യൂ രജിസ്‌ട്രേഷൻ പ്രൊമോകൾ</translation>
 <translation id="4120329147617730038">അഡ്‌മിനിസ്‌ട്രേറ്റർ <ph name="USER_EMAIL" /> എന്നതിലേക്ക് ഒന്നിലധികം സൈൻ ഇൻ അനുവദിക്കുന്നില്ല. തുടരുന്നതിന്, എല്ലാ ഉപയോക്താക്കളും സൈൻ ഔട്ട് ചെയ്യുക.</translation>
 <translation id="4120817667028078560">പാത്ത് ദൈർഘ്യമേറിയതാണ്</translation>
@@ -2369,9 +2372,11 @@
 <translation id="4345703751611431217">സോഫ്റ്റ്‌വെയർ അനുയോജ്യതയില്ലായ്‌മ: കൂടുതലറിയുക</translation>
 <translation id="4348766275249686434">പിശകുകൾ ശേഖരിക്കുക</translation>
 <translation id="4350019051035968019">മറ്റൊരു ഡൊമെയ്‌ൻ, ഉപകരണത്തെ നിയന്ത്രിക്കുന്നതിനായി അടയാളപ്പെടുത്തിയിരിക്കുന്നതിനാൽ, ഈ ഉപകരണത്തിന് നിങ്ങളുടെ അക്കൗണ്ട് ഉൾപ്പെട്ടിരിക്കുന്ന ഡൊമെയ്‌നിലേക്ക് എൻറോൾ ചെയ്യാനാവില്ല.</translation>
+<translation id="4354806558096370704">നേറ്റീവ് CUPS പ്രിന്റിംഗ് ബാക്ക്എൻഡിന്റെ ഉപയോഗം പ്രവർത്തനക്ഷമമാക്കുന്നു.</translation>
 <translation id="4358697938732213860">വിലാസം ചേര്‍‌ക്കുക</translation>
 <translation id="4359408040881008151">ആശ്രയിച്ചിരിക്കുന്ന വിപുലീകരണം (വിപുലീകരണങ്ങൾ) കാരണം ഇൻസ്‌റ്റാളുചെയ്തു.</translation>
 <translation id="4361190688154226069">കാഴ്ചകളിലെ ദീർഘചതുരം അടിസ്ഥാനമാക്കിയുള്ള ടാർഗറ്റുചെയ്യൽ</translation>
+<translation id="4364414793200746179">Android MediaStyle അറിയിപ്പ്</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> ഡൗൺലോഡുചെയ്‌തു</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" />, ഒരു വിൻഡോ പങ്കിടുന്നു.</translation>
 <translation id="4364830672918311045">അറിയിപ്പുകൾ പ്രദർശിപ്പിക്കുക</translation>
@@ -2776,6 +2781,7 @@
 <translation id="4988792151665380515">പൊതു കീ കയറ്റുമതി ചെയ്യുന്നതിന് പരാജയപ്പെട്ടു.</translation>
 <translation id="49896407730300355">എ&amp;തിർ ഘടികാരദിശയിൽ തിരിക്കുക</translation>
 <translation id="4989966318180235467">&amp;പശ്ചാത്തല പേജ് പരിശോധിക്കുക</translation>
+<translation id="4990343175649730969">Chrome ക്ലീനർ ഡൗൺലോഡുചെയ്യുക</translation>
 <translation id="4991420928586866460">മുകളിലെ-വരി കീകൾ ഫംഗ്‌ഷൻ കീകളായി ഉപയോഗിക്കുക</translation>
 <translation id="499165176004408815">ഉയർന്ന ദൃശ്യതീവ്രത മോഡ് ഉപയോഗിക്കുക</translation>
 <translation id="4992066212339426712">അൺമ്യൂട്ടുചെയ്യുക</translation>
@@ -3299,6 +3305,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: എഡിറ്റുചെയ്യാൻ തിരഞ്ഞെടുക്കുക</translation>
 <translation id="5741454054957165976">WebFonts ലോഡുചെയ്യുന്നതിനുള്ള ഉപയോക്തൃ ഏജന്റ് ഇടപെടലിന്റെ പുതിയ പതിപ്പ് പ്രവർത്തനക്ഷമമാക്കുക.</translation>
 <translation id="574392208103952083">ഇടത്തരം</translation>
+<translation id="5744368829843057748">വിവർത്തനം 2016Q2 UI</translation>
 <translation id="5745056705311424885">USB മെമ്മറി സ്റ്റിക്ക് കണ്ടെത്തി</translation>
 <translation id="5746169159649715125">PDF ആയി സംരക്ഷിക്കുക</translation>
 <translation id="5747611503456050045">ലംബമായി ഓവർസ്‌ക്രോൾ ചെയ്യുന്ന ഉള്ളടക്കത്തിലൂടെ വീണ്ടും പേജ് ലോഡുചെയ്യുന്നത് ട്രിഗർചെയ്‌തിരിക്കുന്നു.</translation>
@@ -3406,6 +3413,7 @@
 <translation id="5884474295213649357">ഈ ടാബ് ഒരു USB ഉപകരണവുമായി കണക്‌റ്റുചെയ്‌തിരിക്കുന്നു.</translation>
 <translation id="5885324376209859881">മീഡിയ ക്രമീകരണങ്ങൾ നിയന്ത്രിക്കുക...</translation>
 <translation id="5889282057229379085">ഇന്‍റര്‍‌മീഡിയറ്റ് CAകളുടെ പരമാവധി എണ്ണം: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">എന്താണ് സംഭവിക്കുന്നതെന്ന് ഞങ്ങളോട് പറയുക.</translation>
 <translation id="5892290200158927959">ഫ്രഞ്ച് BÉPO കീബോർഡ്</translation>
 <translation id="5892507820957994680">ബില്‍ട്ട്-ഇന്‍ സോഫ്റ്റ്‌വെയര്‍ തര്‍ജ്ജമ പട്ടിക അസാധുവാക്കുന്നു കൂടാതെ പിന്തുണക്കാത്ത സിസ്റ്റം കോണ്‍ഫിഗറേഷനുകളില്‍ GPU-ത്വരിതപ്പെടുത്തല്‍ പ്രാപ്തമാക്കുന്നു.</translation>
 <translation id="5895138241574237353">പുനരാരംഭിക്കുക</translation>
@@ -3549,6 +3557,7 @@
 <translation id="6122093587541546701">ഇമെയിൽ (ഓപ്ഷണൽ):</translation>
 <translation id="6122875415561139701">ഇനി പറയുന്നതിൽ എഴുതാൻ അനുമതിയില്ല: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="6124650939968185064">ഇനിപ്പറയുന്ന വിപുലീകരണങ്ങൾ ഈ വിപുലീകരണത്തെ ആശ്രയിച്ചിരിക്കുന്നു:</translation>
+<translation id="6127945163801765632">ബുക്ക്‌മാർക്ക് മാനേജറിൽ "എല്ലാ ബുക്ക്‌മാർക്കുകളും" എന്ന വിഭാഗം പ്രവർത്തനക്ഷമമാക്കുക.</translation>
 <translation id="6129938384427316298">നെറ്റ്‌സ്‌കേപ്പ് സര്‍‌ട്ടിഫിക്കറ്റ് അഭിപ്രായം</translation>
 <translation id="6129953537138746214">സ്പെയ്സ്</translation>
 <translation id="6132383530370527946">ചെറിയ പ്രിന്റ്</translation>
@@ -3575,6 +3584,7 @@
 <translation id="6164005077879661055">സൂപ്പർവൈസുചെയ്‌ത ഉപയോക്താവിനെ നീക്കംചെയ്‌താൽ, സൂപ്പർവൈസുചെയ്‌ത ഉപയോക്താവുമായി ബന്ധപ്പെടുത്തിയിട്ടുള്ള എല്ലാ ഫയലുകളും പ്രാദേശിക ഡാറ്റയും ശാശ്വതമായി ഇല്ലാതാക്കപ്പെടും. സൂപ്പർവൈസുചെയ്‌ത ഈ ഉപയോക്താവിനായി സന്ദർശിച്ച വെബ്‌സൈറ്റുകളും ക്രമീകരണങ്ങളും <ph name="MANAGEMENT_URL" />-ൽ മാനേജർക്ക് തുടർന്നും കാണാനായേക്കും.</translation>
 <translation id="6165508094623778733">കൂടുതൽ‍ മനസിലാക്കുക</translation>
 <translation id="6166185671393271715">Chrome-ലേക്ക് പാസ്‌വേഡുകൾ ഇമ്പോർട്ടുചെയ്യുക</translation>
+<translation id="6169666352732958425">ഡെസ്‌ക്‌ടോപ്പ് കാസ്‌റ്റുചെയ്യാനാകുന്നില്ല.</translation>
 <translation id="6171550060231646388">സിമുലേറ്റുചെയ്‌ത ഹാർഡ്‌വെയർ 'Ok Google' ഫീച്ചറുകൾ</translation>
 <translation id="6175314957787328458">Microsoft ഡൊമെയ്‌ന്‍‌ GUID</translation>
 <translation id="6178664161104547336">ഒരു സര്‍ട്ടിഫിക്കറ്റ് തിരഞ്ഞെടുക്കുക</translation>
@@ -3768,6 +3778,7 @@
 <translation id="6458308652667395253">JavaScript തടയുന്നത് മാനേജുചെയ്യുക...</translation>
 <translation id="6459488832681039634">കണ്ടെത്തുന്നതിനായി തിരഞ്ഞെടുപ്പ് ഉപയോഗിക്കുക</translation>
 <translation id="6460423884798879930">മുമ്പ് കണക്റ്റുചെയ്‌ത ക്ലയന്റിനായുള്ള പ്രാരംഭ SYN പാക്കറ്റിലെ, വേഗമേറിയ ഡാറ്റ അയയ്‌ക്കൽ ആരംഭിക്കാൻ അനുവദിക്കുന്ന അധിക പ്രാമാണീകരണ വിവരങ്ങൾ അയയ്‌ക്കുന്നതിനുള്ള ഓപ്‌ഷൻ പ്രവർത്തനക്ഷമമാക്കുക.</translation>
+<translation id="6460474910028274178">വിവർത്തന ബബിൾ UI-ക്കുള്ള മെച്ചപ്പെടുത്തിയ ട്രിഗറിംഗ് ലോജിക്കും പുത്തൻ രൂപവും</translation>
 <translation id="6460601847208524483">അടുത്തത് കണ്ടെത്തുക</translation>
 <translation id="6462080265650314920">അപ്ലിക്കേഷനുകൾ "<ph name="CONTENT_TYPE" />" എന്ന ഉള്ളടക്ക തരത്തിനൊപ്പം നൽകേണ്ടതുണ്ട്.</translation>
 <translation id="6462082050341971451">നിങ്ങൾ ഇപ്പോഴും അവിടെയുണ്ടോ?</translation>
@@ -3897,6 +3908,7 @@
 <translation id="6663792236418322902">ഈ ഫയല്‍ പിന്നീട് പുനസംഭരിക്കുന്നതിന് നിങ്ങള്‍ തിരഞ്ഞെടുത്ത പാസ്‌വേഡ് ആവശ്യമായിവരും. അത് സുരക്ഷിത സ്ഥലത്ത് ദയവായി രേഖപ്പെടുത്തുക.</translation>
 <translation id="6664237456442406323">നിർഭാഗ്യവശാൽ, കേടായ ഒരു ഹാർഡ്‌വെയർ ID ഉപയോഗിച്ചാണ് നിങ്ങളുടെ കമ്പ്യൂട്ടർ കോൺഫിഗർ ചെയ്‌തിരിക്കുന്നത്. ഇത് ഏറ്റവും പുതിയ സുരക്ഷാ പരിഹാരങ്ങൾ അപ്‌ഡേറ്റുചെയ്യുന്നതിൽ നിന്നും Chrome OS-നെ തടയുന്നു, ഒപ്പം നിങ്ങളുടെ കമ്പ്യൂട്ടർ <ph name="BEGIN_BOLD" />ക്ഷുദ്രകരമായ ആക്രമണങ്ങളാൽ കേടാകാനുമിടയുണ്ട്<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">നിങ്ങളുടെ Google അക്കൗണ്ട് ഉപയോഗിച്ച്</translation>
+<translation id="667517062706956822">Google ഈ പേജ്, <ph name="SOURCE_LANGUAGE" /> ഭാഷയിൽ നിന്ന് <ph name="TARGET_LANGUAGE" /> ഭാഷയിലേക്ക് വിവർത്തനം ചെയ്യണോ?</translation>
 <translation id="6675665718701918026">പോയിന്റുചെയ്യുന്ന ഉപകരണം കണക്റ്റുചെയ്‌തു</translation>
 <translation id="6677037229676347494">പ്രതീക്ഷിച്ച ID "<ph name="EXPECTED_ID" />" ആണ്, എന്നാൽ ലഭിച്ച ID "<ph name="NEW_ID" />" ആണ്.</translation>
 <translation id="6680028776254050810">ഉപയോക്താക്കളെ സ്വിച്ചുചെയ്യുക</translation>
@@ -3948,6 +3960,7 @@
 <translation id="6746392203843147041">ശബ്‌ദം കൂട്ടുക</translation>
 <translation id="6748140994595080445"><ph name="APP_NAME" /> എങ്ങനെ ഭാഷകൾ കൈകാര്യം ചെയ്യുന്നുവെന്നതും പ്രദർശിപ്പിക്കുന്നുവെന്നതും മാറ്റുക.</translation>
 <translation id="6748465660675848252">നിങ്ങൾക്ക് തുടരാനായേക്കുമെങ്കിലും സമന്വയിപ്പിച്ച വിവരവും ക്രമീകരണവും മാത്രമേ പുനഃസ്ഥാപിക്കുകയുള്ളൂ. എല്ലാ പ്രാദേശിക വിവരവും നഷ്‌ടപ്പെടും.</translation>
+<translation id="6751256176799620176">ഒരു ഫോൾഡർ തിരഞ്ഞെടുത്തു</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (ആള്‍മാറാട്ടം)</translation>
 <translation id="6759193508432371551">ഫാക്‌ടറി പുനഃസജ്ജമാക്കൽ</translation>
 <translation id="6760765581316020278">വിയറ്റ്‌നാമീസ് കീബോർഡ് (VNI)</translation>
@@ -4589,6 +4602,7 @@
 <translation id="7717014941119698257">ഡൗൺലോഡുചെയ്യുന്നു: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">പരിശീലന സമയം കഴിഞ്ഞു</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262">ഈ വ്യക്തിയെ സൂപ്പർവൈസുചെയ്യാൻ, <ph name="BEGIN_LINK" />Chrome-ലേക്ക് സൈൻ ഇൻ ചെയ്യുക<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">മുറിക്കുക</translation>
 <translation id="7730449930968088409">നിങ്ങളുടെ സ്‌ക്രീനിന്റെ ഉള്ളടക്കം ക്യാപ്‌ചർ ചെയ്യുക</translation>
 <translation id="7730494089396812859">ക്ലൗഡ് ബാക്കപ്പ് വിശദാംശങ്ങൾ കാണിക്കുക</translation>
@@ -4682,7 +4696,6 @@
 <translation id="7859704718976024901">ബ്രൗസിംഗ് ചരിത്രം</translation>
 <translation id="7861215335140947162">&amp;ഡൌണ്‍ലോഡുകള്‍</translation>
 <translation id="7864539943188674973">Bluetooth അപ്രാപ്‌തമാക്കുക</translation>
-<translation id="7868891395842935202">API പരീക്ഷണങ്ങളിലേക്കുള്ള ആക്‌സസ്സ് നിയന്ത്രിക്കാൻ പരീക്ഷണാത്മക ഫ്രെയിംവർക്ക് പ്രവർത്തനക്ഷമമാക്കുന്നു.</translation>
 <translation id="7870576007982733437">ബാധകമായിരിക്കുന്ന സമയത്ത്, സിസ്‌റ്റം ഡൗൺലോഡ് മാനേജർ ഉപയോഗിക്കുക.</translation>
 <translation id="7870790288828963061">ഏറ്റവും പുതിയ പതിപ്പിലുള്ള കിയോസ്‌ക് അപ്ലിക്കേഷനുകളൊന്നുമില്ല. USB സ്‌റ്റിക്ക് നീക്കംചെയ്യുക.</translation>
 <translation id="787150342916295244">ക്രെഡിറ്റ് കാർഡ് സ്‌കാൻ ചെയ്യുന്നു</translation>
@@ -5013,7 +5026,6 @@
 <translation id="8309505303672555187">ഒരു നെറ്റ്‌വര്‍‌ക്ക് തിരഞ്ഞെടുക്കുക:</translation>
 <translation id="8312871300878166382">ഫോൾഡറിൽ ഒട്ടിക്കുക</translation>
 <translation id="8314013494437618358">ത്രെഡുചെയ്‌ത വിന്യസിക്കൽ</translation>
-<translation id="8314576811984836978">പരീക്ഷണാത്മക ഫ്രെയിംവർക്ക്.</translation>
 <translation id="8319414634934645341">വിപുലീകരിച്ച കീ ഉപയോഗം</translation>
 <translation id="8322814362483282060">നിങ്ങളുടെ മൈക്രോഫോൺ ആക്‌സസ്സുചെയ്യുന്നതിൽ നിന്ന് ഈ പേജിനെ തടഞ്ഞിരിക്കുന്നു.</translation>
 <translation id="8326478304147373412">PKCS #7, സര്‍‌ട്ടിഫിക്കറ്റ് ചെയിന്‍‌</translation>
@@ -5074,7 +5086,6 @@
 <translation id="8418240940464873056">ഹഞ്ച മോഡ്</translation>
 <translation id="8418445294933751433">&amp;ടാബ് പോലെ കാണിക്കുക</translation>
 <translation id="8420060421540670057">Google ഡോക്‌സ് ഫയലുകൾ കാണിക്കുക</translation>
-<translation id="8420728540268437431">ഈ പേജ് വിവർത്തനം ചെയ്യുന്നു ...</translation>
 <translation id="842274098655511832">WebGL ഡ്രാഫ്റ്റ് വിപുലീകരണങ്ങൾ</translation>
 <translation id="8424039430705546751">താഴേക്കുള്ള കീ</translation>
 <translation id="8425213833346101688">മാറ്റുക</translation>
@@ -5261,6 +5272,7 @@
 <translation id="8690754533598178758">Adobe Flash Player മൈക്രോഫോൺ ഒഴിവാക്കലുകൾ വ്യത്യസ്‌തമാണ്.</translation>
 <translation id="8691686986795184760">(എന്‍റര്‍പ്രൈസ് നയം ഉപയോഗിച്ച് അപ്രാപ്തമാക്കി)</translation>
 <translation id="869257642790614972">അവസാനം-അടച്ച ടാബ് വീണ്ടും തുറക്കുക</translation>
+<translation id="8695770993395462321">നേറ്റീവ് CUPS</translation>
 <translation id="8695825812785969222">&amp;സ്ഥാനം തുറക്കുക...</translation>
 <translation id="8698464937041809063">Google ഡ്രോയിംഗ്</translation>
 <translation id="869884720829132584">അപ്ലിക്കേഷനുക‌ള്‍‌ മെനു</translation>
@@ -5602,6 +5614,7 @@
 <translation id="9189690067274055051">നൽകാൻ നിങ്ങളുടെ ഫോൺ അൺലോക്കുചെയ്‌ത് <ph name="DEVICE_TYPE" /> എന്നതിന് അടുത്തേക്ക് കൊണ്ടുവരിക.</translation>
 <translation id="9190063653747922532">L2TP/IPsec + മുമ്പ് പങ്കിട്ട കീ</translation>
 <translation id="9201305942933582053">Chrome-നായുള്ള 'Google ഇപ്പോൾ'!</translation>
+<translation id="9202646163273566462">'എല്ലാ ബുക്ക്‌മാർക്കുകളുടെയും കാഴ്‌ച' എന്നതിനെ, ബുക്ക്‌മാർക്ക് മാനേജറിന്റെ ഡിഫോൾട്ട് ലക്ഷ്യസ്ഥാനമായി പ്രവർത്തനക്ഷമമാക്കുന്നു.</translation>
 <translation id="9203398526606335860">&amp;പ്രൊഫൈലിംഗ് പ്രാപ്തമാക്കി</translation>
 <translation id="9203478404496196495">ടാബ് അൺമ്യൂട്ടുചെയ്യുക</translation>
 <translation id="9203962528777363226">പുതിയ ഉപയോക്താക്കളെ ചേരുന്നതിൽ നിന്ന് ഈ ഉപകരണത്തിന്റെ അഡ്‌മിനിസ്‌ട്രേറ്റർ അപ്രാപ്‌തമാക്കി</translation>
@@ -5628,6 +5641,7 @@
 <translation id="939736085109172342">പുതിയ ഫോള്‍ഡര്‍</translation>
 <translation id="940425055435005472">ഫോണ്ട് വലുപ്പം:</translation>
 <translation id="941543339607623937">സ്വകാര്യ കീ അസാധുവാണ്.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{ഒന്നുമില്ല}=1{ഒരു ആപ്പ് ($1)}=2{2 ആപ്‌സ് ($1, $2)}other{# ആപ്‌സ് ($1, $2, $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> ഒരു Chrome ടാബും ഓഡിയോയും പങ്കിടുന്നു.</translation>
 <translation id="942954117721265519">ഈ ഡയറക്‌ടറിയിൽ ചിത്രങ്ങളൊന്നുമില്ല.</translation>
 <translation id="945522503751344254">ഫീഡ്ബാക്ക് അയയ്ക്കുക</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index 4d59445..d615642 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> ("<ph name="EXTENSION_ID" />" विस्तार ID) या प्रकारच्या सत्रामध्ये अनुमत नाही.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">अरेरे! यादृच्छिक RSA खासगी की व्युत्पन्न करण्यात अयशस्वी.</translation>
+<translation id="1421115928968836111">हे संरक्षित सामग्रीसाठी फ्लॅश प्लेअर परवाने अनधिकृत करेल.</translation>
 <translation id="1425734930786274278">खालील कुकीज अवरोधित केलेल्या आहेत (तृतीय-पक्षाच्या कुकीज अपवादाशिवाय अवरोधित केलेल्या आहेत):</translation>
 <translation id="1426410128494586442">होय</translation>
 <translation id="1427049173708736891">आपला Android फोन अनलॉक आणि जवळपास असताना आपले <ph name="DEVICE_TYPE" /> अनलॉक केलेले ठेवा—आपला संकेतशब्द टाइप करण्‍याची आवश्‍यकता नाही.</translation>
@@ -520,6 +521,7 @@
 <translation id="1707463636381878959">अन्य वापरकर्त्यांसह हा नेटवर्क सामायिक करा</translation>
 <translation id="1708199901407471282">नवीन टॅब पृष्‍ठामधून सुचविलेले वेबपृष्ठ उघडताना, सूचनेसाठी टॅब आधीपासून उघडा असल्‍यास, नवीन टॅबमध्‍ये सूचना लोड करण्‍याऐवजी त्यावर स्विच करा.</translation>
 <translation id="1708338024780164500">(निष्क्रिय)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">झिप करणे अयशस्वी, अनपेक्षित त्रुटी: $1</translation>
 <translation id="1715941336038158809">अवैध वापरकर्ता नाव किंवा संकेतशब्द.</translation>
 <translation id="1717733954209022288">Google Payments कार्ड जतन करणारा चेकबॉक्स</translation>
@@ -796,6 +798,7 @@
 <translation id="2168214441502403371">पर्शियन कीबोर्ड</translation>
 <translation id="2168725742002792683">फाइल विस्तार</translation>
 <translation id="2169062631698640254">तरीही साइन इन करा</translation>
+<translation id="2175042898143291048">हे नेहमी करा</translation>
 <translation id="2175607476662778685">द्रुत लाँच बार</translation>
 <translation id="2176045495080708525">खालील विस्तार आता स्‍थापित करण्‍यात आले:</translation>
 <translation id="2177950615300672361">गुप्त टॅब: <ph name="TAB_NAME" /></translation>
@@ -1931,7 +1934,6 @@
 <translation id="3688507211863392146">आपण अनुप्रयोगामध्ये उघडता त्या फायलींमध्ये आणि फोल्डरमध्ये लिहा</translation>
 <translation id="3688526734140524629">चॅनेल बदला</translation>
 <translation id="3688578402379768763">अद्ययावत</translation>
-<translation id="3690976161240450479">साइन-इन अयशस्वी झाले. कृपया आपल्‍या प्रशासकास संपर्क साधा किंवा पुन्हा प्रयत्न करा.</translation>
 <translation id="3693415264595406141">संकेतशब्द:</translation>
 <translation id="3694027410380121301">मागील टॅब निवडा</translation>
 <translation id="3694678678240097321">सर्व url वर चालविण्यासाठी विस्ताराने परवानगीची विनंती केल्यास, पृष्ठावर स्क्रिप्ट चालविणार्‍या विस्तारासाठी वापरकर्ता संमती आवश्यक असते.</translation>
@@ -2226,6 +2228,7 @@
 <translation id="4116663294526079822">या साइटवर नेहमी अनुमती द्या</translation>
 <translation id="411666854932687641">खासगी मेमरी</translation>
 <translation id="4118990158415604803">आपल्या प्रशासकाने इतर नेटवर्कशी कनेक्ट करणे अक्षम केले आहे.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{आणि 1 अधिक}one{आणि # अधिक}other{आणि # अधिक}}</translation>
 <translation id="4119828560634133962">मुद्रण पूर्वावलोकन नोंदणी प्रोमो</translation>
 <translation id="4120329147617730038"><ph name="USER_EMAIL" /> साठी एकाधिक साइन इन ची अनुमती प्रशासकाने रद्द केली आहे.
 सुरु ठेवण्यासाठी सर्व वापरकर्त्यांनी साइन आउट करणे आवश्यक आहे.</translation>
@@ -2365,9 +2368,11 @@
 <translation id="4345703751611431217">सॉफ्टवेअर विसंगतता: अधिक जाणून घ्या</translation>
 <translation id="4348766275249686434">त्रुटी संकलित करा</translation>
 <translation id="4350019051035968019">एका भिन्न डोमेनद्वारे व्यवस्थापनासाठी डिव्हाइस चिन्हांकित केले असल्यामुळे आपले खाते ज्या मालकीचे आहे त्या डोमेवर या डिव्हाइसची नोंदणी केली जाऊ शकत नाही.</translation>
+<translation id="4354806558096370704">मूळ CUPS मुद्रण बॅकएंडचा वापर सक्षम करते.</translation>
 <translation id="4358697938732213860">एक पत्ता जोडा</translation>
 <translation id="4359408040881008151">अवलंबून असलेल्या विस्तारा(रां) मुळे स्थापित केले.</translation>
 <translation id="4361190688154226069">दृश्यांमधील आयात-आधारित लक्ष्य</translation>
+<translation id="4364414793200746179">Android MediaStyle सूचना</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> डाउनलोड केले</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> विंडो सामायिक करीत आहे.</translation>
 <translation id="4364830672918311045">सूचना प्रदर्शित करा</translation>
@@ -2770,6 +2775,7 @@
 <translation id="4988792151665380515">सार्वजनिक की निर्यात करण्यात अयशस्वी.</translation>
 <translation id="49896407730300355">घड्याळाच्या वि&amp;रूद्ध दिशेने फिरवा</translation>
 <translation id="4989966318180235467">&amp;पार्श्वभूमी पृष्ठाचे निरीक्षण करा</translation>
+<translation id="4990343175649730969">Chrome क्लीनअप साधन डाउनलोड करा</translation>
 <translation id="4991420928586866460">कार्य की म्हणून शीर्ष-पंक्ती की हाताळा</translation>
 <translation id="499165176004408815">उच्च तीव्रता मोड वापरा</translation>
 <translation id="4992066212339426712">सशब्द करा</translation>
@@ -3294,6 +3300,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: संपादित करण्यासाठी निवडा</translation>
 <translation id="5741454054957165976">WebFonts लोड करण्यासाठी वापरकर्ता-एजंट हस्तक्षेपची नवीन आवृत्ती सक्षम करा.</translation>
 <translation id="574392208103952083">मध्यम</translation>
+<translation id="5744368829843057748">2016Q2 UI भाषांतरित करा</translation>
 <translation id="5745056705311424885">USB मेमरी स्टिक आढळली</translation>
 <translation id="5746169159649715125">PDF म्हणून जतन करा</translation>
 <translation id="5747611503456050045">अनुलंबरित्या सामग्रीवर स्‍क्रोल करून पृष्‍ठ रीलोड करणे ट्रिगर केले.</translation>
@@ -3401,6 +3408,7 @@
 <translation id="5884474295213649357">हा टॅब USB डिव्हाइसशी कनेक्ट केला आहे.</translation>
 <translation id="5885324376209859881">माध्यम सेटिंग्ज व्यवस्थापित करा...</translation>
 <translation id="5889282057229379085">कमाल इंटरमिजिएट CA संख्या: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">काय होत आहे ते आम्हाला सांगा.</translation>
 <translation id="5892290200158927959">फ्रेंच बेपो कीबोर्ड</translation>
 <translation id="5892507820957994680">अंगभूत सॉफ्टवेअर प्रस्तुतीकरण सूची अधिलिखित करते आणि असमर्थित सिस्टम कॉन्फिगरेशनवर GPU-प्रवेग सक्षम करते.</translation>
 <translation id="5895138241574237353">रीस्टार्ट करा</translation>
@@ -3542,6 +3550,7 @@
 <translation id="6122093587541546701">ईमेल (पर्यायी):</translation>
 <translation id="6122875415561139701">लिहा ऑपरेशनला यावर परवानगी नाही: " <ph name="DEVICE_NAME" /> ".</translation>
 <translation id="6124650939968185064">या विस्तारावर अवलंबून असलेले खालील विस्तार:</translation>
+<translation id="6127945163801765632">बुकमार्क व्यवस्थापक मध्ये "सर्व बुकमार्क" विभाग सक्षम करा.</translation>
 <translation id="6129938384427316298">Netscape प्रमाणपत्र टिप्पणी</translation>
 <translation id="6129953537138746214">जागा</translation>
 <translation id="6132383530370527946">लहान प्रिंट</translation>
@@ -3568,6 +3577,7 @@
 <translation id="6164005077879661055">एकदा हा पर्यवेक्षी वापरकर्ता काढल्यानंतर पर्यवेक्षी वापरकर्त्याशी संबद्ध सर्व फायली आणि स्थानिक डेटा कायमचा हटविला जाईल. या पर्यवेक्षी वापरकर्त्यासाठी भेट दिलेल्या वेबसाइट आणि सेटिंग्ज तरीही <ph name="MANAGEMENT_URL" /> वर व्यवस्थापकाद्वारे दृश्यमान असू शकतात.</translation>
 <translation id="6165508094623778733">अधिक जाणून घ्या</translation>
 <translation id="6166185671393271715">Chrome मध्ये संकेतशब्द आयात करा</translation>
+<translation id="6169666352732958425">डेस्कटॉप कास्ट करण्यात अक्षम.</translation>
 <translation id="6171550060231646388">बनावटी हार्डवेअर 'Ok Google' वैशिष्ट्ये</translation>
 <translation id="6175314957787328458">Microsoft Domain GUID</translation>
 <translation id="6178664161104547336">एक प्रमाणपत्र निवडा</translation>
@@ -3762,6 +3772,7 @@
 <translation id="6458308652667395253">JavaScript अवरोधित करणे व्यवस्थापित करा...</translation>
 <translation id="6459488832681039634">शोधण्यासाठी निवड वापरा</translation>
 <translation id="6460423884798879930">जलद डेटा पाठवणे प्रारंभ करण्याची अनुमती देऊन, मागे कनेक्ट केलेल्या क्लायंटसाठी आरंभीच्या SYN पॅकेटमध्ये अतिरिक्त प्रमाणीकरण माहिती पाठविण्यासाठी पर्याय सक्षम करा.</translation>
+<translation id="6460474910028274178">Translate Bubble UI साठी सुधारित ट्रिगर करण्याचा तर्क आणि स्वरूप</translation>
 <translation id="6460601847208524483">पुढील शोधा</translation>
 <translation id="6462080265650314920">"<ph name="CONTENT_TYPE" />" सामग्री-प्रकारासह अनुप्रयोग दिले जाणे आवश्यक आहे.</translation>
 <translation id="6462082050341971451">आपण अद्याप तिथे आहात?</translation>
@@ -3891,6 +3902,7 @@
 <translation id="6663792236418322902">आपण निवडलेल्या संकेतशब्दाला या फाइलमध्ये नंतर पुनर्संचयित करणे आवश्यक आहे. कृपया एखाद्या सुरक्षित स्थानावर त्याचे रेकॉर्ड ठेवा.</translation>
 <translation id="6664237456442406323">दुर्दैवाने, आपला संगणक एका विकृत हार्डवेअर ID सह कॉन्फिगर केला आहे. हे नवीनतम सुरक्षितता निराकरणे अद्यतनित करण्यापासून Chrome OS ला प्रतिबंध करते आणि आपल्या संगणकावर <ph name="BEGIN_BOLD" />दुर्भावनापूर्ण आक्रमणांमुळे सहज परिणाम होऊ शकतो<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">आपल्या Google खात्यासह</translation>
+<translation id="667517062706956822">Google ने हे पृष्ठ <ph name="SOURCE_LANGUAGE" /> मधून <ph name="TARGET_LANGUAGE" /> मध्ये भाषांतरित करावे असे आपण इच्छिता?</translation>
 <translation id="6675665718701918026">निर्देशित करणारे डिव्हाइस कनेक्‍ट केले</translation>
 <translation id="6677037229676347494">अपेक्षित ID "<ph name="EXPECTED_ID" />",परंतु ID "<ph name="NEW_ID" />" होता.</translation>
 <translation id="6680028776254050810">वापरकर्ते स्‍वीच करा</translation>
@@ -3942,6 +3954,7 @@
 <translation id="6746392203843147041">आवाज वाढवा</translation>
 <translation id="6748140994595080445"><ph name="APP_NAME" /> भाषा कशा हाताळतो आणि प्रदर्शित करतो ते बदला.</translation>
 <translation id="6748465660675848252">आपण सुरु ठेवू शकता परंतु केवळ आपला संकालित डेटा आणि सेटिंग्ज पुनर्संचयित केले जातील. सर्व स्थानिक डेटा गमावला जाईल.</translation>
+<translation id="6751256176799620176">1 फोल्डर निवडले</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (गुप्त)</translation>
 <translation id="6759193508432371551">फॅक्टरी रीसेट</translation>
 <translation id="6760765581316020278">व्हिएतनामी कीबोर्ड (VNI)</translation>
@@ -4579,6 +4592,7 @@
 <translation id="7717014941119698257">डाउनलोड करत आहे: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">प्रशिक्षण कालबाह्य झाले</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262">या व्यक्तीचे पर्यवेक्षण करण्‍यासाठी, <ph name="BEGIN_LINK" />Chrome मध्ये साइन इन करा<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">कट करा</translation>
 <translation id="7730449930968088409">आपल्या स्क्रीनची सामग्री कॅप्चर करा</translation>
 <translation id="7730494089396812859">मेघ बॅकअप तपशील दर्शवा</translation>
@@ -4672,7 +4686,6 @@
 <translation id="7859704718976024901">ब्राउझिंग इतिहास</translation>
 <translation id="7861215335140947162">&amp;डाउनलोड</translation>
 <translation id="7864539943188674973">Bluetooth अक्षम करा</translation>
-<translation id="7868891395842935202">API प्रयोगांमधील प्रवेश नियंत्रित करण्‍यासाठी प्रायोगिक फ्रेमवर्क सक्षम करते.</translation>
 <translation id="7870576007982733437">लागू असेल तेव्हा सिस्टीम डाउनलोड व्यवस्थापकाचा वापर करा.</translation>
 <translation id="7870790288828963061">नवीन आवृत्तीसह कोणतेही कियोस्क अॅप्स आढळले नाहीत. काहीही अद्यतनित करू नका. कृपया USB स्टिक काढा.</translation>
 <translation id="787150342916295244">क्रेडिट कार्ड स्कॅनिंग</translation>
@@ -5001,7 +5014,6 @@
 <translation id="8309505303672555187">एखादे नेटवर्क निवडा:</translation>
 <translation id="8312871300878166382">फोल्डरमध्ये पेस्ट करा</translation>
 <translation id="8314013494437618358">थ्रेड केलेले संयुक्तीकरण</translation>
-<translation id="8314576811984836978">प्रायोगिक फ्रेमवर्क.</translation>
 <translation id="8319414634934645341">विस्तारित की वापर</translation>
 <translation id="8322814362483282060">या पृष्ठाला आपल्या मायक्रोफोनवर प्रवेश करण्यापासून अवरोधित केले गेले आहे.</translation>
 <translation id="8326478304147373412">PKCS #7, प्रमाणपत्र श्रृंखला</translation>
@@ -5062,7 +5074,6 @@
 <translation id="8418240940464873056">हन्जा मोड</translation>
 <translation id="8418445294933751433">टॅब म्हणून &amp;दर्शवा</translation>
 <translation id="8420060421540670057">Google दस्तऐवज फायली दर्शवा</translation>
-<translation id="8420728540268437431">हे पृष्ठ भाषांतरित केले जात आहे ...</translation>
 <translation id="842274098655511832">WebGL मसुदा विस्तार</translation>
 <translation id="8424039430705546751">खाली</translation>
 <translation id="8425213833346101688">बदल करा</translation>
@@ -5249,6 +5260,7 @@
 <translation id="8690754533598178758">Adobe Flash Player मायक्रोफोन अपवाद भिन्न आहेत.</translation>
 <translation id="8691686986795184760">(enterprise धोरणाद्वारे सक्षम) </translation>
 <translation id="869257642790614972">शेवटी-बंद केलेला टॅब पुन्हा उघडा</translation>
+<translation id="8695770993395462321">मुळ CUPS</translation>
 <translation id="8695825812785969222">&amp;स्थान उघडा...</translation>
 <translation id="8698464937041809063">Google रेखांकन</translation>
 <translation id="869884720829132584">अनुप्रयोग मेनू</translation>
@@ -5591,6 +5603,7 @@
 <translation id="9189690067274055051">प्रविष्ट करण्यासाठी आपला फोन अनलॉक करा आणि तो आपल्या <ph name="DEVICE_TYPE" /> च्या अधिक जवळ आणा.</translation>
 <translation id="9190063653747922532">L2TP/IPSec + पूर्व-सामायिक की</translation>
 <translation id="9201305942933582053">Chrome साठी Google Now!</translation>
+<translation id="9202646163273566462">बुकमार्क व्यवस्थापकाचे डीफॉल्ट गंतव्यस्थान म्हणून सर्व बुकमार्क दृश्य सक्षम करेल.</translation>
 <translation id="9203398526606335860">&amp;प्रोफाइलिंग सक्षम</translation>
 <translation id="9203478404496196495">टॅब सशब्द करा</translation>
 <translation id="9203962528777363226">या डिव्हाइसच्या प्रशासकाने नवीन वापरकर्त्यांना जोडले जाण्यापासून अक्षम केले आहे</translation>
@@ -5617,6 +5630,7 @@
 <translation id="939736085109172342">नवीन फोल्‍डर</translation>
 <translation id="940425055435005472">फॉन्ट आकार:</translation>
 <translation id="941543339607623937">अवैध खासगी की.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{काहीही नाही}=1{1 अ‍ॅप ($1)}=2{2 अ‍ॅप्स ($1, $2)}one{# अ‍ॅप्स ($1, $2, $3)}other{# अ‍ॅप्स ($1, $2, $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> Chrome टॅब आणि ऑडिओ सामायिक करीत आहे.</translation>
 <translation id="942954117721265519">या निर्देशिकेमध्ये कोणत्याही प्रतिमा नाहीत.</translation>
 <translation id="945522503751344254">अभिप्राय पाठवा</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index 304847f..f783d27 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (ID sambungan "<ph name="EXTENSION_ID" />") tidak dibenarkan dalam jenis sesi ini.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Yikes! Gagal untuk menjanakan kunci persendirian RSA rawak.</translation>
+<translation id="1421115928968836111">Pilihan ini akan membatalkan kebenaran lesen Pemain Flash untuk kandungan yang dilindungi.</translation>
 <translation id="1425734930786274278">Kuki berikut disekat (kuki pihak ketiga disekat tanpa pengecualian):</translation>
 <translation id="1426410128494586442">Ya</translation>
 <translation id="1427049173708736891">Biarkan <ph name="DEVICE_TYPE" /> tidak dikunci apabila telefon Android anda tidak dikunci dan berada berdekatan—tidak perlu menaip kata laluan anda.</translation>
@@ -521,6 +522,7 @@
 <translation id="1707463636381878959">Kongsi rangkaian ini dengan pengguna lain</translation>
 <translation id="1708199901407471282">Ketika membuka halaman web yang dicadangkan daripada Halaman Tab Baharu, jika tab sudah dibuka untuk cadangan tersebut, tukar kepada tab itu dan bukannya memuatkan cadangan tersebut dalam tab yang baharu.</translation>
 <translation id="1708338024780164500">(Tidak Aktif)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Gagal mengezip, ralat tidak dijangka: $1</translation>
 <translation id="1715941336038158809">Nama pengguna atau kata laluan tidak sah.</translation>
 <translation id="1717733954209022288">Kotak pilihan penyimpanan kad Google Payments</translation>
@@ -797,6 +799,7 @@
 <translation id="2168214441502403371">Papan kekunci bahasa Parsi</translation>
 <translation id="2168725742002792683">Sambungan fail</translation>
 <translation id="2169062631698640254">Log masuk juga</translation>
+<translation id="2175042898143291048">Sentiasa lakukan ini</translation>
 <translation id="2175607476662778685">Bar lancar cepat</translation>
 <translation id="2176045495080708525">Sambungan berikut kini terpasang:</translation>
 <translation id="2177950615300672361">Tab Inkognito: <ph name="TAB_NAME" /></translation>
@@ -1937,7 +1940,6 @@
 <translation id="3688507211863392146">Tulis pada fail dan folder yang anda buka dalam aplikasi</translation>
 <translation id="3688526734140524629">Tukar saluran</translation>
 <translation id="3688578402379768763">Terkini</translation>
-<translation id="3690976161240450479">Log masuk gagal. Sila hubungi pentadbir anda atau cuba lagi.</translation>
 <translation id="3693415264595406141">Kata laluan:</translation>
 <translation id="3694027410380121301">Pilih Tab Sebelumnya</translation>
 <translation id="3694678678240097321">Memerlukan persetujuan pengguna untuk satu pelanjutan menjalankan skrip pada laman itu, jika pelanjutan yang meminta kebenaran untuk berjalan di semua url.</translation>
@@ -2233,6 +2235,7 @@
 <translation id="4116663294526079822">Sentiasa benarkan di tapak ini</translation>
 <translation id="411666854932687641">Memori Persendirian</translation>
 <translation id="4118990158415604803">Penyambungan ke rangkaian lain dilumpuhkan oleh pentadbir anda.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{dan 1 lagi}other{dan # lagi}}</translation>
 <translation id="4119828560634133962">Promosi Pendaftaran Pratonton Cetakan</translation>
 <translation id="4120329147617730038">Pentadbir telah melarang berbilang log masuk untuk <ph name="USER_EMAIL" />.
 Semua pengguna mesti melog keluar untuk meneruskan.</translation>
@@ -2372,9 +2375,11 @@
 <translation id="4345703751611431217">Ketidakserasian perisian: Ketahui lebih lanjut</translation>
 <translation id="4348766275249686434">Kumpul ralat</translation>
 <translation id="4350019051035968019">Peranti ini tidak boleh didaftarkan pada domain bagi akaun anda kerana peranti telah ditandai untuk pengurusan oleh domain lain.</translation>
+<translation id="4354806558096370704">Mendayakan penggunaan bahagian belakang cetakan CUPS natif.</translation>
 <translation id="4358697938732213860">Tambah alamat</translation>
 <translation id="4359408040881008151">Dipasang kerana sambungan yang bergantung.</translation>
 <translation id="4361190688154226069">Sasaran berasaskan segi empat tepat dalam paparan</translation>
+<translation id="4364414793200746179">Pemberitahuan Android MediaStyle</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> dimuat turun</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> berkongsi tetingkap.</translation>
 <translation id="4364830672918311045">Paparkan pemberitahuan</translation>
@@ -2778,6 +2783,7 @@
 <translation id="4988792151665380515">Gagal intuk mengeksport kunci awam.</translation>
 <translation id="49896407730300355">Putar m&amp;elawan arah jam</translation>
 <translation id="4989966318180235467">Halaman periksa &amp;latar belakang</translation>
+<translation id="4990343175649730969">Muat Turun Pembersih Chrome</translation>
 <translation id="4991420928586866460">Kendalikan kekunci baris atas sebagai kekunci fungsi</translation>
 <translation id="499165176004408815">Gunakan mod kontras tinggi</translation>
 <translation id="4992066212339426712">Nyahredam</translation>
@@ -3301,6 +3307,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: pilih untuk mengedit</translation>
 <translation id="5741454054957165976">Dayakan versi Baharu Campur Tangan Ejen Pengguna untuk pemuatan WebFonts.</translation>
 <translation id="574392208103952083">Sederhana</translation>
+<translation id="5744368829843057748">Terjemahkan 2016Q2 UI</translation>
 <translation id="5745056705311424885">Batang memori USB dikesan</translation>
 <translation id="5746169159649715125">Simpan sebagai PDF</translation>
 <translation id="5747611503456050045">Pemuatan semula halaman dicetuskan oleh penatalan kandungan menegak yang berlebihan.</translation>
@@ -3408,6 +3415,7 @@
 <translation id="5884474295213649357">Tab ini disambungkan ke peranti USB.</translation>
 <translation id="5885324376209859881">Uruskan tetapan media...</translation>
 <translation id="5889282057229379085">Bilangan maksimum CA pengantara: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Beritahu kami apa yang berlaku.</translation>
 <translation id="5892290200158927959">Papan kekunci BEPO Perancis</translation>
 <translation id="5892507820957994680">Membatalkan senarai paparan perisian terbina dalam dan mendayakan pecutan GPU pada konfigurasi sistem yang tidak disokong.</translation>
 <translation id="5895138241574237353">Mulakan Semula</translation>
@@ -3549,6 +3557,7 @@
 <translation id="6122093587541546701">E-mel (pilihan):</translation>
 <translation id="6122875415561139701">Pengendalian tulis tidak dibenarkan pada: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="6124650939968185064">Sambungan berikut bergantung kepada sambungan ini:</translation>
+<translation id="6127945163801765632">Dayakan bahagian "semua penanda halaman" dalam pengurus penanda halaman.</translation>
 <translation id="6129938384427316298">Komen Sijil Netscape</translation>
 <translation id="6129953537138746214">Ruang</translation>
 <translation id="6132383530370527946">Cetak kecil</translation>
@@ -3575,6 +3584,7 @@
 <translation id="6164005077879661055">Semua fail dan data setempat yang dikaitkan dengan pengguna diselia akan dipadamkan secara kekal apabila pengguna diselia ini dialih keluar. Tapak web yang dilawati dan tetapan untuk pengguna diselia ini masih boleh dilihat oleh pengurus di <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Ketahui lebih lanjut</translation>
 <translation id="6166185671393271715">Import Kata Laluan Ke Chrome</translation>
+<translation id="6169666352732958425">Tidak dapat menghantar desktop.</translation>
 <translation id="6171550060231646388">Ciri "Ok Google" perkakasan tersimulasi</translation>
 <translation id="6175314957787328458">Microsoft Domain GUID</translation>
 <translation id="6178664161104547336">Pilih sijil</translation>
@@ -3768,6 +3778,7 @@
 <translation id="6458308652667395253">Uruskan sekatan JavaScript...</translation>
 <translation id="6459488832681039634">Use Selection for Find</translation>
 <translation id="6460423884798879930">Dayakan pilihan ini untuk menghantar maklumat pengesahan tambahan dalam paket SYN permulaan untuk pelanggan yang pernah disambungkan sebelum ini. Ini membolehkan penghantaran data dimulakan dengan lebih pantas.</translation>
+<translation id="6460474910028274178">Logik cetusan dipertingkatkan dan cari UI Gelembung Terjemah</translation>
 <translation id="6460601847208524483">Cari Seterusnya</translation>
 <translation id="6462080265650314920">Apl mesti disampaikan dengan jenis kandungan "<ph name="CONTENT_TYPE" />".</translation>
 <translation id="6462082050341971451">Anda masih ada?</translation>
@@ -3897,6 +3908,7 @@
 <translation id="6663792236418322902">Kata laluan yang anda pilih akan diperlukan untuk memulihkan fail ini kemudian.  Sila catatnya dalam lokasi selamat.</translation>
 <translation id="6664237456442406323">Malangnya, komputer anda dikonfigurasi dengan ID perkakasan tidak sempurna. Hal ini menghalang OS Chrome daripada mengemas kini kepada pembetulan keselamatan terbaharu dan komputer anda <ph name="BEGIN_BOLD" />mungkin terdedah kepada serangan berniat jahat<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">dengan Akaun Google anda</translation>
+<translation id="667517062706956822">Adakah anda mahu Google untuk menterjemahkan halaman ini daripada <ph name="SOURCE_LANGUAGE" /> kepada <ph name="TARGET_LANGUAGE" />?</translation>
 <translation id="6675665718701918026">Peranti penuding disambung</translation>
 <translation id="6677037229676347494">ID dijangkakan "<ph name="EXPECTED_ID" />", tetapi ID sebenar ialah "<ph name="NEW_ID" />".</translation>
 <translation id="6680028776254050810">Tukar Pengguna</translation>
@@ -3948,6 +3960,7 @@
 <translation id="6746392203843147041">tambahkan kelantangan</translation>
 <translation id="6748140994595080445">Tukar cara <ph name="APP_NAME" /> mengendalikan dan memaparkan bahasa.</translation>
 <translation id="6748465660675848252">Anda boleh meneruskan, tetapi hanya data disegerakkan dan tetapan anda yang akan dipulihkan. Semua data tempatan akan hilang.</translation>
+<translation id="6751256176799620176">1 folder dipilih</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Inkognito)</translation>
 <translation id="6759193508432371551">Tetapan semula kilang</translation>
 <translation id="6760765581316020278">Papan kekunci bahasa Vietnam (VNI)</translation>
@@ -4586,6 +4599,7 @@
 <translation id="7717014941119698257">Memuat turun: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">Latihan tamat masa</translation>
 <translation id="771953673318695590">S&amp;J</translation>
+<translation id="7720375555307821262">Untuk menyelia orang ini, <ph name="BEGIN_LINK" />log masuk ke Chrome<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">Potong</translation>
 <translation id="7730449930968088409">Abadikan kandungan skrin anda</translation>
 <translation id="7730494089396812859">Tunjukkan butiran sandaran Awan</translation>
@@ -4679,7 +4693,6 @@
 <translation id="7859704718976024901">Sejarah Penyemakan Imbas</translation>
 <translation id="7861215335140947162">&amp;Muat turun</translation>
 <translation id="7864539943188674973">Lumpuhkan Bluetooth</translation>
-<translation id="7868891395842935202">Mendayakan Rangka Kerja Percubaan untuk mengawal akses kepada eksperimen API.</translation>
 <translation id="7870576007982733437">Gunakan pengurus muat turun sistem jika bersesuaian.</translation>
 <translation id="7870790288828963061">Tiada apl Kiosk dengan versi lebih baharu dijumpai. Tiada apa-apa untuk dikemas kini. Sila alih keluar batang USB.</translation>
 <translation id="787150342916295244">Pengimbasan kad kredit</translation>
@@ -5009,7 +5022,6 @@
 <translation id="8309505303672555187">Pilih rangkaian:</translation>
 <translation id="8312871300878166382">Tampal ke folder</translation>
 <translation id="8314013494437618358">Pengadunan bebenang</translation>
-<translation id="8314576811984836978">Rangka Kerja Percubaan.</translation>
 <translation id="8319414634934645341">Penggunaan Penting Dilanjutkan</translation>
 <translation id="8322814362483282060">Halaman ini telah disekat daripada mengakses mikrofon anda.</translation>
 <translation id="8326478304147373412">PKCS #7, rantaian sijil</translation>
@@ -5071,7 +5083,6 @@
 <translation id="8418240940464873056">Mod Hanja</translation>
 <translation id="8418445294933751433">&amp;Paparkan sebagai tab</translation>
 <translation id="8420060421540670057">Paparkan fail Dokumen Google</translation>
-<translation id="8420728540268437431">Halaman ini sedang diterjemahkan ...</translation>
 <translation id="842274098655511832">Sambungan Draf WebGL</translation>
 <translation id="8424039430705546751">ke bawah</translation>
 <translation id="8425213833346101688">Tukar</translation>
@@ -5258,6 +5269,7 @@
 <translation id="8690754533598178758">Pengecualian mikrofon Adobe Flash Player adalah berbeza.</translation>
 <translation id="8691686986795184760">(Didayakan oleh dasar perusahaan)</translation>
 <translation id="869257642790614972">Buka semula tab yang terakhir ditutup</translation>
+<translation id="8695770993395462321">CUPS Natif</translation>
 <translation id="8695825812785969222">Buka &amp;Lokasi...</translation>
 <translation id="8698464937041809063">Lukisan Google</translation>
 <translation id="869884720829132584">Menu aplikasi</translation>
@@ -5599,6 +5611,7 @@
 <translation id="9189690067274055051">Buka kunci telefon anda dan rapatkannya ke <ph name="DEVICE_TYPE" /> anda untuk masuk.</translation>
 <translation id="9190063653747922532">L2TP/IPsec + kekunci praperkongsian</translation>
 <translation id="9201305942933582053">Google Now untuk Chrome!</translation>
+<translation id="9202646163273566462">Mendayakan paparan semua penanda halaman sebagai destinasi lalai kepada pengurus penanda halaman.</translation>
 <translation id="9203398526606335860">&amp;Dayakan pemprofilan</translation>
 <translation id="9203478404496196495">Nyahredam Tab</translation>
 <translation id="9203962528777363226">Pentadbir peranti ini telah melumpuhkan pengguna baharu daripada ditambah</translation>
@@ -5625,6 +5638,7 @@
 <translation id="939736085109172342">Folder baharu</translation>
 <translation id="940425055435005472">Saiz fon:</translation>
 <translation id="941543339607623937">Kunci persendirian tidak sah.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{tiada}=1{1 apl ($1)}=2{2 apl ($1, $2)}other{# apl ($1, $2, $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> berkongsi tab dan audio Chrome.</translation>
 <translation id="942954117721265519">Tiada imej dalam direktori ini.</translation>
 <translation id="945522503751344254">Hantar maklum balas</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index e76143b..e3030e0 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (extensie-ID '<ph name="EXTENSION_ID" />') is niet toegestaan in dit type sessie.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">O nee! Kan geen willekeurige persoonlijke RSA-sleutel genereren.</translation>
+<translation id="1421115928968836111">Hiermee wordt de machtiging voor Flash Player-licenties voor beveiligde content ingetrokken.</translation>
 <translation id="1425734930786274278">De volgende cookies zijn geblokkeerd (cookies van derden worden zonder uitzondering geblokkeerd):</translation>
 <translation id="1426410128494586442">Ja</translation>
 <translation id="1427049173708736891">Houd je <ph name="DEVICE_TYPE" /> ontgrendeld wanneer je Android-telefoon is ontgrendeld en zich in de buurt bevindt, zonder dat je je wachtwoord hoeft te typen.</translation>
@@ -521,6 +522,7 @@
 <translation id="1707463636381878959">Dit netwerk delen met andere gebruikers</translation>
 <translation id="1708199901407471282">Wanneer je een voorgestelde webpagina van de pagina 'Nieuw tabblad' opent en er al een tabblad is geopend voor de suggestie, wordt overgeschakeld naar dat tabblad in plaats van de suggestie op een nieuw tabblad te laden.</translation>
 <translation id="1708338024780164500">(Inactief)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Inpakken mislukt, onverwachte fout: $1</translation>
 <translation id="1715941336038158809">De gebruikersnaam of het wachtwoord is ongeldig.</translation>
 <translation id="1717733954209022288">Selectievakje voor het opslaan van Google Payments-kaarten</translation>
@@ -798,6 +800,7 @@
 <translation id="2168214441502403371">Perzisch toetsenbord</translation>
 <translation id="2168725742002792683">Bestandsextensies</translation>
 <translation id="2169062631698640254">Toch inloggen</translation>
+<translation id="2175042898143291048">Dit altijd doen</translation>
 <translation id="2175607476662778685">Balk Snelstarten</translation>
 <translation id="2176045495080708525">De volgende extensies zijn nu geïnstalleerd:</translation>
 <translation id="2177950615300672361">Incognitotabblad: <ph name="TAB_NAME" /></translation>
@@ -1937,7 +1940,6 @@
 <translation id="3688507211863392146">Schrijven naar bestanden en mappen die je opent in de app</translation>
 <translation id="3688526734140524629">Kanaal wijzigen</translation>
 <translation id="3688578402379768763">Bijgewerkt</translation>
-<translation id="3690976161240450479">Inloggen mislukt. Neem contact op met je beheerder of probeer het opnieuw.</translation>
 <translation id="3693415264595406141">Wachtwoord:</translation>
 <translation id="3694027410380121301">Selecteer vorig tabblad</translation>
 <translation id="3694678678240097321">Vereisen dat een gebruiker een app toestemming geeft om een script op de pagina uit te voeren, als de extensie toestemming heeft gevraagd voor uitvoering op alle URL's.</translation>
@@ -2233,6 +2235,7 @@
 <translation id="4116663294526079822">Altijd toestaan op deze site</translation>
 <translation id="411666854932687641">Privégeheugen</translation>
 <translation id="4118990158415604803">Verbinding met andere netwerken is uitgeschakeld door je beheerder.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{en 1 andere}other{en # andere}}</translation>
 <translation id="4119828560634133962">Promoties voor registratie via afdrukvoorbeeld</translation>
 <translation id="4120329147617730038">Een beheerder heeft <ph name="USER_EMAIL" /> geen toestemming gegeven voor toegang tot meerdere accounts.
 Alle gebruikers moet uitloggen om door te gaan.</translation>
@@ -2372,9 +2375,11 @@
 <translation id="4345703751611431217">Incompatibiliteit van software: meer informatie</translation>
 <translation id="4348766275249686434">Fouten verzamelen</translation>
 <translation id="4350019051035968019">Dit apparaat kan niet worden ingeschreven bij het domein waarbij je account hoort, omdat het apparaat is aangewezen voor beheer door een ander domein.</translation>
+<translation id="4354806558096370704">Hiermee wordt het gebruik van de systeemeigen back-end voor afdrukken via CUPS ingeschakeld.</translation>
 <translation id="4358697938732213860">Een adres toevoegen</translation>
 <translation id="4359408040881008151">Geïnstalleerd vanwege afhankelijke extensie(s).</translation>
 <translation id="4361190688154226069">Targeting op basis van rechthoeken in weergaven</translation>
+<translation id="4364414793200746179">Android MediaStyle-melding</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> gedownload</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> deelt een venster.</translation>
 <translation id="4364830672918311045">Meldingen weergeven</translation>
@@ -2777,6 +2782,7 @@
 <translation id="4988792151665380515">Exporteren van openbare sleutel is mislukt.</translation>
 <translation id="49896407730300355">Linksom &amp;draaien</translation>
 <translation id="4989966318180235467">&amp;Achtergrondpagina controleren</translation>
+<translation id="4990343175649730969">Chrome Cleanup Tool downloaden</translation>
 <translation id="4991420928586866460">Toetsen op de bovenste rij behandelen als functietoetsen</translation>
 <translation id="499165176004408815">Modus voor hoog contrast gebruiken</translation>
 <translation id="4992066212339426712">Dempen opheffen</translation>
@@ -3299,6 +3305,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: selecteer om te bewerken</translation>
 <translation id="5741454054957165976">Nieuwe versie van interventie van user-agent voor het laden van weblettertypen inschakelen.</translation>
 <translation id="574392208103952083">Gemiddeld</translation>
+<translation id="5744368829843057748">Translate 2016Q2 UI</translation>
 <translation id="5745056705311424885">USB-stick gevonden</translation>
 <translation id="5746169159649715125">Opslaan als pdf</translation>
 <translation id="5747611503456050045">Opnieuw laden van pagina wordt geactiveerd door het verticaal overscrollen van content.</translation>
@@ -3406,6 +3413,7 @@
 <translation id="5884474295213649357">Dit tabblad is gekoppeld aan een USB-apparaat.</translation>
 <translation id="5885324376209859881">Media-instellingen beheren...</translation>
 <translation id="5889282057229379085">Maximum aantal tussenliggende certificeringsinstanties: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Vertel ons wat er aan de hand is.</translation>
 <translation id="5892290200158927959">Frans BÉPO-toetsenbord</translation>
 <translation id="5892507820957994680">Hiermee wordt de ingebouwde lijst voor softwareverwerking genegeerd en wordt GPU-versnelling ingeschakeld voor niet-ondersteunde systeemconfiguraties.</translation>
 <translation id="5895138241574237353">Opnieuw starten</translation>
@@ -3549,6 +3557,7 @@
 <translation id="6122093587541546701">E-mailadres (optioneel):</translation>
 <translation id="6122875415561139701">Schrijfbewerking is niet toegestaan op: <ph name="DEVICE_NAME" />.</translation>
 <translation id="6124650939968185064">De volgende extensies zijn afhankelijk van deze extensie:</translation>
+<translation id="6127945163801765632">Het gedeelte 'Alle bladwijzers' in Bladwijzerbeheer inschakelen.</translation>
 <translation id="6129938384427316298">Opmerking van Netscape-certificaat</translation>
 <translation id="6129953537138746214">Spatie</translation>
 <translation id="6132383530370527946">De kleine lettertjes</translation>
@@ -3575,6 +3584,7 @@
 <translation id="6164005077879661055">Alle bestanden en lokale gegevens gekoppeld aan de gebruiker met beperkte rechten worden permanent verwijderd zodra de gebruiker met beperkte rechten is verwijderd. Bezochte websites en instellingen voor deze gebruiker met beperkte rechten kunnen nog steeds zichtbaar zijn voor de beheerder op <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Meer informatie</translation>
 <translation id="6166185671393271715">Wachtwoorden importeren in Chrome</translation>
+<translation id="6169666352732958425">Kan desktop niet casten.</translation>
 <translation id="6171550060231646388">Gesimuleerde hardware voor 'Ok Google'-functies</translation>
 <translation id="6175314957787328458">Microsoft-domein-GUID</translation>
 <translation id="6178664161104547336">Een certificaat selecteren</translation>
@@ -3768,6 +3778,7 @@
 <translation id="6458308652667395253">Blokkeren van JavaScript beheren...</translation>
 <translation id="6459488832681039634">Gebruik selectie voor zoekactie</translation>
 <translation id="6460423884798879930">Hiermee schakel je de optie in om in het eerste SYN-pakket extra verificatiegegevens te verzenden voor een eerder verbonden client, waardoor het verzenden van gegevens sneller kan starten.</translation>
+<translation id="6460474910028274178">Verbeterde triggerlogica en uiterlijk voor Translate Bubble UI</translation>
 <translation id="6460601847208524483">Zoek volgende</translation>
 <translation id="6462080265650314920">Apps moeten worden weergegeven met inhoudstype '<ph name="CONTENT_TYPE" />'.</translation>
 <translation id="6462082050341971451">Ben je er nog?</translation>
@@ -3897,6 +3908,7 @@
 <translation id="6663792236418322902">Het wachtwoord dat je kiest, is later vereist voor het herstellen van dit bestand. Sla het wachtwoord op een veilige locatie op.</translation>
 <translation id="6664237456442406323">Je computer is geconfigureerd met een hardware-ID met een onjuiste notatie. Dit zorgt ervoor dat Chrome OS niet kan worden bijgewerkt met de nieuwste beveiligingsoplossingen, waardoor je computer <ph name="BEGIN_BOLD" />kwetsbaar kan zijn voor schadelijke aanvallen<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">met je Google-account</translation>
+<translation id="667517062706956822">Wil je dat Google deze pagina vertaalt van het <ph name="SOURCE_LANGUAGE" /> naar het <ph name="TARGET_LANGUAGE" />?</translation>
 <translation id="6675665718701918026">Aanwijsapparaat verbonden</translation>
 <translation id="6677037229676347494">Verwachte ID '<ph name="EXPECTED_ID" />', maar ID is '<ph name="NEW_ID" />'.</translation>
 <translation id="6680028776254050810">Gebruiker wijzigen</translation>
@@ -3948,6 +3960,7 @@
 <translation id="6746392203843147041">volume omhoog</translation>
 <translation id="6748140994595080445">Wijzigen hoe <ph name="APP_NAME" /> talen verwerkt en weergeeft.</translation>
 <translation id="6748465660675848252">Je kunt doorgaan, maar alleen je gesynchroniseerde gegevens en instellingen worden hersteld. Alle lokale gegevens gaan verloren.</translation>
+<translation id="6751256176799620176">1 map geselecteerd</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Incognito)</translation>
 <translation id="6759193508432371551">Terugzetten op fabrieksinstellingen</translation>
 <translation id="6760765581316020278">Vietnamees toetsenbord (VNI)</translation>
@@ -4589,6 +4602,7 @@
 <translation id="7717014941119698257">Downloaden: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">Time-out voor training</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262"><ph name="BEGIN_LINK" />Log in bij Chrome<ph name="END_LINK" /> om toezicht te houden op deze persoon.</translation>
 <translation id="7724603315864178912">Knip</translation>
 <translation id="7730449930968088409">De inhoud van je scherm vastleggen</translation>
 <translation id="7730494089396812859">Details van cloudback-up weergeven</translation>
@@ -4682,7 +4696,6 @@
 <translation id="7859704718976024901">Browsegeschiedenis</translation>
 <translation id="7861215335140947162">&amp;Downloads</translation>
 <translation id="7864539943188674973">Bluetooth uitschakelen</translation>
-<translation id="7868891395842935202">Hiermee wordt het experimentele framework ingeschakeld voor het beheren van toegang tot API-experimenten.</translation>
 <translation id="7870576007982733437">De functie voor downloadbeheer van het systeem gebruiken indien van toepassing.</translation>
 <translation id="7870790288828963061">Er zijn geen Kiosk-apps met een nieuwere versie gevonden. Er is niets om te updaten. Verwijder de USB-stick.</translation>
 <translation id="787150342916295244">Creditcard scannen</translation>
@@ -5013,7 +5026,6 @@
 <translation id="8309505303672555187">Selecteer een netwerk:</translation>
 <translation id="8312871300878166382">Plakken in map</translation>
 <translation id="8314013494437618358">Threaded compositing</translation>
-<translation id="8314576811984836978">Experimenteel framework.</translation>
 <translation id="8319414634934645341">Uitgebreid sleutelgebruik</translation>
 <translation id="8322814362483282060">Deze pagina heeft geen toegang tot je microfoon.</translation>
 <translation id="8326478304147373412">PKCS nr. 7, certificaatketen</translation>
@@ -5074,7 +5086,6 @@
 <translation id="8418240940464873056">Hanja-modus</translation>
 <translation id="8418445294933751433">Weergeven al&amp;s tabblad</translation>
 <translation id="8420060421540670057">Bestanden van Google Documenten weergeven</translation>
-<translation id="8420728540268437431">Deze pagina wordt vertaald...</translation>
 <translation id="842274098655511832">WebGL Draft-extensies</translation>
 <translation id="8424039430705546751">omlaag</translation>
 <translation id="8425213833346101688">Wijzigen</translation>
@@ -5261,6 +5272,7 @@
 <translation id="8690754533598178758">Voor Adobe Flash Player worden afzonderlijke microfoonuitzonderingen gebruikt.</translation>
 <translation id="8691686986795184760">(Ingeschakeld door bedrijfsbeleid)</translation>
 <translation id="869257642790614972">Meest recent gesloten tabblad opnieuw openen</translation>
+<translation id="8695770993395462321">Systeemeigen CUPS</translation>
 <translation id="8695825812785969222">&amp;Locatie openen...</translation>
 <translation id="8698464937041809063">Google-tekening</translation>
 <translation id="869884720829132584">Menu 'Applicaties'</translation>
@@ -5604,6 +5616,7 @@
 <translation id="9189690067274055051">Ontgrendel je telefoon en plaats deze dichter bij je <ph name="DEVICE_TYPE" /> om te ontgrendelen.</translation>
 <translation id="9190063653747922532">L2TP/IPsec + eerder gedeelde sleutel</translation>
 <translation id="9201305942933582053">Google Now voor Chrome</translation>
+<translation id="9202646163273566462">Hiermee wordt de weergave 'Alle bladwijzers' ingeschakeld als standaardbestemming van Bladwijzerbeheer.</translation>
 <translation id="9203398526606335860">&amp;Profiling ingeschakeld</translation>
 <translation id="9203478404496196495">Dempen tabblad opheffen</translation>
 <translation id="9203962528777363226">De beheerder van dit apparaat heeft het toevoegen van nieuwe gebruikers uitgeschakeld</translation>
@@ -5630,6 +5643,7 @@
 <translation id="939736085109172342">Nieuwe map</translation>
 <translation id="940425055435005472">Lettergrootte:</translation>
 <translation id="941543339607623937">Ongeldige persoonlijke sleutel.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{geen}=1{1 app ($1)}=2{2 apps ($1, $2)}other{# apps ($1, $2, $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> deelt een Chrome-tabblad en audio.</translation>
 <translation id="942954117721265519">Geen afbeeldingen in deze directory.</translation>
 <translation id="945522503751344254">Feedback verzenden</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index f1c63853..3c163c2 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (utvidelses-ID «<ph name="EXTENSION_ID" />») tillates ikke i denne typen økt.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Beklager. Forsøket på å opprette tilfeldig RSA-privatnøkkel mislyktes.</translation>
+<translation id="1421115928968836111">Dette fjerner autoriseringen av Flash Player-lisensene for beskyttet innhold.</translation>
 <translation id="1425734930786274278">Følgende informasjonskapsler er blokkert (informasjonskapsler fra tredjeparter blokkeres uten unntak):</translation>
 <translation id="1426410128494586442">Ja</translation>
 <translation id="1427049173708736891">Hold <ph name="DEVICE_TYPE" />-enheten ulåst når Android-telefonen er låst opp og i nærheten – du trenger ikke å skrive inn passordet ditt.</translation>
@@ -518,6 +519,7 @@
 <translation id="1707463636381878959">Del dette nettverket med andre brukere</translation>
 <translation id="1708199901407471282">Hvis du åpner et forslag fra en ny fane og det allerede er en fane åpen for forslaget, byttes det til den i stedet for at forslaget lastes inn i den nye fanen.</translation>
 <translation id="1708338024780164500">(Inaktiv)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Opprettelsen av zip-filen mislyktes. Uventet feil: $1</translation>
 <translation id="1715941336038158809">Ugyldig brukernavn og passord.</translation>
 <translation id="1717733954209022288">Avmerkingsboks for lagring av Google Payments-kort</translation>
@@ -794,6 +796,7 @@
 <translation id="2168214441502403371">Persisk tastatur</translation>
 <translation id="2168725742002792683">Filetternavn</translation>
 <translation id="2169062631698640254">Logg på likevel</translation>
+<translation id="2175042898143291048">Gjør alltid dette</translation>
 <translation id="2175607476662778685">Hurtigstartlinje</translation>
 <translation id="2176045495080708525">Følgende utvidelser er nå installert:</translation>
 <translation id="2177950615300672361">Inkognitofane: <ph name="TAB_NAME" /></translation>
@@ -1065,7 +1068,7 @@
 <translation id="254087552098767269">Enheten kunne ikke avregistreres fra ekstern styring.</translation>
 <translation id="2541423446708352368">Vis alle nedlastinger</translation>
 <translation id="2542049655219295786">Google-tabell</translation>
-<translation id="2546283357679194313">Informasjonskapsler og nettsteddata</translation>
+<translation id="2546283357679194313">Informasjonskapsler og nettstedsdata</translation>
 <translation id="2549646943416322527">Seccomp Detector</translation>
 <translation id="2550212893339833758">Virtuelt minne</translation>
 <translation id="2553100941515833716">Tilbakestill installeringstilstanden til appvelgeren ved hver oppstart.</translation>
@@ -1930,7 +1933,6 @@
 <translation id="3688507211863392146">skrive til filer og mapper du åpner i appen</translation>
 <translation id="3688526734140524629">Bytt kanal</translation>
 <translation id="3688578402379768763">Oppdatert</translation>
-<translation id="3690976161240450479">Påloggingen mislyktes. Kontakt administratoren din, eller prøv på nytt.</translation>
 <translation id="3693415264595406141">Passord:</translation>
 <translation id="3694027410380121301">Velg forrige fane</translation>
 <translation id="3694678678240097321">Krev brukerens samtykke for en utvidelse som kjører et skript på siden, hvis utvidelsen ber om tillatelse til å kjøre på alle nettadresser.</translation>
@@ -2224,6 +2226,7 @@
 <translation id="4116663294526079822">Tillat alltid på dette nettstedet</translation>
 <translation id="411666854932687641">Privat minne</translation>
 <translation id="4118990158415604803">Administratoren din har slått av muligheten for å koble til andre nettverk.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{og én annen}other{og # andre}}</translation>
 <translation id="4119828560634133962">Registreringspromoteringer for forhåndsvisning av utskrifter</translation>
 <translation id="4120329147617730038">En administrator har deaktivert multipålogging for <ph name="USER_EMAIL" />.
 Alle brukere må logge av for å fortsette.</translation>
@@ -2363,9 +2366,11 @@
 <translation id="4345703751611431217">Inkompatibel programvare: Les mer</translation>
 <translation id="4348766275249686434">Registrer feil</translation>
 <translation id="4350019051035968019">Denne enheten kan ikke registreres for domenet kontoen din tilhører. Enheten er merket for administrering av et annet domene.</translation>
+<translation id="4354806558096370704">Slå på bruk av den integrerte CUPS-utskriftsprosessen.</translation>
 <translation id="4358697938732213860">Legg til adresse</translation>
 <translation id="4359408040881008151">Installert på grunn av avhengige utvidelser.</translation>
 <translation id="4361190688154226069">Rect-basert målretting i visninger</translation>
+<translation id="4364414793200746179">Android MediaStyle-varsel</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> er lastet ned.</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> deler et vindu.</translation>
 <translation id="4364830672918311045">Vis varsler</translation>
@@ -2768,6 +2773,7 @@
 <translation id="4988792151665380515">Kan ikke eksportere den offentlige nøkkelen.</translation>
 <translation id="49896407730300355">Rotér m&amp;ot klokken</translation>
 <translation id="4989966318180235467">Inspeksjons- og bakgrunnsside</translation>
+<translation id="4990343175649730969">Last ned opprydningsverktøyet for Chrome</translation>
 <translation id="4991420928586866460">Behandle taster på øverste rad som funksjonstaster</translation>
 <translation id="499165176004408815">Bruk høykontrastmodus</translation>
 <translation id="4992066212339426712">Slå på lyden</translation>
@@ -3288,6 +3294,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: Velg for å redigere</translation>
 <translation id="5741454054957165976">Slå på den nye versjonen av brukeragent-intervensjon for WebFonts-innlasting.</translation>
 <translation id="574392208103952083">Medium</translation>
+<translation id="5744368829843057748">Oversetter-grensesnittet for 2. kvartal 2016</translation>
 <translation id="5745056705311424885">Oppdaget USB-minnepinne</translation>
 <translation id="5746169159649715125">Lagre som PDF</translation>
 <translation id="5747611503456050045">Nye innlastinger av sider utløses av innhold som rulles for langt vertikalt.</translation>
@@ -3395,6 +3402,7 @@
 <translation id="5884474295213649357">Denne fanen er koblet til en USB-enhet.</translation>
 <translation id="5885324376209859881">Administrer medieinnstillingene</translation>
 <translation id="5889282057229379085">Maksimalt antall mellomliggende sertifiseringsinstanser: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Fortell oss hva som skjer.</translation>
 <translation id="5892290200158927959">Fransk BÉPO-tastatur</translation>
 <translation id="5892507820957994680">Overstyrer den innebygde listen over gjengivelsesprogramvare og aktiverer GPU-akselerasjon på systemkonfigurasjoner uten støtte.</translation>
 <translation id="5895138241574237353">Start på nytt</translation>
@@ -3536,6 +3544,7 @@
 <translation id="6122093587541546701">E-post (valgfritt):</translation>
 <translation id="6122875415561139701">Skriveoperasjonen er ikke tillatt på: «<ph name="DEVICE_NAME" />».</translation>
 <translation id="6124650939968185064">Disse utvidelsene er avhengige av denne utvidelsen:</translation>
+<translation id="6127945163801765632">Slå på «Alle bokmerker»-delen i bokmerkebehandlingen.</translation>
 <translation id="6129938384427316298">Kommentar til Netscape-sertifikat</translation>
 <translation id="6129953537138746214">Mellomrom</translation>
 <translation id="6132383530370527946">Med liten skrift</translation>
@@ -3562,6 +3571,7 @@
 <translation id="6164005077879661055">Alle filer og lokale data tilknyttet den administrerte brukeren slettes permanent når den administrerte brukeren fjernes. Besøkte nettsteder og innstillinger for denne administrerte brukeren kan fortsatt ses av administratoren på <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Les mer</translation>
 <translation id="6166185671393271715">Importér passord i Chrome</translation>
+<translation id="6169666352732958425">Kan ikke caste skrivebordet.</translation>
 <translation id="6171550060231646388">Simulerte maskinvarefunksjoner for «Ok Google»</translation>
 <translation id="6175314957787328458">Microsoft domeneguide</translation>
 <translation id="6178664161104547336">Velg et sertifikat</translation>
@@ -3754,6 +3764,7 @@
 <translation id="6458308652667395253">Administrer blokkering av JavaScript</translation>
 <translation id="6459488832681039634">Bruk markering for Finn</translation>
 <translation id="6460423884798879930">Aktiver muligheten til å sende ekstra autentiseringsinformasjon med den første SYN-pakken for en klient som har vært tilkoblet tidligere. Dette gjør at datasending kan starte raskere.</translation>
+<translation id="6460474910028274178">Forbedret utløserlogikk og utseende for boblegrensesnittet for Oversetter</translation>
 <translation id="6460601847208524483">Finn neste</translation>
 <translation id="6462080265650314920">Programmer må leveres med innholdstypen «<ph name="CONTENT_TYPE" />».</translation>
 <translation id="6462082050341971451">Er du fortsatt der?</translation>
@@ -3883,6 +3894,7 @@
 <translation id="6663792236418322902">Passordet du velger, er nødvendig for å gjenopprette denne filen på et senere tidspunkt. Oppbevar den på et sikkert sted.</translation>
 <translation id="6664237456442406323">Dessverre er datamaskinen konfigurert med en feilformatert maskinvare-ID. Dette hindrer Chrome OS fra å oppdatere til de siste sikkerhetsoppdateringene, og datamaskinen din <ph name="BEGIN_BOLD" />kan utsettes for skadelige angrep<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">med Google-kontoen din</translation>
+<translation id="667517062706956822">Vil du at Google skal oversette denne siden fra <ph name="SOURCE_LANGUAGE" /> til <ph name="TARGET_LANGUAGE" />?</translation>
 <translation id="6675665718701918026">En pekeenhet er koblet til</translation>
 <translation id="6677037229676347494">Den forventede ID-en var «<ph name="EXPECTED_ID" />», men den faktiske ID-en var «<ph name="NEW_ID" />».</translation>
 <translation id="6680028776254050810">Bytt bruker</translation>
@@ -3934,6 +3946,7 @@
 <translation id="6746392203843147041">økt lydstyrke</translation>
 <translation id="6748140994595080445">Endre hvordan <ph name="APP_NAME" /> behandler og viser språk.</translation>
 <translation id="6748465660675848252">Du kan fortsette, men bare synkroniserte data og innstillinger blir gjenopprettet. Alle lokale data går tapt.</translation>
+<translation id="6751256176799620176">1 mappe er valgt</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Inkognito)</translation>
 <translation id="6759193508432371551">Tilbakestilling til fabrikkstandard</translation>
 <translation id="6760765581316020278">Vietnamesisk tastatur (VNI)</translation>
@@ -4565,6 +4578,7 @@
 <translation id="7717014941119698257">Laster ned: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">Treningen ble tidsavbrutt</translation>
 <translation id="771953673318695590">Kvalitetssikring</translation>
+<translation id="7720375555307821262">For å administrere denne personen, <ph name="BEGIN_LINK" />logg på Chrome<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">Klipp ut</translation>
 <translation id="7730449930968088409">ta bilde av innhold på skjermen din</translation>
 <translation id="7730494089396812859">Vis detaljer for skybasert sikkerhetskopiering</translation>
@@ -4658,7 +4672,6 @@
 <translation id="7859704718976024901">Nettlesingsloggen</translation>
 <translation id="7861215335140947162">Ne&amp;dlastinger</translation>
 <translation id="7864539943188674973">Deaktiver Bluetooth</translation>
-<translation id="7868891395842935202">Slår på det eksperimentelle brukergrensesnittet for kontroll av tilgang til API-eksperimenter.</translation>
 <translation id="7870576007982733437">Bruk systemets nedlastingsbehandling når det er mulig.</translation>
 <translation id="7870790288828963061">Fant ingen Kiosk-apper med nyere versjon. Ingenting å oppdatere. Ta ut USB-pinnen.</translation>
 <translation id="787150342916295244">Skanning av kredittkort</translation>
@@ -4987,7 +5000,6 @@
 <translation id="8309505303672555187">Velg nettverk:</translation>
 <translation id="8312871300878166382">Lim inn i mappen</translation>
 <translation id="8314013494437618358">Trådbasert sammensetting</translation>
-<translation id="8314576811984836978">Eksperimentelt rammeverk.</translation>
 <translation id="8319414634934645341">Utvidet bruk av nøkkel</translation>
 <translation id="8322814362483282060">Mikrofonen er blokkert for denne siden.</translation>
 <translation id="8326478304147373412">PKCS #7, sertifikat-kjede</translation>
@@ -5048,7 +5060,6 @@
 <translation id="8418240940464873056">Hanja-modus</translation>
 <translation id="8418445294933751433">Vi&amp;s som fane</translation>
 <translation id="8420060421540670057">Vis filer fra Google Dokumenter</translation>
-<translation id="8420728540268437431">Denne siden blir oversatt …</translation>
 <translation id="842274098655511832">Utkastutvidelser med WebGL</translation>
 <translation id="8424039430705546751">ned</translation>
 <translation id="8425213833346101688">Endre</translation>
@@ -5235,6 +5246,7 @@
 <translation id="8690754533598178758">Mikrofonunntakene er annerledes for Adobe Flash Player.</translation>
 <translation id="8691686986795184760">(Aktivert av virksomhetens retningslinjer)</translation>
 <translation id="869257642790614972">Åpne sist lukkede fane på nytt</translation>
+<translation id="8695770993395462321">Integrert CUPS</translation>
 <translation id="8695825812785969222">Åpne p&amp;lassering ...</translation>
 <translation id="8698464937041809063">Google-tegning</translation>
 <translation id="869884720829132584">Programmeny</translation>
@@ -5512,7 +5524,7 @@
 <translation id="910077499156148110">Legg til et unntak for et nettsted</translation>
 <translation id="9100825730060086615">Tastaturtype</translation>
 <translation id="9101691533782776290">Start appen</translation>
-<translation id="9101960725093302061">Hvis du vil spesifisere hvilke nettsteder <ph name="NEW_PROFILE_NAME" /> kan se, kan du konfigurere begrensninger og innstillinger ved å gå til <ph name="BEGIN_LINK" /><ph name="DISPLAY_LINK" /><ph name="END_LINK" />. Hvis du ikke endrer standardinnstillingene, kan <ph name="NEW_PROFILE_NAME" /> se alle nettsteder.</translation>
+<translation id="9101960725093302061">Hvis du vil spesifisere hvilke nettsteder <ph name="NEW_PROFILE_NAME" /> kan se, kan du konfigurere begrensninger og innstillinger ved å gå til <ph name="BEGIN_LINK" /><ph name="DISPLAY_LINK" /><ph name="END_LINK" />. Hvis du ikke endrer standardinnstillingene, kan <ph name="NEW_PROFILE_NAME" /> surfe fritt på nettet.</translation>
 <translation id="9103001804464916031">{NUM_DOWNLOAD,plural, =1{Nedlasting pågår}other{Nedlastinger pågår}}</translation>
 <translation id="9105212490906037469">F2</translation>
 <translation id="9106577689055281370">Gjenstående batteritid er
@@ -5577,6 +5589,7 @@
 <translation id="9189690067274055051">Lås opp telefonen, og hold den nærmere <ph name="DEVICE_TYPE" />-enheten din for å koble den til.</translation>
 <translation id="9190063653747922532">L2TP/IPsec + forhåndsdelt nøkkel</translation>
 <translation id="9201305942933582053">Google Nå for Chrome!</translation>
+<translation id="9202646163273566462">Slår på «Alle bokmerker»-visningen som standarddestinasjonen i bokmerkebehandlingen.</translation>
 <translation id="9203398526606335860">&amp;Profilering aktivert</translation>
 <translation id="9203478404496196495">Slå på lyden for fanen</translation>
 <translation id="9203962528777363226">Administratoren til denne enheten har deaktivert tillegging av nye brukere</translation>
@@ -5603,6 +5616,7 @@
 <translation id="939736085109172342">Ny mappe</translation>
 <translation id="940425055435005472">Skriftstørrelse:</translation>
 <translation id="941543339607623937">Ugyldig privatnøkkel </translation>
+<translation id="94157737897675170">{COUNT,plural, =0{ingen}=1{1 app ($1)}=2{2 apper ($1, $2)}other{# apper ($1, $2, $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> deler lyd og en fane fra Chrome.</translation>
 <translation id="942954117721265519">Det fins ingen bilder i denne katalogen.</translation>
 <translation id="945522503751344254">Gi tilbakemelding</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index 63ae7cb..e26992d 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608">Rozszerzenie <ph name="EXTENSION_NAME" /> (identyfikator rozszerzenia „<ph name="EXTENSION_ID" />”) jest niedozwolone w tym typie sesji.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Ojej! Nie można wygenerować losowego klucza prywatnego RSA.</translation>
+<translation id="1421115928968836111">Ta opcja cofa licencje Flash Playera na odtwarzanie treści chronionych.</translation>
 <translation id="1425734930786274278">Zablokowano następujące pliki cookie (pliki cookie podmiotów trzecich są blokowane bez wyjątków):</translation>
 <translation id="1426410128494586442">Tak</translation>
 <translation id="1427049173708736891"><ph name="DEVICE_TYPE" /> pozostanie odblokowany, gdy Twój odblokowany telefon z Androidem będzie w pobliżu – nie musisz wpisywać hasła.</translation>
@@ -521,6 +522,7 @@
 <translation id="1707463636381878959">Udostępnij tę sieć innym użytkownikom</translation>
 <translation id="1708199901407471282">Jeśli jest już otwarta karta z podpowiadaną stroną internetową wyświetlaną na stronie nowej karty, podczas otwierania danej podpowiedzi przeglądarka nie ładuje jej w nowej karcie, lecz przełącza widok na otwartą kartę.</translation>
 <translation id="1708338024780164500">(Nieaktywne)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (identyfikator: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Pakowanie nie powiodło się, nieoczekiwany błąd: $1</translation>
 <translation id="1715941336038158809">Nieprawidłowa nazwa użytkownika lub hasło.</translation>
 <translation id="1717733954209022288">Pole wyboru zapisywania kart w Google Payments</translation>
@@ -797,6 +799,7 @@
 <translation id="2168214441502403371">Klawiatura perska</translation>
 <translation id="2168725742002792683">Rozszerzenia plików</translation>
 <translation id="2169062631698640254">Zaloguj mimo to</translation>
+<translation id="2175042898143291048">Rób to zawsze</translation>
 <translation id="2175607476662778685">Pasek szybkiego uruchamiania</translation>
 <translation id="2176045495080708525">Następujące rozszerzenia zostały zainstalowane:</translation>
 <translation id="2177950615300672361">Karta incognito: <ph name="TAB_NAME" /></translation>
@@ -1936,7 +1939,6 @@
 <translation id="3688507211863392146">Zapisywać dane w plikach i folderach otwieranych w aplikacji</translation>
 <translation id="3688526734140524629">Zmień wersję</translation>
 <translation id="3688578402379768763">Aktualne</translation>
-<translation id="3690976161240450479">Nie udało się zalogować. Skontaktuj się z administratorem lub spróbuj ponownie.</translation>
 <translation id="3693415264595406141">Hasło:</translation>
 <translation id="3694027410380121301">Wybierz poprzednią kartę</translation>
 <translation id="3694678678240097321">Wymagaj zgody użytkownika na włączenie rozszerzenia uruchamiającego skrypt na stronie, jeśli żąda ono działania pod każdym adresem URL.</translation>
@@ -2232,6 +2234,7 @@
 <translation id="4116663294526079822">Zawsze zezwalaj w tej witrynie</translation>
 <translation id="411666854932687641">Pamięć prywatna</translation>
 <translation id="4118990158415604803">Możliwość połączenia się z innymi sieciami została wyłączona przez administratora.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{i jeszcze 1}few{i jeszcze #}many{i jeszcze #}other{i jeszcze #}}</translation>
 <translation id="4119828560634133962">Propozycja rejestracji na podglądzie wydruku</translation>
 <translation id="4120329147617730038">Administrator nie zezwolił na wielokrotne logowanie użytkownika <ph name="USER_EMAIL" />.
 Aby kontynuować, wszyscy użytkownicy muszą się wylogować.</translation>
@@ -2371,9 +2374,11 @@
 <translation id="4345703751611431217">Niezgodność oprogramowania: więcej informacji</translation>
 <translation id="4348766275249686434">Zbieraj błędy</translation>
 <translation id="4350019051035968019">To urządzenie jest oznaczone jako zarządzane przez inną domenę i nie można go przypisać do domeny, do której należy Twoje konto.</translation>
+<translation id="4354806558096370704">Włącza użycie natywnego procesu drukowania CUPS.</translation>
 <translation id="4358697938732213860">Dodaj adres</translation>
 <translation id="4359408040881008151">Zainstalowane ponieważ jest wymagane przez inne rozszerzenia.</translation>
 <translation id="4361190688154226069">Oparte na prostokątach kierowanie w widokach</translation>
+<translation id="4364414793200746179">Powiadomienia Android MediaStyle</translation>
 <translation id="4364444725319685468">Plik <ph name="FILE_NAME" /> został pobrany</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> udostępnia okno.</translation>
 <translation id="4364830672918311045">Wyświetlaj powiadomienia</translation>
@@ -2774,6 +2779,7 @@
 <translation id="4988792151665380515">Nie można wyeksportować klucza publicznego.</translation>
 <translation id="49896407730300355">&amp;Obróć w lewo</translation>
 <translation id="4989966318180235467">Sprawdź &amp;stronę tła</translation>
+<translation id="4990343175649730969">Pobierz Narzędzie do czyszczenia Chrome</translation>
 <translation id="4991420928586866460">Traktuj klawisze z górnego rzędu jak klawisze funkcyjne</translation>
 <translation id="499165176004408815">Użyj trybu wysokiego kontrastu</translation>
 <translation id="4992066212339426712">Wyłącz wyciszenie</translation>
@@ -3298,6 +3304,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: wybierz, by edytować</translation>
 <translation id="5741454054957165976">Włącz nową wersję interwencji klienta użytkownika podczas ładowania czcionek WebFonts.</translation>
 <translation id="574392208103952083">Średni</translation>
+<translation id="5744368829843057748">Interfejs Tłumacza 2016Q2</translation>
 <translation id="5745056705311424885">Wykryto pamięć USB</translation>
 <translation id="5746169159649715125">Zapisz jako PDF</translation>
 <translation id="5747611503456050045">Ponowne ładowanie strony aktywowane końcem przewijania w pionie.</translation>
@@ -3405,6 +3412,7 @@
 <translation id="5884474295213649357">Ta karta jest połączona z urządzeniem USB.</translation>
 <translation id="5885324376209859881">Zarządzaj ustawieniami multimediów...</translation>
 <translation id="5889282057229379085">Maksymalna liczba pośrednich urzędów certyfikacji: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Powiedz nam, co się dzieje.</translation>
 <translation id="5892290200158927959">Klawiatura francuska BÉPO</translation>
 <translation id="5892507820957994680">Zastępuje wbudowaną listę renderowania programowego i włącza przyspieszanie za pomocą procesora GPU w przypadku nieobsługiwanej konfiguracji systemu.</translation>
 <translation id="5895138241574237353">Uruchom ponownie</translation>
@@ -3546,6 +3554,7 @@
 <translation id="6122093587541546701">Adres e-mail (opcjonalnie):</translation>
 <translation id="6122875415561139701">Nie jest dozwolona operacja zapisu na: „<ph name="DEVICE_NAME" />”.</translation>
 <translation id="6124650939968185064">To rozszerzenie jest wymagane przez następujące rozszerzenia:</translation>
+<translation id="6127945163801765632">Włącz sekcję „wszystkie zakładki” w menedżerze zakładek.</translation>
 <translation id="6129938384427316298">Komentarz do certyfikatu firmy Netscape</translation>
 <translation id="6129953537138746214">Spacja</translation>
 <translation id="6132383530370527946">Przeczytaj umowę</translation>
@@ -3572,6 +3581,7 @@
 <translation id="6164005077879661055">W chwili usunięcia użytkownika nadzorowanego wszystkie powiązane z nim pliki i dane lokalne zostaną trwale usunięte. Lista stron, na które wszedł ten użytkownik, oraz jego ustawienia mogą być wciąż widoczne dla menedżera na <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Więcej informacji</translation>
 <translation id="6166185671393271715">Importowanie haseł do Chrome</translation>
+<translation id="6169666352732958425">Nie można przesłać pulpitu.</translation>
 <translation id="6171550060231646388">Funkcje „Ok Google” dla emulowanego sprzętu</translation>
 <translation id="6175314957787328458">Identyfikator GUID domeny firmy Microsoft</translation>
 <translation id="6178664161104547336">Wybór certyfikatu</translation>
@@ -3765,6 +3775,7 @@
 <translation id="6458308652667395253">Zarządzaj blokowaniem kodu JavaScript...</translation>
 <translation id="6459488832681039634">Użyj zaznaczenia do funkcji Znajdź</translation>
 <translation id="6460423884798879930">Włącz tę opcję, by wysłać dodatkowe informacje uwierzytelniania we wstępnym pakiecie SYN dla uprzednio połączonego klienta, umożliwiając szybsze rozpoczęcie wysyłania danych.</translation>
+<translation id="6460474910028274178">Udoskonalona logika wyzwalania i interfejs dymków Tłumacza</translation>
 <translation id="6460601847208524483">Znajdź następne</translation>
 <translation id="6462080265650314920">Aplikacje muszą być udostępniane z parametrem content-type „<ph name="CONTENT_TYPE" />”.</translation>
 <translation id="6462082050341971451">Jesteś tam jeszcze?</translation>
@@ -3894,6 +3905,7 @@
 <translation id="6663792236418322902">Wybrane hasło będzie wymagane później do odtworzenia tego pliku. Zapisz je w bezpiecznym miejscu.</translation>
 <translation id="6664237456442406323">Twój komputer jest skonfigurowany przy użyciu błędnie sformatowanego identyfikatora sprzętu. Ta sytuacja uniemożliwia zaktualizowanie systemu operacyjnego Chrome za pomocą najnowszych poprawek zabezpieczeń, a komputer <ph name="BEGIN_BOLD" />może być narażony na złośliwe ataki<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">za pomocą konta Google</translation>
+<translation id="667517062706956822">Chcesz zobaczyć tłumaczenie Google tej strony z języka <ph name="SOURCE_LANGUAGE" /> na <ph name="TARGET_LANGUAGE" />?</translation>
 <translation id="6675665718701918026">Podłączono urządzenie wskazujące</translation>
 <translation id="6677037229676347494">Oczekiwano identyfikatora „<ph name="EXPECTED_ID" />”, identyfikator: „<ph name="NEW_ID" />”.</translation>
 <translation id="6680028776254050810">Przełącz użytkowników</translation>
@@ -3945,6 +3957,7 @@
 <translation id="6746392203843147041">zwiększ głośność</translation>
 <translation id="6748140994595080445">Zmień sposób, w jaki <ph name="APP_NAME" /> obsługuje i wyświetla języki.</translation>
 <translation id="6748465660675848252">Możesz kontynuować, ale zostaną przywrócone tylko zsynchronizowane dane i ustawienia. Wszystkie dane lokalne zostaną utracone.</translation>
+<translation id="6751256176799620176">Wybrano jeden folder</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Incognito)</translation>
 <translation id="6759193508432371551">Ustawienia fabryczne</translation>
 <translation id="6760765581316020278">Klawiatura wietnamska (VNI)</translation>
@@ -4575,6 +4588,7 @@
 <translation id="7717014941119698257">Pobieram: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">Przekroczono limit czasu szkolenia</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262">Aby nadzorować tę osobę, <ph name="BEGIN_LINK" />zaloguj się w Chrome<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">Wytnij</translation>
 <translation id="7730449930968088409">Przechwytywanie zawartości ekranu</translation>
 <translation id="7730494089396812859">Pokaż szczegóły kopii zapasowej w chmurze</translation>
@@ -4668,7 +4682,6 @@
 <translation id="7859704718976024901">Historia przeglądania</translation>
 <translation id="7861215335140947162">&amp;Pobrane pliki</translation>
 <translation id="7864539943188674973">Wyłącz Bluetooth</translation>
-<translation id="7868891395842935202">Włącza eksperymentalną strukturę do kontrolowania dostępu do eksperymentalnych interfejsów API.</translation>
 <translation id="7870576007982733437">W odpowiednich przypadkach używaj systemowego menedżera pobierania.</translation>
 <translation id="7870790288828963061">Nie odnaleziono nowszej wersji aplikacji kiosku. Aktualizacja nie jest wymagana. Odłącz pamięć USB.</translation>
 <translation id="787150342916295244">Skanowanie karty kredytowej</translation>
@@ -4997,7 +5010,6 @@
 <translation id="8309505303672555187">Wybierz sieć:</translation>
 <translation id="8312871300878166382">Wklej do folderu</translation>
 <translation id="8314013494437618358">Komponowanie w wątku</translation>
-<translation id="8314576811984836978">Eksperymentalna struktura.</translation>
 <translation id="8319414634934645341">Rozszerzone użycie klucza</translation>
 <translation id="8322814362483282060">Ta strona ma zablokowany dostęp do mikrofonu.</translation>
 <translation id="8326478304147373412">PKCS #7, łańcuch certyfikatów</translation>
@@ -5058,7 +5070,6 @@
 <translation id="8418240940464873056">Tryb Hanja</translation>
 <translation id="8418445294933751433">&amp;Pokaż jako kartę</translation>
 <translation id="8420060421540670057">Pokazuj pliki Dokumentów Google</translation>
-<translation id="8420728540268437431">Ta strona jest w trakcie tłumaczenia...</translation>
 <translation id="842274098655511832">Rozszerzenia WebGL w wersjach roboczych</translation>
 <translation id="8424039430705546751">w dół</translation>
 <translation id="8425213833346101688">Zmień</translation>
@@ -5245,6 +5256,7 @@
 <translation id="8690754533598178758">Wyjątki Adobe Flash Playera dotyczące mikrofonu są inne.</translation>
 <translation id="8691686986795184760">(Włączona na podstawie zasad przedsiębiorstwa)</translation>
 <translation id="869257642790614972">Otwórz ostatnio zamkniętą kartę</translation>
+<translation id="8695770993395462321">Natywny CUPS</translation>
 <translation id="8695825812785969222">Otwórz &amp;lokalizację</translation>
 <translation id="8698464937041809063">Rysunek Google</translation>
 <translation id="869884720829132584">Menu aplikacji</translation>
@@ -5586,6 +5598,7 @@
 <translation id="9189690067274055051">Aby odblokować system, <ph name="DEVICE_TYPE" /> i odblokowany telefon muszą być bliżej siebie.</translation>
 <translation id="9190063653747922532">L2TP/IPSec + klucz wstępny</translation>
 <translation id="9201305942933582053">Google Now dla Chrome</translation>
+<translation id="9202646163273566462">Włącza widok wszystkich zakładek jako domyślną opcję menedżera zakładek.</translation>
 <translation id="9203398526606335860">&amp;Profilowanie włączone</translation>
 <translation id="9203478404496196495">Wyłącz wyciszenie karty</translation>
 <translation id="9203962528777363226">Administrator tego urządzenia wyłączył możliwość dodawania nowych użytkowników</translation>
@@ -5612,6 +5625,7 @@
 <translation id="939736085109172342">Nowy folder</translation>
 <translation id="940425055435005472">Rozmiar czcionki:</translation>
 <translation id="941543339607623937">Nieprawidłowy klucz prywatny.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{brak}=1{1 aplikacja ($1)}=2{2 aplikacje ($1, $2)}few{# aplikacje ($1, $2, $3)}many{# aplikacji ($1, $2, $3)}other{# aplikacji ($1, $2, $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> udostępnia kartę i dźwięk z Chrome.</translation>
 <translation id="942954117721265519">Brak zdjęć w tym katalogu.</translation>
 <translation id="945522503751344254">Wyślij zgłoszenie</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index f6b22c3..5f54959b1 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (ID de extensão "<ph name="EXTENSION_ID" />") não é permitido neste tipo de sessão.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Ops! Falha ao gerar a chave privada RSA aleatória.</translation>
+<translation id="1421115928968836111">Isso desautorizará as licenças do Flash Player para conteúdo protegido.</translation>
 <translation id="1425734930786274278">Os cookies a seguir foram bloqueados (cookies de terceiros estão sendo bloqueados sem exceções):</translation>
 <translation id="1426410128494586442">Sim</translation>
 <translation id="1427049173708736891">Manter seu <ph name="DEVICE_TYPE" /> desbloqueado quando seu smartphone Android estiver desbloqueado e nas proximidades. É necessário digitar sua senha.</translation>
@@ -521,6 +522,7 @@
 <translation id="1707463636381878959">Compartilhar esta rede</translation>
 <translation id="1708199901407471282">Ao abrir uma sugestão de página da Web a partir da página "Nova guia", se uma guia já estiver aberta para a sugestão, alterne para ela em vez de carregar a sugestão na nova guia.</translation>
 <translation id="1708338024780164500">(Inativa)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (código: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Falha na compactação, erro inesperado: $1</translation>
 <translation id="1715941336038158809">Nome de usuário ou senha inválida.</translation>
 <translation id="1717733954209022288">Caixa de seleção para salvar cartão do Google Payments</translation>
@@ -797,6 +799,7 @@
 <translation id="2168214441502403371">Teclado persa</translation>
 <translation id="2168725742002792683">Extensões de arquivo</translation>
 <translation id="2169062631698640254">Fazer login assim mesmo</translation>
+<translation id="2175042898143291048">Sempre fazer isso</translation>
 <translation id="2175607476662778685">Barra de inicialização rápida</translation>
 <translation id="2176045495080708525">As seguintes extensões foram instaladas:</translation>
 <translation id="2177950615300672361">Guia anônima: <ph name="TAB_NAME" /></translation>
@@ -1936,7 +1939,6 @@
 <translation id="3688507211863392146">Realizar gravações em arquivos e pastas que você abre no aplicativo</translation>
 <translation id="3688526734140524629">Mudar de canal</translation>
 <translation id="3688578402379768763">Atualizado</translation>
-<translation id="3690976161240450479">Falha no login. Entre em contato com o administrador ou tente novamente.</translation>
 <translation id="3693415264595406141">Senha:</translation>
 <translation id="3694027410380121301">Selecionar guia anterior</translation>
 <translation id="3694678678240097321">Exige o consentimento do usuário para uma extensão que executa um script na página, se a extensão tiver solicitado permissão para ser executada em todos os URLs.</translation>
@@ -2232,6 +2234,7 @@
 <translation id="4116663294526079822">Sempre permitir neste site</translation>
 <translation id="411666854932687641">Memória privada</translation>
 <translation id="4118990158415604803">A conexão com outras redes foi desativada pelo seu administrador.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{e mais uma foto}one{e mais #}other{e mais #}}</translation>
 <translation id="4119828560634133962">Registro de promoções na visualização de impressão</translation>
 <translation id="4120329147617730038">Um administrador desativou o login múltiplo para <ph name="USER_EMAIL" />.
 Todos os usuários devem sair para continuar.</translation>
@@ -2370,9 +2373,11 @@
 <translation id="4345703751611431217">Incompatibilidade de software: saiba mais</translation>
 <translation id="4348766275249686434">Coletar erros</translation>
 <translation id="4350019051035968019">Este dispositivo não pode ser inscrito no domínio ao qual sua conta pertence, porque ele está marcado para ser gerenciado por outro domínio.</translation>
+<translation id="4354806558096370704">Ativa o uso do back-end de impressão CUPS nativo.</translation>
 <translation id="4358697938732213860">Adicionar um endereço</translation>
 <translation id="4359408040881008151">Instalada devido a extensões dependentes.</translation>
 <translation id="4361190688154226069">Segmentação baseada em retângulo para visualizações</translation>
+<translation id="4364414793200746179">Notificação MediaStyle do Android</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> transferido por download</translation>
 <translation id="4364567974334641491">O app <ph name="APP_NAME" /> está compartilhando uma janela.</translation>
 <translation id="4364830672918311045">Exibir notificações</translation>
@@ -2774,6 +2779,7 @@
 <translation id="4988792151665380515">Falha ao exportar chave pública.</translation>
 <translation id="49896407730300355">Girar no s&amp;entido anti-horário</translation>
 <translation id="4989966318180235467">Inspecionar página de &amp;fundo</translation>
+<translation id="4990343175649730969">Fazer o download da Ferramenta de limpeza do Chrome</translation>
 <translation id="4991420928586866460">Tratar teclas de linha superior como teclas de função</translation>
 <translation id="499165176004408815">Usar modo de alto contraste</translation>
 <translation id="4992066212339426712">Ativar som</translation>
@@ -3298,6 +3304,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: selecione para editar</translation>
 <translation id="5741454054957165976">Ativar a nova versão da intervenção de User Agent para carregamento de WebFonts.</translation>
 <translation id="574392208103952083">Médio</translation>
+<translation id="5744368829843057748">Interface do usuário do Tradutor 2016Q2</translation>
 <translation id="5745056705311424885">Cartão de memória USB detectado</translation>
 <translation id="5746169159649715125">Salvar como PDF</translation>
 <translation id="5747611503456050045">Recarregamento da página acionado por conteúdo de rolagem vertical excessiva.</translation>
@@ -3405,6 +3412,7 @@
 <translation id="5884474295213649357">Esta guia está conectada a um dispositivo USB.</translation>
 <translation id="5885324376209859881">Gerenciar configurações de mídia...</translation>
 <translation id="5889282057229379085">Número máximo de autoridades de certificação intermediárias: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Conte-nos o que está acontecendo.</translation>
 <translation id="5892290200158927959">Teclado BÉPO francês</translation>
 <translation id="5892507820957994680">Substitui a lista de renderização do software integrado e permite a aceleração GPU em configurações do sistema não suportadas.</translation>
 <translation id="5895138241574237353">Reiniciar</translation>
@@ -3546,6 +3554,7 @@
 <translation id="6122093587541546701">E-mail (opcional):</translation>
 <translation id="6122875415561139701">A operação de escrita não é permitida em: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="6124650939968185064">As extensões a seguir dependem desta extensão:</translation>
+<translation id="6127945163801765632">Ativar a seção "todos os favoritos" no gerenciador de favoritos.</translation>
 <translation id="6129938384427316298">Comentário do certificado do Netscape</translation>
 <translation id="6129953537138746214">Espaço</translation>
 <translation id="6132383530370527946">Texto legal</translation>
@@ -3573,6 +3582,7 @@
 permanentemente excluídos assim que esse usuário for removido. Os websites visitados por esse usuário supervisionado e suas configurações ainda poderão ser vistos pelo administrador em <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Saiba mais</translation>
 <translation id="6166185671393271715">Importar senhas para o Chrome</translation>
+<translation id="6169666352732958425">Não é possível transmitir a área de trabalho.</translation>
 <translation id="6171550060231646388">Recursos "Ok Google" de hardware simulado</translation>
 <translation id="6175314957787328458">GUID do domínio da Microsoft</translation>
 <translation id="6178664161104547336">Selecione um certificado</translation>
@@ -3766,6 +3776,7 @@
 <translation id="6458308652667395253">Gerenciar o bloqueio de JavaScript...</translation>
 <translation id="6459488832681039634">Usar seleção para buscar</translation>
 <translation id="6460423884798879930">Ativar a opção de enviar informações extras de autenticação no pacote SYN inicial para um cliente anteriormente conectado, permitindo mais rapidez no início do envio de dados.</translation>
+<translation id="6460474910028274178">Melhoria na lógica de acionamento e na aparência da interface do usuário do Tradutor Bubble</translation>
 <translation id="6460601847208524483">Localizar próximo</translation>
 <translation id="6462080265650314920">Os aplicativos devem ser servidos com o tipo de conteúdo "<ph name="CONTENT_TYPE" />".</translation>
 <translation id="6462082050341971451">Você ainda está aí?</translation>
@@ -3895,6 +3906,7 @@
 <translation id="6663792236418322902">A senha escolhida será solicitada para restaurar este arquivo mais tarde. Guarde-a em um local seguro.</translation>
 <translation id="6664237456442406323">Infelizmente, seu computador está configurado com um ID de hardware mal formado. Isso impede que o Chrome OS seja atualizado com as correções de segurança mais recentes e, por isso, seu computador <ph name="BEGIN_BOLD" />pode ficar vulnerável a ataques maliciosos<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">com sua Conta do Google</translation>
+<translation id="667517062706956822">Deseja que o Google traduza esta página de <ph name="SOURCE_LANGUAGE" /> para <ph name="TARGET_LANGUAGE" />?</translation>
 <translation id="6675665718701918026">Dispositivo apontador conectado</translation>
 <translation id="6677037229676347494">ID esperado "<ph name="EXPECTED_ID" />", mas era "<ph name="NEW_ID" />".</translation>
 <translation id="6680028776254050810">Trocar usuários</translation>
@@ -3946,6 +3958,7 @@
 <translation id="6746392203843147041">aumentar volume</translation>
 <translation id="6748140994595080445">Alterar a forma como o <ph name="APP_NAME" /> manipula e exibe os idiomas.</translation>
 <translation id="6748465660675848252">É possível prosseguir, mas apenas seus dados e configurações sincronizados serão restaurados. Todos os dados locais serão perdidos.</translation>
+<translation id="6751256176799620176">1 pasta selecionada</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Modo anônimo)</translation>
 <translation id="6759193508432371551">Configuração original</translation>
 <translation id="6760765581316020278">Teclado vietnamita (VNI)</translation>
@@ -4586,6 +4599,7 @@
 <translation id="7717014941119698257">Fazendo download <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">O tempo de treinamento expirou.</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262">Para supervisionar essa pessoa, <ph name="BEGIN_LINK" />faça login no Chrome<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">Recortar</translation>
 <translation id="7730449930968088409">Capturar o conteúdo da sua tela</translation>
 <translation id="7730494089396812859">Exibir detalhes do backup em nuvem</translation>
@@ -4679,7 +4693,6 @@
 <translation id="7859704718976024901">Histórico de navegação</translation>
 <translation id="7861215335140947162">&amp;Downloads</translation>
 <translation id="7864539943188674973">Desativar bluetooth</translation>
-<translation id="7868891395842935202">Permite que a estrutura experimental controle o acesso a experimentos de API.</translation>
 <translation id="7870576007982733437">Usar o gerenciador de downloads do sistema quando aplicável.</translation>
 <translation id="7870790288828963061">Nenhum aplicativo de quiosque com versão mais recente foi encontrado. Não há nada para ser atualizado. Remova o pendrive.</translation>
 <translation id="787150342916295244">Digitalização de cartão de crédito</translation>
@@ -5008,7 +5021,6 @@
 <translation id="8309505303672555187">Selecione uma rede:</translation>
 <translation id="8312871300878166382">Colar na pasta</translation>
 <translation id="8314013494437618358">Composição de thread</translation>
-<translation id="8314576811984836978">Estrutura experimental.</translation>
 <translation id="8319414634934645341">Uso estendido de chave</translation>
 <translation id="8322814362483282060">Esta página foi impedida de acessar seu microfone.</translation>
 <translation id="8326478304147373412">PKCS #7, cadeia de certificados</translation>
@@ -5069,7 +5081,6 @@
 <translation id="8418240940464873056">Modo letras japonesas (Hanja)</translation>
 <translation id="8418445294933751433">&amp;Mostrar como guia</translation>
 <translation id="8420060421540670057">Mostrar arquivos do Google Docs</translation>
-<translation id="8420728540268437431">Esta página está sendo traduzida...</translation>
 <translation id="842274098655511832">Extensões de rascunho do WebGL</translation>
 <translation id="8424039430705546751">para baixo</translation>
 <translation id="8425213833346101688">Alterar</translation>
@@ -5256,6 +5267,7 @@
 <translation id="8690754533598178758">As exceções do microfone do Adobe Flash Player são diferentes.</translation>
 <translation id="8691686986795184760">Ativado pela política empresarial</translation>
 <translation id="869257642790614972">Reabrir a última guia fechada</translation>
+<translation id="8695770993395462321">CUPS nativo</translation>
 <translation id="8695825812785969222">Abrir &amp;local...</translation>
 <translation id="8698464937041809063">Desenho do Google</translation>
 <translation id="869884720829132584">Menu Aplicativos</translation>
@@ -5597,6 +5609,7 @@
 <translation id="9189690067274055051">Desbloqueie seu smartphone e aproxime-o do <ph name="DEVICE_TYPE" /> para entrar.</translation>
 <translation id="9190063653747922532">L2TP/IPSEC + chave pré-compartilhada</translation>
 <translation id="9201305942933582053">Google Now para o Chrome!</translation>
+<translation id="9202646163273566462">Ativa a visualização de todos os favoritos como destino padrão do gerenciador de favoritos.</translation>
 <translation id="9203398526606335860">&amp;Criação de perfil ativada</translation>
 <translation id="9203478404496196495">Ativar o som da guia</translation>
 <translation id="9203962528777363226">O administrador deste dispositivo desativou a adição de novos usuários</translation>
@@ -5623,6 +5636,7 @@
 <translation id="939736085109172342">Nova pasta</translation>
 <translation id="940425055435005472">Tamanho da fonte:</translation>
 <translation id="941543339607623937">Chave privada inválida.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{nenhum}=1{1 app ($1)}=2{2 apps ($1, $2)}other{# apps ($1, $2, $3)}}</translation>
 <translation id="942532530371314860">O app <ph name="APP_NAME" /> está compartilhando áudio e uma guia do Chrome.</translation>
 <translation id="942954117721265519">Não há imagens neste diretório.</translation>
 <translation id="945522503751344254">Enviar comentários</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index 951deda..e29bbd1 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608">A extensão <ph name="EXTENSION_NAME" /> (ID da extensão "<ph name="EXTENSION_ID" />") não é permitida neste tipo de sessão.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Ora bolas! Falha ao gerar chave privada RSA aleatória.</translation>
+<translation id="1421115928968836111">Esta opção retira a autorização de licenças do Flash Player para conteúdos protegidos.</translation>
 <translation id="1425734930786274278">Os seguintes cookies foram bloqueados (os cookies de terceiros estão a ser bloqueados sem excepção):</translation>
 <translation id="1426410128494586442">Sim</translation>
 <translation id="1427049173708736891">Mantenha o seu <ph name="DEVICE_TYPE" /> desbloqueado quando o seu telemóvel Android estiver desbloqueado e próximo. Não é necessário introduzir a palavra-passe.</translation>
@@ -522,6 +523,7 @@
 <translation id="1707463636381878959">Partilhar esta rede com outros utilizadores</translation>
 <translation id="1708199901407471282">Ao abrir uma página Web sugerida da página Novo separador, se um separador já estiver aberto para a sugestão, alterne para esse em vez de carregar a sugestão no novo separador.</translation>
 <translation id="1708338024780164500">(Inativa)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Falha na criação de zip; erro inesperado: $1</translation>
 <translation id="1715941336038158809">Nome de utilizador ou palavra-passe inválidos.</translation>
 <translation id="1717733954209022288">Caixa de verificação para guardar o cartão do Google Payments</translation>
@@ -798,6 +800,7 @@
 <translation id="2168214441502403371">Teclado persa</translation>
 <translation id="2168725742002792683">Extensões de ficheiro</translation>
 <translation id="2169062631698640254">Continuar com o início de sessão</translation>
+<translation id="2175042898143291048">Fazer sempre isto</translation>
 <translation id="2175607476662778685">Barra de início rápido</translation>
 <translation id="2176045495080708525">As seguintes extensões estão agora instaladas:</translation>
 <translation id="2177950615300672361">Separador de navegação anónima: <ph name="TAB_NAME" /></translation>
@@ -1937,7 +1940,6 @@
 <translation id="3688507211863392146">Escrever em ficheiros e pastas que são abertos na aplicação</translation>
 <translation id="3688526734140524629">Alterar canal</translation>
 <translation id="3688578402379768763">Atualizado</translation>
-<translation id="3690976161240450479">Falha ao iniciar sessão. Contacte o administrador ou tente novamente.</translation>
 <translation id="3693415264595406141">Palavra-passe:</translation>
 <translation id="3694027410380121301">Seleccionar o separador anterior</translation>
 <translation id="3694678678240097321">Exija o consentimento do utilizador para uma extensão que execute um script na página se a extensão tiver pedido autorização para ser executada em todos os URLs.</translation>
@@ -2233,6 +2235,7 @@
 <translation id="4116663294526079822">Permitir sempre neste Website</translation>
 <translation id="411666854932687641">Memória privada</translation>
 <translation id="4118990158415604803">O administrador desativou a ligação a outras redes.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{e mais 1}other{e mais #}}</translation>
 <translation id="4119828560634133962">Promoções de registo da pré-visualização da impressão</translation>
 <translation id="4120329147617730038">Um administrador não permitiu o início de sessão integrado para <ph name="USER_EMAIL" />.
 Todos os utilizadores têm de terminar sessão para continuar.</translation>
@@ -2372,9 +2375,11 @@
 <translation id="4345703751611431217">Incompatibilidade de software: saiba mais</translation>
 <translation id="4348766275249686434">Recolher erros</translation>
 <translation id="4350019051035968019">Não é possível inscrever este dispositivo no domínio a que pertence a sua conta, porque está marcado para gestão por um domínio diferente.</translation>
+<translation id="4354806558096370704">Ativa a utilização do back-end de impressão CUPS nativo.</translation>
 <translation id="4358697938732213860">Adicionar um endereço</translation>
 <translation id="4359408040881008151">Instalada devido a extensão(ões) dependente(s).</translation>
 <translation id="4361190688154226069">Atribuição do destino com base no retângulo nas vistas</translation>
+<translation id="4364414793200746179">Notificação Android MediaStyle</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> transferido</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> está a partilhar uma janela.</translation>
 <translation id="4364830672918311045">Apresentar notificações</translation>
@@ -2777,6 +2782,7 @@
 <translation id="4988792151665380515">Falha ao exportar chave pública.</translation>
 <translation id="49896407730300355">Rodar para a &amp;esquerda</translation>
 <translation id="4989966318180235467">Inspecionar página de fundo</translation>
+<translation id="4990343175649730969">Transferir a Ferramenta de limpeza do Chrome</translation>
 <translation id="4991420928586866460">Tratar as teclas da linha superior como teclas de função</translation>
 <translation id="499165176004408815">Utilizar modo de alto contraste</translation>
 <translation id="4992066212339426712">Reativar o som</translation>
@@ -3301,6 +3307,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: selecionar para editar</translation>
 <translation id="5741454054957165976">Ativar nova versão da Intervenção de agente do utilizador para carregamento de WebFonts.</translation>
 <translation id="574392208103952083">Médio</translation>
+<translation id="5744368829843057748">IU do Tradutor 2016T2</translation>
 <translation id="5745056705311424885">Memory stick USB detetado</translation>
 <translation id="5746169159649715125">Guardar como PDF</translation>
 <translation id="5747611503456050045">Atualizações de página ativadas ao percorrer o conteúdo verticalmente.</translation>
@@ -3408,6 +3415,7 @@
 <translation id="5884474295213649357">Este separador está associado a um dispositivo USB.</translation>
 <translation id="5885324376209859881">Gerir definições de multimédia...</translation>
 <translation id="5889282057229379085">Número máximo de ACs intermédias:<ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Indique-nos o que está a acontecer.</translation>
 <translation id="5892290200158927959">Teclado BÉPO francês</translation>
 <translation id="5892507820957994680">Substitui a lista de conversão de software incorporada e ativa a aceleração de GPU em configurações de sistema não suportadas.</translation>
 <translation id="5895138241574237353">Reiniciar</translation>
@@ -3549,6 +3557,7 @@
 <translation id="6122093587541546701">Email (opcional):</translation>
 <translation id="6122875415561139701">A operação de escrita não é permitida em: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="6124650939968185064">As seguintes extensões dependem desta extensão:</translation>
+<translation id="6127945163801765632">Ativar a secção "todos os marcadores" no gestor de marcadores.</translation>
 <translation id="6129938384427316298">Comentário do certificado Netscape</translation>
 <translation id="6129953537138746214">Espaço</translation>
 <translation id="6132383530370527946">As letras pequenas</translation>
@@ -3575,6 +3584,7 @@
 <translation id="6164005077879661055">Todos os ficheiros e dados locais associados ao utilizador supervisionado serão definitivamente eliminados depois de este utilizador supervisionado ser removido. Os Websites visitados e as definições deste utilizador supervisionado poderão continuar visíveis para o gestor em <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Saiba mais</translation>
 <translation id="6166185671393271715">Importar palavras-passe para o Chrome</translation>
+<translation id="6169666352732958425">Não é possível transmitir o ambiente de trabalho.</translation>
 <translation id="6171550060231646388">Funcionalidades "Ok Google" do hardware simuladas</translation>
 <translation id="6175314957787328458">GUID de Domínio do Windows</translation>
 <translation id="6178664161104547336">Seleccionar um certificado</translation>
@@ -3768,6 +3778,7 @@
 <translation id="6458308652667395253">Gerir bloqueio de JavaScript...</translation>
 <translation id="6459488832681039634">Utilizar selecção para localizar</translation>
 <translation id="6460423884798879930">Ativa a opção para enviar informações de autenticação adicionais no pacote SYN inicial para um cliente ligado anteriormente, permitindo que o envio de dados seja iniciado mais rapidamente.</translation>
+<translation id="6460474910028274178">Aspeto e lógica de acionamento melhorados da IU em balões do Tradutor</translation>
 <translation id="6460601847208524483">Localizar seguinte</translation>
 <translation id="6462080265650314920">As aplicações têm de ser publicadas com o tipo de conteúdo "<ph name="CONTENT_TYPE" />".</translation>
 <translation id="6462082050341971451">Ainda está aí?</translation>
@@ -3897,6 +3908,7 @@
 <translation id="6663792236418322902">A palavra-passe que escolher será necessária para restaurar este ficheiro mais tarde. registe-a num local seguro.</translation>
 <translation id="6664237456442406323">Infelizmente, o seu computador está configurado com um ID de hardware formatado incorretamente. Este facto impede que o SO Chrome faça a atualização das últimas correções de segurança e o seu computador <ph name="BEGIN_BOLD" />pode estar vulnerável a ataques maliciosos<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">com a sua Conta Google</translation>
+<translation id="667517062706956822">Pretende que o Google traduza esta página de <ph name="SOURCE_LANGUAGE" /> para <ph name="TARGET_LANGUAGE" />?</translation>
 <translation id="6675665718701918026">Dispositivo apontador ligado</translation>
 <translation id="6677037229676347494">O ID esperado era "<ph name="EXPECTED_ID" />", mas o ID foi "<ph name="NEW_ID" />".</translation>
 <translation id="6680028776254050810">Mudar Utilizadores</translation>
@@ -3948,6 +3960,7 @@
 <translation id="6746392203843147041">aumentar volume</translation>
 <translation id="6748140994595080445">Altere a forma como a aplicação <ph name="APP_NAME" /> processa e apresenta os idiomas.</translation>
 <translation id="6748465660675848252">Pode continuar, mas apenas os dados e definições sincronizados são restaurados. Todos os dados locais perdem-se.</translation>
+<translation id="6751256176799620176">1 pasta selecionada</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Navegação anónima)</translation>
 <translation id="6759193508432371551">Reposição de dados de fábrica</translation>
 <translation id="6760765581316020278">Teclado vietnamita (VNI)</translation>
@@ -4586,6 +4599,7 @@
 <translation id="7717014941119698257">A transferir: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">A formação expirou</translation>
 <translation id="771953673318695590">Controlo de Qualidade</translation>
+<translation id="7720375555307821262">Para supervisionar esta pessoa, <ph name="BEGIN_LINK" />inicie sessão no Chrome<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">Cortar</translation>
 <translation id="7730449930968088409">Capturar o conteúdo do ecrã</translation>
 <translation id="7730494089396812859">Mostrar detalhes da cópia de segurança na nuvem</translation>
@@ -4679,7 +4693,6 @@
 <translation id="7859704718976024901">Histórico de navegação</translation>
 <translation id="7861215335140947162">&amp;Transferências</translation>
 <translation id="7864539943188674973">Desativar Bluetooth</translation>
-<translation id="7868891395842935202">Ativa a Framework experimental para controlar o acesso às experiências da API.</translation>
 <translation id="7870576007982733437">Utilizar o gestor de transferências do sistema quando aplicável.</translation>
 <translation id="7870790288828963061">Nenhuma aplicação do Quiosque encontrada com uma versão mais recente. Nada a atualizar. Remova a pen USB.</translation>
 <translation id="787150342916295244">Digitalização de cartões de crédito</translation>
@@ -5008,7 +5021,6 @@
 <translation id="8309505303672555187">Seleccionar uma rede:</translation>
 <translation id="8312871300878166382">Colar numa pasta</translation>
 <translation id="8314013494437618358">Composição por subprocessos</translation>
-<translation id="8314576811984836978">Framework experimental.</translation>
 <translation id="8319414634934645341">Utilização alargada da chave</translation>
 <translation id="8322814362483282060">Esta página foi impedida de aceder ao seu microfone.</translation>
 <translation id="8326478304147373412">PKCS #7, cadeia de certificados</translation>
@@ -5069,7 +5081,6 @@
 <translation id="8418240940464873056">Modo Hanja (caracteres chineses)</translation>
 <translation id="8418445294933751433">Mo&amp;strar como separador</translation>
 <translation id="8420060421540670057">Mostrar ficheiros do Google Docs</translation>
-<translation id="8420728540268437431">Esta página está a ser traduzida...</translation>
 <translation id="842274098655511832">Extensões de Rascunho WebGL</translation>
 <translation id="8424039430705546751">para baixo</translation>
 <translation id="8425213833346101688">Alterar</translation>
@@ -5256,6 +5267,7 @@
 <translation id="8690754533598178758">As exceções de microfone do Adobe Flash Player são diferentes.</translation>
 <translation id="8691686986795184760">(Ativado pela política da empresa)</translation>
 <translation id="869257642790614972">Voltar a abrir o separador fechado</translation>
+<translation id="8695770993395462321">CUPS nativo</translation>
 <translation id="8695825812785969222">Abrir &amp;Localização...</translation>
 <translation id="8698464937041809063">Desenho do Google</translation>
 <translation id="869884720829132584">Menu Aplicações</translation>
@@ -5597,6 +5609,7 @@
 <translation id="9189690067274055051">Desbloqueie o telemóvel e aproxime-o do <ph name="DEVICE_TYPE" /> para introduzir.</translation>
 <translation id="9190063653747922532">L2TP/IPSec + chave pré-partilhada</translation>
 <translation id="9201305942933582053">Google Now para Chrome!</translation>
+<translation id="9202646163273566462">Ativa a vista de todos os marcadores como destino predefinido do gestor de marcadores.</translation>
 <translation id="9203398526606335860">Criação de &amp;perfis ativada</translation>
 <translation id="9203478404496196495">Reativar som do separador</translation>
 <translation id="9203962528777363226">O administrador deste dispositivo desativou a adição de novos utilizadores</translation>
@@ -5623,6 +5636,7 @@
 <translation id="939736085109172342">Nova pasta</translation>
 <translation id="940425055435005472">Tamanho do tipo de letra:</translation>
 <translation id="941543339607623937">Chave privada inválida.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{nenhuma}=1{1 aplicação (1 $)}=2{2 aplicações (1 $, 2 $)}other{# aplicações (1 $, 2 $, 3 $)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> está a partilhar um separador do Chrome e o áudio.</translation>
 <translation id="942954117721265519">Não existem imagens neste diretório.</translation>
 <translation id="945522503751344254">Enviar comentários</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index afaa3eb9..c3f7da5f 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608">Extensia <ph name="EXTENSION_NAME" /> (cu ID-ul „<ph name="EXTENSION_ID" />”) nu este permisă în acest tip de sesiune.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Hopa! Generarea cheii private RSA aleatorii nu a reușit.</translation>
+<translation id="1421115928968836111">Astfel, se va anula autorizarea licențelor Flash Player pentru conținutul protejat.</translation>
 <translation id="1425734930786274278">Au fost blocate următoarele cookie-uri (cookie-urile de la terțe părți sunt blocate, fără excepții):</translation>
 <translation id="1426410128494586442">Da</translation>
 <translation id="1427049173708736891">Menține <ph name="DEVICE_TYPE" /> deblocat când telefonul Android este deblocat și în apropiere. Nu este necesar să introduci parola.</translation>
@@ -521,6 +522,7 @@
 <translation id="1707463636381878959">Permite accesul la această rețea altor utilizatori</translation>
 <translation id="1708199901407471282">Când deschizi o pagină web sugerată de pe pagina Filă nouă, dacă este deschisă deja o filă pentru acea sugestie, comută la aceea în loc să încarci sugestia în noua filă.</translation>
 <translation id="1708338024780164500">(Inactivă)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Arhivarea nu a reușit, eroare neașteptată: $1</translation>
 <translation id="1715941336038158809">Nume de utilizator sau parolă nevalidă.</translation>
 <translation id="1717733954209022288">Caseta de selectare pentru salvarea cardului Google Payments</translation>
@@ -797,6 +799,7 @@
 <translation id="2168214441502403371">Tastatură persană</translation>
 <translation id="2168725742002792683">Extensii de fișier</translation>
 <translation id="2169062631698640254">Conectați-vă oricum</translation>
+<translation id="2175042898143291048">Tradu întotdeauna</translation>
 <translation id="2175607476662778685">Bara Lansare rapidă</translation>
 <translation id="2176045495080708525">Acum sunt instalate următoarele extensii:</translation>
 <translation id="2177950615300672361">Fila Incognito: <ph name="TAB_NAME" /></translation>
@@ -1935,7 +1938,6 @@
 <translation id="3688507211863392146">Scrie în fișierele și dosarele pe care le deschideți în aplicație</translation>
 <translation id="3688526734140524629">Schimbați canalul</translation>
 <translation id="3688578402379768763">Actualizat</translation>
-<translation id="3690976161240450479">Nu s-a conectat. Contactează administratorul sau încearcă din nou.</translation>
 <translation id="3693415264595406141">Parolă:</translation>
 <translation id="3694027410380121301">Selectează fila anterioară</translation>
 <translation id="3694678678240097321">Solicită consimțământul utilizatorului pentru o extensie care rulează un script pe pagină, dacă extensia a solicitat permisiunea de a rula la toate adresele URL.</translation>
@@ -2231,6 +2233,7 @@
 <translation id="4116663294526079822">Permiteți întotdeauna pe acest site</translation>
 <translation id="411666854932687641">Memorie privată</translation>
 <translation id="4118990158415604803">Conectarea la alte rețele este dezactivată de administrator.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{și încă una}few{și încă #}other{și încă #}}</translation>
 <translation id="4119828560634133962">Promoțiile de înregistrare în previzualizarea înainte de printare</translation>
 <translation id="4120329147617730038">Un administrator a interzis conectarea multiplă pentru <ph name="USER_EMAIL" />.
 Toți utilizatorii trebuie să se deconecteze pentru a continua.</translation>
@@ -2370,9 +2373,11 @@
 <translation id="4345703751611431217">Incompatibilitate software: aflați mai multe</translation>
 <translation id="4348766275249686434">Culege erorile</translation>
 <translation id="4350019051035968019">Acest dispozitiv nu poate fi înregistrat pe domeniul căruia îi aparține contul dvs., deoarece dispozitivul este asociat pentru gestionare de alt domeniu.</translation>
+<translation id="4354806558096370704">Activează folosirea backendului de printare nativ CUPS.</translation>
 <translation id="4358697938732213860">Adaugă o adresă</translation>
 <translation id="4359408040881008151">Instalată din cauza extensiilor dependente.</translation>
 <translation id="4361190688154226069">Identificare bazată pe dreptunghiuri în vizualizări</translation>
+<translation id="4364414793200746179">Notificare Android MediaStyle</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> a fost descărcat</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> trimite conținutul unei ferestre.</translation>
 <translation id="4364830672918311045">Afișează notificările</translation>
@@ -2775,6 +2780,7 @@
 <translation id="4988792151665380515">Exportul cheii publice nu a reușit.</translation>
 <translation id="49896407730300355">Rotiți în sens &amp;invers acelor de ceasornic</translation>
 <translation id="4989966318180235467">Inspectați pagina de fun&amp;dal</translation>
+<translation id="4990343175649730969">Descarcă Chrome Cleanup Tool</translation>
 <translation id="4991420928586866460">Tastele din rândul de sus sunt considerate taste pentru funcții</translation>
 <translation id="499165176004408815">Utilizați modul de contrast ridicat</translation>
 <translation id="4992066212339426712">Activează sunetul</translation>
@@ -3298,6 +3304,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: selectează pentru a edita</translation>
 <translation id="5741454054957165976">Activează noua versiune a Intervenției user agent pentru încărcarea WebFonts.</translation>
 <translation id="574392208103952083">Medie</translation>
+<translation id="5744368829843057748">Interfața de utilizare pentru Traducere – trimestrul 2, 2016</translation>
 <translation id="5745056705311424885">A fost detectat un stick de memorie USB</translation>
 <translation id="5746169159649715125">Salvați ca PDF</translation>
 <translation id="5747611503456050045">Reîncărcările paginii declanșate de conținutul cu derulare suplimentară pe verticală.</translation>
@@ -3405,6 +3412,7 @@
 <translation id="5884474295213649357">Această filă este conectată la un dispozitiv USB.</translation>
 <translation id="5885324376209859881">Gestionați setările media...</translation>
 <translation id="5889282057229379085">Număr maxim de Autorități de certificare (CA) intermediare: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Spune-ne ce se întâmplă.</translation>
 <translation id="5892290200158927959">Tastatură franceză BÉPO</translation>
 <translation id="5892507820957994680">Suprascrie lista de redare software integrată și activează accelerarea cu GPU pentru configurațiile de sistem neacceptate.</translation>
 <translation id="5895138241574237353">Reîncepe</translation>
@@ -3546,6 +3554,7 @@
 <translation id="6122093587541546701">Adresă de e-mail (opțională):</translation>
 <translation id="6122875415561139701">Operațiunea de scriere nu este permisă pe: „<ph name="DEVICE_NAME" />”.</translation>
 <translation id="6124650939968185064">De această extensie depind următoarele extensii:</translation>
+<translation id="6127945163801765632">Activează secțiunea „toate marcajele” în managerul de marcaje.</translation>
 <translation id="6129938384427316298">Comentariu certificat Netscape</translation>
 <translation id="6129953537138746214">Spațiu</translation>
 <translation id="6132383530370527946">Textul cu caractere mici</translation>
@@ -3572,6 +3581,7 @@
 <translation id="6164005077879661055">Toate fișierele și datele locale asociate acestui utilizator monitorizat vor fi șterse definitiv după eliminarea acestui utilizator monitorizat. Site-urile web accesate și setările acestui utilizator monitorizat pot fi în continuare vizibile pentru manager la <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Află mai multe</translation>
 <translation id="6166185671393271715">Importă parolele în Chrome</translation>
+<translation id="6169666352732958425">Nu se poate proiecta desktopul.</translation>
 <translation id="6171550060231646388">Funcții de tipul „Ok Google” simulate prin hardware</translation>
 <translation id="6175314957787328458">GUID domeniu Microsoft</translation>
 <translation id="6178664161104547336">Selectează un certificat</translation>
@@ -3765,6 +3775,7 @@
 <translation id="6458308652667395253">Gestionează blocarea JavaScript...</translation>
 <translation id="6459488832681039634">Folosește selecția pentru a găsi</translation>
 <translation id="6460423884798879930">Activați opțiunea pentru a trimite informații de autentificare suplimentare în pachetul SYN inițial pentru un client conectat anterior, ceea ce permite o pornire mai rapidă a trimiterii datelor.</translation>
+<translation id="6460474910028274178">Logică de activare și aspect îmbunătățite pentru interfața de utilizare cu baloane pentru Traducere</translation>
 <translation id="6460601847208524483">Următorul</translation>
 <translation id="6462080265650314920">Aplicațiile trebuie să fie difuzate utilizând antetul content-type „<ph name="CONTENT_TYPE" />”.</translation>
 <translation id="6462082050341971451">Mai sunteți aici?</translation>
@@ -3894,6 +3905,7 @@
 <translation id="6663792236418322902">Parola pe care o alegi va fi solicitată ulterior pentru a restabili fișierul. Noteaz-o într-un loc sigur.</translation>
 <translation id="6664237456442406323">Din păcate, computerul dvs. este configurat cu un ID de hardware incorect. Acest lucru împiedică actualizarea sistemului de operare Chrome cu cele mai recente remedieri de securitate. În plus, computerul <ph name="BEGIN_BOLD" />ar putea fi vulnerabil la atacuri ale site-urilor web rău intenționate<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">folosind Contul Google</translation>
+<translation id="667517062706956822">Dorești ca Google să traducă această pagină din <ph name="SOURCE_LANGUAGE" /> în <ph name="TARGET_LANGUAGE" />?</translation>
 <translation id="6675665718701918026">Dispozitivul de indicat este conectat</translation>
 <translation id="6677037229676347494">ID-ul așteptat era „<ph name="EXPECTED_ID" />”, dar ID-ul a fost „<ph name="NEW_ID" />”.</translation>
 <translation id="6680028776254050810">Comutați la alt utilizator</translation>
@@ -3945,6 +3957,7 @@
 <translation id="6746392203843147041">crește volumul</translation>
 <translation id="6748140994595080445">Schimbați modul în care <ph name="APP_NAME" /> gestionează și afișează limbile.</translation>
 <translation id="6748465660675848252">Poți continua, dar numai datele și setările sincronizate vor fi restabilite. Toate datele locale se vor pierde.</translation>
+<translation id="6751256176799620176">Un dosar selectat</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Incognito)</translation>
 <translation id="6759193508432371551">Resetare la setările din fabrică</translation>
 <translation id="6760765581316020278">Tastatură vietnameză (VNI)</translation>
@@ -4583,6 +4596,7 @@
 <translation id="7717014941119698257">Se descarcă: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">Sesiunea de configurare a expirat</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262">Pentru a monitoriza această persoană, <ph name="BEGIN_LINK" />conectează-te la Chrome<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">Decupează</translation>
 <translation id="7730449930968088409">Capturează conținutul ecranului</translation>
 <translation id="7730494089396812859">Afișează detaliile pentru backupul în cloud</translation>
@@ -4676,7 +4690,6 @@
 <translation id="7859704718976024901">Istoricul de navigare</translation>
 <translation id="7861215335140947162">&amp;Descărcări</translation>
 <translation id="7864539943188674973">Dezactivați Bluetooth</translation>
-<translation id="7868891395842935202">Activează Platforma experimentală pentru a controla accesul la experimentele privind API-urile.</translation>
 <translation id="7870576007982733437">Folosește managerul de descărcări al sistemului când este posibil.</translation>
 <translation id="7870790288828963061">Nu s-a găsit nicio aplicație de tip chioșc cu o versiune mai recentă. Nimic de actualizat. Scoate stickul USB.</translation>
 <translation id="787150342916295244">Scanarea cardurilor de credit</translation>
@@ -5005,7 +5018,6 @@
 <translation id="8309505303672555187">Selectați o rețea:</translation>
 <translation id="8312871300878166382">Inserați în dosar</translation>
 <translation id="8314013494437618358">Compunere cu fire de execuție</translation>
-<translation id="8314576811984836978">Platforma experimentală.</translation>
 <translation id="8319414634934645341">Utilizare de cheie extinsă</translation>
 <translation id="8322814362483282060">Accesul acestei pagini la microfonul dvs. a fost blocat.</translation>
 <translation id="8326478304147373412">PKCS #7, lanț de certificate</translation>
@@ -5066,7 +5078,6 @@
 <translation id="8418240940464873056">Mod Hanja</translation>
 <translation id="8418445294933751433">&amp;Afișează ca filă</translation>
 <translation id="8420060421540670057">Afișați fișierele Documente Google</translation>
-<translation id="8420728540268437431">Se traduce pagina...</translation>
 <translation id="842274098655511832">Extensiile nefinalizate WebGL</translation>
 <translation id="8424039430705546751">jos</translation>
 <translation id="8425213833346101688">Modificați</translation>
@@ -5253,6 +5264,7 @@
 <translation id="8690754533598178758">Excepțiile Adobe Flash Player pentru microfon sunt diferite.</translation>
 <translation id="8691686986795184760">(Activat de politica întreprinderii)</translation>
 <translation id="869257642790614972">Redeschide ultima filă închisă</translation>
+<translation id="8695770993395462321">CUPS nativ</translation>
 <translation id="8695825812785969222">Deschide &amp;locația...</translation>
 <translation id="8698464937041809063">Desen Google</translation>
 <translation id="869884720829132584">Meniul aplicațiilor</translation>
@@ -5594,6 +5606,7 @@
 <translation id="9189690067274055051">Pentru acces, deblochează telefonul și apropie-l mai mult de <ph name="DEVICE_TYPE" />.</translation>
 <translation id="9190063653747922532">L2TP/IPSec + cheia predistribuită</translation>
 <translation id="9201305942933582053">Google Now pentru Chrome!</translation>
+<translation id="9202646163273566462">Activează afișarea cu toate marcajele ca destinație prestabilită pentru managerul de marcaje.</translation>
 <translation id="9203398526606335860">&amp;Analizare activată</translation>
 <translation id="9203478404496196495">Activează sunetul filei</translation>
 <translation id="9203962528777363226">Administratorul acestui dispozitiv a dezactivat adăugarea de utilizatori noi</translation>
@@ -5620,6 +5633,7 @@
 <translation id="939736085109172342">Dosar nou</translation>
 <translation id="940425055435005472">Dimensiunea fontului:</translation>
 <translation id="941543339607623937">Cheie privată nevalidă.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{niciuna}=1{1 aplicație ($1)}=2{2 aplicații ($1, $2)}few{# aplicații ($1, $2, $3)}other{# de aplicații ($1, $2, $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> trimite conținutul unei file Chrome și conținutul audio.</translation>
 <translation id="942954117721265519">Nu există imagini în acest director.</translation>
 <translation id="945522503751344254">Trimite feedback</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index fc0c597..ec1bbb8 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608">Расширение "<ph name="EXTENSION_NAME" />" (ID <ph name="EXTENSION_ID" />) запрещено использовать в ходе сеанса этого типа</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Не удалось создать случайный закрытый ключ RSA.</translation>
+<translation id="1421115928968836111">Это отключит лицензии Flash Player для защищенного контента.</translation>
 <translation id="1425734930786274278">Были заблокированы следующие файлы cookie (сторонние файлы cookie блокируются без исключения):</translation>
 <translation id="1426410128494586442">Да</translation>
 <translation id="1427049173708736891">Если <ph name="DEVICE_TYPE" /> находится рядом с телефоном Android и оба устройства разблокированы, вводить пароль не потребуется.</translation>
@@ -521,6 +522,7 @@
 <translation id="1707463636381878959">Разрешить другим пользователям доступ к этой сети</translation>
 <translation id="1708199901407471282">При попытке открыть сайт со страницы быстрого доступа, если этот сайт уже загружен на другой вкладке, переключать меня на эту вкладку</translation>
 <translation id="1708338024780164500">(неактивно)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (идентификатор: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Не удалось выполнить архивирование. Возникла непредвиденная ошибка: $1.</translation>
 <translation id="1715941336038158809">Недействительное имя пользователя или пароль.</translation>
 <translation id="1717733954209022288">Флажок для сохранения карт из Google Payments</translation>
@@ -797,6 +799,7 @@
 <translation id="2168214441502403371">Персидская раскладка</translation>
 <translation id="2168725742002792683">Расширения файлов</translation>
 <translation id="2169062631698640254">Выполнить вход</translation>
+<translation id="2175042898143291048">Всегда переводить</translation>
 <translation id="2175607476662778685">Панель быстрого запуска</translation>
 <translation id="2176045495080708525">Установлены следующие расширения:</translation>
 <translation id="2177950615300672361">Вкладка в режиме инкогнито: <ph name="TAB_NAME" /></translation>
@@ -1937,7 +1940,6 @@
 <translation id="3688507211863392146">Запись данных в файлы и каталоги, открытые в приложении</translation>
 <translation id="3688526734140524629">Выбрать другую версию</translation>
 <translation id="3688578402379768763">Обновление не требуется</translation>
-<translation id="3690976161240450479">Ошибка входа. Обратитесь к системному администратору или повторите попытку.</translation>
 <translation id="3693415264595406141">Пароль:</translation>
 <translation id="3694027410380121301">Выбрать предыдущую вкладку</translation>
 <translation id="3694678678240097321">Если расширение запрашивает разрешение на запуск скрипта на страницах любого сайта, требуется согласие пользователя.</translation>
@@ -2233,6 +2235,7 @@
 <translation id="4116663294526079822">Всегда разрешать на этом сайте</translation>
 <translation id="411666854932687641">Память</translation>
 <translation id="4118990158415604803">Ваш администратор запретил подключение к другим сетям.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{и ещё 1}one{и ещё #}few{и ещё #}many{и ещё #}other{и ещё #}}</translation>
 <translation id="4119828560634133962">Предлагать регистрацию при предварительном просмотре</translation>
 <translation id="4120329147617730038">Администратор отключил множественный вход для аккаунта <ph name="USER_EMAIL" />.
 Прежде чем вы сможете войти в аккаунт, все остальные пользователи должны выйти из него.</translation>
@@ -2372,9 +2375,11 @@
 <translation id="4345703751611431217">Несовместимость программного обеспечения: Подробнее...</translation>
 <translation id="4348766275249686434">Собирать данные об ошибках</translation>
 <translation id="4350019051035968019">Это устройство уже зарегистрировано в другом домене.</translation>
+<translation id="4354806558096370704">Позволяет использовать сервер печати CUPS.</translation>
 <translation id="4358697938732213860">Добавить адрес</translation>
 <translation id="4359408040881008151">Установлено, так как есть зависимые расширения.</translation>
 <translation id="4361190688154226069">Прямоугольная область касания</translation>
+<translation id="4364414793200746179">Оповещение Android MediaStyle</translation>
 <translation id="4364444725319685468">Файл <ph name="FILE_NAME" /> скачан</translation>
 <translation id="4364567974334641491">Приложение "<ph name="APP_NAME" />" предоставило доступ к окну.</translation>
 <translation id="4364830672918311045">Показывать оповещения</translation>
@@ -2778,6 +2783,7 @@
 <translation id="4988792151665380515">Не удалось экспортировать закрытый ключ.</translation>
 <translation id="49896407730300355">Повернуть п&amp;ротив часовой стрелки</translation>
 <translation id="4989966318180235467">Исследовать &amp;фоновую страницу</translation>
+<translation id="4990343175649730969">Скачать Инструмент очистки Chrome</translation>
 <translation id="4991420928586866460">Использовать клавиши верхнего ряда как функциональные</translation>
 <translation id="499165176004408815">Использовать режим высокой контрастности</translation>
 <translation id="4992066212339426712">Включить звук</translation>
@@ -3301,6 +3307,7 @@
 <translation id="5741245087700236983">Редактировать профиль "<ph name="PROFILE_NAME" />"</translation>
 <translation id="5741454054957165976">Разрешать агенту пользователя вмешиваться в загрузку WebFonts (функция обновлена)</translation>
 <translation id="574392208103952083">Средний</translation>
+<translation id="5744368829843057748">Перевод 2016Q2 UI</translation>
 <translation id="5745056705311424885">Обнаружен USB-накопитель</translation>
 <translation id="5746169159649715125">Сохранить как PDF</translation>
 <translation id="5747611503456050045">Включить обновление страницы при прокрутке по вертикали.</translation>
@@ -3408,6 +3415,7 @@
 <translation id="5884474295213649357">Эта вкладка подключена к USB-устройству</translation>
 <translation id="5885324376209859881">Управление настройками мультимедийных устройств...</translation>
 <translation id="5889282057229379085">Максимальное количество промежуточных ЦС: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Описание проблемы.</translation>
 <translation id="5892290200158927959">Французская раскладка (BÉPO)</translation>
 <translation id="5892507820957994680">Переопределяет встроенный список программного рендеринга и активирует графический ускоритель на неподдерживаемых системах.</translation>
 <translation id="5895138241574237353">Перезапустить</translation>
@@ -3549,6 +3557,7 @@
 <translation id="6122093587541546701">Адрес эл. почты (необязательно):</translation>
 <translation id="6122875415561139701">Запись данных на устройстве <ph name="DEVICE_NAME" /> запрещена.</translation>
 <translation id="6124650939968185064">От этих расширений зависят следующие:</translation>
+<translation id="6127945163801765632">Включить раздел "Все закладки" в диспетчере.</translation>
 <translation id="6129938384427316298">Комментарий к сертификату Netscape</translation>
 <translation id="6129953537138746214">Пробел</translation>
 <translation id="6132383530370527946">Лицензионное соглашение</translation>
@@ -3575,6 +3584,7 @@
 <translation id="6164005077879661055">После удаления контролируемого профиля все файлы и локальные данные, связанные с ним, будут удалены. Посещенные страницы и настройки этого профиля будут видны его менеджеру на странице: <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Подробнее...</translation>
 <translation id="6166185671393271715">Импорт паролей в Chrome</translation>
+<translation id="6169666352732958425">Не удается транслировать рабочий стол</translation>
 <translation id="6171550060231646388">Симуляция аппаратных функций "О'кей, Google"</translation>
 <translation id="6175314957787328458">Идентификатор GUID домена Microsoft</translation>
 <translation id="6178664161104547336">Выбор сертификата</translation>
@@ -3768,6 +3778,7 @@
 <translation id="6458308652667395253">Настройки блокирования JavaScript…</translation>
 <translation id="6459488832681039634">Найти выделенное</translation>
 <translation id="6460423884798879930">Обеспечивает отправку дополнительных данных аутентификации в исходном SYN-пакете подключенного клиента, благодаря чему ускоряется обмен данными.</translation>
+<translation id="6460474910028274178">Улучшенный внешний вид и логика запуска.</translation>
 <translation id="6460601847208524483">Найти след.</translation>
 <translation id="6462080265650314920">Приложения должны иметь тип контента "<ph name="CONTENT_TYPE" />".</translation>
 <translation id="6462082050341971451">Вы еще здесь?</translation>
@@ -3897,6 +3908,7 @@
 <translation id="6663792236418322902">Выбранный пароль будет необходим для последующего восстановления этого файла. Сохраните его в безопасном месте.</translation>
 <translation id="6664237456442406323">К сожалению, в настройках компьютера указан недействительный аппаратный код. Chrome OS не сможет устанавливать обновления для системы безопасности, и ваш компьютер <ph name="BEGIN_BOLD" />может подвергаться атакам вредоносных сайтов<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">Введите данные своего аккаунта Google</translation>
+<translation id="667517062706956822">Вы хотите, чтобы Google сделал перевод страницы: <ph name="SOURCE_LANGUAGE" /> &gt;&gt; <ph name="TARGET_LANGUAGE" />?</translation>
 <translation id="6675665718701918026">Подключено дополнительное устройство</translation>
 <translation id="6677037229676347494">Ожидаемый идентификатор: "<ph name="EXPECTED_ID" />", полученный идентификатор: "<ph name="NEW_ID" />".</translation>
 <translation id="6680028776254050810">Смена пользователя</translation>
@@ -3948,6 +3960,7 @@
 <translation id="6746392203843147041">увеличить громкость</translation>
 <translation id="6748140994595080445">Настройка языка интерфейса <ph name="APP_NAME" /> и выбор языков для проверки правописания.</translation>
 <translation id="6748465660675848252">Если вы продолжите сейчас, восстановлены будут только синхронизированные, но не локальные данные.</translation>
+<translation id="6751256176799620176">1 папка выбрана</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (инкогнито)</translation>
 <translation id="6759193508432371551">Сброс настроек</translation>
 <translation id="6760765581316020278">Вьетнамская раскладка (VNI)</translation>
@@ -4587,6 +4600,7 @@
 <translation id="7717014941119698257">Скачивается: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">Время настройки истекло</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262">Чтобы контролировать профиль этого пользователя, <ph name="BEGIN_LINK" />войдите в Chrome<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">Вырезать</translation>
 <translation id="7730449930968088409">Снимок содержания экрана</translation>
 <translation id="7730494089396812859">Показать данные о резервных копиях в облаке</translation>
@@ -4680,7 +4694,6 @@
 <translation id="7859704718976024901">История просмотра веб-страниц</translation>
 <translation id="7861215335140947162">&amp;Загрузки</translation>
 <translation id="7864539943188674973">Отключить Bluetooth</translation>
-<translation id="7868891395842935202">Включить платформу Experimental Framework для управления доступом к экспериментам API.</translation>
 <translation id="7870576007982733437">Использовать системный диспетчер загрузки (если применимо)</translation>
 <translation id="7870790288828963061">Новых версий киоск-приложений нет. Обновление не требуется. Извлеките USB-накопитель.</translation>
 <translation id="787150342916295244">Сканировать кредитные карты</translation>
@@ -5009,7 +5022,6 @@
 <translation id="8309505303672555187">Выберите сеть:</translation>
 <translation id="8312871300878166382">Вставить в папку</translation>
 <translation id="8314013494437618358">Режим вторичного источника</translation>
-<translation id="8314576811984836978">Платформа Experimental Framework</translation>
 <translation id="8319414634934645341">Расширенное использование ключа</translation>
 <translation id="8322814362483282060">Доступ к вашему микрофону для этой страницы заблокирован.</translation>
 <translation id="8326478304147373412">PKCS #7, цепочка сертификатов</translation>
@@ -5070,7 +5082,6 @@
 <translation id="8418240940464873056">Ханчча</translation>
 <translation id="8418445294933751433">&amp;Показать как вкладку</translation>
 <translation id="8420060421540670057">Показать файлы в службе Документов Google</translation>
-<translation id="8420728540268437431">Перевод страницы…</translation>
 <translation id="842274098655511832">Доступ к разрабатываемым расширениям WebGL</translation>
 <translation id="8424039430705546751">вниз</translation>
 <translation id="8425213833346101688">Изменить</translation>
@@ -5257,6 +5268,7 @@
 <translation id="8690754533598178758">Исключения Adobe Flash Player для микрофона отличаются.</translation>
 <translation id="8691686986795184760">(Включен в соответствии с корпоративной политикой.)</translation>
 <translation id="869257642790614972">Открыть последнюю закрытую вкладку</translation>
+<translation id="8695770993395462321">Native CUPS</translation>
 <translation id="8695825812785969222">Открыть &amp;адрес...</translation>
 <translation id="8698464937041809063">Рисунок Google</translation>
 <translation id="869884720829132584">Меню приложений</translation>
@@ -5598,6 +5610,7 @@
 <translation id="9189690067274055051">Чтобы войти, разблокируйте телефон и поднесите его ближе к устройству <ph name="DEVICE_TYPE" />.</translation>
 <translation id="9190063653747922532">L2TP/IPsec + общий ключ</translation>
 <translation id="9201305942933582053">Google Now для Chrome</translation>
+<translation id="9202646163273566462">Включает показ раздела "Все закладки" по умолчанию в диспетчере закладок.</translation>
 <translation id="9203398526606335860">&amp;Сбор данных включен</translation>
 <translation id="9203478404496196495">Включение звука на вкладке</translation>
 <translation id="9203962528777363226">Администратор этого устройства отключил возможность добавлять новых пользователей</translation>
@@ -5624,6 +5637,7 @@
 <translation id="939736085109172342">Новая папка</translation>
 <translation id="940425055435005472">Размер шрифта:</translation>
 <translation id="941543339607623937">Недопустимый открытый ключ.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{нет}=1{1 приложение ($1)}=2{2 приложения ($1 и $2)}one{# приложение ($1, $2, $3)}few{# приложения ($1, $2, $3)}many{# приложений ($1, $2, $3)}other{# приложения ($1, $2, $3)}}</translation>
 <translation id="942532530371314860">Приложение "<ph name="APP_NAME" />" предоставило доступ к вкладке Chrome и к аудио.</translation>
 <translation id="942954117721265519">В этом каталоге нет изображений.</translation>
 <translation id="945522503751344254">Отправить отзыв</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index ff51ee2..1656fd2 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608">Rozšírenie <ph name="EXTENSION_NAME" /> (ID rozšírenia <ph name="EXTENSION_ID" />) nie je v tomto type relácie povolené.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Generovanie náhodného súkromného kľúča RSA žiaľ zlyhalo.</translation>
+<translation id="1421115928968836111">Táto akcia zruší autorizáciu licencií prehrávača Flash Player pre chránený obsah.</translation>
 <translation id="1425734930786274278">Nasledujúce súbory cookie boli zablokované (súbory cookie tretej strany sú blokované bez výnimky):</translation>
 <translation id="1426410128494586442">Áno</translation>
 <translation id="1427049173708736891">Nechajte svoje zariadenie <ph name="DEVICE_TYPE" /> odomknuté, keď máte odomknutý telefón s Androidom, ktorý sa nachádza v okolí. Heslo zadávať nemusíte.</translation>
@@ -521,6 +522,7 @@
 <translation id="1707463636381878959">Zdieľať túto sieť s ďalšími používateľmi</translation>
 <translation id="1708199901407471282">Ak je pri otváraní návrhu zo stránky na novej karte už pre tento návrh otvorená karta, prehliadač ho nenačíta na novej karte, ale prepne sa na príslušnú kartu.</translation>
 <translation id="1708338024780164500">(Neaktívne)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Komprimovanie zlyhalo, neočakávaná chyba: $1</translation>
 <translation id="1715941336038158809">Neplatné meno používateľa alebo heslo.</translation>
 <translation id="1717733954209022288">Začiarkavacie políčko na ukladanie kariet služby Google Payments</translation>
@@ -799,6 +801,7 @@
 <translation id="2168214441502403371">Perzská klávesnica</translation>
 <translation id="2168725742002792683">Rozšírenia súboru</translation>
 <translation id="2169062631698640254">Napriek tomu sa prihlásiť</translation>
+<translation id="2175042898143291048">Vždy prekladať</translation>
 <translation id="2175607476662778685">Panel Rýchle spustenie</translation>
 <translation id="2176045495080708525">Práve sa inštalujú tieto rozšírenia:</translation>
 <translation id="2177950615300672361">Karta inkognito: <ph name="TAB_NAME" /></translation>
@@ -1937,7 +1940,6 @@
 <translation id="3688507211863392146">Zapisovať do súborov a priečinkov, ktoré v aplikácii otvoríte</translation>
 <translation id="3688526734140524629">Zmeniť kanál</translation>
 <translation id="3688578402379768763">Aktuálne</translation>
-<translation id="3690976161240450479">Prihlásenie zlyhalo. Kontaktujte svojho správcu alebo to skúste znova.</translation>
 <translation id="3693415264595406141">Heslo:</translation>
 <translation id="3694027410380121301">Vybrať predchádzajúcu kartu</translation>
 <translation id="3694678678240097321">Vyžaduje súhlas používateľa pre rozšírenie vykonávajúce skript na stránke v prípade, že toto rozšírenie žiada o povolenie spustiť skript na všetkých webových adresách.</translation>
@@ -2233,6 +2235,7 @@
 <translation id="4116663294526079822">Vždy povoliť na týchto stránkach</translation>
 <translation id="411666854932687641">Súkromná pamäť</translation>
 <translation id="4118990158415604803">Pripojenie k iným sieťam je zakázané vaším správcom.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{a 1 ďalšia}few{a # ďalšie}many{a # ďalšej}other{a # ďalších}}</translation>
 <translation id="4119828560634133962">Propagácia registrácie v ukážke tlače</translation>
 <translation id="4120329147617730038">Správca zakázal viacnásobné prihlásenie pre používateľa <ph name="USER_EMAIL" />.
 Všetci používatelia sa musia odhlásiť a až potom môžu pokračovať.</translation>
@@ -2372,9 +2375,11 @@
 <translation id="4345703751611431217">Nekompatibilita softvéru: viac informácií</translation>
 <translation id="4348766275249686434">Zhromažďovanie chýb</translation>
 <translation id="4350019051035968019">Toto zariadenie nemôže byť zaregistrované do domény vášho účtu, pretože je označené ako spravované inou doménou.</translation>
+<translation id="4354806558096370704">Povoľuje používanie natívnej tlače CUPS na strane servera.</translation>
 <translation id="4358697938732213860">Pridať adresu</translation>
 <translation id="4359408040881008151">Nainštalované pre závislé rozšírenia.</translation>
 <translation id="4361190688154226069">Zacielenie prostredníctvom plochy v tvare obdĺžnika v zobrazeniach</translation>
+<translation id="4364414793200746179">Upozornenie Android MediaStyle</translation>
 <translation id="4364444725319685468">Súbor <ph name="FILE_NAME" /> je stiahnutý</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> zdieľa okno.</translation>
 <translation id="4364830672918311045">Zobrazovať upozornenia</translation>
@@ -2777,6 +2782,7 @@
 <translation id="4988792151665380515">Exportovanie verejného kľúča zlyhalo.</translation>
 <translation id="49896407730300355">Otočiť &amp;proti smeru hodinových ručičiek</translation>
 <translation id="4989966318180235467">Skontrolovať &amp;stránku na pozadí</translation>
+<translation id="4990343175649730969">Stiahnuť Chrome Cleanup Tool</translation>
 <translation id="4991420928586866460">Považovať klávesy v hornom riadku za funkčné klávesy</translation>
 <translation id="499165176004408815">Použiť režim s vysokým kontrastom</translation>
 <translation id="4992066212339426712">Obnoviť zvuk</translation>
@@ -3300,6 +3306,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: vybrať a upraviť</translation>
 <translation id="5741454054957165976">Povolenie novej verzie intervencie používateľského agenta pri načítavaní webového písma WebFonts.</translation>
 <translation id="574392208103952083">Stredné</translation>
+<translation id="5744368829843057748">Prekladač s používateľským rozhraním z 2. kvartálu 2016</translation>
 <translation id="5745056705311424885">Zistila sa prítomnosť pamäťového kľúča USB</translation>
 <translation id="5746169159649715125">Uložiť ako PDF</translation>
 <translation id="5747611503456050045">Opätovné načítania stránky aktivované zvislým posúvaním obsahu.</translation>
@@ -3407,6 +3414,7 @@
 <translation id="5884474295213649357">Táto karta je pripojená k zariadeniu USB.</translation>
 <translation id="5885324376209859881">Spravovať nastavenia médií...</translation>
 <translation id="5889282057229379085">Maximálny počet sprostredkujúcich certifikačných autorít: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Povedzte nám, čo sa deje.</translation>
 <translation id="5892290200158927959">Francúzska klávesnica BÉPO</translation>
 <translation id="5892507820957994680">Prepíše zabudovaný zoznam softvérového vykresľovania a povolí akceleráciu pomocou grafickej karty v systémoch s nepodporovanými konfiguráciami.</translation>
 <translation id="5895138241574237353">Reštartovať</translation>
@@ -3550,6 +3558,7 @@
 <translation id="6122093587541546701">E-mail (voliteľné):</translation>
 <translation id="6122875415561139701">Operácia zápisu je na zariadení <ph name="DEVICE_NAME" /> zakázaná.</translation>
 <translation id="6124650939968185064">Od tohto rozšírenia závisia nasledujúce rozšírenia:</translation>
+<translation id="6127945163801765632">Povolenie sekcie „všetky záložky“ v správcovi záložiek</translation>
 <translation id="6129938384427316298">Netscape – komentár certifikátu</translation>
 <translation id="6129953537138746214">Medzera</translation>
 <translation id="6132383530370527946">Zmluvné podmienky</translation>
@@ -3576,6 +3585,7 @@
 <translation id="6164005077879661055">Všetky súbory a miestne údaje spojené s týmto kontrolovaným používateľom budú po jeho odstránení natrvalo odstránené. Správca bude môcť naďalej zobraziť navštívené webové stránky a nastavenia tohto používateľa na adrese <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Viac informácií</translation>
 <translation id="6166185671393271715">Import hesiel do Chromu</translation>
+<translation id="6169666352732958425">Plochu sa nepodarilo prenášať.</translation>
 <translation id="6171550060231646388">Simulované hardvérové funkcie Ok Google</translation>
 <translation id="6175314957787328458">Identifikátor GUID domény spoločnosti Microsoft</translation>
 <translation id="6178664161104547336">Vybrať certifikát</translation>
@@ -3769,6 +3779,7 @@
 <translation id="6458308652667395253">Spravovať blokovanie pre JavaScript...</translation>
 <translation id="6459488832681039634">Použiť výber na hľadanie</translation>
 <translation id="6460423884798879930">Povolí možnosť odosielania dodatočných overovacích informácií v počiatočnom balíku SYN predošlého pripojeného klienta a umožní tak rýchlejší štart odosielania údajov.</translation>
+<translation id="6460474910028274178">Zlepšená logika spúšťania a vzhľad používateľského rozhrania bubliny prekladača</translation>
 <translation id="6460601847208524483">Nájsť ďalšie</translation>
 <translation id="6462080265650314920">Aplikácie musia byť poskytované s typom obsahu „<ph name="CONTENT_TYPE" />“.</translation>
 <translation id="6462082050341971451">Ste tam ešte?</translation>
@@ -3898,6 +3909,7 @@
 <translation id="6663792236418322902">Zvolené heslo budete neskôr potrebovať na obnovenie tohto súboru. Zapíšte si ho na bezpečné miesto.</translation>
 <translation id="6664237456442406323">Váš počítač je žiaľ nakonfigurovaný pomocou poškodeného ID hardvéru. Systému Chrome OS to zabraňuje získať aktualizácie s najnovšími opravami zabezpečenia a váš počítač <ph name="BEGIN_BOLD" />môže byť zraniteľný voči škodlivým útokom<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">pomocou účtu Google</translation>
+<translation id="667517062706956822">Chcete, aby Google preložil túto stránku z jazyka <ph name="SOURCE_LANGUAGE" /> do jazyka <ph name="TARGET_LANGUAGE" />?</translation>
 <translation id="6675665718701918026">Bolo pripojené ukazovacie zariadenie</translation>
 <translation id="6677037229676347494">Očakávané ID bolo „<ph name="EXPECTED_ID" />“. Skutočné ID bolo „<ph name="NEW_ID" />“.</translation>
 <translation id="6680028776254050810">Prepnutie používateľov</translation>
@@ -3949,6 +3961,7 @@
 <translation id="6746392203843147041">zvýšiť hlasitosť</translation>
 <translation id="6748140994595080445">Zmena spôsobu, akým aplikácia <ph name="APP_NAME" /> spracováva a zobrazuje jazyky.</translation>
 <translation id="6748465660675848252">Môžete pokračovať, ale obnovia sa iba vaše synchronizované údaje a nastavenia. Všetky miestne údaje stratíte.</translation>
+<translation id="6751256176799620176">1 vybratý súbor</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Inkognito)</translation>
 <translation id="6759193508432371551">Obnovenie výrobných nastavení</translation>
 <translation id="6760765581316020278">Vietnamská klávesnica (VNI)</translation>
@@ -4589,6 +4602,7 @@
 <translation id="7717014941119698257">Sťahovanie: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">Časový limit cvičenia vypršal</translation>
 <translation id="771953673318695590">Kontrola kvality</translation>
+<translation id="7720375555307821262">Ak chcete kontrolovať túto osobu, <ph name="BEGIN_LINK" />prihláste sa do Chromu<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">Vystrihnúť</translation>
 <translation id="7730449930968088409">Zachytiť obsah obrazovky</translation>
 <translation id="7730494089396812859">Zobraziť podrobnosti zálohy v cloude</translation>
@@ -4682,7 +4696,6 @@
 <translation id="7859704718976024901">História prehliadania</translation>
 <translation id="7861215335140947162">&amp;Preberanie</translation>
 <translation id="7864539943188674973">Zakázať rozhranie Bluetooth</translation>
-<translation id="7868891395842935202">Povolí experimentálnu architektúru na kontrolovanie prístupu k experimentom rozhraní API.</translation>
 <translation id="7870576007982733437">Ak je to možné, použiť systémového správcu sťahovania.</translation>
 <translation id="7870790288828963061">Nenašli sa žiadne aplikácie Kiosku s novšou verziou. Nie je čo aktualizovať. Odoberte kľúč USB.</translation>
 <translation id="787150342916295244">Skenovanie kreditných kariet</translation>
@@ -5012,7 +5025,6 @@
 <translation id="8309505303672555187">Vyberte sieť:</translation>
 <translation id="8312871300878166382">Prilepiť do priečinka</translation>
 <translation id="8314013494437618358">Postupné skladanie</translation>
-<translation id="8314576811984836978">Experimentálna architektúra</translation>
 <translation id="8319414634934645341">Rozšírené použitie kľúča</translation>
 <translation id="8322814362483282060">Táto stránka má zablokovaný prístup k mikrofónu.</translation>
 <translation id="8326478304147373412">Štandard PKCS #7, certifikačná reťaz</translation>
@@ -5073,7 +5085,6 @@
 <translation id="8418240940464873056">Režim Hanja</translation>
 <translation id="8418445294933751433">&amp;Zobraziť ako kartu</translation>
 <translation id="8420060421540670057">Zobraziť súbory služby Dokumenty Google</translation>
-<translation id="8420728540268437431">Prebieha preklad tejto stránky...</translation>
 <translation id="842274098655511832">Rozšírenia jazyka WebGL v stave konceptu</translation>
 <translation id="8424039430705546751">dole</translation>
 <translation id="8425213833346101688">Zmeniť</translation>
@@ -5260,6 +5271,7 @@
 <translation id="8690754533598178758">Výnimky pre mikrofón v prehrávači Adobe Flash Player sú odlišné.</translation>
 <translation id="8691686986795184760">(Povolené pravidlami pre podniky)</translation>
 <translation id="869257642790614972">Znova otvoriť naposledy zavretú kartu</translation>
+<translation id="8695770993395462321">Natívny protokol CUPS</translation>
 <translation id="8695825812785969222">Otvoriť &amp;umiestnenie...</translation>
 <translation id="8698464937041809063">Kresba Google</translation>
 <translation id="869884720829132584">Ponuka Aplikácie</translation>
@@ -5601,6 +5613,7 @@
 <translation id="9189690067274055051">Ak chcete získať prístup do zariadenia <ph name="DEVICE_TYPE" />, odomknite svoj telefón a priblížte ho k nemu.</translation>
 <translation id="9190063653747922532">L2TP/IPSec + predzdieľaný kľúč</translation>
 <translation id="9201305942933582053">Asistent Google pre prehliadač Chrome!</translation>
+<translation id="9202646163273566462">Povolí zobrazenie všetkých záložiek ako predvolený cieľ správcu záložiek.</translation>
 <translation id="9203398526606335860">&amp;Profilovanie povolené</translation>
 <translation id="9203478404496196495">Obnoviť zvuk karty</translation>
 <translation id="9203962528777363226">Správca tohto zariadenia zakázal pridávanie nových používateľov</translation>
@@ -5627,6 +5640,7 @@
 <translation id="939736085109172342">Nový priečinok</translation>
 <translation id="940425055435005472">Veľkosť písma:</translation>
 <translation id="941543339607623937">Neplatný súkromný kľúč.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{žiadne}=1{1 aplikácia ($1)}=2{2 aplikácie ($1, $2)}few{# aplikácie ($1, $2, $3)}many{# aplikácie ($1, $2, $3)}other{# aplikácií ($1, $2, $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> zdieľa kartu a zvuk Chromu.</translation>
 <translation id="942954117721265519">V tomto adresári nie sú žiadne obrázky.</translation>
 <translation id="945522503751344254">Poslať spätnú väzbu</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index 9808e91..8016954 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608">Razširitev <ph name="EXTENSION_NAME" /> (ID razširitve »<ph name="EXTENSION_ID" />«) ni dovoljena v seji te vrste.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Ups! Ni bilo mogoče generirati naključnega zasebnega ključa RSA.</translation>
+<translation id="1421115928968836111">S tem bodo razveljavljene licence predvajalnika Flash Player za zaščiteno vsebino.</translation>
 <translation id="1425734930786274278">Ti piškotki so bili blokirani (piškotki drugih mest se blokirajo brez izjeme):</translation>
 <translation id="1426410128494586442">Da</translation>
 <translation id="1427049173708736891">Naprava <ph name="DEVICE_TYPE" /> je odklenjena, ko je telefon s sistemom Android odklenjen in v bližini – ni vam treba vnesti gesla.</translation>
@@ -522,6 +523,7 @@
 <translation id="1707463636381878959">Skupna raba tega omrežja z drugimi uporabniki</translation>
 <translation id="1708199901407471282">Če je pri odpiranju predlagane spletne strani s strani »Nov zavihek« zavihek za predlog že odprt, preklopi na tisti zavihek namesto nalaganja predloga na novem zavihku.</translation>
 <translation id="1708338024780164500">(Neaktivno)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Ustvarjanje datoteke zip ni uspelo, nepričakovana napaka: $1</translation>
 <translation id="1715941336038158809">Neveljavno uporabniško ime ali geslo.</translation>
 <translation id="1717733954209022288">Potrditveno polje za shranjevanje kartice za Google Payments</translation>
@@ -799,6 +801,7 @@
 <translation id="2168214441502403371">Tipkovnica za perzijščino</translation>
 <translation id="2168725742002792683">Datotečna pripona</translation>
 <translation id="2169062631698640254">Kljub temu se želim prijaviti</translation>
+<translation id="2175042898143291048">Vedno izvedi to</translation>
 <translation id="2175607476662778685">Vrstica za hitri zagon</translation>
 <translation id="2176045495080708525">Nameščene so te razširitve:</translation>
 <translation id="2177950615300672361">Zavihek za način brez beleženja zgodovine: <ph name="TAB_NAME" /></translation>
@@ -1938,7 +1941,6 @@
 <translation id="3688507211863392146">Zapisovanje v datoteke in mape, ki jih odprete v aplikaciji</translation>
 <translation id="3688526734140524629">Spremeni kanal</translation>
 <translation id="3688578402379768763">Je posodobljeno</translation>
-<translation id="3690976161240450479">Prijava ni uspela. Obrnite se na skrbnika in poskusite znova.</translation>
 <translation id="3693415264595406141">Geslo:</translation>
 <translation id="3694027410380121301">Izberi prejšnji zavihek</translation>
 <translation id="3694678678240097321">Zahteva privolitev uporabnika za razširitev, ki izvaja skript na strani, če je razširitev zahtevala dovoljenje za izvajanje na vseh URL-jih.</translation>
@@ -2234,6 +2236,7 @@
 <translation id="4116663294526079822">Vedno dovoli na tem spletnem mestu</translation>
 <translation id="411666854932687641">Zasebni pomnilnik</translation>
 <translation id="4118990158415604803">Povezovanje z drugimi omrežji je onemogočil skrbnik.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{in še 1}one{in še #}two{in še #}few{in še #}other{in še #}}</translation>
 <translation id="4119828560634133962">Oglasi za registracijo v predogledu tiskanja</translation>
 <translation id="4120329147617730038">Skrbnik je prepovedal prijavo z več računi za <ph name="USER_EMAIL" />.
 Če želite nadaljevati, morajo biti odjavljeni vsi uporabniki.</translation>
@@ -2373,9 +2376,11 @@
 <translation id="4345703751611431217">Nezdružljiva programska oprema: več informacij</translation>
 <translation id="4348766275249686434">Zbiranje napak</translation>
 <translation id="4350019051035968019">Te naprave ni mogoče včlaniti v domeno vašega računa, ker je naprava označena za upravljanje v drugi domeni.</translation>
+<translation id="4354806558096370704">Omogoča uporabo izvornega zalednega dela za tiskanje CUPS.</translation>
 <translation id="4358697938732213860">Dodajanje naslova </translation>
 <translation id="4359408040881008151">Nameščeno zaradi odvisnih razširitev.</translation>
 <translation id="4361190688154226069">Ciljanje na podlagi pravokotnika v pogledih</translation>
+<translation id="4364414793200746179">Obvestilo Android MediaStyle</translation>
 <translation id="4364444725319685468">Datoteka <ph name="FILE_NAME" /> je prenesena</translation>
 <translation id="4364567974334641491">Aplikacija <ph name="APP_NAME" /> je v skupno rabo dala okno.</translation>
 <translation id="4364830672918311045">Prikaz obvestil</translation>
@@ -2779,6 +2784,7 @@
 <translation id="4988792151665380515">Javnega ključa ni bilo mogoče izvoziti.</translation>
 <translation id="49896407730300355">Zasukaj v o&amp;bratni smeri urinega kazalca</translation>
 <translation id="4989966318180235467">Preglej stran v ozadju</translation>
+<translation id="4990343175649730969">Prenesite Chromovo orodje za čiščenje</translation>
 <translation id="4991420928586866460">Obravnavaj tipke v zgornji vrstici kot funkcijske tipke</translation>
 <translation id="499165176004408815">Uporabi visokokontrastni način</translation>
 <translation id="4992066212339426712">Vklopi zvok</translation>
@@ -3303,6 +3309,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: izberite, če želite urejati</translation>
 <translation id="5741454054957165976">Omogočanje nove različice posredovanja uporabnikovega posrednika za nalaganje spletnih pisav.</translation>
 <translation id="574392208103952083">Srednja</translation>
+<translation id="5744368829843057748">Uporabniški vmesnik Prevajalnika (2. četrtletje 2016)</translation>
 <translation id="5745056705311424885">Zaznan je pomnilnik USB</translation>
 <translation id="5746169159649715125">Shrani kot PDF</translation>
 <translation id="5747611503456050045">Vnovična nalaganja strani, ki jih sproži navpično vlečenje vsebine.</translation>
@@ -3410,6 +3417,7 @@
 <translation id="5884474295213649357">Ta zavihek je povezan z napravo USB.</translation>
 <translation id="5885324376209859881">Upravljanje nastavitev predstavnosti ...</translation>
 <translation id="5889282057229379085">Največje število posrednih overiteljev potrdil: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Povejte nam, kaj se dogaja.</translation>
 <translation id="5892290200158927959">Francoska tipkovnica – BÉPO</translation>
 <translation id="5892507820957994680">Preglasi vgrajen seznam za programsko upodabljanje in omogoči strojno pospeševanje grafike v nepodprtih sistemskih konfiguracijah.</translation>
 <translation id="5895138241574237353">Znova zaženi</translation>
@@ -3553,6 +3561,7 @@
 <translation id="6122093587541546701">E-poštni naslov (izbirno):</translation>
 <translation id="6122875415561139701">V tej napravi ni dovoljeno dejanje pisanja: »<ph name="DEVICE_NAME" />«.</translation>
 <translation id="6124650939968185064">Od te razširitve so odvisne naslednje razširitve:</translation>
+<translation id="6127945163801765632">Omogočanje razdelka »vsi zaznamki« v upravitelju zaznamkov.</translation>
 <translation id="6129938384427316298">Pripomba o Netscapeovem potrdilu</translation>
 <translation id="6129953537138746214">Presledek</translation>
 <translation id="6132383530370527946">Drobni tisk</translation>
@@ -3579,6 +3588,7 @@
 <translation id="6164005077879661055">Vse datoteke in lokalni podatki, povezani z zaščitenim uporabnikom, bodo trajno izbrisani, ko ga odstranite. Obiskana spletna mesta in nastavitve tega uporabnika bodo morda še vedno vidna upravitelju na <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Več o tem</translation>
 <translation id="6166185671393271715">Uvoz gesel v Chrome</translation>
+<translation id="6169666352732958425">Namizja ni mogoče predvajati.</translation>
 <translation id="6171550060231646388">Simulirane funkcije »Ok Google« strojne opreme</translation>
 <translation id="6175314957787328458">GUID Microsoftove domene</translation>
 <translation id="6178664161104547336">Izberite potrdilo</translation>
@@ -3771,6 +3781,7 @@
 <translation id="6458308652667395253">Upravljanje blokiranja za JavaScript ...</translation>
 <translation id="6459488832681039634">Uporabi izbor za iskanje</translation>
 <translation id="6460423884798879930">To možnost omogočite, če želite za odjemalca, ki je že bil povezan, v začetnem paketu SYN poslati dodatne podatke za preverjanje pristnosti, tako da bo začetek pošiljanja podatkov hitrejši.</translation>
+<translation id="6460474910028274178">Izboljšana logika sprožanja in videz uporabniškega vmesnika za Prevajalnik z oblački</translation>
 <translation id="6460601847208524483">Poišči naslednje</translation>
 <translation id="6462080265650314920">Aplikacije morajo biti opremljene z vrsto vsebine »<ph name="CONTENT_TYPE" />«.</translation>
 <translation id="6462082050341971451">Ste še vedno z nami?</translation>
@@ -3900,6 +3911,7 @@
 <translation id="6663792236418322902">Izbrano geslo boste pozneje potrebovali za obnovitev te datoteke. Zapišite ga na varno mesto.</translation>
 <translation id="6664237456442406323">Vaš računalnik je konfiguriran s popačenim ID-jem strojne opreme. Zaradi tega Chrome OS ne more namestiti najnovejših varnostnih popravkov in vaš računalnik <ph name="BEGIN_BOLD" />je lahko še bolj izpostavljen zlonamernim napadom<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">z Google Računom</translation>
+<translation id="667517062706956822">Ali želite, da Google prevede to stran iz jezika <ph name="SOURCE_LANGUAGE" /> v jezik <ph name="TARGET_LANGUAGE" />?</translation>
 <translation id="6675665718701918026">Priključena je kazalna naprava</translation>
 <translation id="6677037229676347494">Pričakovani ID je »<ph name="EXPECTED_ID" />«, toda ID je bil »<ph name="NEW_ID" />«.</translation>
 <translation id="6680028776254050810">Preklopi med uporabniki</translation>
@@ -3951,6 +3963,7 @@
 <translation id="6746392203843147041">zvišanje glasnosti</translation>
 <translation id="6748140994595080445">Izberite način obdelave in prikaza jezikov v aplikaciji <ph name="APP_NAME" /></translation>
 <translation id="6748465660675848252">Lahko nadaljujete, toda obnovljeni bodo samo sinhronizirani podatki in nastavitve. Vsi lokalni podatki bodo izgubljeni.</translation>
+<translation id="6751256176799620176">Izbrana je 1 mapa</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (način brez beleženja zgodovine)</translation>
 <translation id="6759193508432371551">Ponastavitev na tovarniške nastavitve</translation>
 <translation id="6760765581316020278">Tipkovnica za vietnamščino (VNI)</translation>
@@ -4589,6 +4602,7 @@
 <translation id="7717014941119698257">Prenos: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">Časovna omejitev usposabljanja je potekla</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262">Če želite nadzirati to osebo, <ph name="BEGIN_LINK" />se prijavite v Chrome<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">Izreži</translation>
 <translation id="7730449930968088409">Zajem vsebine zaslona</translation>
 <translation id="7730494089396812859">Prikaz podrobnosti varnostnega kopiranja v oblak</translation>
@@ -4682,7 +4696,6 @@
 <translation id="7859704718976024901">Zgodovina brskanja</translation>
 <translation id="7861215335140947162">&amp;Prenosi</translation>
 <translation id="7864539943188674973">Onemogoči Bluetooth</translation>
-<translation id="7868891395842935202">Omogoča poskusno ogrodje za nadziranje dostopa do poskusov z API-ji.</translation>
 <translation id="7870576007982733437">Uporaba sistemskega upravitelja prenosov, ko je to potrebno.</translation>
 <translation id="7870790288828963061">Ni aplikacij za kiosk z novejšo različico. Ni česa posodobiti. Odstranite ključek USB.</translation>
 <translation id="787150342916295244">Optično branje kreditnih kartic</translation>
@@ -5012,7 +5025,6 @@
 <translation id="8309505303672555187">Izberite omrežje:</translation>
 <translation id="8312871300878166382">Prilepi v mapo</translation>
 <translation id="8314013494437618358">Nitno sestavljanje</translation>
-<translation id="8314576811984836978">Poskusno ogrodje.</translation>
 <translation id="8319414634934645341">Razširjena raba ključa</translation>
 <translation id="8322814362483282060">Tej strani je onemogočen dostop do mikrofona.</translation>
 <translation id="8326478304147373412">PKCS #7, veriga potrdil</translation>
@@ -5073,7 +5085,6 @@
 <translation id="8418240940464873056">Način Hanja</translation>
 <translation id="8418445294933751433">&amp;Prikaži kot zavihek</translation>
 <translation id="8420060421540670057">Prikaži datoteke Google Dokumentov</translation>
-<translation id="8420728540268437431">Ta stran se prevaja ...</translation>
 <translation id="842274098655511832">Osnutek razširitev WebGL</translation>
 <translation id="8424039430705546751">dol</translation>
 <translation id="8425213833346101688">Spremeni</translation>
@@ -5261,6 +5272,7 @@
 <translation id="8690754533598178758">Izjeme za kamero za Adobe Flash Player so drugačne.</translation>
 <translation id="8691686986795184760">(Omogočeno s pravilnikom podjetja)</translation>
 <translation id="869257642790614972">Znova odpre nazadnje odprt zavihek</translation>
+<translation id="8695770993395462321">Izvorni CUPS</translation>
 <translation id="8695825812785969222">Odpri &amp;mesto ...</translation>
 <translation id="8698464937041809063">Googlova risba</translation>
 <translation id="869884720829132584">Meni programov</translation>
@@ -5603,6 +5615,7 @@
 <translation id="9189690067274055051">Odklenite telefon in ga približajte napravi <ph name="DEVICE_TYPE" />, če želite dostopati do nje.</translation>
 <translation id="9190063653747922532">L2TP/IPsec + ključ v vnaprejšnji skupni rabi</translation>
 <translation id="9201305942933582053">Asistent Google za Chrome.</translation>
+<translation id="9202646163273566462">Omogoča pogled vseh zaznamkov kot privzeti cilj upravitelja zaznamkov.</translation>
 <translation id="9203398526606335860">&amp;Profiliranje omogočeno</translation>
 <translation id="9203478404496196495">Vklop zvoka zavihka</translation>
 <translation id="9203962528777363226">Skrbnik te naprave je onemogočil dodajanje novih uporabnikov</translation>
@@ -5629,6 +5642,7 @@
 <translation id="939736085109172342">Nova mapa</translation>
 <translation id="940425055435005472">Velikost pisave:</translation>
 <translation id="941543339607623937">Neveljaven zasebni ključ.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{nič}=1{1 aplikacija ($1)}=2{2 aplikaciji ($1, $2)}one{# aplikacija ($1, $2, $3)}two{# aplikaciji ($1, $2, $3)}few{# aplikacije ($1, $2, $3)}other{# aplikacij ($1, $2, $3)}}</translation>
 <translation id="942532530371314860">Aplikacija <ph name="APP_NAME" /> je v skupno rabo dala zavihek v Chromu in zvok.</translation>
 <translation id="942954117721265519">V tem imeniku ni slik.</translation>
 <translation id="945522503751344254">Pošlji povratne informacije</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index 9911e78..7b12f1093 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (ИД додатка „<ph name="EXTENSION_ID" />“) није дозвољен у овом типу сесије.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Генерисање насумичног RSA приватног кључа није успело.</translation>
+<translation id="1421115928968836111">Тако ћете опозвати овлашћење за Flash Player лиценце за заштићени садржај.</translation>
 <translation id="1425734930786274278">Следећи колачићи су блокирани (колачићи треће стране се блокирају без изузетка):</translation>
 <translation id="1426410128494586442">Да</translation>
 <translation id="1427049173708736891">Нека <ph name="DEVICE_TYPE" /> увек буде откључан када је Android телефон откључан и у околини – нема потребе да уносите лозинку.</translation>
@@ -518,6 +519,7 @@
 <translation id="1707463636381878959">Дели ову мрежу са другим корисницима</translation>
 <translation id="1708199901407471282">Када отварате предложену веб-страницу са странице нове картице, а одређена картица је већ отворена за тај предлог, пребаците на ту картицу уместо да учитавате предлог на новој картици.</translation>
 <translation id="1708338024780164500">(Неактивно)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (ИД: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Додавање у zip датотеку није успело, неочекивана грешка: $1</translation>
 <translation id="1715941336038158809">Неважеће корисничко име или лозинка.</translation>
 <translation id="1717733954209022288">Поље за потврду за чување картице за Google Payments</translation>
@@ -795,6 +797,7 @@
 <translation id="2168214441502403371">Персијска тастатура</translation>
 <translation id="2168725742002792683">Ознаке типа датотека </translation>
 <translation id="2169062631698640254">Ипак ме пријави</translation>
+<translation id="2175042898143291048">Увек ради ово</translation>
 <translation id="2175607476662778685">Трака „Брзо покретање“</translation>
 <translation id="2176045495080708525">Управо су инсталирани следећи додаци:</translation>
 <translation id="2177950615300672361">Картица Без архивирања: <ph name="TAB_NAME" /></translation>
@@ -1933,7 +1936,6 @@
 <translation id="3688507211863392146">Уписивање у датотеке и директоријуме које отворите у апликацији</translation>
 <translation id="3688526734140524629">Промени канал</translation>
 <translation id="3688578402379768763">Ажурирано</translation>
-<translation id="3690976161240450479">Пријављивање није успело. Контактирајте администратора или покушајте поново.</translation>
 <translation id="3693415264595406141">Лозинка:</translation>
 <translation id="3694027410380121301">Изабери претходну картицу</translation>
 <translation id="3694678678240097321">Захтева пристанак корисника за додатак који користи скрипт на страници ако додатак затражи дозволу за покретање на свим URL-овима.</translation>
@@ -2229,6 +2231,7 @@
 <translation id="4116663294526079822">Увек дозволи на овом сајту</translation>
 <translation id="411666854932687641">Приватна меморија</translation>
 <translation id="4118990158415604803">Администратор је онемогућио повезивање са другим мрежама.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{ и још 1}one{и још #}few{и још #}other{и још #}}</translation>
 <translation id="4119828560634133962">Промоције за регистрацију из прегледа пре штампања</translation>
 <translation id="4120329147617730038">Администратор је забранио вишеструко пријављивање за <ph name="USER_EMAIL" />.
 Сви корисници морају да се одјаве да бисмо наставили са сесијом.</translation>
@@ -2368,9 +2371,11 @@
 <translation id="4345703751611431217">Софтвер није компатибилан: Сазнајте више</translation>
 <translation id="4348766275249686434">Прикупљај грешке</translation>
 <translation id="4350019051035968019">Овај уређај не може да се региструје на домену коме припада ваш налог јер је означен као уређај којим управља други домен.</translation>
+<translation id="4354806558096370704">Омогућава коришћење матичног CUPS позадинског механизама за штампање.</translation>
 <translation id="4358697938732213860">Додај адресу</translation>
 <translation id="4359408040881008151">Инсталиран је због зависних додатака.</translation>
 <translation id="4361190688154226069">Циљање у приказима засновано на правоугаоним површинама</translation>
+<translation id="4364414793200746179">Android MediaStyle обавештење</translation>
 <translation id="4364444725319685468">Преузели сте <ph name="FILE_NAME" /></translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> дели прозор.</translation>
 <translation id="4364830672918311045">Приказуј обавештења</translation>
@@ -2774,6 +2779,7 @@
 <translation id="4988792151665380515">Извоз јавног кључа није успео.</translation>
 <translation id="49896407730300355">Окрећи у с&amp;меру супротном од кретања казаљке на сату</translation>
 <translation id="4989966318180235467">Провери страницу &amp;позадине</translation>
+<translation id="4990343175649730969">Преузми Алатку за чишћење Chrome-а</translation>
 <translation id="4991420928586866460">Третирај тастере из горњег реда као функцијске тастере</translation>
 <translation id="499165176004408815">Користи режим високог контраста</translation>
 <translation id="4992066212339426712">Укључи звук</translation>
@@ -3299,6 +3305,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: изабери за измене</translation>
 <translation id="5741454054957165976">Омогућава нову верзију интервенције корисничког агента за учитавање веб-фонтова.</translation>
 <translation id="574392208103952083">Средња</translation>
+<translation id="5744368829843057748">Кориснички интерфејс за Преводилац 2016Q2</translation>
 <translation id="5745056705311424885">Регистрован је USB меморијски уређај</translation>
 <translation id="5746169159649715125">Сачувај као PDF</translation>
 <translation id="5747611503456050045">Поновна учитавања страница која покреће садржај који се вертикално помера на следећу страницу.</translation>
@@ -3406,6 +3413,7 @@
 <translation id="5884474295213649357">Ова картица је повезана са USB уређајем.</translation>
 <translation id="5885324376209859881">Управљај подешавањима медија...</translation>
 <translation id="5889282057229379085">Највећи број посредничких CA: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Реците нам шта се дешава.</translation>
 <translation id="5892290200158927959">Француска BÉPO тастатура</translation>
 <translation id="5892507820957994680">Замењује листу за приказ уграђеног софтвера и омогућава GPU убрзање у неподржаним системским конфигурацијама.</translation>
 <translation id="5895138241574237353">Покрени поново</translation>
@@ -3549,6 +3557,7 @@
 <translation id="6122093587541546701">Имејл (опционално):</translation>
 <translation id="6122875415561139701">Операција писања није дозвољена на: „<ph name="DEVICE_NAME" />“.</translation>
 <translation id="6124650939968185064">Следећи додаци зависе од овог додатка:</translation>
+<translation id="6127945163801765632">Омогући одељак „сви обележивачи“ у менаџеру обележивача.</translation>
 <translation id="6129938384427316298">Коментар Netscape сертификата</translation>
 <translation id="6129953537138746214">Размак</translation>
 <translation id="6132383530370527946">Уговор</translation>
@@ -3575,6 +3584,7 @@
 <translation id="6164005077879661055">Све датотеке и локални подаци повезани са корисником под надзором ће бити трајно избрисани када уклоните овог корисника под надзором. Менаџер ће можда и даље моћи да види посећене веб-сајтове и подешавања за овог корисника под надзором на <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Сазнајте више</translation>
 <translation id="6166185671393271715">Увезите лозинке у Chrome</translation>
+<translation id="6169666352732958425">Пребацивање радне површине није успело.</translation>
 <translation id="6171550060231646388">Функције „Oк Google“ симулираног хардвера</translation>
 <translation id="6175314957787328458">GUID Microsoft домена</translation>
 <translation id="6178664161104547336">Избор сертификата</translation>
@@ -3767,6 +3777,7 @@
 <translation id="6458308652667395253">Управљај блокирањем JavaScript-а...</translation>
 <translation id="6459488832681039634">Користи избор за проналажење</translation>
 <translation id="6460423884798879930">Омогућите опцију за слање додатних информација за потврду аутентичности у почетном SYN пакету за претходно повезаног клијента, што омогућава бржи почетак слања података.</translation>
+<translation id="6460474910028274178">Побољшана логика покретања и изглед корисничког интерфејса са облачићима за Преводилац</translation>
 <translation id="6460601847208524483">Пронађи следеће</translation>
 <translation id="6462080265650314920">Апликације морају да се приказују са типом садржаја „<ph name="CONTENT_TYPE" />“.</translation>
 <translation id="6462082050341971451">Јесте ли још ту?</translation>
@@ -3896,6 +3907,7 @@
 <translation id="6663792236418322902">Лозинка коју одаберете биће касније потребна за враћање ове датотеке. Евидентирајте је на безбедној локацији.</translation>
 <translation id="6664237456442406323">Нажалост, рачунар је конфигурисан помоћу погрешно направљеног ИД-а хардвера. То спречава Chrome ОС да се ажурира најновијим безбедносним исправкама и рачунар је <ph name="BEGIN_BOLD" />можда подложан злонамерним нападима<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">помоћу Google налога</translation>
+<translation id="667517062706956822">Желите ли да Google преведе ову страницу са језика <ph name="SOURCE_LANGUAGE" /> на <ph name="TARGET_LANGUAGE" />?</translation>
 <translation id="6675665718701918026">Показивачки уређај је повезан</translation>
 <translation id="6677037229676347494">Очекивани ИД је „<ph name="EXPECTED_ID" />“, али наведен је ИД „<ph name="NEW_ID" />“.</translation>
 <translation id="6680028776254050810">Промена корисника</translation>
@@ -3947,6 +3959,7 @@
 <translation id="6746392203843147041">појачавање звука</translation>
 <translation id="6748140994595080445">Промените начин на који <ph name="APP_NAME" /> обрађује и приказује језике.</translation>
 <translation id="6748465660675848252">Можете да наставите, али ће бити враћени само синхронизовани подаци и подешавања. Изгубићете све локалне податке.</translation>
+<translation id="6751256176799620176">Изабран је 1 директоријум</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (без архивирања)</translation>
 <translation id="6759193508432371551">Враћање фабричких подешавања</translation>
 <translation id="6760765581316020278">Вијетнамска тастатура (VNI)</translation>
@@ -4581,6 +4594,7 @@
 <translation id="7717014941119698257">Преузимање: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">Обука је истекла</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262">Да бисте надгледали овог корисника, <ph name="BEGIN_LINK" />пријавите се у Chrome<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">Исеци</translation>
 <translation id="7730449930968088409">Снимање садржаја екрана</translation>
 <translation id="7730494089396812859">Прикажите детаље о прављењу резервних копија у клауду</translation>
@@ -4674,7 +4688,6 @@
 <translation id="7859704718976024901">Историја прегледања</translation>
 <translation id="7861215335140947162">&amp;Преузимања</translation>
 <translation id="7864539943188674973">Онемогући Bluetooth</translation>
-<translation id="7868891395842935202">Омогућава експериментални оквир за контролисање приступа експериментима са API-јима.</translation>
 <translation id="7870576007982733437">Користи менаџер преузимања у систему када је то примењиво.</translation>
 <translation id="7870790288828963061">Није пронађена ниједна киоск апликација са новијом верзијом. Нема шта да се ажурира. Уклоните USB меморију.</translation>
 <translation id="787150342916295244">Скенирање кредитних картица</translation>
@@ -5005,7 +5018,6 @@
 <translation id="8309505303672555187">Изаберите мрежу:</translation>
 <translation id="8312871300878166382">Налепи у директоријум</translation>
 <translation id="8314013494437618358">Компоновање са нитима</translation>
-<translation id="8314576811984836978">Експериментални оквир.</translation>
 <translation id="8319414634934645341">Употреба проширеног кључа</translation>
 <translation id="8322814362483282060">Овој страници је забрањен приступ микрофону.</translation>
 <translation id="8326478304147373412">PKCS #7, ланац сертификата</translation>
@@ -5066,7 +5078,6 @@
 <translation id="8418240940464873056">Режим Hanja</translation>
 <translation id="8418445294933751433">&amp;Прикажи као картицу</translation>
 <translation id="8420060421540670057">Прикажи датотеке Google докумената</translation>
-<translation id="8420728540268437431">Страница се преводи ...</translation>
 <translation id="842274098655511832">WebGL додаци у радним верзијама</translation>
 <translation id="8424039430705546751">надоле</translation>
 <translation id="8425213833346101688">Промени</translation>
@@ -5253,6 +5264,7 @@
 <translation id="8690754533598178758">Изузеци за микрофон за Adobe Flash Player се разликују.</translation>
 <translation id="8691686986795184760">(Омогућено смерницама за предузећа)</translation>
 <translation id="869257642790614972">Поновно отварање последње затворене картице</translation>
+<translation id="8695770993395462321">Матични CUPS</translation>
 <translation id="8695825812785969222">Open &amp;Location... (Отвори локацију)</translation>
 <translation id="8698464937041809063">Google цртеж</translation>
 <translation id="869884720829132584">Мени апликација</translation>
@@ -5595,6 +5607,7 @@
 <translation id="9189690067274055051">Откључајте телефон и приближите га уређају <ph name="DEVICE_TYPE" /> да бисте унели.</translation>
 <translation id="9190063653747922532">L2TP/IPsec + тајни кључ</translation>
 <translation id="9201305942933582053">Google тренутно за Chrome!</translation>
+<translation id="9202646163273566462">Омогућава да приказ свих обележивача буде подразумевано одредиште менаџера обележивача.</translation>
 <translation id="9203398526606335860">&amp;Профилисање је омогућено</translation>
 <translation id="9203478404496196495">Укључи звук картице</translation>
 <translation id="9203962528777363226">Администратор овог уређаја је онемогућио додавање нових корисника</translation>
@@ -5621,6 +5634,7 @@
 <translation id="939736085109172342">Нови директоријум</translation>
 <translation id="940425055435005472">Величина фонта:</translation>
 <translation id="941543339607623937">Неважећи приватни кључ.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{ниједна}=1{1 апликација ($1)}=2{2 апликације ($1, $2)}one{# апликација ($1, $2, $3)}few{# апликације ($1, $2, $3)}other{# апликација ($1, $2, $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> дели Chrome картицу и звук.</translation>
 <translation id="942954117721265519">Нема слика у овом директоријуму.</translation>
 <translation id="945522503751344254">Пошаљи повратне информације</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index 7f012e2..e8ea578 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (tilläggs-id <ph name="EXTENSION_ID" />) får inte användas i den här typen av session.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Oj! Det gick inte att generera en slumpmässig privat RSA-nyckel.</translation>
+<translation id="1421115928968836111">Då tar du bort auktoriseringen av Flash Player-licensen för skyddat innehåll.</translation>
 <translation id="1425734930786274278">Följande cookies har blockerats (cookies från tredje part blockeras alltid):</translation>
 <translation id="1426410128494586442">Ja</translation>
 <translation id="1427049173708736891">Låt <ph name="DEVICE_TYPE" /> vara olåst när din Android-mobil är olåst och i närheten. Du behöver inte ange något lösenord.</translation>
@@ -520,6 +521,7 @@
 <translation id="1707463636381878959">Dela nätverket med andra användare</translation>
 <translation id="1708199901407471282">När du öppnar ett förslag för sidan Ny flik och förslaget redan är öppet på en flik visas den där i stället för att den nya fliken läses in.</translation>
 <translation id="1708338024780164500">(Inaktiv)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (id: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Komprimeringen misslyckades. Oväntat fel: $1</translation>
 <translation id="1715941336038158809">Ogiltigt användarnamn eller lösenord.</translation>
 <translation id="1717733954209022288">Kryssruta för att spara kort i Google Payments</translation>
@@ -797,6 +799,7 @@
 <translation id="2168214441502403371">Tangentbord för persiska</translation>
 <translation id="2168725742002792683">Filtillägg</translation>
 <translation id="2169062631698640254">Logga in ändå</translation>
+<translation id="2175042898143291048">Gör alltid det</translation>
 <translation id="2175607476662778685">Fältet Snabbstart</translation>
 <translation id="2176045495080708525">Följande tillägg är nu installerade:</translation>
 <translation id="2177950615300672361">Fliken Inkognito: <ph name="TAB_NAME" /></translation>
@@ -1938,7 +1941,6 @@
 <translation id="3688507211863392146">Skriva till filer och mappar som du öppnar i appen</translation>
 <translation id="3688526734140524629">Byt kanal</translation>
 <translation id="3688578402379768763">Uppdaterad</translation>
-<translation id="3690976161240450479">Inloggningen misslyckades. Kontakta administratören eller försök igen.</translation>
 <translation id="3693415264595406141">Lösenord:</translation>
 <translation id="3694027410380121301">Välj föregående flik</translation>
 <translation id="3694678678240097321">Användaren måste ge sitt tillstånd för att ett tillägg ska få köra skript på sidan om tillägget har begärt behörighet att köras på alla webbadresser.</translation>
@@ -2234,6 +2236,7 @@
 <translation id="4116663294526079822">Tillåt alltid på den här webbplatsen</translation>
 <translation id="411666854932687641">Privat minne</translation>
 <translation id="4118990158415604803">Administratören har inaktiverat anslutning till andra nätverk.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{och 1 till}other{och # till}}</translation>
 <translation id="4119828560634133962">Registreringskampanjer vid förhandsgranskning av utskrift</translation>
 <translation id="4120329147617730038">En administratör har förbjudit multiinloggning för <ph name="USER_EMAIL" />.
 Alla användare måste logga ut för att fortsätta.</translation>
@@ -2373,9 +2376,11 @@
 <translation id="4345703751611431217">Inkompatibel programvara: läs mer</translation>
 <translation id="4348766275249686434">Samla in fel</translation>
 <translation id="4350019051035968019">Det går inte att registrera enheten på samma domän som dina konton eftersom enheten har registrerats som hanterad av en annan domän.</translation>
+<translation id="4354806558096370704">Aktiverar användning av inbyggt CUPS för utskrifter i serverdelen.</translation>
 <translation id="4358697938732213860">Lägg till en adress</translation>
 <translation id="4359408040881008151">Installerades på grund av ett eller flera tillägg som är beroende av detta tillägg.</translation>
 <translation id="4361190688154226069">Rektangelbaserad inriktning i visningar</translation>
+<translation id="4364414793200746179">MediaStyle-avisering i Android</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> har laddats ned</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> delar ett fönster.</translation>
 <translation id="4364830672918311045">Visa aviseringar</translation>
@@ -2779,6 +2784,7 @@
 <translation id="4988792151665380515">Det gick inte att exportera den publika nyckeln.</translation>
 <translation id="49896407730300355">Rotera m&amp;oturs</translation>
 <translation id="4989966318180235467">Kontrollera &amp;bakgrundssida</translation>
+<translation id="4990343175649730969">Ladda ned Chrome Cleanup Tool</translation>
 <translation id="4991420928586866460">Använd tangenterna på översta raden som funktionstangenter</translation>
 <translation id="499165176004408815">Använd högkontrastläge</translation>
 <translation id="4992066212339426712">Slå på ljudet</translation>
@@ -3302,6 +3308,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: välj för att redigera</translation>
 <translation id="5741454054957165976">Aktivera den nya versionen av Åtgärd från användaragent för inläsning av WebFonts.</translation>
 <translation id="574392208103952083">Medium</translation>
+<translation id="5744368829843057748">Användargränssnitt för Översätt 2016Q2</translation>
 <translation id="5745056705311424885">Ett USB-minne har upptäckts</translation>
 <translation id="5746169159649715125">Spara som PDF</translation>
 <translation id="5747611503456050045">En ny inläsning av sidan utlöses vid vertikal rullning förbi innehållet.</translation>
@@ -3409,6 +3416,7 @@
 <translation id="5884474295213649357">Den här fliken är ansluten till en USB-enhet.</translation>
 <translation id="5885324376209859881">Hantera inställningar för media ...</translation>
 <translation id="5889282057229379085">Maximalt antal mellanliggande CU: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Berätta vad som händer.</translation>
 <translation id="5892290200158927959">Franskt BÉPO-tangentbord</translation>
 <translation id="5892507820957994680">Åsidosätter den inbyggda programrenderingslistan och aktiverar GPU-acceleration i systemkonfigurationer som inte stöds.</translation>
 <translation id="5895138241574237353">Starta om</translation>
@@ -3552,6 +3560,7 @@
 <translation id="6122093587541546701">E-postadress (valfritt):</translation>
 <translation id="6122875415561139701">Skrivbehörigheten för åtgärden saknas på: <ph name="DEVICE_NAME" />.</translation>
 <translation id="6124650939968185064">Följande tillägg är beroende av detta tillägg:</translation>
+<translation id="6127945163801765632">Aktivera avsnittet Alla bokmärken i Bokmärkeshanteraren.</translation>
 <translation id="6129938384427316298">Kommentar för Netscape-certifikat</translation>
 <translation id="6129953537138746214">Blanksteg</translation>
 <translation id="6132383530370527946">Det finstilta</translation>
@@ -3578,6 +3587,7 @@
 <translation id="6164005077879661055">Alla filer och lokala data som är kopplade till den hanterade användaren tas bort permanent när den hanterade användaren tas bort. Besökta webbplatser och inställningar för den hanterade användaren kan fortfarande vara synliga för den som hanterar användaren på <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Läs mer</translation>
 <translation id="6166185671393271715">Importera lösenord till Chrome</translation>
+<translation id="6169666352732958425">Det gick inte att casta skrivbordet.</translation>
 <translation id="6171550060231646388">Simulerade maskinvarufunktioner för ”OK Google”</translation>
 <translation id="6175314957787328458">Grafiskt användargränssnitt för Microsoft-domänen</translation>
 <translation id="6178664161104547336">Välj ett certifikat</translation>
@@ -3771,6 +3781,7 @@
 <translation id="6458308652667395253">Hantera blockering av JavaScript...</translation>
 <translation id="6459488832681039634">Använd markering för sökning</translation>
 <translation id="6460423884798879930">Aktiverar alternativet att skicka extra autentiseringsuppgifter i det första SYN-paketet för tidigare anslutna klienter, så att autentiseringen går snabbare.</translation>
+<translation id="6460474910028274178">Förbättrat utseende och mer logisk utlösarfunktion i bubbelgränssnittet för Översätt</translation>
 <translation id="6460601847208524483">Sök nästa</translation>
 <translation id="6462080265650314920">Apparna måste visas med content-type <ph name="CONTENT_TYPE" />.</translation>
 <translation id="6462082050341971451">Är du kvar?</translation>
@@ -3900,6 +3911,7 @@
 <translation id="6663792236418322902">Lösenordet du väljer behövs om du vill återställa filen vid ett senare tillfälle.  Spara det på ett säkert ställe.</translation>
 <translation id="6664237456442406323">Tyvärr är din dator konfigurerad med ett felaktigt maskinvaru-ID. Detta förhindrar att Chrome OS uppdateras med de senaste säkerhetskorrigeringarna och datorn <ph name="BEGIN_BOLD" />kan vara utsatt för skadlig programvara<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">med ditt Google-konto</translation>
+<translation id="667517062706956822">Vill du att Google ska översätta sidan från <ph name="SOURCE_LANGUAGE" /> till <ph name="TARGET_LANGUAGE" />?</translation>
 <translation id="6675665718701918026">Pekdon har anslutits</translation>
 <translation id="6677037229676347494">Förväntat ID <ph name="EXPECTED_ID" />, men ID:t var <ph name="NEW_ID" />.</translation>
 <translation id="6680028776254050810">Byt användare</translation>
@@ -3951,6 +3963,7 @@
 <translation id="6746392203843147041">volym upp</translation>
 <translation id="6748140994595080445">Ändra hur <ph name="APP_NAME" /> hanterar och visar språk</translation>
 <translation id="6748465660675848252">Du kan fortsätta, men endast synkroniserade uppgifter och inställningar återställs. All lokal data kommer att gå förlorad.</translation>
+<translation id="6751256176799620176">1 mapp har valts</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Inkognito)</translation>
 <translation id="6759193508432371551">Återställ standardinställningar</translation>
 <translation id="6760765581316020278">Tangentbord för vietnamesiska (VNI)</translation>
@@ -4588,6 +4601,7 @@
 <translation id="7717014941119698257">Nedladdning: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">Tidsgräns för utbildning uppnådd</translation>
 <translation id="771953673318695590">Kvalitetssäkring</translation>
+<translation id="7720375555307821262">Om du vill bevaka personen <ph name="BEGIN_LINK" />loggar du in i Chrome<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">Klipp ut</translation>
 <translation id="7730449930968088409">Ta en bild av innehållet på skärmen</translation>
 <translation id="7730494089396812859">Visa information om säkerhetskopiering i molnet</translation>
@@ -4681,7 +4695,6 @@
 <translation id="7859704718976024901">Webbhistorik</translation>
 <translation id="7861215335140947162">&amp;Nedladdade filer</translation>
 <translation id="7864539943188674973">Inaktivera Bluetooth</translation>
-<translation id="7868891395842935202">Aktiverar experimentellt ramverk för kontroll av åtkomst till API-experiment.</translation>
 <translation id="7870576007982733437">Använd systemets nedladdningshanterare när detta är lämpligt.</translation>
 <translation id="7870790288828963061">Inga kioskappar med nyare version hittades. Det finns inget att uppdatera. Ta bort USB-minnet.</translation>
 <translation id="787150342916295244">Inläsning av kreditkort</translation>
@@ -5010,7 +5023,6 @@
 <translation id="8309505303672555187">Välj ett nätverk:</translation>
 <translation id="8312871300878166382">Klistra in i mapp</translation>
 <translation id="8314013494437618358">Sammansättning i trådar</translation>
-<translation id="8314576811984836978">Experimentellt ramverk</translation>
 <translation id="8319414634934645341">Utökad nyckelanvändning</translation>
 <translation id="8322814362483282060">Den här sidan har blockerats och kan inte komma åt mikrofonen.</translation>
 <translation id="8326478304147373412">PKCS #7, certifikatkedja</translation>
@@ -5071,7 +5083,6 @@
 <translation id="8418240940464873056">Läge för kinesiska bokstäver</translation>
 <translation id="8418445294933751433">&amp;Visa som flik</translation>
 <translation id="8420060421540670057">Visa Google Dokument-filer</translation>
-<translation id="8420728540268437431">Sidan håller på att översättas ...</translation>
 <translation id="842274098655511832">Utkasttillägg till WebGL</translation>
 <translation id="8424039430705546751">ned</translation>
 <translation id="8425213833346101688">Ändra</translation>
@@ -5258,6 +5269,7 @@
 <translation id="8690754533598178758">Adobe Flash Player använder andra undantag för mikrofonen.</translation>
 <translation id="8691686986795184760">(Aktiveras av en företagspolicy)</translation>
 <translation id="869257642790614972">Öppna senast stängda flik igen</translation>
+<translation id="8695770993395462321">Inbyggt CUPS</translation>
 <translation id="8695825812785969222">Öppna plats...</translation>
 <translation id="8698464937041809063">Google-teckning</translation>
 <translation id="869884720829132584">Programmeny</translation>
@@ -5600,6 +5612,7 @@
 <translation id="9189690067274055051">Om du vill öppna din <ph name="DEVICE_TYPE" /> låser du upp mobilen och håller den närmare.</translation>
 <translation id="9190063653747922532">L2TP/IPSec + i förväg delad nyckel</translation>
 <translation id="9201305942933582053">Google Nu för Chrome!</translation>
+<translation id="9202646163273566462">Aktiverar vyn Alla bokmärken som standardplats för Bokmärkeshanteraren.</translation>
 <translation id="9203398526606335860">&amp;Profilering aktiverad</translation>
 <translation id="9203478404496196495">Slå på ljudet i flik</translation>
 <translation id="9203962528777363226">Administratören av den här enheten har inaktiverat nya användare från att läggas till</translation>
@@ -5626,6 +5639,7 @@
 <translation id="939736085109172342">Ny mapp</translation>
 <translation id="940425055435005472">Teckenstorlek:</translation>
 <translation id="941543339607623937">Ogiltig privat nyckel.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{inga}=1{1 app ($1)}=2{2 appar ($1, $2)}other{# appar ($1, $2, $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> delar ljud och en flik från Chrome.</translation>
 <translation id="942954117721265519">Inga bilder i den här katalogen.</translation>
 <translation id="945522503751344254">Skicka synpunkter</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index eb17f08e..b151ff75 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (Kitambulisho cha kiendelezi "<ph name="EXTENSION_ID" />") hakiruhusiwi kwa kipindi cha aina hii.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Lo! Imeshindwa kuzindua ufunguo binafsi wa RSA usio na utaratibu.</translation>
+<translation id="1421115928968836111">Hatua hii itaondoa idhini ya leseni za Flash Player kwa ajili ya maudhui yaliyolindwa.</translation>
 <translation id="1425734930786274278">Vidakuzi vifuatavyo vilizuiwa (vidakuzi vya mtu mwingine vinazuiwa bila msamaha):</translation>
 <translation id="1426410128494586442">Ndio</translation>
 <translation id="1427049173708736891">Acha <ph name="DEVICE_TYPE" /> ikiwa imefunguliwa simu yako ya Android ikiwa imefunguliwa na iko karibu—hakuna haja ya kucharaza nenosiri lako.</translation>
@@ -519,6 +520,7 @@
 <translation id="1707463636381878959">Shiriki mtandao huu na watumiaji wengine</translation>
 <translation id="1708199901407471282">Unapofungua ukurasa wa wavuti uliopendekezwa kutoka Ukurasa wa Kichupo Kipya, ikiwa tayari kichupo kiko wazi kwa pendekezo, tumia hicho badala ya kupakia pendekezo katika kichupo kipya.</translation>
 <translation id="1708338024780164500">(Sio amilifu)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (Kitambulisho: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Haikuweza kubana, hitilafu isiyotarajiwa imetokea: $1</translation>
 <translation id="1715941336038158809">Jina la mtumiaji au nenosiri ni batili.</translation>
 <translation id="1717733954209022288">Kisanduku cha kuteua cha kuhifadhi kadi ya Google Payments</translation>
@@ -796,6 +798,7 @@
 <translation id="2168214441502403371">Kibodi ya Kiajemi</translation>
 <translation id="2168725742002792683">Viendelezi vya </translation>
 <translation id="2169062631698640254">Ingia tu</translation>
+<translation id="2175042898143291048">Fanya hivi kila mara</translation>
 <translation id="2175607476662778685">Upau-Zindua-Kasi</translation>
 <translation id="2176045495080708525">Viendelezi vifuatavyo sasa vimesakinishwa:</translation>
 <translation id="2177950615300672361">Kichupo Fiche: <ph name="TAB_NAME" /></translation>
@@ -1930,7 +1933,6 @@
 <translation id="3688507211863392146">Andika kwenye faili na folda unazofungua katika programu hii.</translation>
 <translation id="3688526734140524629">Badili kituo</translation>
 <translation id="3688578402379768763">Imesasishwa</translation>
-<translation id="3690976161240450479">Haikufaulu kuingia katika akaunti. Tafadhali wasiliana na msimamizi wako au jaribu tena.</translation>
 <translation id="3693415264595406141">Nenosiri:</translation>
 <translation id="3694027410380121301">Chagua Kichupo Kilichotagulia</translation>
 <translation id="3694678678240097321">Hitaji kibali cha mtumiaji kwa kiendelezi kinachoendesha hati kwenye ukurasa, ikiwa kiendelezi kimeomba ruhusa ya kuendesha kwenye url zote.</translation>
@@ -2224,6 +2226,7 @@
 <translation id="4116663294526079822">Ruhusu mara kwa mara kwenye tovuti hii</translation>
 <translation id="411666854932687641">Kumbukukumbu Binafsi</translation>
 <translation id="4118990158415604803">Kuunganisha kwenye mitandao mingine kumezimwa na msimamizi wako.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{na nyingine 1}other{na nyingine #}}</translation>
 <translation id="4119828560634133962">Matangazo ya Usajili wa Onyesho la Kuchungulia la Printa</translation>
 <translation id="4120329147617730038">Msimamizi amekataza uwezo wa kuingia katika akaunti nyingi kwa wakati mmoja kwa <ph name="USER_EMAIL" />. Watumiaji wote lazima waondoke ili waendelee.</translation>
 <translation id="4120817667028078560">Kijia ni kirefu mno</translation>
@@ -2362,9 +2365,11 @@
 <translation id="4345703751611431217">Programu hazioani: Pata maelezo zaidi</translation>
 <translation id="4348766275249686434">Kusanya hitilafu</translation>
 <translation id="4350019051035968019">Kifaa hiki hakiwezi kusajiliwa kwenye kikoa cha akaunti yako kwa sababu kifaa kimewekewa alama kwa usimamizi wa kikoa tofauti.</translation>
+<translation id="4354806558096370704">Huwasha utumiaji wa upande wa nyuma wa uchapishaji wa CUPS asili.</translation>
 <translation id="4358697938732213860">Ongeza anwani</translation>
 <translation id="4359408040881008151">Kilisakinishwa kwa sababu ya kiendelezi au viendelezi vinavyotegemea.</translation>
 <translation id="4361190688154226069">Kulenga katika mionekano kulingana na rect</translation>
+<translation id="4364414793200746179">Arifa ya Android MediaStyle</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> imepakuliwa</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> inashiriki dirisha.</translation>
 <translation id="4364830672918311045">Onyesha arifa</translation>
@@ -2766,6 +2771,7 @@
 <translation id="4988792151665380515">Imeshindwa kuhamisha ufunguo wa umma.</translation>
 <translation id="49896407730300355">Zungusha kinyume saa</translation>
 <translation id="4989966318180235467">Ukaguzi na ukurasa wa mandharinyuma</translation>
+<translation id="4990343175649730969">Pakua Zana ya Kusafisha Chrome</translation>
 <translation id="4991420928586866460">Chukulia vitufe vya safu mlalo ya juu kama vitufe vya chaguo za kukokotoa</translation>
 <translation id="499165176004408815">Tumia hali ya juu ya utofautishaji</translation>
 <translation id="4992066212339426712">Rejesha sauti</translation>
@@ -3289,6 +3295,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: chagua ili kubadilisha</translation>
 <translation id="5741454054957165976">Washa kipengele cha Toleo jipya la Suluhu ya Ala ya Mtumiaji kwa ajili ya upakiaji wa WebFonts.</translation>
 <translation id="574392208103952083">Wastani</translation>
+<translation id="5744368829843057748">Kiolesura cha 2016Q2 ya Tafsiri</translation>
 <translation id="5745056705311424885">Hifadhi ya USB imegunduliwa</translation>
 <translation id="5746169159649715125">Hifadhi kama PDF</translation>
 <translation id="5747611503456050045">Upakiaji upya wa ukurasa ulioanzishwa kwa kusogeza maudhui kiwima.</translation>
@@ -3396,6 +3403,7 @@
 <translation id="5884474295213649357">Kichupo hiki kimeunganishwa kwenye kifaa cha USB.</translation>
 <translation id="5885324376209859881">Dhibiti mipangilio ya mawasiliano...</translation>
 <translation id="5889282057229379085">Upeo wa idadi ya mamlaka ya kati ya cheti: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Tueleze kinachofanyika.</translation>
 <translation id="5892290200158927959">Kibodi ya BEPO ya Kifaransa</translation>
 <translation id="5892507820957994680">Inafuta orodha ya uonyeshaji ya programu iliyojengewa ndani na kuwezesha uharakishaji wa GPU katika usanidi wa mfumo usiohimiliwa.</translation>
 <translation id="5895138241574237353">Zzima na uwashe</translation>
@@ -3539,6 +3547,7 @@
 <translation id="6122093587541546701">Barua pepe (hiari):</translation>
 <translation id="6122875415561139701">Shughuli za kuandika haziruhusiwi kwenye: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="6124650939968185064">Viendelezi vinavyofuata vinategemea kiendelezi hiki:</translation>
+<translation id="6127945163801765632">Washa sehemu ya "alamisho zote" katika kidhibiti cha alamisho.</translation>
 <translation id="6129938384427316298">Kidokezo cha Cheti cha Netscape</translation>
 <translation id="6129953537138746214">Nafasi</translation>
 <translation id="6132383530370527946">Chapisho ndogo</translation>
@@ -3565,6 +3574,7 @@
 <translation id="6164005077879661055">Faili zote na data ya ndani zinazohusishwa na mtumiaji anayesimamiwa zitafutwa kabisa mtumiaji huyu anayesimamiwa atakapoondolewa. Tovuti zilizotembelewa na mipangilio ya mtumiaji huyu anayesimamiwa inaweza bado kuonekana na msimamizi katika <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Pata maelezo zaidi</translation>
 <translation id="6166185671393271715">Leta Manenosiri Kwenye Chrome</translation>
+<translation id="6169666352732958425">Imeshindwa kutuma eneo-kazi.</translation>
 <translation id="6171550060231646388">Vipengele vya maunzi vilivyobuniwa vya 'OK Google'</translation>
 <translation id="6175314957787328458">GUID ya Vikoa kutoka Microsoft</translation>
 <translation id="6178664161104547336">Chagua cheti</translation>
@@ -3758,6 +3768,7 @@
 <translation id="6458308652667395253">Dhibiti uzuiaji wa Javascript...</translation>
 <translation id="6459488832681039634">Tumia Iliyochaguliwa Kupata</translation>
 <translation id="6460423884798879930">Washa chaguo la kutuma maelezo zaidi ya uthibitishaji katika furushi la kwanza la SYN kwa mteja aliyeunganishwa awali, ili kuruhusu kuanza haraka kutuma data kwa kasi.</translation>
+<translation id="6460474910028274178">Mantiki ya kuanzisha na kutafuta Kiolesura cha Kiputo cha Tafsiri imeboreshwa</translation>
 <translation id="6460601847208524483">Pata Ifuatayo</translation>
 <translation id="6462080265650314920">Programu sharti zitumike kwa aina ya maudhui "<ph name="CONTENT_TYPE" />".</translation>
 <translation id="6462082050341971451">Je, bado upo?</translation>
@@ -3887,6 +3898,7 @@
 <translation id="6663792236418322902">Nenosiri ulilochagua litahitajika ili kurejesha upya faili hii baadaye. Tafadhali inakili katika eneo salama.</translation>
 <translation id="6664237456442406323">Kwa bahati mbaya, kompyuta yako imesanidiwa na kitambulisho cha maunzi kilichoharibika. Hii inazuia Chrome OS isisasishe na sasisho za usalama za hivi karibuni na kompyuta yako <ph name="BEGIN_BOLD" />inaweza ikawa hatarini kutokana na mashambulizi hasidi<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">kwa Akaunti Google yako.</translation>
+<translation id="667517062706956822">Je, ungependa Google itafsiri ukurasa huu kutoka <ph name="SOURCE_LANGUAGE" /> hadi <ph name="TARGET_LANGUAGE" />?</translation>
 <translation id="6675665718701918026">Kifaa cha kuonyeshea kimeunganishwa</translation>
 <translation id="6677037229676347494">Kitambulisho kinachotarajiwa "<ph name="EXPECTED_ID" />", Kitambulisho kilichoko "<ph name="NEW_ID" />".</translation>
 <translation id="6680028776254050810">Badili Watumiaji</translation>
@@ -3938,6 +3950,7 @@
 <translation id="6746392203843147041">ongeza sauti</translation>
 <translation id="6748140994595080445">Badilisha jinsi <ph name="APP_NAME" /> inavyoshughulikia na kuonyesha lugha.</translation>
 <translation id="6748465660675848252">Unaweza kuendelea, lakini data na mipangilio yako iliyosawazishwa pekee ndiyo itakayorejeshwa. Data yote ya karibu itapotea.</translation>
+<translation id="6751256176799620176">Folda 1 imechaguliwa</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Hali fiche)</translation>
 <translation id="6759193508432371551">Rejesha upya mipangilio ya kiwandani</translation>
 <translation id="6760765581316020278">Kibodi ya Kivietnamu (VNI)</translation>
@@ -4578,6 +4591,7 @@
 <translation id="7717014941119698257">Inapakua: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">Mafunzo yamekwisha muda</translation>
 <translation id="771953673318695590">Maswali na Majibu</translation>
+<translation id="7720375555307821262">Ili kumsimamia mtu huyu, <ph name="BEGIN_LINK" />ingia katika Chrome<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">Kata</translation>
 <translation id="7730449930968088409">Piga picha maudhui ya skrini yako</translation>
 <translation id="7730494089396812859">Onyesha maelezo ya hifadhi rudufu ya Wingu</translation>
@@ -4671,7 +4685,6 @@
 <translation id="7859704718976024901">Historia ya Kuvinjari</translation>
 <translation id="7861215335140947162">&amp;Vipakuzi</translation>
 <translation id="7864539943188674973">Lemaza Bluetooth</translation>
-<translation id="7868891395842935202">Huwasha Mfumo wa Majaribio wa kudhibiti ufikiaji wa majaribio ya API.</translation>
 <translation id="7870576007982733437">Tumia kidhibiti cha vipakuliwa vya mfumo ikiwa kinatumika.</translation>
 <translation id="7870790288828963061">Hamna programu za Skrini Nzima zilizo na toleo jipya zaidi zimepatikana. Hakuna cha kusasisha. Tafadhali ondoa hifadhi ya USB.</translation>
 <translation id="787150342916295244">Uchanganuzi wa kadi ya malipo</translation>
@@ -5003,7 +5016,6 @@
 <translation id="8309505303672555187">Chagua mtandao:</translation>
 <translation id="8312871300878166382">Bandika ndani ya folda</translation>
 <translation id="8314013494437618358">Mchanganyiko wa nyuzi</translation>
-<translation id="8314576811984836978">Mfumo wa Majaribio.</translation>
 <translation id="8319414634934645341">Matumizi ya Ziada ya Ufunguo</translation>
 <translation id="8322814362483282060">Ukurasa huu umezuiwa usifikie maikrofoni yako.</translation>
 <translation id="8326478304147373412">PKCS #7, msururu wa vyeti</translation>
@@ -5064,7 +5076,6 @@
 <translation id="8418240940464873056">Modi ya Kihanja</translation>
 <translation id="8418445294933751433">Onye&amp;sha kama kichupo</translation>
 <translation id="8420060421540670057">Onyesha faili za  Hati za Google</translation>
-<translation id="8420728540268437431">Ukurasa huu unatafsiriwa ...</translation>
 <translation id="842274098655511832">Viendelezi vya Rasimu ya WebGL</translation>
 <translation id="8424039430705546751">chini</translation>
 <translation id="8425213833346101688">Badilisha</translation>
@@ -5251,6 +5262,7 @@
 <translation id="8690754533598178758">Udhibiti wa maikrofoni za Adobe Flash Player ni tofauti.</translation>
 <translation id="8691686986795184760">(Imewezeshwa na sera ya biashara)</translation>
 <translation id="869257642790614972">Fungua upya kichupo kilichofungwa mwisho</translation>
+<translation id="8695770993395462321">CUPS asili</translation>
 <translation id="8695825812785969222">Fungua Eneo...</translation>
 <translation id="8698464937041809063">Mchoro wa Google</translation>
 <translation id="869884720829132584">Menyu ya programu</translation>
@@ -5593,6 +5605,7 @@
 <translation id="9189690067274055051">Fungua simu yako na uisogeze karibu na <ph name="DEVICE_TYPE" /> yako ili kuingia.</translation>
 <translation id="9190063653747922532">L2TP/IPsec + ufunguo ulioshirikiwa awali</translation>
 <translation id="9201305942933582053">Google Msaidizi ya Chrome!</translation>
+<translation id="9202646163273566462">Huwasha mwonekano wa alamisho zote ziwe sehemu chaguo-msingi zinakoenda za kidhibiti cha alamisho.</translation>
 <translation id="9203398526606335860">&amp;Uwekaji maelezo mafupi umewezeshwa</translation>
 <translation id="9203478404496196495">Rejesha sauti ya kichupo</translation>
 <translation id="9203962528777363226">Msimamizi wa kifaa hiki amelemaza kuongezwa kwa watumiaji wapya</translation>
@@ -5619,6 +5632,7 @@
 <translation id="939736085109172342">Folda mpya</translation>
 <translation id="940425055435005472">Ukubwa wa fonti:</translation>
 <translation id="941543339607623937">Ufunguo binafsi sio halali.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{hamna}=1{Programu 1 ($1)}=2{Programu 2 ($1, $2)}other{Programu # ($1, $2, $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> inashiriki kichupo cha Chrome na sauti.</translation>
 <translation id="942954117721265519">Hakuna picha katika saraka hii.</translation>
 <translation id="945522503751344254">Tuma maoni</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index a844dff..bc8c5fe2 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608">இந்த வகை அமர்வில் <ph name="EXTENSION_NAME" /> (நீட்டிப்பு ஐடி "<ph name="EXTENSION_ID" />") ஆனது அனுமதிக்கப்படாது.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">அச்சோ! RSA தனிப்பட்ட விசையை உருவாக்குவதில் தோல்வியடைந்தது.</translation>
+<translation id="1421115928968836111">இது பாதுகாக்கப்பட்ட உள்ளடக்கத்திற்கான ஃபிளாஷ் பிளேயர் உரிமங்களின் அங்கீகாரத்தை அகற்றும்.</translation>
 <translation id="1425734930786274278">பின்வரும் குக்கீகள் தடுக்கப்பட்டன (மூன்றாம் தரப்பு குக்கீகள் எந்த விலக்கும் இன்றி தடுக்கப்பட்டன):</translation>
 <translation id="1426410128494586442">ஆம்</translation>
 <translation id="1427049173708736891">Android ஃபோன் திறக்கப்பட்டு அருகில் இருக்கும் போது, <ph name="DEVICE_TYPE" />ஐத் திறந்த நிலையில் வைத்திருக்கும்—கடவுச்சொல்லை உள்ளிட வேண்டியதில்லை.</translation>
@@ -521,6 +522,7 @@
 <translation id="1707463636381878959">பிற பயனர்களுடன் இந்தப் பிணையத்தைப் பகிர்</translation>
 <translation id="1708199901407471282">புதிய தாவல் பக்கத்திலிருந்து பரிந்துரைக்கப்பட்ட இணையப் பக்கத்தைத் திறக்கும் போது, பரிந்துரைக்கான தாவல் ஏற்கனவே திறந்திருந்தால், புதிய தாவலில் பரிந்துரையை ஏற்றுவதற்கு பதில் திறந்திருப்பதற்கு மாறும்.</translation>
 <translation id="1708338024780164500">(செயல்படா நிலையில்)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (ஐடி: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">ஜிப் செய்தல் தோல்வி, எதிர்பாராத பிழை: $1</translation>
 <translation id="1715941336038158809">செல்லாத பயனர் பெயர் அல்லது கடவுச்சொல்.</translation>
 <translation id="1717733954209022288">Google Payments கார்டைச் சேமிப்பதற்கான செக்பாக்ஸ்</translation>
@@ -797,6 +799,7 @@
 <translation id="2168214441502403371">பெர்சியன் விசைப்பலகை</translation>
 <translation id="2168725742002792683">கோப்பு  நீட்டிப்புகள்</translation>
 <translation id="2169062631698640254">எப்படியேனும் உள்நுழை</translation>
+<translation id="2175042898143291048">எப்போதும் இதைச் செய்</translation>
 <translation id="2175607476662778685">விரைவு தொடக்கப் பட்டி</translation>
 <translation id="2176045495080708525">பின்வரும் நீட்டிப்புகள் தற்போது நிறுவப்பட்டுள்ளன:</translation>
 <translation id="2177950615300672361">மறைநிலைத் தாவல்: <ph name="TAB_NAME" /></translation>
@@ -1936,7 +1939,6 @@
 <translation id="3688507211863392146">பயன்பாட்டில் நீங்கள் திறக்கும் கோப்புகள் மற்றும் கோப்புறைகளில் எழுதலாம்</translation>
 <translation id="3688526734140524629">சேனலை மாற்று</translation>
 <translation id="3688578402379768763">புதுப்பித்த நிலையில்</translation>
-<translation id="3690976161240450479">உள்நுழைவு தோல்வியானது. உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும் அல்லது மீண்டும் முயற்சிக்கவும்.</translation>
 <translation id="3693415264595406141">கடவுச்சொல்:</translation>
 <translation id="3694027410380121301">முந்தைய தாவலைத் தேர்ந்தெடு</translation>
 <translation id="3694678678240097321">எல்லா urlகளிலும் இயக்குவதற்கான அனுமதியை நீட்டிப்பு கோரியிருந்தால், பக்கத்தில் ஸ்கிர்ப்ட்டை இயக்கும் நீட்டிப்பிற்கு பயனர் ஒப்புதல் தேவை.</translation>
@@ -2233,6 +2235,7 @@
 <translation id="4116663294526079822">இந்தத் தளத்தில் எப்போதும் அனுமதி</translation>
 <translation id="411666854932687641">தனிப்பட்ட நினைவகம்</translation>
 <translation id="4118990158415604803">பிற நெட்வொர்க்குகளுடன் இணைப்பது உங்கள் நிர்வாகியால் முடக்கப்பட்டுள்ளது.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{மேலும் 1}other{மேலும் #}}</translation>
 <translation id="4119828560634133962">பதிவுசெய்வதற்கான விளம்பரங்களின் அச்சு மாதிரிக்காட்சி</translation>
 <translation id="4120329147617730038"><ph name="USER_EMAIL" /> க்கு பல உள்நுழைவை நிர்வாகி மறுத்துள்ளார்.
 தொடர்வதற்கு எல்லா பயனர்களும் வெளியேற வேண்டும்.</translation>
@@ -2372,9 +2375,11 @@
 <translation id="4345703751611431217">மென்பொருள் இணக்கமின்மை: மேலும் அறிக</translation>
 <translation id="4348766275249686434">பிழைகளைச் சேகரி</translation>
 <translation id="4350019051035968019">இந்தச் சாதனத்தை உங்கள் கணக்கிற்குச் சொந்தமான களத்தில் பதிவுசெய்ய முடியாது, ஏனெனில் சாதனமானது வேறு களத்தால் நிர்வகிக்கப்படுவதற்காகக் குறிக்கப்பட்டுள்ளது.</translation>
+<translation id="4354806558096370704">நேட்டிவ் CUPS பிரிண்டிங் பின்நிலையின் பயன்பாட்டை இயக்கும்.</translation>
 <translation id="4358697938732213860">முகவரியைச் சேர்</translation>
 <translation id="4359408040881008151">நீட்டிப்பு(கள்) சார்ந்திருப்பதன் காரணமாக நிறுவப்பட்டது.</translation>
 <translation id="4361190688154226069">காட்சிகளில் உள்ள செவ்வகம் அடிப்படையிலான இலக்கிடல்</translation>
+<translation id="4364414793200746179">Android MediaStyle அறிவிப்பு</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> பதிவிறக்கப்பட்டது</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> சாளரத்தைப் பகிர்கிறது.</translation>
 <translation id="4364830672918311045">காட்சி அறிவிப்புகள்</translation>
@@ -2775,6 +2780,7 @@
 <translation id="4988792151665380515">பொது விசையை ஏற்றுமதி செய்வதில் தோல்வியடைந்தது.</translation>
 <translation id="49896407730300355">இ&amp;டஞ்சுழியாகச் சுற்று</translation>
 <translation id="4989966318180235467">&amp;பின்புலப் பக்கத்தை ஆய்வுசெய்</translation>
+<translation id="4990343175649730969">Chrome சுத்திகரிப்புக் கருவியைப் பதிவிறக்கு</translation>
 <translation id="4991420928586866460">முதன்மை வரிசை விசைகளைச் செயல்பாட்டு விசைகளாக பயன்படுத்து</translation>
 <translation id="499165176004408815">அதிக ஒளிமாறுபாட்டு பயன்முறையைப் பயன்படுத்தவும்</translation>
 <translation id="4992066212339426712">ஒலி இயக்கு</translation>
@@ -3297,6 +3303,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: மாற்ற, தேர்ந்தெடுக்கவும்</translation>
 <translation id="5741454054957165976">WebFontsஐ ஏற்றுவதற்கான, பயனர் ஏஜென்ட் குறுக்கீட்டின் புதிய பதிப்பை இயக்கு.</translation>
 <translation id="574392208103952083">நடுநிலை</translation>
+<translation id="5744368829843057748">மொழியாக்க 2016Q2 UI</translation>
 <translation id="5745056705311424885">USB நினைவகம் கண்டறியப்பட்டது</translation>
 <translation id="5746169159649715125">PDFஆக சேமி</translation>
 <translation id="5747611503456050045">உள்ளடக்கம், செங்குத்தாக, தேவைக்கு அதிகமாக உருட்டப்படும்போது, பக்கம் மறுஏற்றம் தூண்டப்படுதல்</translation>
@@ -3404,6 +3411,7 @@
 <translation id="5884474295213649357">இந்தத் தாவல் USB சாதனத்துடன் இணைக்கப்பட்டுள்ளது.</translation>
 <translation id="5885324376209859881">மீடியா அமைப்புகளை நிர்வகி...</translation>
 <translation id="5889282057229379085">அதிகபட்ச எண்ணிக்கையிலான இடைப்பட்ட CAகள்: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">என்ன நடக்கிறது என்பதை எங்களிடம் கூறுங்கள்.</translation>
 <translation id="5892290200158927959">ஃபிரஞ்சு பீபோ விசைப்பலகை</translation>
 <translation id="5892507820957994680">உள்ளமைக்கப்பட்ட மென்பொருள் ரெண்டரிங் பட்டியலை மீறிச்சென்று, ஆதரிக்கப்படாத முறைமை உள்ளமைப்புகளில் GPU- வேகப்படுத்துதலை செயலாக்குகிறது.</translation>
 <translation id="5895138241574237353">மறுதொடக்கம்</translation>
@@ -3545,6 +3553,7 @@
 <translation id="6122093587541546701">மின்னஞ்சல் (விரும்பினால்):</translation>
 <translation id="6122875415561139701">எழுதுதல் செயல்பாடு இந்தச் சாதனத்தில் அனுமதிக்கப்படவில்லை: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="6124650939968185064">பின்வரும் நீட்டிப்புகள் இந்த நீட்டிப்பைச் சார்ந்தவை:</translation>
+<translation id="6127945163801765632">புக்மார்க் நிர்வாகியில் "எல்லா புத்தகக்குறிகள்" எனும் பிரிவை இயக்கு.</translation>
 <translation id="6129938384427316298">Netscape சான்றிதழ் கருத்துரை</translation>
 <translation id="6129953537138746214">இடைவெளி</translation>
 <translation id="6132383530370527946">சிறு அச்சு</translation>
@@ -3571,6 +3580,7 @@
 <translation id="6164005077879661055">இந்தக் கண்காணிக்கப்படும் பயனர் அகற்றப்பட்டவுடன் கண்காணிக்கப்படும் பயனருடன் தொடர்புடைய எல்லா கோப்புகளும், அகத் தரவும் நிரந்தரமாக நீக்கப்படும். இந்தக் கண்காணிக்கப்படும் பயனர் பார்வையிட்ட இணையதளங்களையும் அமைப்புகளையும் <ph name="MANAGEMENT_URL" /> இல் இன்னும் நிர்வாகியால் பார்க்க முடியும்.</translation>
 <translation id="6165508094623778733">மேலும் அறிக</translation>
 <translation id="6166185671393271715">Chromeக்குக் கடவுச்சொற்களை இறக்குதல்</translation>
+<translation id="6169666352732958425">டெஸ்க்டாப்பிற்கு அனுப்ப முடியவில்லை.</translation>
 <translation id="6171550060231646388">ஒத்தியங்கும் வன்பொருளின் 'Ok Google' அம்சங்கள்</translation>
 <translation id="6175314957787328458">Microsoft Domain GUID</translation>
 <translation id="6178664161104547336">ஒரு சான்றிதழைத் தேர்ந்தெடு</translation>
@@ -3764,6 +3774,7 @@
 <translation id="6458308652667395253">JavaScript ஐத் தடுப்பதை நிர்வகி...</translation>
 <translation id="6459488832681039634">தேடுவதற்கு தேர்ந்தெடுத்ததைப் பயன்படுத்து</translation>
 <translation id="6460423884798879930">ஏற்கனவே இணைக்கப்பட்ட கிளையன்ட்டிற்கான துவக்க SYN தொகுப்பில் கூடுதல் அங்கீகாரத் தகவலை அனுப்ப விருப்பத்தை இயக்கவும், இது தரவை விரைவாக அனுப்ப அனுமதிக்கும்.</translation>
+<translation id="6460474910028274178">தூண்டுதல் லாஜிக் மேம்படுத்தப்பட்டது, மொழியாக்கக் குமிழ் UIஐத் தேடவும்</translation>
 <translation id="6460601847208524483">அடுத்ததைக் கண்டுபிடி</translation>
 <translation id="6462080265650314920">உள்ளடக்க வகை "<ph name="CONTENT_TYPE" />" உடன் பயன்பாடுகள் வழங்கப்பட வேண்டும்.</translation>
 <translation id="6462082050341971451">இருக்கிறீர்களா?</translation>
@@ -3893,6 +3904,7 @@
 <translation id="6663792236418322902">நீங்கள் தேர்வு செய்யும் கடவுச்சொல், இந்தக் கோப்பைப் பின்னர் மீட்டெடுப்பதற்கு தேவைப்படும்.  இதை ஒரு பாதுகாப்பான இருப்பிடத்தில் பதிவுசெய்க.</translation>
 <translation id="6664237456442406323">எதிர்பாராதவிதமாக, உங்கள் கணினியானது ஒரு தவறான வன்பொருள் ஐடியுடன் உள்ளமைக்கப்பட்டது. இதனால் சமீபத்திய பாதுகாப்பு திருத்தங்கள் மூலம் Chrome OS ஐப் புதுப்பிப்பதிலிருந்து தடுக்கும், உங்கள் கணினி <ph name="BEGIN_BOLD" />தீங்கிழைக்கும் தாக்குதல்களின்<ph name="END_BOLD" /> மூலம் பாதிக்கப்படலாம்.</translation>
 <translation id="6666647326143344290">Google கணக்கின் மூலமாக</translation>
+<translation id="667517062706956822">இந்தப் பக்கத்தை <ph name="SOURCE_LANGUAGE" /> மொழியிலிருந்து <ph name="TARGET_LANGUAGE" /> மொழிக்கு Google மொழிபெயர்க்க வேண்டும் என விரும்புகிறீர்களா?</translation>
 <translation id="6675665718701918026">சுட்டும் சாதனம் இணைக்கப்பட்டது</translation>
 <translation id="6677037229676347494">எதிர்பார்க்கப்பட்ட ID "<ph name="EXPECTED_ID" />", ஆனால் ID "<ph name="NEW_ID" />" ஆகும்.</translation>
 <translation id="6680028776254050810">பயனர்களை மாற்று</translation>
@@ -3944,6 +3956,7 @@
 <translation id="6746392203843147041">ஒலியை அதிகரி</translation>
 <translation id="6748140994595080445"><ph name="APP_NAME" /> மொழிகளை எப்படிக் கையாளுகிறது மற்றும் காண்பிக்கிறது என்பதை மாற்றவும்.</translation>
 <translation id="6748465660675848252">தொடர்ந்தாலும், ஒத்திசைக்கப்பட்ட தரவும் அமைப்புகளும் மட்டுமே மீட்டெடுக்கப்படும். சிஸ்டத்தின் அகத் தரவு முழுவதையும் இழப்பீர்கள்.</translation>
+<translation id="6751256176799620176">1 கோப்புறை தேர்ந்தெடுக்கப்பட்டது</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (மறைநிலை)</translation>
 <translation id="6759193508432371551">தொழிற்சாலை மீட்டமைவு</translation>
 <translation id="6760765581316020278">வியட்நாமிய விசைப்பலகை (VNI)</translation>
@@ -4574,6 +4587,7 @@
 <translation id="7717014941119698257">பதிவிறக்குகிறது: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">பயிற்சி காலாவதியானது</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262">இவரைக் கண்காணிக்க, <ph name="BEGIN_LINK" />Chrome இல் உள்நுழையவும்<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">வெட்டு</translation>
 <translation id="7730449930968088409">உங்கள் திரையின் உள்ளடக்கத்தைப் பதிவுசெய்யலாம்</translation>
 <translation id="7730494089396812859">மேகக்கணி காப்புப் பிரதி விவரங்களைக் காட்டு</translation>
@@ -4667,7 +4681,6 @@
 <translation id="7859704718976024901">உலாவல் வரலாறு</translation>
 <translation id="7861215335140947162">&amp;பதிவிறக்கங்கள்</translation>
 <translation id="7864539943188674973">புளூடூத்தை முடக்கு</translation>
-<translation id="7868891395842935202">API பரிசோதனைகளுக்கான கட்டுப்பாட்டு அணுகலுக்கு பரிசோதனைக் கட்டமைப்பை இயக்கும்.</translation>
 <translation id="7870576007982733437">பொருத்தமானபோது, கணினி பதிவிறக்க நிர்வாகியைப் பயன்படுத்தவும்</translation>
 <translation id="7870790288828963061">புதிய பதிப்பு கொண்ட கியாஸ்க் பயன்பாடுகள் எதுவும் காணப்படவில்லை. புதுப்பிக்க எதுவுமில்லை. USB சாதனத்தை அகற்றவும்.</translation>
 <translation id="787150342916295244">கிரெடிட் கார்டு ஸ்கேனிங்</translation>
@@ -4996,7 +5009,6 @@
 <translation id="8309505303672555187">நெட்வொர்க்கைத் தேர்ந்தெடு:</translation>
 <translation id="8312871300878166382">கோப்புறையில் ஒட்டு</translation>
 <translation id="8314013494437618358">தொடரிழைத் தொகுப்பு</translation>
-<translation id="8314576811984836978">பரிசோதனைக் கட்டமைப்பு.</translation>
 <translation id="8319414634934645341">நீட்டிக்கப்பட்ட விசைப் பயன்பாடு</translation>
 <translation id="8322814362483282060">இந்தப் பக்கம் உங்கள் மைக்ரோஃபோனை அணுகுவதிலிருந்து தடுக்கப்பட்டுள்ளது.</translation>
 <translation id="8326478304147373412">PKCS #7, சான்றிதழ் சங்கிலி</translation>
@@ -5057,7 +5069,6 @@
 <translation id="8418240940464873056">ஹஞ்ஜா பயன்முறை</translation>
 <translation id="8418445294933751433">தாவலாக &amp;காண்பி</translation>
 <translation id="8420060421540670057">Google டாக்ஸ் கோப்புகளைக் காண்பி</translation>
-<translation id="8420728540268437431">இந்தப் பக்கம் மொழிபெயர்க்கப்படுகிறது...</translation>
 <translation id="842274098655511832">WebGL வரைவு நீட்டிப்புகள்</translation>
 <translation id="8424039430705546751">கீழ்</translation>
 <translation id="8425213833346101688">மாற்று</translation>
@@ -5245,6 +5256,7 @@
 <translation id="8690754533598178758">Adobe Flash Player மைக்ரோஃபோன் விதிவிலக்குகள் வித்தியாசமானவை.</translation>
 <translation id="8691686986795184760">(நிறுவனக் கொள்கையால் இயக்கப்பட்டது)</translation>
 <translation id="869257642790614972">கடைசியாக-மூடப்பட்ட தாவலைத் திற</translation>
+<translation id="8695770993395462321">நேட்டிவ் CUPS</translation>
 <translation id="8695825812785969222">Open &amp;Location...</translation>
 <translation id="8698464937041809063">Google வரைதல்</translation>
 <translation id="869884720829132584">பயன்பாடுகள் மெனு</translation>
@@ -5586,6 +5598,7 @@
 <translation id="9189690067274055051">உள்ளிடுவதற்காக, ஃபோனைத் திறந்து, <ph name="DEVICE_TYPE" />இன் அருகில் கொண்டுவரவும்.</translation>
 <translation id="9190063653747922532">L2TP/IPsec + முன்பே-பகிர்ந்து கொள்ளப்பட்ட விசை</translation>
 <translation id="9201305942933582053">Chrome க்கான Google Now!</translation>
+<translation id="9202646163273566462">எல்லா புத்தகக்குறிகள் காட்சியையும் புக்மார்க் நிர்வாகியின் இயல்பு இலக்கிடமாக இயக்கும்.</translation>
 <translation id="9203398526606335860">&amp;சுயவிவரமாக்கம் இயக்கப்பட்டது</translation>
 <translation id="9203478404496196495">தாவலை இயக்கு</translation>
 <translation id="9203962528777363226">இந்தச் சாதனத்தில் புதியவர்கள் சேர்க்கப்படுவதை இதன் நிர்வாகி முடக்கியுள்ளார்</translation>
@@ -5612,6 +5625,7 @@
 <translation id="939736085109172342">புதிய கோப்புறை</translation>
 <translation id="940425055435005472">எழுத்துரு அளவு:</translation>
 <translation id="941543339607623937">செல்லாத தனிப்பட்ட விசை.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{ஏதுமில்லை}=1{1 பயன்பாடு ($1)}=2{2 பயன்பாடுகள் ($1, $2)}other{# பயன்பாடுகள் ($1, $2, $3)}}</translation>
 <translation id="942532530371314860">Chrome தாவலையும் ஆடியோவையும் <ph name="APP_NAME" /> பகிர்கிறது.</translation>
 <translation id="942954117721265519">இந்தக் கோப்பகத்தில் படங்கள் இல்லை.</translation>
 <translation id="945522503751344254">பின்னூட்டம் அனுப்புக</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index a2eb768a..0298c2b 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (పొడిగింపు ID "<ph name="EXTENSION_ID" />") ఈ రకమైన సెషన్‌లో అనుమతించబడదు.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">అరె! RSA ప్రైవేట్ కీని రాండమ్‌గా రూపొందించడంలో విఫలమైంది.</translation>
+<translation id="1421115928968836111">ఇది సంరక్షిత కంటెంట్ కోసం Flash ప్లేయర్ లైసెన్స్‌ల ప్రామాణికతను రద్దు చేస్తుంది.</translation>
 <translation id="1425734930786274278">ఈ క్రింది కుక్కీలు నిరోధించబడ్డాయి (మూడవ-పార్టీ కుక్కీలు మినహాయింపు లేకుండా నిరోధించబడుతున్నాయి):</translation>
 <translation id="1426410128494586442">అవును</translation>
 <translation id="1427049173708736891">మీ Android ఫోన్ అన్‌లాక్ చేయబడి, సమీపంలో ఉంటే మీ <ph name="DEVICE_TYPE" /> అన్‌లాక్ అయ్యేలా చేయండి, అప్పుడు మీ పాస్‌వర్డ్‌ను టైప్ చేయాల్సిన అవసరం ఉండదు.</translation>
@@ -521,6 +522,7 @@
 <translation id="1707463636381878959">ఇతర వినియోగదారులతో ఈ నెట్‌వర్క్‌ను భాగస్వామ్యం చెయ్యి</translation>
 <translation id="1708199901407471282">సూచిత వెబ్ పేజీని కొత్త ట్యాబ్ పేజీలో నుండి తెరుస్తున్నప్పుడు, సూచన కోసం ట్యాబ్ ఇప్పటికే తెరవబడి ఉంటే, సూచనను కొత్త ట్యాబ్‌లో లోడ్ చేయడానికి బదులుగా ఆ ట్యాబ్‌కి మారుస్తుంది.</translation>
 <translation id="1708338024780164500">(క్రియారహితం)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">జిప్ చేయడంలో విఫలమైంది, ఊహించని లోపం: $1</translation>
 <translation id="1715941336038158809">చెల్లని వినియోగదారు పేరు లేదా పాస్‌వర్డ్.</translation>
 <translation id="1717733954209022288">Google చెల్లింపుల కార్డ్ సేవ్ చేసే తనిఖీ పెట్టె</translation>
@@ -797,6 +799,7 @@
 <translation id="2168214441502403371">పర్షియన్ కీబోర్డ్</translation>
 <translation id="2168725742002792683">ఫైల్ ఎక్స్‌టెన్షన్స్‌</translation>
 <translation id="2169062631698640254">ఏదేమైనా సైన్ ఇన్ చేయి</translation>
+<translation id="2175042898143291048">ఎల్లప్పుడూ దీన్ని చేయి</translation>
 <translation id="2175607476662778685">శీఘ్ర ప్రాయోగిక పట్టీ</translation>
 <translation id="2176045495080708525">క్రింది పొడిగింపులు ఇప్పుడు వ్యవస్థాపించబడ్డాయి:</translation>
 <translation id="2177950615300672361">అజ్ఞాత ట్యాబ్: <ph name="TAB_NAME" /></translation>
@@ -1936,7 +1939,6 @@
 <translation id="3688507211863392146">మీరు అనువర్తనంలో తెరిచే ఫైల్‌లు మరియు ఫోల్డర్‌ల్లో వ్రాయండి</translation>
 <translation id="3688526734140524629">ఛానెల్‌ను మార్చు</translation>
 <translation id="3688578402379768763">తాజాగా ఉంది</translation>
-<translation id="3690976161240450479">సైన్-ఇన్ విఫలమైంది. దయచేసి మీ నిర్వాహకుడిని సంప్రదించండి లేదా మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="3693415264595406141">పాస్‌వర్డ్:</translation>
 <translation id="3694027410380121301">మునుపటి టాబ్‌ను ఎంచుకో</translation>
 <translation id="3694678678240097321">పొడిగింపును అన్ని urlల్లో అమలు చేయడానికి అనుమతిని అభ్యర్థించి ఉంటే, పొడిగింపు పేజీలో ఒక స్క్రిప్ట్‌ను అమలు చేయడానికి వినియోగదారు సమ్మతి అవసరం.</translation>
@@ -2232,6 +2234,7 @@
 <translation id="4116663294526079822">ఈ సైట్‌లో ఎల్లప్పుడూ అనుమతించు</translation>
 <translation id="411666854932687641">వ్యక్తిగత మెమరీ</translation>
 <translation id="4118990158415604803">ఇతర నెట్‌వర్క్‌లకు కనెక్ట్ చేయడాన్ని మీ నిర్వాహకులు నిలిపివేసారు.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{మరియు మరొకటి}other{మరియు మరో #}}</translation>
 <translation id="4119828560634133962">ముద్రణ పరిదృశ్యం నమోదు ప్రోమోలు</translation>
 <translation id="4120329147617730038">ఒక నిర్వాహకుడు <ph name="USER_EMAIL" /> కోసం బహుళ సైన్-ఇన్ అనుమతిని తిరస్కరించారు.
 కొనసాగడానికి అందరు వినియోగదారులు తప్పనిసరిగా సైన్ అవుట్ చేయాలి.</translation>
@@ -2371,9 +2374,11 @@
 <translation id="4345703751611431217">సాఫ్ట్‌వేర్ అననుకూలత: మరింత తెలుసుకోండి</translation>
 <translation id="4348766275249686434">లోపాలను సేకరించు</translation>
 <translation id="4350019051035968019">ఈ పరికరాన్ని మీ ఖాతా చెందిన డొమైన్‌కు నమోదు చేయడం సాధ్యపడదు ఎందుకంటే పరికరం వేరే డొమైన్ ద్వారా నిర్వహించబడేలా గుర్తించబడింది.</translation>
+<translation id="4354806558096370704">స్థానిక CUPS ముద్రణ బ్యాకెండ్ వినియోగాన్ని ప్రారంభిస్తుంది.</translation>
 <translation id="4358697938732213860">చిరునామాను జోడించండి</translation>
 <translation id="4359408040881008151">ఆధారిత పొడిగింపు(లు) కారణంగా ఇన్‌స్టాల్ చేయబడింది.</translation>
 <translation id="4361190688154226069">వీక్షణల్లో దీర్ఘ చతురస్ర-ఆధారిత లక్ష్య విధానం</translation>
+<translation id="4364414793200746179">Android మీడియా శైలి నోటిఫికేషన్</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> డౌన్‌లోడ్ చేయబడింది</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> ఒక విండోను భాగస్వామ్యం చేస్తోంది.</translation>
 <translation id="4364830672918311045">నోటిఫికేషన్‌లను ప్రదర్శించడం</translation>
@@ -2777,6 +2782,7 @@
 <translation id="4988792151665380515">పబ్లిక్ కీని ఎగుమతి చేయడానికి విఫలమైంది.</translation>
 <translation id="49896407730300355">అ&amp;పసవ్యదిశలో తిప్పు</translation>
 <translation id="4989966318180235467">&amp;నేపథ్య పేజీని పర్యవేక్షించు</translation>
+<translation id="4990343175649730969">Chrome శుభ్రత సాధనాన్ని డౌన్‌లోడ్ చేయి</translation>
 <translation id="4991420928586866460">ఎగువ-అడ్డు వరుస కీలను ఫంక్షన్ కీల వలె పరిగణించు</translation>
 <translation id="499165176004408815">అధిక కాంట్రాస్ట్ మోడ్‌ను ఉపయోగించు</translation>
 <translation id="4992066212339426712">అన్‌మ్యూట్ చేయి</translation>
@@ -3300,6 +3306,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: సవరించడానికి ఎంచుకోండి</translation>
 <translation id="5741454054957165976">WebFonts లోడింగ్ కోసం వినియోగదారు ఏజెంట్ మధ్యవర్తిత్వం కొత్త సంస్కరణను ప్రారంభిస్తుంది.</translation>
 <translation id="574392208103952083">మధ్యస్థం</translation>
+<translation id="5744368829843057748">అనువాదం 2016 క్వా2 UI</translation>
 <translation id="5745056705311424885">USB మెమరీ స్టిక్ కనుగొనబడింది</translation>
 <translation id="5746169159649715125">PDF వలె సేవ్ చేయి</translation>
 <translation id="5747611503456050045">నిలువు అతివ్యాప్త స్క్రోలింగ్ కంటెంట్ ద్వారా సక్రియం చేయబడిన పేజీ రీలోడ్‌లు.</translation>
@@ -3407,6 +3414,7 @@
 <translation id="5884474295213649357">ఈ ట్యాబ్ USB పరికరానికి కనెక్ట్ చేయబడింది.</translation>
 <translation id="5885324376209859881">మీడియా సెట్టింగ్‌లను నిర్వహించండి...</translation>
 <translation id="5889282057229379085">ఇంటర్మీడియట్ CAల అత్యధిక సంఖ్య: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">ఏమి జరుగుతోందో మాకు చెప్పండి.</translation>
 <translation id="5892290200158927959">ఫ్రెంచ్ BÉPO కీబోర్డ్</translation>
 <translation id="5892507820957994680">అంతర్నిర్మాణ సాఫ్ట్‌వేర్ రెండరింగ్ జాబితాను భర్తీ చేస్తుంది మరియు మద్దతు ఇవ్వని సిస్టమ్ వద్ద GPU-త్వరణంను అనుమతిస్తుంది.</translation>
 <translation id="5895138241574237353">మళ్ళీ ప్రారంభించు</translation>
@@ -3548,6 +3556,7 @@
 <translation id="6122093587541546701">ఇమెయిల్ (ఐచ్ఛికం):</translation>
 <translation id="6122875415561139701">దీనిలో వ్రాసే చర్యకు అనుమతి లేదు: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="6124650939968185064">క్రింది పొడిగింపులు ఈ పొడిగింపుపై ఆధారపడి ఉంటాయి:</translation>
+<translation id="6127945163801765632">బుక్‌మార్క్ నిర్వాహికిలో "అన్ని బుక్‌మార్క్‌లు" విభాగాన్ని ప్రారంభించండి.</translation>
 <translation id="6129938384427316298">Netscape సర్టిఫికెట్ వ్యాఖ్య</translation>
 <translation id="6129953537138746214">ఖాళీ</translation>
 <translation id="6132383530370527946">చిన్న ముద్రణ</translation>
@@ -3574,6 +3583,7 @@
 <translation id="6164005077879661055">ఈ పర్యవేక్షించబడే వినియోగదారు తీసివేయబడినప్పుడు పర్యవేక్షించబడే వినియోగదారుతో అనుబంధించబడిన అన్ని ఫైల్‌లు మరియు స్థానిక డేటా శాశ్వతంగా తొలగించబడతాయి. ఈ పర్యవేక్షించబడే వినియోగదారు సందర్శించిన వెబ్‌సైట్‌లు మరియు వీరి సెట్టింగ్‌లు ఇప్పటికీ <ph name="MANAGEMENT_URL" />లో నిర్వాహకునికి కనిపించవచ్చు.</translation>
 <translation id="6165508094623778733">మరింత తెలుసుకోండి</translation>
 <translation id="6166185671393271715">Chromeకి పాస్‌వర్డ్‌లను దిగుమతి చేయండి</translation>
+<translation id="6169666352732958425">డెస్క్‌టాప్‌ను ప్రసారం చేయడం సాధ్యపడలేదు.</translation>
 <translation id="6171550060231646388">సిమ్యులేట్ చేసిన హార్డ్‌వేర్ 'Ok Google' లక్షణాలు</translation>
 <translation id="6175314957787328458">Microsoft డొమైన్ GUID</translation>
 <translation id="6178664161104547336">ఒక సర్టిఫికెట్ని ఎంచుకోండి</translation>
@@ -3767,6 +3777,7 @@
 <translation id="6458308652667395253">JavaScript నిరోధించడాన్ని నిర్వహించు...</translation>
 <translation id="6459488832681039634">కనుగొనడానికి ఎంపికను ఉపయోగించండి</translation>
 <translation id="6460423884798879930">మునుపు కనెక్ట్ చేయబడిన క్లయింట్ కోసం వేగంగా డేటాను పంపడాన్ని ప్రారంభించడానికి అనుమతిస్తూ, ప్రాథమిక SYN ప్యాకెట్‌లో అదనపు ప్రామాణీకరణ సమాచారాన్ని పంపడానికి ఎంపికను ప్రారంభించండి.</translation>
+<translation id="6460474910028274178">అనువాద బబుల్ UI యొక్క ట్రిగ్గర్ చేసే లాజిక్ మరియు రూపం మెరుగుపరచబడ్డాయి</translation>
 <translation id="6460601847208524483">తదుపరిది కనుగొను</translation>
 <translation id="6462080265650314920">అనువర్తనాలు తప్పనిసరిగా "<ph name="CONTENT_TYPE" />" కంటెంట్-రకంతో అందించబడాలి.</translation>
 <translation id="6462082050341971451">మీరు ఇంకా అక్కడ ఉన్నారా?</translation>
@@ -3896,6 +3907,7 @@
 <translation id="6663792236418322902">మీరు ఎంచుకున్న పాస్‌వర్డ్ ఈ ఫైల్‌ని తర్వాత పునరుద్ధరించడానికి అవసరం అవుతుంది.  దయచేసి దీన్ని సురక్షితమైన స్థానంలో నమోదు చెయ్యండి.</translation>
 <translation id="6664237456442406323">దురదృష్టవశాత్తూ, మీ కంప్యూటర్ తప్పుగా ఆకృతి చేయబడిన హార్డ్‌వేర్ IDతో కాన్ఫిగర్ చేయబడింది. ఇది తాజా భద్రతా పరిష్కారాలతో నవీకరించబడనీయకుండా Chrome OSని నిరోధిస్తుంది మరియు మీ కంప్యూటర్ <ph name="BEGIN_BOLD" />హానికరమైన దాడులకు గురి కావచ్చు<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">మీ Google ఖాతాతో</translation>
+<translation id="667517062706956822">ఈ పేజీని Google <ph name="SOURCE_LANGUAGE" /> నుండి <ph name="TARGET_LANGUAGE" />కి అనువదించాలని మీరు కోరుకుంటున్నారా?</translation>
 <translation id="6675665718701918026">సూచిస్తున్న పరికరం కనెక్ట్ చేయబడింది</translation>
 <translation id="6677037229676347494">ఆశించిన ID "<ph name="EXPECTED_ID" />", కానీ "<ph name="NEW_ID" />" ID అందించబడింది.</translation>
 <translation id="6680028776254050810">వినియోగదారులను మార్చు</translation>
@@ -3947,6 +3959,7 @@
 <translation id="6746392203843147041">వాల్యూ. పెంచు</translation>
 <translation id="6748140994595080445"><ph name="APP_NAME" /> భాషలను ఎలా నిర్వహిస్తుంది మరియు ప్రదర్శిస్తుంది అనేదాన్ని మార్చండి.</translation>
 <translation id="6748465660675848252">మీరు కొనసాగించవచ్చు, కానీ మీ సమకాలీకరించిన డేటా మరియు సెట్టింగ్‌లు మాత్రమే పునరుద్ధరించబడతాయి. మొత్తం స్థానిక డేటాని కోల్పోవడం జరుగుతుంది.</translation>
+<translation id="6751256176799620176">1 ఫోల్డర్ ఎంచుకోబడింది</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (అజ్ఞాతంగా)</translation>
 <translation id="6759193508432371551">ఫ్యాక్టరీ రీసెట్</translation>
 <translation id="6760765581316020278">వియత్నామీస్ కీబోర్డ్ (VNI)</translation>
@@ -4586,6 +4599,7 @@
 <translation id="7717014941119698257">డౌన్‌లోడ్ అవుతోంది: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">శిక్షణ గడువు సమయం ముగిసింది</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262">ఈ వ్యక్తిని పర్యవేక్షించడానికి, <ph name="BEGIN_LINK" />Chromeకి సైన్ ఇన్ చేయండి<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">కత్తిరించు</translation>
 <translation id="7730449930968088409">మీ స్క్రీన్ కంటెంట్‌ని క్యాప్చర్ చేయండి</translation>
 <translation id="7730494089396812859">Cloud బ్యాకప్ వివరాలను చూపు</translation>
@@ -4679,7 +4693,6 @@
 <translation id="7859704718976024901">బ్రౌజింగ్ చరిత్ర</translation>
 <translation id="7861215335140947162">&amp;డౌన్‌లోడ్‌లు</translation>
 <translation id="7864539943188674973">Bluetoothని నిలిపివేయి</translation>
-<translation id="7868891395842935202">API ప్రయోగాలకు ప్రాప్యతను నియంత్రించడం కోసం ప్రయోగాత్మక ఫ్రేమ్‌వర్క్‌ను ప్రారంభిస్తుంది.</translation>
 <translation id="7870576007982733437">వర్తించే సమయంలో సిస్టమ్ డౌన్‌లోడ్ నిర్వాహికిని ఉపయోగించండి.</translation>
 <translation id="7870790288828963061">సరికొత్త సంస్కరణ అందుబాటులో ఉన్న కియోస్క్ అనువర్తనాలేవీ కనుగొనబడలేదు. నవీకరించడానికి ఏదీ లేదు. దయచేసి USB స్టిక్‌ను తీసివేయండి.</translation>
 <translation id="787150342916295244">క్రెడిట్ కార్డ్ స్కానింగ్</translation>
@@ -5005,7 +5018,6 @@
 <translation id="8309505303672555187">నెట్‌వర్క్‌ను ఎంచుకోండి:</translation>
 <translation id="8312871300878166382">ఫోల్డర్‌లోకి అతికించు</translation>
 <translation id="8314013494437618358">కూర్చడం థ్రెడ్ చేయబడింది</translation>
-<translation id="8314576811984836978">ప్రయోగాత్మక ఫ్రేమ్‌వర్క్.</translation>
 <translation id="8319414634934645341">విస్తరించిన కీ ఉపయోగం</translation>
 <translation id="8322814362483282060">మీ మైక్రోఫోన్‌ను ప్రాప్యత చేయనీయకుండా ఈ పేజీ బ్లాక్ చేయబడింది.</translation>
 <translation id="8326478304147373412">PKCS #7, సర్టిఫికెట్ చైన్</translation>
@@ -5066,7 +5078,6 @@
 <translation id="8418240940464873056">హంజా మోడ్</translation>
 <translation id="8418445294933751433">టాబ్ వలె &amp;చూపించు</translation>
 <translation id="8420060421540670057">Google డాక్స్ ఫైల్‌లను చూపించు</translation>
-<translation id="8420728540268437431">ఈ పేజీ అనువదించబడుతోంది ...</translation>
 <translation id="842274098655511832">WebGL చిత్తుప్రతి పొడిగింపులు</translation>
 <translation id="8424039430705546751">క్రిందికి</translation>
 <translation id="8425213833346101688">మార్చు</translation>
@@ -5253,6 +5264,7 @@
 <translation id="8690754533598178758">Adobe Flash Player మైక్రోఫోన్ మినహాయింపులు భిన్నమైనవి.</translation>
 <translation id="8691686986795184760">(వ్యాపార విధానంచే ప్రారంభించబడింది)</translation>
 <translation id="869257642790614972">చివరగా-మూసివేసిన టాబ్‌ని మళ్ళీ తెరువు</translation>
+<translation id="8695770993395462321">స్థానిక CUPS</translation>
 <translation id="8695825812785969222">స్థానాన్ని &amp;తెరువు...</translation>
 <translation id="8698464937041809063">Google డ్రాయింగ్</translation>
 <translation id="869884720829132584">అనువర్తనాల మెను</translation>
@@ -5594,6 +5606,7 @@
 <translation id="9189690067274055051">నమోదు చేయడానికి మీ ఫోన్‌ని అన్‌లాక్ చేసి, దాన్ని <ph name="DEVICE_TYPE" /> సమీపంలోకి తీసుకురండి.</translation>
 <translation id="9190063653747922532">L2TP/IPsec + ముందుగా భాగస్వామ్యం చేసిన కీ</translation>
 <translation id="9201305942933582053">Chrome కోసం Google Now!</translation>
+<translation id="9202646163273566462">అన్ని బుక్‌మార్క్‌ల వీక్షణను బుక్‌మార్క్ నిర్వాహికి డిఫాల్ట్ గమ్యస్థలంగా ప్రారంభిస్తుంది.</translation>
 <translation id="9203398526606335860">&amp;ప్రొఫైలింగ్ అనుమతించబడింది</translation>
 <translation id="9203478404496196495">ట్యాబ్‌ను అన్‌మ్యూట్ చేయి</translation>
 <translation id="9203962528777363226">ఈ పరికరం యొక్క నిర్వాహకుడు క్రొత్త వినియోగదారులను జోడించడం నిలిపివేసారు</translation>
@@ -5620,6 +5633,7 @@
 <translation id="939736085109172342">క్రొత్త  ఫోల్డర్</translation>
 <translation id="940425055435005472">ఫాంట్ పరిమాణం:</translation>
 <translation id="941543339607623937">చెల్లని ప్రైవేట్ కీ.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{ఏదీ లేదు}=1{1 అనువర్తనం ($1)}=2{2 అనువర్తనాలు ($1, $2)}other{# అనువర్తనాలు ($1, $2, $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> ఒక Chrome ట్యాబ్‌ను మరియు ఆడియోను భాగస్వామ్యం చేస్తోంది.</translation>
 <translation id="942954117721265519">ఈ డైరెక్టరీలో చిత్రాలు లేవు.</translation>
 <translation id="945522503751344254">అభిప్రాయాన్ని పంపండి</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index 59ed5dae..a92a67c2 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (รหัสส่วนขยาย "<ph name="EXTENSION_ID" />") ไม่ได้รับอนุญาตในเซสชันประเภทนี้</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">อ้าว! ไม่สามารถสร้างคีย์ส่วนตัว RSA แบบสุ่มได้</translation>
+<translation id="1421115928968836111">ตัวเลือกนี้จะยกเลิกการให้สิทธิ์ใบอนุญาต Flash Player สำหรับเนื้อหาที่มีการคุ้มครอง</translation>
 <translation id="1425734930786274278">คุกกี้ต่อไปนี้ถูกปิดกั้น (มีการปิดกั้นคุกกี้บุคคลที่สามโดยไม่มีข้อยกเว้น): </translation>
 <translation id="1426410128494586442">ใช่</translation>
 <translation id="1427049173708736891">ไม่ต้องล็อก <ph name="DEVICE_TYPE" /> เมื่อโทรศัพท์ Android ไม่ได้ล็อกอยู่และอยู่ใกล้ๆ ไม่ต้องพิมพ์รหัสผ่าน</translation>
@@ -521,6 +522,7 @@
 <translation id="1707463636381878959">แชร์เครือข่ายนี้กับผู้ใช้อื่น</translation>
 <translation id="1708199901407471282">เมื่อเปิดหน้าเว็บที่แนะนำจากหน้าแท็บใหม่ ถ้าเปิดแท็บหนึ่งไว้แล้วสำหรับหน้าที่แนะนำนั้น ให้เปลี่ยนไปยังแท็บนั้นแทนการโหลดหน้าที่แนะนำในแท็บใหม่ดังกล่าว</translation>
 <translation id="1708338024780164500">(ไม่ใช้งาน)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">การซิปล้มเหลว ข้อผิดพลาดที่ไม่คาดคิด: $1</translation>
 <translation id="1715941336038158809">ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง</translation>
 <translation id="1717733954209022288">ช่องทำเครื่องหมายการบันทึกบัตร Google Payments</translation>
@@ -797,6 +799,7 @@
 <translation id="2168214441502403371">แป้นพิมพ์ภาษาเปอร์เซีย</translation>
 <translation id="2168725742002792683">ส่วนขยายไฟล์</translation>
 <translation id="2169062631698640254">ลงชื่อเข้าใช้ต่อไป</translation>
+<translation id="2175042898143291048">แปลเสมอ</translation>
 <translation id="2175607476662778685">แถบเปิดใช้งานด่วน</translation>
 <translation id="2176045495080708525">ติดตั้งส่วนขยายต่อไปนี้แล้ว:</translation>
 <translation id="2177950615300672361">แท็บไม่ระบุตัวตน: <ph name="TAB_NAME" /></translation>
@@ -1935,7 +1938,6 @@
 <translation id="3688507211863392146">เขียนไปยังไฟล์และโฟลเดอร์ที่คุณเปิดในแอปพลิเคชัน</translation>
 <translation id="3688526734140524629">เปลี่ยนช่อง</translation>
 <translation id="3688578402379768763">ทันสมัย</translation>
-<translation id="3690976161240450479">การลงชื่อเข้าใช้ล้มเหลว โปรดติดต่อผู้ดูแลระบบของคุณหรือลองอีกครั้ง</translation>
 <translation id="3693415264595406141">รหัสผ่าน:</translation>
 <translation id="3694027410380121301">เลือกแท็บก่อนหน้า</translation>
 <translation id="3694678678240097321">การเรียกใช้สคริปต์บนหน้านี้ของส่วนขยายต้องได้รับการยินยอมจากผู้ใช้ หากส่วนขยายขอสิทธิ์ในการทำงานบนทุก URL</translation>
@@ -2231,6 +2233,7 @@
 <translation id="4116663294526079822">อนุญาตบนไซต์นี้เสมอ</translation>
 <translation id="411666854932687641">หน่วยความจำส่วนตัว</translation>
 <translation id="4118990158415604803">ผู้ดูแลระบบปิดใช้การเชื่อมต่อเครือข่ายอื่นๆ</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{และอีก 1 แอป}other{และอีก # แอป}}</translation>
 <translation id="4119828560634133962">การส่งเสริมการลงทะเบียนหน้าตัวอย่างก่อนพิมพ์</translation>
 <translation id="4120329147617730038">ผู้ดูแลระบบไม่อนุญาตให้ <ph name="USER_EMAIL" /> ลงชื่อเข้าสู่ระบบพร้อมกันหลายบัญชี
 ผู้ใช้ทุกคนต้องออกจากระบบเพื่อดำเนินการต่อ</translation>
@@ -2370,9 +2373,11 @@
 <translation id="4345703751611431217">ความเข้ากันไม่ได้ของซอฟต์แวร์: เรียนรู้เพิ่มเติม</translation>
 <translation id="4348766275249686434">รวบรวมข้อผิดพลาด</translation>
 <translation id="4350019051035968019">ไม่สามารถลงทะเบียนอุปกรณ์นี้กับโดเมนที่บัญชีของคุณใช้อยู่ได้ เนื่องจากอุปกรณ์มีการทำเครื่องหมายไว้ว่าได้รับการจัดการจากโดเมนอื่น</translation>
+<translation id="4354806558096370704">เปิดการใช้งานแบ็กเอนด์การพิมพ์ CUPS แบบดั้งเดิม</translation>
 <translation id="4358697938732213860">เพิ่มที่อยู่</translation>
 <translation id="4359408040881008151">ติดตั้งแล้วเนื่องจากมีส่วนขยายที่ต้องพึ่งพา</translation>
 <translation id="4361190688154226069">การกำหนดเป้าหมายแบบรูปสี่เหลี่ยมผืนผ้าในมุมมองต่างๆ</translation>
+<translation id="4364414793200746179">การแจ้งเตือน Android MediaStyle</translation>
 <translation id="4364444725319685468">ดาวน์โหลด <ph name="FILE_NAME" /> แล้ว</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> กำลังแชร์หน้าต่าง</translation>
 <translation id="4364830672918311045">แสดงการแจ้งเตือน</translation>
@@ -2775,6 +2780,7 @@
 <translation id="4988792151665380515">ไม่สามารถส่งออกคีย์สาธารณะ</translation>
 <translation id="49896407730300355">หมุน&amp;ทวนเข็มนาฬิกา</translation>
 <translation id="4989966318180235467">ตรวจสอบ&amp;หน้าพื้นหลัง</translation>
+<translation id="4990343175649730969">ดาวน์โหลดเครื่องมือทำความสะอาด Chrome</translation>
 <translation id="4991420928586866460">ใช้แป้นแถวบนสุดเป็นแป้นฟังก์ชัน</translation>
 <translation id="499165176004408815">ใช้โหมดคอนทราสต์สูง</translation>
 <translation id="4992066212339426712">เปิดเสียง</translation>
@@ -3298,6 +3304,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: เลือกเพื่อแก้ไข</translation>
 <translation id="5741454054957165976">เปิดใช้การแทรกแซงของ user agent เวอร์ชันใหม่สำหรับการโหลด WebFonts</translation>
 <translation id="574392208103952083">ขนาดกลาง</translation>
+<translation id="5744368829843057748">แปล 2016Q2 UI</translation>
 <translation id="5745056705311424885">ตรวจพบอุปกรณ์หน่วยความจำ USB</translation>
 <translation id="5746169159649715125">บันทึกเป็น PDF</translation>
 <translation id="5747611503456050045">การโหลดหน้าใหม่ที่ทริกเกอร์โดยเนื้อหาการเลื่อนเกินในแนวตั้ง</translation>
@@ -3405,6 +3412,7 @@
 <translation id="5884474295213649357">แท็บนี้เชื่อมต่อกับอุปกรณ์ USB อยู่</translation>
 <translation id="5885324376209859881">จัดการการตั้งค่าสื่อ...</translation>
 <translation id="5889282057229379085">จำนวนสูงสุดของ CA ระดับกลาง: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">แจ้งให้เราทราบถึงสิ่งที่เกิดขึ้น</translation>
 <translation id="5892290200158927959">แป้นพิมพ์ภาษาฝรั่งเศสแบบ BÉPO</translation>
 <translation id="5892507820957994680">แทนที่รายการการแสดงผลของซอฟต์แวร์ภายในและเปิดใช้งานการเร่งสปีดของ GPU ในการกำหนดค่าของระบบที่ไม่ได้รับการสนับสนุน</translation>
 <translation id="5895138241574237353">ปิดแล้วเปิดอีกครั้ง</translation>
@@ -3546,6 +3554,7 @@
 <translation id="6122093587541546701">อีเมล (ไม่บังคับ):</translation>
 <translation id="6122875415561139701">ไม่อนุญาตให้เขียนใน "<ph name="DEVICE_NAME" />"</translation>
 <translation id="6124650939968185064">ส่วนขยายต่อไปนี้ต้องพึ่งพาส่วนขยายนี้:</translation>
+<translation id="6127945163801765632">เปิดใช้ส่วน "บุ๊กมาร์กทั้งหมด" ในการจัดการบุ๊กมาร์ก</translation>
 <translation id="6129938384427316298">ความคิดเห็นเกี่ยวกับใบรับรองของ Netscape</translation>
 <translation id="6129953537138746214">ช่องว่าง</translation>
 <translation id="6132383530370527946">The Small Print</translation>
@@ -3572,6 +3581,7 @@
 <translation id="6164005077879661055">ไฟล์และข้อมูลในตัวเครื่องทั้งหมดที่เกี่ยวข้องกับผู้ใช้ภายใต้การดูแลจะถูกลบออกอย่างถาวรเมื่อผู้ใช้ภายใต้การดูแลนี้ถูกลบ เว็บไซต์ที่เข้าชมและการตั้งค่าสำหรับผู้ใช้ภายใต้การดูแลนี้อาจจะยังคงมองเห็นได้โดยผู้จัดการที่ <ph name="MANAGEMENT_URL" /></translation>
 <translation id="6165508094623778733">เรียนรู้เพิ่มเติม</translation>
 <translation id="6166185671393271715">นำเข้ารหัสผ่านไปยัง Chrome</translation>
+<translation id="6169666352732958425">ไม่สามารถแคสต์เดสก์ท็อป</translation>
 <translation id="6171550060231646388">คุณลักษณะ "Ok Google" ของฮาร์ดแวร์ที่จำลองขึ้น</translation>
 <translation id="6175314957787328458">โดเมน GUID ของ Microsoft</translation>
 <translation id="6178664161104547336">เลือกใบรับรอง</translation>
@@ -3765,6 +3775,7 @@
 <translation id="6458308652667395253">จัดการการบล็อก JavaScript...</translation>
 <translation id="6459488832681039634">ใช้สิ่งที่เลือกเพื่อค้นหา</translation>
 <translation id="6460423884798879930">เปิดใช้งานตัวเลือกเพื่อส่งข้อมูลการตรวจสอบสิทธิ์เพิ่มเติมในแพ็คเก็ต SYN แรกสำหรับไคลเอ็นต์ที่เชื่อมต่อก่อนหน้า ทำให้การส่งข้อมูลแบบรวดเร็วเริ่มขึ้น</translation>
+<translation id="6460474910028274178">ปรับปรุงตรรกะในการทริกเกอร์และรูปลักษณ์ของ UI ลูกโป่งแปลภาษา</translation>
 <translation id="6460601847208524483">ค้นหาถัดไป</translation>
 <translation id="6462080265650314920">แอปพลิเคชันต้องได้รับบริการจากประเภทเนื้อหา "<ph name="CONTENT_TYPE" />"</translation>
 <translation id="6462082050341971451">คุณยังอยู่ที่นั่นหรือเปล่า</translation>
@@ -3894,6 +3905,7 @@
 <translation id="6663792236418322902">รหัสผ่านที่คุณเลือกจะต้องนำมาใช้ในการกู้คืนไฟล์นี้ในภายหลัง โปรดบันทึกรหัสผ่านไว้ในที่ปลอดภัย</translation>
 <translation id="6664237456442406323">น่าเสียดายที่คอมพิวเตอร์ของคุณถูกกำหนดค่าด้วย ID ฮาร์ดแวร์ที่มีรูปแบบที่ไม่ถูกต้อง ซึ่งจะป้องกันไม่ให้ Chrome OS อัปเดตการแก้ใขปัญหาความปลอดภัยล่าสุดได้ และคอมพิวเตอร์ของคุณ <ph name="BEGIN_BOLD" />อาจเสี่ยงต่อการโจมตีที่เป็นอันตราย<ph name="END_BOLD" /></translation>
 <translation id="6666647326143344290">ด้วยบัญชี Google ของคุณ</translation>
+<translation id="667517062706956822">คุณต้องการให้ Google แปลหน้านี้จากภาษา<ph name="SOURCE_LANGUAGE" />เป็นภาษา<ph name="TARGET_LANGUAGE" />ไหม</translation>
 <translation id="6675665718701918026">เชื่อมต่ออุปกรณ์ชี้ตำแหน่งแล้ว</translation>
 <translation id="6677037229676347494">คาดการณ์ ID "<ph name="EXPECTED_ID" />" แต่ ID ที่แจ้งคือ "<ph name="NEW_ID" />"</translation>
 <translation id="6680028776254050810">สลับผู้ใช้</translation>
@@ -3945,6 +3957,7 @@
 <translation id="6746392203843147041">เพิ่มเสียง</translation>
 <translation id="6748140994595080445">เปลี่ยนวิธีการจัดการและแสดงภาษาของ <ph name="APP_NAME" /></translation>
 <translation id="6748465660675848252">คุณสามารถดำเนินการต่อได้ แต่ระบบจะกู้คืนข้อมูลที่ซิงค์และการตั้งค่าเท่านั้น ข้อมูลในเครื่องทั้งหมดจะสูญหาย</translation>
+<translation id="6751256176799620176">เลือกไว้ 1 โฟลเดอร์</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (โหมดไม่ระบุตัวตน)</translation>
 <translation id="6759193508432371551">รีเซ็ตเป็นค่าเริ่มต้นจากโรงงาน</translation>
 <translation id="6760765581316020278">แป้นพิมพ์ภาษาเวียดนาม (VNI)</translation>
@@ -4583,6 +4596,7 @@
 <translation id="7717014941119698257">กำลังดาวน์โหลด: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">หมดเวลาฝึก</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262"><ph name="BEGIN_LINK" />ลงชื่อเข้าใช้ Chrome<ph name="END_LINK" /> เพื่อดูแลบุคคลนี้</translation>
 <translation id="7724603315864178912">ตัด</translation>
 <translation id="7730449930968088409">จับภาพเนื้อหาบนหน้าจอ</translation>
 <translation id="7730494089396812859">แสดงรายละเอียดของข้อมูลสำรองในระบบคลาวด์</translation>
@@ -4676,7 +4690,6 @@
 <translation id="7859704718976024901">ประวัติการเข้าชม</translation>
 <translation id="7861215335140947162">&amp;ดาวน์โหลด</translation>
 <translation id="7864539943188674973">ปิดใช้งานบลูทูธ</translation>
-<translation id="7868891395842935202">เปิดใช้กรอบการทดสอบสำหรับการควบคุมการเข้าถึงการทดสอบต่างๆ เกี่ยวกับ API</translation>
 <translation id="7870576007982733437">ใช้ Download Manager ของระบบในกรณีที่ทำได้</translation>
 <translation id="7870790288828963061">ไม่พบแอปคีออสก์เวอร์ชันใหม่กว่า ไม่มีรายการที่จะอัปเดต โปรดนำ USB สติ๊กออก</translation>
 <translation id="787150342916295244">การสแกนบัตรเครดิต</translation>
@@ -5005,7 +5018,6 @@
 <translation id="8309505303672555187">เลือกเครือข่าย:</translation>
 <translation id="8312871300878166382">วางลงในโฟลเดอร์</translation>
 <translation id="8314013494437618358">การประกอบหน้าเว็บแบบเธร็ด</translation>
-<translation id="8314576811984836978">กรอบการทดสอบ</translation>
 <translation id="8319414634934645341">การใช้คีย์เพิ่มเติม</translation>
 <translation id="8322814362483282060">หน้านี้ถูกบล็อกไม่ให้เข้าถึงไมโครโฟนของคุณ</translation>
 <translation id="8326478304147373412">PKCS #7, กลุ่มใบรับรอง (Certificate Chain)</translation>
@@ -5066,7 +5078,6 @@
 <translation id="8418240940464873056">โหมดภาษาฮันจา</translation>
 <translation id="8418445294933751433">แ&amp;สดงเป็นแถบ</translation>
 <translation id="8420060421540670057">แสดงไฟล์ Google เอกสาร</translation>
-<translation id="8420728540268437431">หน้านี้กำลังได้รับการแปล ...</translation>
 <translation id="842274098655511832">ส่วนขยายฉบับร่างของ WebGL</translation>
 <translation id="8424039430705546751">ลง</translation>
 <translation id="8425213833346101688">เปลี่ยน</translation>
@@ -5253,6 +5264,7 @@
 <translation id="8690754533598178758">ข้อยกเว้นของไมโครโฟน Adobe Flash Player จะแตกต่างกันไป</translation>
 <translation id="8691686986795184760">(เปิดใช้งานตามนโยบายองค์กร)</translation>
 <translation id="869257642790614972">เปิดแท็บที่ปิดไปล่าสุดอีกครั้ง</translation>
+<translation id="8695770993395462321">CUPS แบบดั้งเดิม</translation>
 <translation id="8695825812785969222">เปิด&amp;ตำแหน่ง...</translation>
 <translation id="8698464937041809063">ภาพวาดของ Google</translation>
 <translation id="869884720829132584">เมนูของแอปพลิเคชัน</translation>
@@ -5594,6 +5606,7 @@
 <translation id="9189690067274055051">ปลดล็อกโทรศัพท์และนำมาอยู่ใกล้กับ <ph name="DEVICE_TYPE" /> มากขึ้น เพื่อเข้าใช้งาน</translation>
 <translation id="9190063653747922532">L2TP/IPsec + คีย์ที่แชร์ล่วงหน้า</translation>
 <translation id="9201305942933582053">Google Now สำหรับ Chrome!</translation>
+<translation id="9202646163273566462">เปิดใช้มุมมองบุ๊กมาร์กทั้งหมดเป็นจุดหมายเริ่มต้นของการจัดการบุ๊กมาร์ก</translation>
 <translation id="9203398526606335860">&amp;เปิดใช้งานการทำแฟ้มประวัติ</translation>
 <translation id="9203478404496196495">เปิดเสียงแท็บ</translation>
 <translation id="9203962528777363226">ผู้ดูแลระบบของอุปกรณ์นี้ปิดการใช้งานไม่ให้เพิ่มผู้ใช้ใหม่เข้าไป</translation>
@@ -5620,6 +5633,7 @@
 <translation id="939736085109172342">โฟลเดอร์ใหม่</translation>
 <translation id="940425055435005472">ขนาดแบบอักษร:</translation>
 <translation id="941543339607623937">คีย์ส่วนตัวไม่ถูกต้อง</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{ไม่มี}=1{1 แอป ($1)}=2{2 แอป ($1, $2)}other{# แอป ($1, $2, $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> กำลังแชร์แท็บและเสียงใน Chrome</translation>
 <translation id="942954117721265519">ไม่มีภาพในไดเรกทอรีนี้</translation>
 <translation id="945522503751344254">ส่งความคิดเห็น</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index a4d8501..6f5f697 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (uzantı kimliği: "<ph name="EXTENSION_ID" />") bu tür bir oturum için izinli değil.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Hata! Rastgele RSA özel anahtarı oluşturulamadı.</translation>
+<translation id="1421115928968836111">Bu seçenek, korumalı içeriğe ilişkin Flash Player lisanslarının yetkisini kaldırır.</translation>
 <translation id="1425734930786274278">Aşağıdaki çerezler engellendi (üçüncü taraf çerezleri istisnasız engelleniyor):</translation>
 <translation id="1426410128494586442">Evet</translation>
 <translation id="1427049173708736891">Android telefonunuzun kilidi açık ve telefonunuz yakınınızdayken <ph name="DEVICE_TYPE" /> cihazınızın kilidini açık tutun; şifrenizi yazmanız gerekmez.</translation>
@@ -521,6 +522,7 @@
 <translation id="1707463636381878959">Bu ağı diğer kullanıcılarla paylaş</translation>
 <translation id="1708199901407471282">Yeni Sekme Sayfası'ndan önerilen bir web sitesini açarken, aynı site için önceden açılmış bir sekme varsa, önerilen web sitesini yeni sekmede yüklemek yerine mevcut sekmeye geçiş yapın.</translation>
 <translation id="1708338024780164500">(Etkin değil)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (Kimlik: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Sıkıştırma başarısız oldu, beklenmedik hata: $1</translation>
 <translation id="1715941336038158809">Geçersiz kullanıcı adı veya şifre.</translation>
 <translation id="1717733954209022288">Google Payments kartını kaydetme onay kutusu</translation>
@@ -798,6 +800,7 @@
 <translation id="2168214441502403371">Farsça klavye</translation>
 <translation id="2168725742002792683">Dosya uzantıları</translation>
 <translation id="2169062631698640254">Yine de oturum aç</translation>
+<translation id="2175042898143291048">Bunu her zaman yap</translation>
 <translation id="2175607476662778685">Hızlı başlat çubuğu</translation>
 <translation id="2176045495080708525">Aşağıdaki uzantılar yüklendi:</translation>
 <translation id="2177950615300672361">Gizli Sekmesi: <ph name="TAB_NAME" /></translation>
@@ -1937,7 +1940,6 @@
 <translation id="3688507211863392146">Uygulamada açtığınız dosyalara ve klasörlere yazma</translation>
 <translation id="3688526734140524629">Kanal değiştir</translation>
 <translation id="3688578402379768763">Güncel</translation>
-<translation id="3690976161240450479">Oturum açma işlemi başarısız oldu. Lütfen yöneticinizle iletişime geçin veya tekrar deneyin.</translation>
 <translation id="3693415264595406141">Şifre:</translation>
 <translation id="3694027410380121301">Önceki Sekmeyi Seç</translation>
 <translation id="3694678678240097321">Sayfada komut dosyası çalıştıran bir uzantı, tüm URL'lerde çalışmak üzere izin istediyse, söz konusu uzantı için kullanıcının onayını gerektir.</translation>
@@ -2233,6 +2235,7 @@
 <translation id="4116663294526079822">Bu sitede her zaman izin ver</translation>
 <translation id="411666854932687641">Özel Bellek</translation>
 <translation id="4118990158415604803">Diğer ağlara bağlanma, yöneticiniz tarafından devre dışı bırakıldı.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{ve 1 uygulama daha}other{ve # uygulama daha}}</translation>
 <translation id="4119828560634133962">Yazdırma Önizleme Kayıt Promosyonları</translation>
 <translation id="4120329147617730038">Bir yönetici <ph name="USER_EMAIL" /> için çoklu oturum açmayı engellemiş.
 Tüm kullanıcılar devam etmek için çıkış yapmalıdır.</translation>
@@ -2372,9 +2375,11 @@
 <translation id="4345703751611431217">Yazılım uyumsuzluğu: Daha fazla bilgi edinin</translation>
 <translation id="4348766275249686434">Hataları topla</translation>
 <translation id="4350019051035968019">Bu cihaz, farklı bir alan adı tarafından yönetilen cihaz olarak işaretlendiğinden hesabınızın ait olduğu alan adına kaydettirilemiyor.</translation>
+<translation id="4354806558096370704">Yerel CUPS yazdırma arka ucunun kullanılmasına olanak verir</translation>
 <translation id="4358697938732213860">Adres ekle</translation>
 <translation id="4359408040881008151">Bağımlı uzantılar nedeniyle yüklendi.</translation>
 <translation id="4361190688154226069">Görünümlerde dikdörtgen tabanlı hedefleme</translation>
+<translation id="4364414793200746179">Android MediaStyle bildirimi</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> indirildi</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" />, bir pencereyi paylaşıyor.</translation>
 <translation id="4364830672918311045">Bildirimleri görüntüle</translation>
@@ -2778,6 +2783,7 @@
 <translation id="4988792151665380515">Genel anahtar dışa alınamadı.</translation>
 <translation id="49896407730300355">Saat yönünün &amp;tersine döndür</translation>
 <translation id="4989966318180235467">&amp;Arka plan sayfasını incele</translation>
+<translation id="4990343175649730969">Chrome Temizleme Aracı'nı indir</translation>
 <translation id="4991420928586866460">Üst satırdaki tuşları işlev tuşları olarak kullan</translation>
 <translation id="499165176004408815">Yüksek kontrast modunu kullan</translation>
 <translation id="4992066212339426712">Sesi aç</translation>
@@ -3302,6 +3308,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: Düzenlemek için seçin</translation>
 <translation id="5741454054957165976">WebFonts yüklemesi için Kullanıcı Aracısı Müdahalesi'nin yeni sürümünü etkinleştirin.</translation>
 <translation id="574392208103952083">Orta</translation>
+<translation id="5744368829843057748">2016Q2 kullanıcı arayüzünü çevir</translation>
 <translation id="5745056705311424885">USB bellek çubuğu algılandı</translation>
 <translation id="5746169159649715125">PDF olarak kaydet</translation>
 <translation id="5747611503456050045">Dikey olarak fazla kaydırılan içeriğin tetiklediği sayfa yeniden yüklemeleri.</translation>
@@ -3409,6 +3416,7 @@
 <translation id="5884474295213649357">Bu sekme bir USB cihazına bağlı.</translation>
 <translation id="5885324376209859881">Medya ayarlarını yönet...</translation>
 <translation id="5889282057229379085">Ara CA sayısı üst sınırı: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Ne olduğunu anlatın.</translation>
 <translation id="5892290200158927959">Fransızca BÉPO klavyesi</translation>
 <translation id="5892507820957994680">Yerleşik yazılım oluşturma listesinin üzerine yazar ve desteklenmeyen sistem yapılandırmalarında GPU hızlandırmayı etkinleştirir.</translation>
 <translation id="5895138241574237353">Yeniden başlat</translation>
@@ -3550,6 +3558,7 @@
 <translation id="6122093587541546701">E-posta (isteğe bağlı):</translation>
 <translation id="6122875415561139701">Şu cihazda yazma işlemine izin verilmiyor: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="6124650939968185064">Aşağıdaki uzantılar bu uzantıya bağımlıdır:</translation>
+<translation id="6127945163801765632">Yer işareti yöneticisinde "tüm yer işaretleri" bölümünü etkinleştir.</translation>
 <translation id="6129938384427316298">Netscape Sertifikası Yorumu</translation>
 <translation id="6129953537138746214">Boşluk</translation>
 <translation id="6132383530370527946">Sözleşme</translation>
@@ -3576,6 +3585,7 @@
 <translation id="6164005077879661055">Denetlenen bu kullanıcı kaldırıldığında denetlenen kullanıcıyla ilişkilendirilmiş tüm dosyalar ve yerel veriler kalıcı olarak silinir. Yönetici, denetlenen bu kullanıcıya ilişkin ziyaret edilen web sayfaları ve ayarları <ph name="MANAGEMENT_URL" /> adresinden görüntülemeye devam edebilir.</translation>
 <translation id="6165508094623778733">Daha fazla bilgi edinin</translation>
 <translation id="6166185671393271715">Şifreleri Chrome'a Aktar</translation>
+<translation id="6169666352732958425">Masaüstü yayınlanamıyor.</translation>
 <translation id="6171550060231646388">Simüle edilmiş donanım "Ok Google" özellikleri</translation>
 <translation id="6175314957787328458">Microsoft Etki Alanı GUID'si</translation>
 <translation id="6178664161104547336">Sertifika seç</translation>
@@ -3769,6 +3779,7 @@
 <translation id="6458308652667395253">JavaScript engellemeyi yönet...</translation>
 <translation id="6459488832681039634">Bul için Seçim'i Kullan</translation>
 <translation id="6460423884798879930">Veri gönderiminin daha hızlı başlatılması için, daha önce bağlanmış bir istemciye yönelik ilk SYN paketinde ekstra kimlik doğrulama bilgileri gönderme seçeneğini etkinleştirin.</translation>
+<translation id="6460474910028274178">Tetikleme mantığını iyileştirin ve Çeviri Balonu Kullanıcı Arayüzünü bulun</translation>
 <translation id="6460601847208524483">Sonrakini Bul</translation>
 <translation id="6462080265650314920">Uygulamalar "<ph name="CONTENT_TYPE" />" içerik türüyle yayınlanmalıdır.</translation>
 <translation id="6462082050341971451">Hâlâ orada mısınız?</translation>
@@ -3898,6 +3909,7 @@
 <translation id="6663792236418322902">Seçtiğiniz şifre, daha sonra bu dosyayı geri yüklemek için gerekli olacaktır. Lütfen şifrenizi güvenli bir yere kaydedin.</translation>
 <translation id="6664237456442406323">Maalesef bilgisayarınız, hatalı oluşturulmuş bir donanım kimliğiyle yapılandırılmış. Bu durum Chrome OS'nin en son güvenlik düzeltmeleriyle güncellenmesini engeller ve bilgisayarınız <ph name="BEGIN_BOLD" />kötü niyetli saldırılara<ph name="END_BOLD" /> açık duruma gelebilir.</translation>
 <translation id="6666647326143344290">oturum açın</translation>
+<translation id="667517062706956822">Google'ın bu sayfayı <ph name="SOURCE_LANGUAGE" /> dilinden <ph name="TARGET_LANGUAGE" /> diline çevirmesini istiyor musunuz?</translation>
 <translation id="6675665718701918026">İşaretleme cihazı bağlı</translation>
 <translation id="6677037229676347494">Beklenen Kimlik "<ph name="EXPECTED_ID" />" idi, ancak "<ph name="NEW_ID" />" kimliği belirlendi.</translation>
 <translation id="6680028776254050810">Kullanıcı Değiştir</translation>
@@ -3949,6 +3961,7 @@
 <translation id="6746392203843147041">sesi aç</translation>
 <translation id="6748140994595080445"><ph name="APP_NAME" /> uygulamasının dilleri işleme ve görüntüleme biçimini değiştir.</translation>
 <translation id="6748465660675848252">Devam edebilirsiniz, ancak yalnızca senkronize edilen verileriniz ve ayarlarınız geri yüklenecek. Tüm yerel verileri kaybedeceksiniz.</translation>
+<translation id="6751256176799620176">1 klasör seçildi</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Gizli mod)</translation>
 <translation id="6759193508432371551">Fabrika ayarlarına sıfırlama</translation>
 <translation id="6760765581316020278">Vietnamca klavye (VNI)</translation>
@@ -4587,6 +4600,7 @@
 <translation id="7717014941119698257">İndiriliyor: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">Eğitim zaman aşımına uğradı</translation>
 <translation id="771953673318695590">KG</translation>
+<translation id="7720375555307821262">Bu kişiyi denetlemek için <ph name="BEGIN_LINK" />Chrome'da oturum açın<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">Kes</translation>
 <translation id="7730449930968088409">Ekranınızın içeriğini yakalama</translation>
 <translation id="7730494089396812859">Bulut yedekleme ile ilgili ayrıntıları göster</translation>
@@ -4680,7 +4694,6 @@
 <translation id="7859704718976024901">Tarama Geçmişi</translation>
 <translation id="7861215335140947162">&amp;İndirilenler</translation>
 <translation id="7864539943188674973">Bluetooth'u devre dışı bırak</translation>
-<translation id="7868891395842935202">API denemelerine erişimi kontrol etmek için Deneysel Çerçeve'yi etkinleştirir.</translation>
 <translation id="7870576007982733437">Uygun durumlarda sistem indirme yöneticisini kullan.</translation>
 <translation id="7870790288828963061">Daha yeni bir sürüme sahip herhangi bir Kiosk uygulaması bulunamadı. Güncellenecek hiçbir şey yok. Lütfen USB çubuğunu çıkarın.</translation>
 <translation id="787150342916295244">Kredi kartı taraması</translation>
@@ -5011,7 +5024,6 @@
 <translation id="8309505303672555187">Ağ seçin:</translation>
 <translation id="8312871300878166382">Klasörünün içine yapıştır</translation>
 <translation id="8314013494437618358">Mesaj dizisi halinde birleştirme</translation>
-<translation id="8314576811984836978">Deneysel Çerçeve.</translation>
 <translation id="8319414634934645341">Uzatılmış Anahtar Kullanımı</translation>
 <translation id="8322814362483282060">Bu sayfanın mikrofonunuza erişimi engellenmiştir.</translation>
 <translation id="8326478304147373412">PKCS #7, sertifika zinciri</translation>
@@ -5072,7 +5084,6 @@
 <translation id="8418240940464873056">Hanja modu</translation>
 <translation id="8418445294933751433">&amp;Farklı göster sekmesi</translation>
 <translation id="8420060421540670057">Google Dokümanlar dosyalarını göster</translation>
-<translation id="8420728540268437431">Bu sayfa çevriliyor...</translation>
 <translation id="842274098655511832">WebGL Taslak Uzantıları</translation>
 <translation id="8424039430705546751">aşağı</translation>
 <translation id="8425213833346101688">Değiştir</translation>
@@ -5259,6 +5270,7 @@
 <translation id="8690754533598178758">Adobe Flash Player mikrofon istisnaları farklıdır.</translation>
 <translation id="8691686986795184760">(Kurumsal politika tarafından etkinleştirildi)</translation>
 <translation id="869257642790614972">Son kapatılan sekmeyi yeniden aç</translation>
+<translation id="8695770993395462321">Yerel CUPS</translation>
 <translation id="8695825812785969222">Konumu &amp;Aç...</translation>
 <translation id="8698464937041809063">Google çizimler</translation>
 <translation id="869884720829132584">Uygulamalar menüsü</translation>
@@ -5601,6 +5613,7 @@
 <translation id="9189690067274055051">Giriş yapmak için telefonunuzun kilidini açın ve <ph name="DEVICE_TYPE" /> cihazınıza yaklaştırın.</translation>
 <translation id="9190063653747922532">L2TP/IPsec + önceden paylaşılan anahtar</translation>
 <translation id="9201305942933582053">Chrome için Google Now!</translation>
+<translation id="9202646163273566462">Yer işareti yöneticisinin varsayılan hedefi olarak tüm yer işaretleri görünümüne izin verir.</translation>
 <translation id="9203398526606335860">&amp;Profil oluşturma etkin</translation>
 <translation id="9203478404496196495">Sekmenin sesini aç</translation>
 <translation id="9203962528777363226">Bu cihazın yöneticisi yeni kullanıcıların eklenmesini devre dışı bıraktı</translation>
@@ -5627,6 +5640,7 @@
 <translation id="939736085109172342">Yeni klasör</translation>
 <translation id="940425055435005472">Yazı tipi boyutu:</translation>
 <translation id="941543339607623937">Geçersiz özel anahtar.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{yok}=1{1 uygulama ($1)}=2{2 uygulama ($1, $2)}other{# uygulama ($1, $2, $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" />, bir Chrome sekmesini ve sesi paylaşıyor.</translation>
 <translation id="942954117721265519">Bu dizinde resim yok.</translation>
 <translation id="945522503751344254">Geri bildirim gönder</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index 2b8a30d..5c382f52 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608">Розширення <ph name="EXTENSION_NAME" /> (ідентифікатор "<ph name="EXTENSION_ID" />") не можна використовувати в сеансі цього типу.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Не вдалося згенерувати випадковий секретний ключ RSA.</translation>
+<translation id="1421115928968836111">Скасовується авторизація ліцензій захищеного вмісту Adobe Flash Player.</translation>
 <translation id="1425734930786274278">Заблоковано такі файли cookie (сторонні файли cookie блокуються без винятку):</translation>
 <translation id="1426410128494586442">так</translation>
 <translation id="1427049173708736891">Розблоковуйте пристрій <ph name="DEVICE_TYPE" /> за допомогою телефона Android. Паролі не потрібні.</translation>
@@ -521,6 +522,7 @@
 <translation id="1707463636381878959">Надавати іншим користувачам доступ до цієї мережі</translation>
 <translation id="1708199901407471282">Якщо вкладка для запропонованої веб-сторінки вже відкрита, можна не завантажувати цю веб-сторінку в новій вкладці, а перейти на відкриту вкладку.</translation>
 <translation id="1708338024780164500">(Неактивне)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (ідентифікатор: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Неочікувана помилка архівування: $1</translation>
 <translation id="1715941336038158809">Недійсне ім'я користувача чи пароль.</translation>
 <translation id="1717733954209022288">Опція "Зберігати дані карток Google Payments"</translation>
@@ -797,6 +799,7 @@
 <translation id="2168214441502403371">Перська клавіатура</translation>
 <translation id="2168725742002792683">Розширення файлу</translation>
 <translation id="2169062631698640254">Усе одно ввійти</translation>
+<translation id="2175042898143291048">Завжди виконувати цю дію</translation>
 <translation id="2175607476662778685">Панель швидкого запуску</translation>
 <translation id="2176045495080708525">Зараз установлено такі розширення:</translation>
 <translation id="2177950615300672361">Анонімна вкладка: <ph name="TAB_NAME" /></translation>
@@ -1935,7 +1938,6 @@
 <translation id="3688507211863392146">Записувати у файли та папки, які ви відкриваєте в програмі</translation>
 <translation id="3688526734140524629">Змінити версію</translation>
 <translation id="3688578402379768763">Оновлено</translation>
-<translation id="3690976161240450479">Помилка входу. Зв’яжіться з адміністратором або повторіть спробу.</translation>
 <translation id="3693415264595406141">Пароль:</translation>
 <translation id="3694027410380121301">Вибрати попередню вкладку</translation>
 <translation id="3694678678240097321">Запитувати згоду користувача, якщо розширення, яке виконує сценарій на сторінці, просить дозвіл виконати його на всіх URL-адресах.</translation>
@@ -2231,6 +2233,7 @@
 <translation id="4116663294526079822">Завжди дозволяти на цьому сайті</translation>
 <translation id="411666854932687641">Приватна пам’ять</translation>
 <translation id="4118990158415604803">Ваш адміністратор заборонив під’єднуватися до інших мереж.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{і ще 1}one{і ще #}few{і ще #}many{і ще #}other{і ще #}}</translation>
 <translation id="4119828560634133962">Пропонувати реєстрацію під час попереднього перегляду друку</translation>
 <translation id="4120329147617730038">Адміністратор заборонив паралельний вхід користувачеві <ph name="USER_EMAIL" />.
 Щоб продовжити, усі користувачі повинні вийти.</translation>
@@ -2370,9 +2373,11 @@
 <translation id="4345703751611431217">Несумісність програмного забезпечення: докладніше</translation>
 <translation id="4348766275249686434">Збирати повідомлення про помилки</translation>
 <translation id="4350019051035968019">Цей пристрій не можна зареєструвати в домені, до якого належить ваш обліковий запис, оскільки пристрій зареєстрований в іншому домені.</translation>
+<translation id="4354806558096370704">Дозволяється використовувати рідний сервер CUPS для друку.</translation>
 <translation id="4358697938732213860">Додати адресу</translation>
 <translation id="4359408040881008151">Установлено, оскільки є залежні розширення.</translation>
 <translation id="4361190688154226069">Натискати елементи в прямокутній області дотику</translation>
+<translation id="4364414793200746179">Сповіщення Android MediaStyle</translation>
 <translation id="4364444725319685468">Файл "<ph name="FILE_NAME" />" завантажено</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> транслює вікно.</translation>
 <translation id="4364830672918311045">Показувати сповіщення</translation>
@@ -2776,6 +2781,7 @@
 <translation id="4988792151665380515">Не вдалося експортувати відкритий ключ.</translation>
 <translation id="49896407730300355">Повернути п&amp;роти годинникової стрілки</translation>
 <translation id="4989966318180235467">Перевірити &amp;фонову сторінку</translation>
+<translation id="4990343175649730969">Завантажити Майстер очищення Chrome</translation>
 <translation id="4991420928586866460">Використовувати клавіші вгорі клавіатури як функціональні клавіші</translation>
 <translation id="499165176004408815">Використовувати режим високого контрасту</translation>
 <translation id="4992066212339426712">Увімкнути звук</translation>
@@ -3299,6 +3305,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: виберіть, щоб редагувати</translation>
 <translation id="5741454054957165976">Увімкнути нову версію функції втручання агента користувача для завантаження WebFonts.</translation>
 <translation id="574392208103952083">Середній</translation>
+<translation id="5744368829843057748">Інтерфейс Перекладача 2016 р., 2 квартал</translation>
 <translation id="5745056705311424885">Виявлено карту флеш-пам’яті USB</translation>
 <translation id="5746169159649715125">Зберегти у форматі PDF</translation>
 <translation id="5747611503456050045">Cторінка оновлюється, якщо прокручувати вміст вертикально.</translation>
@@ -3406,6 +3413,7 @@
 <translation id="5884474295213649357">Цю вкладку під’єднано до пристрою USB.</translation>
 <translation id="5885324376209859881">Керувати налаштуваннями засобів зв’язку…</translation>
 <translation id="5889282057229379085">Максимальна кількість проміжних ЦС: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Повідомте нам, що відбувається.</translation>
 <translation id="5892290200158927959">Французька клавіатура BÉPO</translation>
 <translation id="5892507820957994680">Замінює вбудований список програмної візуалізації та вмикає прискорення графічного процесора на непідтримуваних налаштуваннях системи.</translation>
 <translation id="5895138241574237353">Перезапустити</translation>
@@ -3547,6 +3555,7 @@
 <translation id="6122093587541546701">Електронна адреса (необов’язково):</translation>
 <translation id="6122875415561139701">Операцію внесення змін заборонено на пристрої <ph name="DEVICE_NAME" />.</translation>
 <translation id="6124650939968185064">Від цього розширення залежать такі розширення:</translation>
+<translation id="6127945163801765632">Увімкнути розділ "Усі закладки" в диспетчері закладок.</translation>
 <translation id="6129938384427316298">Коментар сертифіката Netscape</translation>
 <translation id="6129953537138746214">Пробіл</translation>
 <translation id="6132383530370527946">Малий шрифт</translation>
@@ -3573,6 +3582,7 @@
 <translation id="6164005077879661055">Усі файли та локальні дані, пов’язані з контрольованим користувачем, буде назавжди видалено, якщо вилучити цього контрольованого користувача. Менеджер усе одно може бачити веб-сайти, які відвідував цей контрольований користувач, і його налаштування на сторінці <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Докладніше</translation>
 <translation id="6166185671393271715">Імпортувати паролі в Chrome</translation>
+<translation id="6169666352732958425">Не вдається транслювати робочий стіл.</translation>
 <translation id="6171550060231646388">Імітовані функціональні характеристики "Ok Google"</translation>
 <translation id="6175314957787328458">GUID домену Microsoft</translation>
 <translation id="6178664161104547336">Вибір сертифіката</translation>
@@ -3766,6 +3776,7 @@
 <translation id="6458308652667395253">Керувати блокуванням JavaScript...</translation>
 <translation id="6459488832681039634">Використати виділення для пошуку</translation>
 <translation id="6460423884798879930">Вмикає опцію надсилання додаткової інформації про автентифікацію в початковому пакеті SYN для попередньо під’єднаного клієнта, пришвидшуючи час початку надсилання даних.</translation>
+<translation id="6460474910028274178">Покращено логіку активаторів і вигляд інтерфейсу підказок Перекладача</translation>
 <translation id="6460601847208524483">Знайти наступне</translation>
 <translation id="6462080265650314920">Програми мають обслуговуватися вмістом типу "<ph name="CONTENT_TYPE" />".</translation>
 <translation id="6462082050341971451">Ви ще тут?</translation>
@@ -3895,6 +3906,7 @@
 <translation id="6663792236418322902">Вибраний вами пароль буде потрібен, щоб відновити цей файл пізніше. Зберігайте його в безпечному місці.</translation>
 <translation id="6664237456442406323">На жаль, ваш комп’ютер налаштовано за допомогою ідентифікатора апаратного забезпечення з невірною структурою. Це перешкоджає оновленню ОС Chrome найновішими виправленнями системи безпеки, а тому ваш комп’ютер <ph name="BEGIN_BOLD" />може бути вразливим до зловмисних атак<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">за допомогою даних облікового запису Google</translation>
+<translation id="667517062706956822">Перекласти цю сторінку (<ph name="SOURCE_LANGUAGE" />) такою мовою: <ph name="TARGET_LANGUAGE" />?</translation>
 <translation id="6675665718701918026">Маніпулятор підключено</translation>
 <translation id="6677037229676347494">Очікуваний ідентифікатор – "<ph name="EXPECTED_ID" />". Використаний ідентифікатор – "<ph name="NEW_ID" />".</translation>
 <translation id="6680028776254050810">Змінити користувача</translation>
@@ -3946,6 +3958,7 @@
 <translation id="6746392203843147041">збільшити гучність</translation>
 <translation id="6748140994595080445">Змінення способу обробки й показу мов у <ph name="APP_NAME" />.</translation>
 <translation id="6748465660675848252">Ви можете продовжити, однак буде відновлено лише синхронізовані дані та налаштування. Усі локальні дані буде втрачено.</translation>
+<translation id="6751256176799620176">Вибрано 1 папку</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Анонімний перегляд)</translation>
 <translation id="6759193508432371551">Відновлення заводських налаштувань</translation>
 <translation id="6760765581316020278">В’єтнамська клавіатура (VNI)</translation>
@@ -4585,6 +4598,7 @@
 <translation id="7717014941119698257">Завантаження: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">Час навчання минув</translation>
 <translation id="771953673318695590">Перевірка якості</translation>
+<translation id="7720375555307821262">Щоб контролювати активність цього користувача, <ph name="BEGIN_LINK" />увійдіть в обліковий запис Chrome<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">Вирізати</translation>
 <translation id="7730449930968088409">Робити знімки вмісту екрана</translation>
 <translation id="7730494089396812859">Показати деталі резервного копіювання в хмару</translation>
@@ -4678,7 +4692,6 @@
 <translation id="7859704718976024901">Історія веб-перегляду</translation>
 <translation id="7861215335140947162">&amp;Завантаження</translation>
 <translation id="7864539943188674973">Вимкнути Bluetooth</translation>
-<translation id="7868891395842935202">Вмикає експериментальне середовище, щоб контролювати доступ до експериментів API.</translation>
 <translation id="7870576007982733437">Використовувати диспетчер системних завантажень, коли це можливо.</translation>
 <translation id="7870790288828963061">Новіші версії додатків-терміналів не знайдено. Помилка оновлення. Витягніть носій USB.</translation>
 <translation id="787150342916295244">Сканування кредитної картки</translation>
@@ -5007,7 +5020,6 @@
 <translation id="8309505303672555187">Виберіть мережу:</translation>
 <translation id="8312871300878166382">Вставити в папку</translation>
 <translation id="8314013494437618358">Ланцюжкове компонування</translation>
-<translation id="8314576811984836978">Експериментальне середовище.</translation>
 <translation id="8319414634934645341">Використання розширеного ключа</translation>
 <translation id="8322814362483282060">Доступ цієї сторінки до вашого мікрофона заблоковано.</translation>
 <translation id="8326478304147373412">PKCS #7, ланцюжок сертифікатів</translation>
@@ -5068,7 +5080,6 @@
 <translation id="8418240940464873056">Режим ханча</translation>
 <translation id="8418445294933751433">&amp;Показати як вкладку</translation>
 <translation id="8420060421540670057">Показувати файли Документів Google</translation>
-<translation id="8420728540268437431">Сторінка перекладається…</translation>
 <translation id="842274098655511832">Чернетки розширень WebGL</translation>
 <translation id="8424039430705546751">униз</translation>
 <translation id="8425213833346101688">Змінити</translation>
@@ -5255,6 +5266,7 @@
 <translation id="8690754533598178758">В Adobe Flash Player використовуються інші винятки для мікрофона.</translation>
 <translation id="8691686986795184760">(Увімкнено згідно політики підприємства)</translation>
 <translation id="869257642790614972">Повторне відкривання останньої закритої вкладки</translation>
+<translation id="8695770993395462321">Рідний сервер CUPS</translation>
 <translation id="8695825812785969222">Відкрити &amp;розташування...</translation>
 <translation id="8698464937041809063">Малюнок Google</translation>
 <translation id="869884720829132584">Меню програм</translation>
@@ -5596,6 +5608,7 @@
 <translation id="9189690067274055051">Щоб отримати доступ, розблокуйте телефон і розташуйте його ближче до <ph name="DEVICE_TYPE" />.</translation>
 <translation id="9190063653747922532">L2TP/IPSec + Спільний ключ</translation>
 <translation id="9201305942933582053">Google Асистент для Chrome.</translation>
+<translation id="9202646163273566462">Можна переглядати всі закладки як цільовий вміст диспетчера закладок за умовчанням.</translation>
 <translation id="9203398526606335860">&amp;Профілювання ввімкнено</translation>
 <translation id="9203478404496196495">Увімкнути звук на вкладці</translation>
 <translation id="9203962528777363226">Адміністратор цього пристрою вимкнув можливість додавати нових користувачів</translation>
@@ -5622,6 +5635,7 @@
 <translation id="939736085109172342">Нова папка</translation>
 <translation id="940425055435005472">Розмір шрифту:</translation>
 <translation id="941543339607623937">Недійсний секретний ключ.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{немає}=1{1 додаток ($1)}=2{2 додатки ($1, $2)}one{# додаток ($1, $2, $ 3)}few{# додатки ($1, $2, $3)}many{# додатків ($1, $2, $3)}other{# додатка ($1, $2, $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> транслює вкладку Chrome і аудіо.</translation>
 <translation id="942954117721265519">У цьому каталозі немає зображень.</translation>
 <translation id="945522503751344254">Надіслати відгук</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb
index 05b5c8c..06a42aaf 100644
--- a/chrome/app/resources/generated_resources_vi.xtb
+++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (ID tiện ích "<ph name="EXTENSION_ID" />") không được cho phép trong loại phiên này.</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">Rất tiếc! Không thể tạo khóa cá nhân RSA ngẫu nhiên.</translation>
+<translation id="1421115928968836111">Thao tác này sẽ hủy cấp phép giấy phép Flash Player cho nội dung được bảo vệ.</translation>
 <translation id="1425734930786274278">Các cookie sau đã bị chặn (các cookie của bên thứ ba hiện đang bị chặn mà không có ngoại lệ):</translation>
 <translation id="1426410128494586442">Có</translation>
 <translation id="1427049173708736891">Mở khóa <ph name="DEVICE_TYPE" /> khi điện thoại Android của bạn được mở khóa và ở gần đó mà không cần nhập mật khẩu của bạn.</translation>
@@ -522,6 +523,7 @@
 <translation id="1707463636381878959">Chia sẻ mạng này với những người dùng khác</translation>
 <translation id="1708199901407471282">Khi mở trang web được đề xuất từ trang Tab mới, nếu tab đã mở cho đề xuất, hãy chuyển sang tab đó thay vì tải đề xuất trong tab mới.</translation>
 <translation id="1708338024780164500">(Không hoạt động)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">Nén không thành công, lỗi không mong đợi: $1</translation>
 <translation id="1715941336038158809">Tên người dùng hoặc mật khẩu không hợp lệ.</translation>
 <translation id="1717733954209022288">Hộp kiểm lưu thẻ Google Payments</translation>
@@ -799,6 +801,7 @@
 <translation id="2168214441502403371">Bàn phím tiếng Ba Tư</translation>
 <translation id="2168725742002792683">Đuôi tệp</translation>
 <translation id="2169062631698640254">Đăng nhập bằng mọi cách</translation>
+<translation id="2175042898143291048">Luôn làm điều này</translation>
 <translation id="2175607476662778685">Thanh khởi động nhanh</translation>
 <translation id="2176045495080708525">Các tiện ích sau hiện đã được cài đặt:</translation>
 <translation id="2177950615300672361">Tab ẩn danh: <ph name="TAB_NAME" /></translation>
@@ -1938,7 +1941,6 @@
 <translation id="3688507211863392146">Ghi vào têp và thư mục bạn mở trong ứng dụng</translation>
 <translation id="3688526734140524629">Thay đổi kênh</translation>
 <translation id="3688578402379768763">Cập nhật</translation>
-<translation id="3690976161240450479">Đăng nhập không thành công. Vui lòng liên hệ với quản trị viên của bạn hoặc thử lại.</translation>
 <translation id="3693415264595406141">Mật khẩu:</translation>
 <translation id="3694027410380121301">Chọn Tab Trước</translation>
 <translation id="3694678678240097321">Yêu cầu có sự đồng ý của người dùng để tiện ích chạy tập lệnh trên trang, nếu tiện ích đó yêu cầu quyền chạy trên tất cả các url.</translation>
@@ -2234,6 +2236,7 @@
 <translation id="4116663294526079822">Luôn cho phép trên trang web này</translation>
 <translation id="411666854932687641">Bộ nhớ Riêng</translation>
 <translation id="4118990158415604803">Quản trị viên của bạn đã tắt tính năng kết nối với các mạng khác.</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{và 1 ứng dụng khác}other{và # ứng dụng khác}}</translation>
 <translation id="4119828560634133962">Quảng cáo đăng ký xem trước bản in</translation>
 <translation id="4120329147617730038">Quản trị viên đã bỏ cho phép đăng nhập nhiều tài khoản đối với <ph name="USER_EMAIL" />.
 Tất cả người dùng phải đăng xuất để tiếp tục.</translation>
@@ -2373,9 +2376,11 @@
 <translation id="4345703751611431217">Tính không tương thích của phần mềm: Tìm hiểu thêm</translation>
 <translation id="4348766275249686434">Thu thập lỗi</translation>
 <translation id="4350019051035968019">Không thể đăng ký thiết bị này vào miền có tài khoản của bạn vì thiết bị được miền khác đánh dấu để quản lý.</translation>
+<translation id="4354806558096370704">Cho phép sử dụng chương trình phụ trợ in CUPS gốc.</translation>
 <translation id="4358697938732213860">Thêm địa chỉ</translation>
 <translation id="4359408040881008151">Đã được cài đặt vì (các) tiện ích phụ thuộc.</translation>
 <translation id="4361190688154226069">Nhắm mục tiêu theo hình chữ nhật trong các chế độ xem</translation>
+<translation id="4364414793200746179">Thông báo Android MediaStyle</translation>
 <translation id="4364444725319685468">Đã tải xuống <ph name="FILE_NAME" /></translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> đang chia sẻ một cửa sổ.</translation>
 <translation id="4364830672918311045">Hiển thị thông báo</translation>
@@ -2779,6 +2784,7 @@
 <translation id="4988792151665380515">Không thể xuất khóa công cộng.</translation>
 <translation id="49896407730300355">Xoay &amp;ngược chiều kim đồng hồ</translation>
 <translation id="4989966318180235467">Kiểm tra trang &amp;nền</translation>
+<translation id="4990343175649730969">Tải xuống Công cụ làm sạch Chrome</translation>
 <translation id="4991420928586866460">Coi các phím ở hàng trên cùng là phím chức năng</translation>
 <translation id="499165176004408815">Sử dụng chế độ tương phản cao</translation>
 <translation id="4992066212339426712">Bật âm thanh</translation>
@@ -3302,6 +3308,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />: chọn để chỉnh sửa</translation>
 <translation id="5741454054957165976">Bật Phiên bản mới của Can thiệp tác nhân người dùng để tải WebFonts.</translation>
 <translation id="574392208103952083">Trung bình</translation>
+<translation id="5744368829843057748">Translate 2016Q2 UI</translation>
 <translation id="5745056705311424885">Đã phát hiện thấy thẻ nhớ USB</translation>
 <translation id="5746169159649715125">Lưu dưới dạng PDF</translation>
 <translation id="5747611503456050045">Tải lại trang được kích hoạt bằng cách cuộn dọc nội dung.</translation>
@@ -3409,6 +3416,7 @@
 <translation id="5884474295213649357">Tab này được kết nối với một thiết bị USB.</translation>
 <translation id="5885324376209859881">Quản lý cài đặt phương tiện...</translation>
 <translation id="5889282057229379085">Số CA gián tiếp tối đa: <ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">Cho chúng tôi biết điều gì đang xảy ra.</translation>
 <translation id="5892290200158927959">Bàn phím BÉPO tiếng Pháp</translation>
 <translation id="5892507820957994680">Ghi đè danh sách kết xuất phần mềm tích hợp sẵn và cho phép tăng tốc GPU trên cấu hình hệ thống không được hỗ trợ.</translation>
 <translation id="5895138241574237353">Khởi động lại</translation>
@@ -3552,6 +3560,7 @@
 <translation id="6122093587541546701">Email (tùy chọn):</translation>
 <translation id="6122875415561139701">Tác vụ ghi không được phép trên: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="6124650939968185064">Các tiện ích sau phụ thuộc vào tiện ích này:</translation>
+<translation id="6127945163801765632">Bật phần "tất cả dấu trang" trong trình quản lý dấu trang.</translation>
 <translation id="6129938384427316298">Nhận xét về Chứng chỉ Netscape</translation>
 <translation id="6129953537138746214">Dấu cách</translation>
 <translation id="6132383530370527946">Bản in nhỏ</translation>
@@ -3578,6 +3587,7 @@
 <translation id="6164005077879661055">Tất cả các tệp và dữ liệu trên máy được liên kết với người dùng được giám sát sẽ vĩnh viễn bị xóa khi người dùng được giám sát này bị xóa. Các trang web đã truy cập và các cài đặt của người dùng được giám sát này có thể vẫn hiển thị với người quản lý tại <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Tìm hiểu thêm</translation>
 <translation id="6166185671393271715">Nhập mật khẩu vào Chrome</translation>
+<translation id="6169666352732958425">Không thể truyền màn hình nền.</translation>
 <translation id="6171550060231646388">Tính năng 'Ok Google' cho phần cứng được mô phỏng</translation>
 <translation id="6175314957787328458">GUID Tên miền của Microsoft</translation>
 <translation id="6178664161104547336">Chọn một chứng chỉ</translation>
@@ -3771,6 +3781,7 @@
 <translation id="6458308652667395253">Quản lý chặn JavaScript...</translation>
 <translation id="6459488832681039634">Sử dụng Phần lựa chọn cho Tìm kiếm</translation>
 <translation id="6460423884798879930">Bật tùy chọn để gửi thêm thông tin xác thực trong gói SYN ban đầu cho một khách hàng đã kết nối trước đó, cho phép khởi động gửi dữ liệu nhanh hơn.</translation>
+<translation id="6460474910028274178">Logic kích hoạt được cải thiện và tìm kiếm Translate Bubble UI</translation>
 <translation id="6460601847208524483">Tìm Tiếp theo</translation>
 <translation id="6462080265650314920">Ứng dụng phải được cung cấp loại nội dung "<ph name="CONTENT_TYPE" />".</translation>
 <translation id="6462082050341971451">Bạn còn ở đó không?</translation>
@@ -3900,6 +3911,7 @@
 <translation id="6663792236418322902">Mật khẩu bạn chọn sẽ cần dùng để khôi phục tệp này về sau. Vui lòng ghi lại mật khẩu này vào một vị trí an toàn.</translation>
 <translation id="6664237456442406323">Rất tiếc, máy tính của bạn được định cấu hình bằng ID phần cứng không đúng định dạng. Điều này ngăn Chrome OS cập nhật các bản vá bảo mật mới nhất và máy tính của bạn <ph name="BEGIN_BOLD" />có thể bị các cuộc tấn công làm hại<ph name="END_BOLD" />.</translation>
 <translation id="6666647326143344290">với Tài khoản Google của bạn</translation>
+<translation id="667517062706956822">Bạn có muốn Google dịch trang này từ <ph name="SOURCE_LANGUAGE" /> sang <ph name="TARGET_LANGUAGE" /> không?</translation>
 <translation id="6675665718701918026">Đã kết nối thiết bị trỏ</translation>
 <translation id="6677037229676347494">ID mong muốn "<ph name="EXPECTED_ID" />", nhưng ID là "<ph name="NEW_ID" />".</translation>
 <translation id="6680028776254050810">Chuyển người dùng</translation>
@@ -3951,6 +3963,7 @@
 <translation id="6746392203843147041">tăng âm</translation>
 <translation id="6748140994595080445">Thay đổi cách <ph name="APP_NAME" /> xử lý và hiển thị ngôn ngữ.</translation>
 <translation id="6748465660675848252">Bạn có thể tiến hành nhưng chỉ các cài đặt và dữ liệu đã đồng bộ hóa của bạn mới được lưu trữ. Tất cả dữ liệu cục bộ sẽ mất.</translation>
+<translation id="6751256176799620176">Đã chọn 1 thư mục</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Ẩn danh)</translation>
 <translation id="6759193508432371551">Khôi phục cài đặt gốc</translation>
 <translation id="6760765581316020278">Bàn phím tiếng Việt (VNI)</translation>
@@ -4591,6 +4604,7 @@
 <translation id="7717014941119698257">Đang tải xuống: <ph name="STATUS" /></translation>
 <translation id="7719421816612904796">Huấn luyện đã hết thời gian chờ</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262">Để giám sát người này, hãy <ph name="BEGIN_LINK" />đăng nhập vào Chrome<ph name="END_LINK" />.</translation>
 <translation id="7724603315864178912">Cắt</translation>
 <translation id="7730449930968088409">Chụp nội dung trên màn hình của bạn</translation>
 <translation id="7730494089396812859">Hiển thị chi tiết sao lưu Đám mây</translation>
@@ -4684,7 +4698,6 @@
 <translation id="7859704718976024901">Lịch sử duyệt web</translation>
 <translation id="7861215335140947162">&amp;Tải xuống</translation>
 <translation id="7864539943188674973">Tắt bluetooth</translation>
-<translation id="7868891395842935202">Bật Khung thử nghiệm để kiểm soát quyền truy cập vào thử nghiệm API.</translation>
 <translation id="7870576007982733437">Sử dụng trình quản lý tải xuống của hệ thống nếu có.</translation>
 <translation id="7870790288828963061">Không tìm thấy ứng dụng Kiosk nào có phiên bản mới hơn. Không có gì để cập nhật. Vui lòng rút thẻ USB.</translation>
 <translation id="787150342916295244">Quét thẻ tín dụng</translation>
@@ -5013,7 +5026,6 @@
 <translation id="8309505303672555187">Chọn mạng:</translation>
 <translation id="8312871300878166382">Dán vào thư mục</translation>
 <translation id="8314013494437618358">Tổng hợp theo chuỗi</translation>
-<translation id="8314576811984836978">Khung thử nghiệm.</translation>
 <translation id="8319414634934645341">Sử dụng Khoá Mở rộng</translation>
 <translation id="8322814362483282060">Trang này đã bị chặn truy cập micrô của bạn.</translation>
 <translation id="8326478304147373412">PKCS #7, chuỗi chứng chỉ</translation>
@@ -5074,7 +5086,6 @@
 <translation id="8418240940464873056">Chế độ Hanja</translation>
 <translation id="8418445294933751433">&amp;Hiển thị dưới dạng tab</translation>
 <translation id="8420060421540670057">Hiển thị các tệp được lưu trữ trong Google Documents</translation>
-<translation id="8420728540268437431">Trang này đang được dịch ...</translation>
 <translation id="842274098655511832">Tiện ích WebGL thử nghiệm</translation>
 <translation id="8424039430705546751">xuống</translation>
 <translation id="8425213833346101688">Thay đổi</translation>
@@ -5261,6 +5272,7 @@
 <translation id="8690754533598178758">Các ngoại lệ đối với micrô của Adobe Flash Player là khác nhau.</translation>
 <translation id="8691686986795184760">(Bật bởi chính sách doanh nghiệp)</translation>
 <translation id="869257642790614972">Mở lại tab đóng sau cùng</translation>
+<translation id="8695770993395462321">CUPS gốc</translation>
 <translation id="8695825812785969222">Mở &amp;vị trí...</translation>
 <translation id="8698464937041809063">Bản vẽ Google</translation>
 <translation id="869884720829132584">Menu ứng dụng</translation>
@@ -5603,6 +5615,7 @@
 <translation id="9189690067274055051">Mở khóa điện thoại của bạn và mang điện thoại đến gần với <ph name="DEVICE_TYPE" /> hơn để nhập.</translation>
 <translation id="9190063653747922532">L2TP/IPsec + khóa chia sẻ trước</translation>
 <translation id="9201305942933582053">Google Hiện hành dành cho Chrome!</translation>
+<translation id="9202646163273566462">Bật chế độ xem tất cả dấu trang làm điểm đến mặc định của trình quản lý dấu trang.</translation>
 <translation id="9203398526606335860">&amp;Bật cấu hình</translation>
 <translation id="9203478404496196495">Bật âm thanh tab</translation>
 <translation id="9203962528777363226">Quản trị viên của thiết bị này đã vô hiệu hóa thêm người dùng mới</translation>
@@ -5629,6 +5642,7 @@
 <translation id="939736085109172342">Thư mục mới</translation>
 <translation id="940425055435005472">Kích thước phông chữ:</translation>
 <translation id="941543339607623937">Khoá cá nhân không hợp lệ.</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{không có}=1{1 ứng dụng ($1)}=2{2 ứng dụng ($1, $2)}other{# ứng dụng ($1, $2, $3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> đang chia sẻ âm thanh và một tab trong Chrome.</translation>
 <translation id="942954117721265519">Không có hình ảnh nào trong thư mục này.</translation>
 <translation id="945522503751344254">Gửi phản hồi</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index c633440..04c77f4 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608">这类会话不允许使用“<ph name="EXTENSION_NAME" />”(扩展程序 ID 为“<ph name="EXTENSION_ID" />”)。</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">糟糕!无法生成随机的 RSA 私有密钥。</translation>
+<translation id="1421115928968836111">这将针对受保护内容取消 Flash Player 许可授权。</translation>
 <translation id="1425734930786274278">已拦截以下 Cookie(第三方 Cookie 一律拦截):</translation>
 <translation id="1426410128494586442">是</translation>
 <translation id="1427049173708736891">当配对的 Android 手机未锁定并且在附近时,可用来为您的<ph name="DEVICE_TYPE" />解锁 - 无需输入密码。</translation>
@@ -518,6 +519,7 @@
 <translation id="1707463636381878959">与其他用户共享此网络</translation>
 <translation id="1708199901407471282">从“打开新的标签页”页面打开建议的网页时,如果已有其他标签页打开了建议的网页,那么系统会直接切换到该标签页,而不会在新标签页中加载建议的网页。</translation>
 <translation id="1708338024780164500">(无效)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" />(ID:<ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">压缩失败,发生意外错误:$1</translation>
 <translation id="1715941336038158809">用户名或密码无效。</translation>
 <translation id="1717733954209022288">用于指定是否保存 Google Payments 卡数据的复选框</translation>
@@ -794,6 +796,7 @@
 <translation id="2168214441502403371">波斯语键盘</translation>
 <translation id="2168725742002792683">文件扩展名</translation>
 <translation id="2169062631698640254">仍然登录</translation>
+<translation id="2175042898143291048">一律执行此操作</translation>
 <translation id="2175607476662778685">快速启动栏</translation>
 <translation id="2176045495080708525">以下扩展程序现已安装完毕:</translation>
 <translation id="2177950615300672361">隐身标签页:<ph name="TAB_NAME" /></translation>
@@ -1928,7 +1931,6 @@
 <translation id="3688507211863392146">写入您在此应用中打开的文件和文件夹</translation>
 <translation id="3688526734140524629">变更版本</translation>
 <translation id="3688578402379768763">已是最新</translation>
-<translation id="3690976161240450479">登录失败了,请与管理员联系或重试。</translation>
 <translation id="3693415264595406141">密码:</translation>
 <translation id="3694027410380121301">选择上一个标签</translation>
 <translation id="3694678678240097321">对于要在网页上运行脚本的扩展程序,如果相应扩展程序请求了在所有网址上运行的权限,则需要获得用户同意。</translation>
@@ -2223,6 +2225,7 @@
 <translation id="4116663294526079822">在此网站上始终允许</translation>
 <translation id="411666854932687641">专用内存</translation>
 <translation id="4118990158415604803">您的管理员已禁止连接到其他网络。</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{以及另外 1 个应用}other{以及另外 # 个应用}}</translation>
 <translation id="4119828560634133962">打印预览注册宣传</translation>
 <translation id="4120329147617730038">管理员已禁止<ph name="USER_EMAIL" />多帐户登录。
 所有用户必须先退出帐户才能继续。</translation>
@@ -2362,9 +2365,11 @@
 <translation id="4345703751611431217">软件不兼容:了解详情</translation>
 <translation id="4348766275249686434">收集各项错误</translation>
 <translation id="4350019051035968019">该设备无法注册到您的帐户所属的网域,因为它已标记为受其他网域管理。</translation>
+<translation id="4354806558096370704">启用本机 CUPS 打印后端。</translation>
 <translation id="4358697938732213860">添加地址</translation>
 <translation id="4359408040881008151">安装此扩展程序是因为某个/些扩展程序需要安装它才能正常使用。</translation>
 <translation id="4361190688154226069">在视图中以矩形表示触摸目标区域</translation>
+<translation id="4364414793200746179">Android MediaStyle 通知</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> 已下载完毕</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> 正在共享窗口。</translation>
 <translation id="4364830672918311045">显示通知</translation>
@@ -2764,6 +2769,7 @@
 <translation id="4988792151665380515">无法导出公共密钥。</translation>
 <translation id="49896407730300355">逆时针旋转(&amp;O)</translation>
 <translation id="4989966318180235467">检查背景页(&amp;B)</translation>
+<translation id="4990343175649730969">下载 Chrome 清理工具</translation>
 <translation id="4991420928586866460">将顶行键设置为功能键</translation>
 <translation id="499165176004408815">使用高反差模式</translation>
 <translation id="4992066212339426712">取消静音</translation>
@@ -3284,6 +3290,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />:选择以进行修改</translation>
 <translation id="5741454054957165976">加载 WebFonts 时启用新版用户代理干预。</translation>
 <translation id="574392208103952083">中</translation>
+<translation id="5744368829843057748">翻译 2016Q2 界面</translation>
 <translation id="5745056705311424885">检测到 USB 记忆棒</translation>
 <translation id="5746169159649715125">另存为 PDF</translation>
 <translation id="5747611503456050045">因垂直滚动反弹而触发网页重新加载。</translation>
@@ -3391,6 +3398,7 @@
 <translation id="5884474295213649357">此标签页已连接到 USB 设备。</translation>
 <translation id="5885324376209859881">管理媒体设置...</translation>
 <translation id="5889282057229379085">中级 CA 证书数目的上限为:<ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">告诉我们所发生的情况。</translation>
 <translation id="5892290200158927959">法语 BÉPO 键盘</translation>
 <translation id="5892507820957994680">覆盖内置的软件渲染列表,并对不支持的系统配置启用 GPU 加速。</translation>
 <translation id="5895138241574237353">重新启动</translation>
@@ -3532,6 +3540,7 @@
 <translation id="6122093587541546701">电子邮件(可选):</translation>
 <translation id="6122875415561139701">禁止在“<ph name="DEVICE_NAME" />”上执行写入操作。</translation>
 <translation id="6124650939968185064">需先安装此扩展程序,下列扩展程序才能正常使用:</translation>
+<translation id="6127945163801765632">在书签管理器中启用“所有书签”部分。</translation>
 <translation id="6129938384427316298">Netscape 证书评论</translation>
 <translation id="6129953537138746214">空格</translation>
 <translation id="6132383530370527946">小号字体打印</translation>
@@ -3558,6 +3567,7 @@
 <translation id="6164005077879661055">删除该受监管用户后,与其相关联的所有文件和本地数据都会被永久删除,但管理员仍可以在 <ph name="MANAGEMENT_URL" /> 上查看该用户的设置和访问过的网站。</translation>
 <translation id="6165508094623778733">了解详情</translation>
 <translation id="6166185671393271715">将密码导入到 Chrome 中</translation>
+<translation id="6169666352732958425">无法投射桌面。</translation>
 <translation id="6171550060231646388">模拟硬件“Ok Google”功能</translation>
 <translation id="6175314957787328458">Microsoft 域 GUID</translation>
 <translation id="6178664161104547336">选择证书</translation>
@@ -3750,6 +3760,7 @@
 <translation id="6458308652667395253">管理 JavaScript 拦截…</translation>
 <translation id="6459488832681039634">使用所选内容查找</translation>
 <translation id="6460423884798879930">启用该选项,即可在初始 SYN 包中为之前连接的客户端发送额外的身份验证信息,以便更快地开始发送数据。</translation>
+<translation id="6460474910028274178">改进了翻译气泡界面的触发逻辑和外观</translation>
 <translation id="6460601847208524483">查找下一个</translation>
 <translation id="6462080265650314920">应用必须以“<ph name="CONTENT_TYPE" />”内容类型提供。</translation>
 <translation id="6462082050341971451">您还在吗?</translation>
@@ -3879,6 +3890,7 @@
 <translation id="6663792236418322902">以后恢复文件时需要使用您所选择的密码。请将密码记录在安全的地方。</translation>
 <translation id="6664237456442406323">很遗憾,您的计算机配置了格式错误的硬件 ID。这导致 Chrome 操作系统无法使用最新的安全修正程序进行更新,以致您的计算机<ph name="BEGIN_BOLD" />很容易遭到恶意攻击<ph name="END_BOLD" />。</translation>
 <translation id="6666647326143344290">使用您的 Google 帐户</translation>
+<translation id="667517062706956822">您希望 Google 将此网页的内容从<ph name="SOURCE_LANGUAGE" />翻译为<ph name="TARGET_LANGUAGE" />吗?</translation>
 <translation id="6675665718701918026">已连接指针设备</translation>
 <translation id="6677037229676347494">正确 ID 应为“<ph name="EXPECTED_ID" />”,但实际 ID 为“<ph name="NEW_ID" />”。</translation>
 <translation id="6680028776254050810">切换用户</translation>
@@ -3930,6 +3942,7 @@
 <translation id="6746392203843147041">调高音量</translation>
 <translation id="6748140994595080445">更改<ph name="APP_NAME" />处理和显示语言的方式。</translation>
 <translation id="6748465660675848252">您可以继续,但系统将只恢复已同步的数据和设置。所有本地数据都将会丢失。</translation>
+<translation id="6751256176799620176">已选择 1 个文件夹</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" />(隐身)</translation>
 <translation id="6759193508432371551">恢复出厂设置</translation>
 <translation id="6760765581316020278">越南语键盘(VNI)</translation>
@@ -4559,6 +4572,7 @@
 <translation id="7717014941119698257">正在下载:<ph name="STATUS" /></translation>
 <translation id="7719421816612904796">训练超时</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262">要监管这位用户,请<ph name="BEGIN_LINK" />登录 Chrome<ph name="END_LINK" />。</translation>
 <translation id="7724603315864178912">剪切</translation>
 <translation id="7730449930968088409">截取您屏幕上的内容</translation>
 <translation id="7730494089396812859">显示云端备份详情</translation>
@@ -4652,7 +4666,6 @@
 <translation id="7859704718976024901">浏览记录</translation>
 <translation id="7861215335140947162">下载内容(&amp;D)</translation>
 <translation id="7864539943188674973">停用蓝牙</translation>
-<translation id="7868891395842935202">启用可用于控制 API 实验访问权限的实验性框架。</translation>
 <translation id="7870576007982733437">使用系统下载管理器(如适用)。</translation>
 <translation id="7870790288828963061">找不到信息亭模式下的应用的更高版本,因此没有要更新的内容。请拔下 U 盘。</translation>
 <translation id="787150342916295244">信用卡扫描</translation>
@@ -4981,7 +4994,6 @@
 <translation id="8309505303672555187">选择网络:</translation>
 <translation id="8312871300878166382">粘贴到文件夹中</translation>
 <translation id="8314013494437618358">线程合成</translation>
-<translation id="8314576811984836978">实验性框架</translation>
 <translation id="8319414634934645341">扩展密钥用法</translation>
 <translation id="8322814362483282060">系统已阻止此网页使用您的麦克风。</translation>
 <translation id="8326478304147373412">PKCS #7,证书链</translation>
@@ -5042,7 +5054,6 @@
 <translation id="8418240940464873056">朝鲜文汉字模式</translation>
 <translation id="8418445294933751433">显示为标签页(&amp;S)</translation>
 <translation id="8420060421540670057">显示 Google 文档文件</translation>
-<translation id="8420728540268437431">正在翻译该网页…</translation>
 <translation id="842274098655511832">处于草稿阶段的 WebGL 扩展程序</translation>
 <translation id="8424039430705546751">向下</translation>
 <translation id="8425213833346101688">更改</translation>
@@ -5229,6 +5240,7 @@
 <translation id="8690754533598178758">Adobe Flash Player 的麦克风例外情况有所不同。</translation>
 <translation id="8691686986795184760">(根据企业政策已启用)</translation>
 <translation id="869257642790614972">重新打开最后关闭的标签页</translation>
+<translation id="8695770993395462321">本机 CUPS</translation>
 <translation id="8695825812785969222">打开位置(&amp;L)...</translation>
 <translation id="8698464937041809063">Google 绘图</translation>
 <translation id="869884720829132584">应用菜单</translation>
@@ -5570,6 +5582,7 @@
 <translation id="9189690067274055051">需将配对手机解锁并靠近您的<ph name="DEVICE_TYPE" />才能进入。</translation>
 <translation id="9190063653747922532">L2TP/IPSec + 预共享密钥</translation>
 <translation id="9201305942933582053">适用于Chrome的Google即时!</translation>
+<translation id="9202646163273566462">启用“所有书签”视图,作为书签管理器的默认目的地。</translation>
 <translation id="9203398526606335860">分析已启用(&amp;P)</translation>
 <translation id="9203478404496196495">将此标签页取消静音</translation>
 <translation id="9203962528777363226">此设备的管理员已禁止添加新用户</translation>
@@ -5596,6 +5609,7 @@
 <translation id="939736085109172342">新建文件夹</translation>
 <translation id="940425055435005472">字号:</translation>
 <translation id="941543339607623937">私有密钥无效。</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{无}=1{1 个应用 ($1)}=2{2 个应用($1、$2)}other{# 个应用($1、$2、$3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> 正在共享 Chrome 标签页和音频。</translation>
 <translation id="942954117721265519">此目录中没有图片。</translation>
 <translation id="945522503751344254">发送反馈</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index 2c17090..2a24381 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -293,6 +293,7 @@
 <translation id="1415990189994829608">這個工作階段類型不允許使用 <ph name="EXTENSION_NAME" /> (擴充功能 ID 為「<ph name="EXTENSION_ID" />」)。</translation>
 <translation id="1416836038590872660">EAP-MD5</translation>
 <translation id="1420684932347524586">哎呀!產生隨機 RSA 私密金鑰失敗。</translation>
+<translation id="1421115928968836111">受保護內容的 Flash Player 授權會因此遭到取消。</translation>
 <translation id="1425734930786274278">已封鎖下列 Cookie (系統會封鎖所有第三方 Cookie,沒有例外):</translation>
 <translation id="1426410128494586442">是</translation>
 <translation id="1427049173708736891">當您的 Android 手機在附近並已解除鎖定時,您的 <ph name="DEVICE_TYPE" /> 就會保持解鎖狀態 (不需輸入密碼)。</translation>
@@ -521,6 +522,7 @@
 <translation id="1707463636381878959">與其他使用者共用這個網路</translation>
 <translation id="1708199901407471282">使用新分頁來開啟建議網頁時,如果已有其他分頁開啟建議網頁,系統會直接切換至該分頁,不會在新分頁中載入建議網頁。</translation>
 <translation id="1708338024780164500">(無法使用)</translation>
+<translation id="1708713382908678956"><ph name="NAME_PH" /> (ID:<ph name="ID_PH" />)</translation>
 <translation id="1711973684025117106">壓縮失敗:發生未預期的錯誤:$1</translation>
 <translation id="1715941336038158809">使用者名稱或密碼無效。</translation>
 <translation id="1717733954209022288">Google Payments 信用卡儲存功能核取方塊</translation>
@@ -797,6 +799,7 @@
 <translation id="2168214441502403371">波斯文鍵盤</translation>
 <translation id="2168725742002792683">副檔名</translation>
 <translation id="2169062631698640254">繼續登入</translation>
+<translation id="2175042898143291048">一律執行這項操作</translation>
 <translation id="2175607476662778685">快速啟動列</translation>
 <translation id="2176045495080708525">目前已安裝下列擴充功能:</translation>
 <translation id="2177950615300672361">無痕式分頁:<ph name="TAB_NAME" /></translation>
@@ -1935,7 +1938,6 @@
 <translation id="3688507211863392146">寫入您在應用程式中開啟的檔案和資料夾</translation>
 <translation id="3688526734140524629">變更版本</translation>
 <translation id="3688578402379768763">最新狀態</translation>
-<translation id="3690976161240450479">登入失敗,請與您的管理員聯絡或再試一次。</translation>
 <translation id="3693415264595406141">密碼:</translation>
 <translation id="3694027410380121301">選取前一個分頁</translation>
 <translation id="3694678678240097321">如果擴充功能要求在所有網址上執行的權限,則需獲得使用者同意才能在網頁上執行指令碼。</translation>
@@ -2230,6 +2232,7 @@
 <translation id="4116663294526079822">永遠允許在這個網站執行</translation>
 <translation id="411666854932687641">隱私記憶體</translation>
 <translation id="4118990158415604803">您的管理員已停用與其他網路的連線。</translation>
+<translation id="4119034994132515155">{COUNT,plural, =1{和另外 1 個應用程式}other{和另外 # 個應用程式}}</translation>
 <translation id="4119828560634133962">預覽列印註冊宣傳</translation>
 <translation id="4120329147617730038">管理員已禁止 <ph name="USER_EMAIL" /> 多重登入。
 您必須登出所有使用者才能繼續。</translation>
@@ -2369,9 +2372,11 @@
 <translation id="4345703751611431217">軟體不相容:瞭解詳情</translation>
 <translation id="4348766275249686434">收集錯誤資訊</translation>
 <translation id="4350019051035968019">這台裝置已標示為由其他網域管理,因此無法註冊到您帳戶所屬的網域。</translation>
+<translation id="4354806558096370704">允許使用原生 CUPS 列印後端。</translation>
 <translation id="4358697938732213860">新增地址</translation>
 <translation id="4359408040881008151">您已安裝相依的擴充功能,因此必須一併安裝這個擴充功能。</translation>
 <translation id="4361190688154226069">顯示矩形觸控目標</translation>
+<translation id="4364414793200746179">Android MediaStyle 通知</translation>
 <translation id="4364444725319685468"><ph name="FILE_NAME" /> 下載完成</translation>
 <translation id="4364567974334641491"><ph name="APP_NAME" /> 正在共用視窗。</translation>
 <translation id="4364830672918311045">顯示通知</translation>
@@ -2772,6 +2777,7 @@
 <translation id="4988792151665380515">匯出公開金鑰失敗。</translation>
 <translation id="49896407730300355">逆時針旋轉(&amp;O)</translation>
 <translation id="4989966318180235467">檢查背景頁面(&amp;B)</translation>
+<translation id="4990343175649730969">下載 Chrome 清理工具</translation>
 <translation id="4991420928586866460">使用最上方一排按鍵做為功能鍵</translation>
 <translation id="499165176004408815">使用高反差模式</translation>
 <translation id="4992066212339426712">取消靜音</translation>
@@ -3055,7 +3061,7 @@
 <translation id="5397794290049113714">您</translation>
 <translation id="5398572795982417028">參照的網頁超出範圍限制 (<ph name="MAXIMUM_PAGE" />)</translation>
 <translation id="5398824043967640339">有 <ph name="COUNT" /> 個 Cookie 來自其他網站</translation>
-<translation id="5399158067281117682">PIN 不符!</translation>
+<translation id="5399158067281117682">PIN 碼不符!</translation>
 <translation id="5400640815024374115">可信任平台模組 (TPM) 晶片已停用或遺失。</translation>
 <translation id="5402367795255837559">點字</translation>
 <translation id="540296380408672091">一律封鎖 <ph name="HOST" /> 的 Cookie</translation>
@@ -3293,6 +3299,7 @@
 <translation id="5741245087700236983"><ph name="PROFILE_NAME" />:選取即可編輯</translation>
 <translation id="5741454054957165976">允許在載入 WebFonts 時中斷新版使用者代理程式。</translation>
 <translation id="574392208103952083">中</translation>
+<translation id="5744368829843057748">翻譯 2016Q2 使用者介面</translation>
 <translation id="5745056705311424885">偵測到 USB 隨身碟</translation>
 <translation id="5746169159649715125">另存為 PDF</translation>
 <translation id="5747611503456050045">在垂直捲動超出頁面範圍時重新載入網頁。</translation>
@@ -3400,6 +3407,7 @@
 <translation id="5884474295213649357">這個分頁已連上 USB 裝置。</translation>
 <translation id="5885324376209859881">管理媒體設定...</translation>
 <translation id="5889282057229379085">中繼 CA 數目上限:<ph name="NUM_INTERMEDIATE_CA" /></translation>
+<translation id="5891822366999803429">將發生的狀況告訴我們。</translation>
 <translation id="5892290200158927959">法文 BÉPO 鍵盤</translation>
 <translation id="5892507820957994680">覆寫內建的軟體轉譯清單,並針對不受支援的系統設定啟用 GPU 加速處理功能。</translation>
 <translation id="5895138241574237353">重新啟動</translation>
@@ -3541,6 +3549,7 @@
 <translation id="6122093587541546701">電子郵件地址 (選填):</translation>
 <translation id="6122875415561139701">無法在以下裝置上執行寫入作業:「<ph name="DEVICE_NAME" />」。</translation>
 <translation id="6124650939968185064">下列擴充功能與這個擴充功能之間有相依關係:</translation>
+<translation id="6127945163801765632">在書籤管理員中啟用「所有書籤」部分。</translation>
 <translation id="6129938384427316298">Netscape 憑證評論</translation>
 <translation id="6129953537138746214">空格</translation>
 <translation id="6132383530370527946">使用者授權合約</translation>
@@ -3567,6 +3576,7 @@
 <translation id="6164005077879661055">將這位受監管的使用者移除後,系統即會永久刪除所有與該使用者相關的檔案和本機資料。管理員仍可前往 <ph name="MANAGEMENT_URL" /> 查看這位受監管使用者的網頁瀏覽紀錄和設定。</translation>
 <translation id="6165508094623778733">瞭解詳情</translation>
 <translation id="6166185671393271715">將密碼匯入 Chrome 中</translation>
+<translation id="6169666352732958425">無法投放桌面。</translation>
 <translation id="6171550060231646388">模擬硬體的「Ok Google」功能</translation>
 <translation id="6175314957787328458">Microsoft 網域 GUID</translation>
 <translation id="6178664161104547336">選取憑證</translation>
@@ -3759,6 +3769,7 @@
 <translation id="6458308652667395253">管理封鎖 JavaScript 設定...</translation>
 <translation id="6459488832681039634">使用所選範圍尋找</translation>
 <translation id="6460423884798879930">啟用這個選項即可傳送第一個 SYN 封包中上一次用戶端連線的額外驗證資訊,使系統能迅速開始傳送資料。</translation>
+<translation id="6460474910028274178">讓翻譯泡泡使用者介面的觸發邏輯和外觀更臻完善</translation>
 <translation id="6460601847208524483">尋找下一個項目</translation>
 <translation id="6462080265650314920">應用程式的內容類型 (content-type) 應設為「<ph name="CONTENT_TYPE" />」。</translation>
 <translation id="6462082050341971451">您還在線上嗎?</translation>
@@ -3888,6 +3899,7 @@
 <translation id="6663792236418322902">日後如要還原這個檔案,需要使用您所選用的密碼,請將此密碼記錄在安全的位置。</translation>
 <translation id="6664237456442406323">抱歉,您的電腦是由格式錯誤的硬體 ID 所設定。這樣會防止 Chrome 作業系統更新最新的安全性修復,您的電腦也可能<ph name="BEGIN_BOLD" />容易遭受惡意攻擊<ph name="END_BOLD" />。</translation>
 <translation id="6666647326143344290">使用您的 Google 帳戶</translation>
+<translation id="667517062706956822">您要讓 Google 將這個網頁的內容從<ph name="SOURCE_LANGUAGE" />翻譯成<ph name="TARGET_LANGUAGE" />嗎?</translation>
 <translation id="6675665718701918026">已連上指標裝置</translation>
 <translation id="6677037229676347494">預期的 ID 為「<ph name="EXPECTED_ID" />」,但指向的 ID 為「<ph name="NEW_ID" />」。</translation>
 <translation id="6680028776254050810">切換使用者</translation>
@@ -3939,6 +3951,7 @@
 <translation id="6746392203843147041">調高音量鍵</translation>
 <translation id="6748140994595080445">變更 <ph name="APP_NAME" /> 處理及顯示各種語言的方式。</translation>
 <translation id="6748465660675848252">您可以繼續操作,但系統只會還原您已同步處理的資料和設定。所有本機資料都會遺失。</translation>
+<translation id="6751256176799620176">已選取 1 個資料夾</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (無痕模式)</translation>
 <translation id="6759193508432371551">恢復原廠設定</translation>
 <translation id="6760765581316020278">越南文鍵盤 (VNI)</translation>
@@ -4574,6 +4587,7 @@
 <translation id="7717014941119698257">下載:<ph name="STATUS" /></translation>
 <translation id="7719421816612904796">調校逾時</translation>
 <translation id="771953673318695590">QA</translation>
+<translation id="7720375555307821262">如要監管這位使用者,請<ph name="BEGIN_LINK" />登入 Chrome<ph name="END_LINK" />。</translation>
 <translation id="7724603315864178912">剪下</translation>
 <translation id="7730449930968088409">擷取您的畫面內容</translation>
 <translation id="7730494089396812859">顯示雲端備份詳細資料</translation>
@@ -4667,7 +4681,6 @@
 <translation id="7859704718976024901">瀏覽紀錄</translation>
 <translation id="7861215335140947162">下載(&amp;D)</translation>
 <translation id="7864539943188674973">停用藍牙</translation>
-<translation id="7868891395842935202">啟用實驗性架構,用來控管 API 實驗存取權。</translation>
 <translation id="7870576007982733437">使用系統下載管理員 (如適用)。</translation>
 <translation id="7870790288828963061">找不到新版 Kiosk 應用程式,沒有可更新的內容。請移除 USB 隨身碟。</translation>
 <translation id="787150342916295244">信用卡掃描</translation>
@@ -4996,7 +5009,6 @@
 <translation id="8309505303672555187">選擇網路:</translation>
 <translation id="8312871300878166382">貼入資料夾</translation>
 <translation id="8314013494437618358">串連合成</translation>
-<translation id="8314576811984836978">實驗性架構。</translation>
 <translation id="8319414634934645341">擴充金鑰使用方法</translation>
 <translation id="8322814362483282060">系統已封鎖這個網頁存取您的麥克風。</translation>
 <translation id="8326478304147373412">PKCS #7,憑證鏈結</translation>
@@ -5057,7 +5069,6 @@
 <translation id="8418240940464873056">漢字模式</translation>
 <translation id="8418445294933751433">顯示為分頁(&amp;S)</translation>
 <translation id="8420060421540670057">顯示 Google 文件檔案</translation>
-<translation id="8420728540268437431">正在翻譯這個網頁 ...</translation>
 <translation id="842274098655511832">WebGL 草稿擴充功能</translation>
 <translation id="8424039430705546751">向下鍵</translation>
 <translation id="8425213833346101688">變更</translation>
@@ -5244,6 +5255,7 @@
 <translation id="8690754533598178758">Adobe Flash Player 適用不同的麥克風例外狀況。</translation>
 <translation id="8691686986795184760">(由公司政策啟用)</translation>
 <translation id="869257642790614972">重新開啟最近關閉的分頁</translation>
+<translation id="8695770993395462321">原生 CUPS</translation>
 <translation id="8695825812785969222">開啟位置(&amp;L)...</translation>
 <translation id="8698464937041809063">Google 繪圖</translation>
 <translation id="869884720829132584">應用程式選單</translation>
@@ -5585,6 +5597,7 @@
 <translation id="9189690067274055051">解除手機的鎖定狀態,並且讓您的手機與 <ph name="DEVICE_TYPE" /> 更靠近,即可進入解鎖模式。</translation>
 <translation id="9190063653747922532">L2TP/IPsec + 預先共用金鑰</translation>
 <translation id="9201305942933582053">歡迎使用 Google 即時資訊 Chrome 版!</translation>
+<translation id="9202646163273566462">啟用所有書籤檢視畫面,做為書籤管理員的預設目的地。</translation>
 <translation id="9203398526606335860">分析已啟用(&amp;P)</translation>
 <translation id="9203478404496196495">開啟分頁音訊</translation>
 <translation id="9203962528777363226">裝置管理員已停用新增使用者功能</translation>
@@ -5611,6 +5624,7 @@
 <translation id="939736085109172342">新增資料夾</translation>
 <translation id="940425055435005472">字型大小:</translation>
 <translation id="941543339607623937">私密金鑰無效。</translation>
+<translation id="94157737897675170">{COUNT,plural, =0{無}=1{1 個應用程式 ($1)}=2{2 個應用程式 ($1、$2)}other{# 個應用程式 ($1、$2、$3)}}</translation>
 <translation id="942532530371314860"><ph name="APP_NAME" /> 正在共用 Chrome 分頁和音訊。</translation>
 <translation id="942954117721265519">這個目錄中沒有任何圖片。</translation>
 <translation id="945522503751344254">提供意見</translation>
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 539da28..cfc4aed 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -1721,9 +1721,9 @@
      ENABLE_DISABLE_VALUE_TYPE(switches::kEnableInputImeAPI,
                                switches::kDisableInputImeAPI)},
 #endif  // defined(OS_WIN) || defined(OS_LINUX)
-    {"enable-experimental-framework", IDS_FLAGS_EXPERIMENTAL_FRAMEWORK_NAME,
-     IDS_FLAGS_EXPERIMENTAL_FRAMEWORK_DESCRIPTION, kOsAll,
-     FEATURE_VALUE_TYPE(features::kExperimentalFramework)},
+    {"enable-origin-trials", IDS_FLAGS_ORIGIN_TRIALS_NAME,
+     IDS_FLAGS_ORIGIN_TRIALS_DESCRIPTION, kOsAll,
+     FEATURE_VALUE_TYPE(features::kOriginTrials)},
     {"enable-brotli", IDS_FLAGS_ENABLE_BROTLI_NAME,
      IDS_FLAGS_ENABLE_BROTLI_DESCRIPTION, kOsAll,
      FEATURE_VALUE_TYPE(features::kBrotliEncoding)},
diff --git a/chrome/browser/android/compositor/scene_layer/contextual_search_scene_layer.cc b/chrome/browser/android/compositor/scene_layer/contextual_search_scene_layer.cc
index dbd76004..1e201d2 100644
--- a/chrome/browser/android/compositor/scene_layer/contextual_search_scene_layer.cc
+++ b/chrome/browser/android/compositor/scene_layer/contextual_search_scene_layer.cc
@@ -6,7 +6,9 @@
 
 #include "base/android/jni_android.h"
 #include "base/android/jni_array.h"
+#include "cc/layers/solid_color_layer.h"
 #include "chrome/browser/android/compositor/layer/contextual_search_layer.h"
+#include "content/public/browser/android/compositor.h"
 #include "content/public/browser/android/content_view_core.h"
 #include "jni/ContextualSearchSceneLayer_jni.h"
 #include "ui/android/resources/resource_manager_impl.h"
@@ -17,7 +19,27 @@
 
 ContextualSearchSceneLayer::ContextualSearchSceneLayer(JNIEnv* env,
                                                        jobject jobj)
-    : SceneLayer(env, jobj) {
+    : SceneLayer(env, jobj),
+      base_page_brightness_(1.0f),
+      content_container_(cc::Layer::Create()) {
+  // Responsible for moving the base page without modifying the layer itself.
+  content_container_->SetIsDrawable(true);
+  content_container_->SetPosition(gfx::PointF(0.0f, 0.0f));
+  layer()->AddChild(content_container_);
+}
+
+void ContextualSearchSceneLayer::CreateContextualSearchLayer(
+    JNIEnv* env,
+    const JavaParamRef<jobject>& object,
+    const JavaParamRef<jobject>& jresource_manager) {
+  ui::ResourceManager* resource_manager =
+      ui::ResourceManagerImpl::FromJavaObject(jresource_manager);
+  contextual_search_layer_ = ContextualSearchLayer::Create(resource_manager);
+
+  // The Contextual Search layer is initially invisible.
+  contextual_search_layer_->layer()->SetHideLayerAndSubtree(true);
+
+  layer()->AddChild(contextual_search_layer_->layer());
 }
 
 ContextualSearchSceneLayer::~ContextualSearchSceneLayer() {
@@ -41,6 +63,8 @@
     jint peek_promo_ripple_resource_id,
     jint peek_promo_text_resource_id,
     jfloat dp_to_px,
+    jfloat base_page_brightness,
+    jfloat base_page_offset,
     const JavaParamRef<jobject>& jcontent_view_core,
     jboolean search_promo_visible,
     jfloat search_promo_height,
@@ -72,19 +96,7 @@
     jboolean progress_bar_visible,
     jfloat progress_bar_height,
     jfloat progress_bar_opacity,
-    jint progress_bar_completion,
-    const JavaParamRef<jobject>& jresource_manager) {
-  ui::ResourceManager* resource_manager =
-      ui::ResourceManagerImpl::FromJavaObject(jresource_manager);
-  // Lazily construct the contextual search layer, as the feature is only
-  // conditionally enabled.
-  if (!contextual_search_layer_.get()) {
-    if (!resource_manager)
-      return;
-    contextual_search_layer_ = ContextualSearchLayer::Create(resource_manager);
-    layer_->AddChild(contextual_search_layer_->layer());
-  }
-
+    jint progress_bar_completion) {
   // NOTE(pedrosimonetti): The ContentViewCore might not exist at this time if
   // the Contextual Search Result has not been requested yet. In this case,
   // we'll pass NULL to Contextual Search's Layer Tree.
@@ -93,6 +105,20 @@
                           : content::ContentViewCore::GetNativeContentViewCore(
                                 env, jcontent_view_core);
 
+  // Fade the base page out.
+  if (base_page_brightness_ != base_page_brightness) {
+    base_page_brightness_ = base_page_brightness;
+    cc::FilterOperations filters;
+    if (base_page_brightness < 1.f) {
+      filters.Append(
+          cc::FilterOperation::CreateBrightnessFilter(base_page_brightness));
+    }
+    content_container_->SetFilters(filters);
+  }
+
+  // Move the base page contents up.
+  content_container_->SetPosition(gfx::PointF(0.0f, base_page_offset));
+
   contextual_search_layer_->SetProperties(
       search_bar_background_resource_id,
       search_context_resource_id,
@@ -141,6 +167,36 @@
       progress_bar_height,
       progress_bar_opacity,
       progress_bar_completion);
+
+  // Make the layer visible if it is not already.
+  contextual_search_layer_->layer()->SetHideLayerAndSubtree(false);
+}
+
+void ContextualSearchSceneLayer::SetContentTree(
+    JNIEnv* env,
+    const JavaParamRef<jobject>& jobj,
+    const JavaParamRef<jobject>& jcontent_tree) {
+  SceneLayer* content_tree = FromJavaObject(env, jcontent_tree);
+  if (!content_tree || !content_tree->layer()) return;
+
+  if (!content_tree->layer()->parent()
+      || (content_tree->layer()->parent()->id() != content_container_->id())) {
+    content_container_->AddChild(content_tree->layer());
+  }
+}
+
+void ContextualSearchSceneLayer::HideTree(JNIEnv* env,
+    const JavaParamRef<jobject>& jobj) {
+  // TODO(mdjones): Create super class for this logic.
+  if (contextual_search_layer_) {
+    contextual_search_layer_->layer()->SetHideLayerAndSubtree(true);
+  }
+  // Reset base page brightness.
+  cc::FilterOperations filters;
+  filters.Append(cc::FilterOperation::CreateBrightnessFilter(1.0f));
+  content_container_->SetFilters(filters);
+  // Reset base page offset.
+  content_container_->SetPosition(gfx::PointF(0.0f, 0.0f));
 }
 
 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& jobj) {
diff --git a/chrome/browser/android/compositor/scene_layer/contextual_search_scene_layer.h b/chrome/browser/android/compositor/scene_layer/contextual_search_scene_layer.h
index a618121..a34083e 100644
--- a/chrome/browser/android/compositor/scene_layer/contextual_search_scene_layer.h
+++ b/chrome/browser/android/compositor/scene_layer/contextual_search_scene_layer.h
@@ -14,6 +14,11 @@
 #include "base/macros.h"
 #include "chrome/browser/android/compositor/scene_layer/scene_layer.h"
 
+namespace cc {
+class Layer;
+class SolidColorLayer;
+}
+
 namespace chrome {
 namespace android {
 
@@ -24,6 +29,11 @@
   ContextualSearchSceneLayer(JNIEnv* env, jobject jobj);
   ~ContextualSearchSceneLayer() override;
 
+  void CreateContextualSearchLayer(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>& object,
+      const base::android::JavaParamRef<jobject>& jresource_manager);
+
   void UpdateContextualSearchLayer(
       JNIEnv* env,
       const base::android::JavaParamRef<jobject>& object,
@@ -42,6 +52,8 @@
       jint peek_promo_ripple_resource_id,
       jint peek_promo_text_resource_id,
       jfloat dp_to_px,
+      jfloat base_page_brightness,
+      jfloat base_page_offset,
       const base::android::JavaParamRef<jobject>& jcontent_view_core,
       jboolean search_promo_visible,
       jfloat search_promo_height,
@@ -73,11 +85,22 @@
       jboolean progress_bar_visible,
       jfloat progress_bar_height,
       jfloat progress_bar_opacity,
-      jint progress_bar_completion,
-      const base::android::JavaParamRef<jobject>& jresource_manager);
+      jint progress_bar_completion);
+
+  void SetContentTree(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>& jobj,
+      const base::android::JavaParamRef<jobject>& jcontent_tree);
+
+  void HideTree(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>& jobj);
 
  private:
+  float base_page_brightness_;
+
   scoped_refptr<ContextualSearchLayer> contextual_search_layer_;
+  scoped_refptr<cc::Layer> content_container_;
 
   DISALLOW_COPY_AND_ASSIGN(ContextualSearchSceneLayer);
 };
diff --git a/chrome/browser/android/compositor/scene_layer/reader_mode_scene_layer.cc b/chrome/browser/android/compositor/scene_layer/reader_mode_scene_layer.cc
index c4165671..16e41d87 100644
--- a/chrome/browser/android/compositor/scene_layer/reader_mode_scene_layer.cc
+++ b/chrome/browser/android/compositor/scene_layer/reader_mode_scene_layer.cc
@@ -6,7 +6,9 @@
 
 #include "base/android/jni_android.h"
 #include "base/android/jni_array.h"
+#include "cc/layers/solid_color_layer.h"
 #include "chrome/browser/android/compositor/layer/reader_mode_layer.h"
+#include "content/public/browser/android/compositor.h"
 #include "content/public/browser/android/content_view_core.h"
 #include "jni/ReaderModeSceneLayer_jni.h"
 #include "ui/android/resources/resource_manager_impl.h"
@@ -16,7 +18,13 @@
 namespace android {
 
 ReaderModeSceneLayer::ReaderModeSceneLayer(JNIEnv* env, jobject jobj)
-    : SceneLayer(env, jobj) {
+    : SceneLayer(env, jobj),
+      base_page_brightness_(1.0f),
+      content_container_(cc::Layer::Create()) {
+  // Responsible for moving the base page without modifying the layer itself.
+  content_container_->SetIsDrawable(true);
+  content_container_->SetPosition(gfx::PointF(0.0f, 0.0f));
+  layer()->AddChild(content_container_);
 }
 
 ReaderModeSceneLayer::~ReaderModeSceneLayer() {
@@ -29,7 +37,11 @@
   ui::ResourceManager* resource_manager =
       ui::ResourceManagerImpl::FromJavaObject(jresource_manager);
   reader_mode_layer_ = ReaderModeLayer::Create(resource_manager);
-  layer_->AddChild(reader_mode_layer_->layer());
+
+  // The Reader Mode layer is initially invisible.
+  reader_mode_layer_->layer()->SetHideLayerAndSubtree(true);
+
+  layer()->AddChild(reader_mode_layer_->layer());
 }
 
 void ReaderModeSceneLayer::SetResourceIds(
@@ -53,6 +65,8 @@
     JNIEnv* env,
     const JavaParamRef<jobject>& object,
     jfloat dp_to_px,
+    jfloat base_page_brightness,
+    jfloat base_page_offset,
     const JavaParamRef<jobject>& jcontent_view_core,
     jfloat panel_X,
     jfloat panel_y,
@@ -73,6 +87,20 @@
                           : content::ContentViewCore::GetNativeContentViewCore(
                                 env, jcontent_view_core);
 
+  // Fade the base page out.
+  if (base_page_brightness_ != base_page_brightness) {
+    base_page_brightness_ = base_page_brightness;
+    cc::FilterOperations filters;
+    if (base_page_brightness < 1.f) {
+      filters.Append(
+          cc::FilterOperation::CreateBrightnessFilter(base_page_brightness));
+    }
+    content_container_->SetFilters(filters);
+  }
+
+  // Move the base page contents up.
+  content_container_->SetPosition(gfx::PointF(0.0f, base_page_offset));
+
   reader_mode_layer_->SetProperties(
       dp_to_px,
       content_view_core,
@@ -87,6 +115,36 @@
       bar_border_height,
       bar_shadow_visible,
       bar_shadow_opacity);
+
+  // Make the layer visible if it is not already.
+  reader_mode_layer_->layer()->SetHideLayerAndSubtree(false);
+}
+
+void ReaderModeSceneLayer::SetContentTree(
+    JNIEnv* env,
+    const JavaParamRef<jobject>& jobj,
+    const JavaParamRef<jobject>& jcontent_tree) {
+  SceneLayer* content_tree = FromJavaObject(env, jcontent_tree);
+  if (!content_tree || !content_tree->layer()) return;
+
+  if (!content_tree->layer()->parent()
+      || (content_tree->layer()->parent()->id() != content_container_->id())) {
+    content_container_->AddChild(content_tree->layer());
+  }
+}
+
+void ReaderModeSceneLayer::HideTree(JNIEnv* env,
+    const JavaParamRef<jobject>& jobj) {
+  // TODO(mdjones): Create super class for this logic.
+  if (reader_mode_layer_) {
+    reader_mode_layer_->layer()->SetHideLayerAndSubtree(true);
+  }
+  // Reset base page brightness.
+  cc::FilterOperations filters;
+  filters.Append(cc::FilterOperation::CreateBrightnessFilter(1.0f));
+  content_container_->SetFilters(filters);
+  // Reset base page offset.
+  content_container_->SetPosition(gfx::PointF(0.0f, 0.0f));
 }
 
 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& jobj) {
diff --git a/chrome/browser/android/compositor/scene_layer/reader_mode_scene_layer.h b/chrome/browser/android/compositor/scene_layer/reader_mode_scene_layer.h
index 13caf6d..49674e2b 100644
--- a/chrome/browser/android/compositor/scene_layer/reader_mode_scene_layer.h
+++ b/chrome/browser/android/compositor/scene_layer/reader_mode_scene_layer.h
@@ -15,6 +15,11 @@
 #include "chrome/browser/android/compositor/scene_layer/scene_layer.h"
 #include "ui/android/resources/resource_manager_impl.h"
 
+namespace cc {
+class Layer;
+class SolidColorLayer;
+}
+
 namespace chrome {
 namespace android {
 
@@ -43,6 +48,8 @@
       JNIEnv* env,
       const base::android::JavaParamRef<jobject>& object,
       jfloat dp_to_px,
+      jfloat base_page_brightness,
+      jfloat base_page_offset,
       const base::android::JavaParamRef<jobject>& jcontent_view_core,
       jfloat panel_X,
       jfloat panel_y,
@@ -56,8 +63,22 @@
       jboolean bar_shadow_visible,
       jfloat bar_shadow_opacity);
 
+  void SetContentTree(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>& jobj,
+      const base::android::JavaParamRef<jobject>& jcontent_tree);
+
+  void HideTree(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>& jobj);
+
  private:
+  float base_page_brightness_;
+
+  scoped_refptr<cc::Layer> content_layer_;
   scoped_refptr<ReaderModeLayer> reader_mode_layer_;
+  scoped_refptr<cc::SolidColorLayer> color_overlay_;
+  scoped_refptr<cc::Layer> content_container_;
 
   DISALLOW_COPY_AND_ASSIGN(ReaderModeSceneLayer);
 };
diff --git a/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.cc b/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.cc
index 606e2653..655225c4 100644
--- a/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.cc
+++ b/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.cc
@@ -31,22 +31,6 @@
 TabListSceneLayer::~TabListSceneLayer() {
 }
 
-void TabListSceneLayer::SetContentTree(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& jobj,
-    const JavaParamRef<jobject>& jcontent_tree) {
-  SceneLayer* content_tree = FromJavaObject(env, jcontent_tree);
-  if (content_tree && content_tree->layer()) {
-    content_tree_ = content_tree->layer();
-  } else {
-    content_tree_->RemoveFromParent();
-    content_tree_ = nullptr;
-  }
-
-  if (content_tree_.get())
-    layer()->AddChild(content_tree_);
-}
-
 void TabListSceneLayer::BeginBuildingFrame(JNIEnv* env,
                                            const JavaParamRef<jobject>& jobj) {
   write_index_ = 0;
diff --git a/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.h b/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.h
index 660101eb..97041cac 100644
--- a/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.h
+++ b/chrome/browser/android/compositor/scene_layer/tab_list_scene_layer.h
@@ -33,13 +33,6 @@
   TabListSceneLayer(JNIEnv* env, jobject jobj);
   ~TabListSceneLayer() override;
 
-  // TODO(changwan): remove this once we have refactored
-  // ContextualSearchSupportedLayout into LayoutHelper.
-  void SetContentTree(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& jobj,
-      const base::android::JavaParamRef<jobject>& jcontent_tree);
-
   void BeginBuildingFrame(JNIEnv* env,
                           const base::android::JavaParamRef<jobject>& jobj);
   void FinishBuildingFrame(JNIEnv* env,
@@ -133,9 +126,7 @@
   TabLayerList layers_;
   SkColor background_color_;
 
-  // We need to make sure that content_tree_ is always in front of own_tree_.
   scoped_refptr<cc::Layer> own_tree_;
-  scoped_refptr<cc::Layer> content_tree_;
 
   DISALLOW_COPY_AND_ASSIGN(TabListSceneLayer);
 };
diff --git a/chrome/browser/android/offline_pages/offline_page_mhtml_archiver.cc b/chrome/browser/android/offline_pages/offline_page_mhtml_archiver.cc
index 890ff98d..ed0c1bf 100644
--- a/chrome/browser/android/offline_pages/offline_page_mhtml_archiver.cc
+++ b/chrome/browser/android/offline_pages/offline_page_mhtml_archiver.cc
@@ -16,6 +16,7 @@
 #include "chrome/browser/ssl/chrome_security_state_model_client.h"
 #include "components/security_state/security_state_model.h"
 #include "content/public/browser/web_contents.h"
+#include "content/public/common/mhtml_generation_params.h"
 #include "net/base/filename_util.h"
 
 namespace offline_pages {
@@ -119,10 +120,14 @@
       archives_dir.Append(
           GenerateFileName(url, base::UTF16ToUTF8(title), archive_id)));
 
+  content::MHTMLGenerationParams params(file_path);
+  params.cache_control_policy =
+      content::MHTMLCacheControlPolicy::FAIL_FOR_NO_STORE_MAIN_FRAME;
+  params.use_binary_encoding = true;
+
   web_contents_->GenerateMHTML(
-      file_path, true /* use_binary_encoding */,
-      base::Bind(&OfflinePageMHTMLArchiver::OnGenerateMHTMLDone,
-                 weak_ptr_factory_.GetWeakPtr(), url, file_path));
+      params, base::Bind(&OfflinePageMHTMLArchiver::OnGenerateMHTMLDone,
+                         weak_ptr_factory_.GetWeakPtr(), url, file_path));
 }
 
 void OfflinePageMHTMLArchiver::OnGenerateMHTMLDone(
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
index 2b0b063..d64f9c82 100644
--- a/chrome/browser/chrome_browser_main.cc
+++ b/chrome/browser/chrome_browser_main.cc
@@ -978,19 +978,6 @@
                                         flags_ui::kAddSentinels);
   }
 #endif  // !defined(OS_CHROMEOS)
-  // The MaterialDesignController needs to look at command line flags, which
-  // are not available until this point. Now that they are, proceed with
-  // initializing the MaterialDesignController.
-  ui::MaterialDesignController::Initialize();
-#if defined(OS_CHROMEOS)
-  ash::MaterialDesignController::Initialize();
-#endif  // !defined(OS_CHROMEOS)
-
-#if defined(OS_MACOSX)
-  // Material Design resource packs can be loaded now that command line flags
-  // are set. See https://crbug.com/585290 .
-  ui::ResourceBundle::GetSharedInstance().LoadMaterialDesignResources();
-#endif
 
 #if defined(OS_WIN)
   // This is needed to enable ETW exporting when requested in about:flags.
@@ -1012,56 +999,11 @@
   crash_keys::SetCrashKeysFromCommandLine(
       *base::CommandLine::ForCurrentProcess());
 
-  // Mac starts it earlier in |PreMainMessageLoopStart()| (because it is
-  // needed when loading the MainMenu.nib and the language doesn't depend on
-  // anything since it comes from Cocoa.
-#if defined(OS_MACOSX)
-  std::string locale =
-      parameters().ui_task ? "en-US" : l10n_util::GetLocaleOverride();
-  browser_process_->SetApplicationLocale(locale);
-#else
-  const std::string locale =
-      local_state_->GetString(prefs::kApplicationLocale);
-
-  // On a POSIX OS other than ChromeOS, the parameter that is passed to the
-  // method InitSharedInstance is ignored.
-
-  TRACE_EVENT_BEGIN0("startup",
-      "ChromeBrowserMainParts::PreCreateThreadsImpl:InitResourceBundle");
-  const std::string loaded_locale =
-      ui::ResourceBundle::InitSharedInstanceWithLocale(
-          locale, NULL, ui::ResourceBundle::LOAD_COMMON_RESOURCES);
-  TRACE_EVENT_END0("startup",
-      "ChromeBrowserMainParts::PreCreateThreadsImpl:InitResourceBundle");
-
-  if (loaded_locale.empty() &&
-      !parsed_command_line().HasSwitch(switches::kNoErrorDialogs)) {
-    ShowMissingLocaleMessageBox();
-    return chrome::RESULT_CODE_MISSING_DATA;
-  }
-  CHECK(!loaded_locale.empty()) << "Locale could not be found for " << locale;
-  browser_process_->SetApplicationLocale(loaded_locale);
-
-  {
-    TRACE_EVENT0("startup",
-        "ChromeBrowserMainParts::PreCreateThreadsImpl:AddDataPack");
-    base::FilePath resources_pack_path;
-    PathService::Get(chrome::FILE_RESOURCES_PACK, &resources_pack_path);
-#if defined(OS_ANDROID)
-    ui::LoadMainAndroidPackFile("assets/resources.pak", resources_pack_path);
-#else
-    ResourceBundle::GetSharedInstance().AddDataPackFromPath(
-        resources_pack_path, ui::SCALE_FACTOR_NONE);
-#endif  // defined(OS_ANDROID)
-  }
-#endif  // defined(OS_MACOSX)
-
   // Android does first run in Java instead of native.
   // Chrome OS has its own out-of-box-experience code.
 #if !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
   // On first run, we need to process the predictor preferences before the
-  // browser's profile_manager object is created, but after ResourceBundle
-  // is initialized.
+  // browser's profile_manager object is created.
   if (first_run::IsChromeFirstRun()) {
     first_run::ProcessMasterPreferencesResult pmp_result =
         first_run::ProcessMasterPreferences(user_data_dir_,
@@ -1150,6 +1092,74 @@
   // IOThread's initialization which happens in BrowserProcess:PreCreateThreads.
   SetupMetricsAndFieldTrials();
 
+  // The MaterialDesignController needs to look at command line flags and field
+  // trials, which are not available until this point. Now that they are,
+  // proceed with initializing the MaterialDesignController.
+#if defined(OS_WIN)
+  const version_info::Channel channel = chrome::GetChannel();
+  ui::MaterialDesignController::InitializeWithDefaultMode(
+      ((channel == version_info::Channel::UNKNOWN) ||
+       (channel == version_info::Channel::CANARY) ||
+       (channel == version_info::Channel::DEV))
+          ? ui::MaterialDesignController::MATERIAL_NORMAL
+          : ui::MaterialDesignController::NON_MATERIAL);
+#else
+  ui::MaterialDesignController::Initialize();
+#if defined(OS_CHROMEOS)
+  ash::MaterialDesignController::Initialize();
+#endif  // !defined(OS_CHROMEOS)
+#endif  // !defined(OS_WIN)
+
+#if defined(OS_MACOSX)
+  // Material Design resource packs can be loaded now that command line flags
+  // are set. See https://crbug.com/585290 .
+  ui::ResourceBundle::GetSharedInstance().LoadMaterialDesignResources();
+#endif
+
+  // Mac starts it earlier in |PreMainMessageLoopStart()| (because it is
+  // needed when loading the MainMenu.nib and the language doesn't depend on
+  // anything since it comes from Cocoa.
+#if defined(OS_MACOSX)
+  std::string locale =
+      parameters().ui_task ? "en-US" : l10n_util::GetLocaleOverride();
+  browser_process_->SetApplicationLocale(locale);
+#else
+  const std::string locale =
+      local_state_->GetString(prefs::kApplicationLocale);
+
+  // On a POSIX OS other than ChromeOS, the parameter that is passed to the
+  // method InitSharedInstance is ignored.
+
+  TRACE_EVENT_BEGIN0("startup",
+      "ChromeBrowserMainParts::PreCreateThreadsImpl:InitResourceBundle");
+  const std::string loaded_locale =
+      ui::ResourceBundle::InitSharedInstanceWithLocale(
+          locale, nullptr, ui::ResourceBundle::LOAD_COMMON_RESOURCES);
+  TRACE_EVENT_END0("startup",
+      "ChromeBrowserMainParts::PreCreateThreadsImpl:InitResourceBundle");
+
+  if (loaded_locale.empty() &&
+      !parsed_command_line().HasSwitch(switches::kNoErrorDialogs)) {
+    ShowMissingLocaleMessageBox();
+    return chrome::RESULT_CODE_MISSING_DATA;
+  }
+  CHECK(!loaded_locale.empty()) << "Locale could not be found for " << locale;
+  browser_process_->SetApplicationLocale(loaded_locale);
+
+  {
+    TRACE_EVENT0("startup",
+        "ChromeBrowserMainParts::PreCreateThreadsImpl:AddDataPack");
+    base::FilePath resources_pack_path;
+    PathService::Get(chrome::FILE_RESOURCES_PACK, &resources_pack_path);
+#if defined(OS_ANDROID)
+    ui::LoadMainAndroidPackFile("assets/resources.pak", resources_pack_path);
+#else
+    ResourceBundle::GetSharedInstance().AddDataPackFromPath(
+        resources_pack_path, ui::SCALE_FACTOR_NONE);
+#endif  // defined(OS_ANDROID)
+  }
+#endif  // defined(OS_MACOSX)
+
   // ChromeOS needs ResourceBundle::InitSharedInstance to be called before this.
   browser_process_->PreCreateThreads();
 
diff --git a/chrome/browser/chromeos/file_manager/arc_file_tasks.cc b/chrome/browser/chromeos/file_manager/arc_file_tasks.cc
index 132fa02..e33ef911 100644
--- a/chrome/browser/chromeos/file_manager/arc_file_tasks.cc
+++ b/chrome/browser/chromeos/file_manager/arc_file_tasks.cc
@@ -11,9 +11,11 @@
 #include "base/bind.h"
 #include "base/files/file_path.h"
 #include "base/logging.h"
+#include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/chromeos/file_manager/path_util.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/common/extensions/api/file_manager_private.h"
+#include "chrome/grit/generated_resources.h"
 #include "components/arc/arc_bridge_service.h"
 #include "components/arc/common/intent_helper.mojom.h"
 #include "components/user_manager/user_manager.h"
@@ -21,6 +23,7 @@
 #include "mojo/public/cpp/bindings/binding.h"
 #include "net/base/filename_util.h"
 #include "storage/browser/fileapi/file_system_url.h"
+#include "ui/base/l10n/l10n_util.h"
 #include "url/gurl.h"
 
 namespace file_manager {
@@ -114,10 +117,16 @@
     mojo::Array<arc::mojom::UrlHandlerInfoPtr> handlers) {
   for (const arc::mojom::UrlHandlerInfoPtr& handler : handlers) {
     // TODO(crbug.com/578725): Wire action to "verb" once it's implemented.
+    std::string name(handler->name);
+    if (handler->action == arc::mojom::ActionType::SEND ||
+        handler->action == arc::mojom::ActionType::SEND_MULTIPLE) {
+      name = l10n_util::GetStringFUTF8(IDS_FILE_BROWSER_SHARE_WITH_ACTION_LABEL,
+                                       base::UTF8ToUTF16(name));
+    }
     result_list->push_back(FullTaskDescriptor(
         TaskDescriptor(handler->package_name, TASK_TYPE_ARC_APP,
                        ArcActionToString(handler->action)),
-        handler->name,
+        name,
         GURL(""),                                        // TODO: get the icon
         false,                                           // is_default,
         handler->action != arc::mojom::ActionType::VIEW  // is_generic
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_impl.cc b/chrome/browser/chromeos/login/ui/login_display_host_impl.cc
index 148bde68..646c2d2 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host_impl.cc
+++ b/chrome/browser/chromeos/login/ui/login_display_host_impl.cc
@@ -1014,13 +1014,14 @@
     base::MessageLoop::current()->PostTask(FROM_HERE, completion_callback_);
 
   if (ash::Shell::HasInstance() &&
-      finalize_animation_type_ == ANIMATION_ADD_USER &&
-      !chrome::IsRunningInMash()) {
-    ash::Shell::GetInstance()
-        ->desktop_background_controller()
-        ->MoveDesktopToUnlockedContainer();
-  } else {
-    NOTIMPLEMENTED();
+      finalize_animation_type_ == ANIMATION_ADD_USER) {
+    if (!chrome::IsRunningInMash()) {
+      ash::Shell::GetInstance()
+          ->desktop_background_controller()
+          ->MoveDesktopToUnlockedContainer();
+    } else {
+      NOTIMPLEMENTED();
+    }
   }
 }
 
diff --git a/chrome/browser/chromeos/profiles/profile_helper.h b/chrome/browser/chromeos/profiles/profile_helper.h
index 2bd8072..12a149c3 100644
--- a/chrome/browser/chromeos/profiles/profile_helper.h
+++ b/chrome/browser/chromeos/profiles/profile_helper.h
@@ -33,6 +33,10 @@
 }  // namespace test
 }  // namespace ash
 
+namespace test {
+class BrowserFinderChromeOSTest;
+}  // namespace test
+
 namespace chromeos {
 
 class FileFlusher;
@@ -155,6 +159,7 @@
   friend class SessionStateDelegateChromeOSTest;
   friend class SystemTrayDelegateChromeOSTest;
   friend class ash::test::MultiUserWindowManagerChromeOSTest;
+  friend class ::test::BrowserFinderChromeOSTest;
 
   // Called when signin profile is cleared.
   void OnSigninProfileCleared();
diff --git a/chrome/browser/component_updater/caps_installer_win.cc b/chrome/browser/component_updater/caps_installer_win.cc
index d2d3630..7027442a 100644
--- a/chrome/browser/component_updater/caps_installer_win.cc
+++ b/chrome/browser/component_updater/caps_installer_win.cc
@@ -51,9 +51,6 @@
 const base::FilePath::CharType kCapsBinary[] =
     FILE_PATH_LITERAL("chrome_crash_svc.exe");
 
-const base::FilePath::CharType kCapsDirectory[] =
-    FILE_PATH_LITERAL("Caps");
-
 // This function is called from a worker thread to launch crash service.
 void LaunchService(const base::FilePath& exe_path) {
   base::CommandLine service_cmdline(exe_path);
@@ -98,10 +95,8 @@
   }
 
   // Directory is usually "%appdata%\Local\Chrome\User Data\Caps".
-  base::FilePath GetBaseDirectory() const override {
-    base::FilePath user_data;
-    PathService::Get(chrome::DIR_USER_DATA, &user_data);
-    return user_data.Append(kCapsDirectory);
+  base::FilePath GetRelativeInstallDir() const override {
+    return base::FilePath(FILE_PATH_LITERAL("Caps"));
   }
 
   void GetHash(std::vector<uint8_t>* hash) const override {
diff --git a/chrome/browser/component_updater/cld_component_installer.cc b/chrome/browser/component_updater/cld_component_installer.cc
index fc0a5e6..3f2f7b40 100644
--- a/chrome/browser/component_updater/cld_component_installer.cc
+++ b/chrome/browser/component_updater/cld_component_installer.cc
@@ -98,10 +98,8 @@
   return result;
 }
 
-base::FilePath CldComponentInstallerTraits::GetBaseDirectory() const {
-  base::FilePath result;
-  PathService::Get(DIR_COMPONENT_CLD2, &result);
-  return result;
+base::FilePath CldComponentInstallerTraits::GetRelativeInstallDir() const {
+  return base::FilePath(FILE_PATH_LITERAL("CLD"));
 }
 
 void CldComponentInstallerTraits::GetHash(std::vector<uint8_t>* hash) const {
diff --git a/chrome/browser/component_updater/cld_component_installer.h b/chrome/browser/component_updater/cld_component_installer.h
index 32a04fc..20b0ba3 100644
--- a/chrome/browser/component_updater/cld_component_installer.h
+++ b/chrome/browser/component_updater/cld_component_installer.h
@@ -32,7 +32,7 @@
   friend class CldComponentInstallerTest;  // For access within SetUp()
   friend class test::ComponentCldDataHarness;  // For browser tests only
   FRIEND_TEST_ALL_PREFIXES(CldComponentInstallerTest, ComponentReady);
-  FRIEND_TEST_ALL_PREFIXES(CldComponentInstallerTest, GetBaseDirectory);
+  FRIEND_TEST_ALL_PREFIXES(CldComponentInstallerTest, GetRelativeInstallDir);
   FRIEND_TEST_ALL_PREFIXES(CldComponentInstallerTest, GetHash);
   FRIEND_TEST_ALL_PREFIXES(CldComponentInstallerTest, GetInstalledPath);
   FRIEND_TEST_ALL_PREFIXES(CldComponentInstallerTest, GetName);
@@ -50,7 +50,7 @@
   void ComponentReady(const base::Version& version,
                       const base::FilePath& path,
                       std::unique_ptr<base::DictionaryValue> manifest) override;
-  base::FilePath GetBaseDirectory() const override;
+  base::FilePath GetRelativeInstallDir() const override;
   void GetHash(std::vector<uint8_t>* hash) const override;
   std::string GetName() const override;
   std::string GetAp() const override;
diff --git a/chrome/browser/component_updater/cld_component_installer_unittest.cc b/chrome/browser/component_updater/cld_component_installer_unittest.cc
index 5cf6e483..8b65d1a 100644
--- a/chrome/browser/component_updater/cld_component_installer_unittest.cc
+++ b/chrome/browser/component_updater/cld_component_installer_unittest.cc
@@ -110,9 +110,8 @@
                              base::CompareCase::SENSITIVE));
 }
 
-TEST_F(CldComponentInstallerTest, GetBaseDirectory) {
-  const base::FilePath result = traits_.GetBaseDirectory();
-  ASSERT_FALSE(result.empty());
+TEST_F(CldComponentInstallerTest, GetRelativeInstallDir) {
+  ASSERT_FALSE(traits_.GetRelativeInstallDir().empty());
 }
 
 TEST_F(CldComponentInstallerTest, GetHash) {
diff --git a/chrome/browser/component_updater/ev_whitelist_component_installer.cc b/chrome/browser/component_updater/ev_whitelist_component_installer.cc
index 8007b5a..92becb5 100644
--- a/chrome/browser/component_updater/ev_whitelist_component_installer.cc
+++ b/chrome/browser/component_updater/ev_whitelist_component_installer.cc
@@ -116,10 +116,9 @@
   return base::PathExists(GetInstalledPath(install_dir));
 }
 
-base::FilePath EVWhitelistComponentInstallerTraits::GetBaseDirectory() const {
-  base::FilePath result;
-  PathService::Get(DIR_COMPONENT_EV_WHITELIST, &result);
-  return result;
+base::FilePath EVWhitelistComponentInstallerTraits::GetRelativeInstallDir()
+    const {
+  return base::FilePath(FILE_PATH_LITERAL("EVWhitelist"));
 }
 
 void EVWhitelistComponentInstallerTraits::GetHash(
diff --git a/chrome/browser/component_updater/ev_whitelist_component_installer.h b/chrome/browser/component_updater/ev_whitelist_component_installer.h
index 72a1382b..c9ad8b55 100644
--- a/chrome/browser/component_updater/ev_whitelist_component_installer.h
+++ b/chrome/browser/component_updater/ev_whitelist_component_installer.h
@@ -38,7 +38,7 @@
   void ComponentReady(const base::Version& version,
                       const base::FilePath& install_dir,
                       std::unique_ptr<base::DictionaryValue> manifest) override;
-  base::FilePath GetBaseDirectory() const override;
+  base::FilePath GetRelativeInstallDir() const override;
   void GetHash(std::vector<uint8_t>* hash) const override;
   std::string GetName() const override;
   std::string GetAp() const override;
diff --git a/chrome/browser/component_updater/origin_trials_component_installer.cc b/chrome/browser/component_updater/origin_trials_component_installer.cc
index 3ef12e9e..a32d62a 100644
--- a/chrome/browser/component_updater/origin_trials_component_installer.cc
+++ b/chrome/browser/component_updater/origin_trials_component_installer.cc
@@ -74,10 +74,9 @@
   }
 }
 
-base::FilePath OriginTrialsComponentInstallerTraits::GetBaseDirectory() const {
-  base::FilePath result;
-  PathService::Get(DIR_ORIGIN_TRIAL_KEYS, &result);
-  return result;
+base::FilePath OriginTrialsComponentInstallerTraits::GetRelativeInstallDir()
+    const {
+  return base::FilePath(FILE_PATH_LITERAL("OriginTrials"));
 }
 
 void OriginTrialsComponentInstallerTraits::GetHash(
diff --git a/chrome/browser/component_updater/origin_trials_component_installer.h b/chrome/browser/component_updater/origin_trials_component_installer.h
index c097b21..97fa333a 100644
--- a/chrome/browser/component_updater/origin_trials_component_installer.h
+++ b/chrome/browser/component_updater/origin_trials_component_installer.h
@@ -36,7 +36,7 @@
   void ComponentReady(const base::Version& version,
                       const base::FilePath& install_dir,
                       std::unique_ptr<base::DictionaryValue> manifest) override;
-  base::FilePath GetBaseDirectory() const override;
+  base::FilePath GetRelativeInstallDir() const override;
   void GetHash(std::vector<uint8_t>* hash) const override;
   std::string GetName() const override;
   std::string GetAp() const override;
diff --git a/chrome/browser/component_updater/sth_set_component_installer.cc b/chrome/browser/component_updater/sth_set_component_installer.cc
index fc393cef..401a79f3 100644
--- a/chrome/browser/component_updater/sth_set_component_installer.cc
+++ b/chrome/browser/component_updater/sth_set_component_installer.cc
@@ -89,10 +89,8 @@
   return base::PathExists(GetInstalledPath(install_dir));
 }
 
-base::FilePath STHSetComponentInstallerTraits::GetBaseDirectory() const {
-  base::FilePath result;
-  PathService::Get(DIR_CERT_TRANS_TREE_STATES, &result);
-  return result;
+base::FilePath STHSetComponentInstallerTraits::GetRelativeInstallDir() const {
+  return base::FilePath(FILE_PATH_LITERAL("CertificateTransparency"));
 }
 
 void STHSetComponentInstallerTraits::GetHash(std::vector<uint8_t>* hash) const {
diff --git a/chrome/browser/component_updater/sth_set_component_installer.h b/chrome/browser/component_updater/sth_set_component_installer.h
index ba3df76..4223aa37 100644
--- a/chrome/browser/component_updater/sth_set_component_installer.h
+++ b/chrome/browser/component_updater/sth_set_component_installer.h
@@ -57,7 +57,7 @@
   void ComponentReady(const base::Version& version,
                       const base::FilePath& install_dir,
                       std::unique_ptr<base::DictionaryValue> manifest) override;
-  base::FilePath GetBaseDirectory() const override;
+  base::FilePath GetRelativeInstallDir() const override;
   void GetHash(std::vector<uint8_t>* hash) const override;
   std::string GetName() const override;
   std::string GetAp() const override;
diff --git a/chrome/browser/component_updater/supervised_user_whitelist_installer.cc b/chrome/browser/component_updater/supervised_user_whitelist_installer.cc
index 5335d3d..97f9db0 100644
--- a/chrome/browser/component_updater/supervised_user_whitelist_installer.cc
+++ b/chrome/browser/component_updater/supervised_user_whitelist_installer.cc
@@ -257,7 +257,7 @@
   void ComponentReady(const base::Version& version,
                       const base::FilePath& install_dir,
                       std::unique_ptr<base::DictionaryValue> manifest) override;
-  base::FilePath GetBaseDirectory() const override;
+  base::FilePath GetRelativeInstallDir() const override;
   void GetHash(std::vector<uint8_t>* hash) const override;
   std::string GetName() const override;
   std::string GetAp() const override;
@@ -306,10 +306,9 @@
 }
 
 base::FilePath
-SupervisedUserWhitelistComponentInstallerTraits::GetBaseDirectory() const {
-  base::FilePath whitelist_directory;
-  PathService::Get(DIR_SUPERVISED_USER_WHITELISTS, &whitelist_directory);
-  return whitelist_directory.AppendASCII(crx_id_);
+SupervisedUserWhitelistComponentInstallerTraits::GetRelativeInstallDir() const {
+  return base::FilePath(component_updater::kSupervisedUserWhitelistDirName)
+      .AppendASCII(crx_id_);
 }
 
 void SupervisedUserWhitelistComponentInstallerTraits::GetHash(
diff --git a/chrome/browser/component_updater/sw_reporter_installer_win.cc b/chrome/browser/component_updater/sw_reporter_installer_win.cc
index 971c2b97..b5147d0728 100644
--- a/chrome/browser/component_updater/sw_reporter_installer_win.cc
+++ b/chrome/browser/component_updater/sw_reporter_installer_win.cc
@@ -132,7 +132,9 @@
                                  base::WorkerPool::GetTaskRunner(true));
   }
 
-  base::FilePath GetBaseDirectory() const override { return install_dir(); }
+  base::FilePath GetRelativeInstallDir() const override {
+    return base::FilePath(FILE_PATH_LITERAL("SwReporter"));
+  }
 
   void GetHash(std::vector<uint8_t>* hash) const override { GetPkHash(hash); }
 
@@ -140,14 +142,6 @@
 
   std::string GetAp() const override { return std::string(); }
 
-  static base::FilePath install_dir() {
-    // The base directory on windows looks like:
-    // <profile>\AppData\Local\Google\Chrome\User Data\SwReporter\.
-    base::FilePath result;
-    PathService::Get(DIR_SW_REPORTER, &result);
-    return result;
-  }
-
   static std::string ID() {
     update_client::CrxComponent component;
     component.version = Version("0.0.0.0");
diff --git a/chrome/browser/component_updater/widevine_cdm_component_installer.cc b/chrome/browser/component_updater/widevine_cdm_component_installer.cc
index 2aa80118..4279e0b 100644
--- a/chrome/browser/component_updater/widevine_cdm_component_installer.cc
+++ b/chrome/browser/component_updater/widevine_cdm_component_installer.cc
@@ -252,7 +252,7 @@
   void ComponentReady(const base::Version& version,
                       const base::FilePath& path,
                       std::unique_ptr<base::DictionaryValue> manifest) override;
-  base::FilePath GetBaseDirectory() const override;
+  base::FilePath GetRelativeInstallDir() const override;
   void GetHash(std::vector<uint8_t>* hash) const override;
   std::string GetName() const override;
   std::string GetAp() const override;
@@ -315,10 +315,9 @@
 
 // The base directory on Windows looks like:
 // <profile>\AppData\Local\Google\Chrome\User Data\WidevineCdm\.
-base::FilePath WidevineCdmComponentInstallerTraits::GetBaseDirectory() const {
-  base::FilePath result;
-  PathService::Get(chrome::DIR_COMPONENT_WIDEVINE_CDM, &result);
-  return result;
+base::FilePath WidevineCdmComponentInstallerTraits::GetRelativeInstallDir()
+    const {
+  return base::FilePath(FILE_PATH_LITERAL("WidevineCdm"));
 }
 
 void WidevineCdmComponentInstallerTraits::GetHash(
diff --git a/chrome/browser/extensions/api/page_capture/page_capture_api.cc b/chrome/browser/extensions/api/page_capture/page_capture_api.cc
index cb3d1a32..66e5bb12 100644
--- a/chrome/browser/extensions/api/page_capture/page_capture_api.cc
+++ b/chrome/browser/extensions/api/page_capture/page_capture_api.cc
@@ -18,6 +18,7 @@
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/web_contents.h"
+#include "content/public/common/mhtml_generation_params.h"
 #include "extensions/common/extension_messages.h"
 
 using content::BrowserThread;
@@ -132,8 +133,7 @@
   }
 
   web_contents->GenerateMHTML(
-      mhtml_path_,
-      false /* use_binary_encoding */,
+      content::MHTMLGenerationParams(mhtml_path_),
       base::Bind(&PageCaptureSaveAsMHTMLFunction::MHTMLGenerated, this));
 }
 
diff --git a/chrome/browser/extensions/extension_install_prompt.h b/chrome/browser/extensions/extension_install_prompt.h
index 13ee5bf..41a58c56 100644
--- a/chrome/browser/extensions/extension_install_prompt.h
+++ b/chrome/browser/extensions/extension_install_prompt.h
@@ -260,6 +260,10 @@
   // The implementations of this function are platform-specific.
   static ShowDialogCallback GetDefaultShowDialogCallback();
 
+  // Callback to show the Views extension install dialog. Don't use this; it is
+  // a temporary hack for MacViews.
+  static ShowDialogCallback GetViewsShowDialogCallback();
+
   // Returns the appropriate prompt type for the given |extension|.
   // TODO(devlin): This method is yucky - callers probably only care about one
   // prompt type. We just need to comb through and figure out what it is.
diff --git a/chrome/browser/first_run/first_run.cc b/chrome/browser/first_run/first_run.cc
index a19d5b28..cd71d50e 100644
--- a/chrome/browser/first_run/first_run.cc
+++ b/chrome/browser/first_run/first_run.cc
@@ -70,6 +70,7 @@
 #include "extensions/browser/extension_system.h"
 #include "google_apis/gaia/gaia_auth_util.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/base/resource/resource_bundle.h"
 #include "url/gurl.h"
 
 using base::UserMetricsAction;
@@ -725,6 +726,9 @@
   // ping_delay is missing.
   out_prefs->ping_delay = 90;
   if (install_prefs.get()) {
+    // The ResourceBundle hasn't been loaded yet, but we need strings from it.
+    ResourceBundle::TemporaryLoader loader;
+
     if (!internal::ShowPostInstallEULAIfNeeded(install_prefs.get()))
       return EULA_EXIT_NOW;
 
diff --git a/chrome/browser/memory/tab_manager.cc b/chrome/browser/memory/tab_manager.cc
index f89f8e4..eef6d4d 100644
--- a/chrome/browser/memory/tab_manager.cc
+++ b/chrome/browser/memory/tab_manager.cc
@@ -170,9 +170,9 @@
   std::string allow_multiple_discards = variations::GetVariationParamValue(
       features::kAutomaticTabDiscarding.name, "AllowMultipleDiscards");
   if (allow_multiple_discards == "true")
-    discard_once_ = true;
-  else
     discard_once_ = false;
+  else
+    discard_once_ = true;
 
   // Check the variation parameter to see if a tab is to be protected for an
   // amount of time after being backgrounded. The value is in seconds.
diff --git a/chrome/browser/metrics/chrome_metrics_service_client.cc b/chrome/browser/metrics/chrome_metrics_service_client.cc
index c12fded6..ff3fa21 100644
--- a/chrome/browser/metrics/chrome_metrics_service_client.cc
+++ b/chrome/browser/metrics/chrome_metrics_service_client.cc
@@ -195,9 +195,9 @@
       if (allocator) {
         const char* allocator_name = allocator->Name();
         allocator->SetPersistentLocation(metrics_file);
-        file_metrics_provider->RegisterFile(
+        file_metrics_provider->RegisterSource(
             metrics_file,
-            metrics::FileMetricsProvider::FILE_HISTOGRAMS_ATOMIC,
+            metrics::FileMetricsProvider::SOURCE_HISTOGRAMS_ATOMIC_FILE,
             metrics::FileMetricsProvider::ASSOCIATE_PREVIOUS_RUN,
             allocator_name);
       }
@@ -213,10 +213,9 @@
   // Read metrics file from setup.exe.
   base::FilePath program_dir;
   base::PathService::Get(base::DIR_EXE, &program_dir);
-  file_metrics_provider->RegisterFile(
-      program_dir.AppendASCII(installer::kSetupHistogramAllocatorName)
-          .AddExtension(FILE_PATH_LITERAL(".pma")),
-      metrics::FileMetricsProvider::FILE_HISTOGRAMS_ATOMIC,
+  file_metrics_provider->RegisterSource(
+      program_dir.AppendASCII(installer::kSetupHistogramAllocatorName),
+      metrics::FileMetricsProvider::SOURCE_HISTOGRAMS_ATOMIC_DIR,
       metrics::FileMetricsProvider::ASSOCIATE_CURRENT_RUN,
       installer::kSetupHistogramAllocatorName);
 #endif
diff --git a/chrome/browser/net/predictor_browsertest.cc b/chrome/browser/net/predictor_browsertest.cc
index 2afa4e9..be8568a 100644
--- a/chrome/browser/net/predictor_browsertest.cc
+++ b/chrome/browser/net/predictor_browsertest.cc
@@ -464,6 +464,8 @@
         switches::kEnableExperimentalWebPlatformFeatures);
     command_line->AppendSwitchASCII(
         switches::kEnableBlinkFeatures, kBlinkPreconnectFeature);
+    command_line->AppendSwitchASCII(switches::kEnableFeatures,
+                                    "PreconnectMore");
   }
 
   void SetUpOnMainThread() override {
@@ -594,10 +596,13 @@
     DCHECK_CURRENTLY_ON(BrowserThread::UI);
     observer_.reset(
         new CrossSitePredictorObserver(source_host, cross_site_host));
-    BrowserThread::PostTask(
+    base::RunLoop run_loop;
+    BrowserThread::PostTaskAndReply(
         BrowserThread::IO, FROM_HERE,
         base::Bind(&PredictorBrowserTest::InstallPredictorObserverOnIOThread,
-                   base::Unretained(this), base::Unretained(predictor())));
+                   base::Unretained(this), base::Unretained(predictor())),
+        run_loop.QuitClosure());
+    run_loop.Run();
   }
 
   void InstallPredictorObserverOnIOThread(
@@ -875,6 +880,7 @@
                        CrossSiteSimplePredictionAfterTwoNavigations) {
   NavigateToCrossSiteHtmlUrl(1 /* num_cors */, "" /* file_suffix */);
   EXPECT_EQ(0, observer()->CrossSitePreconnected());
+  EXPECT_EQ(1, observer()->CrossSiteLearned());
 
   NavigateToCrossSiteHtmlUrl(1 /* num_cors */, "" /* file_suffix */);
   EXPECT_EQ(4, observer()->CrossSitePreconnected());
@@ -900,6 +906,7 @@
                        CrossSiteSimplePredictionAfterTwoNavigations2) {
   NavigateToCrossSiteHtmlUrl(2 /* num_cors */, "" /* file_suffix */);
   EXPECT_EQ(0, observer()->CrossSitePreconnected());
+  EXPECT_EQ(2, observer()->CrossSiteLearned());
 
   NavigateToCrossSiteHtmlUrl(2 /* num_cors */, "" /* file_suffix */);
 
diff --git a/chrome/browser/platform_util_linux.cc b/chrome/browser/platform_util_linux.cc
index 340d8ab..a4f9ea9e 100644
--- a/chrome/browser/platform_util_linux.cc
+++ b/chrome/browser/platform_util_linux.cc
@@ -23,6 +23,7 @@
 namespace {
 
 const char kNautilusKey[] = "nautilus.desktop";
+const char kNautilusKeyExtended[] = "nautilus-folder-handler.desktop";
 const char kNautilusCmd[] = "nautilus";
 const char kSupportedNautilusVersion[] = "3.0.2";
 
@@ -105,7 +106,8 @@
                             base::TRIM_TRAILING,
                             &file_browser);
 
-  if (!success || file_browser != kNautilusKey)
+  if (!success ||
+      (file_browser != kNautilusKey && file_browser != kNautilusKeyExtended))
     return false;
 
   const base::Version supported_version(kSupportedNautilusVersion);
diff --git a/chrome/browser/profiles/profile_impl_io_data.cc b/chrome/browser/profiles/profile_impl_io_data.cc
index 49b9a26..29806d46 100644
--- a/chrome/browser/profiles/profile_impl_io_data.cc
+++ b/chrome/browser/profiles/profile_impl_io_data.cc
@@ -73,9 +73,7 @@
 namespace {
 
 net::BackendType ChooseCacheBackendType() {
-#if defined(OS_ANDROID)
-  return net::CACHE_BACKEND_SIMPLE;
-#else
+#if !defined(OS_ANDROID)
   const base::CommandLine& command_line =
       *base::CommandLine::ForCurrentProcess();
   if (command_line.HasSwitch(switches::kUseSimpleCacheBackend)) {
@@ -88,10 +86,19 @@
   }
   const std::string experiment_name =
       base::FieldTrialList::FindFullName("SimpleCacheTrial");
-  if (experiment_name == "ExperimentYes" ||
-      experiment_name == "ExperimentYes2") {
+  if (base::StartsWith(experiment_name, "Disable",
+                       base::CompareCase::INSENSITIVE_ASCII)) {
+    return net::CACHE_BACKEND_BLOCKFILE;
+  }
+  if (base::StartsWith(experiment_name, "ExperimentYes",
+                       base::CompareCase::INSENSITIVE_ASCII)) {
     return net::CACHE_BACKEND_SIMPLE;
   }
+#endif  // #if !defined(OS_ANDROID)
+
+#if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS)
+  return net::CACHE_BACKEND_SIMPLE;
+#else
   return net::CACHE_BACKEND_BLOCKFILE;
 #endif
 }
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc
index 9a0ed35..56fd767 100644
--- a/chrome/browser/profiles/profile_manager.cc
+++ b/chrome/browser/profiles/profile_manager.cc
@@ -726,10 +726,22 @@
 }
 
 #if !defined(OS_ANDROID)
+bool ProfileManager::MaybeScheduleProfileForDeletion(
+    const base::FilePath& profile_dir,
+    const CreateCallback& callback,
+    ProfileMetrics::ProfileDelete deletion_source) {
+  if (IsProfileMarkedForDeletion(profile_dir))
+    return false;
+  ScheduleProfileForDeletion(profile_dir, callback);
+  ProfileMetrics::LogProfileDeleteUser(deletion_source);
+  return true;
+}
+
 void ProfileManager::ScheduleProfileForDeletion(
     const base::FilePath& profile_dir,
     const CreateCallback& callback) {
   DCHECK(profiles::IsMultipleProfilesEnabled());
+  DCHECK(!IsProfileMarkedForDeletion(profile_dir));
 
   // Cancel all in-progress downloads before deleting the profile to prevent a
   // "Do you want to exit Google Chrome and cancel the downloads?" prompt
diff --git a/chrome/browser/profiles/profile_manager.h b/chrome/browser/profiles/profile_manager.h
index ed8c787a..2a484d3 100644
--- a/chrome/browser/profiles/profile_manager.h
+++ b/chrome/browser/profiles/profile_manager.h
@@ -22,6 +22,7 @@
 #include "base/threading/non_thread_safe.h"
 #include "build/build_config.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_metrics.h"
 #include "chrome/browser/profiles/profile_shortcut_manager.h"
 #include "chrome/browser/ui/browser_list_observer.h"
 #include "content/public/browser/notification_observer.h"
@@ -189,6 +190,14 @@
   ProfileShortcutManager* profile_shortcut_manager();
 
 #if !defined(OS_ANDROID)
+  // Less strict version of ScheduleProfileForDeletion(), silently fail if
+  // profile already marked for deletion. Returns true if the profile scheduled
+  // for deletion.
+  bool MaybeScheduleProfileForDeletion(
+      const base::FilePath& profile_dir,
+      const CreateCallback& callback,
+      ProfileMetrics::ProfileDelete deletion_source);
+
   // Schedules the profile at the given path to be deleted on shutdown. If we're
   // deleting the last profile, a new one will be created in its place, and in
   // that case the callback will be called when profile creation is complete.
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/cursors.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/cursors.js
index 84a6898..35ebe6d5 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/cursors.js
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/cursors.js
@@ -284,6 +284,14 @@
     newNode = newNode || this.node_;
     newIndex = goog.isDef(newIndex) ? newIndex : this.index_;
     return new cursors.Cursor(newNode, newIndex);
+  },
+
+  /**
+   * Returns whether this cursor points to a valid position.
+   * @return {boolean}
+   */
+  isValid: function() {
+    return this.node.role !== undefined;
   }
 };
 
@@ -528,6 +536,14 @@
   isWebRange: function() {
     return this.start.node.root.role != RoleType.desktop ||
         this.end.node.root.role != RoleType.desktop;
+  },
+
+  /**
+   * Returns whether this range has valid start and end cursors.
+   * @return {boolean}
+   */
+  isValid: function() {
+    return this.start.isValid() && this.end.isValid();
   }
 };
 
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
index efd4f7e..8181ad0 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
@@ -913,6 +913,9 @@
    * @private
    */
   render_: function(range, prevRange, type, buff) {
+    if (prevRange && !prevRange.isValid())
+      prevRange = null;
+
     if (range.isSubNode())
       this.subNode_(range, prevRange, type, buff);
     else
diff --git a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html
index 89888985..136602d 100644
--- a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html
+++ b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html
@@ -1,14 +1,11 @@
 <link rel="import" href="chrome://resources/html/polymer.html">
 <link rel="import" href="chrome://resources/html/i18n_behavior.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/neon-animation/web-animations.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-checkbox/paper-checkbox.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-input/paper-input.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-item/paper-item.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-menu/paper-menu.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-spinner/paper-spinner.html">
-<link rel="import" href="../issue_banner/issue_banner.html">
 <link rel="import" href="../media_router_header/media_router_header.html">
-<link rel="import" href="../media_router_search_highlighter/media_router_search_highlighter.html">
 <link rel="import" href="../route_details/route_details.html">
 <link rel="import" href="../../icons/media_router_icons.html">
 <dom-module id="media-router-container">
diff --git a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js
index c3af59d..15353065 100644
--- a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js
+++ b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js
@@ -404,6 +404,17 @@
     this.putSearchAtBottom_();
 
     Polymer.RenderStatus.afterNextRender(this, function() {
+      // Import the elements that aren't needed at startup. This reduces
+      // initial load time.
+      this.importHref(this.resolveUrl(
+          'chrome://resources/polymer/v1_0/neon-animation/' +
+              'web-animations.html'));
+      this.importHref(this.resolveUrl(
+          '../issue_banner/issue_banner.html'));
+      this.importHref(this.resolveUrl(
+          '../media_router_search_highlighter/' +
+              'media_router_search_highlighter.html'));
+
       // If this is not on a Mac platform, remove the placeholder. See
       // onFocus_() for more details. ready() is only called once, so no need
       // to check if the placeholder exist before removing.
@@ -426,6 +437,14 @@
           sinkCount: this.allSinks.length,
         });
       }, 3000 /* 3 seconds */);
+
+      // For Mac platforms, request data after a short delay after load. This
+      // appears to speed up initial data load time on Mac.
+      if (cr.isMac) {
+        this.async(function() {
+          this.fire('request-initial-data');
+        }, 25 /* 0.025 seconds */);
+      }
     });
   },
 
diff --git a/chrome/browser/resources/media_router/icons/media_router_icons.html b/chrome/browser/resources/media_router/icons/media_router_icons.html
index 920087f..179ecac8 100644
--- a/chrome/browser/resources/media_router/icons/media_router_icons.html
+++ b/chrome/browser/resources/media_router/icons/media_router_icons.html
@@ -1,4 +1,4 @@
-<link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
+<link rel="import" href="chrome://resources/html/polymer.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/iron-iconset-svg/iron-iconset-svg.html">
 <iron-iconset-svg name="media-router" size="24">
 <svg><defs>
diff --git a/chrome/browser/resources/media_router/media_router.js b/chrome/browser/resources/media_router/media_router.js
index 26fd6eb..834f9eff 100644
--- a/chrome/browser/resources/media_router/media_router.js
+++ b/chrome/browser/resources/media_router/media_router.js
@@ -20,7 +20,9 @@
    * router content, such as the media sink and media route lists.
    */
   function initialize() {
-    media_router.browserApi.requestInitialData();
+    // For non-Mac platforms, request data immediately after initialization.
+    if (!cr.isMac)
+      onRequestInitialData();
 
     container = /** @type {!MediaRouterContainerElement} */
         ($('media-router-container'));
@@ -51,6 +53,8 @@
     container.addEventListener('report-sink-count', onSinkCountReported);
     container.addEventListener('report-resolved-route',
                                onReportRouteCreationOutcome);
+    container.addEventListener('request-initial-data',
+                               onRequestInitialData);
     container.addEventListener('search-sinks-and-create-route',
                                onSearchSinksAndCreateRoute);
     container.addEventListener('show-initial-state', onShowInitialState);
@@ -290,6 +294,13 @@
   }
 
   /**
+   * Requests for initial data to load into the dialog.
+   */
+  function onRequestInitialData() {
+    media_router.browserApi.requestInitialData();
+  }
+
+  /**
    * Reports the initial state of the dialog after it is opened.
    * Called after initial data is populated.
    *
diff --git a/chrome/browser/resources/plugins.js b/chrome/browser/resources/plugins.js
index 3301f2f..19b21195 100644
--- a/chrome/browser/resources/plugins.js
+++ b/chrome/browser/resources/plugins.js
@@ -287,17 +287,16 @@
     var serviceProvider = modules[4];
 
     browserProxy = connection.bindHandleToProxy(
-        serviceProvider.connectToService(
-            pluginsMojom.PluginsHandlerMojo.name),
-        pluginsMojom.PluginsHandlerMojo);
+        serviceProvider.connectToService(pluginsMojom.PluginsPageHandler.name),
+        pluginsMojom.PluginsPageHandler);
 
     // Connect pipe handle to JS code.
     var pipe = core.createMessagePipe();
     pluginsPageStub = connection.bindHandleToStub(
-        pipe.handle0, pluginsMojom.PluginsPageMojo);
+        pipe.handle0, pluginsMojom.PluginsPage);
 
     pageProxy = {
-      __proto__: pluginsMojom.PluginsPageMojo.stubClass.prototype,
+      __proto__: pluginsMojom.PluginsPage.stubClass.prototype,
       onPluginsUpdated: function(plugins) {
         returnPluginsData({plugins: plugins});
       },
diff --git a/chrome/browser/resources/print_preview/data/destination_store.js b/chrome/browser/resources/print_preview/data/destination_store.js
index ef00b686..acbfae0 100644
--- a/chrome/browser/resources/print_preview/data/destination_store.js
+++ b/chrome/browser/resources/print_preview/data/destination_store.js
@@ -1249,6 +1249,8 @@
      */
     onLocalDestinationCapabilitiesSet_: function(event) {
       var destinationId = event.settingsInfo['printerId'];
+      var printerName = event.settingsInfo['printerName'];
+      var printerDescription = event.settingsInfo['printerDescription'];
       var key = this.getDestinationKey_(
           print_preview.Destination.Origin.LOCAL,
           destinationId,
@@ -1272,20 +1274,19 @@
           }
           destination.capabilities = capabilities;
         } else {
-          // TODO(rltoscano): This makes the assumption that the "deviceName" is
-          // the same as "printerName". We should include the "printerName" in
-          // the response. See http://crbug.com/132831.
           destination = print_preview.LocalDestinationParser.parse(
-              {deviceName: destinationId, printerName: destinationId});
+              {deviceName: destinationId,
+               printerName: printerName,
+               printerDescription: printerDescription});
           destination.capabilities = capabilities;
           this.insertDestination_(destination);
         }
       }
       if (this.selectedDestination_ &&
           this.selectedDestination_.id == destinationId) {
-        cr.dispatchSimpleEvent(this,
-                               DestinationStore.EventType.
-                                   SELECTED_DESTINATION_CAPABILITIES_READY);
+        cr.dispatchSimpleEvent(
+            this,
+            DestinationStore.EventType.SELECTED_DESTINATION_CAPABILITIES_READY);
       }
     },
 
diff --git a/chrome/browser/resources/settings/internet_page/internet_detail_page.css b/chrome/browser/resources/settings/internet_page/internet_detail_page.css
deleted file mode 100644
index f31caed..0000000
--- a/chrome/browser/resources/settings/internet_page/internet_detail_page.css
+++ /dev/null
@@ -1,53 +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. */
-
-.section {
-  margin-bottom: 5px;
-}
-
-iron-collapse {
-  margin: 10px;
-}
-
-cr-network-icon {
-  height: 32px;
-  width: 32px;
-}
-
-cr-policy-network-indicator {
-  -webkit-margin-start: 10px;
-}
-
-#networkName,
-#networkState {
-  -webkit-margin-start: 10px;
-  font-size: 20px;
-}
-
-#networkName {
-  font-weight: bold;
-}
-
-#networkState[connected] {
-  color: green;
-}
-
-#outerDiv {
-  margin: 10px 20px;
-}
-
-#ipAddressLabel {
-  -webkit-margin-end: 10px;
-  font-weight: bold;
-}
-
-#preferButton {
-  -webkit-margin-end: 8px;
-  -webkit-margin-start: -3px;
-  padding: 0
-}
-
-#proxyDiv {
-  max-width: 500px;
-}
diff --git a/chrome/browser/resources/settings/internet_page/internet_detail_page.html b/chrome/browser/resources/settings/internet_page/internet_detail_page.html
index 014a3e1..b50bca0 100644
--- a/chrome/browser/resources/settings/internet_page/internet_detail_page.html
+++ b/chrome/browser/resources/settings/internet_page/internet_detail_page.html
@@ -19,9 +19,58 @@
 <link rel="import" href="network_siminfo.html">
 
 <dom-module id="settings-internet-detail-page">
-  <link rel="import" type="css" href="internet_detail_page.css">
   <template>
-    <style include="settings-shared"></style>
+    <style include="settings-shared">
+      .section {
+        margin-bottom: 5px;
+      }
+
+      iron-collapse {
+        margin: 10px;
+      }
+
+      cr-network-icon {
+        height: 32px;
+        width: 32px;
+      }
+
+      cr-policy-network-indicator {
+        -webkit-margin-start: 10px;
+      }
+
+      #networkName,
+      #networkState {
+        -webkit-margin-start: 10px;
+        font-size: 20px;
+      }
+
+      #networkName {
+        font-weight: bold;
+      }
+
+      #networkState[connected] {
+        color: green;
+      }
+
+      #outerDiv {
+        margin: 10px 20px;
+      }
+
+      #ipAddressLabel {
+        -webkit-margin-end: 10px;
+        font-weight: bold;
+      }
+
+      #preferButton {
+        -webkit-margin-end: 8px;
+        -webkit-margin-start: -3px;
+        padding: 0
+      }
+
+      #proxyDiv {
+        max-width: 500px;
+      }
+    </style>
     <div class="layout vertical">
       <!-- Title section: Icon + name + connection state. -->
       <div id="titleDiv" class="layout horizontal center">
diff --git a/chrome/browser/resources/settings/internet_page/internet_known_networks_page.css b/chrome/browser/resources/settings/internet_page/internet_known_networks_page.css
deleted file mode 100644
index fa7b85d9..0000000
--- a/chrome/browser/resources/settings/internet_page/internet_known_networks_page.css
+++ /dev/null
@@ -1,22 +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. */
-
-#outerDiv {
-  margin: 0 40px;
-}
-
-#headerDiv {
-  background-color: grey;
-  padding: 4px;
-}
-
-#headerDiv span {
-  color: white;
-  padding: 0 8px;
-}
-
-#headerDiv span.button {
-  text-align: center;
-  width: 60px;
-}
diff --git a/chrome/browser/resources/settings/internet_page/internet_known_networks_page.html b/chrome/browser/resources/settings/internet_page/internet_known_networks_page.html
index bed2db5..90426da 100644
--- a/chrome/browser/resources/settings/internet_page/internet_known_networks_page.html
+++ b/chrome/browser/resources/settings/internet_page/internet_known_networks_page.html
@@ -4,9 +4,27 @@
 <link rel="import" href="chrome://md-settings/settings_shared_css.html">
 
 <dom-module id="settings-internet-known-networks-page">
-  <link rel="import" type="css" href="internet_known_networks_page.css">
   <template>
-    <style include="settings-shared"></style>
+    <style include="settings-shared">
+      #outerDiv {
+        margin: 0 40px;
+      }
+
+      #headerDiv {
+        background-color: grey;
+        padding: 4px;
+      }
+
+      #headerDiv span {
+        color: white;
+        padding: 0 8px;
+      }
+
+      #headerDiv span.button {
+        text-align: center;
+        width: 60px;
+      }
+    </style>
     <div class="layout vertical">
       <div id="outerDiv" class="layout vertical">
         <div id="headerDiv" class="layout horizontal">
diff --git a/chrome/browser/resources/settings/internet_page/network_apnlist.css b/chrome/browser/resources/settings/internet_page/network_apnlist.css
deleted file mode 100644
index 19a5acf..0000000
--- a/chrome/browser/resources/settings/internet_page/network_apnlist.css
+++ /dev/null
@@ -1,20 +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. */
-
-#outerDiv {
-  margin-bottom: 10px;
-}
-
-#selectDiv {
-  margin-bottom: 10px;
-}
-
-#selectDiv select {
-  -webkit-margin-start: 10px;
-  padding: 5px;
-}
-
-#otherDiv network-property-list {
-  -webkit-margin-start: 15px;
-}
diff --git a/chrome/browser/resources/settings/internet_page/network_apnlist.html b/chrome/browser/resources/settings/internet_page/network_apnlist.html
index a8b338e..5bdbbbe 100644
--- a/chrome/browser/resources/settings/internet_page/network_apnlist.html
+++ b/chrome/browser/resources/settings/internet_page/network_apnlist.html
@@ -4,8 +4,25 @@
 <link rel="import" href="network_property_list.html">
 
 <dom-module id="network-apnlist">
-  <link rel="import" type="css" href="network_apnlist.css">
   <template>
+    <style>
+      #outerDiv {
+        margin-bottom: 10px;
+      }
+
+      #selectDiv {
+        margin-bottom: 10px;
+      }
+
+      #selectDiv select {
+        -webkit-margin-start: 10px;
+        padding: 5px;
+      }
+
+      #otherDiv network-property-list {
+        -webkit-margin-start: 15px;
+      }
+    </style>
     <div id="outerDiv" class="layout vertical">
       <div id="selectDiv" class="layout horizontal center">
         <span>Access Point:</span>
diff --git a/chrome/browser/resources/settings/internet_page/network_ip_config.css b/chrome/browser/resources/settings/internet_page/network_ip_config.css
deleted file mode 100644
index 13e9069..0000000
--- a/chrome/browser/resources/settings/internet_page/network_ip_config.css
+++ /dev/null
@@ -1,11 +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. */
-
-paper-checkbox {
-  margin-bottom: 10px;
-}
-
-network-property-list {
-  -webkit-margin-start: 28px;
-}
diff --git a/chrome/browser/resources/settings/internet_page/network_ip_config.html b/chrome/browser/resources/settings/internet_page/network_ip_config.html
index f84807a..64602835 100644
--- a/chrome/browser/resources/settings/internet_page/network_ip_config.html
+++ b/chrome/browser/resources/settings/internet_page/network_ip_config.html
@@ -4,8 +4,16 @@
 <link rel="import" href="network_property_list.html">
 
 <dom-module id="network-ip-config">
-  <link rel="import" type="css" href="network_ip_config.css">
   <template>
+    <style>
+      paper-checkbox {
+        margin-bottom: 10px;
+      }
+
+      network-property-list {
+        -webkit-margin-start: 28px;
+      }
+    </style>
     <div id="outer" class="layout vertical">
       <paper-checkbox checked="{{automatic}}" disabled="[[!editable]]">
           Configure IP Address Automatically
diff --git a/chrome/browser/resources/settings/internet_page/network_nameservers.css b/chrome/browser/resources/settings/internet_page/network_nameservers.css
deleted file mode 100644
index 384697d..0000000
--- a/chrome/browser/resources/settings/internet_page/network_nameservers.css
+++ /dev/null
@@ -1,15 +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. */
-
-#selectTypeDiv {
-  margin: 10px 0;
-}
-
-select {
-  padding: 5px;
-}
-
-paper-input-container {
-  margin: -9px 5px 0;
-}
diff --git a/chrome/browser/resources/settings/internet_page/network_nameservers.html b/chrome/browser/resources/settings/internet_page/network_nameservers.html
index 2b4bbe2..7621c98 100644
--- a/chrome/browser/resources/settings/internet_page/network_nameservers.html
+++ b/chrome/browser/resources/settings/internet_page/network_nameservers.html
@@ -3,8 +3,20 @@
 <link rel="import" href="chrome://resources/cr_elements/network/cr_onc_types.html">
 
 <dom-module id="network-nameservers">
-  <link rel="import" type="css" href="network_nameservers.css">
   <template>
+    <style>
+      #selectTypeDiv {
+        margin: 10px 0;
+      }
+
+      select {
+        padding: 5px;
+      }
+
+      paper-input-container {
+        margin: -9px 5px 0;
+      }
+    </style>
     <div id="outer" class="layout vertical">
       <div id="selectTypeDiv">
         <!-- TODO(stevenjb): Use cr-dropdown-menu once available. -->
diff --git a/chrome/browser/resources/settings/internet_page/network_property_list.css b/chrome/browser/resources/settings/internet_page/network_property_list.css
deleted file mode 100644
index bdb1712..0000000
--- a/chrome/browser/resources/settings/internet_page/network_property_list.css
+++ /dev/null
@@ -1,29 +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. */
-
-span {
-  -webkit-margin-end: 5px;
-  margin-bottom: 5px;
-}
-
-cr-policy-network-indicator {
-  margin-bottom: 5px;
-}
-
-span.fill {
-  border-bottom-color: grey;
-  border-bottom-style: dotted;
-  border-width: thin;
-  min-width: 20px;
-}
-
-paper-input-container {
-  -webkit-margin-start: 5px;
-  margin-bottom: -3px;
-  margin-top: -12px;
-}
-
-#outerDiv {
-  padding: 5px 0;
-}
diff --git a/chrome/browser/resources/settings/internet_page/network_property_list.html b/chrome/browser/resources/settings/internet_page/network_property_list.html
index 17364175..1a8ba70 100644
--- a/chrome/browser/resources/settings/internet_page/network_property_list.html
+++ b/chrome/browser/resources/settings/internet_page/network_property_list.html
@@ -5,8 +5,34 @@
 <link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_network_indicator.html">
 
 <dom-module name="network-property-list">
-  <link rel="import" type="css" href="network_property_list.css">
   <template>
+    <style>
+      span {
+        -webkit-margin-end: 5px;
+        margin-bottom: 5px;
+      }
+
+      cr-policy-network-indicator {
+        margin-bottom: 5px;
+      }
+
+      span.fill {
+        border-bottom-color: grey;
+        border-bottom-style: dotted;
+        border-width: thin;
+        min-width: 20px;
+      }
+
+      paper-input-container {
+        -webkit-margin-start: 5px;
+        margin-bottom: -3px;
+        margin-top: -12px;
+      }
+
+      #outerDiv {
+        padding: 5px 0;
+      }
+    </style>
     <div id="outerDiv" class="layout horizontal">
       <div class="layout vertical">
         <template is="dom-repeat" items="[[fields]]">
diff --git a/chrome/browser/resources/settings/internet_page/network_proxy.css b/chrome/browser/resources/settings/internet_page/network_proxy.css
deleted file mode 100644
index 82bf909..0000000
--- a/chrome/browser/resources/settings/internet_page/network_proxy.css
+++ /dev/null
@@ -1,32 +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. */
-
-:host {
-  display: inline-block;
-}
-
-#selectTypeDiv {
-  margin: 10px 0;
-}
-
-select {
-  padding: 5px;
-}
-
-span {
-  margin: 5px;
-}
-
-cr-policy-network-indicator {
-  -webkit-margin-end: 10px;
-  mwrgin-bottom: 5px;
-}
-
-paper-checkbox {
-  margin-bottom: 10px;
-}
-
-paper-input {
-  margin: -9px 5px 0;
-}
diff --git a/chrome/browser/resources/settings/internet_page/network_proxy.html b/chrome/browser/resources/settings/internet_page/network_proxy.html
index b6c6501..f42a59f 100644
--- a/chrome/browser/resources/settings/internet_page/network_proxy.html
+++ b/chrome/browser/resources/settings/internet_page/network_proxy.html
@@ -10,8 +10,37 @@
 <link rel="import" href="network_proxy_exclusions.html">
 
 <dom-module id="network-proxy">
-  <link rel="import" type="css" href="network_proxy.css">
   <template>
+    <style>
+      :host {
+        display: inline-block;
+      }
+
+      #selectTypeDiv {
+        margin: 10px 0;
+      }
+
+      select {
+        padding: 5px;
+      }
+
+      span {
+        margin: 5px;
+      }
+
+      cr-policy-network-indicator {
+        -webkit-margin-end: 10px;
+        mwrgin-bottom: 5px;
+      }
+
+      paper-checkbox {
+        margin-bottom: 10px;
+      }
+
+      paper-input {
+        margin: -9px 5px 0;
+      }
+    </style>
     <div id="outer" class="layout vertical flex">
       <!-- TODO(stevenjb): Use cr-dropdown-menu once available. -->
       <div class="layout horizontal center" hidden$=
diff --git a/chrome/browser/resources/settings/internet_page/network_proxy_exclusions.css b/chrome/browser/resources/settings/internet_page/network_proxy_exclusions.css
deleted file mode 100644
index ad9a239..0000000
--- a/chrome/browser/resources/settings/internet_page/network_proxy_exclusions.css
+++ /dev/null
@@ -1,18 +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. */
-
-span {
-  margin: 5px;
-}
-
-iron-icon {
-  margin: 5px;
-}
-
-div#container {
-  border: 1px solid lightgrey;
-  height: 100px;
-  margin: 5px;
-  overflow-y: auto;
-}
diff --git a/chrome/browser/resources/settings/internet_page/network_proxy_exclusions.html b/chrome/browser/resources/settings/internet_page/network_proxy_exclusions.html
index da9d66a..31e2d56 100644
--- a/chrome/browser/resources/settings/internet_page/network_proxy_exclusions.html
+++ b/chrome/browser/resources/settings/internet_page/network_proxy_exclusions.html
@@ -2,8 +2,23 @@
 <link rel="import" href="chrome://resources/html/polymer.html">
 
 <dom-module id="network-proxy-exclusions">
-  <link rel="import" type="css" href="network_proxy_exclusions.css">
   <template>
+    <style>
+      span {
+        margin: 5px;
+      }
+
+      iron-icon {
+        margin: 5px;
+      }
+
+      div#container {
+        border: 1px solid lightgrey;
+        height: 100px;
+        margin: 5px;
+        overflow-y: auto;
+      }
+    </style>
     <div id="container" class="layout vertical">
       <template is="dom-repeat" items="[[exclusions]]">
         <div class="layout horizontal">
diff --git a/chrome/browser/resources/settings/internet_page/network_proxy_input.css b/chrome/browser/resources/settings/internet_page/network_proxy_input.css
deleted file mode 100644
index 514c7af..0000000
--- a/chrome/browser/resources/settings/internet_page/network_proxy_input.css
+++ /dev/null
@@ -1,15 +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. */
-
-#port {
-  width: 50px;
-}
-
-span {
-  -webkit-margin-end: 5px;
-}
-
-paper-input {
-  margin: -9px 5px 0;
-}
diff --git a/chrome/browser/resources/settings/internet_page/network_proxy_input.html b/chrome/browser/resources/settings/internet_page/network_proxy_input.html
index 42c3852..f2688a0 100644
--- a/chrome/browser/resources/settings/internet_page/network_proxy_input.html
+++ b/chrome/browser/resources/settings/internet_page/network_proxy_input.html
@@ -2,8 +2,20 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-input/paper-input.html">
 
 <dom-module id="network-proxy-input">
-  <link rel="import" type="css" href="network_proxy_input.css">
   <template>
+    <style>
+      #port {
+        width: 50px;
+      }
+
+      span {
+        -webkit-margin-end: 5px;
+      }
+
+      paper-input {
+        margin: -9px 5px 0;
+      }
+    </style>
     <div id="outer" class="layout horizontal">
       <span class="flex">[[label]]</span>
       <paper-input no-label-float id="url" disabled="[[!editable]]"
diff --git a/chrome/browser/resources/settings/internet_page/network_siminfo.css b/chrome/browser/resources/settings/internet_page/network_siminfo.css
deleted file mode 100644
index df0d574..0000000
--- a/chrome/browser/resources/settings/internet_page/network_siminfo.css
+++ /dev/null
@@ -1,47 +0,0 @@
-/* Copyright 2015 The Chromium Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file. */
-
-iron-icon {
- -webkit-margin-end: 5px;
- -webkit-margin-start: -3px;
-}
-
-paper-button {
-  margin: 0;
-}
-
-span {
-  -webkit-margin-end: 10px;
-}
-
-#lockedDiv span {
-  color: red;
-  font-weight: 500;
-}
-
-#lockedDiv paper-input {
-  -webkit-margin-start: 10px;
-  width: 80px;
-}
-
-#unlockSimDialog paper-input {
-  -webkit-margin-start: 5px;
-}
-
-#unlockSimDialog span {
-  -webkit-margin-start: 5px;
-}
-
-.pin {
-  min-width: 100px;
-}
-
-.puk {
-  min-width: 200px;
-}
-
-.error {
-  color: red;
-  max-width: 400px;
-}
diff --git a/chrome/browser/resources/settings/internet_page/network_siminfo.html b/chrome/browser/resources/settings/internet_page/network_siminfo.html
index 6d7d3c9..7cf0c3f 100644
--- a/chrome/browser/resources/settings/internet_page/network_siminfo.html
+++ b/chrome/browser/resources/settings/internet_page/network_siminfo.html
@@ -9,8 +9,52 @@
 <link rel="import" href="network_property_list.html">
 
 <dom-module id="network-siminfo">
-  <link rel="import" type="css" href="network_siminfo.css">
   <template>
+    <style>
+      iron-icon {
+       -webkit-margin-end: 5px;
+       -webkit-margin-start: -3px;
+      }
+
+      paper-button {
+        margin: 0;
+      }
+
+      span {
+        -webkit-margin-end: 10px;
+      }
+
+      #lockedDiv span {
+        color: red;
+        font-weight: 500;
+      }
+
+      #lockedDiv paper-input {
+        -webkit-margin-start: 10px;
+        width: 80px;
+      }
+
+      #unlockSimDialog paper-input {
+        -webkit-margin-start: 5px;
+      }
+
+      #unlockSimDialog span {
+        -webkit-margin-start: 5px;
+      }
+
+      .pin {
+        min-width: 100px;
+      }
+
+      .puk {
+        min-width: 200px;
+      }
+
+      .error {
+        color: red;
+        max-width: 400px;
+      }
+    </style>
     <div id="outerDiv" class="layout vertical">
       <div class="layout horizontal center"
           hidden$="[[networkProperties.Cellular.SIMPresent]]">
diff --git a/chrome/browser/resources/settings/internet_page/network_summary_item.css b/chrome/browser/resources/settings/internet_page/network_summary_item.css
deleted file mode 100644
index 678b3d84..0000000
--- a/chrome/browser/resources/settings/internet_page/network_summary_item.css
+++ /dev/null
@@ -1,33 +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. */
-
-#details.selectable:hover {
-  background-color: lightgrey;
-}
-
-#buttons {
-  align-items: center;
-}
-
-.invisible {
-  visibility: hidden;
-}
-
-paper-spinner {
-  -webkit-margin-start: 20px;
-}
-
-#deviceEnabledButton {
-  -webkit-margin-start: 10px;
-}
-
-#listDiv {
-  -webkit-margin-end: 10px;
-  -webkit-margin-start: 40px;
-}
-
-#networkList {
-  margin: 5px 0 10px;
-  max-height: 400px;
-}
diff --git a/chrome/browser/resources/settings/internet_page/network_summary_item.html b/chrome/browser/resources/settings/internet_page/network_summary_item.html
index 73e3c866..5b18cdd 100644
--- a/chrome/browser/resources/settings/internet_page/network_summary_item.html
+++ b/chrome/browser/resources/settings/internet_page/network_summary_item.html
@@ -5,19 +5,55 @@
 <link rel="import" href="chrome://resources/cr_elements/cr_expand_button/cr_expand_button.html">
 <link rel="import" href="chrome://resources/cr_elements/network/cr_network_list.html">
 <link rel="import" href="chrome://resources/cr_elements/network/cr_network_list_item.html">
+<link rel="import" href="chrome://md-settings/settings_shared_css.html">
 
 <dom-module name="network-summary-item">
-  <link rel="import" type="css" href="network_summary_item.css">
   <template>
-    <div class="layout vertical" hidden$="[[isHidden]]">
-      <div id="details" class="layout horizontal center"
-          on-tap="onDetailsTap_">
-        <cr-network-list-item id="detailsItem"
-            network-state="[[networkState]]">
+    <style include="settings-shared">
+      :host {
+        --cr-network-icon-mixin: {
+          height: 24px;
+          left: -4px;
+          width: 24px;
+        }
+        --cr-network-name-mixin: {
+          font-size: inherit;
+        };
+        --cr-network-state-mixin: {
+          @apply(--settings-secondary);
+          font-size: inherit;
+        };
+      }
+
+      #buttons {
+        align-items: center;
+      }
+
+      .invisible {
+        visibility: hidden;
+      }
+
+      paper-spinner {
+        -webkit-margin-start: 20px;
+      }
+
+      #deviceEnabledButton {
+        -webkit-margin-start: 10px;
+      }
+
+      #networkList {
+        margin: 5px 0 10px;
+        max-height: 400px;
+      }
+    </style>
+    <div class="settings-box two-line" hidden$="[[isHidden]]">
+      <div id="details" class="start" on-tap="onDetailsTap_">
+        <cr-network-list-item id="detailsItem" network-state="[[networkState]]">
         </cr-network-list-item>
         <paper-spinner active="[[showScanning_(deviceState, expanded)]]">
         </paper-spinner>
-        <span class="flex"></span>
+      </div>
+      <div>
         <div id="buttons" class="layout horizontal">
           <cr-expand-button id="expandListButton"
               class$="[[getExpandButtonClass_(deviceState, networkStateList)]]"
@@ -30,7 +66,9 @@
           </paper-toggle-button>
         </div>
       </div>
-      <div id="listDiv" class="layout vertical">
+    </div>
+    <template is="dom-if" if="[[expanded]]">
+      <div class="list-frame">
         <cr-network-list id="networkList"
             max-height="[[maxHeight]]"
             networks="[[networkStateList]]"
@@ -44,7 +82,7 @@
           </paper-button>
         </div>
       </div>
-    </div>
+    </template>
   </template>
   <script src="network_summary_item.js"></script>
 </dom-module>
diff --git a/chrome/browser/resources/settings/people_page/people_page.html b/chrome/browser/resources/settings/people_page/people_page.html
index afe2ccb9..01421172 100644
--- a/chrome/browser/resources/settings/people_page/people_page.html
+++ b/chrome/browser/resources/settings/people_page/people_page.html
@@ -100,7 +100,7 @@
 
         <div class="settings-box" hidden="[[!isStatusTextSet_(syncStatus)]]">
           <span id="syncStatusText"></span>
-          <paper-button on-tap="onActionLinkTap_">
+          <paper-button on-tap="onSyncTap_">
             [[syncStatus.actionLinkText]]
           </paper-button>
         </div>
diff --git a/chrome/browser/resources/settings/people_page/people_page.js b/chrome/browser/resources/settings/people_page/people_page.js
index 63e1e80..ef135b7 100644
--- a/chrome/browser/resources/settings/people_page/people_page.js
+++ b/chrome/browser/resources/settings/people_page/people_page.js
@@ -166,11 +166,6 @@
 </if>
 
   /** @private */
-  onActionLinkTap_: function() {
-    this.syncBrowserProxy_.showSetupUI();
-  },
-
-  /** @private */
   onPictureTap_: function() {
 <if expr="chromeos">
     this.$.pages.setSubpageChain(['changePicture']);
diff --git a/chrome/browser/resources/settings/people_page/sync_browser_proxy.js b/chrome/browser/resources/settings/people_page/sync_browser_proxy.js
index bdc1c4f..7be36fa 100644
--- a/chrome/browser/resources/settings/people_page/sync_browser_proxy.js
+++ b/chrome/browser/resources/settings/people_page/sync_browser_proxy.js
@@ -115,12 +115,6 @@
     getSyncStatus: function() {},
 
     /**
-     * Determines the appropriate page to show in the Sync Setup UI based on
-     * the state of the Sync backend. Does nothing if the user is not signed in.
-     */
-    showSetupUI: function() {},
-
-    /**
      * Function to invoke when the sync page has been navigated to. This
      * registers the UI as the "active" sync UI so that if the user tries to
      * open another sync UI, this one will be shown instead.
@@ -187,11 +181,6 @@
     },
 
     /** @override */
-    showSetupUI: function() {
-      chrome.send('SyncSetupShowSetupUI');
-    },
-
-    /** @override */
     didNavigateToSyncPage: function() {
       chrome.send('SyncSetupShowSetupUI');
     },
diff --git a/chrome/browser/resources/settings/people_page/sync_page.html b/chrome/browser/resources/settings/people_page/sync_page.html
index a4c8fc69..cdf2e67 100644
--- a/chrome/browser/resources/settings/people_page/sync_page.html
+++ b/chrome/browser/resources/settings/people_page/sync_page.html
@@ -25,8 +25,12 @@
       }
     </style>
     <iron-pages id="pages" selected="[[selectedPage_]]" attr-for-selected="id">
-      <div id="[[pages.SPINNER]]">$i18n{syncLoading}</div>
-      <div id="[[pages.TIMEOUT]]">$i18n{syncTimeout}</div>
+      <div id="[[pages.SPINNER]]" class="settings-box first">
+        $i18n{syncLoading}
+      </div>
+      <div id="[[pages.TIMEOUT]]" class="settings-box first">
+        $i18n{syncTimeout}
+      </div>
       <div id="[[pages.CONFIGURE]]">
         <div class="settings-box first">
           <paper-checkbox id="syncAllDataTypesCheckbox"
diff --git a/chrome/browser/resources/settings/settings_menu/settings_menu.html b/chrome/browser/resources/settings/settings_menu/settings_menu.html
index a6b79e2..c8495612 100644
--- a/chrome/browser/resources/settings/settings_menu/settings_menu.html
+++ b/chrome/browser/resources/settings/settings_menu/settings_menu.html
@@ -145,7 +145,7 @@
             $i18n{languagesPageTitle}
           </div>
           <div data-section="downloads" on-tap="openPage_">
-            <iron-icon icon="settings:file-download">
+            <iron-icon icon="cr:file-download">
             </iron-icon>
             $i18n{downloadsPageTitle}
           </div>
diff --git a/chrome/browser/resources/settings/settings_menu/settings_menu.js b/chrome/browser/resources/settings/settings_menu/settings_menu.js
index bfe057a..7ea80a6 100644
--- a/chrome/browser/resources/settings/settings_menu/settings_menu.js
+++ b/chrome/browser/resources/settings/settings_menu/settings_menu.js
@@ -57,6 +57,6 @@
    * @private
    * */
   arrowState_: function(opened) {
-    return opened ? 'settings:arrow-drop-up' : 'settings:arrow-drop-down';
+    return opened ? 'settings:arrow-drop-up' : 'cr:arrow-drop-down';
   },
 });
diff --git a/chrome/browser/resources/settings/settings_resources.grd b/chrome/browser/resources/settings/settings_resources.grd
index 47d0a74..fedd488 100644
--- a/chrome/browser/resources/settings/settings_resources.grd
+++ b/chrome/browser/resources/settings/settings_resources.grd
@@ -772,18 +772,12 @@
         <structure name="IDR_SETTINGS_DATE_TIME_PAGE_JS"
                    file="date_time_page/date_time_page.js"
                    type="chrome_html" />
-        <structure name="IDR_SETTINGS_INTERNET_DETAIL_PAGE_CSS"
-                   file="internet_page/internet_detail_page.css"
-                   type="chrome_html" />
         <structure name="IDR_SETTINGS_INTERNET_DETAIL_PAGE_HTML"
                    file="internet_page/internet_detail_page.html"
                    type="chrome_html" />
         <structure name="IDR_SETTINGS_INTERNET_DETAIL_PAGE_JS"
                    file="internet_page/internet_detail_page.js"
                    type="chrome_html" />
-        <structure name="IDR_SETTINGS_INTERNET_KNOWN_NETWORKS_PAGE_CSS"
-                   file="internet_page/internet_known_networks_page.css"
-                   type="chrome_html" />
         <structure name="IDR_SETTINGS_INTERNET_KNOWN_NETWORKS_PAGE_HTML"
                    file="internet_page/internet_known_networks_page.html"
                    type="chrome_html" />
@@ -796,72 +790,48 @@
         <structure name="IDR_SETTINGS_INTERNET_PAGE_JS"
                    file="internet_page/internet_page.js"
                    type="chrome_html" />
-        <structure name="IDR_SETTINGS_NETWORK_APNLIST_CSS"
-                   file="internet_page/network_apnlist.css"
-                   type="chrome_html" />
         <structure name="IDR_SETTINGS_NETWORK_APNLIST_HTML"
                    file="internet_page/network_apnlist.html"
                    type="chrome_html" />
         <structure name="IDR_SETTINGS_NETWORK_APNLIST_JS"
                    file="internet_page/network_apnlist.js"
                    type="chrome_html" />
-        <structure name="IDR_SETTINGS_NETWORK_IP_CONFIG_CSS"
-                   file="internet_page/network_ip_config.css"
-                   type="chrome_html" />
         <structure name="IDR_SETTINGS_NETWORK_IP_CONFIG_HTML"
                    file="internet_page/network_ip_config.html"
                    type="chrome_html" />
         <structure name="IDR_SETTINGS_NETWORK_IP_CONFIG_JS"
                    file="internet_page/network_ip_config.js"
                    type="chrome_html" />
-        <structure name="IDR_SETTINGS_NETWORK_NAMESERVERS_CSS"
-                   file="internet_page/network_nameservers.css"
-                   type="chrome_html" />
         <structure name="IDR_SETTINGS_NETWORK_NAMESERVERS_HTML"
                    file="internet_page/network_nameservers.html"
                    type="chrome_html" />
         <structure name="IDR_SETTINGS_NETWORK_NAMESERVERS_JS"
                    file="internet_page/network_nameservers.js"
                    type="chrome_html" />
-        <structure name="IDR_SETTINGS_NETWORK_PROPERTY_LIST_CSS"
-                   file="internet_page/network_property_list.css"
-                   type="chrome_html" />
         <structure name="IDR_SETTINGS_NETWORK_PROPERTY_LIST_HTML"
                    file="internet_page/network_property_list.html"
                    type="chrome_html" />
         <structure name="IDR_SETTINGS_NETWORK_PROPERTY_LIST_JS"
                    file="internet_page/network_property_list.js"
                    type="chrome_html" />
-        <structure name="IDR_SETTINGS_NETWORK_PROXY_CSS"
-                   file="internet_page/network_proxy.css"
-                   type="chrome_html" />
         <structure name="IDR_SETTINGS_NETWORK_PROXY_HTML"
                    file="internet_page/network_proxy.html"
                    type="chrome_html" />
         <structure name="IDR_SETTINGS_NETWORK_PROXY_JS"
                    file="internet_page/network_proxy.js"
                    type="chrome_html" />
-        <structure name="IDR_SETTINGS_NETWORK_PROXY_EXCLUSIONS_CSS"
-                   file="internet_page/network_proxy_exclusions.css"
-                   type="chrome_html" />
         <structure name="IDR_SETTINGS_NETWORK_PROXY_EXCLUSIONS_HTML"
                    file="internet_page/network_proxy_exclusions.html"
                    type="chrome_html" />
         <structure name="IDR_SETTINGS_NETWORK_PROXY_EXCLUSIONS_JS"
                    file="internet_page/network_proxy_exclusions.js"
                    type="chrome_html" />
-        <structure name="IDR_SETTINGS_NETWORK_PROXY_INPUT_CSS"
-                   file="internet_page/network_proxy_input.css"
-                   type="chrome_html" />
         <structure name="IDR_SETTINGS_NETWORK_PROXY_INPUT_HTML"
                    file="internet_page/network_proxy_input.html"
                    type="chrome_html" />
         <structure name="IDR_SETTINGS_NETWORK_PROXY_INPUT_JS"
                    file="internet_page/network_proxy_input.js"
                    type="chrome_html" />
-        <structure name="IDR_SETTINGS_NETWORK_SIMINFO_CSS"
-                   file="internet_page/network_siminfo.css"
-                   type="chrome_html" />
         <structure name="IDR_SETTINGS_NETWORK_SIMINFO_HTML"
                    file="internet_page/network_siminfo.html"
                    type="chrome_html" />
@@ -874,9 +844,6 @@
         <structure name="IDR_SETTINGS_NETWORK_SUMMARY_JS"
                    file="internet_page/network_summary.js"
                    type="chrome_html" />
-        <structure name="IDR_SETTINGS_NETWORK_SUMMARY_ITEM_CSS"
-                   file="internet_page/network_summary_item.css"
-                   type="chrome_html" />
         <structure name="IDR_SETTINGS_NETWORK_SUMMARY_ITEM_HTML"
                    file="internet_page/network_summary_item.html"
                    type="chrome_html" />
diff --git a/chrome/browser/resources/settings/site_settings/site_settings_behavior.html b/chrome/browser/resources/settings/site_settings/site_settings_behavior.html
index 8888307c..045a673 100644
--- a/chrome/browser/resources/settings/site_settings/site_settings_behavior.html
+++ b/chrome/browser/resources/settings/site_settings/site_settings_behavior.html
@@ -1,6 +1,7 @@
 <link rel="import" href="chrome://md-settings/icons.html">
 <link rel="import" href="chrome://md-settings/site_settings/constants.html">
 <link rel="import" href="chrome://md-settings/site_settings/site_settings_prefs_browser_proxy.html">
+<link rel="import" href="chrome://resources/cr_elements/icons.html">
 <link rel="import" href="chrome://resources/html/assert.html">
 <link rel="import" href="chrome://resources/html/icon.html">
 <script src="site_settings_behavior.js"></script>
diff --git a/chrome/browser/resources/settings/site_settings/site_settings_behavior.js b/chrome/browser/resources/settings/site_settings/site_settings_behavior.js
index 8b7d445..c541b8d 100644
--- a/chrome/browser/resources/settings/site_settings/site_settings_behavior.js
+++ b/chrome/browser/resources/settings/site_settings/site_settings_behavior.js
@@ -103,7 +103,7 @@
       case settings.ContentSettingsTypes.COOKIES:
         return 'settings:cookie';
       case settings.ContentSettingsTypes.FULLSCREEN:
-        return 'settings:fullscreen';
+        return 'cr:fullscreen';
       case settings.ContentSettingsTypes.GEOLOCATION:
         return 'settings:location-on';
       case settings.ContentSettingsTypes.IMAGES:
diff --git a/chrome/browser/safe_browsing/incident_reporting/off_domain_inclusion_detector.cc b/chrome/browser/safe_browsing/incident_reporting/off_domain_inclusion_detector.cc
deleted file mode 100644
index 5c256b2d..0000000
--- a/chrome/browser/safe_browsing/incident_reporting/off_domain_inclusion_detector.cc
+++ /dev/null
@@ -1,320 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/safe_browsing/incident_reporting/off_domain_inclusion_detector.h"
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/metrics/histogram.h"
-#include "base/single_thread_task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "chrome/browser/history/history_service_factory.h"
-#include "chrome/browser/profiles/profile.h"
-#include "components/history/core/browser/history_service.h"
-#include "components/safe_browsing_db/database_manager.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/render_process_host.h"
-#include "content/public/browser/resource_request_info.h"
-#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
-#include "net/url_request/url_request.h"
-#include "url/gurl.h"
-
-using content::BrowserThread;
-
-namespace safe_browsing {
-
-OffDomainInclusionDetector::OffDomainInclusionDetector(
-    const scoped_refptr<SafeBrowsingDatabaseManager>& database_manager)
-    : OffDomainInclusionDetector(database_manager,
-                                 ReportAnalysisEventCallback()) {}
-
-OffDomainInclusionDetector::OffDomainInclusionDetector(
-    const scoped_refptr<SafeBrowsingDatabaseManager>& database_manager,
-    const ReportAnalysisEventCallback& report_analysis_event_callback)
-    : database_manager_(database_manager),
-      report_analysis_event_callback_(report_analysis_event_callback),
-      main_thread_task_runner_(base::ThreadTaskRunnerHandle::Get()),
-      weak_ptr_factory_(this) {
-  DCHECK(database_manager);
-}
-
-OffDomainInclusionDetector::~OffDomainInclusionDetector() {
-  DCHECK(main_thread_task_runner_->BelongsToCurrentThread());
-}
-
-void OffDomainInclusionDetector::OnResourceRequest(
-    const net::URLRequest* request) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  if (!ShouldAnalyzeRequest(request))
-    return;
-
-  const content::ResourceRequestInfo* resource_request_info =
-      content::ResourceRequestInfo::ForRequest(request);
-
-  const content::ResourceType resource_type =
-      resource_request_info->GetResourceType();
-
-  const GURL request_url = request->url();
-
-  // Only requests for subresources of the main frame are analyzed and the
-  // referrer URL is always the URL of the main frame itself in such requests.
-  const GURL main_frame_url(request->referrer());
-
-  if (!main_frame_url.is_valid()) {
-    // A live experiment confirmed that the only reason the |main_frame_url|
-    // would be invalid is if it's empty. The |main_frame_url| can be empty in
-    // a few scenarios where the referrer is dropped (e.g., HTTPS => HTTP
-    // requests). Consider adding the original referrer to ResourceRequestInfo
-    // if that's an issue.
-    DCHECK(main_frame_url.is_empty());
-    ReportAnalysisResult(resource_type,
-                         AnalysisEvent::ABORT_EMPTY_MAIN_FRAME_URL);
-    return;
-  }
-
-  // Cache of the top-level domain contained in |main_frame_url|.  This could
-  // be an IP address.
-  std::string main_frame_domain;
-
-  const bool main_frame_is_ip = main_frame_url.HostIsIPAddress();
-  if (main_frame_is_ip) {
-    main_frame_domain = main_frame_url.host();
-  } else {
-    main_frame_domain = net::registry_controlled_domains::GetDomainAndRegistry(
-        main_frame_url,
-        net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES);
-  }
-  const bool request_is_ip = request_url.HostIsIPAddress();
-
-  // Check if this is indeed an off-domain inclusion.
-  bool is_off_domain = false;
-  if (main_frame_is_ip && request_is_ip) {
-    // Both are IP addresses: compare them as strings
-    is_off_domain = main_frame_domain != request_url.host();
-  } else if (!main_frame_is_ip && !request_is_ip) {
-    // Neither are: compare as domains
-    is_off_domain = !request_url.DomainIs(main_frame_domain);
-  } else {
-    // Just one is an IP
-    is_off_domain = true;
-  }
-
-  if (!is_off_domain)
-    return;
-
-  // Upon detecting that |request_url| is an off-domain inclusion, compare it
-  // against the inclusion whitelist.
-  //
-  // This function must be called on the IO thread. The code above could be
-  // called from any thread, in theory.
-  if (database_manager_->MatchInclusionWhitelistUrl(request_url)) {
-    ReportAnalysisResult(resource_type,
-                         AnalysisEvent::OFF_DOMAIN_INCLUSION_WHITELISTED);
-    return;
-  }
-
-  // On a negative result from the whitelist, query the HistoryService to see
-  // if this url has been seen before.
-  BrowserThread::PostTask(
-      BrowserThread::UI,
-      FROM_HERE,
-      base::Bind(&OffDomainInclusionDetector::ContinueAnalysisWithHistoryCheck,
-                 weak_ptr_factory_.GetWeakPtr(),
-                 resource_type,
-                 request_url,
-                 resource_request_info->GetChildID()));
-}
-
-void OffDomainInclusionDetector::ContinueAnalysisWithHistoryCheck(
-    const content::ResourceType resource_type,
-    const GURL& request_url,
-    int render_process_id) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
-  Profile* profile =
-      ProfileFromRenderProcessId(render_process_id);
-  if (!profile) {
-    ReportAnalysisResult(resource_type,
-                         AnalysisEvent::ABORT_NO_PROFILE);
-    return;
-  }
-
-  if (profile->IsOffTheRecord()) {
-    ReportAnalysisResult(resource_type,
-                         AnalysisEvent::ABORT_INCOGNITO);
-    return;
-  }
-
-  history::HistoryService* history_service =
-      HistoryServiceFactory::GetForProfileWithoutCreating(profile);
-
-  if (!history_service) {
-    // Should only happen very early during startup, receiving many such reports
-    // relative to other report types would indicate that something is wrong.
-    ReportAnalysisResult(resource_type,
-                         AnalysisEvent::ABORT_NO_HISTORY_SERVICE);
-    return;
-  }
-
-  history_service->GetVisibleVisitCountToHost(
-      request_url,
-      base::Bind(&OffDomainInclusionDetector::ContinueAnalysisOnHistoryResult,
-                 weak_ptr_factory_.GetWeakPtr(),
-                 resource_type),
-      &history_task_tracker_);
-}
-
-void OffDomainInclusionDetector::ContinueAnalysisOnHistoryResult(
-    const content::ResourceType resource_type,
-    bool success,
-    int num_visits,
-    base::Time /* first_visit_time */) {
-  if (!success) {
-    ReportAnalysisResult(resource_type,
-                         AnalysisEvent::ABORT_HISTORY_LOOKUP_FAILED);
-    return;
-  }
-
-  if (num_visits > 0) {
-    ReportAnalysisResult(resource_type,
-                         AnalysisEvent::OFF_DOMAIN_INCLUSION_IN_HISTORY);
-  } else {
-    ReportAnalysisResult(resource_type,
-                         AnalysisEvent::OFF_DOMAIN_INCLUSION_SUSPICIOUS);
-  }
-}
-
-Profile* OffDomainInclusionDetector::ProfileFromRenderProcessId(
-    int render_process_id) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
-  content::RenderProcessHost* render_process_host =
-      content::RenderProcessHost::FromID(render_process_id);
-  if (!render_process_host)
-    return nullptr;
-
-  return Profile::FromBrowserContext(render_process_host->GetBrowserContext());
-}
-
-// static
-bool OffDomainInclusionDetector::ShouldAnalyzeRequest(
-    const net::URLRequest* request) {
-  // Only look at actual net requests (e.g., not chrome-extensions://id/foo.js).
-  if (!request->url().SchemeIsHTTPOrHTTPS())
-    return false;
-
-  const content::ResourceRequestInfo* request_info =
-      content::ResourceRequestInfo::ForRequest(request);
-
-  const content::ResourceType resource_type = request_info->GetResourceType();
-
-  // Explicitly handle every resource type (to force compile errors if a new one
-  // is added).
-  switch (resource_type) {
-    case content::RESOURCE_TYPE_MAIN_FRAME:
-      // Analyze inclusions in the main frame, not the main frame itself.
-      return false;
-    case content::RESOURCE_TYPE_SUB_FRAME:
-      DCHECK(!request_info->IsMainFrame());
-      // Only analyze top-level frames within the main frame.
-      return request_info->ParentIsMainFrame();
-    case content::RESOURCE_TYPE_STYLESHEET:
-    case content::RESOURCE_TYPE_SCRIPT:
-    case content::RESOURCE_TYPE_IMAGE:
-    case content::RESOURCE_TYPE_FONT_RESOURCE:
-    case content::RESOURCE_TYPE_SUB_RESOURCE:
-    case content::RESOURCE_TYPE_OBJECT:
-    case content::RESOURCE_TYPE_MEDIA:
-    case content::RESOURCE_TYPE_XHR:
-    case content::RESOURCE_TYPE_PLUGIN_RESOURCE:
-      // Types above are to be analyzed for off-domain inclusion if they are
-      // loaded as part of the main frame.
-      return request_info->IsMainFrame();
-    case content::RESOURCE_TYPE_WORKER:
-    case content::RESOURCE_TYPE_SHARED_WORKER:
-    case content::RESOURCE_TYPE_PREFETCH:
-    case content::RESOURCE_TYPE_FAVICON:
-    case content::RESOURCE_TYPE_PING:
-    case content::RESOURCE_TYPE_SERVICE_WORKER:
-    case content::RESOURCE_TYPE_CSP_REPORT:
-      // Types above are not to be analyzed for off-domain inclusion.
-      return false;
-    case content::RESOURCE_TYPE_LAST_TYPE:
-      NOTREACHED();
-      break;
-  }
-  NOTREACHED();
-  return false;
-}
-
-void OffDomainInclusionDetector::ReportAnalysisResult(
-    const content::ResourceType resource_type,
-    AnalysisEvent analysis_event) {
-  // Always record this histogram for the resource type analyzed to be able to
-  // do ratio analysis w.r.t. other histograms below.
-  UMA_HISTOGRAM_ENUMERATION("SBOffDomainInclusion2.RequestAnalyzed",
-                            resource_type,
-                            content::RESOURCE_TYPE_LAST_TYPE);
-
-  // Log a histogram for the analysis result along with the associated
-  // ResourceType.
-  std::string histogram_name;
-  switch (analysis_event) {
-    case AnalysisEvent::NO_EVENT:
-      break;
-    case AnalysisEvent::ABORT_EMPTY_MAIN_FRAME_URL:
-      histogram_name = "SBOffDomainInclusion2.Abort.EmptyMainFrameURL";
-      break;
-    case AnalysisEvent::ABORT_NO_PROFILE:
-      histogram_name = "SBOffDomainInclusion2.Abort.NoProfile";
-      break;
-    case AnalysisEvent::ABORT_INCOGNITO:
-      histogram_name = "SBOffDomainInclusion2.Abort.Incognito";
-      break;
-    case AnalysisEvent::ABORT_NO_HISTORY_SERVICE:
-      histogram_name = "SBOffDomainInclusion2.Abort.NoHistoryService";
-      break;
-    case AnalysisEvent::ABORT_HISTORY_LOOKUP_FAILED:
-      histogram_name = "SBOffDomainInclusion2.Abort.HistoryLookupFailed";
-      break;
-    case AnalysisEvent::OFF_DOMAIN_INCLUSION_WHITELISTED:
-      histogram_name = "SBOffDomainInclusion2.Whitelisted";
-      break;
-    case AnalysisEvent::OFF_DOMAIN_INCLUSION_IN_HISTORY:
-      histogram_name = "SBOffDomainInclusion2.InHistory";
-      break;
-    case AnalysisEvent::OFF_DOMAIN_INCLUSION_SUSPICIOUS:
-      histogram_name = "SBOffDomainInclusion2.Suspicious";
-      break;
-  }
-  if (!histogram_name.empty()) {
-    // Expanded from the UMA_HISTOGRAM_ENUMERATION macro.
-    base::LinearHistogram::FactoryGet(
-        histogram_name,
-        1,                                     // minimum,
-        content::RESOURCE_TYPE_LAST_TYPE,      // maximum
-        content::RESOURCE_TYPE_LAST_TYPE + 1,  // bucket_count
-        base::HistogramBase::kUmaTargetedHistogramFlag)
-        ->Add(resource_type);
-  }
-
-  if (!report_analysis_event_callback_.is_null() &&
-      analysis_event != AnalysisEvent::NO_EVENT) {
-    // Accessing report_analysis_event_callback_ is threadsafe since the member
-    // is only read and never written after construction. The function it
-    // points to may not be threadsafe, though, so always call it on the main
-    // thread. (We might already be on the main thread, but this callback should
-    // be rare enough that it's not worth testing first.)
-    main_thread_task_runner_->PostTask(
-        FROM_HERE,
-        base::Bind(report_analysis_event_callback_, analysis_event));
-  }
-}
-
-}  // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/incident_reporting/off_domain_inclusion_detector.h b/chrome/browser/safe_browsing/incident_reporting/off_domain_inclusion_detector.h
deleted file mode 100644
index 8b37f3f..0000000
--- a/chrome/browser/safe_browsing/incident_reporting/off_domain_inclusion_detector.h
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_SAFE_BROWSING_INCIDENT_REPORTING_OFF_DOMAIN_INCLUSION_DETECTOR_H_
-#define CHROME_BROWSER_SAFE_BROWSING_INCIDENT_REPORTING_OFF_DOMAIN_INCLUSION_DETECTOR_H_
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "base/task/cancelable_task_tracker.h"
-#include "base/time/time.h"
-#include "content/public/common/resource_type.h"
-
-class GURL;
-class Profile;
-
-namespace base {
-class SingleThreadTaskRunner;
-}
-
-namespace net {
-class URLRequest;
-}
-
-namespace safe_browsing {
-
-class SafeBrowsingDatabaseManager;
-
-// Observes network requests and reports suspicious activity.
-class OffDomainInclusionDetector {
- public:
-  enum class AnalysisEvent {
-    NO_EVENT,
-    ABORT_EMPTY_MAIN_FRAME_URL,
-    ABORT_NO_PROFILE,
-    ABORT_INCOGNITO,
-    ABORT_NO_HISTORY_SERVICE,
-    ABORT_HISTORY_LOOKUP_FAILED,
-    OFF_DOMAIN_INCLUSION_WHITELISTED,
-    OFF_DOMAIN_INCLUSION_IN_HISTORY,
-    OFF_DOMAIN_INCLUSION_SUSPICIOUS,
-  };
-
-  // TODO(gab): Hook the OffDomainInclusionDetector to the
-  // IncidentReportingService and use an IncidentReceiver instead of this custom
-  // callback type.
-  typedef base::Callback<void(AnalysisEvent event)> ReportAnalysisEventCallback;
-
-  // Constructs an OffDomainInclusionDetector which will use |database_manager|
-  // over the course of its lifetime. The OffDomainInclusionDetector will use
-  // the thread it is constructed on as its main thread going forward.
-  explicit OffDomainInclusionDetector(
-      const scoped_refptr<SafeBrowsingDatabaseManager>& database_manager);
-
-  // Constructs an OffDomainInclusionDetector as above with an additional
-  // ReportAnalysisEventCallback to get feedback from detection events, used
-  // only in tests.
-  OffDomainInclusionDetector(
-      const scoped_refptr<SafeBrowsingDatabaseManager>& database_manager,
-      const ReportAnalysisEventCallback& report_analysis_event_callback);
-
-  virtual ~OffDomainInclusionDetector();
-
-  // Begins the asynchronous analysis of |request| for off-domain inclusions.
-  // Thread safe.
-  void OnResourceRequest(const net::URLRequest* request);
-
- protected:
-  // Returns a pointer to the Profile hosting the frame identified by
-  // |render_process_id| or null if the resolution can't be completed (e.g., the
-  // tab/renderer is gone by now). Must only be called on the UI thread. Virtual
-  // so tests can override it.
-  virtual Profile* ProfileFromRenderProcessId(int render_process_id);
-
- private:
-  // Returns true if |request| should be analyzed for off-domain inclusions.
-  static bool ShouldAnalyzeRequest(const net::URLRequest* request);
-
-  // Queries the HistoryService for |request_url|. Must be called from the UI
-  // thread so that it can call ProfileFromRenderProcessId.
-  void ContinueAnalysisWithHistoryCheck(
-      const content::ResourceType resource_type,
-      const GURL& request_url,
-      int render_process_id);
-
-  // Reports an off-domain inclusion including the HistoryService's result.
-  void ContinueAnalysisOnHistoryResult(
-      const content::ResourceType resource_type,
-      bool success,
-      int num_visits,
-      base::Time first_visit_time);
-
-  // Reports the result of an off-domain inclusion analysis via UMA (as well as
-  // via |report_analysis_event_callback_| if it is set). May be called from any
-  // thread at any point in the above analysis;
-  // |report_analysis_event_callback_| will always be called on the main thread.
-  void ReportAnalysisResult(
-      const content::ResourceType resource_type,
-      AnalysisEvent analysis_event);
-
-  scoped_refptr<SafeBrowsingDatabaseManager> database_manager_;
-
-  const ReportAnalysisEventCallback report_analysis_event_callback_;
-
-  // Tracks pending tasks posted to the HistoryService and cancels them if this
-  // class is destroyed before they complete.
-  base::CancelableTaskTracker history_task_tracker_;
-
-  // This class may post tasks to its main thread (construction thread) via
-  // |main_thread_task_runner_|, such tasks should be weakly bound via WeakPtrs
-  // coming from |weak_ptr_factory_| (and conversely |weak_ptr_factory_|
-  // shouldn't be used for tasks that aren't on the main thread).
-  scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner_;
-  base::WeakPtrFactory<OffDomainInclusionDetector> weak_ptr_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(OffDomainInclusionDetector);
-};
-
-}  // namespace safe_browsing
-
-#endif  // CHROME_BROWSER_SAFE_BROWSING_INCIDENT_REPORTING_OFF_DOMAIN_INCLUSION_DETECTOR_H_
diff --git a/chrome/browser/safe_browsing/incident_reporting/off_domain_inclusion_detector_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/off_domain_inclusion_detector_unittest.cc
deleted file mode 100644
index 84a7dee1..0000000
--- a/chrome/browser/safe_browsing/incident_reporting/off_domain_inclusion_detector_unittest.cc
+++ /dev/null
@@ -1,610 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/safe_browsing/incident_reporting/off_domain_inclusion_detector.h"
-
-#include <memory>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/files/file_util.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/run_loop.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/time/time.h"
-#include "chrome/browser/bookmarks/bookmark_model_factory.h"
-#include "chrome/browser/history/chrome_history_client.h"
-#include "chrome/browser/history/history_service_factory.h"
-#include "chrome/browser/history/web_history_service_factory.h"
-#include "chrome/browser/prefs/browser_prefs.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/profiles/profile_manager.h"
-#include "chrome/browser/safe_browsing/safe_browsing_service.h"
-#include "chrome/common/pref_names.h"
-#include "chrome/test/base/testing_browser_process.h"
-#include "chrome/test/base/testing_profile.h"
-#include "chrome/test/base/testing_profile_manager.h"
-#include "components/history/content/browser/content_visit_delegate.h"
-#include "components/history/content/browser/history_database_helper.h"
-#include "components/history/core/browser/history_constants.h"
-#include "components/history/core/browser/history_database_params.h"
-#include "components/history/core/browser/history_service.h"
-#include "components/history/core/browser/history_types.h"
-#include "components/keyed_service/core/service_access_type.h"
-#include "components/safe_browsing_db/database_manager.h"
-#include "components/safe_browsing_db/test_database_manager.h"
-#include "components/syncable_prefs/testing_pref_service_syncable.h"
-#include "content/public/browser/resource_request_info.h"
-#include "content/public/common/resource_type.h"
-#include "content/public/test/test_browser_thread_bundle.h"
-#include "net/base/request_priority.h"
-#include "net/url_request/url_request.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 "url/gurl.h"
-
-using testing::_;
-using testing::Eq;
-using testing::NiceMock;
-using testing::Return;
-using testing::Values;
-
-namespace {
-
-const int kFakeRenderProcessId = 123;
-
-// A BrowserContextKeyedServiceFactory::TestingFactoryFunction that creates a
-// HistoryService for a TestingProfile.
-std::unique_ptr<KeyedService> BuildHistoryService(
-    content::BrowserContext* context) {
-  TestingProfile* profile = static_cast<TestingProfile*>(context);
-
-  // Delete the file before creating the service.
-  base::FilePath history_path(
-      profile->GetPath().Append(history::kHistoryFilename));
-  if (!base::DeleteFile(history_path, false) ||
-      base::PathExists(history_path)) {
-    ADD_FAILURE() << "failed to delete history db file "
-                  << history_path.value();
-    return nullptr;
-  }
-
-  std::unique_ptr<history::HistoryService> history_service(
-      new history::HistoryService(
-          base::WrapUnique(new ChromeHistoryClient(
-              BookmarkModelFactory::GetForProfile(profile))),
-          std::unique_ptr<history::VisitDelegate>()));
-  if (history_service->Init(
-          history::HistoryDatabaseParamsForPath(profile->GetPath()))) {
-    return std::move(history_service);
-  }
-
-  ADD_FAILURE() << "failed to initialize history service";
-  return nullptr;
-}
-
-}  // namespace
-
-namespace safe_browsing {
-
-using AnalysisEvent = OffDomainInclusionDetector::AnalysisEvent;
-
-const content::ResourceType kResourceTypesObservedIfParentIsMainFrame[] = {
-    content::RESOURCE_TYPE_SUB_FRAME,
-};
-
-const content::ResourceType kResourceTypesObservedIfInMainFrame[] = {
-    content::RESOURCE_TYPE_STYLESHEET,
-    content::RESOURCE_TYPE_SCRIPT,
-    content::RESOURCE_TYPE_IMAGE,
-    content::RESOURCE_TYPE_FONT_RESOURCE,
-    content::RESOURCE_TYPE_SUB_RESOURCE,
-    content::RESOURCE_TYPE_OBJECT,
-    content::RESOURCE_TYPE_MEDIA,
-    content::RESOURCE_TYPE_XHR,
-    content::RESOURCE_TYPE_PLUGIN_RESOURCE,
-};
-
-const content::ResourceType kResourceTypesIgnored[] = {
-    content::RESOURCE_TYPE_MAIN_FRAME,
-    content::RESOURCE_TYPE_WORKER,
-    content::RESOURCE_TYPE_SHARED_WORKER,
-    content::RESOURCE_TYPE_PREFETCH,
-    content::RESOURCE_TYPE_FAVICON,
-    content::RESOURCE_TYPE_PING,
-    content::RESOURCE_TYPE_SERVICE_WORKER,
-    content::RESOURCE_TYPE_CSP_REPORT,
-};
-
-static_assert(
-    arraysize(kResourceTypesObservedIfParentIsMainFrame) +
-        arraysize(kResourceTypesObservedIfInMainFrame) +
-        arraysize(kResourceTypesIgnored) == content::RESOURCE_TYPE_LAST_TYPE,
-    "Expected resource types list aren't comprehensive");
-
-// A set of test cases to run each parametrized test case below through.
-enum class TestCase {
-  WHITELISTED,
-  IN_HISTORY,
-  IN_HISTORY_AND_WHITELISTED,
-  UNKNOWN,
-};
-
-class MockSafeBrowsingDatabaseManager : public TestSafeBrowsingDatabaseManager {
- public:
-  MockSafeBrowsingDatabaseManager() {}
-
-  MOCK_METHOD1(MatchInclusionWhitelistUrl, bool(const GURL& url));
-
- protected:
-  virtual ~MockSafeBrowsingDatabaseManager() {}
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockSafeBrowsingDatabaseManager);
-};
-
-// A mock OffDomainInclusionDetector which mocks out
-// |ProfileFromRenderProcessId()| so that tests can inject their TestingProfile
-// into the OffDomainInclusionDetector.
-class MockOffDomainInclusionDetector
-    : public NiceMock<OffDomainInclusionDetector> {
- public:
-  MockOffDomainInclusionDetector(
-      const scoped_refptr<SafeBrowsingDatabaseManager>& database_manager,
-      const ReportAnalysisEventCallback& report_analysis_event_callback)
-      : NiceMock<OffDomainInclusionDetector>(database_manager,
-                                             report_analysis_event_callback) {}
-
-  MOCK_METHOD1(ProfileFromRenderProcessId, Profile*(int render_process_id));
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockOffDomainInclusionDetector);
-};
-
-// Adds |url| to |history_service| upon being constructed and removes it upon
-// being destructed.
-class ScopedHistoryEntry {
- public:
-  ScopedHistoryEntry(history::HistoryService* history_service, const GURL& url)
-      : history_service_(history_service), url_(url) {
-    base::RunLoop run_loop;
-
-    history_service_->AddPage(url_, base::Time::Now(), history::SOURCE_BROWSED);
-
-    // Flush tasks posted on the history thread.
-    history_service_->FlushForTest(run_loop.QuitClosure());
-    run_loop.Run();
-    // Make sure anything bounced back to the main thread has been handled.
-    base::RunLoop().RunUntilIdle();
-  }
-
-  ~ScopedHistoryEntry() {
-    base::RunLoop run_loop;
-
-    history_service_->DeleteURL(url_);
-
-    history_service_->FlushForTest(run_loop.QuitClosure());
-    run_loop.Run();
-    base::RunLoop().RunUntilIdle();
-  }
-
- private:
-  history::HistoryService* history_service_;
-  const GURL url_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedHistoryEntry);
-};
-
-class OffDomainInclusionDetectorTest : public testing::TestWithParam<TestCase> {
- protected:
-  OffDomainInclusionDetectorTest()
-      : testing_profile_(nullptr),
-        observed_analysis_event_(AnalysisEvent::NO_EVENT) {}
-
-  void SetUp() override {
-    InitTestProfile();
-    InitOffDomainInclusionDetector();
-  }
-
-  void TearDown() override {
-    // Shut down the history service.
-    testing_profile_->AsTestingProfile()->DestroyHistoryService();
-    profile_manager_.reset();
-    TestingBrowserProcess::DeleteInstance();
-  }
-
-  AnalysisEvent GetLastEventAndReset() {
-    const AnalysisEvent last_event = observed_analysis_event_;
-    observed_analysis_event_ = AnalysisEvent::NO_EVENT;
-    return last_event;
-  }
-
-  void SimulateTestURLRequest(const std::string& url_str,
-                              const std::string& referrer,
-                              content::ResourceType resource_type,
-                              bool is_main_frame,
-                              bool parent_is_main_frame) const {
-    const GURL url(url_str);
-
-    history::HistoryService* history_service =
-        HistoryServiceFactory::GetForProfile(
-            testing_profile_, ServiceAccessType::EXPLICIT_ACCESS);
-    std::unique_ptr<ScopedHistoryEntry> scoped_history_entry;
-    if (ShouldAddSimulatedURLsToHistory())
-      scoped_history_entry.reset(new ScopedHistoryEntry(history_service, url));
-
-    std::unique_ptr<net::URLRequest> url_request(
-        context_.CreateRequest(url, net::DEFAULT_PRIORITY, NULL));
-
-    if (!referrer.empty())
-      url_request->SetReferrer(referrer);
-
-    content::ResourceRequestInfo::AllocateForTesting(
-        url_request.get(),
-        resource_type,
-        NULL,                  // resource_context
-        kFakeRenderProcessId,  // render_process_id
-        0,                     // render_view_id
-        0,                     // render_frame_id
-        is_main_frame,         // is_main_frame
-        parent_is_main_frame,  // parent_is_main_frame
-        true,                  // allow_download
-        false,                 // is_async
-        false);                // is_using_lofi
-
-    off_domain_inclusion_detector_->OnResourceRequest(url_request.get());
-
-    // OffDomainInclusionDetector::OnResourceRequest() may complete
-    // asynchronously, run all message loops (i.e. this message loop in unit
-    // tests) until idle.
-    base::RunLoop().RunUntilIdle();
-
-    // Make sure any task posted by the OffDomainInclusionDetector to the
-    // history thread has occurred.
-    base::RunLoop run_loop;
-    history_service->FlushForTest(run_loop.QuitClosure());
-    run_loop.Run();
-
-    // Finally, finish anything the history thread may have bounced back to the
-    // main thread.
-    base::RunLoop().RunUntilIdle();
-  }
-
-  // Returns the expected AnalysisEvent produced when facing an off-domain
-  // inclusion in the current test configuration.
-  AnalysisEvent GetExpectedOffDomainInclusionEventType() {
-    switch (GetParam()) {
-      case TestCase::WHITELISTED:
-        return AnalysisEvent::OFF_DOMAIN_INCLUSION_WHITELISTED;
-      case TestCase::IN_HISTORY:
-        return AnalysisEvent::OFF_DOMAIN_INCLUSION_IN_HISTORY;
-      case TestCase::IN_HISTORY_AND_WHITELISTED:
-        return AnalysisEvent::OFF_DOMAIN_INCLUSION_WHITELISTED;
-      case TestCase::UNKNOWN:
-        return AnalysisEvent::OFF_DOMAIN_INCLUSION_SUSPICIOUS;
-    }
-    NOTREACHED();
-    return AnalysisEvent::NO_EVENT;
-  }
-
- private:
-  // Returns true if the inclusion whitelist should be mocked to return a match
-  // on all requests.
-  bool ShouldWhitelistEverything() const {
-    return GetParam() == TestCase::WHITELISTED ||
-           GetParam() == TestCase::IN_HISTORY_AND_WHITELISTED;
-  }
-
-  // Returns true if simulated URLs should be added to history.
-  bool ShouldAddSimulatedURLsToHistory() const {
-    return GetParam() == TestCase::IN_HISTORY ||
-           GetParam() == TestCase::IN_HISTORY_AND_WHITELISTED;
-  }
-
-  void OnOffDomainInclusionEvent(AnalysisEvent event) {
-    // Make sure no other AnalysisEvent was previously reported.
-    EXPECT_EQ(AnalysisEvent::NO_EVENT, observed_analysis_event_);
-    observed_analysis_event_ = event;
-  }
-
-  // Initializes |profile_manager_| and |testing_profile_|.
-  void InitTestProfile() {
-    ASSERT_FALSE(profile_manager_);
-    ASSERT_FALSE(testing_profile_);
-
-    profile_manager_.reset(
-        new TestingProfileManager(TestingBrowserProcess::GetGlobal()));
-    ASSERT_TRUE(profile_manager_->SetUp());
-
-    // Set up a mock keyed service factory for the HistoryService.
-    TestingProfile::TestingFactories factories;
-    factories.push_back(std::make_pair(HistoryServiceFactory::GetInstance(),
-                                       &BuildHistoryService));
-    // Suppress WebHistoryService since it makes network requests.
-    factories.push_back(std::make_pair(
-        WebHistoryServiceFactory::GetInstance(),
-        static_cast<BrowserContextKeyedServiceFactory::TestingFactoryFunction>(
-            NULL)));
-
-    // Create default prefs for the test profile.
-    std::unique_ptr<syncable_prefs::TestingPrefServiceSyncable> prefs(
-        new syncable_prefs::TestingPrefServiceSyncable);
-    chrome::RegisterUserProfilePrefs(prefs->registry());
-
-    // |testing_profile_| is owned by |profile_manager_|.
-    testing_profile_ = profile_manager_->CreateTestingProfile(
-        "profile",  // profile_name
-        std::move(prefs),
-        base::UTF8ToUTF16("user"),  // user_name
-        0,                          // avatar_id
-        std::string(),              // supervised_user_id
-        factories);
-  }
-
-  // Initializes |off_domain_inclusion_detector_|, assumes |testing_profile_| is
-  // already initialized.
-  void InitOffDomainInclusionDetector() {
-    ASSERT_TRUE(testing_profile_);
-    ASSERT_FALSE(off_domain_inclusion_detector_);
-
-    scoped_refptr<MockSafeBrowsingDatabaseManager>
-        mock_safe_browsing_database_manager =
-            new NiceMock<MockSafeBrowsingDatabaseManager>();
-    ON_CALL(*mock_safe_browsing_database_manager, MatchInclusionWhitelistUrl(_))
-        .WillByDefault(Return(ShouldWhitelistEverything()));
-
-    off_domain_inclusion_detector_.reset(new MockOffDomainInclusionDetector(
-        mock_safe_browsing_database_manager,
-        base::Bind(&OffDomainInclusionDetectorTest::OnOffDomainInclusionEvent,
-                   base::Unretained(this))));
-    // ProfileFromRenderProcessId doesn't *have* to be called, but if it is, it
-    // should always request the profile for |kFakeRenderProcessId| and this
-    // test will always return it |testing_profile_|.
-    ON_CALL(*off_domain_inclusion_detector_,
-            ProfileFromRenderProcessId(Eq(kFakeRenderProcessId)))
-        .WillByDefault(Return(testing_profile_));
-  }
-
-  Profile* testing_profile_;
-  std::unique_ptr<TestingProfileManager> profile_manager_;
-
-  content::TestBrowserThreadBundle thread_bundle_;
-  net::TestURLRequestContext context_;
-
-  AnalysisEvent observed_analysis_event_;
-
-  std::unique_ptr<MockOffDomainInclusionDetector>
-      off_domain_inclusion_detector_;
-
-  DISALLOW_COPY_AND_ASSIGN(OffDomainInclusionDetectorTest);
-};
-
-TEST_P(OffDomainInclusionDetectorTest, NoEventForIgnoredResourceTypes) {
-  for (content::ResourceType tested_type : kResourceTypesIgnored) {
-    SCOPED_TRACE(tested_type);
-
-    SimulateTestURLRequest("http://offdomain.com/foo",
-                           "http://mydomain.com/bar",
-                           tested_type,
-                           true,    // is_main_frame
-                           false);  // parent_is_main_frame
-
-    EXPECT_EQ(AnalysisEvent::NO_EVENT, GetLastEventAndReset());
-  }
-}
-
-TEST_P(OffDomainInclusionDetectorTest, NoEventForSameDomainInclusions) {
-  for (content::ResourceType tested_type :
-       kResourceTypesObservedIfInMainFrame) {
-    SCOPED_TRACE(tested_type);
-
-    SimulateTestURLRequest("http://mydomain.com/foo",
-                           "http://mydomain.com/bar",
-                           tested_type,
-                           true,    // is_main_frame
-                           false);  // parent_is_main_frame
-
-    EXPECT_EQ(AnalysisEvent::NO_EVENT, GetLastEventAndReset());
-  }
-}
-
-TEST_P(OffDomainInclusionDetectorTest, NoEventForSameIPInclusions) {
-  for (content::ResourceType tested_type :
-       kResourceTypesObservedIfInMainFrame) {
-    SCOPED_TRACE(tested_type);
-
-    SimulateTestURLRequest("http://1.2.3.4/foo",
-                           "http://1.2.3.4/bar",
-                           tested_type,
-                           true,    // is_main_frame
-                           false);  // parent_is_main_frame
-
-    EXPECT_EQ(AnalysisEvent::NO_EVENT, GetLastEventAndReset());
-  }
-}
-
-TEST_P(OffDomainInclusionDetectorTest, OffDomainInclusionInMainFrame) {
-  for (content::ResourceType tested_type :
-       kResourceTypesObservedIfInMainFrame) {
-    SCOPED_TRACE(tested_type);
-
-    SimulateTestURLRequest("http://offdomain.com/foo",
-                           "http://mydomain.com/bar", tested_type,
-                           true,    // is_main_frame
-                           false);  // parent_is_main_frame
-
-    EXPECT_EQ(GetExpectedOffDomainInclusionEventType(), GetLastEventAndReset());
-  }
-}
-
-TEST_P(OffDomainInclusionDetectorTest, OffIPIPInclusionInMainFrame) {
-  for (content::ResourceType tested_type :
-       kResourceTypesObservedIfInMainFrame) {
-    SCOPED_TRACE(tested_type);
-
-    SimulateTestURLRequest("http://1.2.3.4/foo",
-                           "http://5.6.7.8/bar",
-                           tested_type,
-                           true,    // is_main_frame
-                           false);  // parent_is_main_frame
-
-    EXPECT_EQ(GetExpectedOffDomainInclusionEventType(), GetLastEventAndReset());
-  }
-}
-
-TEST_P(OffDomainInclusionDetectorTest, OffDomainIPInclusionInMainFrame) {
-  for (content::ResourceType tested_type :
-       kResourceTypesObservedIfInMainFrame) {
-    SCOPED_TRACE(tested_type);
-
-    SimulateTestURLRequest("http://1.2.3.4/foo",
-                           "http://mydomain.com/bar",
-                           tested_type,
-                           true,    // is_main_frame
-                           false);  // parent_is_main_frame
-
-    EXPECT_EQ(GetExpectedOffDomainInclusionEventType(), GetLastEventAndReset());
-  }
-}
-
-TEST_P(OffDomainInclusionDetectorTest, HttpsOffDomainInclusionInMainFrame) {
-  for (content::ResourceType tested_type :
-       kResourceTypesObservedIfInMainFrame) {
-    SCOPED_TRACE(tested_type);
-
-    SimulateTestURLRequest("https://offdomain.com/foo",
-                           "https://mydomain.com/bar",
-                           tested_type,
-                           true,    // is_main_frame
-                           false);  // parent_is_main_frame
-
-    EXPECT_EQ(GetExpectedOffDomainInclusionEventType(), GetLastEventAndReset());
-  }
-}
-
-TEST_P(OffDomainInclusionDetectorTest,
-       NoEventForNonHttpOffDomainInclusionInMainFrame) {
-  for (content::ResourceType tested_type :
-       kResourceTypesObservedIfInMainFrame) {
-    SCOPED_TRACE(tested_type);
-
-    SimulateTestURLRequest("ftp://offdomain.com/foo",
-                           "http://mydomain.com/bar",
-                           tested_type,
-                           true,    // is_main_frame
-                           false);  // parent_is_main_frame
-
-    EXPECT_EQ(AnalysisEvent::NO_EVENT, GetLastEventAndReset());
-  }
-}
-
-TEST_P(OffDomainInclusionDetectorTest, NoEventForSameTopLevelDomain) {
-  for (content::ResourceType tested_type :
-       kResourceTypesObservedIfInMainFrame) {
-    SCOPED_TRACE(tested_type);
-
-    SimulateTestURLRequest("http://a.mydomain.com/foo",
-                           "http://b.mydomain.com/bar",
-                           tested_type,
-                           true,    // is_main_frame
-                           false);  // parent_is_main_frame
-
-    EXPECT_EQ(AnalysisEvent::NO_EVENT, GetLastEventAndReset());
-  }
-}
-
-TEST_P(OffDomainInclusionDetectorTest,
-       OffDomainInclusionForSameTopLevelRegistryButDifferentDomain) {
-  for (content::ResourceType tested_type :
-       kResourceTypesObservedIfInMainFrame) {
-    SCOPED_TRACE(tested_type);
-
-    SimulateTestURLRequest("http://a.appspot.com/foo",
-                           "http://b.appspot.com/bar",
-                           tested_type,
-                           true,    // is_main_frame
-                           false);  // parent_is_main_frame
-
-    EXPECT_EQ(GetExpectedOffDomainInclusionEventType(), GetLastEventAndReset());
-  }
-}
-
-TEST_P(OffDomainInclusionDetectorTest,
-       NoEventForOffDomainRegularResourceInSubframe) {
-  for (content::ResourceType tested_type :
-       kResourceTypesObservedIfInMainFrame) {
-    SCOPED_TRACE(tested_type);
-
-    SimulateTestURLRequest("http://offdomain.com/foo",
-                           "http://mydomain.com/bar",
-                           tested_type,
-                           false,  // is_main_frame
-                           true);  // parent_is_main_frame
-
-    EXPECT_EQ(AnalysisEvent::NO_EVENT, GetLastEventAndReset());
-  }
-}
-
-TEST_P(OffDomainInclusionDetectorTest,
-       NoEventForOffDomainSubSubFrameInclusion) {
-  for (content::ResourceType tested_type :
-       kResourceTypesObservedIfParentIsMainFrame) {
-    SCOPED_TRACE(tested_type);
-
-    SimulateTestURLRequest("http://offdomain.com/foo",
-                           "http://mydomain.com/bar",
-                           tested_type,
-                           false,   // is_main_frame
-                           false);  // parent_is_main_frame
-
-    EXPECT_EQ(AnalysisEvent::NO_EVENT, GetLastEventAndReset());
-  }
-}
-
-TEST_P(OffDomainInclusionDetectorTest,
-       OffDomainInclusionForOffDomainResourcesObservedIfParentIsMainFrame) {
-  for (content::ResourceType tested_type :
-       kResourceTypesObservedIfParentIsMainFrame) {
-    SCOPED_TRACE(tested_type);
-
-    SimulateTestURLRequest("http://offdomain.com/foo",
-                           "http://mydomain.com/bar",
-                           tested_type,
-                           false,  // is_main_frame
-                           true);  // parent_is_main_frame
-
-    EXPECT_EQ(GetExpectedOffDomainInclusionEventType(), GetLastEventAndReset());
-  }
-}
-
-TEST_P(OffDomainInclusionDetectorTest,
-       EmptyEventForOffDomainInclusionWithNoReferrer) {
-  for (content::ResourceType tested_type :
-       kResourceTypesObservedIfInMainFrame) {
-    SCOPED_TRACE(tested_type);
-
-    SimulateTestURLRequest("https://offdomain.com/foo",
-                           "",
-                           tested_type,
-                           true,    // is_main_frame
-                           false);  // parent_is_main_frame
-
-    EXPECT_EQ(AnalysisEvent::ABORT_EMPTY_MAIN_FRAME_URL,
-              GetLastEventAndReset());
-  }
-}
-
-INSTANTIATE_TEST_CASE_P(OffDomainInclusionDetectorTestInstance,
-                        OffDomainInclusionDetectorTest,
-                        Values(TestCase::WHITELISTED,
-                               TestCase::IN_HISTORY,
-                               TestCase::IN_HISTORY_AND_WHITELISTED,
-                               TestCase::UNKNOWN));
-
-}  // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/local_database_manager.cc b/chrome/browser/safe_browsing/local_database_manager.cc
index 3e696614..252cb2e 100644
--- a/chrome/browser/safe_browsing/local_database_manager.cc
+++ b/chrome/browser/safe_browsing/local_database_manager.cc
@@ -83,7 +83,6 @@
     case BINURL:              // Falls through.
     case CSDWHITELIST:        // Falls through.
     case DOWNLOADWHITELIST:   // Falls through.
-    case INCLUSIONWHITELIST:  // Falls through.
     case MODULEWHITELIST:     // Falls through.
     case EXTENSIONBLACKLIST:  // Falls through.
     case IPBLACKLIST:
@@ -457,14 +456,6 @@
   return database_->ContainsDownloadWhitelistedString(str);
 }
 
-bool LocalSafeBrowsingDatabaseManager::MatchInclusionWhitelistUrl(
-    const GURL& url) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  if (!enabled_ || !MakeDatabaseAvailable())
-    return true;
-  return database_->ContainsInclusionWhitelistedUrl(url);
-}
-
 bool LocalSafeBrowsingDatabaseManager::MatchModuleWhitelistString(
     const std::string& str) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
diff --git a/chrome/browser/safe_browsing/local_database_manager.h b/chrome/browser/safe_browsing/local_database_manager.h
index 069f93c..f9559b4 100644
--- a/chrome/browser/safe_browsing/local_database_manager.h
+++ b/chrome/browser/safe_browsing/local_database_manager.h
@@ -127,7 +127,6 @@
   bool MatchMalwareIP(const std::string& ip_address) override;
   bool MatchDownloadWhitelistUrl(const GURL& url) override;
   bool MatchDownloadWhitelistString(const std::string& str) override;
-  bool MatchInclusionWhitelistUrl(const GURL& url) override;
   bool MatchModuleWhitelistString(const std::string& str) override;
   bool IsMalwareKillSwitchOn() override;
   bool IsCsdWhitelistKillSwitchOn() override;
diff --git a/chrome/browser/safe_browsing/safe_browsing_database.cc b/chrome/browser/safe_browsing/safe_browsing_database.cc
index 5a89dc2..d1bc5486 100644
--- a/chrome/browser/safe_browsing/safe_browsing_database.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_database.cc
@@ -294,7 +294,6 @@
         CreateStore(enable_download_protection, db_task_runner),
         CreateStore(enable_client_side_whitelist, db_task_runner),
         CreateStore(enable_download_whitelist, db_task_runner),
-        CreateStore(true, db_task_runner),  // inclusion_whitelist_store
         CreateStore(enable_extension_blacklist, db_task_runner),
         CreateStore(enable_ip_blacklist, db_task_runner),
         CreateStore(enable_unwanted_software_list, db_task_runner),
@@ -439,8 +438,6 @@
     return csd_whitelist_store_.get();
   } else if (list_id == DOWNLOADWHITELIST) {
     return download_whitelist_store_.get();
-  } else if (list_id == INCLUSIONWHITELIST) {
-    return inclusion_whitelist_store_.get();
   } else if (list_id == EXTENSIONBLACKLIST) {
     return extension_blacklist_store_.get();
   } else if (list_id == IPBLACKLIST) {
@@ -469,8 +466,6 @@
         return &outer_->csd_whitelist_;
       case SBWhitelistId::DOWNLOAD:
         return &outer_->download_whitelist_;
-      case SBWhitelistId::INCLUSION:
-        return &outer_->inclusion_whitelist_;
       case SBWhitelistId::MODULE:
         return &outer_->module_whitelist_;
     }
@@ -581,8 +576,6 @@
         return &outer_->csd_whitelist_;
       case SBWhitelistId::DOWNLOAD:
         return &outer_->download_whitelist_;
-      case SBWhitelistId::INCLUSION:
-        return &outer_->inclusion_whitelist_;
       case SBWhitelistId::MODULE:
         return &outer_->module_whitelist_;
     }
@@ -635,7 +628,6 @@
     SafeBrowsingStore* download_store,
     SafeBrowsingStore* csd_whitelist_store,
     SafeBrowsingStore* download_whitelist_store,
-    SafeBrowsingStore* inclusion_whitelist_store,
     SafeBrowsingStore* extension_blacklist_store,
     SafeBrowsingStore* ip_blacklist_store,
     SafeBrowsingStore* unwanted_software_store,
@@ -648,7 +640,6 @@
       download_store_(download_store),
       csd_whitelist_store_(csd_whitelist_store),
       download_whitelist_store_(download_whitelist_store),
-      inclusion_whitelist_store_(inclusion_whitelist_store),
       extension_blacklist_store_(extension_blacklist_store),
       ip_blacklist_store_(ip_blacklist_store),
       unwanted_software_store_(unwanted_software_store),
@@ -716,6 +707,16 @@
     base::DeleteFile(PrefixSetForFilename(SideEffectFreeWhitelistDBFilename(
                          db_state_manager_.filename_base())),
                      false);
+
+    // Delete any files of the off-domain inclusion whitelist that may be around
+    // from when it was previously enabled.
+    //
+    // TODO(joenotcharles): Remove this after May 11, 2017.
+    SafeBrowsingStoreFile::DeleteStore(
+        InclusionWhitelistDBFilename(db_state_manager_.filename_base()));
+    base::DeleteFile(PrefixSetForFilename(InclusionWhitelistDBFilename(
+                         db_state_manager_.filename_base())),
+                     false);
   }
   // Note: End the transaction early because LoadWhiteList() and
   // WhitelistEverything() manage their own transactions.
@@ -763,24 +764,6 @@
         SBWhitelistId::DOWNLOAD);  // Just to be safe.
   }
 
-  if (inclusion_whitelist_store_.get()) {
-    inclusion_whitelist_store_->Init(
-        InclusionWhitelistDBFilename(db_state_manager_.filename_base()),
-        base::Bind(&SafeBrowsingDatabaseNew::HandleCorruptDatabase,
-                   base::Unretained(this)));
-
-    std::vector<SBAddFullHash> full_hashes;
-    if (inclusion_whitelist_store_->GetAddFullHashes(&full_hashes)) {
-      LoadWhitelist(full_hashes, SBWhitelistId::INCLUSION);
-    } else {
-      state_manager_.BeginWriteTransaction()->WhitelistEverything(
-          SBWhitelistId::INCLUSION);
-    }
-  } else {
-    state_manager_.BeginWriteTransaction()->WhitelistEverything(
-        SBWhitelistId::INCLUSION);  // Just to be safe.
-  }
-
   if (extension_blacklist_store_.get()) {
     extension_blacklist_store_->Init(
         ExtensionBlacklistDBFilename(db_state_manager_.filename_base()),
@@ -961,12 +944,6 @@
   return ContainsWhitelistedHashes(SBWhitelistId::DOWNLOAD, full_hashes);
 }
 
-bool SafeBrowsingDatabaseNew::ContainsInclusionWhitelistedUrl(const GURL& url) {
-  std::vector<SBFullHash> full_hashes;
-  UrlToFullHashes(url, true, &full_hashes);
-  return ContainsWhitelistedHashes(SBWhitelistId::INCLUSION, full_hashes);
-}
-
 bool SafeBrowsingDatabaseNew::ContainsExtensionPrefixes(
     const std::vector<SBPrefix>& prefixes,
     std::vector<SBPrefix>* prefix_hits) {
@@ -1234,13 +1211,6 @@
     return false;
   }
 
-  if (inclusion_whitelist_store_.get() &&
-      !inclusion_whitelist_store_->BeginUpdate()) {
-    RecordFailure(FAILURE_WHITELIST_DATABASE_UPDATE_BEGIN);
-    HandleCorruptDatabase();
-    return false;
-  }
-
   if (extension_blacklist_store_ &&
       !extension_blacklist_store_->BeginUpdate()) {
     RecordFailure(FAILURE_EXTENSION_BLACKLIST_UPDATE_BEGIN);
@@ -1291,9 +1261,6 @@
   UpdateChunkRangesForList(download_whitelist_store_.get(), kDownloadWhiteList,
                            lists);
 
-  UpdateChunkRangesForList(inclusion_whitelist_store_.get(),
-                           kInclusionWhitelist, lists);
-
   UpdateChunkRangesForList(extension_blacklist_store_.get(),
                            kExtensionBlacklist, lists);
 
@@ -1337,11 +1304,6 @@
       DLOG(ERROR) << "Safe-browsing download whitelist database corrupt.";
     }
 
-    if (inclusion_whitelist_store_.get() &&
-        !inclusion_whitelist_store_->CheckValidity()) {
-      DLOG(ERROR) << "Safe-browsing inclusion whitelist database corrupt.";
-    }
-
     if (extension_blacklist_store_ &&
         !extension_blacklist_store_->CheckValidity()) {
       DLOG(ERROR) << "Safe-browsing extension blacklist database corrupt.";
@@ -1383,8 +1345,6 @@
       csd_whitelist_store_->CancelUpdate();
     if (download_whitelist_store_.get())
       download_whitelist_store_->CancelUpdate();
-    if (inclusion_whitelist_store_.get())
-      inclusion_whitelist_store_->CancelUpdate();
     if (extension_blacklist_store_)
       extension_blacklist_store_->CancelUpdate();
     if (ip_blacklist_store_)
@@ -1415,9 +1375,6 @@
   UpdateWhitelistStore(
       DownloadWhitelistDBFilename(db_state_manager_.filename_base()),
       download_whitelist_store_.get(), SBWhitelistId::DOWNLOAD);
-  UpdateWhitelistStore(
-      InclusionWhitelistDBFilename(db_state_manager_.filename_base()),
-      inclusion_whitelist_store_.get(), SBWhitelistId::INCLUSION);
 
   if (extension_blacklist_store_) {
     UpdateHashPrefixStore(
@@ -1696,54 +1653,47 @@
   if (!r4)
     RecordFailure(FAILURE_DATABASE_STORE_DELETE);
 
-  const bool r5 = inclusion_whitelist_store_.get()
-                      ? inclusion_whitelist_store_->Delete()
-                      : true;
-  if (!r5)
-    RecordFailure(FAILURE_DATABASE_STORE_DELETE);
-
   const base::FilePath browse_filename =
       BrowseDBFilename(db_state_manager_.filename_base());
   const base::FilePath bloom_filter_filename =
       BloomFilterForFilename(browse_filename);
-  const bool r6 = base::DeleteFile(bloom_filter_filename, false);
-  if (!r6)
+  const bool r5 = base::DeleteFile(bloom_filter_filename, false);
+  if (!r5)
     RecordFailure(FAILURE_DATABASE_FILTER_DELETE);
 
   const base::FilePath browse_prefix_set_filename =
       PrefixSetForFilename(browse_filename);
-  const bool r7 = base::DeleteFile(browse_prefix_set_filename, false);
-  if (!r7)
+  const bool r6 = base::DeleteFile(browse_prefix_set_filename, false);
+  if (!r6)
     RecordFailure(FAILURE_BROWSE_PREFIX_SET_DELETE);
 
   const base::FilePath extension_blacklist_filename =
       ExtensionBlacklistDBFilename(db_state_manager_.filename_base());
-  const bool r8 = base::DeleteFile(extension_blacklist_filename, false);
-  if (!r8)
+  const bool r7 = base::DeleteFile(extension_blacklist_filename, false);
+  if (!r7)
     RecordFailure(FAILURE_EXTENSION_BLACKLIST_DELETE);
 
-  const bool r9 = base::DeleteFile(
+  const bool r8 = base::DeleteFile(
       IpBlacklistDBFilename(db_state_manager_.filename_base()), false);
-  if (!r9)
+  if (!r8)
     RecordFailure(FAILURE_IP_BLACKLIST_DELETE);
 
-  const bool r10 = base::DeleteFile(
+  const bool r9 = base::DeleteFile(
       UnwantedSoftwareDBFilename(db_state_manager_.filename_base()), false);
-  if (!r10)
+  if (!r9)
     RecordFailure(FAILURE_UNWANTED_SOFTWARE_PREFIX_SET_DELETE);
 
-  const bool r11 = base::DeleteFile(
+  const bool r10 = base::DeleteFile(
       ResourceBlacklistDBFilename(db_state_manager_.filename_base()), false);
-  if (!r11)
+  if (!r10)
     RecordFailure(FAILURE_RESOURCE_BLACKLIST_DELETE);
 
-  const bool r12 =
+  const bool r11 =
       module_whitelist_store_.get() ? module_whitelist_store_->Delete() : true;
-  if (!r12)
+  if (!r11)
     RecordFailure(FAILURE_MODULE_WHITELIST_DELETE);
 
-  return r1 && r2 && r3 && r4 && r5 && r6 && r7 && r8 && r9 && r10 && r11 &&
-         r12;
+  return r1 && r2 && r3 && r4 && r5 && r6 && r7 && r8 && r9 && r10 && r11;
 }
 
 void SafeBrowsingDatabaseNew::WritePrefixSet(const base::FilePath& db_filename,
diff --git a/chrome/browser/safe_browsing/safe_browsing_database.h b/chrome/browser/safe_browsing/safe_browsing_database.h
index a05e98cd8..9b1d7ff 100644
--- a/chrome/browser/safe_browsing/safe_browsing_database.h
+++ b/chrome/browser/safe_browsing/safe_browsing_database.h
@@ -158,9 +158,6 @@
   virtual bool ContainsDownloadWhitelistedUrl(const GURL& url) = 0;
   virtual bool ContainsDownloadWhitelistedString(const std::string& str) = 0;
 
-  // Returns true if |url| is on the off-domain inclusion whitelist.
-  virtual bool ContainsInclusionWhitelistedUrl(const GURL& url) = 0;
-
   // Returns true if the given module is on the module whitelist.
   virtual bool ContainsModuleWhitelistedString(const std::string& str) = 0;
 
@@ -254,7 +251,8 @@
   static base::FilePath DownloadWhitelistDBFilename(
       const base::FilePath& download_whitelist_base_filename);
 
-  // Filename for the off-domain inclusion whitelist databsae.
+  // Filename for the off-domain inclusion whitelist databsae.  This database no
+  // longer exists, but the filename is retained so the database may be deleted.
   static base::FilePath InclusionWhitelistDBFilename(
       const base::FilePath& inclusion_whitelist_base_filename);
 
@@ -355,7 +353,6 @@
       SafeBrowsingStore* download_store,
       SafeBrowsingStore* csd_whitelist_store,
       SafeBrowsingStore* download_whitelist_store,
-      SafeBrowsingStore* inclusion_whitelist_store,
       SafeBrowsingStore* extension_blacklist_store,
       SafeBrowsingStore* ip_blacklist_store,
       SafeBrowsingStore* unwanted_software_store,
@@ -386,7 +383,6 @@
   bool ContainsCsdWhitelistedUrl(const GURL& url) override;
   bool ContainsDownloadWhitelistedUrl(const GURL& url) override;
   bool ContainsDownloadWhitelistedString(const std::string& str) override;
-  bool ContainsInclusionWhitelistedUrl(const GURL& url) override;
   bool ContainsModuleWhitelistedString(const std::string& str) override;
   bool ContainsExtensionPrefixes(const std::vector<SBPrefix>& prefixes,
                                  std::vector<SBPrefix>* prefix_hits) override;
@@ -448,7 +444,6 @@
     enum class SBWhitelistId {
       CSD,
       DOWNLOAD,
-      INCLUSION,
       MODULE,
     };
     enum class PrefixSetId {
@@ -709,8 +704,6 @@
   //     bit hashes.
   //   - |download_whitelist_store_|: For the download whitelist chunks and
   //     full-length hashes.  This list only contains 256 bit hashes.
-  //   - |inclusion_whitelist_store_|: For the inclusion whitelist. Same format
-  //     as |download_whitelist_store_|.
   //   - |extension_blacklist_store_|: For extension IDs.
   //   - |ip_blacklist_store_|: For IP blacklist.
   //   - |unwanted_software_store_|: For unwanted software list (format
@@ -730,7 +723,6 @@
   const std::unique_ptr<SafeBrowsingStore> download_store_;
   const std::unique_ptr<SafeBrowsingStore> csd_whitelist_store_;
   const std::unique_ptr<SafeBrowsingStore> download_whitelist_store_;
-  const std::unique_ptr<SafeBrowsingStore> inclusion_whitelist_store_;
   const std::unique_ptr<SafeBrowsingStore> extension_blacklist_store_;
   const std::unique_ptr<SafeBrowsingStore> ip_blacklist_store_;
   const std::unique_ptr<SafeBrowsingStore> unwanted_software_store_;
diff --git a/chrome/browser/safe_browsing/safe_browsing_database_unittest.cc b/chrome/browser/safe_browsing/safe_browsing_database_unittest.cc
index 01bba17..54b9549 100644
--- a/chrome/browser/safe_browsing/safe_browsing_database_unittest.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_database_unittest.cc
@@ -276,8 +276,6 @@
         new SafeBrowsingStoreFile(task_runner_);
     SafeBrowsingStoreFile* download_whitelist_store =
         new SafeBrowsingStoreFile(task_runner_);
-    SafeBrowsingStoreFile* inclusion_whitelist_store =
-        new SafeBrowsingStoreFile(task_runner_);
     SafeBrowsingStoreFile* extension_blacklist_store =
         new SafeBrowsingStoreFile(task_runner_);
     SafeBrowsingStoreFile* ip_blacklist_store =
@@ -289,10 +287,16 @@
     SafeBrowsingStoreFile* resource_blacklist_store =
         new SafeBrowsingStoreFile(task_runner_);
     database_.reset(new SafeBrowsingDatabaseNew(
-        task_runner_, browse_store, download_store, csd_whitelist_store,
-        download_whitelist_store, inclusion_whitelist_store,
-        extension_blacklist_store, ip_blacklist_store, unwanted_software_store,
-        module_whitelist_store, resource_blacklist_store));
+        task_runner_,
+        browse_store,
+        download_store,
+        csd_whitelist_store,
+        download_whitelist_store,
+        extension_blacklist_store,
+        ip_blacklist_store,
+        unwanted_software_store,
+        module_whitelist_store,
+        resource_blacklist_store));
     database_->Init(database_filename_);
   }
 
@@ -431,45 +435,40 @@
   database_->InsertChunks(kBinUrlList, chunks);
 
   chunks.clear();
-  chunks.push_back(AddChunkFullHashValue(5, "www.forwhitelist.com/a.html"));
+  chunks.push_back(AddChunkFullHashValue(4, "www.forwhitelist.com/a.html"));
   database_->InsertChunks(kCsdWhiteList, chunks);
 
   chunks.clear();
-  chunks.push_back(AddChunkFullHashValue(6, "www.download.com/"));
+  chunks.push_back(AddChunkFullHashValue(5, "www.download.com/"));
   database_->InsertChunks(kDownloadWhiteList, chunks);
 
   chunks.clear();
-  chunks.push_back(AddChunkFullHashValue(7, "www.inclusion.com/"));
-  database_->InsertChunks(kInclusionWhitelist,
-                          chunks);
-
-  chunks.clear();
-  chunks.push_back(AddChunkFullHashValue(8,
+  chunks.push_back(AddChunkFullHashValue(6,
                                          "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
                                          "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"));
   database_->InsertChunks(kExtensionBlacklist,
                           chunks);
 
   chunks.clear();
-  chunks.push_back(AddChunkHashedIpValue(10, "::ffff:192.168.1.0", 120));
+  chunks.push_back(AddChunkHashedIpValue(7, "::ffff:192.168.1.0", 120));
   database_->InsertChunks(kIPBlacklist, chunks);
 
   chunks.clear();
-  chunks.push_back(AddChunkPrefixValue(11, "www.unwanted.com/software.html"));
+  chunks.push_back(AddChunkPrefixValue(8, "www.unwanted.com/software.html"));
   database_->InsertChunks(kUnwantedUrlList, chunks);
 
   chunks.clear();
-  chunks.push_back(AddChunkPrefixValue(12, "chrome.dll"));
+  chunks.push_back(AddChunkPrefixValue(9, "chrome.dll"));
   database_->InsertChunks(kModuleWhitelist, chunks);
 
   chunks.clear();
-  chunks.push_back(AddChunkPrefixValue(13, "foo.com/script.js"));
+  chunks.push_back(AddChunkPrefixValue(10, "foo.com/script.js"));
   database_->InsertChunks(kResourceBlacklist, chunks);
 
   database_->UpdateFinished(true);
 
   GetListsInfo(&lists);
-  ASSERT_EQ(11U, lists.size());
+  ASSERT_EQ(10U, lists.size());
   EXPECT_EQ(kMalwareList, lists[0].name);
   EXPECT_EQ("1", lists[0].adds);
   EXPECT_TRUE(lists[0].subs.empty());
@@ -480,29 +479,26 @@
   EXPECT_EQ("3", lists[2].adds);
   EXPECT_TRUE(lists[2].subs.empty());
   EXPECT_EQ(kCsdWhiteList, lists[3].name);
-  EXPECT_EQ("5", lists[3].adds);
+  EXPECT_EQ("4", lists[3].adds);
   EXPECT_TRUE(lists[3].subs.empty());
   EXPECT_EQ(kDownloadWhiteList, lists[4].name);
-  EXPECT_EQ("6", lists[4].adds);
+  EXPECT_EQ("5", lists[4].adds);
   EXPECT_TRUE(lists[4].subs.empty());
-  EXPECT_EQ(kInclusionWhitelist, lists[5].name);
-  EXPECT_EQ("7", lists[5].adds);
+  EXPECT_EQ(kExtensionBlacklist, lists[5].name);
+  EXPECT_EQ("6", lists[5].adds);
   EXPECT_TRUE(lists[5].subs.empty());
-  EXPECT_EQ(kExtensionBlacklist, lists[6].name);
-  EXPECT_EQ("8", lists[6].adds);
+  EXPECT_EQ(kIPBlacklist, lists[6].name);
+  EXPECT_EQ("7", lists[6].adds);
   EXPECT_TRUE(lists[6].subs.empty());
-  EXPECT_EQ(kIPBlacklist, lists[7].name);
-  EXPECT_EQ("10", lists[7].adds);
+  EXPECT_EQ(kUnwantedUrlList, lists[7].name);
+  EXPECT_EQ("8", lists[7].adds);
   EXPECT_TRUE(lists[7].subs.empty());
-  EXPECT_EQ(kUnwantedUrlList, lists[8].name);
-  EXPECT_EQ("11", lists[8].adds);
+  EXPECT_EQ(kModuleWhitelist, lists[8].name);
+  EXPECT_EQ("9", lists[8].adds);
   EXPECT_TRUE(lists[8].subs.empty());
-  EXPECT_EQ(kModuleWhitelist, lists[9].name);
-  EXPECT_EQ("12", lists[9].adds);
+  EXPECT_EQ(kResourceBlacklist, lists[9].name);
+  EXPECT_EQ("10", lists[9].adds);
   EXPECT_TRUE(lists[9].subs.empty());
-  EXPECT_EQ(kResourceBlacklist, lists[10].name);
-  EXPECT_EQ("13", lists[10].adds);
-  EXPECT_TRUE(lists[10].subs.empty());
 
   database_.reset();
 }
@@ -567,7 +563,7 @@
     },
     {
       kUnwantedUrlList,
-      8U,
+      7U,
       &SafeBrowsingDatabase::ContainsUnwantedSoftwareUrl,
       &SafeBrowsingDatabase::ContainsUnwantedSoftwareHashes
     },
@@ -1185,8 +1181,7 @@
   base::MessageLoop loop;
   SafeBrowsingStoreFile* store = new SafeBrowsingStoreFile(task_runner_);
   database_.reset(new SafeBrowsingDatabaseNew(
-      task_runner_, store, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-      NULL));
+      task_runner_, store, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL));
   database_->Init(database_filename_);
 
   // This will cause an empty database to be created.
@@ -1397,8 +1392,6 @@
       {kDownloadWhiteList,
        &SafeBrowsingDatabase::ContainsDownloadWhitelistedUrl,
        &SafeBrowsingDatabase::ContainsDownloadWhitelistedString},
-      {kInclusionWhitelist,
-       &SafeBrowsingDatabase::ContainsInclusionWhitelistedUrl, nullptr},
       {kModuleWhitelist, nullptr,
        &SafeBrowsingDatabase::ContainsModuleWhitelistedString},
   };
@@ -1406,7 +1399,7 @@
   // If the whitelist is disabled everything should match the whitelist.
   database_.reset(new SafeBrowsingDatabaseNew(
       task_runner_, new SafeBrowsingStoreFile(task_runner_), NULL, NULL, NULL,
-      NULL, NULL, NULL, NULL, NULL, NULL));
+      NULL, NULL, NULL, NULL, NULL));
   database_->Init(database_filename_);
   for (const auto& test_case : kTestCases) {
     SCOPED_TRACE(std::string("Tested list at fault => ") +
diff --git a/chrome/browser/safe_browsing/safe_browsing_service.h b/chrome/browser/safe_browsing/safe_browsing_service.h
index f5de477..8fcb45b 100644
--- a/chrome/browser/safe_browsing/safe_browsing_service.h
+++ b/chrome/browser/safe_browsing/safe_browsing_service.h
@@ -57,11 +57,6 @@
 class SafeBrowsingURLRequestContextGetter;
 struct V4ProtocolConfig;
 
-#if defined(FULL_SAFE_BROWSING)
-class IncidentReportingService;
-class OffDomainInclusionDetector;
-#endif
-
 // Construction needs to happen on the main thread.
 // The SafeBrowsingService owns both the UI and Database managers which do
 // the heavylifting of safebrowsing service. Both of these managers stay
diff --git a/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc b/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc
index d854967..3c23c819 100644
--- a/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc
@@ -250,9 +250,6 @@
     return true;
   }
   bool ContainsDownloadWhitelistedUrl(const GURL& url) override { return true; }
-  bool ContainsInclusionWhitelistedUrl(const GURL& url) override {
-    return true;
-  }
   bool ContainsModuleWhitelistedString(const std::string& str) override {
     return true;
   }
diff --git a/chrome/browser/safe_browsing/services_delegate_impl.cc b/chrome/browser/safe_browsing/services_delegate_impl.cc
index e3b5b7a..ee48926 100644
--- a/chrome/browser/safe_browsing/services_delegate_impl.cc
+++ b/chrome/browser/safe_browsing/services_delegate_impl.cc
@@ -180,12 +180,16 @@
 }
 
 V4LocalDatabaseManager* ServicesDelegateImpl::CreateV4LocalDatabaseManager() {
-  return new V4LocalDatabaseManager();
+  return new V4LocalDatabaseManager(SafeBrowsingService::GetBaseFilename());
 }
 
 bool ServicesDelegateImpl::IsV4LocalDatabaseManagerEnabled() {
-  return base::FeatureList::IsEnabled(
+  bool enabled = base::FeatureList::IsEnabled(
       kSafeBrowsingV4LocalDatabaseManagerEnabled);
+#ifndef NDEBUG
+  enabled = true;
+#endif
+  return enabled;
 }
 
 }  // namespace safe_browsing
diff --git a/chrome/browser/signin/signin_error_notifier_ash_unittest.cc b/chrome/browser/signin/signin_error_notifier_ash_unittest.cc
index bd0fada..f880440 100644
--- a/chrome/browser/signin/signin_error_notifier_ash_unittest.cc
+++ b/chrome/browser/signin/signin_error_notifier_ash_unittest.cc
@@ -34,6 +34,11 @@
 #include "ui/display/screen.h"
 #endif
 
+#if defined(OS_CHROMEOS)
+#include "chrome/browser/chromeos/login/users/mock_user_manager.h"
+#include "chrome/browser/chromeos/login/users/scoped_user_manager_enabler.h"
+#endif
+
 namespace ash {
 namespace test {
 
@@ -61,6 +66,12 @@
         new TestingProfileManager(TestingBrowserProcess::GetGlobal()));
     ASSERT_TRUE(profile_manager_->SetUp());
 
+#if defined(OS_CHROMEOS)
+    mock_user_manager_ = new chromeos::MockUserManager();
+    user_manager_enabler_.reset(
+        new chromeos::ScopedUserManagerEnabler(mock_user_manager_));
+#endif
+
     TestingBrowserProcess::GetGlobal();
     AshTestBase::SetUp();
 
@@ -103,6 +114,10 @@
   std::unique_ptr<TestingProfile> profile_;
   SigninErrorController* error_controller_;
   NotificationUIManager* notification_ui_manager_;
+#if defined(OS_CHROMEOS)
+  chromeos::MockUserManager* mock_user_manager_;  // Not owned.
+  std::unique_ptr<chromeos::ScopedUserManagerEnabler> user_manager_enabler_;
+#endif
 };
 
 TEST_F(SigninErrorNotifierTest, NoErrorAuthStatusProviders) {
diff --git a/chrome/browser/sync/sync_error_notifier_ash_unittest.cc b/chrome/browser/sync/sync_error_notifier_ash_unittest.cc
index da5a683..601ac5e8 100644
--- a/chrome/browser/sync/sync_error_notifier_ash_unittest.cc
+++ b/chrome/browser/sync/sync_error_notifier_ash_unittest.cc
@@ -34,6 +34,11 @@
 #include "ui/display/screen.h"
 #endif
 
+#if defined(OS_CHROMEOS)
+#include "chrome/browser/chromeos/login/users/mock_user_manager.h"
+#include "chrome/browser/chromeos/login/users/scoped_user_manager_enabler.h"
+#endif
+
 using ::testing::NiceMock;
 using ::testing::Return;
 using ::testing::ReturnRef;
@@ -184,6 +189,10 @@
 #define MAYBE_PassphraseNotification PassphraseNotification
 #endif
 TEST_F(SyncErrorNotifierTest, MAYBE_PassphraseNotification) {
+#if defined(OS_CHROMEOS)
+  chromeos::ScopedUserManagerEnabler scoped_enabler(
+      new chromeos::MockUserManager());
+#endif
   ASSERT_FALSE(notification_ui_manager_->FindById(
       kNotificationId, NotificationUIManager::GetProfileID(profile_)));
 
diff --git a/chrome/browser/ui/ash/chrome_screenshot_grabber_unittest.cc b/chrome/browser/ui/ash/chrome_screenshot_grabber_unittest.cc
index d3050f8b..999c59ee 100644
--- a/chrome/browser/ui/ash/chrome_screenshot_grabber_unittest.cc
+++ b/chrome/browser/ui/ash/chrome_screenshot_grabber_unittest.cc
@@ -15,6 +15,8 @@
 #include "base/message_loop/message_loop.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/chromeos/login/users/mock_user_manager.h"
+#include "chrome/browser/chromeos/login/users/scoped_user_manager_enabler.h"
 #include "chrome/browser/notifications/notification_ui_manager.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/test/base/testing_browser_process.h"
@@ -105,7 +107,8 @@
   // claim that the user did log in.
   ASSERT_FALSE(chromeos::LoginState::IsInitialized());
   chromeos::LoginState::Initialize();
-
+  chromeos::ScopedUserManagerEnabler scoped_enabler(
+      new chromeos::MockUserManager());
   base::ScopedTempDir directory;
   ASSERT_TRUE(directory.CreateUniqueTempDir());
   EXPECT_TRUE(chrome_screenshot_grabber()->CanTakeScreenshot());
diff --git a/chrome/browser/ui/ash/multi_user/multi_user_context_menu_chromeos_unittest.cc b/chrome/browser/ui/ash/multi_user/multi_user_context_menu_chromeos_unittest.cc
index 3c13430..8f49280 100644
--- a/chrome/browser/ui/ash/multi_user/multi_user_context_menu_chromeos_unittest.cc
+++ b/chrome/browser/ui/ash/multi_user/multi_user_context_menu_chromeos_unittest.cc
@@ -10,11 +10,13 @@
 #include "base/compiler_specific.h"
 #include "base/logging.h"
 #include "base/macros.h"
+#include "chrome/browser/chromeos/login/users/scoped_user_manager_enabler.h"
 #include "chrome/browser/ui/ash/multi_user/multi_user_context_menu.h"
 #include "chrome/browser/ui/ash/multi_user/multi_user_window_manager.h"
 #include "chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos.h"
 #include "chrome/common/chrome_switches.h"
 #include "components/signin/core/account_id/account_id.h"
+#include "components/user_manager/fake_user_manager.h"
 #include "ui/base/models/menu_model.h"
 #include "ui/base/ui_base_types.h"
 
@@ -24,7 +26,10 @@
 // A test class for preparing the chrome::MultiUserContextMenu.
 class MultiUserContextMenuChromeOSTest : public AshTestBase {
  public:
-  MultiUserContextMenuChromeOSTest() : multi_user_window_manager_(NULL) {}
+  MultiUserContextMenuChromeOSTest()
+      : multi_user_window_manager_(NULL),
+        fake_user_manager_(new user_manager::FakeUserManager),
+        user_manager_enabler_(fake_user_manager_) {}
 
   void SetUp() override;
   void TearDown() override;
@@ -51,6 +56,8 @@
 
   // The instance of the MultiUserWindowManager.
   chrome::MultiUserWindowManagerChromeOS* multi_user_window_manager_;
+  user_manager::FakeUserManager* fake_user_manager_;  // Not owned.
+  chromeos::ScopedUserManagerEnabler user_manager_enabler_;
 
   DISALLOW_COPY_AND_ASSIGN(MultiUserContextMenuChromeOSTest);
 };
diff --git a/chrome/browser/ui/ash/multi_user/multi_user_util.cc b/chrome/browser/ui/ash/multi_user/multi_user_util.cc
index ef2e7cd..b00fb43 100644
--- a/chrome/browser/ui/ash/multi_user/multi_user_util.cc
+++ b/chrome/browser/ui/ash/multi_user/multi_user_util.cc
@@ -4,24 +4,21 @@
 
 #include "chrome/browser/ui/ash/multi_user/multi_user_util.h"
 
-#include <vector>
-
-#include "base/strings/string_util.h"
-#include "build/build_config.h"
-#include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/ash/multi_user/multi_user_window_manager.h"
 #include "components/signin/core/account_id/account_id.h"
 #include "components/user_manager/user_manager.h"
-#include "google_apis/gaia/gaia_auth_util.h"
 
 namespace multi_user_util {
 
 AccountId GetAccountIdFromProfile(Profile* profile) {
-  return GetAccountIdFromEmail(
-      profile->GetOriginalProfile()->GetProfileUserName());
+  // This will guarantee an nonempty AccountId be returned if a valid profile is
+  // provided.
+  const user_manager::User* user =
+      chromeos::ProfileHelper::Get()->GetUserByProfile(
+          profile->GetOriginalProfile());
+  return user ? user->GetAccountId() : EmptyAccountId();
 }
 
 AccountId GetAccountIdFromEmail(const std::string& email) {
@@ -32,31 +29,10 @@
 }
 
 Profile* GetProfileFromAccountId(const AccountId& account_id) {
-  // Unit tests can end up here without a |g_browser_process|.
-  if (!g_browser_process || !g_browser_process->profile_manager())
-    return nullptr;
-
-  std::vector<Profile*> profiles =
-      g_browser_process->profile_manager()->GetLoadedProfiles();
-
-  std::vector<Profile*>::const_iterator profile_iterator = profiles.begin();
-  for (; profile_iterator != profiles.end(); ++profile_iterator) {
-    if (GetAccountIdFromProfile(*profile_iterator) == account_id)
-      return *profile_iterator;
-  }
-
-  // If in a session the refresh token is revoked, GetAccountIdFromProfile()
-  // returns an empty account id which will cause the profile not being fetched
-  // properly. In this case we fall back to use GetProfileByUser() function.
-  // Note: If the refresh token is revoked because the user changes his GAIA
-  // password, we will force log out the user within 120 seconds. See crbug.com/
-  // 587318 for more detail.
   const user_manager::User* user =
       user_manager::UserManager::Get()->FindUser(account_id);
-  if (user)
-    return chromeos::ProfileHelper::Get()->GetProfileByUser(user);
-
-  return nullptr;
+  return user ? chromeos::ProfileHelper::Get()->GetProfileByUser(user)
+              : nullptr;
 }
 
 Profile* GetProfileFromWindow(aura::Window* window) {
diff --git a/chrome/browser/ui/ash/multi_user/multi_user_util_chromeos_unittest.cc b/chrome/browser/ui/ash/multi_user/multi_user_util_chromeos_unittest.cc
new file mode 100644
index 0000000..d621c95
--- /dev/null
+++ b/chrome/browser/ui/ash/multi_user/multi_user_util_chromeos_unittest.cc
@@ -0,0 +1,130 @@
+// 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 "ash/test/ash_test_base.h"
+#include "chrome/browser/chromeos/login/users/scoped_user_manager_enabler.h"
+#include "chrome/browser/chromeos/profiles/profile_helper.h"
+#include "chrome/browser/signin/account_tracker_service_factory.h"
+#include "chrome/browser/signin/fake_signin_manager_builder.h"
+#include "chrome/browser/signin/signin_manager_factory.h"
+#include "chrome/browser/ui/ash/multi_user/multi_user_util.h"
+#include "chrome/test/base/testing_profile.h"
+#include "components/signin/core/account_id/account_id.h"
+#include "components/signin/core/browser/account_tracker_service.h"
+#include "components/user_manager/fake_user_manager.h"
+#include "components/user_manager/user.h"
+
+namespace ash {
+namespace test {
+
+namespace {
+
+const char kTestGaiaId[] = "gaia_id";
+const char kTestAccountId[] = "test@test.com";
+
+class MultiUserTestingProfile : public TestingProfile {
+ public:
+  explicit MultiUserTestingProfile(TestingProfile* profile)
+      : profile_(profile) {}
+  ~MultiUserTestingProfile() override {}
+
+  Profile* GetOriginalProfile() override { return this; }
+
+  std::string GetProfileUserName() const override {
+    const SigninManagerBase* signin_manager =
+        SigninManagerFactory::GetForProfileIfExists(profile_.get());
+    if (signin_manager)
+      return signin_manager->GetAuthenticatedAccountInfo().email;
+
+    return std::string();
+  }
+
+  TestingProfile* profile() { return profile_.get(); }
+
+ private:
+  std::unique_ptr<TestingProfile> profile_;
+
+  DISALLOW_COPY_AND_ASSIGN(MultiUserTestingProfile);
+};
+
+}  // namespace
+
+class MultiUserUtilTest : public AshTestBase {
+ public:
+  MultiUserUtilTest() {}
+  ~MultiUserUtilTest() override{};
+
+  void SetUp() override {
+    AshTestBase::SetUp();
+
+    fake_user_manager_ = new user_manager::FakeUserManager;
+    user_manager_enabler_.reset(
+        new chromeos::ScopedUserManagerEnabler(fake_user_manager_));
+
+    TestingProfile::Builder builder;
+    builder.AddTestingFactory(SigninManagerFactory::GetInstance(),
+                              BuildFakeSigninManagerBase);
+    TestingProfile* profile = builder.Build().release();
+    profile_.reset(new MultiUserTestingProfile(profile));
+  }
+
+  void TearDown() override {
+    profile_.reset();
+    AshTestBase::TearDown();
+  }
+
+  // Add a user to account tracker service with given gaia_id and email.
+  std::string AddUserToAccountTracker(const std::string& gaia_id,
+                                      const std::string& email) {
+    AccountTrackerService* account_tracker_service =
+        AccountTrackerServiceFactory::GetForProfile(profile_->profile());
+    FakeSigninManagerBase* signin_manager = static_cast<FakeSigninManagerBase*>(
+        SigninManagerFactory::GetForProfile(profile_->profile()));
+    account_tracker_service->SeedAccountInfo(gaia_id, email);
+    const std::string id =
+        account_tracker_service->PickAccountIdForAccount(gaia_id, email);
+    signin_manager->SignIn(id);
+
+    fake_user_manager_->AddUser(multi_user_util::GetAccountIdFromEmail(id));
+    fake_user_manager_->UserLoggedIn(
+        multi_user_util::GetAccountIdFromEmail(id),
+        chromeos::ProfileHelper::GetUserIdHashByUserIdForTesting(id),
+        false /* browser_restart */);
+
+    return id;
+  }
+
+  void SimulateTokenRevoked(const std::string& account_id) {
+    AccountTrackerService* account_tracker_service =
+        AccountTrackerServiceFactory::GetForProfile(profile_->profile());
+    account_tracker_service->RemoveAccount(account_id);
+  }
+
+  MultiUserTestingProfile* profile() { return profile_.get(); }
+
+ private:
+  std::unique_ptr<MultiUserTestingProfile> profile_;
+  user_manager::FakeUserManager* fake_user_manager_;  // Not owned.
+  std::unique_ptr<chromeos::ScopedUserManagerEnabler> user_manager_enabler_;
+
+  DISALLOW_COPY_AND_ASSIGN(MultiUserUtilTest);
+};
+
+// Test that during the session it will always return a valid account id if a
+// valid profile is provided, even if this profile's refresh token has been
+// revoked. (On Chrome OS we don't force to end the session in this case.)
+TEST_F(MultiUserUtilTest, ReturnValidAccountIdIfTokenRevoked) {
+  std::string id = AddUserToAccountTracker(kTestGaiaId, kTestAccountId);
+  EXPECT_EQ(kTestAccountId, profile()->GetProfileUserName());
+  EXPECT_EQ(kTestAccountId,
+            multi_user_util::GetAccountIdFromProfile(profile()).GetUserEmail());
+
+  SimulateTokenRevoked(id);
+  EXPECT_EQ(std::string(), profile()->GetProfileUserName());
+  EXPECT_EQ(kTestAccountId,
+            multi_user_util::GetAccountIdFromProfile(profile()).GetUserEmail());
+}
+
+}  // namespace test
+}  // namespace ash
diff --git a/chrome/browser/ui/browser_finder_chromeos_unittest.cc b/chrome/browser/ui/browser_finder_chromeos_unittest.cc
index d3bbb8a6..4e5bd1e 100644
--- a/chrome/browser/ui/browser_finder_chromeos_unittest.cc
+++ b/chrome/browser/ui/browser_finder_chromeos_unittest.cc
@@ -8,7 +8,9 @@
 #include "ash/test/ash_test_helper.h"
 #include "ash/test/test_session_state_delegate.h"
 #include "base/macros.h"
+#include "chrome/browser/chromeos/login/users/scoped_user_manager_enabler.h"
 #include "chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.h"
+#include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/ui/ash/multi_user/multi_user_window_manager.h"
 #include "chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos.h"
 #include "chrome/test/base/browser_with_test_window_test.h"
@@ -16,6 +18,8 @@
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile_manager.h"
 #include "components/signin/core/account_id/account_id.h"
+#include "components/user_manager/fake_user_manager.h"
+#include "components/user_manager/user.h"
 
 namespace test {
 
@@ -28,14 +32,22 @@
 
 class BrowserFinderChromeOSTest : public BrowserWithTestWindowTest {
  protected:
-  BrowserFinderChromeOSTest() : multi_user_window_manager_(nullptr) {}
+  BrowserFinderChromeOSTest()
+      : multi_user_window_manager_(nullptr),
+        fake_user_manager_(new user_manager::FakeUserManager),
+        user_manager_enabler_(fake_user_manager_) {}
 
   TestingProfile* CreateMultiUserProfile(const AccountId& account_id) {
     TestingProfile* profile =
         profile_manager_->CreateTestingProfile(account_id.GetUserEmail());
-    GetUserWindowManager()->AddUser(profile);
+    const user_manager::User* user = fake_user_manager_->AddUser(account_id);
+    chromeos::ProfileHelper::Get()->SetUserToProfileMappingForTesting(
+        const_cast<user_manager::User*>(user), profile);
+    chromeos::ProfileHelper::Get()->SetProfileToUserMappingForTesting(
+        const_cast<user_manager::User*>(user));
     ash::test::AshTestHelper::GetTestSessionStateDelegate()->AddUser(
         account_id);
+    GetUserWindowManager()->AddUser(profile);
     return profile;
   }
 
@@ -88,6 +100,8 @@
   TestingProfile* second_profile_;
   std::unique_ptr<TestingProfileManager> profile_manager_;
   chrome::MultiUserWindowManagerChromeOS* multi_user_window_manager_;
+  user_manager::FakeUserManager* fake_user_manager_;  // Not owned.
+  chromeos::ScopedUserManagerEnabler user_manager_enabler_;
 
   DISALLOW_COPY_AND_ASSIGN(BrowserFinderChromeOSTest);
 };
diff --git a/chrome/browser/ui/cocoa/browser_window_layout.h b/chrome/browser/ui/cocoa/browser_window_layout.h
index 82cf1f9c..6f43d0e 100644
--- a/chrome/browser/ui/cocoa/browser_window_layout.h
+++ b/chrome/browser/ui/cocoa/browser_window_layout.h
@@ -11,8 +11,8 @@
 
 namespace chrome {
 
-// The height of the tab strip.
-extern const CGFloat kTabStripHeight;
+// Returns the height of the tab strip.
+CGFloat TabStripHeight();
 
 // The parameters used to calculate the layout of the views managed by the
 // BrowserWindowController.
diff --git a/chrome/browser/ui/cocoa/browser_window_layout.mm b/chrome/browser/ui/cocoa/browser_window_layout.mm
index 23ca75e..3a571684 100644
--- a/chrome/browser/ui/cocoa/browser_window_layout.mm
+++ b/chrome/browser/ui/cocoa/browser_window_layout.mm
@@ -10,11 +10,20 @@
 #include "base/logging.h"
 #include "base/mac/mac_util.h"
 #import "chrome/browser/ui/cocoa/tabs/tab_strip_controller.h"
+#include "ui/base/material_design/material_design_controller.h"
 
 namespace chrome {
 
 // The height of the tab strip.
 const CGFloat kTabStripHeight = 37;
+const CGFloat kMaterialTabStripHeight = 35;
+
+CGFloat TabStripHeight() {
+  if (ui::MaterialDesignController::IsModeMaterial())
+    return kMaterialTabStripHeight;
+
+  return kTabStripHeight;
+}
 
 }  // namespace chrome
 
@@ -195,8 +204,8 @@
   // Lay out the tab strip.
   maxY_ = parameters_.windowSize.height + fullscreenYOffset_;
   CGFloat width = parameters_.contentViewSize.width;
-  layout.frame = NSMakeRect(
-      0, maxY_ - chrome::kTabStripHeight, width, chrome::kTabStripHeight);
+  layout.frame = NSMakeRect(0, maxY_ - chrome::TabStripHeight(), width,
+                            chrome::TabStripHeight());
   maxY_ = NSMinY(layout.frame);
 
   // In Yosemite, there is no longer an exit fullscreen button in the top-right
@@ -226,14 +235,14 @@
       // Center the button, but make sure that it's pixel aligned on non-retina
       // displays. Use trunc() instead of round() to mimic the behavior of
       // autoresizesSubviews.
-      badgeYOffset = trunc((chrome::kTabStripHeight - buttonHeight) / 2);
+      badgeYOffset = trunc((chrome::TabStripHeight() - buttonHeight) / 2);
     } else {
       // Actually place the badge *above* |maxY|, by +2 to miss the divider.
       badgeYOffset = 2 * parameters_.avatarLineWidth;
     }
 
     NSSize size = NSMakeSize(parameters_.avatarSize.width,
-                             std::min(buttonHeight, chrome::kTabStripHeight));
+                             std::min(buttonHeight, chrome::TabStripHeight()));
     NSPoint origin =
         NSMakePoint(width - parameters_.avatarSize.width + badgeXOffset,
                     maxY_ + badgeYOffset);
@@ -377,7 +386,7 @@
 
   CGFloat totalHeight = 0;
   if (parameters_.hasTabStrip)
-    totalHeight += chrome::kTabStripHeight;
+    totalHeight += chrome::TabStripHeight();
 
   if (parameters_.hasToolbar) {
     totalHeight += parameters_.toolbarHeight;
diff --git a/chrome/browser/ui/cocoa/browser_window_layout_unittest.mm b/chrome/browser/ui/cocoa/browser_window_layout_unittest.mm
index 8389fc8..1523172 100644
--- a/chrome/browser/ui/cocoa/browser_window_layout_unittest.mm
+++ b/chrome/browser/ui/cocoa/browser_window_layout_unittest.mm
@@ -9,6 +9,22 @@
 #import "chrome/browser/ui/cocoa/browser_window_layout.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #import "testing/gtest_mac.h"
+#include "ui/base/material_design/material_design_controller.h"
+
+namespace {
+
+// In Material Design, the tabstrip's height is 2px smaller. As such, the
+// expected y values in the tests need to take account of the offset.
+
+int TabStripYOffset() {
+  return ui::MaterialDesignController::IsModeMaterial() ? 2 : 0;
+}
+
+int AvatarYOffset() {
+  return ui::MaterialDesignController::IsModeMaterial() ? 1 : 0;
+}
+
+} // namespace
 
 class BrowserWindowLayoutTest : public testing::Test {
  public:
@@ -56,39 +72,46 @@
 };
 
 TEST_F(BrowserWindowLayoutTest, TestAllViews) {
+  int yOffset = TabStripYOffset();
   chrome::LayoutOutput output = [layout computeLayout];
 
-  EXPECT_NSEQ(NSMakeRect(0, 585, 600, 37), output.tabStripLayout.frame);
-  EXPECT_NSEQ(NSMakeRect(502, 589, 63, 28), output.tabStripLayout.avatarFrame);
+  EXPECT_NSEQ(NSMakeRect(0, 585 + yOffset, 600, 37 - yOffset),
+              output.tabStripLayout.frame);
+  EXPECT_NSEQ(NSMakeRect(502, 589 + AvatarYOffset(), 63, 28),
+              output.tabStripLayout.avatarFrame);
   EXPECT_EQ(70, output.tabStripLayout.leftIndent);
   EXPECT_EQ(98, output.tabStripLayout.rightIndent);
-  EXPECT_NSEQ(NSMakeRect(0, 553, 600, 32), output.toolbarFrame);
-  EXPECT_NSEQ(NSMakeRect(0, 527, 600, 26), output.bookmarkFrame);
+
+  EXPECT_NSEQ(NSMakeRect(0, 553 + yOffset, 600, 32), output.toolbarFrame);
+  EXPECT_NSEQ(NSMakeRect(0, 527 + yOffset, 600, 26), output.bookmarkFrame);
   EXPECT_NSEQ(NSZeroRect, output.fullscreenBackingBarFrame);
-  EXPECT_EQ(527, output.findBarMaxY);
-  EXPECT_NSEQ(NSMakeRect(0, 455, 600, 111), output.infoBarFrame);
+  EXPECT_EQ(527 + yOffset, output.findBarMaxY);
+  EXPECT_NSEQ(NSMakeRect(0, 455 + yOffset, 600, 111), output.infoBarFrame);
   EXPECT_NSEQ(NSMakeRect(0, 0, 600, 44), output.downloadShelfFrame);
-  EXPECT_NSEQ(NSMakeRect(0, 44, 600, 411), output.contentAreaFrame);
+  EXPECT_NSEQ(NSMakeRect(0, 44, 600, 411 + yOffset), output.contentAreaFrame);
 }
 
 TEST_F(BrowserWindowLayoutTest, TestAllViewsFullscreen) {
   ApplyStandardFullscreenLayoutParameters();
-
+  int yOffset = TabStripYOffset();
   chrome::LayoutOutput output = [layout computeLayout];
 
-  EXPECT_NSEQ(NSMakeRect(0, 585, 600, 37), output.tabStripLayout.frame);
-  EXPECT_NSEQ(NSMakeRect(533, 589, 63, 28), output.tabStripLayout.avatarFrame);
+  EXPECT_NSEQ(NSMakeRect(0, 585 + yOffset, 600, 37 - yOffset),
+              output.tabStripLayout.frame);
+  EXPECT_NSEQ(NSMakeRect(533, 589 + AvatarYOffset(), 63, 28),
+              output.tabStripLayout.avatarFrame);
   EXPECT_EQ(0, output.tabStripLayout.leftIndent);
   EXPECT_FALSE(output.tabStripLayout.addCustomWindowControls);
   EXPECT_EQ(67, output.tabStripLayout.rightIndent);
-  EXPECT_NSEQ(NSMakeRect(0, 553, 600, 32), output.toolbarFrame);
-  EXPECT_NSEQ(NSMakeRect(0, 527, 600, 26), output.bookmarkFrame);
-  EXPECT_NSEQ(NSMakeRect(0, 527, 600, 95), output.fullscreenBackingBarFrame);
-  EXPECT_EQ(527, output.findBarMaxY);
-  EXPECT_EQ(527, output.fullscreenExitButtonMaxY);
-  EXPECT_NSEQ(NSMakeRect(0, 455, 600, 111), output.infoBarFrame);
+  EXPECT_NSEQ(NSMakeRect(0, 553 + yOffset, 600, 32), output.toolbarFrame);
+  EXPECT_NSEQ(NSMakeRect(0, 527 + yOffset, 600, 26), output.bookmarkFrame);
+  EXPECT_NSEQ(NSMakeRect(0, 527 + yOffset, 600, 95 - yOffset),
+              output.fullscreenBackingBarFrame);
+  EXPECT_EQ(527 + yOffset, output.findBarMaxY);
+  EXPECT_EQ(527 + yOffset, output.fullscreenExitButtonMaxY);
+  EXPECT_NSEQ(NSMakeRect(0, 455 + yOffset, 600, 111), output.infoBarFrame);
   EXPECT_NSEQ(NSMakeRect(0, 0, 600, 44), output.downloadShelfFrame);
-  EXPECT_NSEQ(NSMakeRect(0, 44, 600, 411), output.contentAreaFrame);
+  EXPECT_NSEQ(NSMakeRect(0, 44, 600, 411 + yOffset), output.contentAreaFrame);
 }
 
 // In fullscreen mode for Yosemite, the tab strip's left indent should be
@@ -107,21 +130,25 @@
   ApplyStandardFullscreenLayoutParameters();
   [layout setFullscreenMenubarOffset:-10];
 
+  int yOffset = TabStripYOffset();
   chrome::LayoutOutput output = [layout computeLayout];
 
-  EXPECT_NSEQ(NSMakeRect(0, 575, 600, 37), output.tabStripLayout.frame);
-  EXPECT_NSEQ(NSMakeRect(533, 579, 63, 28), output.tabStripLayout.avatarFrame);
+  EXPECT_NSEQ(NSMakeRect(0, 575 + yOffset, 600, 37 - yOffset),
+              output.tabStripLayout.frame);
+  EXPECT_NSEQ(NSMakeRect(533, 579 + AvatarYOffset(), 63, 28),
+              output.tabStripLayout.avatarFrame);
   EXPECT_EQ(0, output.tabStripLayout.leftIndent);
   EXPECT_FALSE(output.tabStripLayout.addCustomWindowControls);
   EXPECT_EQ(67, output.tabStripLayout.rightIndent);
-  EXPECT_NSEQ(NSMakeRect(0, 543, 600, 32), output.toolbarFrame);
-  EXPECT_NSEQ(NSMakeRect(0, 517, 600, 26), output.bookmarkFrame);
-  EXPECT_NSEQ(NSMakeRect(0, 517, 600, 95), output.fullscreenBackingBarFrame);
-  EXPECT_EQ(517, output.findBarMaxY);
-  EXPECT_EQ(517, output.fullscreenExitButtonMaxY);
-  EXPECT_NSEQ(NSMakeRect(0, 445, 600, 111), output.infoBarFrame);
+  EXPECT_NSEQ(NSMakeRect(0, 543 + yOffset, 600, 32), output.toolbarFrame);
+  EXPECT_NSEQ(NSMakeRect(0, 517 + yOffset, 600, 26), output.bookmarkFrame);
+  EXPECT_NSEQ(NSMakeRect(0, 517 + yOffset, 600, 95 - yOffset),
+              output.fullscreenBackingBarFrame);
+  EXPECT_EQ(517 + yOffset, output.findBarMaxY);
+  EXPECT_EQ(517 + yOffset, output.fullscreenExitButtonMaxY);
+  EXPECT_NSEQ(NSMakeRect(0, 445 + yOffset, 600, 111), output.infoBarFrame);
   EXPECT_NSEQ(NSMakeRect(0, 0, 600, 44), output.downloadShelfFrame);
-  EXPECT_NSEQ(NSMakeRect(0, 44, 600, 411), output.contentAreaFrame);
+  EXPECT_NSEQ(NSMakeRect(0, 44, 600, 411 + yOffset), output.contentAreaFrame);
 }
 
 TEST_F(BrowserWindowLayoutTest, TestPopupWindow) {
@@ -211,5 +238,6 @@
 
   chrome::LayoutOutput output = [layout computeLayout];
 
-  EXPECT_NSEQ(NSMakeRect(537, 589, 28, 28), output.tabStripLayout.avatarFrame);
+  EXPECT_NSEQ(NSMakeRect(537, 589 + AvatarYOffset(), 28, 28),
+              output.tabStripLayout.avatarFrame);
 }
diff --git a/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller.mm b/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller.mm
index e36188d..48bfd54 100644
--- a/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller.mm
+++ b/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller.mm
@@ -14,6 +14,7 @@
 #include "chrome/browser/extensions/api/experience_sampling_private/experience_sampling.h"
 #include "chrome/browser/extensions/extension_install_prompt_show_params.h"
 #include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/browser_finder.h"
 #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_custom_sheet.h"
 #include "chrome/browser/ui/cocoa/constrained_window/constrained_window_custom_window.h"
@@ -112,5 +113,7 @@
 // static
 ExtensionInstallPrompt::ShowDialogCallback
 ExtensionInstallPrompt::GetDefaultShowDialogCallback() {
+  if (chrome::ToolkitViewsWebUIDialogsEnabled())
+    return ExtensionInstallPrompt::GetViewsShowDialogCallback();
   return base::Bind(&ShowExtensionInstallDialogImpl);
 }
diff --git a/chrome/browser/ui/cocoa/tabs/tab_window_controller.mm b/chrome/browser/ui/cocoa/tabs/tab_window_controller.mm
index dba85d4..f869c54 100644
--- a/chrome/browser/ui/cocoa/tabs/tab_window_controller.mm
+++ b/chrome/browser/ui/cocoa/tabs/tab_window_controller.mm
@@ -93,8 +93,8 @@
     [self insertTabStripBackgroundViewIntoWindow:window titleBar:hasTitleBar];
 
     tabStripView_.reset([[TabStripView alloc]
-        initWithFrame:NSMakeRect(
-                          0, 0, kDefaultWidth, chrome::kTabStripHeight)]);
+        initWithFrame:NSMakeRect(0, 0, kDefaultWidth,
+                                 chrome::TabStripHeight())]);
     [tabStripView_ setAutoresizingMask:NSViewWidthSizable |
                                        NSViewMinYMargin];
     if (hasTabStrip)
diff --git a/chrome/browser/ui/startup/bad_flags_prompt.cc b/chrome/browser/ui/startup/bad_flags_prompt.cc
index 51039e2..c97fb224 100644
--- a/chrome/browser/ui/startup/bad_flags_prompt.cc
+++ b/chrome/browser/ui/startup/bad_flags_prompt.cc
@@ -125,17 +125,8 @@
 
   startup_metric_utils::SetNonBrowserUIDisplayed();
 
-  // Ensure the ResourceBundle is initialized for string resource access.
-  bool cleanup_resource_bundle = false;
-  if (!ResourceBundle::HasSharedInstance()) {
-    cleanup_resource_bundle = true;
-    std::string locale = l10n_util::GetApplicationLocale(std::string());
-    const char kUserDataDirDialogFallbackLocale[] = "en-US";
-    if (locale.empty())
-      locale = kUserDataDirDialogFallbackLocale;
-    ui::ResourceBundle::InitSharedInstanceWithLocale(
-        locale, NULL, ui::ResourceBundle::DO_NOT_LOAD_COMMON_RESOURCES);
-  }
+  // The ResourceBundle hasn't been loaded yet, but we need strings from it.
+  ResourceBundle::TemporaryLoader loader;
 
   const base::string16& title =
       l10n_util::GetStringUTF16(IDS_CANT_WRITE_USER_DIRECTORY_TITLE);
@@ -143,9 +134,6 @@
       l10n_util::GetStringFUTF16(IDS_CANT_WRITE_USER_DIRECTORY_SUMMARY,
                                  user_data_dir.LossyDisplayName());
 
-  if (cleanup_resource_bundle)
-    ResourceBundle::CleanupSharedInstance();
-
   // More complex dialogs cannot be shown before the earliest calls here.
   ShowWarningMessageBox(NULL, title, message);
 }
diff --git a/chrome/browser/ui/views/browser_dialogs_views.cc b/chrome/browser/ui/views/browser_dialogs_views.cc
index 7ac21f3f..8e6c6b3 100644
--- a/chrome/browser/ui/views/browser_dialogs_views.cc
+++ b/chrome/browser/ui/views/browser_dialogs_views.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/browser_dialogs.h"
 
+#include "chrome/browser/extensions/extension_install_prompt.h"
 #include "chrome/browser/ui/login/login_handler.h"
 
 // This file provides definitions of desktop browser dialog-creation methods for
@@ -27,3 +28,9 @@
   chrome::ShowBookmarkEditorViews(parent_window, profile, details,
                                   configuration);
 }
+
+// static
+ExtensionInstallPrompt::ShowDialogCallback
+ExtensionInstallPrompt::GetDefaultShowDialogCallback() {
+  return ExtensionInstallPrompt::GetViewsShowDialogCallback();
+}
diff --git a/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc b/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc
index 59e8e5c..0db8438c 100644
--- a/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc
+++ b/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc
@@ -773,6 +773,6 @@
 
 // static
 ExtensionInstallPrompt::ShowDialogCallback
-ExtensionInstallPrompt::GetDefaultShowDialogCallback() {
+ExtensionInstallPrompt::GetViewsShowDialogCallback() {
   return base::Bind(&ShowExtensionInstallDialogImpl);
 }
diff --git a/chrome/browser/ui/views/frame/minimize_button_metrics_win.cc b/chrome/browser/ui/views/frame/minimize_button_metrics_win.cc
index 986f5e2..9d61b12 100644
--- a/chrome/browser/ui/views/frame/minimize_button_metrics_win.cc
+++ b/chrome/browser/ui/views/frame/minimize_button_metrics_win.cc
@@ -6,33 +6,33 @@
 
 #include "base/logging.h"
 #include "base/i18n/rtl.h"
+#include "base/win/windows_version.h"
+#include "dwmapi.h"
 #include "ui/base/win/shell.h"
 #include "ui/display/win/dpi.h"
+#include "ui/display/win/screen_win.h"
+#include "ui/gfx/geometry/point.h"
 
 namespace {
 
-int GetMinimizeButtonOffsetForWindow(HWND hwnd) {
-  // The WM_GETTITLEBARINFOEX message can fail if we are not active/visible. By
-  // fail we get a location of 0; the return status code is always the same and
-  // similarly the state never seems to change (titlebar_info.rgstate).
-  TITLEBARINFOEX titlebar_info = {0};
-  titlebar_info.cbSize = sizeof(TITLEBARINFOEX);
-  SendMessage(hwnd, WM_GETTITLEBARINFOEX, 0,
-              reinterpret_cast<WPARAM>(&titlebar_info));
+// These constants were determined by manually adding various offsets
+// until the identity switcher was placed at the same location as before.
+// When a new or updated OS version is released, a new constant may need
+// to be added to this list and GetDefaultButtonBoundsOffset() is updated.
+const int kWin7ButtonBoundsPositionOffset = 1;
+const int kWin8ButtonBoundsPositionOffset = 10;
+const int kWin10ButtonBoundsPositionOffset = 6;
+const int kInvalidOffset = static_cast<int>(0x80000000);
 
-  if (titlebar_info.rgrect[2].left == titlebar_info.rgrect[2].right ||
-      (titlebar_info.rgstate[2] & (STATE_SYSTEM_INVISIBLE |
-                                   STATE_SYSTEM_OFFSCREEN |
-                                   STATE_SYSTEM_UNAVAILABLE))) {
-    return 0;
-  }
+using base::win::GetVersion;
+using display::win::ScreenWin;
 
-  // WM_GETTITLEBARINFOEX returns rects in screen coordinates in pixels.
-  // We need to convert the minimize button corner offset to DIP before
-  // returning it.
-  POINT minimize_button_corner = { titlebar_info.rgrect[2].left, 0 };
-  MapWindowPoints(HWND_DESKTOP, hwnd, &minimize_button_corner, 1);
-  return minimize_button_corner.x / display::win::GetDPIScale();
+int GetDefaultButtonBoundsOffset() {
+  if (GetVersion() >= base::win::VERSION_WIN10)
+    return kWin10ButtonBoundsPositionOffset;
+  if (GetVersion() >= base::win::VERSION_WIN8)
+    return kWin8ButtonBoundsPositionOffset;
+  return kWin7ButtonBoundsPositionOffset;
 }
 
 }  // namespace
@@ -40,6 +40,9 @@
 // static
 int MinimizeButtonMetrics::last_cached_minimize_button_x_delta_ = 0;
 
+// static
+int MinimizeButtonMetrics::button_bounds_position_offset_ = kInvalidOffset;
+
 MinimizeButtonMetrics::MinimizeButtonMetrics()
     : hwnd_(nullptr),
       cached_minimize_button_x_delta_(last_cached_minimize_button_x_delta_),
@@ -60,6 +63,90 @@
   // correct.
 }
 
+// This function attempts to calculate the odd and varying difference
+// between the results of DwmGetWindowAttribute with the
+// DWMWA_CAPTION_BUTTON_BOUNDS flag and the information from the
+// WM_GETTITLEBARINFOEX message. It will return an empirically determined
+// offset until the window has been activated and the message returns
+// valid rectangles.
+int MinimizeButtonMetrics::GetButtonBoundsPositionOffset(
+    const RECT& button_bounds,
+    const RECT& window_bounds) const {
+  if (button_bounds_position_offset_ == kInvalidOffset) {
+    if (!was_activated_)
+      return GetDefaultButtonBoundsOffset();
+    TITLEBARINFOEX info = {0};
+    info.cbSize = sizeof(info);
+    SendMessage(hwnd_, WM_GETTITLEBARINFOEX, 0,
+                reinterpret_cast<LPARAM>(&info));
+    if (info.rgrect[2].right == info.rgrect[2].left ||
+        (info.rgstate[2] & (STATE_SYSTEM_INVISIBLE | STATE_SYSTEM_OFFSCREEN |
+                            STATE_SYSTEM_UNAVAILABLE)))
+      return GetDefaultButtonBoundsOffset();
+    button_bounds_position_offset_ =
+        info.rgrect[2].left - (button_bounds.left + window_bounds.left);
+  }
+  return button_bounds_position_offset_;
+}
+
+int MinimizeButtonMetrics::GetMinimizeButtonOffsetForWindow() const {
+  bool dwm_button_pos = false;
+  POINT minimize_button_corner = {0};
+  RECT button_bounds = {0};
+  if (SUCCEEDED(DwmGetWindowAttribute(hwnd_, DWMWA_CAPTION_BUTTON_BOUNDS,
+                                      &button_bounds, sizeof(button_bounds)))) {
+    if (button_bounds.left != button_bounds.right) {
+      // This converts the button coordinate into screen coordinates
+      // thus, ensuring that the identity switcher is placed in the
+      // same location as before. An additional constant is added because
+      // there is a difference between the caption button bounds and
+      // the values obtained through WM_GETTITLEBARINFOEX. This difference
+      // varies between OS versions, and no metric describing this difference
+      // has been located.
+      RECT window_bounds = {0};
+      if (GetWindowRect(hwnd_, &window_bounds)) {
+        int offset =
+            GetButtonBoundsPositionOffset(button_bounds, window_bounds);
+        minimize_button_corner = {
+            button_bounds.left + window_bounds.left + offset, 0};
+        dwm_button_pos = true;
+      }
+    }
+  }
+  if (!dwm_button_pos) {
+    // Fallback to using the message for the titlebar info only if the above
+    // code fails. It can fail if DWM is disabled globally or only for the
+    // given HWND. The WM_GETTITLEBARINFOEX message can fail if we are not
+    // active/visible. By fail we get a location of 0; the return status
+    // code is always the same and similarly the state never seems to change
+    // (titlebar_info.rgstate).
+    TITLEBARINFOEX titlebar_info = {0};
+    titlebar_info.cbSize = sizeof(TITLEBARINFOEX);
+    SendMessage(hwnd_, WM_GETTITLEBARINFOEX, 0,
+                reinterpret_cast<WPARAM>(&titlebar_info));
+
+    // Under DWM WM_GETTITLEBARINFOEX won't return the right thing until after
+    // WM_NCACTIVATE (maybe it returns classic values?). In an attempt to
+    // return a consistant value we cache the last value across instances and
+    // use it until we get the activate.
+    if (titlebar_info.rgrect[2].left == titlebar_info.rgrect[2].right ||
+        (titlebar_info.rgstate[2] &
+         (STATE_SYSTEM_INVISIBLE | STATE_SYSTEM_OFFSCREEN |
+          STATE_SYSTEM_UNAVAILABLE)))
+      return 0;
+    minimize_button_corner = {titlebar_info.rgrect[2].left, 0};
+  }
+
+  // WM_GETTITLEBARINFOEX returns rects in screen coordinates in pixels.
+  // DWMNA_CAPTION_BUTTON_BOUNDS is in window (not client) coordinates,
+  // but it has been converted to screen coordinates above. We need to
+  // convert the minimize button corner offset to DIP before returning it.
+  MapWindowPoints(HWND_DESKTOP, hwnd_, &minimize_button_corner, 1);
+  gfx::Point pixel_point = {minimize_button_corner.x, 0};
+  gfx::Point dip_point = ScreenWin::ClientToDIPPoint(hwnd_, pixel_point);
+  return dip_point.x();
+}
+
 int MinimizeButtonMetrics::GetMinimizeButtonOffsetX() const {
   // Under DWM WM_GETTITLEBARINFOEX won't return the right thing until after
   // WM_NCACTIVATE (maybe it returns classic values?). In an attempt to return a
@@ -87,7 +174,7 @@
 }
 
 int MinimizeButtonMetrics::GetAndCacheMinimizeButtonOffsetX() const {
-  const int minimize_button_offset = GetMinimizeButtonOffsetForWindow(hwnd_);
+  const int minimize_button_offset = GetMinimizeButtonOffsetForWindow();
   if (minimize_button_offset <= 0)
     return 0;
 
diff --git a/chrome/browser/ui/views/frame/minimize_button_metrics_win.h b/chrome/browser/ui/views/frame/minimize_button_metrics_win.h
index 0b331cbe..c3a6d3f3 100644
--- a/chrome/browser/ui/views/frame/minimize_button_metrics_win.h
+++ b/chrome/browser/ui/views/frame/minimize_button_metrics_win.h
@@ -33,6 +33,11 @@
   // Gets the value for GetMinimizeButtonOffsetX(), caching if found.
   int GetAndCacheMinimizeButtonOffsetX() const;
 
+  int GetButtonBoundsPositionOffset(const RECT& button_bounds,
+                                    const RECT& window_bounds) const;
+
+  int GetMinimizeButtonOffsetForWindow() const;
+
   HWND hwnd_;
 
   // Cached offset of the minimize button. If RTL this is the location of the
@@ -43,6 +48,10 @@
   // Static cache of |cached_minimize_button_x_delta_|.
   static int last_cached_minimize_button_x_delta_;
 
+  // Static cache of offset value representing the different between
+  // DWMWA_CAPTION_BUTTON_BOUNDS and WM_GETTITLEBARINFOEX
+  static int button_bounds_position_offset_;
+
   // Has OnHWNDActivated() been invoked?
   bool was_activated_;
 
diff --git a/chrome/browser/ui/views/infobars/legacy_infobars_mac.cc b/chrome/browser/ui/views/infobars/legacy_infobars_mac.cc
index c2078cb..9a54f1b0 100644
--- a/chrome/browser/ui/views/infobars/legacy_infobars_mac.cc
+++ b/chrome/browser/ui/views/infobars/legacy_infobars_mac.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "chrome/browser/translate/chrome_translate_client.h"
+#include "components/infobars/core/infobar.h"
 
 // On Mac, some infobars are still used that have been migrated to a bubble UI
 // on other views platforms. When building the toolkit-views browser window on
diff --git a/chrome/browser/ui/views/toolbar/app_menu.cc b/chrome/browser/ui/views/toolbar/app_menu.cc
index 6e6adf43f..0d52854 100644
--- a/chrome/browser/ui/views/toolbar/app_menu.cc
+++ b/chrome/browser/ui/views/toolbar/app_menu.cc
@@ -44,6 +44,7 @@
 #include "grit/theme_resources.h"
 #include "third_party/skia/include/core/SkCanvas.h"
 #include "third_party/skia/include/core/SkPaint.h"
+#include "ui/accessibility/ax_view_state.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/layout.h"
 #include "ui/base/material_design/material_design_controller.h"
@@ -122,6 +123,11 @@
     return pref;
   }
 
+  void GetAccessibleState(ui::AXViewState* state) override {
+    ImageButton::GetAccessibleState(state);
+    state->role = ui::AX_ROLE_MENU_ITEM;
+  }
+
  private:
   DISALLOW_COPY_AND_ASSIGN(FullscreenButton);
 };
@@ -301,6 +307,11 @@
     in_menu_background_->SetOtherButtons(left, right);
   }
 
+  void GetAccessibleState(ui::AXViewState* state) override {
+    LabelButton::GetAccessibleState(state);
+    state->role = ui::AX_ROLE_MENU_ITEM;
+  }
+
   // views::LabelButton
   void OnNativeThemeChanged(const ui::NativeTheme* theme) override {
     if (theme) {
diff --git a/chrome/browser/ui/webui/options/browser_options_handler.cc b/chrome/browser/ui/webui/options/browser_options_handler.cc
index 5a480faf..c665f6f 100644
--- a/chrome/browser/ui/webui/options/browser_options_handler.cc
+++ b/chrome/browser/ui/webui/options/browser_options_handler.cc
@@ -1390,7 +1390,9 @@
     return;
   }
 
-  webui::DeleteProfileAtPath(file_path, web_ui());
+  webui::DeleteProfileAtPath(file_path,
+                             web_ui(),
+                             ProfileMetrics::DELETE_PROFILE_SETTINGS);
 }
 
 void BrowserOptionsHandler::ObserveThemeChanged() {
diff --git a/chrome/browser/ui/webui/options/create_profile_handler.cc b/chrome/browser/ui/webui/options/create_profile_handler.cc
index 6c748915..85aebd7 100644
--- a/chrome/browser/ui/webui/options/create_profile_handler.cc
+++ b/chrome/browser/ui/webui/options/create_profile_handler.cc
@@ -232,8 +232,11 @@
       GetJavascriptMethodName(PROFILE_CREATION_ERROR),
       base::StringValue(error));
   // The ProfileManager calls us back with a NULL profile in some cases.
-  if (profile)
-    webui::DeleteProfileAtPath(profile->GetPath(), web_ui());
+  if (profile) {
+    webui::DeleteProfileAtPath(profile->GetPath(),
+                               web_ui(),
+                               ProfileMetrics::DELETE_PROFILE_SETTINGS);
+  }
 }
 
 void CreateProfileHandler::RecordProfileCreationMetrics(
@@ -374,7 +377,9 @@
   // Cancelling registration means the callback passed into
   // RegisterAndInitSync() won't be called, so the cleanup must be done here.
   profile_path_being_created_.clear();
-  webui::DeleteProfileAtPath(new_profile->GetPath(), web_ui());
+  webui::DeleteProfileAtPath(new_profile->GetPath(),
+                             web_ui(),
+                             ProfileMetrics::DELETE_PROFILE_SETTINGS);
 }
 
 void CreateProfileHandler::RegisterSupervisedUser(
diff --git a/chrome/browser/ui/webui/options/sync_setup_handler.cc b/chrome/browser/ui/webui/options/sync_setup_handler.cc
index df44143..716aace 100644
--- a/chrome/browser/ui/webui/options/sync_setup_handler.cc
+++ b/chrome/browser/ui/webui/options/sync_setup_handler.cc
@@ -668,7 +668,9 @@
 
   if (delete_profile) {
     // Do as BrowserOptionsHandler::DeleteProfile().
-    webui::DeleteProfileAtPath(GetProfile()->GetPath(), web_ui());
+    webui::DeleteProfileAtPath(GetProfile()->GetPath(),
+                               web_ui(),
+                               ProfileMetrics::DELETE_PROFILE_SETTINGS);
   }
 }
 #endif
diff --git a/chrome/browser/ui/webui/plugins/plugins.mojom b/chrome/browser/ui/webui/plugins/plugins.mojom
index 6e1ceb9..12efc00 100644
--- a/chrome/browser/ui/webui/plugins/plugins.mojom
+++ b/chrome/browser/ui/webui/plugins/plugins.mojom
@@ -33,16 +33,16 @@
   array<PluginFile> plugin_files;
 };
 
-interface PluginsHandlerMojo {
+interface PluginsPageHandler {
   GetPluginsData() => (array<PluginData> plugins);
   GetShowDetails() => (bool show_details);
   SaveShowDetailsToPrefs(bool details_mode);
   SetPluginAlwaysAllowed(string plugin, bool allowed);
   SetPluginEnabled(string plugin_path, bool enable);
   SetPluginGroupEnabled(string group_name, bool enable);
-  SetClientPage(PluginsPageMojo page);
+  SetClientPage(PluginsPage page);
 };
 
-interface PluginsPageMojo {
+interface PluginsPage {
   OnPluginsUpdated(array<PluginData> plugins);
 };
diff --git a/chrome/browser/ui/webui/plugins/plugins_handler.cc b/chrome/browser/ui/webui/plugins/plugins_handler.cc
index 5a33d4e..29c3ebf 100644
--- a/chrome/browser/ui/webui/plugins/plugins_handler.cc
+++ b/chrome/browser/ui/webui/plugins/plugins_handler.cc
@@ -102,9 +102,9 @@
 
 }  // namespace
 
-PluginsHandler::PluginsHandler(
+PluginsPageHandler::PluginsPageHandler(
     content::WebUI* web_ui,
-    mojo::InterfaceRequest<mojom::PluginsHandlerMojo> request)
+    mojo::InterfaceRequest<mojom::PluginsPageHandler> request)
     : web_ui_(web_ui),
       binding_(this, std::move(request)),
       weak_ptr_factory_(this) {
@@ -116,10 +116,10 @@
                  content::Source<Profile>(profile));
 }
 
-PluginsHandler::~PluginsHandler() {}
+PluginsPageHandler::~PluginsPageHandler() {}
 
-void PluginsHandler::SetPluginEnabled(const mojo::String& plugin_path,
-                                      bool enable) {
+void PluginsPageHandler::SetPluginEnabled(const mojo::String& plugin_path,
+                                          bool enable) {
   Profile* profile = Profile::FromWebUI(web_ui_);
   PluginPrefs* plugin_prefs = PluginPrefs::GetForProfile(profile).get();
   plugin_prefs->EnablePlugin(
@@ -127,8 +127,8 @@
       base::Bind(&AssertPluginEnabled));
 }
 
-void PluginsHandler::SetPluginGroupEnabled(const mojo::String& group_name,
-                                           bool enable) {
+void PluginsPageHandler::SetPluginGroupEnabled(const mojo::String& group_name,
+                                               bool enable) {
   Profile* profile = Profile::FromWebUI(web_ui_);
   PluginPrefs* plugin_prefs = PluginPrefs::GetForProfile(profile).get();
   base::string16 group_name_as_string16 = group_name.To<base::string16>();
@@ -148,16 +148,17 @@
     plugin_prefs->EnablePluginGroup(false, adobereader);
 }
 
-void PluginsHandler::GetShowDetails(const GetShowDetailsCallback& callback) {
+void PluginsPageHandler::GetShowDetails(
+    const GetShowDetailsCallback& callback) {
   callback.Run(show_details_.GetValue());
 }
 
-void PluginsHandler::SaveShowDetailsToPrefs(bool details_mode) {
+void PluginsPageHandler::SaveShowDetailsToPrefs(bool details_mode) {
   show_details_.SetValue(details_mode);
 }
 
-void PluginsHandler::SetPluginAlwaysAllowed(const mojo::String& plugin,
-                                            bool allowed) {
+void PluginsPageHandler::SetPluginAlwaysAllowed(const mojo::String& plugin,
+                                                bool allowed) {
   Profile* profile = Profile::FromWebUI(web_ui_);
   HostContentSettingsMapFactory::GetForProfile(profile)
       ->SetContentSettingCustomScope(
@@ -173,44 +174,46 @@
   update->SetBoolean(plugin, allowed);
 }
 
-void PluginsHandler::GetPluginsData(const GetPluginsDataCallback& callback) {
+void PluginsPageHandler::GetPluginsData(
+    const GetPluginsDataCallback& callback) {
   if (weak_ptr_factory_.HasWeakPtrs())
     return;
 
   content::PluginService::GetInstance()->GetPlugins(
-      base::Bind(&PluginsHandler::RespondWithPluginsData,
+      base::Bind(&PluginsPageHandler::RespondWithPluginsData,
                  weak_ptr_factory_.GetWeakPtr(), callback));
 }
 
-void PluginsHandler::SetClientPage(mojom::PluginsPageMojoPtr page) {
+void PluginsPageHandler::SetClientPage(mojom::PluginsPagePtr page) {
   page_ = std::move(page);
 }
 
-void PluginsHandler::Observe(int type,
-                             const content::NotificationSource& source,
-                             const content::NotificationDetails& details) {
+void PluginsPageHandler::Observe(int type,
+                                 const content::NotificationSource& source,
+                                 const content::NotificationDetails& details) {
   DCHECK_EQ(chrome::NOTIFICATION_PLUGIN_ENABLE_STATUS_CHANGED, type);
 
   if (weak_ptr_factory_.HasWeakPtrs())
     return;
 
-  content::PluginService::GetInstance()->GetPlugins(base::Bind(
-      &PluginsHandler::NotifyWithPluginsData, weak_ptr_factory_.GetWeakPtr()));
+  content::PluginService::GetInstance()->GetPlugins(
+      base::Bind(&PluginsPageHandler::NotifyWithPluginsData,
+                 weak_ptr_factory_.GetWeakPtr()));
 }
 
-void PluginsHandler::RespondWithPluginsData(
+void PluginsPageHandler::RespondWithPluginsData(
     const GetPluginsDataCallback& callback,
     const std::vector<WebPluginInfo>& plugins) {
   callback.Run(GeneratePluginsData(plugins));
 }
 
-void PluginsHandler::NotifyWithPluginsData(
+void PluginsPageHandler::NotifyWithPluginsData(
     const std::vector<WebPluginInfo>& plugins) {
   if (page_)
     page_->OnPluginsUpdated(GeneratePluginsData(plugins));
 }
 
-mojo::Array<mojom::PluginDataPtr> PluginsHandler::GeneratePluginsData(
+mojo::Array<mojom::PluginDataPtr> PluginsPageHandler::GeneratePluginsData(
     const std::vector<WebPluginInfo>& plugins) {
   Profile* profile = Profile::FromWebUI(web_ui_);
   PluginPrefs* plugin_prefs = PluginPrefs::GetForProfile(profile).get();
@@ -291,7 +294,7 @@
   return plugins_data;
 }
 
-mojom::PluginFilePtr PluginsHandler::GeneratePluginFile(
+mojom::PluginFilePtr PluginsPageHandler::GeneratePluginFile(
     const WebPluginInfo& plugin,
     const base::string16& group_name,
     bool plugin_enabled) const {
@@ -308,7 +311,7 @@
   return plugin_file;
 }
 
-std::string PluginsHandler::GetPluginEnabledMode(
+std::string PluginsPageHandler::GetPluginEnabledMode(
     const base::string16& plugin_name,
     const base::string16& group_name,
     bool plugin_enabled) const {
@@ -330,7 +333,7 @@
   return plugin_enabled ? "enabledByUser" : "disabledByUser";
 }
 
-std::string PluginsHandler::GetPluginGroupEnabledMode(
+std::string PluginsPageHandler::GetPluginGroupEnabledMode(
     const mojo::Array<mojom::PluginFilePtr>& plugin_files,
     bool group_enabled) const {
   bool plugins_enabled_by_policy = true;
diff --git a/chrome/browser/ui/webui/plugins/plugins_handler.h b/chrome/browser/ui/webui/plugins/plugins_handler.h
index f09ab93..45055d3f 100644
--- a/chrome/browser/ui/webui/plugins/plugins_handler.h
+++ b/chrome/browser/ui/webui/plugins/plugins_handler.h
@@ -17,15 +17,15 @@
 #include "content/public/common/webplugininfo.h"
 #include "mojo/public/cpp/bindings/binding.h"
 
-class PluginsHandler : public MojoWebUIHandler,
-                       public mojom::PluginsHandlerMojo,
-                       public content::NotificationObserver {
+class PluginsPageHandler : public MojoWebUIHandler,
+                           public mojom::PluginsPageHandler,
+                           public content::NotificationObserver {
  public:
-  PluginsHandler(content::WebUI* web_ui,
-                 mojo::InterfaceRequest<mojom::PluginsHandlerMojo> request);
-  ~PluginsHandler() override;
+  PluginsPageHandler(content::WebUI* web_ui,
+                     mojo::InterfaceRequest<mojom::PluginsPageHandler> request);
+  ~PluginsPageHandler() override;
 
-  // mojom::PluginsHandlerMojo overrides:
+  // mojom::PluginsPageHandler overrides:
   void GetPluginsData(const GetPluginsDataCallback& callback) override;
   void GetShowDetails(const GetShowDetailsCallback& callback) override;
   void SaveShowDetailsToPrefs(bool details_mode) override;
@@ -34,7 +34,7 @@
   void SetPluginEnabled(const mojo::String& plugin_path, bool enable) override;
   void SetPluginGroupEnabled(const mojo::String& group_name,
                              bool enable) override;
-  void SetClientPage(mojom::PluginsPageMojoPtr page) override;
+  void SetClientPage(mojom::PluginsPagePtr page) override;
 
   // content::NotificationObserver implementation.
   void Observe(int type,
@@ -81,14 +81,14 @@
   // Owned by RenderFrameHostImpl.
   content::WebUI* web_ui_;
 
-  mojo::Binding<mojom::PluginsHandlerMojo> binding_;
+  mojo::Binding<mojom::PluginsPageHandler> binding_;
 
   // Handle back to the page by which JS methods can be called.
-  mojom::PluginsPageMojoPtr page_;
+  mojom::PluginsPagePtr page_;
 
-  base::WeakPtrFactory<PluginsHandler> weak_ptr_factory_;
+  base::WeakPtrFactory<PluginsPageHandler> weak_ptr_factory_;
 
-  DISALLOW_COPY_AND_ASSIGN(PluginsHandler);
+  DISALLOW_COPY_AND_ASSIGN(PluginsPageHandler);
 };
 
 #endif  // CHROME_BROWSER_UI_WEBUI_PLUGINS_PLUGINS_HANDLER_H_
diff --git a/chrome/browser/ui/webui/plugins/plugins_ui.cc b/chrome/browser/ui/webui/plugins/plugins_ui.cc
index 8c1cae9d..c6d0f18 100644
--- a/chrome/browser/ui/webui/plugins/plugins_ui.cc
+++ b/chrome/browser/ui/webui/plugins/plugins_ui.cc
@@ -102,6 +102,6 @@
 }
 
 void PluginsUI::BindUIHandler(
-    mojo::InterfaceRequest<mojom::PluginsHandlerMojo> request) {
-  plugins_handler_.reset(new PluginsHandler(web_ui(), std::move(request)));
+    mojo::InterfaceRequest<mojom::PluginsPageHandler> request) {
+  plugins_handler_.reset(new PluginsPageHandler(web_ui(), std::move(request)));
 }
diff --git a/chrome/browser/ui/webui/plugins/plugins_ui.h b/chrome/browser/ui/webui/plugins/plugins_ui.h
index df40eed4..f2fc5f1 100644
--- a/chrome/browser/ui/webui/plugins/plugins_ui.h
+++ b/chrome/browser/ui/webui/plugins/plugins_ui.h
@@ -18,9 +18,9 @@
 class PrefRegistrySyncable;
 }
 
-class PluginsHandler;
+class PluginsPageHandler;
 
-class PluginsUI : public MojoWebUIController<mojom::PluginsHandlerMojo> {
+class PluginsUI : public MojoWebUIController<mojom::PluginsPageHandler> {
  public:
   explicit PluginsUI(content::WebUI* web_ui);
   ~PluginsUI() override;
@@ -32,9 +32,9 @@
  private:
   // MojoWebUIController overrides:
   void BindUIHandler(
-      mojo::InterfaceRequest<mojom::PluginsHandlerMojo> request) override;
+      mojo::InterfaceRequest<mojom::PluginsPageHandler> request) override;
 
-  std::unique_ptr<PluginsHandler> plugins_handler_;
+  std::unique_ptr<PluginsPageHandler> plugins_handler_;
 
   DISALLOW_COPY_AND_ASSIGN(PluginsUI);
 };
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
index 5068fb08..69eb8873 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
@@ -309,7 +309,7 @@
   DCHECK_CURRENTLY_ON(BrowserThread::FILE);
 
   scoped_refptr<printing::PrintBackend> print_backend(
-      printing::PrintBackend::CreateInstance(NULL));
+      printing::PrintBackend::CreateInstance(nullptr));
 
   std::string default_printer = print_backend->GetDefaultPrinterName();
   VLOG(1) << "Default Printer: " << default_printer;
@@ -341,12 +341,9 @@
                    pdf_media_size.height() * deviceMicronsPerDeviceUnit);
 }
 
-typedef base::Callback<void(const base::DictionaryValue*)>
-    GetPdfCapabilitiesCallback;
-
-std::unique_ptr<base::DictionaryValue> GetPdfCapabilitiesOnFileThread(
+std::unique_ptr<base::DictionaryValue> GetPdfCapabilities(
     const std::string& locale) {
-  DCHECK_CURRENTLY_ON(BrowserThread::FILE);
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   cloud_devices::CloudDeviceDescription description;
   using namespace cloud_devices::printer;
@@ -396,117 +393,103 @@
   return std::unique_ptr<base::DictionaryValue>(description.root().DeepCopy());
 }
 
-std::unique_ptr<base::DictionaryValue> GetLocalPrinterCapabilitiesOnFileThread(
-    const std::string& printer_name) {
-  DCHECK_CURRENTLY_ON(BrowserThread::FILE);
-
-  scoped_refptr<printing::PrintBackend> print_backend(
-      printing::PrintBackend::CreateInstance(NULL));
-
-  VLOG(1) << "Get printer capabilities start for " << printer_name;
-  crash_keys::ScopedPrinterInfo crash_key(
-      print_backend->GetPrinterDriverInfo(printer_name));
-
-  if (!print_backend->IsValidPrinter(printer_name)) {
-    LOG(WARNING) << "Invalid printer " << printer_name;
-    return std::unique_ptr<base::DictionaryValue>();
-  }
-
-  printing::PrinterSemanticCapsAndDefaults info;
-  if (!print_backend->GetPrinterSemanticCapsAndDefaults(printer_name, &info)) {
-    LOG(WARNING) << "Failed to get capabilities for " << printer_name;
-    return std::unique_ptr<base::DictionaryValue>();
-  }
-
-  std::unique_ptr<base::DictionaryValue> description(
-      cloud_print::PrinterSemanticCapsAndDefaultsToCdd(info));
-  if (!description) {
-    LOG(WARNING) << "Failed to convert capabilities for " << printer_name;
-    return std::unique_ptr<base::DictionaryValue>();
-  }
-
-  return description;
+std::pair<std::string, std::string> GetPrinterNameAndDescription(
+    const printing::PrinterBasicInfo& printer) {
+#if defined(OS_MACOSX)
+  // On Mac, |printer.printer_description| specifies the printer name and
+  // |printer.printer_name| specifies the device name / printer queue name.
+  const std::string& real_name = printer.printer_description;
+  std::string real_description;
+  const auto it = printer.options.find(kDriverNameTagName);
+  if (it != printer.options.end())
+    real_description = it->second;
+  return std::make_pair(real_name, real_description);
+#else
+  return std::make_pair(printer.printer_name, printer.printer_description);
+#endif
 }
 
 void EnumeratePrintersOnFileThread(base::ListValue* printers) {
   DCHECK_CURRENTLY_ON(BrowserThread::FILE);
 
   scoped_refptr<printing::PrintBackend> print_backend(
-      printing::PrintBackend::CreateInstance(NULL));
+      printing::PrintBackend::CreateInstance(nullptr));
 
   VLOG(1) << "Enumerate printers start";
   printing::PrinterList printer_list;
   print_backend->EnumeratePrinters(&printer_list);
 
-  for (printing::PrinterList::iterator it = printer_list.begin();
-       it != printer_list.end(); ++it) {
+  for (const printing::PrinterBasicInfo& printer : printer_list) {
     base::DictionaryValue* printer_info = new base::DictionaryValue;
     printers->Append(printer_info);
-    std::string printer_name;
-    std::string printer_description;
-#if defined(OS_MACOSX)
-    // On Mac, |it->printer_description| specifies the printer name and
-    // |it->printer_name| specifies the device name / printer queue name.
-    printer_name = it->printer_description;
-    if (!it->options[kDriverNameTagName].empty())
-      printer_description = it->options[kDriverNameTagName];
-#else
-    printer_name = it->printer_name;
-    printer_description = it->printer_description;
-#endif
-    printer_info->SetString(printing::kSettingDeviceName, it->printer_name);
+
+    const auto printer_name_description = GetPrinterNameAndDescription(printer);
+    const std::string& printer_name = printer_name_description.first;
+    const std::string& printer_description = printer_name_description.second;
+    printer_info->SetString(printing::kSettingDeviceName, printer.printer_name);
+    printer_info->SetString(printing::kSettingPrinterName, printer_name);
     printer_info->SetString(printing::kSettingPrinterDescription,
                             printer_description);
-    printer_info->SetString(printing::kSettingPrinterName, printer_name);
-    VLOG(1) << "Found printer " << printer_name
-            << " with device name " << it->printer_name;
 
     base::DictionaryValue* options = new base::DictionaryValue;
     printer_info->Set(printing::kSettingPrinterOptions, options);
-    for (std::map<std::string, std::string>::iterator opt = it->options.begin();
-         opt != it->options.end();
-         ++opt) {
-      options->SetString(opt->first, opt->second);
-    }
+    for (const auto opt_it : printer.options)
+      options->SetString(opt_it.first, opt_it.second);
 
     VLOG(1) << "Found printer " << printer_name << " with device name "
-            << it->printer_name;
+            << printer.printer_name;
   }
   VLOG(1) << "Enumerate printers finished, found " << printers->GetSize()
           << " printers";
 }
 
-typedef base::Callback<void(const base::DictionaryValue*)>
-    GetPrinterCapabilitiesSuccessCallback;
-typedef base::Callback<void(const std::string&)>
-    GetPrinterCapabilitiesFailureCallback;
-
-void GetPrinterCapabilitiesOnFileThread(
-    const std::string& printer_name,
-    const std::string& locale,
-    const GetPrinterCapabilitiesSuccessCallback& success_cb,
-    const GetPrinterCapabilitiesFailureCallback& failure_cb) {
+std::unique_ptr<base::DictionaryValue> GetPrinterCapabilitiesOnFileThread(
+    const std::string& device_name) {
   DCHECK_CURRENTLY_ON(BrowserThread::FILE);
-  DCHECK(!printer_name.empty());
+  DCHECK(!device_name.empty());
 
-  std::unique_ptr<base::DictionaryValue> printer_capabilities(
-      printer_name == kLocalPdfPrinterId
-          ? GetPdfCapabilitiesOnFileThread(locale)
-          : GetLocalPrinterCapabilitiesOnFileThread(printer_name));
-  if (!printer_capabilities) {
-    BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
-                            base::Bind(failure_cb, printer_name));
-    return;
+  scoped_refptr<printing::PrintBackend> print_backend(
+      printing::PrintBackend::CreateInstance(nullptr));
+
+  VLOG(1) << "Get printer capabilities start for " << device_name;
+  crash_keys::ScopedPrinterInfo crash_key(
+      print_backend->GetPrinterDriverInfo(device_name));
+
+  std::unique_ptr<base::DictionaryValue> printer_info;
+  if (!print_backend->IsValidPrinter(device_name)) {
+    LOG(WARNING) << "Invalid printer " << device_name;
+    return printer_info;
   }
 
-  std::unique_ptr<base::DictionaryValue> printer_info(
-      new base::DictionaryValue);
-  printer_info->SetString(kPrinterId, printer_name);
-  printer_info->Set(kPrinterCapabilities, printer_capabilities.release());
+  printing::PrinterSemanticCapsAndDefaults info;
+  if (!print_backend->GetPrinterSemanticCapsAndDefaults(device_name, &info)) {
+    LOG(WARNING) << "Failed to get capabilities for " << device_name;
+    return printer_info;
+  }
 
-  BrowserThread::PostTask(
-      BrowserThread::UI, FROM_HERE,
-      base::Bind(success_cb, base::Owned(printer_info.release())));
+  std::unique_ptr<base::DictionaryValue> printer_capabilities =
+      cloud_print::PrinterSemanticCapsAndDefaultsToCdd(info);
+  if (!printer_capabilities) {
+    LOG(WARNING) << "Failed to convert capabilities for " << device_name;
+    return printer_info;
+  }
+
+  printing::PrinterBasicInfo basic_info;
+  if (!print_backend->GetPrinterBasicInfo(device_name, &basic_info))
+    return printer_info;
+
+  const auto printer_name_description =
+      GetPrinterNameAndDescription(basic_info);
+  const std::string& printer_name = printer_name_description.first;
+  const std::string& printer_description = printer_name_description.second;
+
+  printer_info.reset(new base::DictionaryValue);
+  printer_info->SetString(kPrinterId, device_name);
+  printer_info->SetString(printing::kSettingPrinterName, printer_name);
+  printer_info->SetString(printing::kSettingPrinterDescription,
+                          printer_description);
+  printer_info->Set(kPrinterCapabilities, printer_capabilities.release());
+  return printer_info;
 }
 
 base::LazyInstance<printing::StickySettings> g_sticky_settings =
@@ -1120,17 +1103,22 @@
   if (!ret || printer_name.empty())
     return;
 
-  GetPrinterCapabilitiesSuccessCallback success_cb =
+  if (printer_name == kLocalPdfPrinterId) {
+    std::unique_ptr<base::DictionaryValue> printer_info(
+        new base::DictionaryValue);
+    printer_info->SetString(kPrinterId, printer_name);
+    printer_info->Set(
+        kPrinterCapabilities,
+        GetPdfCapabilities(g_browser_process->GetApplicationLocale()));
+    SendPrinterCapabilities(printer_name, std::move(printer_info));
+    return;
+  }
+
+  BrowserThread::PostTaskAndReplyWithResult(
+      BrowserThread::FILE, FROM_HERE,
+      base::Bind(&GetPrinterCapabilitiesOnFileThread, printer_name),
       base::Bind(&PrintPreviewHandler::SendPrinterCapabilities,
-                 weak_factory_.GetWeakPtr());
-  GetPrinterCapabilitiesFailureCallback failure_cb =
-      base::Bind(&PrintPreviewHandler::SendFailedToGetPrinterCapabilities,
-                 weak_factory_.GetWeakPtr());
-  BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
-                          base::Bind(&GetPrinterCapabilitiesOnFileThread,
-                                     printer_name,
-                                     g_browser_process->GetApplicationLocale(),
-                                     success_cb, failure_cb));
+                 weak_factory_.GetWeakPtr(), printer_name));
 }
 
 void PrintPreviewHandler::OnSigninComplete() {
@@ -1245,7 +1233,7 @@
 
 void PrintPreviewHandler::HandleGetInitialSettings(
     const base::ListValue* /*args*/) {
-  // Send before SendInitialSettings to allow cloud printer auto select.
+  // Send before SendInitialSettings() to allow cloud printer auto select.
   SendCloudPrintEnabled();
   BrowserThread::PostTaskAndReplyWithResult(
       BrowserThread::FILE, FROM_HERE,
@@ -1324,20 +1312,19 @@
 }
 
 void PrintPreviewHandler::SendPrinterCapabilities(
-    const base::DictionaryValue* settings_info) {
+    const std::string& printer_name,
+    std::unique_ptr<base::DictionaryValue> settings_info) {
+  if (!settings_info) {
+    VLOG(1) << "Get printer capabilities failed";
+    web_ui()->CallJavascriptFunction("failedToGetPrinterCapabilities",
+                                     base::StringValue(printer_name));
+    return;
+  }
   VLOG(1) << "Get printer capabilities finished";
   web_ui()->CallJavascriptFunction("updateWithPrinterCapabilities",
                                    *settings_info);
 }
 
-void PrintPreviewHandler::SendFailedToGetPrinterCapabilities(
-    const std::string& printer_name) {
-  VLOG(1) << "Get printer capabilities failed";
-  base::StringValue printer_name_value(printer_name);
-  web_ui()->CallJavascriptFunction("failedToGetPrinterCapabilities",
-                                   printer_name_value);
-}
-
 void PrintPreviewHandler::SetupPrinterList(const base::ListValue* printers) {
   if (!has_logged_printers_count_) {
     UMA_HISTOGRAM_COUNTS("PrintPreview.NumberOfPrinters", printers->GetSize());
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.h b/chrome/browser/ui/webui/print_preview/print_preview_handler.h
index 878cb1ea..60d4278 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler.h
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.h
@@ -209,12 +209,11 @@
                        const std::string& access_token);
 
   // Sends the printer capabilities to the Web UI. |settings_info| contains
-  // printer capabilities information.
-  void SendPrinterCapabilities(const base::DictionaryValue* settings_info);
-
-  // Sends error notification to the Web UI when unable to return the printer
-  // capabilities.
-  void SendFailedToGetPrinterCapabilities(const std::string& printer_name);
+  // printer capabilities information. If |settings_info| is empty, sends
+  // error notification to the Web UI instead.
+  void SendPrinterCapabilities(
+      const std::string& printer_name,
+      std::unique_ptr<base::DictionaryValue> settings_info);
 
   // Send the list of printers to the Web UI.
   void SetupPrinterList(const base::ListValue* printers);
diff --git a/chrome/browser/ui/webui/profile_helper.cc b/chrome/browser/ui/webui/profile_helper.cc
index f350b96..d7a68816 100644
--- a/chrome/browser/ui/webui/profile_helper.cc
+++ b/chrome/browser/ui/webui/profile_helper.cc
@@ -26,16 +26,15 @@
       chrome::startup::IS_FIRST_RUN, false);
 }
 
-void DeleteProfileAtPath(base::FilePath file_path, content::WebUI* web_ui) {
+void DeleteProfileAtPath(base::FilePath file_path,
+                         content::WebUI* web_ui,
+                         ProfileMetrics::ProfileDelete deletion_source) {
   DCHECK(web_ui);
 
   if (!profiles::IsMultipleProfilesEnabled())
     return;
-
-  ProfileMetrics::LogProfileDeleteUser(ProfileMetrics::DELETE_PROFILE_SETTINGS);
-
-  g_browser_process->profile_manager()->ScheduleProfileForDeletion(
-      file_path, base::Bind(&OpenNewWindowForProfile));
+  g_browser_process->profile_manager()->MaybeScheduleProfileForDeletion(
+      file_path, base::Bind(&OpenNewWindowForProfile), deletion_source);
 }
 
 }  // namespace webui
diff --git a/chrome/browser/ui/webui/profile_helper.h b/chrome/browser/ui/webui/profile_helper.h
index a115f13..8467124c 100644
--- a/chrome/browser/ui/webui/profile_helper.h
+++ b/chrome/browser/ui/webui/profile_helper.h
@@ -17,7 +17,9 @@
 void OpenNewWindowForProfile(Profile* profile, Profile::CreateStatus status);
 
 // Deletes the profile at the given |file_path|.
-void DeleteProfileAtPath(base::FilePath file_path, content::WebUI* web_ui);
+void DeleteProfileAtPath(base::FilePath file_path,
+                         content::WebUI* web_ui,
+                         ProfileMetrics::ProfileDelete deletion_source);
 
 }  // namespace webui
 
diff --git a/chrome/browser/ui/webui/settings/people_handler.cc b/chrome/browser/ui/webui/settings/people_handler.cc
index 062915cc1..8dff9c7 100644
--- a/chrome/browser/ui/webui/settings/people_handler.cc
+++ b/chrome/browser/ui/webui/settings/people_handler.cc
@@ -185,9 +185,6 @@
       "SyncSetupShowSetupUI",
       base::Bind(&PeopleHandler::HandleShowSetupUI, base::Unretained(this)));
   web_ui()->RegisterMessageCallback(
-      "SyncSetupCloseTimeout",
-      base::Bind(&PeopleHandler::HandleCloseTimeout, base::Unretained(this)));
-  web_ui()->RegisterMessageCallback(
       "SyncSetupGetSyncStatus",
       base::Bind(&PeopleHandler::HandleGetSyncStatus, base::Unretained(this)));
   web_ui()->RegisterMessageCallback(
@@ -342,6 +339,7 @@
 }
 
 void PeopleHandler::OnDidClosePage(const base::ListValue* args) {
+  MarkFirstSetupComplete();
   CloseSyncSetup();
 }
 
@@ -393,7 +391,6 @@
 
   service->OnUserChoseDatatypes(configuration.sync_everything,
                                 configuration.data_types);
-  MarkFirstSetupComplete();
 
   // Choosing data types to sync never fails.
   ResolveJavascriptCallback(*callback_id,
@@ -472,7 +469,6 @@
     ResolveJavascriptCallback(*callback_id,
                               base::StringValue(kPassphraseFailedPageStatus));
   } else {
-    MarkFirstSetupComplete();
     ResolveJavascriptCallback(*callback_id,
                               base::StringValue(kConfigurePageStatus));
   }
@@ -549,15 +545,13 @@
 
   if (delete_profile) {
     // Do as BrowserOptionsHandler::DeleteProfile().
-    webui::DeleteProfileAtPath(profile_->GetPath(), web_ui());
+    webui::DeleteProfileAtPath(profile_->GetPath(),
+                               web_ui(),
+                               ProfileMetrics::DELETE_PROFILE_SETTINGS);
   }
 }
 #endif
 
-void PeopleHandler::HandleCloseTimeout(const base::ListValue* args) {
-  CloseSyncSetup();
-}
-
 void PeopleHandler::HandleGetSyncStatus(const base::ListValue* args) {
   AllowJavascript();
 
diff --git a/chrome/browser/ui/webui/settings/people_handler.h b/chrome/browser/ui/webui/settings/people_handler.h
index 2a0cbfbd..4a98df8 100644
--- a/chrome/browser/ui/webui/settings/people_handler.h
+++ b/chrome/browser/ui/webui/settings/people_handler.h
@@ -135,7 +135,6 @@
   void HandleDoSignOutOnAuthError(const base::ListValue* args);
   void HandleStartSignin(const base::ListValue* args);
   void HandleStopSyncing(const base::ListValue* args);
-  void HandleCloseTimeout(const base::ListValue* args);
   void HandleGetSyncStatus(const base::ListValue* args);
   void HandleManageOtherPeople(const base::ListValue* args);
 
diff --git a/chrome/browser/ui/webui/signin/signin_create_profile_handler.cc b/chrome/browser/ui/webui/signin/signin_create_profile_handler.cc
index 63c1ba59..0801e7e 100644
--- a/chrome/browser/ui/webui/signin/signin_create_profile_handler.cc
+++ b/chrome/browser/ui/webui/signin/signin_create_profile_handler.cc
@@ -430,8 +430,11 @@
                                    GetWebUIListenerName(PROFILE_CREATION_ERROR),
                                    base::StringValue(error));
   // The ProfileManager calls us back with a NULL profile in some cases.
-  if (profile)
-    webui::DeleteProfileAtPath(profile->GetPath(), web_ui());
+  if (profile) {
+    webui::DeleteProfileAtPath(profile->GetPath(),
+                               web_ui(),
+                               ProfileMetrics::DELETE_PROFILE_SETTINGS);
+  }
   profile_creation_type_ = NO_CREATION_IN_PROGRESS;
   profile_path_being_created_.clear();
 }
@@ -700,7 +703,9 @@
   // Canceling registration means the callback passed into
   // RegisterAndInitSync() won't be called, so the cleanup must be done here.
   profile_path_being_created_.clear();
-  webui::DeleteProfileAtPath(new_profile->GetPath(), web_ui());
+  webui::DeleteProfileAtPath(new_profile->GetPath(),
+                             web_ui(),
+                             ProfileMetrics::DELETE_PROFILE_SETTINGS);
 }
 
 void SigninCreateProfileHandler::RegisterSupervisedUser(
diff --git a/chrome/browser/ui/webui/signin/user_manager_screen_handler.cc b/chrome/browser/ui/webui/signin/user_manager_screen_handler.cc
index 31f29fa..9fef1a14 100644
--- a/chrome/browser/ui/webui/signin/user_manager_screen_handler.cc
+++ b/chrome/browser/ui/webui/signin/user_manager_screen_handler.cc
@@ -463,17 +463,13 @@
     return;
   }
 
-  if (!profiles::IsMultipleProfilesEnabled()) {
-    NOTREACHED();
-    return;
-  }
+  DCHECK(profiles::IsMultipleProfilesEnabled());
 
   // The callback is run if the only profile has been deleted, and a new
   // profile has been created to replace it.
-  g_browser_process->profile_manager()->ScheduleProfileForDeletion(
-      profile_path, base::Bind(&webui::OpenNewWindowForProfile));
-  ProfileMetrics::LogProfileDeleteUser(
-      ProfileMetrics::DELETE_PROFILE_USER_MANAGER);
+  webui::DeleteProfileAtPath(profile_path,
+                             web_ui(),
+                             ProfileMetrics::DELETE_PROFILE_USER_MANAGER);
 }
 
 void UserManagerScreenHandler::HandleLaunchGuest(const base::ListValue* args) {
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 36627062..319912d 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -2634,8 +2634,6 @@
       'browser/safe_browsing/incident_reporting/module_load_analyzer.cc',
       'browser/safe_browsing/incident_reporting/module_load_analyzer.h',
       'browser/safe_browsing/incident_reporting/module_load_analyzer_win.cc',
-      'browser/safe_browsing/incident_reporting/off_domain_inclusion_detector.cc',
-      'browser/safe_browsing/incident_reporting/off_domain_inclusion_detector.h',
       'browser/safe_browsing/incident_reporting/platform_state_store.cc',
       'browser/safe_browsing/incident_reporting/platform_state_store.h',
       'browser/safe_browsing/incident_reporting/platform_state_store_win.cc',
diff --git a/chrome/chrome_browser_ui.gypi b/chrome/chrome_browser_ui.gypi
index 1aa9407..b5b11594 100644
--- a/chrome/chrome_browser_ui.gypi
+++ b/chrome/chrome_browser_ui.gypi
@@ -2089,6 +2089,7 @@
       'browser/ui/views/exclusive_access_bubble_views.cc',
       'browser/ui/views/exclusive_access_bubble_views.h',
       'browser/ui/views/exclusive_access_bubble_views_context.h',
+      'browser/ui/views/extensions/extension_install_dialog_view.cc',
       'browser/ui/views/extensions/extension_keybinding_registry_views.cc',
       'browser/ui/views/extensions/extension_keybinding_registry_views.h',
       'browser/ui/views/frame/native_widget_mac_frameless_nswindow.h',
@@ -2490,7 +2491,6 @@
       'browser/ui/views/extensions/extension_dialog.h',
       'browser/ui/views/extensions/extension_dialog_observer.cc',
       'browser/ui/views/extensions/extension_dialog_observer.h',
-      'browser/ui/views/extensions/extension_install_dialog_view.cc',
       'browser/ui/views/extensions/extension_installed_bubble_view.cc',
       'browser/ui/views/extensions/extension_popup.cc',
       'browser/ui/views/extensions/extension_popup.h',
diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi
index c9039c2..2753e4a 100644
--- a/chrome/chrome_tests_unit.gypi
+++ b/chrome/chrome_tests_unit.gypi
@@ -710,6 +710,7 @@
       'browser/ui/ash/launcher/launcher_context_menu_unittest.cc',
       'browser/ui/ash/multi_user/multi_user_context_menu_chromeos_unittest.cc',
       'browser/ui/ash/multi_user/multi_user_notification_blocker_chromeos_unittest.cc',
+      'browser/ui/ash/multi_user/multi_user_util_chromeos_unittest.cc',
       'browser/ui/ash/multi_user/multi_user_window_manager_chromeos_unittest.cc',
       'browser/ui/ash/session_state_delegate_chromeos_unittest.cc',
       'browser/ui/ash/window_positioner_unittest.cc',
@@ -794,7 +795,6 @@
       'browser/safe_browsing/incident_reporting/module_integrity_unittest_util_win.h',
       'browser/safe_browsing/incident_reporting/module_integrity_verifier_win_unittest.cc',
       'browser/safe_browsing/incident_reporting/module_load_analyzer_win_unittest.cc',
-      'browser/safe_browsing/incident_reporting/off_domain_inclusion_detector_unittest.cc',
       'browser/safe_browsing/incident_reporting/platform_state_store_unittest.cc',
       'browser/safe_browsing/incident_reporting/platform_state_store_win_unittest.cc',
       'browser/safe_browsing/incident_reporting/preference_validation_delegate_unittest.cc',
diff --git a/chrome/common/chrome_paths.cc b/chrome/common/chrome_paths.cc
index c7462488e..cde69313 100644
--- a/chrome/common/chrome_paths.cc
+++ b/chrome/common/chrome_paths.cc
@@ -85,6 +85,25 @@
   return PathService::Get(base::DIR_MODULE, result);
 }
 
+// Gets the path for bundled implementations of components. Note that these
+// implementations should not be used if higher-versioned component-updated
+// implementations are available in DIR_USER_DATA.
+bool GetComponentDirectory(base::FilePath* result) {
+#if defined(OS_MACOSX)
+  // If called from Chrome, return the framework's Libraries directory.
+  if (base::mac::AmIBundled()) {
+    *result = chrome::GetFrameworkBundlePath();
+    DCHECK(!result->empty());
+    *result = result->Append("Libraries");
+    return true;
+  }
+// In tests, just look in the module directory (below).
+#endif
+
+  // The rest of the world expects components in the module directory.
+  return PathService::Get(base::DIR_MODULE, result);
+}
+
 #if defined(OS_WIN)
 // Gets the Pepper Flash path if installed on the system.
 bool GetSystemFlashFilename(base::FilePath* out_path) {
@@ -256,6 +275,10 @@
       if (!GetInternalPluginsDirectory(&cur))
         return false;
       break;
+    case chrome::DIR_COMPONENTS:
+      if (!GetComponentDirectory(&cur))
+        return false;
+      break;
     case chrome::DIR_PEPPER_FLASH_PLUGIN:
       if (!GetInternalPluginsDirectory(&cur))
         return false;
diff --git a/chrome/common/chrome_paths.h b/chrome/common/chrome_paths.h
index a0ed80f6..13762bd 100644
--- a/chrome/common/chrome_paths.h
+++ b/chrome/common/chrome_paths.h
@@ -40,6 +40,8 @@
                                 // "Downloads". (Linux)
   DIR_DEFAULT_DOWNLOADS,        // Directory for a user's downloads.
   DIR_INTERNAL_PLUGINS,         // Directory where internal plugins reside.
+  DIR_COMPONENTS,               // Directory where built-in implementations of
+                                // component-updated libraries or data reside.
 #if defined(OS_POSIX) && !defined(OS_MACOSX)
   DIR_POLICY_FILES,             // Directory for system-wide read-only
                                 // policy files that allow sys-admins
diff --git a/chrome/installer/setup/install_worker.cc b/chrome/installer/setup/install_worker.cc
index b717eb9..fd74265 100644
--- a/chrome/installer/setup/install_worker.cc
+++ b/chrome/installer/setup/install_worker.cc
@@ -32,6 +32,7 @@
 #include "chrome/common/chrome_switches.h"
 #include "chrome/installer/setup/app_launcher_installer.h"
 #include "chrome/installer/setup/install.h"
+#include "chrome/installer/setup/installer_metrics.h"
 #include "chrome/installer/setup/setup_constants.h"
 #include "chrome/installer/setup/setup_util.h"
 #include "chrome/installer/setup/update_active_setup_version_work_item.h"
@@ -1048,6 +1049,10 @@
   install_list->AddCreateDirWorkItem(temp_path);
   install_list->AddCreateDirWorkItem(target_path);
 
+  // Create the directory in which persistent metrics will be stored.
+  install_list->AddCreateDirWorkItem(
+      GetPersistentHistogramStorageDir(target_path));
+
   if (installer_state.FindProduct(BrowserDistribution::CHROME_BROWSER) ||
       installer_state.FindProduct(BrowserDistribution::CHROME_BINARIES)) {
     AddChromeWorkItems(original_state,
diff --git a/chrome/installer/setup/installer_metrics.cc b/chrome/installer/setup/installer_metrics.cc
index a603c18e..7cc3108 100644
--- a/chrome/installer/setup/installer_metrics.cc
+++ b/chrome/installer/setup/installer_metrics.cc
@@ -4,16 +4,86 @@
 
 #include "chrome/installer/setup/installer_metrics.h"
 
+#include <windows.h>  // NOLINT
+#include <atlsecurity.h>
+
+#include "base/files/file_enumerator.h"
 #include "base/files/file_path.h"
+#include "base/files/file_util.h"
 #include "base/files/important_file_writer.h"
 #include "base/metrics/histogram_base.h"
 #include "base/metrics/persistent_histogram_allocator.h"
 #include "base/metrics/persistent_memory_allocator.h"
 #include "base/strings/string_piece.h"
+#include "base/strings/stringprintf.h"
+#include "base/time/time.h"
 #include "chrome/installer/util/util_constants.h"
 
 namespace installer {
 
+namespace {
+
+// This is duplicated from components/metrics/file_metrics_provider.h which is
+// not accessible from setup code.
+const base::FilePath::CharType MetricsFileExtension[] =
+    FILE_PATH_LITERAL(".pma");
+
+// Add to the ACL of an object on disk. This follows the method from MSDN:
+// https://msdn.microsoft.com/en-us/library/windows/desktop/aa379283.aspx
+// This is done using explicit flags rather than the "security string" format
+// because strings do not necessarily read what is written which makes it
+// difficult to de-dup. Working with the binary format is always exact and
+// the system libraries will properly ignore duplicate ACL entries.
+bool AddAclToPath(const base::FilePath& path,
+                  const CSid& trustee,
+                  ACCESS_MASK access_mask,
+                  BYTE ace_flags) {
+  DCHECK(!path.empty());
+  DCHECK(trustee);
+
+  // Get the existing DACL.
+  ATL::CDacl dacl;
+  if (!ATL::AtlGetDacl(path.value().c_str(), SE_FILE_OBJECT, &dacl)) {
+    DPLOG(ERROR) << "Failed getting DACL for path \"" << path.value() << "\"";
+    return false;
+  }
+
+  // Check if the requested access already exists and return if so.
+  for (UINT i = 0; i < dacl.GetAceCount(); ++i) {
+    ATL::CSid sid;
+    ACCESS_MASK mask = 0;
+    BYTE type = 0;
+    BYTE flags = 0;
+    dacl.GetAclEntry(i, &sid, &mask, &type, &flags);
+    if (sid == trustee && type == ACCESS_ALLOWED_ACE_TYPE &&
+        (flags & ace_flags) == ace_flags &&
+        (mask & access_mask) == access_mask) {
+      return true;
+    }
+  }
+
+  // Add the new access to the DACL.
+  if (!dacl.AddAllowedAce(trustee, access_mask, ace_flags)) {
+    DPLOG(ERROR) << "Failed adding ACE to DACL";
+    return false;
+  }
+
+  // Attach the updated ACL as the object's DACL.
+  if (!ATL::AtlSetDacl(path.value().c_str(), SE_FILE_OBJECT, dacl)) {
+    DPLOG(ERROR) << "Failed setting DACL for path \"" << path.value() << "\"";
+    return false;
+  }
+
+  return true;
+}
+
+}  // namespace
+
+base::FilePath GetPersistentHistogramStorageDir(
+    const base::FilePath& target_path) {
+  return target_path.AppendASCII(kSetupHistogramAllocatorName);
+}
+
 void BeginPersistentHistogramStorage() {
   base::GlobalHistogramAllocator::CreateWithLocalMemory(
       1 << 20,  // 1 MiB
@@ -27,14 +97,47 @@
   base::HistogramBase::EnableActivityReportHistogram("setup");
 }
 
-void EndPersistentHistogramStorage(const base::FilePath& target_path) {
+void EndPersistentHistogramStorage(const base::FilePath& target_path,
+                                   bool system_install) {
   base::PersistentHistogramAllocator* allocator =
       base::GlobalHistogramAllocator::Get();
   allocator->UpdateTrackingHistograms();
 
-  base::FilePath file_path = target_path
-      .AppendASCII(allocator->Name())
-      .AddExtension(L".pma");
+  // Allocator dumps are saved to a directory that was created earlier. Stop
+  // now if that directory has been removed because an uninstall has happened.
+  base::FilePath dir_path = GetPersistentHistogramStorageDir(target_path);
+  if (!base::DirectoryExists(dir_path))
+    return;
+
+  // Set permissions on the directory that allows other processes, including
+  // non-privileged ones, to read and delete the files stored there. This
+  // allows the browser process to remove the metrics files once it's done
+  // reading them. This is only done for system-level installs; user-level
+  // installs already provide delete-file access to the browser process.
+  if (system_install) {
+    if (!AddAclToPath(dir_path, ATL::Sids::AuthenticatedUser(),
+                      FILE_GENERIC_READ | FILE_DELETE_CHILD,
+                      CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE)) {
+      PLOG(ERROR) << "Could not set \"delete\" permission for metrics directory"
+                  << " \"" << dir_path.value() << "\"";
+    }
+  }
+
+  // Remove any existing metrics file at the old (non-subdir) pathname.
+  base::DeleteFile(dir_path.AddExtension(MetricsFileExtension), false);
+
+  // Save data using the current time as the filename. The actual filename
+  // doesn't matter (so long as it ends with the correct extension) but this
+  // works as well as anything.
+  base::Time::Exploded exploded;
+  base::Time::Now().LocalExplode(&exploded);
+  base::FilePath file_path =
+      dir_path
+          .AppendASCII(base::StringPrintf("%04d%02d%02d%02d%02d%02d",
+                                          exploded.year, exploded.month,
+                                          exploded.day_of_month, exploded.hour,
+                                          exploded.minute, exploded.second))
+          .AddExtension(MetricsFileExtension);
 
   base::StringPiece contents(static_cast<const char*>(allocator->data()),
                              allocator->used());
diff --git a/chrome/installer/setup/installer_metrics.h b/chrome/installer/setup/installer_metrics.h
index d843640..731f006 100644
--- a/chrome/installer/setup/installer_metrics.h
+++ b/chrome/installer/setup/installer_metrics.h
@@ -11,6 +11,13 @@
 
 namespace installer {
 
+// Returns the directory in which persistent histograms will be saved. The
+// install process should create this when appropriate and remove it on
+// uninstall/rollback. If this directory does not exist when End...Storage()
+// is called then no histograms will be persisted on disk.
+base::FilePath GetPersistentHistogramStorageDir(
+    const base::FilePath& target_dir);
+
 // Creates a persistent space for any histograms that can be reported later
 // by the browser process. It should be called as early as possible in the
 // process lifetime and never called again.
@@ -20,10 +27,11 @@
 // by the browser so it can be reported. It is generally called once during
 // process exit. Multiple calls to this are possible if "snapshots" are
 // desired; they are cumulative in what is saved, not just what has changed
-// since the previous call.
-void EndPersistentHistogramStorage(const base::FilePath& target_dir);
+// since the previous call. The |target_dir| is the install location of the
+// browser.
+void EndPersistentHistogramStorage(const base::FilePath& target_dir,
+                                   bool system_install);
 
 }  // namespace installer
 
 #endif  // CHROME_INSTALLER_SETUP_INSTALLER_METRICS_H_
-
diff --git a/chrome/installer/setup/setup_main.cc b/chrome/installer/setup/setup_main.cc
index 2e5d2897..368cd93 100644
--- a/chrome/installer/setup/setup_main.cc
+++ b/chrome/installer/setup/setup_main.cc
@@ -1865,7 +1865,8 @@
     return_code = InstallUtil::GetInstallReturnCode(install_status);
   }
 
-  installer::EndPersistentHistogramStorage(installer_state.target_path());
+  installer::EndPersistentHistogramStorage(installer_state.target_path(),
+                                           system_install);
   VLOG(1) << "Installation complete, returning: " << return_code;
 
   return return_code;
diff --git a/chrome/renderer/resources/extensions/automation/automation_node.js b/chrome/renderer/resources/extensions/automation/automation_node.js
index d2f9a56..4171d75 100644
--- a/chrome/renderer/resources/extensions/automation/automation_node.js
+++ b/chrome/renderer/resources/extensions/automation/automation_node.js
@@ -199,6 +199,7 @@
  */
 function AutomationNodeImpl(root) {
   this.rootImpl = root;
+  this.hostNode_ = null;
   this.listeners = {__proto__: null};
 }
 
@@ -208,8 +209,14 @@
   id: -1,
   isRootNode: false,
 
+  detach: function() {
+    this.rootImpl = null;
+    this.hostNode_ = null;
+    this.listeners = {__proto__: null};
+  },
+
   get root() {
-    return this.rootImpl.wrapper;
+    return this.rootImpl && this.rootImpl.wrapper;
   },
 
   get parent() {
@@ -907,11 +914,16 @@
   },
 
   remove: function(id) {
+    if (this.axNodeDataCache_[id])
+      privates(this.axNodeDataCache_[id]).impl.detach();
     delete this.axNodeDataCache_[id];
   },
 
   destroy: function() {
     this.dispatchEvent(schema.EventType.destroyed);
+    for (var id in this.axNodeDataCache_)
+      this.remove(id);
+    this.detach();
   },
 
   setHostNode(hostNode) {
diff --git a/chrome/test/base/chrome_unit_test_suite.cc b/chrome/test/base/chrome_unit_test_suite.cc
index a530292..9c314cb 100644
--- a/chrome/test/base/chrome_unit_test_suite.cc
+++ b/chrome/test/base/chrome_unit_test_suite.cc
@@ -132,7 +132,8 @@
       new translate::BrowserCldDataProviderFactory());
   translate::CldDataSource::SetDefault(
       translate::CldDataSource::GetStaticDataSource());
-  component_updater::RegisterPathProvider(chrome::DIR_USER_DATA);
+  component_updater::RegisterPathProvider(chrome::DIR_COMPONENTS,
+                                          chrome::DIR_USER_DATA);
 
 #if defined(OS_CHROMEOS)
   chromeos::RegisterPathProvider();
diff --git a/chrome/test/chromedriver/test/test_expectations b/chrome/test/chromedriver/test/test_expectations
index 96cf4ed8..741e943 100644
--- a/chrome/test/chromedriver/test/test_expectations
+++ b/chrome/test/chromedriver/test/test_expectations
@@ -63,7 +63,6 @@
     'SessionStorageTest.*',
     'SqlDatabaseTest.*',
     'SvgDocumentTest.testClickOnSvgElement',
-    'TakesScreenshotTest.testShouldCaptureScreenshot',
     'TakesScreenshotTest.testShouldCaptureScreenshotAtIFramePage',
     'TakesScreenshotTest.testShouldCaptureScreenshotWithLongX',
     'TakesScreenshotTest.testShouldCaptureScreenshotWithLongY',
@@ -235,6 +234,8 @@
         'ClickScrollingTest.testShouldBeAbleToClickElementThatIsOutOfViewInANestedFrameThatIsOutOfView',
          # Not applicable on ChromeDriverWebViewShell (doesn't support tabs).
         'WindowSwitchingTest.*',
+
+        'TakesScreenshotTest.testShouldCaptureScreenshot',
     ]
 )
 
diff --git a/chrome/test/data/extensions/api_test/automation/tests/tabs/close_tab.js b/chrome/test/data/extensions/api_test/automation/tests/tabs/close_tab.js
index aa04332..6190449 100644
--- a/chrome/test/data/extensions/api_test/automation/tests/tabs/close_tab.js
+++ b/chrome/test/data/extensions/api_test/automation/tests/tabs/close_tab.js
@@ -7,12 +7,17 @@
     getUrlFromConfig('index.html', function(url) {
       chrome.tabs.create({'url': url}, function(tab) {
         chrome.automation.getTree(function(rootNode) {
+          var button = rootNode.find({role: 'button'});
+          assertEq(rootNode, button.root);
+
           rootNode.addEventListener(EventType.destroyed, function() {
             // Poll until the root node doesn't have a role anymore
             // indicating that it really did get cleaned up.
             function checkSuccess() {
-              if (rootNode.role === undefined)
+              if (rootNode.role === undefined && rootNode.root === null) {
+                assertEq(null, button.root);
                 chrome.test.succeed();
+              }
               else
                 window.setTimeout(checkSuccess, 10);
             }
diff --git a/chrome/test/data/webui/plugins_browsertest.js b/chrome/test/data/webui/plugins_browsertest.js
index cc46d0e..76d57bd 100644
--- a/chrome/test/data/webui/plugins_browsertest.js
+++ b/chrome/test/data/webui/plugins_browsertest.js
@@ -104,9 +104,9 @@
         var serviceProvider = modules[3];
 
         serviceProvider.addServiceOverrideForTesting(
-            pluginsMojom.PluginsHandlerMojo.name, function(handle) {
+            pluginsMojom.PluginsPageHandler.name, function(handle) {
               var stub = connection.bindHandleToStub(
-                  handle, pluginsMojom.PluginsHandlerMojo);
+                  handle, pluginsMojom.PluginsPageHandler);
               this.browserProxy = new TestBrowserProxy();
               bindings.StubBindings(stub).delegate = this.browserProxy;
             }.bind(this));
diff --git a/chromecast/BUILD.gn b/chromecast/BUILD.gn
index 25a88a4..e815261 100644
--- a/chromecast/BUILD.gn
+++ b/chromecast/BUILD.gn
@@ -121,8 +121,7 @@
     ]
 
     if (use_alsa) {
-      tests +=
-          [ "//chromecast/media/cma/backend/alsa:alsa_cma_backend_unittests" ]
+      tests += [ "//chromecast/media/cma/backend/alsa:cast_alsa_cma_backend_unittests" ]
     }
   }
 
diff --git a/chromecast/chromecast_tests.gypi b/chromecast/chromecast_tests.gypi
index f5c4305..87507f6 100644
--- a/chromecast/chromecast_tests.gypi
+++ b/chromecast/chromecast_tests.gypi
@@ -193,7 +193,7 @@
           'conditions': [
             ['use_alsa==1', {
               'dependencies': [
-                'media/media.gyp:alsa_cma_backend_unittests',
+                'media/media.gyp:cast_alsa_cma_backend_unittests',
               ],
             }],
           ],
diff --git a/chromecast/media/cma/backend/alsa/BUILD.gn b/chromecast/media/cma/backend/alsa/BUILD.gn
index 04e21d66..f0554e1 100644
--- a/chromecast/media/cma/backend/alsa/BUILD.gn
+++ b/chromecast/media/cma/backend/alsa/BUILD.gn
@@ -70,8 +70,8 @@
   flags = [ "ALSA_MONOTONIC_RAW_TSTAMPS=$use_alsa_monotonic_raw_tstamps" ]
 }
 
-# GYP target: chromecast/media/media.gyp:alsa_cma_backend_unittests
-test("alsa_cma_backend_unittests") {
+# GYP target: chromecast/media/media.gyp:cast_alsa_cma_backend_unittests
+test("cast_alsa_cma_backend_unittests") {
   sources = [
     "stream_mixer_alsa_unittest.cc",
   ]
diff --git a/chromecast/media/cma/backend/alsa/stream_mixer_alsa.cc b/chromecast/media/cma/backend/alsa/stream_mixer_alsa.cc
index 5ab6d76..7038d5b 100644
--- a/chromecast/media/cma/backend/alsa/stream_mixer_alsa.cc
+++ b/chromecast/media/cma/backend/alsa/stream_mixer_alsa.cc
@@ -6,7 +6,6 @@
 
 #include <algorithm>
 #include <cmath>
-#include <limits>
 #include <utility>
 
 #include "base/bind_helpers.h"
@@ -73,6 +72,8 @@
 const int kPreventUnderrunChunkSize = 512;
 const int kDefaultCheckCloseTimeoutMs = 2000;
 
+const int kMaxWriteSizeMs = 20;
+
 // A list of supported sample rates.
 // TODO(jyw): move this up into chromecast/public for 1) documentation and
 // 2) to help when implementing IsSampleRateSupported()
@@ -704,7 +705,7 @@
   DCHECK(mixer_task_runner_->BelongsToCurrentThread());
   if (state_ != kStateNormalPlayback)
     return false;
-  int chunk_size = std::numeric_limits<int>::max();
+  int chunk_size = output_samples_per_second_ * kMaxWriteSizeMs / 1000;
   std::vector<InputQueue*> active_inputs;
   for (auto&& input : inputs_) {
     int read_size = input->MaxReadSize();
diff --git a/chromecast/media/media.gyp b/chromecast/media/media.gyp
index e70814a3..c6354e0 100644
--- a/chromecast/media/media.gyp
+++ b/chromecast/media/media.gyp
@@ -447,7 +447,7 @@
     ['use_alsa==1', {
       'targets': [
         {
-          'target_name': 'alsa_cma_backend_unittests',
+          'target_name': 'cast_alsa_cma_backend_unittests',
           'type': '<(gtest_target_type)',
           'dependencies': [
             'alsa_cma_backend',
@@ -460,7 +460,7 @@
             'cma/backend/alsa/mock_alsa_wrapper.h',
             'cma/backend/alsa/stream_mixer_alsa_unittest.cc',
           ],
-        },  # end of target 'alsa_cma_backend_unittests'
+        },  # end of target 'cast_alsa_cma_backend_unittests'
       ],  # end of targets
     }],
   ],  # end of conditions
diff --git a/components/BUILD.gn b/components/BUILD.gn
index f15bd17..faab3f48 100644
--- a/components/BUILD.gn
+++ b/components/BUILD.gn
@@ -138,6 +138,7 @@
 
     # Direct dependencies of components/test/run_all_unittests.cc.
     "//components/content_settings/core/common",
+    "//mojo/edk/system",
     "//net",
     "//testing/gtest",
     "//ui/base",
@@ -197,7 +198,6 @@
       "//components/wallpaper:unit_tests",
       "//components/web_cache/browser:unit_tests",
       "//components/webcrypto:unit_tests",
-      "//mojo/edk/system",
 
       # These are the deps required by the code in this target.
       "//components/policy:policy_component",
diff --git a/components/arc/common/net.mojom b/components/arc/common/net.mojom
index ab727b0..3cc5928 100644
--- a/components/arc/common/net.mojom
+++ b/components/arc/common/net.mojom
@@ -30,7 +30,7 @@
 };
 
 struct ConfiguredNetworkDetails {
-  string passphrase;
+  string? passphrase;
   bool autoconnect;
 };
 
diff --git a/components/autofill/content/renderer/page_click_tracker.cc b/components/autofill/content/renderer/page_click_tracker.cc
index aa16731..1aff3de 100644
--- a/components/autofill/content/renderer/page_click_tracker.cc
+++ b/components/autofill/content/renderer/page_click_tracker.cc
@@ -88,7 +88,8 @@
 }
 
 void PageClickTracker::DoFocusChangeComplete() {
-  WebElement focused_element = render_frame()->GetFocusedElement();
+  WebElement focused_element =
+      render_frame()->GetWebFrame()->document().focusedElement();
   if (focused_node_was_last_clicked_ && !focused_element.isNull()) {
     const WebFormControlElement control =
         GetTextFormControlElement(focused_element);
diff --git a/components/autofill/content/renderer/password_autofill_agent.cc b/components/autofill/content/renderer/password_autofill_agent.cc
index 8b18ee96..fcbc609 100644
--- a/components/autofill/content/renderer/password_autofill_agent.cc
+++ b/components/autofill/content/renderer/password_autofill_agent.cc
@@ -1429,7 +1429,8 @@
 void PasswordAutofillAgent::OnFindFocusedPasswordForm() {
   std::unique_ptr<PasswordForm> password_form;
 
-  blink::WebElement element = render_frame()->GetFocusedElement();
+  blink::WebElement element =
+      render_frame()->GetWebFrame()->document().focusedElement();
   if (!element.isNull() && element.hasHTMLTagName("input")) {
     blink::WebInputElement input = element.to<blink::WebInputElement>();
     if (input.isPasswordField() && !input.form().isNull()) {
diff --git a/components/autofill/core/browser/autofill_profile.cc b/components/autofill/core/browser/autofill_profile.cc
index 70b8519..0f69602 100644
--- a/components/autofill/core/browser/autofill_profile.cc
+++ b/components/autofill/core/browser/autofill_profile.cc
@@ -499,7 +499,9 @@
   l10n::CaseInsensitiveCompare compare;
   AutofillType type = AutofillType(NAME_FULL);
   base::string16 full_name = name_.GetInfo(type, app_locale);
-  if (compare.StringsEqual(full_name,
+  // Always overwrite if the name parts are empty.
+  if (!name_.NamePartsAreEmpty() &&
+      compare.StringsEqual(full_name,
                            imported_name.GetInfo(type, app_locale))) {
     // The imported name has the same full name string as the name for this
     // profile.  Because full names are _heuristically_ parsed into
@@ -514,7 +516,7 @@
       return false;
   }
 
-  name_ = imported_name;
+  name_.OverwriteName(imported_name);
   return true;
 }
 
@@ -585,6 +587,7 @@
   ServerFieldTypeSet field_types, other_field_types;
   GetNonEmptyTypes(app_locale, &field_types);
   profile.GetNonEmptyTypes(app_locale, &other_field_types);
+
   // The address needs to be compared line by line to take into account the
   // logic for empty fields implemented in the loop.
   field_types.erase(ADDRESS_HOME_STREET_ADDRESS);
@@ -641,6 +644,7 @@
         }
         continue;
       }
+
       // Special case for the state to support abbreviations. Currently only the
       // US states are supported.
       if (field_type == ADDRESS_HOME_STATE) {
@@ -664,6 +668,20 @@
         }
       }
 
+      // Special case for middle name to support initials.
+      if (field_type == NAME_MIDDLE) {
+        base::string16 middle_name = GetRawInfo(NAME_MIDDLE);
+        base::string16 profile_middle_name = profile.GetRawInfo(NAME_MIDDLE);
+        DCHECK(!middle_name.empty());
+        DCHECK(!profile_middle_name.empty());
+        // If one of the two middle names is an initial that matches the first
+        // letter of the other middle name, they are considered equivalent.
+        if ((middle_name.size() == 1 || profile_middle_name.size() == 1) &&
+            middle_name[0] == profile_middle_name[0]) {
+          continue;
+        }
+      }
+
       if (!compare.StringsEqual(profile.GetRawInfo(field_type),
                                 GetRawInfo(field_type))) {
         return false;
diff --git a/components/autofill/core/browser/autofill_profile_unittest.cc b/components/autofill/core/browser/autofill_profile_unittest.cc
index 0732f60f..7a6630f8 100644
--- a/components/autofill/core/browser/autofill_profile_unittest.cc
+++ b/components/autofill/core/browser/autofill_profile_unittest.cc
@@ -1194,17 +1194,15 @@
             a.GetRawInfo(NAME_FULL));
 }
 
-// TODO(crbug.com/608074): No loss of information for names should happen when
-// using SaveAddtitionalInfo.
-// Tests the merging of two similar profiles results the second profile's non-
-// empty fields overwriting the initial profiles values.
+// Tests the merging of two similar profiles results in the second profile's
+// non-empty fields overwriting the initial profiles values.
 TEST(AutofillProfileTest, SaveAdditionalInfo_Name_DifferentCaseNoNameFull) {
   AutofillProfile a;
 
   a.SetRawInfo(NAME_FIRST, base::ASCIIToUTF16("marion"));
   a.SetRawInfo(NAME_MIDDLE, base::ASCIIToUTF16("mitchell"));
   a.SetRawInfo(NAME_LAST, base::ASCIIToUTF16("morrison"));
-  a.SetRawInfo(NAME_FULL, base::ASCIIToUTF16("Marion Mitchell Morrison"));
+  a.SetRawInfo(NAME_FULL, base::ASCIIToUTF16("marion mitchell morrison"));
 
   AutofillProfile b = a;
   b.SetRawInfo(NAME_FIRST, base::ASCIIToUTF16("Marion"));
@@ -1216,15 +1214,13 @@
 
   // The first, middle and last names should have their first letter in
   // uppercase.
-  EXPECT_EQ(base::ASCIIToUTF16("marion"), a.GetRawInfo(NAME_FIRST));
-  EXPECT_EQ(base::ASCIIToUTF16("mitchell"), a.GetRawInfo(NAME_MIDDLE));
-  EXPECT_EQ(base::ASCIIToUTF16("morrison"), a.GetRawInfo(NAME_LAST));
-  EXPECT_EQ(base::ASCIIToUTF16("Marion Mitchell Morrison"),
+  EXPECT_EQ(base::ASCIIToUTF16("Marion"), a.GetRawInfo(NAME_FIRST));
+  EXPECT_EQ(base::ASCIIToUTF16("Mitchell"), a.GetRawInfo(NAME_MIDDLE));
+  EXPECT_EQ(base::ASCIIToUTF16("Morrison"), a.GetRawInfo(NAME_LAST));
+  EXPECT_EQ(base::ASCIIToUTF16("marion mitchell morrison"),
             a.GetRawInfo(NAME_FULL));
 }
 
-// TODO(crbug.com/608074): No loss of information for names should happen when
-// using SaveAddtitionalInfo.
 // Tests that no loss of information happens when SavingAdditionalInfo with a
 // profile with an empty name part.
 TEST(AutofillProfileTest, SaveAdditionalInfo_Name_LossOfInformation) {
@@ -1240,14 +1236,10 @@
   EXPECT_TRUE(a.SaveAdditionalInfo(b, "en-US"));
 
   EXPECT_EQ(base::ASCIIToUTF16("Marion"), a.GetRawInfo(NAME_FIRST));
-  // This should not be empty.
-  EXPECT_EQ(base::ASCIIToUTF16(""), a.GetRawInfo(NAME_MIDDLE));
+  EXPECT_EQ(base::ASCIIToUTF16("Mitchell"), a.GetRawInfo(NAME_MIDDLE));
   EXPECT_EQ(base::ASCIIToUTF16("Morrison"), a.GetRawInfo(NAME_LAST));
-  EXPECT_EQ(base::ASCIIToUTF16(""), a.GetRawInfo(NAME_FULL));
 }
 
-// TODO(crbug.com/608074): No loss of information for names should happen when
-// using SaveAddtitionalInfo.
 // Tests that merging two complementary profiles for names results in a profile
 // with a complete name.
 TEST(AutofillProfileTest, SaveAdditionalInfo_Name_ComplementaryInformation) {
@@ -1262,10 +1254,11 @@
 
   EXPECT_TRUE(a.SaveAdditionalInfo(b, "en-US"));
 
-  // The first, middle and last names should be kept.
-  EXPECT_EQ(base::ASCIIToUTF16(""), a.GetRawInfo(NAME_FIRST));
-  EXPECT_EQ(base::ASCIIToUTF16(""), a.GetRawInfo(NAME_MIDDLE));
-  EXPECT_EQ(base::ASCIIToUTF16(""), a.GetRawInfo(NAME_LAST));
+  // The first, middle and last names should be kept and name full should be
+  // added.
+  EXPECT_EQ(base::ASCIIToUTF16("Marion"), a.GetRawInfo(NAME_FIRST));
+  EXPECT_EQ(base::ASCIIToUTF16("Mitchell"), a.GetRawInfo(NAME_MIDDLE));
+  EXPECT_EQ(base::ASCIIToUTF16("Morrison"), a.GetRawInfo(NAME_LAST));
   EXPECT_EQ(base::ASCIIToUTF16("Marion Mitchell Morrison"),
             a.GetRawInfo(NAME_FULL));
 }
diff --git a/components/autofill/core/browser/contact_info.cc b/components/autofill/core/browser/contact_info.cc
index 1cb1b784..4953121 100644
--- a/components/autofill/core/browser/contact_info.cc
+++ b/components/autofill/core/browser/contact_info.cc
@@ -42,6 +42,26 @@
          family_ == info.family_;
 }
 
+void NameInfo::OverwriteName(const NameInfo& new_name) {
+  if (!new_name.given_.empty())
+    given_ = new_name.given_;
+
+  // For the middle name, don't overwrite a full middle name with an initial.
+  if (!new_name.middle_.empty() &&
+      (middle_.size() <= 1 || new_name.middle_.size() > 1))
+    middle_ = new_name.middle_;
+
+  if (!new_name.family_.empty())
+    family_ = new_name.family_;
+
+  if (!new_name.full_.empty())
+    full_ = new_name.full_;
+}
+
+bool NameInfo::NamePartsAreEmpty() const {
+  return given_.empty() && middle_.empty() && family_.empty();
+}
+
 void NameInfo::GetSupportedTypes(ServerFieldTypeSet* supported_types) const {
   supported_types->insert(NAME_FIRST);
   supported_types->insert(NAME_MIDDLE);
diff --git a/components/autofill/core/browser/contact_info.h b/components/autofill/core/browser/contact_info.h
index d2e70ba..3f42902 100644
--- a/components/autofill/core/browser/contact_info.h
+++ b/components/autofill/core/browser/contact_info.h
@@ -26,6 +26,14 @@
   // The comparison is case sensitive.
   bool ParsedNamesAreEqual(const NameInfo& info) const;
 
+  // For every non-empty NameInfo part in |new_name|, the corresponding NameInfo
+  // part in | this | is overwritten.Special logic so that a middle initial may
+  // not overwrite a full middle name.
+  void OverwriteName(const NameInfo& new_name);
+
+  // Returns true if all the name parts (first, middle and last) are empty.
+  bool NamePartsAreEmpty() const;
+
   // FormGroup:
   base::string16 GetRawInfo(ServerFieldType type) const override;
   void SetRawInfo(ServerFieldType type, const base::string16& value) override;
diff --git a/components/autofill/core/browser/contact_info_unittest.cc b/components/autofill/core/browser/contact_info_unittest.cc
index c04f148..a0001a3 100644
--- a/components/autofill/core/browser/contact_info_unittest.cc
+++ b/components/autofill/core/browser/contact_info_unittest.cc
@@ -253,4 +253,131 @@
   }
 }
 
+TEST(NameInfoTest, OverwriteName) {
+  struct TestCase {
+    std::string existing_name[4];
+    std::string new_name[4];
+    std::string expected_name[4];
+  };
+
+  struct TestCase test_cases[] = {
+      // Missing information in the original name gets filled with the new
+      // name's information.
+      {
+          {"", "", "", ""},
+          {"Marion", "Mitchell", "Morrison", "Marion Mitchell Morrison"},
+          {"Marion", "Mitchell", "Morrison", "Marion Mitchell Morrison"},
+      },
+      // The new name's values overwrite the exsiting name values if they are
+      // different
+      {
+          {"Marion", "Mitchell", "Morrison", "Marion Mitchell Morrison"},
+          {"Mario", "Mitchell", "Thompson", "Mario Mitchell Morrison"},
+          {"Mario", "Mitchell", "Thompson", "Mario Mitchell Morrison"},
+      },
+      // An existing name values do not get replaced with empty values.
+      {
+          {"Marion", "Mitchell", "Morrison", "Marion Mitchell Morrison"},
+          {"", "", "", ""},
+          {"Marion", "Mitchell", "Morrison", "Marion Mitchell Morrison"},
+      },
+      // An existing full middle not does not get replaced by a middle name
+      // initial.
+      {
+          {"Marion", "Mitchell", "Morrison", "Marion Mitchell Morrison"},
+          {"Marion", "M", "Morrison", "Marion Mitchell Morrison"},
+          {"Marion", "Mitchell", "Morrison", "Marion Mitchell Morrison"},
+      },
+      // An existing middle name initial is overwritten by the new profile's
+      // middle name value.
+      {
+          {"Marion", "M", "Morrison", "Marion Mitchell Morrison"},
+          {"Marion", "Mitchell", "Morrison", "Marion Mitchell Morrison"},
+          {"Marion", "Mitchell", "Morrison", "Marion Mitchell Morrison"},
+      },
+      // A NameInfo with only the full name set overwritten with a NameInfo
+      // with only the name parts set result in a NameInfo with all the name
+      // parts and name full set.
+      {
+          {"", "", "", "Marion Mitchell Morrison"},
+          {"Marion", "Mitchell", "Morrison", ""},
+          {"Marion", "Mitchell", "Morrison", "Marion Mitchell Morrison"},
+      },
+      // A NameInfo with only the name parts set overwritten with a NameInfo
+      // with only the full name set result in a NameInfo with all the name
+      // parts and name full set.
+      {
+          {"Marion", "Mitchell", "Morrison", ""},
+          {"", "", "", "Marion Mitchell Morrison"},
+          {"Marion", "Mitchell", "Morrison", "Marion Mitchell Morrison"},
+      },
+  };
+
+  for (size_t i = 0; i < arraysize(test_cases); ++i) {
+    SCOPED_TRACE(base::StringPrintf("i: %" PRIuS, i));
+
+    // Construct the starting_profile.
+    NameInfo existing_name;
+    existing_name.SetRawInfo(NAME_FIRST,
+                             UTF8ToUTF16(test_cases[i].existing_name[0]));
+    existing_name.SetRawInfo(NAME_MIDDLE,
+                             UTF8ToUTF16(test_cases[i].existing_name[1]));
+    existing_name.SetRawInfo(NAME_LAST,
+                             UTF8ToUTF16(test_cases[i].existing_name[2]));
+    existing_name.SetRawInfo(NAME_FULL,
+                             UTF8ToUTF16(test_cases[i].existing_name[3]));
+
+    // Construct the additional_profile.
+    NameInfo new_name;
+    new_name.SetRawInfo(NAME_FIRST, UTF8ToUTF16(test_cases[i].new_name[0]));
+    new_name.SetRawInfo(NAME_MIDDLE, UTF8ToUTF16(test_cases[i].new_name[1]));
+    new_name.SetRawInfo(NAME_LAST, UTF8ToUTF16(test_cases[i].new_name[2]));
+    new_name.SetRawInfo(NAME_FULL, UTF8ToUTF16(test_cases[i].new_name[3]));
+
+    existing_name.OverwriteName(new_name);
+
+    // Verify the test expectations.
+    EXPECT_EQ(UTF8ToUTF16(test_cases[i].expected_name[0]),
+              existing_name.GetRawInfo(NAME_FIRST));
+    EXPECT_EQ(UTF8ToUTF16(test_cases[i].expected_name[1]),
+              existing_name.GetRawInfo(NAME_MIDDLE));
+    EXPECT_EQ(UTF8ToUTF16(test_cases[i].expected_name[2]),
+              existing_name.GetRawInfo(NAME_LAST));
+    EXPECT_EQ(UTF8ToUTF16(test_cases[i].expected_name[3]),
+              existing_name.GetRawInfo(NAME_FULL));
+  }
+}
+
+TEST(NameInfoTest, NamePartsAreEmpty) {
+  struct TestCase {
+    std::string first;
+    std::string middle;
+    std::string last;
+    std::string full;
+    bool expected_result;
+  };
+
+  struct TestCase test_cases[] = {
+      {"", "", "", "", true},
+      {"", "", "", "Marion Mitchell Morrison", true},
+      {"Marion", "", "", "", false},
+      {"", "Mitchell", "", "", false},
+      {"", "", "Morrison", "", false},
+  };
+
+  for (size_t i = 0; i < arraysize(test_cases); ++i) {
+    SCOPED_TRACE(base::StringPrintf("i: %" PRIuS, i));
+
+    // Construct the NameInfo.
+    NameInfo name;
+    name.SetRawInfo(NAME_FIRST, UTF8ToUTF16(test_cases[i].first));
+    name.SetRawInfo(NAME_MIDDLE, UTF8ToUTF16(test_cases[i].middle));
+    name.SetRawInfo(NAME_LAST, UTF8ToUTF16(test_cases[i].last));
+    name.SetRawInfo(NAME_FULL, UTF8ToUTF16(test_cases[i].full));
+
+    // Verify the test expectations.
+    EXPECT_EQ(test_cases[i].expected_result, name.NamePartsAreEmpty());
+  }
+}
+
 }  // namespace autofill
diff --git a/components/autofill/core/browser/personal_data_manager_unittest.cc b/components/autofill/core/browser/personal_data_manager_unittest.cc
index a9dfd18..dde71cf 100644
--- a/components/autofill/core/browser/personal_data_manager_unittest.cc
+++ b/components/autofill/core/browser/personal_data_manager_unittest.cc
@@ -4011,6 +4011,119 @@
       // two profiles being saved.
       {ProfileFields(), {{NAME_FIRST, "Marionette"}}},
 
+      // Test that saving an identical profile except with the middle name
+      // initial instead of the full middle name results in the profiles
+      // getting merged and the full middle name being kept.
+      {ProfileFields(), {{NAME_MIDDLE, "M"}}, {{NAME_MIDDLE, "Mitchell"}}},
+
+      // Test that saving an identical profile except with the full middle name
+      // instead of the middle name initial results in the profiles getting
+      // merged and the full middle name replacing the initial.
+      {{{NAME_MIDDLE, "M"}},
+       {{NAME_MIDDLE, "Mitchell"}},
+       {{NAME_MIDDLE, "Mitchell"}}},
+
+      // Test that saving an identical profile except with no middle name
+      // results in the profiles getting merged and the full middle name being
+      // kept.
+      {ProfileFields(), {{NAME_MIDDLE, ""}}, {{NAME_MIDDLE, "Mitchell"}}},
+
+      // Test that saving an identical profile except with a middle name initial
+      // results in the profiles getting merged and the middle name initial
+      // being saved.
+      {{{NAME_MIDDLE, ""}}, {{NAME_MIDDLE, "M"}}, {{NAME_MIDDLE, "M"}}},
+
+      // Test that saving an identical profile except with a middle name
+      // results in the profiles getting merged and the full middle name being
+      // saved.
+      {{{NAME_MIDDLE, ""}},
+       {{NAME_MIDDLE, "Mitchell"}},
+       {{NAME_MIDDLE, "Mitchell"}}},
+
+      // Test that saving a identical profile except with the full name set
+      // instead of the name parts results in the two profiles being merged and
+      // all the name parts kept and the full name being added.
+      {
+          {
+              {NAME_FIRST, "Marion"},
+              {NAME_MIDDLE, "Mitchell"},
+              {NAME_LAST, "Morrison"},
+              {NAME_FULL, ""},
+          },
+          {
+              {NAME_FIRST, ""},
+              {NAME_MIDDLE, ""},
+              {NAME_LAST, ""},
+              {NAME_FULL, "Marion Mitchell Morrison"},
+          },
+          {
+              {NAME_FIRST, "Marion"},
+              {NAME_MIDDLE, "Mitchell"},
+              {NAME_LAST, "Morrison"},
+              {NAME_FULL, "Marion Mitchell Morrison"},
+          },
+      },
+
+      // Test that saving a identical profile except with the name parts set
+      // instead of the full name results in the two profiles being merged and
+      // the full name being kept and all the name parts being added.
+      {
+          {
+              {NAME_FIRST, ""},
+              {NAME_MIDDLE, ""},
+              {NAME_LAST, ""},
+              {NAME_FULL, "Marion Mitchell Morrison"},
+          },
+          {
+              {NAME_FIRST, "Marion"},
+              {NAME_MIDDLE, "Mitchell"},
+              {NAME_LAST, "Morrison"},
+              {NAME_FULL, ""},
+          },
+          {
+              {NAME_FIRST, "Marion"},
+              {NAME_MIDDLE, "Mitchell"},
+              {NAME_LAST, "Morrison"},
+              {NAME_FULL, "Marion Mitchell Morrison"},
+          },
+      },
+
+      // Test that saving a profile that has only a full name set does not get
+      // merged with a profile with only the name parts set if the names are
+      // different.
+      {
+          {
+              {NAME_FIRST, "Marion"},
+              {NAME_MIDDLE, "Mitchell"},
+              {NAME_LAST, "Morrison"},
+              {NAME_FULL, ""},
+          },
+          {
+              {NAME_FIRST, ""},
+              {NAME_MIDDLE, ""},
+              {NAME_LAST, ""},
+              {NAME_FULL, "John Thompson Smith"},
+          },
+      },
+
+      // Test that saving a profile that has only the name parts set does not
+      // get merged with a profile with only the full name set if the names are
+      // different.
+      {
+          {
+              {NAME_FIRST, ""},
+              {NAME_MIDDLE, ""},
+              {NAME_LAST, ""},
+              {NAME_FULL, "John Thompson Smith"},
+          },
+          {
+              {NAME_FIRST, "Marion"},
+              {NAME_MIDDLE, "Mitchell"},
+              {NAME_LAST, "Morrison"},
+              {NAME_FULL, ""},
+          },
+      },
+
       // Test that saving an identical profile except for the first address line
       // results in two profiles being saved.
       {ProfileFields(), {{ADDRESS_HOME_LINE1, "123 Aquarium St."}}},
@@ -4152,6 +4265,8 @@
     if (test_case.changed_field_values.empty()) {
       EXPECT_EQ(2U, saved_profiles.size());
     } else {
+      EXPECT_EQ(1U, saved_profiles.size());
+
       // Make sure the new information was merged correctly.
       for (ProfileField changed_field : test_case.changed_field_values) {
         EXPECT_EQ(base::UTF8ToUTF16(changed_field.field_value),
diff --git a/components/browser_sync/browser/profile_sync_service_bookmark_unittest.cc b/components/browser_sync/browser/profile_sync_service_bookmark_unittest.cc
index 5740c22..d91c5770 100644
--- a/components/browser_sync/browser/profile_sync_service_bookmark_unittest.cc
+++ b/components/browser_sync/browser/profile_sync_service_bookmark_unittest.cc
@@ -1058,9 +1058,6 @@
 
 // Verifies that the bookmark association skips sync nodes with invalid URLs.
 TEST_F(ProfileSyncServiceBookmarkTest, InitialModelAssociateWithInvalidUrl) {
-  EXPECT_CALL(*mock_error_handler(), CreateAndUploadError(_, _, _))
-      .WillOnce(Return(syncer::SyncError()));
-
   LoadBookmarkModel(DELETE_EXISTING_STORAGE, DONT_SAVE_TO_STORAGE);
   // On the local side create a folder and two nodes.
   const BookmarkNode* folder = model()->AddFolder(
@@ -1458,8 +1455,6 @@
 // Introduce a consistency violation into the model, and see that it
 // puts itself into a lame, error state.
 TEST_F(ProfileSyncServiceBookmarkTest, UnrecoverableErrorSuspendsService) {
-  EXPECT_CALL(*mock_error_handler(), OnSingleDataTypeUnrecoverableError(_));
-
   LoadBookmarkModel(DELETE_EXISTING_STORAGE, DONT_SAVE_TO_STORAGE);
   StartSync();
 
@@ -1481,6 +1476,8 @@
   // doesn't know it yet.
   ExpectSyncerNodeKnown(node);
 
+  mock_error_handler()->ExpectError(syncer::SyncError::DATATYPE_ERROR);
+
   // Add a child to the inconsistent node.  This should cause detection of the
   // problem and the syncer should stop processing changes.
   model()->AddFolder(node, 0, base::ASCIIToUTF16("nested"));
diff --git a/components/component_updater/component_updater_paths.cc b/components/component_updater/component_updater_paths.cc
index 510725b..f0bca94 100644
--- a/components/component_updater/component_updater_paths.cc
+++ b/components/component_updater/component_updater_paths.cc
@@ -12,20 +12,32 @@
 namespace {
 
 // This key gives the root directory of all the component installations.
-static int g_components_root_key = -1;
+static int g_components_preinstalled_root_key = -1;
+static int g_components_user_root_key = -1;
 
 }  // namespace
 
+const base::FilePath::CharType kSupervisedUserWhitelistDirName[] =
+    FILE_PATH_LITERAL("SupervisedUserWhitelists");
+
 bool PathProvider(int key, base::FilePath* result) {
-  DCHECK_GT(g_components_root_key, 0);
+  DCHECK_GT(g_components_user_root_key, 0);
+  DCHECK_GT(g_components_preinstalled_root_key, 0);
 
   // Early exit here to prevent a potential infinite loop when we retrieve
-  // the path for g_components_root_key.
+  // the path for g_components_*_root_key.
   if (key < PATH_START || key > PATH_END)
     return false;
 
+  switch (key) {
+    case DIR_COMPONENT_PREINSTALLED:
+      return PathService::Get(g_components_preinstalled_root_key, result);
+    case DIR_COMPONENT_USER:
+      return PathService::Get(g_components_user_root_key, result);
+  }
+
   base::FilePath cur;
-  if (!PathService::Get(g_components_root_key, &cur))
+  if (!PathService::Get(g_components_user_root_key, &cur))
     return false;
 
   switch (key) {
@@ -38,20 +50,8 @@
     case DIR_SWIFT_SHADER:
       cur = cur.Append(FILE_PATH_LITERAL("SwiftShader"));
       break;
-    case DIR_SW_REPORTER:
-      cur = cur.Append(FILE_PATH_LITERAL("SwReporter"));
-      break;
-    case DIR_COMPONENT_EV_WHITELIST:
-      cur = cur.Append(FILE_PATH_LITERAL("EVWhitelist"));
-      break;
     case DIR_SUPERVISED_USER_WHITELISTS:
-      cur = cur.Append(FILE_PATH_LITERAL("SupervisedUserWhitelists"));
-      break;
-    case DIR_CERT_TRANS_TREE_STATES:
-      cur = cur.Append(FILE_PATH_LITERAL("CertificateTransparency"));
-      break;
-    case DIR_ORIGIN_TRIAL_KEYS:
-      cur = cur.Append(FILE_PATH_LITERAL("OriginTrials"));
+      cur = cur.Append(kSupervisedUserWhitelistDirName);
       break;
     default:
       return false;
@@ -63,12 +63,19 @@
 
 // This cannot be done as a static initializer sadly since Visual Studio will
 // eliminate this object file if there is no direct entry point into it.
-void RegisterPathProvider(int components_root_key) {
-  DCHECK_EQ(g_components_root_key, -1);
-  DCHECK_GT(components_root_key, 0);
-  DCHECK(components_root_key < PATH_START || components_root_key > PATH_END);
+void RegisterPathProvider(int components_preinstalled_root_key,
+                          int components_user_root_key) {
+  DCHECK_EQ(g_components_preinstalled_root_key, -1);
+  DCHECK_EQ(g_components_user_root_key, -1);
+  DCHECK_GT(components_preinstalled_root_key, 0);
+  DCHECK_GT(components_user_root_key, 0);
+  DCHECK(components_preinstalled_root_key < PATH_START ||
+         components_preinstalled_root_key > PATH_END);
+  DCHECK(components_user_root_key < PATH_START ||
+         components_user_root_key > PATH_END);
 
-  g_components_root_key = components_root_key;
+  g_components_preinstalled_root_key = components_preinstalled_root_key;
+  g_components_user_root_key = components_user_root_key;
   PathService::RegisterProvider(PathProvider, PATH_START, PATH_END);
 }
 
diff --git a/components/component_updater/component_updater_paths.h b/components/component_updater/component_updater_paths.h
index 23f7b53..94feb66 100644
--- a/components/component_updater/component_updater_paths.h
+++ b/components/component_updater/component_updater_paths.h
@@ -9,26 +9,33 @@
 
 namespace component_updater {
 
+extern const base::FilePath::CharType kSupervisedUserWhitelistDirName[];
+
 enum {
   PATH_START = 10000,
-  DIR_COMPONENT_CLD2 = PATH_START,  // Directory that contains component-updated
-                                    // Compact Language Detector files.
-  DIR_RECOVERY_BASE,                // Full path to the dir for Recovery
-                                    // component.
-  DIR_SWIFT_SHADER,                 // Path to the SwiftShader component.
-  DIR_SW_REPORTER,                  // Path to the SwReporter component.
-  DIR_COMPONENT_EV_WHITELIST,       // EV whitelist for CT files.
-  DIR_SUPERVISED_USER_WHITELISTS,   // Supervised user whitelists.
-  DIR_CERT_TRANS_TREE_STATES,       // Signed Tree Heads for CT logs.
-  DIR_ORIGIN_TRIAL_KEYS,            // Public keys and revoked tokens for origin
-                                    // trials.
+  DIR_COMPONENT_PREINSTALLED = PATH_START,  // Directory that contains component
+                                            // implementations installed by the
+                                            // Chrome installer or package
+                                            // manager.
+  DIR_COMPONENT_USER,                       // Directory that contains user-wide
+                                            // (component-updater-installer)
+                                            // component implementations.
+  // The following paths live in the user directory only, and point to the base
+  // installation directory for the component.
+  DIR_COMPONENT_CLD2,              // The Compact Language Detector.
+  DIR_RECOVERY_BASE,               // The Recovery.
+  DIR_SWIFT_SHADER,                // The SwiftShader.
+  DIR_SUPERVISED_USER_WHITELISTS,  // The Supervised user whitelists.
   PATH_END
 };
 
 // Call once to register the provider for the path keys defined above.
-// |components_root_key| is the path provider key defining where the
-// components should be installed.
-void RegisterPathProvider(int components_root_key);
+// |components_system_root_key| is the path provider key defining where bundled
+// components are already installed system-wide.
+// |components_user_root_key| is the path provider key defining where the
+// component updater should install new versions of components.
+void RegisterPathProvider(int components_system_root_key,
+                          int components_user_root_key);
 
 }  // namespace component_updater
 
diff --git a/components/component_updater/default_component_installer.cc b/components/component_updater/default_component_installer.cc
index 7d896d3..61a0d78 100644
--- a/components/component_updater/default_component_installer.cc
+++ b/components/component_updater/default_component_installer.cc
@@ -12,11 +12,13 @@
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/location.h"
+#include "base/path_service.h"
 #include "base/sequenced_task_runner.h"
 #include "base/single_thread_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/values.h"
 #include "base/version.h"
+#include "components/component_updater/component_updater_paths.h"
 // TODO(ddorwin): Find a better place for ReadManifest.
 #include "components/component_updater/component_updater_service.h"
 #include "components/update_client/component_unpacker.h"
@@ -106,8 +108,11 @@
     return false;
   if (current_version_.CompareTo(version) > 0)
     return false;
-  base::FilePath install_path =
-      installer_traits_->GetBaseDirectory().AppendASCII(version.GetString());
+  base::FilePath install_path;
+  if (!PathService::Get(DIR_COMPONENT_USER, &install_path))
+    return false;
+  install_path = install_path.Append(installer_traits_->GetRelativeInstallDir())
+                     .AppendASCII(version.GetString());
   if (base::PathExists(install_path)) {
     if (!base::DeleteFile(install_path, true))
       return false;
@@ -117,6 +122,7 @@
     return false;
   }
   current_version_ = version;
+  current_install_dir_ = install_path;
   // TODO(ddorwin): Change parameter to std::unique_ptr<base::DictionaryValue>
   // so we can avoid this DeepCopy.
   current_manifest_.reset(manifest.DeepCopy());
@@ -134,10 +140,7 @@
     base::FilePath* installed_file) {
   if (current_version_ == base::Version(kNullVersion))
     return false;  // No component has been installed yet.
-
-  *installed_file = installer_traits_->GetBaseDirectory()
-                        .AppendASCII(current_version_.GetString())
-                        .AppendASCII(file);
+  *installed_file = current_install_dir_.AppendASCII(file);
   return true;
 }
 
@@ -149,21 +152,52 @@
   return true;
 }
 
+bool DefaultComponentInstaller::FindPreinstallation() {
+  base::FilePath path;
+  if (!PathService::Get(DIR_COMPONENT_PREINSTALLED, &path))
+    return false;
+  path = path.Append(installer_traits_->GetRelativeInstallDir());
+  if (!base::PathExists(path))
+    return false;
+  std::unique_ptr<base::DictionaryValue> manifest =
+      update_client::ReadManifest(path);
+  if (!manifest || !installer_traits_->VerifyInstallation(*manifest, path))
+    return false;
+  std::string version_lexical;
+  if (!manifest->GetStringASCII("version", &version_lexical))
+    return false;
+  const base::Version version(version_lexical);
+  if (!version.IsValid())
+    return false;
+  current_install_dir_ = path;
+  current_manifest_ = std::move(manifest);
+  current_version_ = version;
+  return true;
+}
+
 void DefaultComponentInstaller::StartRegistration(ComponentUpdateService* cus) {
   DCHECK(task_runner_.get());
   DCHECK(task_runner_->RunsTasksOnCurrentThread());
-  base::FilePath base_dir = installer_traits_->GetBaseDirectory();
+
+  base::Version latest_version(kNullVersion);
+
+  // First check for an installation set up alongside Chrome itself.
+  if (FindPreinstallation())
+    latest_version = current_version_;
+
+  // Then check for a higher-versioned user-wide installation.
+  base::FilePath latest_path;
+  std::unique_ptr<base::DictionaryValue> latest_manifest;
+  base::FilePath base_dir;
+  if (!PathService::Get(DIR_COMPONENT_USER, &base_dir))
+    return;
+  base_dir = base_dir.Append(installer_traits_->GetRelativeInstallDir());
   if (!base::PathExists(base_dir) && !base::CreateDirectory(base_dir)) {
     PLOG(ERROR) << "Could not create the base directory for "
                 << installer_traits_->GetName() << " ("
                 << base_dir.MaybeAsASCII() << ").";
     return;
   }
-
-  base::FilePath latest_path;
-  base::Version latest_version(kNullVersion);
-  std::unique_ptr<base::DictionaryValue> latest_manifest;
-
   std::vector<base::FilePath> older_paths;
   base::FileEnumerator file_enumerator(
       base_dir, false, base::FileEnumerator::DIRECTORIES);
@@ -196,10 +230,8 @@
 
     // New valid |version| folder found!
 
-    if (latest_manifest) {
-      DCHECK(!latest_path.empty());
+    if (!latest_path.empty())
       older_paths.push_back(latest_path);
-    }
 
     latest_path = path;
     latest_version = version;
@@ -209,6 +241,7 @@
   if (latest_manifest) {
     current_version_ = latest_version;
     current_manifest_ = std::move(latest_manifest);
+    current_install_dir_ = latest_path;
     // TODO(ddorwin): Remove these members and pass them directly to
     // FinishRegistration().
     base::ReadFileToString(latest_path.AppendASCII("manifest.fingerprint"),
@@ -224,8 +257,15 @@
 void DefaultComponentInstaller::UninstallOnTaskRunner() {
   DCHECK(task_runner_.get());
   DCHECK(task_runner_->RunsTasksOnCurrentThread());
-  const base::FilePath base_dir = installer_traits_->GetBaseDirectory();
 
+  // Only try to delete any files that are in our user-level install path.
+  base::FilePath userInstallPath;
+  if (!PathService::Get(DIR_COMPONENT_USER, &userInstallPath))
+    return;
+  if (!userInstallPath.IsParent(current_install_dir_))
+    return;
+
+  const base::FilePath base_dir = current_install_dir_.DirName();
   base::FileEnumerator file_enumerator(base_dir, false,
                                        base::FileEnumerator::DIRECTORIES);
   for (base::FilePath path = file_enumerator.Next(); !path.value().empty();
@@ -248,11 +288,6 @@
   }
 }
 
-base::FilePath DefaultComponentInstaller::GetInstallDirectory() {
-  return installer_traits_->GetBaseDirectory()
-      .AppendASCII(current_version_.GetString());
-}
-
 void DefaultComponentInstaller::FinishRegistration(
     ComponentUpdateService* cus,
     const base::Closure& callback) {
@@ -287,8 +322,8 @@
 void DefaultComponentInstaller::ComponentReady(
     std::unique_ptr<base::DictionaryValue> manifest) {
   VLOG(1) << "Component ready, version " << current_version_.GetString()
-          << " in " << GetInstallDirectory().value();
-  installer_traits_->ComponentReady(current_version_, GetInstallDirectory(),
+          << " in " << current_install_dir_.value();
+  installer_traits_->ComponentReady(current_version_, current_install_dir_,
                                     std::move(manifest));
 }
 
diff --git a/components/component_updater/default_component_installer.h b/components/component_updater/default_component_installer.h
index ff337df..e8f8df2 100644
--- a/components/component_updater/default_component_installer.h
+++ b/components/component_updater/default_component_installer.h
@@ -12,6 +12,7 @@
 #include <vector>
 
 #include "base/callback_forward.h"
+#include "base/files/file_path.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/threading/thread_checker.h"
@@ -20,7 +21,6 @@
 #include "components/update_client/update_client.h"
 
 namespace base {
-class FilePath;
 class SequencedTaskRunner;
 class SingleThreadTaskRunner;
 }  // namespace base
@@ -76,9 +76,9 @@
       const base::FilePath& install_dir,
       std::unique_ptr<base::DictionaryValue> manifest) = 0;
 
-  // Returns the directory that the installer will place versioned installs of
-  // the component into.
-  virtual base::FilePath GetBaseDirectory() const = 0;
+  // Returns a relative path that will be appended to the component updater
+  // root directories to find the data for this particular component.
+  virtual base::FilePath GetRelativeInstallDir() const = 0;
 
   // Returns the component's SHA2 hash as raw bytes.
   virtual void GetHash(std::vector<uint8_t>* hash) const = 0;
@@ -112,12 +112,17 @@
                const base::FilePath& unpack_path) override;
   bool GetInstalledFile(const std::string& file,
                         base::FilePath* installed_file) override;
+  // Only user-level component installations can be uninstalled.
   bool Uninstall() override;
 
  private:
   ~DefaultComponentInstaller() override;
 
-  base::FilePath GetInstallDirectory();
+  // If there is a installation of the component set up alongside Chrome's
+  // files (as opposed to in the user data directory), sets current_* to the
+  // values associated with that installation and returns true; otherwise,
+  // returns false.
+  bool FindPreinstallation();
   bool InstallHelper(const base::DictionaryValue& manifest,
                      const base::FilePath& unpack_path,
                      const base::FilePath& install_path);
@@ -127,6 +132,7 @@
   void ComponentReady(std::unique_ptr<base::DictionaryValue> manifest);
   void UninstallOnTaskRunner();
 
+  base::FilePath current_install_dir_;
   base::Version current_version_;
   std::string current_fingerprint_;
   std::unique_ptr<base::DictionaryValue> current_manifest_;
diff --git a/components/contextual_search/common/OWNERS b/components/contextual_search/common/OWNERS
new file mode 100644
index 0000000..9e621796
--- /dev/null
+++ b/components/contextual_search/common/OWNERS
@@ -0,0 +1,13 @@
+# Changes to Mojo interfaces require a security review to avoid
+# introducing new sandbox escapes.
+per-file *.mojom=set noparent
+per-file *.mojom=dcheng@chromium.org
+per-file *.mojom=inferno@chromium.org
+per-file *.mojom=jln@chromium.org
+per-file *.mojom=jschuh@chromium.org
+per-file *.mojom=kenrb@chromium.org
+per-file *.mojom=mkwst@chromium.org
+per-file *.mojom=nasko@chromium.org
+per-file *.mojom=palmer@chromium.org
+per-file *.mojom=tsepez@chromium.org
+per-file *.mojom=wfh@chromium.org
diff --git a/components/cronet.gypi b/components/cronet.gypi
index 0b8ca753..76f3bfc0 100644
--- a/components/cronet.gypi
+++ b/components/cronet.gypi
@@ -40,10 +40,10 @@
           'includes': [ '../build/android/java_cpp_enum.gypi' ],
         },
         {
-          'target_name': 'network_quality_observations_java',
+          'target_name': 'network_quality_observation_source_java',
           'type': 'none',
           'variables': {
-            'source_file': '../net/nqe/network_quality_estimator.h',
+            'source_file': '../net/nqe/network_quality_observation_source.h',
           },
           'includes': [ '../build/android/java_cpp_enum.gypi' ],
         },
@@ -231,7 +231,7 @@
             'url_request_error_java',
             'cronet_version',
             'load_states_list',
-            'network_quality_observations_java',
+            'network_quality_observation_source_java',
             '../third_party/android_tools/android_tools.gyp:android_support_annotations_javalib',
           ],
           'variables': {
@@ -250,7 +250,7 @@
             'chromium_url_request_java',
             'libcronet',
             'net_request_priority_java',
-            'network_quality_observations_java',
+            'network_quality_observation_source_java',
             '../third_party/android_tools/android_tools.gyp:android_support_annotations_javalib',
           ],
           'variables': {
@@ -785,7 +785,7 @@
           ],
         },
         {
-          'target_name': 'libcronet',
+          'target_name': 'libcronet_shared',
           'type': 'shared_library',
           'sources': [
             'cronet/ios/Cronet.h',
@@ -879,7 +879,7 @@
             'dependencies': [
               # Depend on the dummy target so that all of CrNet's dependencies
               # are built before packaging.
-              'libcronet',
+              'libcronet_shared',
             ],
             'actions': [
               {
@@ -891,13 +891,13 @@
                 # Actions need an inputs list, even if it's empty.
                 'inputs': [
                   '<(tool_path)',
-                  '<(PRODUCT_DIR)/libcronet.dylib',
+                  '<(PRODUCT_DIR)/libcronet_shared.dylib',
                 ],
                 # Only specify one output, since this will be libtool's output.
                 'outputs': [ '<(package_dir)/libcronet_standalone_with_symbols.a' ],
                 'action': ['<(tool_path)',
                            '<(PRODUCT_DIR)',
-                           'libcronet.dylib',
+                           'libcronet_shared.dylib',
                            '<@(_outputs)',
                 ],
               },
diff --git a/components/cronet/android/BUILD.gn b/components/cronet/android/BUILD.gn
index ee5bc3f..48b9104 100644
--- a/components/cronet/android/BUILD.gn
+++ b/components/cronet/android/BUILD.gn
@@ -41,9 +41,9 @@
   ]
 }
 
-java_cpp_enum("network_quality_observations_java") {
+java_cpp_enum("network_quality_observation_source_java") {
   sources = [
-    "//net/nqe/network_quality_estimator.h",
+    "//net/nqe/network_quality_observation_source.h",
   ]
 }
 
@@ -264,7 +264,7 @@
     ":http_cache_type_java",
     ":url_request_error_java",
     ":load_states_list",
-    ":network_quality_observations_java",
+    ":network_quality_observation_source_java",
   ]
 
   run_findbugs_override = true
diff --git a/components/cronet/android/cronet_bidirectional_stream_adapter.cc b/components/cronet/android/cronet_bidirectional_stream_adapter.cc
index 6b49a60..60629be1 100644
--- a/components/cronet/android/cronet_bidirectional_stream_adapter.cc
+++ b/components/cronet/android/cronet_bidirectional_stream_adapter.cc
@@ -49,6 +49,24 @@
 
 }  // namespace
 
+PendingWriteData::PendingWriteData(JNIEnv* env,
+                                   jobjectArray jwrite_buffer_list,
+                                   jintArray jwrite_buffer_pos_list,
+                                   jintArray jwrite_buffer_limit_list,
+                                   jboolean jwrite_end_of_stream) {
+  this->jwrite_buffer_list.Reset(env, jwrite_buffer_list);
+  this->jwrite_buffer_pos_list.Reset(env, jwrite_buffer_pos_list);
+  this->jwrite_buffer_limit_list.Reset(env, jwrite_buffer_limit_list);
+  this->jwrite_end_of_stream = jwrite_end_of_stream;
+}
+
+PendingWriteData::~PendingWriteData() {
+  // Reset global references.
+  jwrite_buffer_list.Reset();
+  jwrite_buffer_pos_list.Reset();
+  jwrite_buffer_limit_list.Reset();
+}
+
 static jlong CreateBidirectionalStream(
     JNIEnv* env,
     const base::android::JavaParamRef<jobject>& jbidi_stream,
@@ -79,7 +97,6 @@
     : context_(context),
       owner_(env, jbidi_stream),
       disable_auto_flush_(disable_auto_flush),
-      write_end_of_stream_(false),
       stream_failed_(false) {}
 
 CronetBidirectionalStreamAdapter::~CronetBidirectionalStreamAdapter() {
@@ -164,29 +181,35 @@
     return JNI_FALSE;
   }
 
-  IOBufferWithByteBufferList buffers;
+  std::unique_ptr<PendingWriteData> pending_write_data;
+  pending_write_data.reset(
+      new PendingWriteData(env, jbyte_buffers.obj(), jbyte_buffers_pos.obj(),
+                           jbyte_buffers_limit.obj(), jend_of_stream));
   for (size_t i = 0; i < buffers_array_size; ++i) {
     ScopedJavaLocalRef<jobject> jbuffer(
-        env, env->GetObjectArrayElement(jbyte_buffers, i));
+        env, env->GetObjectArrayElement(
+                 pending_write_data->jwrite_buffer_list.obj(), i));
     void* data = env->GetDirectBufferAddress(jbuffer.obj());
     if (!data)
       return JNI_FALSE;
     jint pos;
-    env->GetIntArrayRegion(jbyte_buffers_pos.obj(), i, 1, &pos);
+    env->GetIntArrayRegion(pending_write_data->jwrite_buffer_pos_list.obj(), i,
+                           1, &pos);
     jint limit;
-    env->GetIntArrayRegion(jbyte_buffers_limit.obj(), i, 1, &limit);
+    env->GetIntArrayRegion(pending_write_data->jwrite_buffer_limit_list.obj(),
+                           i, 1, &limit);
     DCHECK_LE(pos, limit);
-    scoped_refptr<IOBufferWithByteBuffer> write_buffer(
-        new IOBufferWithByteBuffer(
-            env, base::android::JavaParamRef<jobject>(env, jbuffer.Release()),
-            data, pos, limit));
-    buffers.push_back(write_buffer);
+    scoped_refptr<net::WrappedIOBuffer> write_buffer(
+        new net::WrappedIOBuffer(static_cast<char*>(data) + pos));
+    pending_write_data->write_buffer_list.push_back(write_buffer);
+    pending_write_data->write_buffer_len_list.push_back(limit - pos);
   }
+
   context_->PostTaskToNetworkThread(
       FROM_HERE,
       base::Bind(&CronetBidirectionalStreamAdapter::WritevDataOnNetworkThread,
-                 base::Unretained(this), buffers, jend_of_stream));
-
+                 base::Unretained(this),
+                 base::Passed(std::move(pending_write_data))));
   return JNI_TRUE;
 }
 
@@ -254,35 +277,18 @@
 
 void CronetBidirectionalStreamAdapter::OnDataSent() {
   DCHECK(context_->IsOnNetworkThread());
-  DCHECK(!write_buffer_list_.empty());
+  DCHECK(pending_write_data_);
 
   JNIEnv* env = base::android::AttachCurrentThread();
-  base::android::ScopedJavaLocalRef<jclass> byte_buffer_clazz(
-      env, env->FindClass("java/nio/ByteBuffer"));
-  size_t size = write_buffer_list_.size();
-  jobjectArray jbuffer_array =
-      env->NewObjectArray(size, byte_buffer_clazz.obj(), NULL);
-  base::android::CheckException(env);
-  std::vector<int> initial_positions;
-  std::vector<int> initial_limits;
-  for (size_t i = 0; i < size; ++i) {
-    env->SetObjectArrayElement(jbuffer_array, i,
-                               write_buffer_list_[i]->byte_buffer());
-    initial_positions.push_back(write_buffer_list_[i]->initial_position());
-    initial_limits.push_back(write_buffer_list_[i]->initial_limit());
-  }
-  ScopedJavaLocalRef<jobjectArray> jbuffers(env, jbuffer_array);
-  ScopedJavaLocalRef<jintArray> jinitial_positions =
-      base::android::ToJavaIntArray(env, initial_positions);
-  ScopedJavaLocalRef<jintArray> jinitial_limits =
-      base::android::ToJavaIntArray(env, initial_limits);
   // Call into Java.
   cronet::Java_CronetBidirectionalStream_onWritevCompleted(
-      env, owner_.obj(), jbuffers.obj(), jinitial_positions.obj(),
-      jinitial_limits.obj(), write_end_of_stream_);
-  // Free the write buffers. This lets the Java ByteBuffer be freed, if the
+      env, owner_.obj(), pending_write_data_->jwrite_buffer_list.obj(),
+      pending_write_data_->jwrite_buffer_pos_list.obj(),
+      pending_write_data_->jwrite_buffer_limit_list.obj(),
+      pending_write_data_->jwrite_end_of_stream);
+  // Free the java objects. This lets the Java ByteBuffers be freed, if the
   // embedder releases it, too.
-  write_buffer_list_.clear();
+  pending_write_data_.reset();
 }
 
 void CronetBidirectionalStreamAdapter::OnTrailersReceived(
@@ -340,12 +346,10 @@
 }
 
 void CronetBidirectionalStreamAdapter::WritevDataOnNetworkThread(
-    const IOBufferWithByteBufferList& write_buffer_list,
-    bool end_of_stream) {
+    std::unique_ptr<PendingWriteData> pending_write_data) {
   DCHECK(context_->IsOnNetworkThread());
-  DCHECK(write_buffer_list_.empty());
-  DCHECK(!write_buffer_list.empty());
-  DCHECK(!write_end_of_stream_);
+  DCHECK(pending_write_data);
+  DCHECK(!pending_write_data_);
 
   if (stream_failed_) {
     // If stream failed between the time when WritevData is invoked and
@@ -356,18 +360,16 @@
     return;
   }
 
-  write_end_of_stream_ = end_of_stream;
-  std::vector<net::IOBuffer*> buffers;
-  std::vector<int> lengths;
-  for (const auto& buffer : write_buffer_list) {
-    write_buffer_list_.push_back(buffer);
-    buffers.push_back(buffer.get());
-    lengths.push_back(buffer->initial_limit() - buffer->initial_position());
-  }
-  if (buffers.size() == 1) {
-    bidi_stream_->SendData(buffers[0], lengths[0], end_of_stream);
+  pending_write_data_ = std::move(pending_write_data);
+  bool end_of_stream = pending_write_data_->jwrite_end_of_stream == JNI_TRUE;
+  if (pending_write_data_->write_buffer_list.size() == 1) {
+    bidi_stream_->SendData(pending_write_data_->write_buffer_list[0],
+                           pending_write_data_->write_buffer_len_list[0],
+                           end_of_stream);
   } else {
-    bidi_stream_->SendvData(buffers, lengths, end_of_stream);
+    bidi_stream_->SendvData(pending_write_data_->write_buffer_list,
+                            pending_write_data_->write_buffer_len_list,
+                            end_of_stream);
   }
 }
 
diff --git a/components/cronet/android/cronet_bidirectional_stream_adapter.h b/components/cronet/android/cronet_bidirectional_stream_adapter.h
index 4ed2dea9..2bb8051 100644
--- a/components/cronet/android/cronet_bidirectional_stream_adapter.h
+++ b/components/cronet/android/cronet_bidirectional_stream_adapter.h
@@ -28,6 +28,32 @@
 class CronetURLRequestContextAdapter;
 class IOBufferWithByteBuffer;
 
+// Convenient wrapper to hold Java references and data to represent the pending
+// data to be written.
+struct PendingWriteData {
+  PendingWriteData(JNIEnv* env,
+                   jobjectArray jwrite_buffer_list,
+                   jintArray jwrite_buffer_pos_list,
+                   jintArray jwrite_buffer_limit_list,
+                   jboolean jwrite_end_of_stream);
+  ~PendingWriteData();
+
+  // Arguments passed in from Java. Retain a global ref so they won't get GC-ed
+  // until the corresponding onWriteCompleted is invoked.
+  base::android::ScopedJavaGlobalRef<jobjectArray> jwrite_buffer_list;
+  base::android::ScopedJavaGlobalRef<jintArray> jwrite_buffer_pos_list;
+  base::android::ScopedJavaGlobalRef<jintArray> jwrite_buffer_limit_list;
+  // A copy of the end of stream flag passed in from Java.
+  jboolean jwrite_end_of_stream;
+  // Every IOBuffer in |write_buffer_list| points to the memory owned by the
+  // corresponding Java ByteBuffer in |jwrite_buffer_list|.
+  std::vector<scoped_refptr<net::IOBuffer>> write_buffer_list;
+  // A list of the length of each IOBuffer in |write_buffer_list|.
+  std::vector<int> write_buffer_len_list;
+
+  DISALLOW_COPY_AND_ASSIGN(PendingWriteData);
+};
+
 // An adapter from Java BidirectionalStream object to net::BidirectionalStream.
 // Created and configured from a Java thread. Start, ReadData, WritevData and
 // Destroy can be called on any thread (including network thread), and post
@@ -94,8 +120,6 @@
                jboolean jsend_on_canceled);
 
  private:
-  typedef std::vector<scoped_refptr<IOBufferWithByteBuffer>>
-      IOBufferWithByteBufferList;
   // net::BidirectionalStream::Delegate implementations:
   void OnStreamReady() override;
   void OnHeadersReceived(const net::SpdyHeaderBlock& response_headers) override;
@@ -109,8 +133,8 @@
   void ReadDataOnNetworkThread(
       scoped_refptr<IOBufferWithByteBuffer> read_buffer,
       int buffer_size);
-  void WritevDataOnNetworkThread(const IOBufferWithByteBufferList& buffers,
-                                 bool end_of_stream);
+  void WritevDataOnNetworkThread(
+      std::unique_ptr<PendingWriteData> pending_write_data);
   void DestroyOnNetworkThread(bool send_on_canceled);
   // Gets headers as a Java array.
   base::android::ScopedJavaLocalRef<jobjectArray> GetHeadersArray(
@@ -122,12 +146,9 @@
   // Java object that owns this CronetBidirectionalStreamAdapter.
   base::android::ScopedJavaGlobalRef<jobject> owner_;
   const bool disable_auto_flush_;
-  // Whether an end of stream flag is passed in through a write call.
-  // Not applicable to HTTP methods that do not send data.
-  bool write_end_of_stream_;
 
   scoped_refptr<IOBufferWithByteBuffer> read_buffer_;
-  IOBufferWithByteBufferList write_buffer_list_;
+  std::unique_ptr<PendingWriteData> pending_write_data_;
   std::unique_ptr<net::BidirectionalStream> bidi_stream_;
 
   // Whether BidirectionalStream::Delegate::OnFailed callback is invoked.
diff --git a/components/cronet/android/cronet_url_request_context_adapter.cc b/components/cronet/android/cronet_url_request_context_adapter.cc
index 9730c10..7eb6876 100644
--- a/components/cronet/android/cronet_url_request_context_adapter.cc
+++ b/components/cronet/android/cronet_url_request_context_adapter.cc
@@ -746,7 +746,7 @@
 void CronetURLRequestContextAdapter::OnRTTObservation(
     int32_t rtt_ms,
     const base::TimeTicks& timestamp,
-    net::NetworkQualityEstimator::ObservationSource source) {
+    net::NetworkQualityObservationSource source) {
   Java_CronetUrlRequestContext_onRttObservation(
       base::android::AttachCurrentThread(), jcronet_url_request_context_.obj(),
       rtt_ms, (timestamp - base::TimeTicks::UnixEpoch()).InMilliseconds(),
@@ -756,7 +756,7 @@
 void CronetURLRequestContextAdapter::OnThroughputObservation(
     int32_t throughput_kbps,
     const base::TimeTicks& timestamp,
-    net::NetworkQualityEstimator::ObservationSource source) {
+    net::NetworkQualityObservationSource source) {
   Java_CronetUrlRequestContext_onThroughputObservation(
       base::android::AttachCurrentThread(), jcronet_url_request_context_.obj(),
       throughput_kbps,
diff --git a/components/cronet/android/cronet_url_request_context_adapter.h b/components/cronet/android/cronet_url_request_context_adapter.h
index 7e2a3e14..f76b097b 100644
--- a/components/cronet/android/cronet_url_request_context_adapter.h
+++ b/components/cronet/android/cronet_url_request_context_adapter.h
@@ -19,6 +19,7 @@
 #include "base/threading/thread.h"
 #include "components/prefs/json_pref_store.h"
 #include "net/nqe/network_quality_estimator.h"
+#include "net/nqe/network_quality_observation_source.h"
 
 class PrefService;
 
@@ -143,16 +144,15 @@
   void ProvideThroughputObservationsOnNetworkThread(bool should);
 
   // net::NetworkQualityEstimator::RTTObserver implementation.
-  void OnRTTObservation(
-      int32_t rtt_ms,
-      const base::TimeTicks& timestamp,
-      net::NetworkQualityEstimator::ObservationSource source) override;
+  void OnRTTObservation(int32_t rtt_ms,
+                        const base::TimeTicks& timestamp,
+                        net::NetworkQualityObservationSource source) override;
 
   // net::NetworkQualityEstimator::ThroughputObserver implementation.
   void OnThroughputObservation(
       int32_t throughput_kbps,
       const base::TimeTicks& timestamp,
-      net::NetworkQualityEstimator::ObservationSource source) override;
+      net::NetworkQualityObservationSource source) override;
 
   // Network thread is owned by |this|, but is destroyed from java thread.
   base::Thread* network_thread_;
diff --git a/components/dom_distiller/content/common/OWNERS b/components/dom_distiller/content/common/OWNERS
new file mode 100644
index 0000000..9e621796
--- /dev/null
+++ b/components/dom_distiller/content/common/OWNERS
@@ -0,0 +1,13 @@
+# Changes to Mojo interfaces require a security review to avoid
+# introducing new sandbox escapes.
+per-file *.mojom=set noparent
+per-file *.mojom=dcheng@chromium.org
+per-file *.mojom=inferno@chromium.org
+per-file *.mojom=jln@chromium.org
+per-file *.mojom=jschuh@chromium.org
+per-file *.mojom=kenrb@chromium.org
+per-file *.mojom=mkwst@chromium.org
+per-file *.mojom=nasko@chromium.org
+per-file *.mojom=palmer@chromium.org
+per-file *.mojom=tsepez@chromium.org
+per-file *.mojom=wfh@chromium.org
diff --git a/components/filesystem/public/interfaces/OWNERS b/components/filesystem/public/interfaces/OWNERS
new file mode 100644
index 0000000..9e621796
--- /dev/null
+++ b/components/filesystem/public/interfaces/OWNERS
@@ -0,0 +1,13 @@
+# Changes to Mojo interfaces require a security review to avoid
+# introducing new sandbox escapes.
+per-file *.mojom=set noparent
+per-file *.mojom=dcheng@chromium.org
+per-file *.mojom=inferno@chromium.org
+per-file *.mojom=jln@chromium.org
+per-file *.mojom=jschuh@chromium.org
+per-file *.mojom=kenrb@chromium.org
+per-file *.mojom=mkwst@chromium.org
+per-file *.mojom=nasko@chromium.org
+per-file *.mojom=palmer@chromium.org
+per-file *.mojom=tsepez@chromium.org
+per-file *.mojom=wfh@chromium.org
diff --git a/components/font_service/public/interfaces/OWNERS b/components/font_service/public/interfaces/OWNERS
new file mode 100644
index 0000000..9e621796
--- /dev/null
+++ b/components/font_service/public/interfaces/OWNERS
@@ -0,0 +1,13 @@
+# Changes to Mojo interfaces require a security review to avoid
+# introducing new sandbox escapes.
+per-file *.mojom=set noparent
+per-file *.mojom=dcheng@chromium.org
+per-file *.mojom=inferno@chromium.org
+per-file *.mojom=jln@chromium.org
+per-file *.mojom=jschuh@chromium.org
+per-file *.mojom=kenrb@chromium.org
+per-file *.mojom=mkwst@chromium.org
+per-file *.mojom=nasko@chromium.org
+per-file *.mojom=palmer@chromium.org
+per-file *.mojom=tsepez@chromium.org
+per-file *.mojom=wfh@chromium.org
diff --git a/components/leveldb/public/interfaces/OWNERS b/components/leveldb/public/interfaces/OWNERS
new file mode 100644
index 0000000..9e621796
--- /dev/null
+++ b/components/leveldb/public/interfaces/OWNERS
@@ -0,0 +1,13 @@
+# Changes to Mojo interfaces require a security review to avoid
+# introducing new sandbox escapes.
+per-file *.mojom=set noparent
+per-file *.mojom=dcheng@chromium.org
+per-file *.mojom=inferno@chromium.org
+per-file *.mojom=jln@chromium.org
+per-file *.mojom=jschuh@chromium.org
+per-file *.mojom=kenrb@chromium.org
+per-file *.mojom=mkwst@chromium.org
+per-file *.mojom=nasko@chromium.org
+per-file *.mojom=palmer@chromium.org
+per-file *.mojom=tsepez@chromium.org
+per-file *.mojom=wfh@chromium.org
diff --git a/components/metrics/file_metrics_provider.cc b/components/metrics/file_metrics_provider.cc
index a935a83..5a6c14a 100644
--- a/components/metrics/file_metrics_provider.cc
+++ b/components/metrics/file_metrics_provider.cc
@@ -6,6 +6,7 @@
 
 #include "base/command_line.h"
 #include "base/files/file.h"
+#include "base/files/file_enumerator.h"
 #include "base/files/file_util.h"
 #include "base/files/memory_mapped_file.h"
 #include "base/logging.h"
@@ -24,22 +25,27 @@
 
 namespace metrics {
 
-// This structure stores all the information about the files being monitored
+// This structure stores all the information about the sources being monitored
 // and their current reporting state.
-struct FileMetricsProvider::FileInfo {
-  FileInfo(FileType file_type) : type(file_type) {}
-  ~FileInfo() {}
+struct FileMetricsProvider::SourceInfo {
+  SourceInfo(SourceType source_type) : type(source_type) {}
+  ~SourceInfo() {}
 
-  // How to access this file (atomic/active).
-  const FileType type;
+  // How to access this source (file/dir, atomic/active).
+  const SourceType type;
 
-  // Where on disk the file is located.
+  // Where on disk the directory is located. This will only be populated when
+  // a directory is being monitored.
+  base::FilePath directory;
+
+  // Where on disk the file is located. If a directory is being monitored,
+  // this will be updated for whatever file is being read.
   base::FilePath path;
 
   // Name used inside prefs to persistent metadata.
   std::string prefs_key;
 
-  // The last-seen time of this file to detect change.
+  // The last-seen time of this source to detect change.
   base::Time last_seen;
 
   // Indicates if the data has been read out or not.
@@ -54,7 +60,7 @@
   std::unique_ptr<base::PersistentHistogramAllocator> allocator;
 
  private:
-  DISALLOW_COPY_AND_ASSIGN(FileInfo);
+  DISALLOW_COPY_AND_ASSIGN(SourceInfo);
 };
 
 FileMetricsProvider::FileMetricsProvider(
@@ -67,31 +73,39 @@
 
 FileMetricsProvider::~FileMetricsProvider() {}
 
-void FileMetricsProvider::RegisterFile(const base::FilePath& path,
-                                       FileType type,
-                                       FileAssociation file_association,
-                                       const base::StringPiece prefs_key) {
+void FileMetricsProvider::RegisterSource(const base::FilePath& path,
+                                         SourceType type,
+                                         SourceAssociation source_association,
+                                         const base::StringPiece prefs_key) {
   DCHECK(thread_checker_.CalledOnValidThread());
 
-  std::unique_ptr<FileInfo> file(new FileInfo(type));
-  file->path = path;
-  file->prefs_key = prefs_key.as_string();
+  std::unique_ptr<SourceInfo> source(new SourceInfo(type));
+  source->prefs_key = prefs_key.as_string();
+
+  switch (source->type) {
+    case SOURCE_HISTOGRAMS_ATOMIC_FILE:
+      source->path = path;
+      break;
+    case SOURCE_HISTOGRAMS_ATOMIC_DIR:
+      source->directory = path;
+      break;
+  }
 
   // |prefs_key| may be empty if the caller does not wish to persist the
   // state across instances of the program.
   if (pref_service_ && !prefs_key.empty()) {
-    file->last_seen = base::Time::FromInternalValue(
+    source->last_seen = base::Time::FromInternalValue(
         pref_service_->GetInt64(metrics::prefs::kMetricsLastSeenPrefix +
-                                file->prefs_key));
+                                source->prefs_key));
   }
 
-  switch (file_association) {
+  switch (source_association) {
     case ASSOCIATE_CURRENT_RUN:
-      files_to_check_.push_back(std::move(file));
+      sources_to_check_.push_back(std::move(source));
       break;
     case ASSOCIATE_PREVIOUS_RUN:
-      DCHECK_EQ(FILE_HISTOGRAMS_ATOMIC, file->type);
-      files_for_previous_run_.push_back(std::move(file));
+      DCHECK_EQ(SOURCE_HISTOGRAMS_ATOMIC_FILE, source->type);
+      sources_for_previous_run_.push_back(std::move(source));
       break;
   }
 }
@@ -104,12 +118,12 @@
 }
 
 // static
-void FileMetricsProvider::CheckAndMapNewMetricFilesOnTaskRunner(
-    FileMetricsProvider::FileInfoList* files) {
-  // This method has all state information passed in |files| and is intended
+void FileMetricsProvider::CheckAndMapNewMetricSourcesOnTaskRunner(
+    SourceInfoList* sources) {
+  // This method has all state information passed in |sources| and is intended
   // to run on a worker thread rather than the UI thread.
-  for (std::unique_ptr<FileInfo>& file : *files) {
-    AccessResult result = CheckAndMapNewMetrics(file.get());
+  for (std::unique_ptr<SourceInfo>& source : *sources) {
+    AccessResult result = CheckAndMapNewMetrics(source.get());
     // Some results are not reported in order to keep the dashboard clean.
     if (result != ACCESS_RESULT_DOESNT_EXIST &&
         result != ACCESS_RESULT_NOT_MODIFIED) {
@@ -119,164 +133,259 @@
   }
 }
 
-// This method has all state information passed in |file| and is intended
+// This method has all state information passed in |source| and is intended
 // to run on a worker thread rather than the UI thread.
 // static
 FileMetricsProvider::AccessResult FileMetricsProvider::CheckAndMapNewMetrics(
-    FileMetricsProvider::FileInfo* file) {
-  DCHECK(!file->mapped);
-  DCHECK(file->data.empty());
+    SourceInfo* source) {
+  DCHECK(!source->mapped);
+  DCHECK(source->data.empty());
+
+  if (!source->directory.empty() && !LocateNextFileInDirectory(source))
+    return ACCESS_RESULT_DOESNT_EXIST;
 
   base::File::Info info;
-  if (!base::GetFileInfo(file->path, &info))
+  if (!base::GetFileInfo(source->path, &info))
     return ACCESS_RESULT_DOESNT_EXIST;
 
   if (info.is_directory || info.size == 0)
     return ACCESS_RESULT_INVALID_FILE;
 
-  if (file->last_seen >= info.last_modified)
+  if (source->last_seen >= info.last_modified)
     return ACCESS_RESULT_NOT_MODIFIED;
 
-  // A new file of metrics has been found. Map it into memory.
+  // A new file of metrics has been found. Open it with exclusive access and
+  // map it into memory.
   // TODO(bcwhite): Make this open read/write when supported for "active".
-  file->mapped.reset(new base::MemoryMappedFile());
-  if (!file->mapped->Initialize(file->path)) {
-    file->mapped.reset();
+  base::File file(source->path, base::File::FLAG_OPEN |
+                                base::File::FLAG_READ |
+                                base::File::FLAG_EXCLUSIVE_READ);
+  if (!file.IsValid())
+    return ACCESS_RESULT_NO_EXCLUSIVE_OPEN;
+  source->mapped.reset(new base::MemoryMappedFile());
+  if (!source->mapped->Initialize(std::move(file))) {
+    source->mapped.reset();
     return ACCESS_RESULT_SYSTEM_MAP_FAILURE;
   }
 
   // Ensure any problems below don't occur repeatedly.
-  file->last_seen = info.last_modified;
+  source->last_seen = info.last_modified;
 
   // Test the validity of the file contents.
-  if (!base::FilePersistentMemoryAllocator::IsFileAcceptable(*file->mapped))
+  if (!base::FilePersistentMemoryAllocator::IsFileAcceptable(*source->mapped))
     return ACCESS_RESULT_INVALID_CONTENTS;
 
-  // For an "atomic" file, immediately copy the data into local memory and
-  // release the file so that it is not held open.
-  if (file->type == FILE_HISTOGRAMS_ATOMIC) {
-    file->data.assign(file->mapped->data(),
-                      file->mapped->data() + file->mapped->length());
-    file->mapped.reset();
+  switch (source->type) {
+    case SOURCE_HISTOGRAMS_ATOMIC_FILE:
+    case SOURCE_HISTOGRAMS_ATOMIC_DIR:
+      // For an "atomic" file, immediately copy the data into local memory
+      // and release the file so that it is not held open.
+      source->data.assign(source->mapped->data(),
+                          source->mapped->data() + source->mapped->length());
+      source->mapped.reset();
+      break;
   }
 
-  file->read_complete = false;
+  source->read_complete = false;
   return ACCESS_RESULT_SUCCESS;
 }
 
-void FileMetricsProvider::ScheduleFilesCheck() {
+bool FileMetricsProvider::LocateNextFileInDirectory(SourceInfo* source) {
+  DCHECK_EQ(SOURCE_HISTOGRAMS_ATOMIC_DIR, source->type);
+  DCHECK(!source->directory.empty());
+
+  // Open the directory and find all the files, remembering the oldest that
+  // has not been read. They can be removed and/or ignored if they're older
+  // than the last-check time.
+  base::Time oldest_file_time = base::Time::Now();
+  base::FilePath oldest_file_path;
+  base::FilePath file_path;
+  int file_count = 0;
+  int delete_count = 0;
+  base::FileEnumerator file_iter(source->directory, /*recursive=*/false,
+                                 base::FileEnumerator::FILES);
+  for (file_path = file_iter.Next(); !file_path.empty();
+       file_path = file_iter.Next()) {
+    base::FileEnumerator::FileInfo file_info = file_iter.GetInfo();
+
+    // Ignore directories and zero-sized files.
+    if (file_info.IsDirectory() || file_info.GetSize() == 0)
+      continue;
+
+    // Ignore temporary files.
+    base::FilePath::CharType first_character =
+        file_path.BaseName().value().front();
+    if (first_character == FILE_PATH_LITERAL('.') ||
+        first_character == FILE_PATH_LITERAL('_')) {
+      continue;
+    }
+
+    // Ignore non-PMA (Persistent Memory Allocator) files.
+    if (file_path.Extension() !=
+        base::PersistentMemoryAllocator::kFileExtension) {
+      continue;
+    }
+
+    // Process real files.
+    base::Time modified = file_info.GetLastModifiedTime();
+    if (modified > source->last_seen) {
+      // This file hasn't been read. Remember it if it is older than others.
+      if (modified < oldest_file_time) {
+        oldest_file_path = std::move(file_path);
+        oldest_file_time = modified;
+      }
+      ++file_count;
+    } else {
+      // This file has been read. Try to delete it. Ignore any errors because
+      // the file may be un-removeable by this process. It could, for example,
+      // have been created by a privileged process like setup.exe. Even if it
+      // is not removed, it will continue to be ignored bacuse of the older
+      // modification time.
+      base::DeleteFile(file_path, /*recursive=*/false);
+      ++delete_count;
+    }
+  }
+
+  UMA_HISTOGRAM_COUNTS_100("UMA.FileMetricsProvider.DirectoryFiles",
+                           file_count);
+  UMA_HISTOGRAM_COUNTS_100("UMA.FileMetricsProvider.DeletedFiles",
+                           delete_count);
+
+  // Stop now if there are no files to read.
+  if (oldest_file_path.empty())
+    return false;
+
+  // Set the active file to be the oldest modified file that has not yet
+  // been read.
+  source->path = std::move(oldest_file_path);
+  return true;
+}
+
+void FileMetricsProvider::ScheduleSourcesCheck() {
   DCHECK(thread_checker_.CalledOnValidThread());
-  if (files_to_check_.empty())
+  if (sources_to_check_.empty())
     return;
 
-  // Create an independent list of files for checking. This will be Owned()
+  // Create an independent list of sources for checking. This will be Owned()
   // by the reply call given to the task-runner, to be deleted when that call
   // has returned. It is also passed Unretained() to the task itself, safe
   // because that must complete before the reply runs.
-  FileInfoList* check_list = new FileInfoList();
-  std::swap(files_to_check_, *check_list);
+  SourceInfoList* check_list = new SourceInfoList();
+  std::swap(sources_to_check_, *check_list);
   task_runner_->PostTaskAndReply(
       FROM_HERE,
-      base::Bind(&FileMetricsProvider::CheckAndMapNewMetricFilesOnTaskRunner,
+      base::Bind(&FileMetricsProvider::CheckAndMapNewMetricSourcesOnTaskRunner,
                  base::Unretained(check_list)),
-      base::Bind(&FileMetricsProvider::RecordFilesChecked,
+      base::Bind(&FileMetricsProvider::RecordSourcesChecked,
                  weak_factory_.GetWeakPtr(), base::Owned(check_list)));
 }
 
-void FileMetricsProvider::RecordHistogramSnapshotsFromFile(
+void FileMetricsProvider::RecordHistogramSnapshotsFromSource(
     base::HistogramSnapshotManager* snapshot_manager,
-    FileInfo* file) {
+    SourceInfo* source) {
   DCHECK(thread_checker_.CalledOnValidThread());
   base::PersistentHistogramAllocator::Iterator histogram_iter(
-      file->allocator.get());
+      source->allocator.get());
 
   int histogram_count = 0;
   while (true) {
     std::unique_ptr<base::HistogramBase> histogram = histogram_iter.GetNext();
     if (!histogram)
       break;
-    if (file->type == FILE_HISTOGRAMS_ATOMIC)
-      snapshot_manager->PrepareFinalDeltaTakingOwnership(std::move(histogram));
-    else
-      snapshot_manager->PrepareDeltaTakingOwnership(std::move(histogram));
+    switch (source->type) {
+      case SOURCE_HISTOGRAMS_ATOMIC_FILE:
+      case SOURCE_HISTOGRAMS_ATOMIC_DIR:
+        snapshot_manager->PrepareFinalDeltaTakingOwnership(
+            std::move(histogram));
+        break;
+#if 0  // Not yet available.
+      case SOURCE_HISTOGRAMS_ACTIVE:
+        snapshot_manager->PrepareDeltaTakingOwnership(std::move(histogram));
+#endif
+    }
     ++histogram_count;
   }
 
   DVLOG(1) << "Reported " << histogram_count << " histograms from "
-           << file->path.value();
+           << source->path.value();
 }
 
-void FileMetricsProvider::CreateAllocatorForFile(FileInfo* file) {
-  DCHECK(!file->allocator);
+void FileMetricsProvider::CreateAllocatorForSource(SourceInfo* source) {
+  DCHECK(!source->allocator);
 
   // File data was validated earlier. Files are not considered "untrusted"
   // as some processes might be (e.g. Renderer) so there's no need to check
   // again to try to thwart some malicious actor that may have modified the
   // data between then and now.
-  if (file->mapped) {
-    DCHECK(file->data.empty());
+  if (source->mapped) {
+    DCHECK(source->data.empty());
     // TODO(bcwhite): Make this do read/write when supported for "active".
-    file->allocator.reset(new base::PersistentHistogramAllocator(
+    source->allocator.reset(new base::PersistentHistogramAllocator(
         base::WrapUnique(new base::FilePersistentMemoryAllocator(
-            std::move(file->mapped), 0, ""))));
+            std::move(source->mapped), 0, ""))));
   } else {
-    DCHECK(!file->mapped);
-    file->allocator.reset(new base::PersistentHistogramAllocator(
+    DCHECK(!source->mapped);
+    source->allocator.reset(new base::PersistentHistogramAllocator(
         base::WrapUnique(new base::PersistentMemoryAllocator(
-            &file->data[0], file->data.size(), 0, 0, "", true))));
+            &source->data[0], source->data.size(), 0, 0, "", true))));
   }
 }
 
-void FileMetricsProvider::RecordFilesChecked(FileInfoList* checked) {
+void FileMetricsProvider::RecordSourcesChecked(SourceInfoList* checked) {
   DCHECK(thread_checker_.CalledOnValidThread());
 
-  // Move each processed file to either the "to-read" list (for processing) or
-  // the "to-check" list (for future checking).
+  // Move each processed source to either the "to-read" list (for processing)
+  // or the "to-check" list (for future checking).
   for (auto iter = checked->begin(); iter != checked->end();) {
     auto temp = iter++;
-    const FileInfo* file = temp->get();
-    if (file->mapped || !file->data.empty())
-      files_to_read_.splice(files_to_read_.end(), *checked, temp);
+    const SourceInfo* source = temp->get();
+    if (source->mapped || !source->data.empty())
+      sources_to_read_.splice(sources_to_read_.end(), *checked, temp);
     else
-      files_to_check_.splice(files_to_check_.end(), *checked, temp);
+      sources_to_check_.splice(sources_to_check_.end(), *checked, temp);
   }
 }
 
-void FileMetricsProvider::RecordFileAsSeen(FileInfo* file) {
+void FileMetricsProvider::RecordSourceAsSeen(SourceInfo* source) {
   DCHECK(thread_checker_.CalledOnValidThread());
 
-  file->read_complete = true;
-  if (pref_service_ && !file->prefs_key.empty()) {
-    pref_service_->SetInt64(metrics::prefs::kMetricsLastSeenPrefix +
-                            file->prefs_key,
-                            file->last_seen.ToInternalValue());
+  source->read_complete = true;
+  if (pref_service_ && !source->prefs_key.empty()) {
+    pref_service_->SetInt64(
+        metrics::prefs::kMetricsLastSeenPrefix + source->prefs_key,
+        source->last_seen.ToInternalValue());
   }
 }
 
 void FileMetricsProvider::OnDidCreateMetricsLog() {
   DCHECK(thread_checker_.CalledOnValidThread());
 
-  // Move finished metric files back to list of monitored files.
-  for (auto iter = files_to_read_.begin(); iter != files_to_read_.end();) {
+  // Move finished metric sources back to list of monitored sources.
+  for (auto iter = sources_to_read_.begin(); iter != sources_to_read_.end();) {
     auto temp = iter++;
-    FileInfo* file = temp->get();
+    SourceInfo* source = temp->get();
 
-    // Atomic files are read once and then ignored unless they change.
-    if (file->type == FILE_HISTOGRAMS_ATOMIC && file->read_complete) {
-      DCHECK(!file->mapped);
-      file->allocator.reset();
-      file->data.clear();
+    switch (source->type) {
+      // Atomic files are read once and then ignored unless they change.
+      case SOURCE_HISTOGRAMS_ATOMIC_FILE:
+      case SOURCE_HISTOGRAMS_ATOMIC_DIR:
+        if (source->read_complete) {
+          DCHECK(!source->mapped);
+          source->allocator.reset();
+          source->data.clear();
+        }
+        break;
     }
 
-    if (!file->allocator && !file->mapped && file->data.empty())
-      files_to_check_.splice(files_to_check_.end(), files_to_read_, temp);
+    if (!source->allocator && !source->mapped && source->data.empty())
+      sources_to_check_.splice(sources_to_check_.end(), sources_to_read_, temp);
   }
 
   // Schedule a check to see if there are new metrics to load. If so, they
   // will be reported during the next collection run after this one. The
   // check is run off of the worker-pool so as to not cause delays on the
   // main UI thread (which is currently where metric collection is done).
-  ScheduleFilesCheck();
+  ScheduleSourcesCheck();
 
   // Clear any data for initial metrics since they're always reported
   // before the first call to this method. It couldn't be released after
@@ -284,33 +393,33 @@
   // will continue to be used by the caller after that method returns. Once
   // here, though, all actions to be done on the data have been completed.
 #if DCHECK_IS_ON()
-  for (const std::unique_ptr<FileInfo>& file : files_for_previous_run_)
-    DCHECK(file->read_complete);
+  for (const std::unique_ptr<SourceInfo>& source : sources_for_previous_run_)
+    DCHECK(source->read_complete);
 #endif
-  files_for_previous_run_.clear();
+  sources_for_previous_run_.clear();
 }
 
 bool FileMetricsProvider::HasInitialStabilityMetrics() {
   DCHECK(thread_checker_.CalledOnValidThread());
 
-  // Measure the total time spent checking all files as well as the time
+  // Measure the total time spent checking all sources as well as the time
   // per individual file. This method is called during startup and thus blocks
   // the initial showing of the browser window so it's important to know the
   // total delay.
   SCOPED_UMA_HISTOGRAM_TIMER("UMA.FileMetricsProvider.InitialCheckTime.Total");
 
-  // Check all files for previous run to see if they need to be read.
-  for (auto iter = files_for_previous_run_.begin();
-       iter != files_for_previous_run_.end();) {
+  // Check all sources for previous run to see if they need to be read.
+  for (auto iter = sources_for_previous_run_.begin();
+       iter != sources_for_previous_run_.end();) {
     SCOPED_UMA_HISTOGRAM_TIMER("UMA.FileMetricsProvider.InitialCheckTime.File");
 
     auto temp = iter++;
-    FileInfo* file = temp->get();
+    SourceInfo* source = temp->get();
 
     // This would normally be done on a background I/O thread but there
     // hasn't been a chance to run any at the time this method is called.
     // Do the check in-line.
-    AccessResult result = CheckAndMapNewMetrics(file);
+    AccessResult result = CheckAndMapNewMetrics(source);
     UMA_HISTOGRAM_ENUMERATION("UMA.FileMetricsProvider.InitialAccessResult",
                               result, ACCESS_RESULT_MAX);
 
@@ -320,48 +429,48 @@
     // run would associate it with the previous run which would no longer be
     // the run from which it came.
     if (result != ACCESS_RESULT_SUCCESS) {
-      RecordFileAsSeen(file);
-      files_for_previous_run_.erase(temp);
+      RecordSourceAsSeen(source);
+      sources_for_previous_run_.erase(temp);
     }
   }
 
-  return !files_for_previous_run_.empty();
+  return !sources_for_previous_run_.empty();
 }
 
 void FileMetricsProvider::RecordHistogramSnapshots(
     base::HistogramSnapshotManager* snapshot_manager) {
   DCHECK(thread_checker_.CalledOnValidThread());
 
-  // Measure the total time spent processing all files as well as the time
+  // Measure the total time spent processing all sources as well as the time
   // per individual file. This method is called on the UI thread so it's
   // important to know how much total "jank" may be introduced.
   SCOPED_UMA_HISTOGRAM_TIMER("UMA.FileMetricsProvider.SnapshotTime.Total");
 
-  for (std::unique_ptr<FileInfo>& file : files_to_read_) {
-    // Skip this file if the data has already been read.
-    if (file->read_complete)
+  for (std::unique_ptr<SourceInfo>& source : sources_to_read_) {
+    // Skip this source if the data has already been read.
+    if (source->read_complete)
       continue;
 
     SCOPED_UMA_HISTOGRAM_TIMER("UMA.FileMetricsProvider.SnapshotTime.File");
 
-    // If the file is mapped or loaded then it needs to have an allocator
+    // If the source is mapped or loaded then it needs to have an allocator
     // attached to it in order to read histograms out of it.
-    if (file->mapped || !file->data.empty())
-      CreateAllocatorForFile(file.get());
+    if (source->mapped || !source->data.empty())
+      CreateAllocatorForSource(source.get());
 
-    // A file should not be under "files to read" unless it has an allocator
+    // A source should not be under "sources to read" unless it has an allocator
     // or is memory-mapped (at which point it will have received an allocator
     // above). However, if this method gets called twice before the scheduled-
-    // files-check has a chance to clean up, this may trigger. This also
-    // catches the case where creating an allocator from the file has failed.
-    if (!file->allocator)
+    // sources-check has a chance to clean up, this may trigger. This also
+    // catches the case where creating an allocator from the source has failed.
+    if (!source->allocator)
       continue;
 
-    // Dump all histograms contained within the file to the snapshot-manager.
-    RecordHistogramSnapshotsFromFile(snapshot_manager, file.get());
+    // Dump all histograms contained within the source to the snapshot-manager.
+    RecordHistogramSnapshotsFromSource(snapshot_manager, source.get());
 
     // Update the last-seen time so it isn't read again unless it changes.
-    RecordFileAsSeen(file.get());
+    RecordSourceAsSeen(source.get());
   }
 }
 
@@ -369,28 +478,28 @@
     base::HistogramSnapshotManager* snapshot_manager) {
   DCHECK(thread_checker_.CalledOnValidThread());
 
-  // Measure the total time spent processing all files as well as the time
+  // Measure the total time spent processing all sources as well as the time
   // per individual file. This method is called during startup and thus blocks
   // the initial showing of the browser window so it's important to know the
   // total delay.
   SCOPED_UMA_HISTOGRAM_TIMER(
-      "UMA.FileMetricsProvider.InitialTotalSnapshotTime");
+      "UMA.FileMetricsProvider.InitialSnapshotTime.Total");
 
-  for (const std::unique_ptr<FileInfo>& file : files_for_previous_run_) {
+  for (const std::unique_ptr<SourceInfo>& source : sources_for_previous_run_) {
     SCOPED_UMA_HISTOGRAM_TIMER(
-        "UMA.FileMetricsProvider.InitialFileSnapshotTime");
+        "UMA.FileMetricsProvider.InitialSnapshotTime.File");
 
-    // The file needs to have an allocator attached to it in order to read
+    // The source needs to have an allocator attached to it in order to read
     // histograms out of it.
-    DCHECK(file->mapped || !file->data.empty());
-    CreateAllocatorForFile(file.get());
-    DCHECK(file->allocator);
+    DCHECK(source->mapped || !source->data.empty());
+    CreateAllocatorForSource(source.get());
+    DCHECK(source->allocator);
 
-    // Dump all histograms contained within the file to the snapshot-manager.
-    RecordHistogramSnapshotsFromFile(snapshot_manager, file.get());
+    // Dump all histograms contained within the source to the snapshot-manager.
+    RecordHistogramSnapshotsFromSource(snapshot_manager, source.get());
 
     // Update the last-seen time so it isn't read again unless it changes.
-    RecordFileAsSeen(file.get());
+    RecordSourceAsSeen(source.get());
   }
 }
 
diff --git a/components/metrics/file_metrics_provider.h b/components/metrics/file_metrics_provider.h
index f330d87..4fb0b86 100644
--- a/components/metrics/file_metrics_provider.h
+++ b/components/metrics/file_metrics_provider.h
@@ -32,16 +32,28 @@
 // Any number of files can be registered and will be polled once per upload
 // cycle (at startup and periodically thereafter -- about every 30 minutes
 // for desktop) for data to send.
-class FileMetricsProvider : public metrics::MetricsProvider {
+class FileMetricsProvider : public MetricsProvider {
  public:
-  enum FileType {
+  enum SourceType {
     // "Atomic" files are a collection of histograms that are written
     // completely in a single atomic operation (typically a write followed
     // by an atomic rename) and the file is never updated again except to
     // be replaced by a completely new set of histograms. This is the only
     // option that can be used if the file is not writeable by *this*
     // process.
-    FILE_HISTOGRAMS_ATOMIC,
+    SOURCE_HISTOGRAMS_ATOMIC_FILE,
+
+    // A directory of atomic PMA files. This handles a directory in which
+    // files of metrics are atomically added. Only files ending with ".pma"
+    // will be read. They are read according to their last-modified time and
+    // never read more that once (unless they change). Only one file will
+    // be read per reporting cycle. Filenames that start with a dot (.) or
+    // an underscore (_) are ignored so temporary files (perhaps created by
+    // the ImportantFileWriter) will not get read. Files that have been
+    // read will be attempted to be deleted; should those files not be
+    // deletable by this process, it is the reponsibility of the producer
+    // to keep the directory pruned in some manner.
+    SOURCE_HISTOGRAMS_ATOMIC_DIR,
 
     // "Active" files may be open by one or more other processes and updated
     // at any time with new samples or new histograms. Such files may also be
@@ -49,10 +61,10 @@
     // data written to them. The file should probably never be deleted because
     // there would be no guarantee that the data has been reported.
     // TODO(bcwhite): Enable when read/write mem-mapped files are supported.
-    //FILE_HISTOGRAMS_ACTIVE,
+    //SOURCE_HISTOGRAMS_ACTIVE_FILE,
   };
 
-  enum FileAssociation {
+  enum SourceAssociation {
     // Associates the metrics in the file with the current run of the browser.
     // The reporting will take place as part of the normal logging of
     // histograms.
@@ -69,15 +81,16 @@
                       PrefService* local_state);
   ~FileMetricsProvider() override;
 
-  // Indicates a file to be monitored and how the file is used. Because some
-  // metadata may persist across process restarts, preferences entries are
-  // used based on the |prefs_key| name. Call RegisterPrefs() with the same
-  // name to create the necessary keys in advance. Set |prefs_key| empty
-  // if no persistence is required.
-  void RegisterFile(const base::FilePath& path,
-                    FileType type,
-                    FileAssociation file_association,
-                    const base::StringPiece prefs_key);
+  // Indicates a file or directory to be monitored and how the file or files
+  // within that directory are used. Because some metadata may need to persist
+  // across process restarts, preferences entries are used based on the
+  // |prefs_key| name. Call RegisterPrefs() with the same name to create the
+  // necessary keys in advance. Set |prefs_key| empty if no persistence is
+  // required.
+  void RegisterSource(const base::FilePath& path,
+                      SourceType type,
+                      SourceAssociation source_association,
+                      const base::StringPiece prefs_key);
 
   // Registers all necessary preferences for maintaining persistent state
   // about a monitored file across process restarts. The |prefs_key| is
@@ -87,7 +100,6 @@
 
  private:
   friend class FileMetricsProviderTest;
-  FRIEND_TEST_ALL_PREFIXES(FileMetricsProviderTest, AccessMetrics);
   FRIEND_TEST_ALL_PREFIXES(FileMetricsProviderTest, AccessInitialMetrics);
 
   // The different results that can occur accessing a file.
@@ -110,39 +122,48 @@
     // File had invalid contents.
     ACCESS_RESULT_INVALID_CONTENTS,
 
+    // File could not be exclusively opened.
+    ACCESS_RESULT_NO_EXCLUSIVE_OPEN,
+
     ACCESS_RESULT_MAX
   };
 
-  // Information about files being monitored; defined and used exclusively
+  // Information about sources being monitored; defined and used exclusively
   // inside the .cc file.
-  struct FileInfo;
-  using FileInfoList = std::list<std::unique_ptr<FileInfo>>;
+  struct SourceInfo;
+  using SourceInfoList = std::list<std::unique_ptr<SourceInfo>>;
 
-  // Checks a list of files (on a task-runner allowed to do I/O) to see if
+  // Checks a list of sources (on a task-runner allowed to do I/O) to see if
   // any should be processed during the next histogram collection.
-  static void CheckAndMapNewMetricFilesOnTaskRunner(FileInfoList* files);
+  static void CheckAndMapNewMetricSourcesOnTaskRunner(SourceInfoList* sources);
 
-  // Checks an individual file as part of CheckAndMapNewMetricFilesOnTaskRunner.
-  static AccessResult CheckAndMapNewMetrics(FileInfo* file);
+  // Checks a single source as part of CheckAndMapNewMetricSourcesOnTaskRunner.
+  static AccessResult CheckAndMapNewMetrics(SourceInfo* source);
 
-  // Creates a task to check all monitored files for updates.
-  void ScheduleFilesCheck();
+  // Looks for the next file to read within a directory. Returns true if a
+  // file was found. This is part of CheckAndMapNewMetricSourcesOnTaskRunner
+  // and so runs on an thread capable of I/O. The |source| structure will
+  // be internally updated to indicate the next file to be read.
+  static bool LocateNextFileInDirectory(SourceInfo* source);
 
-  // Creates a PersistentMemoryAllocator for a file that has been marked to
+  // Creates a task to check all monitored sources for updates.
+  void ScheduleSourcesCheck();
+
+  // Creates a PersistentMemoryAllocator for a source that has been marked to
   // have its metrics collected.
-  void CreateAllocatorForFile(FileInfo* file);
+  void CreateAllocatorForSource(SourceInfo* source);
 
-  // Records all histograms from a given file via a snapshot-manager.
-  void RecordHistogramSnapshotsFromFile(
+  // Records all histograms from a given source via a snapshot-manager.
+  void RecordHistogramSnapshotsFromSource(
       base::HistogramSnapshotManager* snapshot_manager,
-      FileInfo* file);
+      SourceInfo* source);
 
-  // Takes a list of files checked by an external task and determines what
+  // Takes a list of sources checked by an external task and determines what
   // to do with each.
-  void RecordFilesChecked(FileInfoList* checked);
+  void RecordSourcesChecked(SourceInfoList* checked);
 
-  // Updates the persistent state information to show a file as being read.
-  void RecordFileAsSeen(FileInfo* file);
+  // Updates the persistent state information to show a source as being read.
+  void RecordSourceAsSeen(SourceInfo* source);
 
   // metrics::MetricsDataProvider:
   void OnDidCreateMetricsLog() override;
@@ -155,18 +176,18 @@
   // A task-runner capable of performing I/O.
   scoped_refptr<base::TaskRunner> task_runner_;
 
-  // A list of files not currently active that need to be checked for changes.
-  FileInfoList files_to_check_;
+  // A list of sources not currently active that need to be checked for changes.
+  SourceInfoList sources_to_check_;
 
-  // A list of files that have data to be read and reported.
-  FileInfoList files_to_read_;
+  // A list of sources that have data to be read and reported.
+  SourceInfoList sources_to_read_;
 
-  // A list of files for a previous run. These are held separately because
+  // A list of sources for a previous run. These are held separately because
   // they are not subject to the periodic background checking that handles
   // metrics for the current run.
-  FileInfoList files_for_previous_run_;
+  SourceInfoList sources_for_previous_run_;
 
-  // The preferences-service used to store persistent state about files.
+  // The preferences-service used to store persistent state about sources.
   PrefService* pref_service_;
 
   base::ThreadChecker thread_checker_;
diff --git a/components/metrics/file_metrics_provider_unittest.cc b/components/metrics/file_metrics_provider_unittest.cc
index 8c0f7af4..ffeeca63 100644
--- a/components/metrics/file_metrics_provider_unittest.cc
+++ b/components/metrics/file_metrics_provider_unittest.cc
@@ -7,6 +7,7 @@
 #include "base/files/file_util.h"
 #include "base/files/memory_mapped_file.h"
 #include "base/files/scoped_temp_dir.h"
+#include "base/macros.h"
 #include "base/metrics/histogram.h"
 #include "base/metrics/histogram_flattener.h"
 #include "base/metrics/histogram_snapshot_manager.h"
@@ -17,6 +18,7 @@
 #include "base/strings/stringprintf.h"
 #include "base/test/test_simple_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
+#include "base/time/time.h"
 #include "components/metrics/metrics_pref_names.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/testing_pref_service.h"
@@ -72,6 +74,10 @@
     FileMetricsProvider::RegisterPrefs(prefs_->registry(), kMetricsName);
   }
 
+  ~FileMetricsProviderTest() override {
+    base::GlobalHistogramAllocator::ReleaseForTesting();
+  }
+
   TestingPrefServiceSimple* prefs() { return prefs_.get(); }
   base::FilePath temp_dir() { return temp_dir_.path(); }
   base::FilePath metrics_file() {
@@ -84,10 +90,32 @@
     return provider_.get();
   }
 
+  void OnDidCreateMetricsLog() { provider()->OnDidCreateMetricsLog(); }
+
+  void RecordHistogramSnapshots(
+      base::HistogramSnapshotManager* snapshot_manager) {
+    provider()->RecordHistogramSnapshots(snapshot_manager);
+  }
+
   void RunTasks() {
     task_runner_->RunUntilIdle();
   }
 
+  void WriteMetricsFile(const base::FilePath& path,
+                        base::PersistentHistogramAllocator* metrics) {
+    base::File writer(path, base::File::FLAG_CREATE | base::File::FLAG_WRITE);
+    ASSERT_TRUE(writer.IsValid()) << path.value();
+    ASSERT_EQ(static_cast<int>(metrics->used()),
+              writer.Write(0, (const char*)metrics->data(), metrics->used()));
+  }
+
+  void WriteMetricsFileAtTime(const base::FilePath& path,
+                              base::PersistentHistogramAllocator* metrics,
+                              base::Time write_time) {
+    WriteMetricsFile(path, metrics);
+    base::TouchFile(path, write_time, write_time);
+  }
+
   void CreateMetricsFileWithHistograms(int histogram_count) {
     // Get this first so it isn't created inside the persistent allocator.
     base::GlobalHistogramAllocator::GetCreateHistogramResultHistogram();
@@ -104,14 +132,7 @@
 
     std::unique_ptr<base::PersistentHistogramAllocator> histogram_allocator =
         base::GlobalHistogramAllocator::ReleaseForTesting();
-    base::PersistentMemoryAllocator* allocator =
-        histogram_allocator->memory_allocator();
-    base::File writer(metrics_file(),
-                      base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
-    ASSERT_TRUE(writer.IsValid());
-    ASSERT_EQ(static_cast<int>(allocator->used()),
-              writer.Write(0, (const char*)allocator->data(),
-                           allocator->used()));
+    WriteMetricsFile(metrics_file(), histogram_allocator.get());
   }
 
  private:
@@ -131,20 +152,19 @@
 
   // Register the file and allow the "checker" task to run.
   ASSERT_TRUE(PathExists(metrics_file()));
-  provider()->RegisterFile(
-      metrics_file(),
-      FileMetricsProvider::FILE_HISTOGRAMS_ATOMIC,
-      FileMetricsProvider::ASSOCIATE_CURRENT_RUN,
-      kMetricsName);
+  provider()->RegisterSource(metrics_file(),
+                             FileMetricsProvider::SOURCE_HISTOGRAMS_ATOMIC_FILE,
+                             FileMetricsProvider::ASSOCIATE_CURRENT_RUN,
+                             kMetricsName);
 
   // Record embedded snapshots via snapshot-manager.
-  provider()->OnDidCreateMetricsLog();
+  OnDidCreateMetricsLog();
   RunTasks();
   {
     HistogramFlattenerDeltaRecorder flattener;
     base::HistogramSnapshotManager snapshot_manager(&flattener);
     snapshot_manager.StartDeltas();
-    provider()->RecordHistogramSnapshots(&snapshot_manager);
+    RecordHistogramSnapshots(&snapshot_manager);
     snapshot_manager.FinishDeltas();
     EXPECT_EQ(2U, flattener.GetRecordedDeltaHistogramNames().size());
   }
@@ -154,19 +174,19 @@
     HistogramFlattenerDeltaRecorder flattener;
     base::HistogramSnapshotManager snapshot_manager(&flattener);
     snapshot_manager.StartDeltas();
-    provider()->RecordHistogramSnapshots(&snapshot_manager);
+    RecordHistogramSnapshots(&snapshot_manager);
     snapshot_manager.FinishDeltas();
     EXPECT_EQ(0U, flattener.GetRecordedDeltaHistogramNames().size());
   }
 
   // Second full run on the same file should produce nothing.
-  provider()->OnDidCreateMetricsLog();
+  OnDidCreateMetricsLog();
   RunTasks();
   {
     HistogramFlattenerDeltaRecorder flattener;
     base::HistogramSnapshotManager snapshot_manager(&flattener);
     snapshot_manager.StartDeltas();
-    provider()->RecordHistogramSnapshots(&snapshot_manager);
+    RecordHistogramSnapshots(&snapshot_manager);
     snapshot_manager.FinishDeltas();
     EXPECT_EQ(0U, flattener.GetRecordedDeltaHistogramNames().size());
   }
@@ -182,29 +202,113 @@
   }
 
   // This run should again have "new" histograms.
-  provider()->OnDidCreateMetricsLog();
+  OnDidCreateMetricsLog();
   RunTasks();
   {
     HistogramFlattenerDeltaRecorder flattener;
     base::HistogramSnapshotManager snapshot_manager(&flattener);
     snapshot_manager.StartDeltas();
-    provider()->RecordHistogramSnapshots(&snapshot_manager);
+    RecordHistogramSnapshots(&snapshot_manager);
     snapshot_manager.FinishDeltas();
     EXPECT_EQ(2U, flattener.GetRecordedDeltaHistogramNames().size());
   }
 }
 
+TEST_F(FileMetricsProviderTest, AccessDirectory) {
+  ASSERT_FALSE(PathExists(metrics_file()));
+
+  // Get this first so it isn't created inside the persistent allocator.
+  base::GlobalHistogramAllocator::GetCreateHistogramResultHistogram();
+
+  base::GlobalHistogramAllocator::CreateWithLocalMemory(
+      64 << 10, 0, kMetricsName);
+  base::GlobalHistogramAllocator* allocator =
+      base::GlobalHistogramAllocator::Get();
+  base::HistogramBase* histogram;
+
+  // Create files starting with a timestamp a few minutes back.
+  base::Time base_time = base::Time::Now() - base::TimeDelta::FromMinutes(10);
+
+  // Create some files in an odd order. The files are "touched" back in time to
+  // ensure that each file has a later timestamp on disk than the previous one.
+  base::ScopedTempDir metrics_files;
+  EXPECT_TRUE(metrics_files.CreateUniqueTempDir());
+  WriteMetricsFileAtTime(metrics_files.path().AppendASCII(".foo.pma"),
+                         allocator, base_time);
+  WriteMetricsFileAtTime(metrics_files.path().AppendASCII("_bar.pma"),
+                         allocator, base_time);
+
+  histogram = base::Histogram::FactoryGet("h1", 1, 100, 10, 0);
+  histogram->Add(1);
+  WriteMetricsFileAtTime(metrics_files.path().AppendASCII("a1.pma"), allocator,
+                         base_time + base::TimeDelta::FromMinutes(1));
+
+  histogram = base::Histogram::FactoryGet("h2", 1, 100, 10, 0);
+  histogram->Add(2);
+  WriteMetricsFileAtTime(metrics_files.path().AppendASCII("c2.pma"), allocator,
+                         base_time + base::TimeDelta::FromMinutes(2));
+
+  histogram = base::Histogram::FactoryGet("h3", 1, 100, 10, 0);
+  histogram->Add(3);
+  WriteMetricsFileAtTime(metrics_files.path().AppendASCII("b3.pma"), allocator,
+                         base_time + base::TimeDelta::FromMinutes(3));
+
+  histogram = base::Histogram::FactoryGet("h4", 1, 100, 10, 0);
+  histogram->Add(3);
+  WriteMetricsFileAtTime(metrics_files.path().AppendASCII("d4.pma"), allocator,
+                         base_time + base::TimeDelta::FromMinutes(4));
+
+  base::TouchFile(metrics_files.path().AppendASCII("b3.pma"),
+                  base_time + base::TimeDelta::FromMinutes(5),
+                  base_time + base::TimeDelta::FromMinutes(5));
+
+  WriteMetricsFileAtTime(metrics_files.path().AppendASCII("baz"), allocator,
+                         base_time + base::TimeDelta::FromMinutes(6));
+
+  // Register the file and allow the "checker" task to run.
+  provider()->RegisterSource(metrics_files.path(),
+                             FileMetricsProvider::SOURCE_HISTOGRAMS_ATOMIC_DIR,
+                             FileMetricsProvider::ASSOCIATE_CURRENT_RUN,
+                             kMetricsName);
+
+  // Files could come out in the order: a1, c2, d4, b3. They are recognizeable
+  // by the number of histograms contained within each.
+  const uint32_t expect_order[] = {1, 2, 4, 3, 0};
+  for (size_t i = 0; i < arraysize(expect_order); ++i) {
+    // Record embedded snapshots via snapshot-manager.
+    OnDidCreateMetricsLog();
+    RunTasks();
+
+    HistogramFlattenerDeltaRecorder flattener;
+    base::HistogramSnapshotManager snapshot_manager(&flattener);
+    snapshot_manager.StartDeltas();
+    RecordHistogramSnapshots(&snapshot_manager);
+    snapshot_manager.FinishDeltas();
+
+    EXPECT_EQ(expect_order[i],
+              flattener.GetRecordedDeltaHistogramNames().size())
+        << i;
+  }
+
+  EXPECT_FALSE(base::PathExists(metrics_files.path().AppendASCII("a1.pma")));
+  EXPECT_FALSE(base::PathExists(metrics_files.path().AppendASCII("c2.pma")));
+  EXPECT_FALSE(base::PathExists(metrics_files.path().AppendASCII("b3.pma")));
+  EXPECT_FALSE(base::PathExists(metrics_files.path().AppendASCII("d4.pma")));
+  EXPECT_TRUE(base::PathExists(metrics_files.path().AppendASCII(".foo.pma")));
+  EXPECT_TRUE(base::PathExists(metrics_files.path().AppendASCII("_bar.pma")));
+  EXPECT_TRUE(base::PathExists(metrics_files.path().AppendASCII("baz")));
+}
+
 TEST_F(FileMetricsProviderTest, AccessInitialMetrics) {
   ASSERT_FALSE(PathExists(metrics_file()));
   CreateMetricsFileWithHistograms(2);
 
   // Register the file and allow the "checker" task to run.
   ASSERT_TRUE(PathExists(metrics_file()));
-  provider()->RegisterFile(
-      metrics_file(),
-      FileMetricsProvider::FILE_HISTOGRAMS_ATOMIC,
-      FileMetricsProvider::ASSOCIATE_PREVIOUS_RUN,
-      kMetricsName);
+  provider()->RegisterSource(metrics_file(),
+                             FileMetricsProvider::SOURCE_HISTOGRAMS_ATOMIC_FILE,
+                             FileMetricsProvider::ASSOCIATE_PREVIOUS_RUN,
+                             kMetricsName);
 
   // Record embedded snapshots via snapshot-manager.
   provider()->HasInitialStabilityMetrics();
diff --git a/components/metrics/metrics_service.cc b/components/metrics/metrics_service.cc
index 9f88769..e2f1f4c 100644
--- a/components/metrics/metrics_service.cc
+++ b/components/metrics/metrics_service.cc
@@ -591,8 +591,10 @@
   }
 
   bool has_initial_stability_log = false;
+  bool providers_have_initial_stability_metrics =
+      ProvidersHaveInitialStabilityMetrics();
   if (!clean_exit_beacon_.exited_cleanly() ||
-      ProvidersHaveInitialStabilityMetrics()) {
+      providers_have_initial_stability_metrics) {
     // TODO(rtenneti): On windows, consider saving/getting execution_phase from
     // the registry.
     int execution_phase =
diff --git a/components/metrics/metrics_service_unittest.cc b/components/metrics/metrics_service_unittest.cc
index a19e27b..96e62f14 100644
--- a/components/metrics/metrics_service_unittest.cc
+++ b/components/metrics/metrics_service_unittest.cc
@@ -176,10 +176,15 @@
       std::unique_ptr<MetricsProvider>(test_provider));
 
   service.InitializeMetricsRecordingState();
+
   // No initial stability log should be generated.
   EXPECT_FALSE(service.log_manager()->has_unsent_logs());
   EXPECT_FALSE(service.log_manager()->has_staged_log());
 
+  // Ensure that HasInitialStabilityMetrics() is always called on providers,
+  // for consistency, even if other conditions already indicate their presence.
+  EXPECT_TRUE(test_provider->has_initial_stability_metrics_called());
+
   // The test provider should not have been called upon to provide initial
   // stability nor regular stability metrics.
   EXPECT_FALSE(test_provider->provide_initial_stability_metrics_called());
@@ -222,6 +227,10 @@
   EXPECT_TRUE(log_manager->has_unsent_logs());
   EXPECT_FALSE(log_manager->has_staged_log());
 
+  // Ensure that HasInitialStabilityMetrics() is always called on providers,
+  // for consistency, even if other conditions already indicate their presence.
+  EXPECT_TRUE(test_provider->has_initial_stability_metrics_called());
+
   // The test provider should have been called upon to provide initial
   // stability and regular stability metrics.
   EXPECT_TRUE(test_provider->provide_initial_stability_metrics_called());
@@ -286,6 +295,10 @@
   EXPECT_TRUE(log_manager->has_unsent_logs());
   EXPECT_FALSE(log_manager->has_staged_log());
 
+  // Ensure that HasInitialStabilityMetrics() is always called on providers,
+  // for consistency, even if other conditions already indicate their presence.
+  EXPECT_TRUE(test_provider->has_initial_stability_metrics_called());
+
   // The test provider should have been called upon to provide initial
   // stability and regular stability metrics.
   EXPECT_TRUE(test_provider->provide_initial_stability_metrics_called());
diff --git a/components/metrics/test_metrics_provider.cc b/components/metrics/test_metrics_provider.cc
index 409d8d12..db88ed4 100644
--- a/components/metrics/test_metrics_provider.cc
+++ b/components/metrics/test_metrics_provider.cc
@@ -17,6 +17,7 @@
 }
 
 bool TestMetricsProvider::HasInitialStabilityMetrics() {
+  has_initial_stability_metrics_called_ = true;
   return has_initial_stability_metrics_;
 }
 
diff --git a/components/metrics/test_metrics_provider.h b/components/metrics/test_metrics_provider.h
index 6536ea23..fd57158 100644
--- a/components/metrics/test_metrics_provider.h
+++ b/components/metrics/test_metrics_provider.h
@@ -18,6 +18,7 @@
       : init_called_(false),
         on_recording_disabled_called_(false),
         has_initial_stability_metrics_(false),
+        has_initial_stability_metrics_called_(false),
         provide_initial_stability_metrics_called_(false),
         provide_stability_metrics_called_(false) {}
 
@@ -32,6 +33,9 @@
 
   bool init_called() { return init_called_; }
   bool on_recording_disabled_called() { return on_recording_disabled_called_; }
+  bool has_initial_stability_metrics_called() {
+    return has_initial_stability_metrics_called_;
+  }
   void set_has_initial_stability_metrics(bool has_initial_stability_metrics) {
     has_initial_stability_metrics_ = has_initial_stability_metrics;
   }
@@ -46,6 +50,7 @@
   bool init_called_;
   bool on_recording_disabled_called_;
   bool has_initial_stability_metrics_;
+  bool has_initial_stability_metrics_called_;
   bool provide_initial_stability_metrics_called_;
   bool provide_stability_metrics_called_;
 
diff --git a/components/mus/gles2/BUILD.gn b/components/mus/gles2/BUILD.gn
index 7f2bb63..bfa0d5a 100644
--- a/components/mus/gles2/BUILD.gn
+++ b/components/mus/gles2/BUILD.gn
@@ -50,6 +50,7 @@
     "//ui/gfx",
     "//ui/gfx/geometry",
     "//ui/gl",
+    "//ui/gl/init",
     "//ui/mojo/geometry:interfaces",
   ]
 
diff --git a/components/mus/gles2/command_buffer_driver.cc b/components/mus/gles2/command_buffer_driver.cc
index 5b44ca99..49dea068 100644
--- a/components/mus/gles2/command_buffer_driver.cc
+++ b/components/mus/gles2/command_buffer_driver.cc
@@ -33,6 +33,7 @@
 #include "ui/gl/gl_context.h"
 #include "ui/gl/gl_image_shared_memory.h"
 #include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 
 #if defined(USE_OZONE)
 #include "ui/gl/gl_image_ozone_native_pixmap.h"
@@ -86,16 +87,16 @@
 
   const bool offscreen = widget_ == gfx::kNullAcceleratedWidget;
   if (offscreen) {
-    surface_ = gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size(0, 0));
+    surface_ = gl::init::CreateOffscreenGLSurface(gfx::Size(0, 0));
   } else {
 #if defined(USE_OZONE)
     scoped_refptr<gfx::GLSurface> underlying_surface =
-        gfx::GLSurface::CreateSurfacelessViewGLSurface(widget_);
+        gl::init::CreateSurfacelessViewGLSurface(widget_);
     if (!underlying_surface)
-      underlying_surface = gfx::GLSurface::CreateViewGLSurface(widget_);
+      underlying_surface = gl::init::CreateViewGLSurface(widget_);
 #else
     scoped_refptr<gfx::GLSurface> underlying_surface =
-        gfx::GLSurface::CreateViewGLSurface(widget_);
+        gl::init::CreateViewGLSurface(widget_);
 #endif
     scoped_refptr<GLSurfaceAdapterMus> surface_adapter =
         new GLSurfaceAdapterMus(underlying_surface);
@@ -117,7 +118,7 @@
     return false;
 
   // TODO(piman): virtual contexts, gpu preference.
-  context_ = gfx::GLContext::CreateGLContext(
+  context_ = gl::init::CreateGLContext(
       gpu_state_->share_group(), surface_.get(), gfx::PreferIntegratedGpu);
   if (!context_.get())
     return false;
diff --git a/components/mus/gles2/gpu_state.cc b/components/mus/gles2/gpu_state.cc
index 3733ff8..1ff542d1 100644
--- a/components/mus/gles2/gpu_state.cc
+++ b/components/mus/gles2/gpu_state.cc
@@ -10,7 +10,7 @@
 #include "base/threading/thread_restrictions.h"
 #include "gpu/config/gpu_info_collector.h"
 #include "ui/gl/gl_implementation.h"
-#include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 
 #if defined(USE_OZONE)
 #include "ui/ozone/public/ozone_platform.h"
@@ -48,7 +48,7 @@
 #if defined(USE_OZONE)
   ui::OzonePlatform::InitializeForGPU();
 #endif
-  hardware_rendering_available_ = gfx::GLSurface::InitializeOneOff();
+  hardware_rendering_available_ = gl::init::InitializeGLOneOff();
   command_buffer_task_runner_ = new CommandBufferTaskRunner;
   driver_manager_.reset(new CommandBufferDriverManager);
   sync_point_manager_.reset(new gpu::SyncPointManager(true));
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 dc439ce1..2fb60f3f 100644
--- a/components/mus/public/cpp/lib/window_tree_client_impl.cc
+++ b/components/mus/public/cpp/lib/window_tree_client_impl.cc
@@ -196,6 +196,16 @@
 }
 
 void WindowTreeClientImpl::DestroyWindow(Window* window) {
+  // TODO(jonross): Also clear the focused window (crbug.com/611983)
+  if (window == capture_window_) {
+    InFlightCaptureChange reset_change(this, nullptr);
+    ApplyServerChangeToExistingInFlightChange(reset_change);
+    // Normally just updating the queued changes is sufficient. However since
+    // |window| is being destroyed, it will not be possible to notify its
+    // observers
+    // of the lost capture. Update local state now.
+    LocalSetCapture(nullptr);
+  }
   DCHECK(tree_);
   const uint32_t change_id = ScheduleInFlightChange(base::WrapUnique(
       new CrashInFlightChange(window, ChangeType::DELETE_WINDOW)));
diff --git a/components/mus/public/interfaces/OWNERS b/components/mus/public/interfaces/OWNERS
new file mode 100644
index 0000000..9e621796
--- /dev/null
+++ b/components/mus/public/interfaces/OWNERS
@@ -0,0 +1,13 @@
+# Changes to Mojo interfaces require a security review to avoid
+# introducing new sandbox escapes.
+per-file *.mojom=set noparent
+per-file *.mojom=dcheng@chromium.org
+per-file *.mojom=inferno@chromium.org
+per-file *.mojom=jln@chromium.org
+per-file *.mojom=jschuh@chromium.org
+per-file *.mojom=kenrb@chromium.org
+per-file *.mojom=mkwst@chromium.org
+per-file *.mojom=nasko@chromium.org
+per-file *.mojom=palmer@chromium.org
+per-file *.mojom=tsepez@chromium.org
+per-file *.mojom=wfh@chromium.org
diff --git a/components/mus/ws/server_window.cc b/components/mus/ws/server_window.cc
index c1c4bcec..9af2446 100644
--- a/components/mus/ws/server_window.cc
+++ b/components/mus/ws/server_window.cc
@@ -395,11 +395,12 @@
 
 void ServerWindow::BuildDebugInfo(const std::string& depth,
                                   std::string* result) const {
+  std::string name = GetName();
   *result += base::StringPrintf(
-      "%sid=%d,%d visible=%s bounds=%d,%d %dx%d name=%s\n", depth.c_str(),
+      "%sid=%d,%d visible=%s bounds=%d,%d %dx%d %s\n", depth.c_str(),
       static_cast<int>(id_.connection_id), static_cast<int>(id_.window_id),
       visible_ ? "true" : "false", bounds_.x(), bounds_.y(), bounds_.width(),
-      bounds_.height(), GetName().c_str());
+      bounds_.height(), !name.empty() ? name.c_str() : "(no name)");
   for (const ServerWindow* child : children_)
     child->BuildDebugInfo(depth + "  ", result);
 }
diff --git a/components/policy/resources/policy_templates_am.xtb b/components/policy/resources/policy_templates_am.xtb
index 3cced6d..2e388d23 100644
--- a/components/policy/resources/policy_templates_am.xtb
+++ b/components/policy/resources/policy_templates_am.xtb
@@ -151,6 +151,11 @@
 <translation id="1608755754295374538">የድምጽ ቀረጻ መሣሪያዎች መዳረሻ ያለጥያቄ የሚሰጣቸው ዩ አር ኤሎች</translation>
 <translation id="1617235075406854669">የአሳሽ እና ውርድ ታሪክ መሰረዝን ያንቁ</translation>
 <translation id="1617384279878333801">በመገለጫ አስተዳዳሪ ውስጥ ሰው አክልን ያንቁ</translation>
+<translation id="163200210584085447">በዚህ ዝርዝር ውስጥ ያሉ ስርዓተ-ጥለቶች ከጠያቂው ዩአርኤል
+      ደህንነት ጋር ይዛመዳል። ተዛማጅ ከተገኘ የቪዲዮ ቀረጻ መሣሪያዎች
+      መዳረሻ በSAML መግቢያ ገጾች ላይ ይሰጣል። ምንም ተዛማጅ
+      ካልተገኘ መዳረሻ በራስ-ሰር ይከለከላል። የልቅ ምልክት ስርዓተ-ጥለቶች
+      አይፈቀዱም።</translation>
 <translation id="1655229863189977773">የዲስክ መሸጎጫ መጠን በባይቶች ያስቀምጡ</translation>
 <translation id="166427968280387991">ተኪ አገልጋይ</translation>
 <translation id="1675002386741412210">የሚደገፈው በ፦</translation>
@@ -275,6 +280,7 @@
 <translation id="2113068765175018713">በራስ-ሰር ዳግም በማስነሳት መሳሪያ በርቶ የሚቆይበትን ጊዜ ይገድቡ</translation>
 <translation id="2127599828444728326">በእነዚህ ጣቢያዎች ላይ ማሳወቂያዎችን ፍቀድ</translation>
 <translation id="2131902621292742709">በባትሪ ኃይል ላይ ሲሆን የማያ ገጽ መፍዘዝ መዘግየት</translation>
+<translation id="2134437727173969994">ማያ ገጹን መቆለፍ ይፍቀዱ</translation>
 <translation id="2137064848866899664">ይህ መመሪያ ከተዋቀረ እያንዳንዱ ማሳያ
       በእያንዳንዱ ዳግም ማስነሳት ጊዜ እና ለመጀመሪያ ጊዜ ሲገናኝ የመመሪያው እሴት ከተለወጠ በኋላ 
       ወደተገለጸው አቀማመጥ ይሽከረከራል። ተጠቃሚዎች የማሳያውን ሽክርክሪቱን
@@ -905,6 +911,7 @@
 <translation id="3967075520570946456">ከስርዓተ ክወና ማላቅ በመቀጠል በመጀመሪያው የአሳሽ ጅምር ላይ የእንኳን ደህና መጡ ገጽ ማሳያን ያንቁ።</translation>
 <translation id="3973371701361892765">መደርደሪያውን በጭራሽ በራስ-አትደብቅ</translation>
 <translation id="3984028218719007910"><ph name="PRODUCT_OS_NAME" /> ተዘግቶ ከተወጣ በኋላ አካባቢያዊ የመለያ ውሂብ ያስቀምጥ እንደሆነ ይለያል። ወደ እውነት ከተዋቀረ ምንም ቋሚ መለያዎች በ<ph name="PRODUCT_OS_NAME" /> ላይ አይቀመጡም፣ እና ተዘግቶ ከተወጣ በኋላ ሁሉም ውሂብ ከተጠቃሚ ክፍለ-ጊዜው ይወገዳል። ይህ መመሪያ ወደ ሐሰት ከተዋቀረ ወይም እንዳልተዋቀረ ከተተወ መሣሪያው (የተመሰጠረው) አካባቢያዊ የተጠቃሚ ውሂቡን ሊያስቀምጥ ይችላል።</translation>
+<translation id="3997519162482760140">በSAML መግቢያ ገጾች ላይ የቪዲዮ መቅረጫ መሣሪያዎች መዳረሻ የሚሰጣቸው ዩአርኤሎች</translation>
 <translation id="4001275826058808087">የድርጅት መሣሪያዎች አይቲ አስተዳዳድሪዎች ተጠቃሚዎች በChrome OS ምዝገባ በኩል የቅናሾች ክፍያ ማስመለስ ይችሉ ወይም አይቻሉ ለመቆጣጠር ይህን ጥቆማ መጠቀም ይችላሉ።
 
       ይህ መመሪያ ወደ እውነት ከተቀናበረ ወይም እንዳልተቀናበረ ከተተወ ተጠቃሚዎች በChrome OS ምዝገባ በኩል የቅናሾች ክፍያ ማስመለስ አይችሉም።
@@ -938,6 +945,9 @@
           ይህ መመሪያ ካልተዋቀረ ነባሪው የጊዜ ርዝመት ስራ ላይ ይውላል።
 
           የመመሪያው ዋጋ በሚሊሰከንዶች ነው መገለጽ ያለበት።</translation>
+<translation id="4115096483386877940">ማያ ገጹን መቆለፍ ይፍቀዱ።
+
+      ይህ መመሪያ ወደ ሐሰት ከተዋቀረ ተጠቃሚዎች  ማያ ገጹን መቆለፍ አይችሉም (ከተጠቃሚ ክፍለ-ጊዜው ዘግቶ ማስወጣት ብቻ ነው የሚቻለው)። ይህ ቅንብር ወደ እውነት ከተዋቀረ ወይም እንዳልተዋቀረ ከተተወ በይለፍ ቃል የተረጋገጡ ተጠቃሚዎች ማያ ገጹን መቆለፍ ይችላሉ።</translation>
 <translation id="4121350739760194865">የመተግበሪያ ማስተዋወቂያዎች በአዲስ የትር ገጽ ላይ እንዳይታዩ ያግዳል</translation>
 <translation id="4147054660081653009">ከRemoteAccessHostTokenValidationUrl ጋር ለመገናኘት የደንበኛ የእውቅና ማረጋገጫ።
 
diff --git a/components/policy/resources/policy_templates_ar.xtb b/components/policy/resources/policy_templates_ar.xtb
index 77f3805..8daa8c6 100644
--- a/components/policy/resources/policy_templates_ar.xtb
+++ b/components/policy/resources/policy_templates_ar.xtb
@@ -138,6 +138,14 @@
 <translation id="1608755754295374538">‏عناوين URL التي سيتم منحها إمكانية الدخول إلى أجهزة التقاط الصوت بدون إذن</translation>
 <translation id="1617235075406854669">تمكين حذف سجل المتصفح والتنزيل</translation>
 <translation id="1617384279878333801">تمكين إضافة شخص في مدير الملف الشخصي</translation>
+<translation id="163200210584085447">‏ستتم مطابقة الأنماط المدرجة في هذه القائمة مع الأصل الأمني
+      لعنوان URL للطلب.  وفي حالة وجود تطابق، 
+فسيتم منح إمكانية الدخول
+      إلى أجهزة التقاط الفيديو في صفحات تسجيل الدخول إلى 
+SAML.  أما إذا لم يوجد
+      تطابق، فسيتم رفض الدخول تلقائيًا.  
+غير مسموح بأنماط
+      أحرف البدل.</translation>
 <translation id="1655229863189977773">تعيين حجم ذاكرة التخزين المؤقت للقرص بالبايت</translation>
 <translation id="166427968280387991">الخادم الوكيل</translation>
 <translation id="1675002386741412210">متاح للاستخدام في:</translation>
@@ -255,6 +263,7 @@
 <translation id="2113068765175018713">تقييد وقت تشغيل الجهاز من خلال إعادة التشغيل التلقائي</translation>
 <translation id="2127599828444728326">السماح بالإشعارات على مواقع الويب هذه</translation>
 <translation id="2131902621292742709">مهلة تعتيم الشاشة عند استخدام طاقة البطارية</translation>
+<translation id="2134437727173969994">السماح بقفل الشاشة</translation>
 <translation id="2137064848866899664">إذا تم إعداد هذه السياسة، فسيتم تدوير كل شاشة عرض إلى
 ......الاتجاه المحدد عند كل إعادة تشغيل والمرة الأولى التي يتم فيها الربط
 ......بعد تغيير قيمة السياسة. قد يغيِّر المستخدمون تدوير شاشة العرض
@@ -834,6 +843,8 @@
 <translation id="3967075520570946456">تمكين عرض صفحة الترحيب عند التشغيل الأول للمتصفح عقب ترقية نظام التشغيل.</translation>
 <translation id="3973371701361892765">عدم إخفاء الرفّ تلقائيًا على الإطلاق</translation>
 <translation id="3984028218719007910">‏لتحديد ما إذا كان <ph name="PRODUCT_OS_NAME" /> يحتفظ ببيانات الحساب المحلية بعد تسجيل الخروج. إذا تم تعيينها على "true"، فلن يتم الاحتفاظ بحسابات مستمرة بواسطة <ph name="PRODUCT_OS_NAME" /> وسيتم إلغاء جميع البيانات من جلسة المستخدم بعد تسجيل الخروج. وإذا تم تعيين هذه السياسة على "false" أو لم تتم تهيئتها، فإن الجهاز يمكن أن يحتفظ ببيانات المستخدم المحلية (مشفرة).</translation>
+<translation id="3997519162482760140">‏عناوين URL التي سيتم منحها إمكانية الدخول إلى أجهزة التقاط الفيديو
+في صفحات تسجيل الدخول إلى SAML</translation>
 <translation id="4001275826058808087">‏يمكن لمشرفي تكنولوجيا المعلومات في حالة أجهزة المؤسسات استخدام هذه العلامة للتحكم في السماح للمستخدمين باسترداد قيمة العروض من خلال تسجيل نظام تشغيل Chrome.
 
       عند تعيين هذه السياسة على "صحيح" أو تركها بدون تعيين، سيتمكن المستخدمون من استرداد العروض من خلال تسجيل نظام تشغيل Chrome.
@@ -859,6 +870,9 @@
           عندما لا يتم تعيين هذه السياسة، يتم استخدام مدة زمنية افتراضية.
 
           يجب تحديد قيمة السياسة بالمللي ثانية.</translation>
+<translation id="4115096483386877940">‏السماح بقفل الشاشة.
+
+      إذا تم تعيين هذه السياسة على "false"، فلن يتمكن المستخدمون من قفل الشاشة (لن يكون بالإمكان سوى تسجيل الخروج من جلسة المستخدم). إذا تم تعيين هذا الإعداد على "true" أو لم يتم تعيينه، فستتاح إمكانية قفل الشاشة للمستخدمين الذين أجروا مصادقةً باستخدام كلمة مرور.</translation>
 <translation id="4121350739760194865">منع العروض الترويجية للتطبيقات من الظهور في صفحة علامة التبويب الجديدة</translation>
 <translation id="4147054660081653009">‏شهادة العميل للاتصال بـ RemoteAccessHostTokenValidationUrl.
 
diff --git a/components/policy/resources/policy_templates_bg.xtb b/components/policy/resources/policy_templates_bg.xtb
index 4c9a654b..b3c94944 100644
--- a/components/policy/resources/policy_templates_bg.xtb
+++ b/components/policy/resources/policy_templates_bg.xtb
@@ -132,6 +132,11 @@
 <translation id="1608755754295374538">URL адреси, на които без подкана ще се предоставя достъп до звукозаписните устройства</translation>
 <translation id="1617235075406854669">Активиране на изтриването на историята на браузъра и на изтеглянията</translation>
 <translation id="1617384279878333801">Активиране на възможността за добавяне на хора чрез функцията за управление на потребителските профили</translation>
+<translation id="163200210584085447">Ще се търси съответствие между образците в този списък и първоизточника на сигурност
+на отправящия заявката URL адрес. Ако има съвпадение, достъпът до
+устройствата за заснемане на видео ще се предоставя на страниците за влизане чрез SAML, а при липса на
+такова той ще се отказва автоматично. Образците със заместващи знаци не са
+разрешени.</translation>
 <translation id="1655229863189977773">Задаване на размер на кеша на диска в байтове</translation>
 <translation id="166427968280387991">Прокси сървър</translation>
 <translation id="1675002386741412210">Поддържа се от:</translation>
@@ -239,6 +244,7 @@
 <translation id="2113068765175018713">Ограничаване на активното време на устройството чрез автоматично рестартиране</translation>
 <translation id="2127599828444728326">Разрешаване на известията на тези сайтове</translation>
 <translation id="2131902621292742709">Забавяне преди затъмняване на екрана при работа на батерия</translation>
+<translation id="2134437727173969994">Разрешаване на заключването на екрана</translation>
 <translation id="2137064848866899664">Ако това правило е зададено, всички дисплеи се завъртат спрямо
 посочената ориентация при всяко рестартиране, както и при първото им свързване
 след промяна на стойността на правилото. След като влязат, потребителите могат да променят
@@ -838,6 +844,7 @@
 <translation id="3967075520570946456">Активиране на показването на приветствената страница при първото стартиране на браузъра след надстройване на операционната система.</translation>
 <translation id="3973371701361892765">Полицата да не се скрива автоматично никога</translation>
 <translation id="3984028218719007910">Определя дали <ph name="PRODUCT_OS_NAME" /> да запазва локални данни за профили след излизане. Ако е зададено „true“, <ph name="PRODUCT_OS_NAME" /> не съхранява постоянни профили и всички данни от потребителската сесия ще бъдат отхвърлени след изход. В случай че за това правило е зададено „false“ или не е конфигурирано, устройството може да запазва (шифровани) локални потребителски данни.</translation>
+<translation id="3997519162482760140">URL адреси, които ще получават достъп до устройствата за заснемане на видео на страниците за влизане чрез SAML</translation>
 <translation id="4001275826058808087">Системните администратори на корпоративни устройства могат да използват този флаг, за да контролират дали на потребителите е разрешено да осребряват оферти чрез регистрацията за Chrome OS.
 
 Ако това правило е true или не е зададено, офертите ще могат да се осребряват по този начин.
@@ -869,6 +876,9 @@
 Ако правилото не е зададено, се използва период от време по подразбиране.
 
 Съответната стойност трябва да се посочи в милисекунди.</translation>
+<translation id="4115096483386877940">Разрешаване на заключването на екрана.
+
+Ако това правило е false, потребителите няма да могат да заключват екрана (ще е възможно само излизането от потребителската сесия). В случай че настройката е true или не е зададена, удостоверените с парола потребители ще могат да заключват екрана.</translation>
 <translation id="4121350739760194865">Спиране на показването на популяризации за приложения в новия раздел в браузъра</translation>
 <translation id="4147054660081653009">Клиентски сертификат за свързване с RemoteAccessHostTokenValidationUrl.
 
diff --git a/components/policy/resources/policy_templates_bn.xtb b/components/policy/resources/policy_templates_bn.xtb
index c3059a8..720d02d 100644
--- a/components/policy/resources/policy_templates_bn.xtb
+++ b/components/policy/resources/policy_templates_bn.xtb
@@ -151,6 +151,11 @@
 <translation id="1608755754295374538">এই URLগুলিকে বিজ্ঞপ্তি ছাড়াই অডিও ক্যাপচার ডিভাইসগুলিতে অ্যাক্সেসের অধিকার দেওয়া হবে</translation>
 <translation id="1617235075406854669">ব্রাউজার এবং ডাউনলোড ইতিহাস মুছে ফেলা সক্ষম করুন</translation>
 <translation id="1617384279878333801">প্রোফাইল পরিচালকে ব্যক্তি যোগ করা সক্ষম করে</translation>
+<translation id="163200210584085447">এই তালিকার প্যাটার্নগুলি অনুরোধ পাঠানো URL এর নিরাপত্তার
+      উৎসের সাথে মেলানো হবে। যদি কোনো মিল খুঁজে পাওয়া যায়, তাহলে
+      SAML লগইন পৃষ্ঠায় ভিডিও ক্যাপচার ডিভাইসগুলিতে অ্যাক্সেস দেওয়া হবে। যদি কোনো মিল
+      না পাওয়া যায়, তাহলে স্বয়ংক্রিয়ভাবে অ্যাক্সেস অস্বীকার করা হবে। ওয়াইল্ডকার্ড প্যাটার্ন
+      অনুমোদিত নয়।</translation>
 <translation id="1655229863189977773">বাইটে ডিস্ক ক্যাশে আকার সেট করুন</translation>
 <translation id="166427968280387991">প্রক্সি সার্ভার</translation>
 <translation id="1675002386741412210">এতে সমর্থিত:</translation>
@@ -267,6 +272,7 @@
 <translation id="2113068765175018713">স্বয়ংক্রিয়ভাবে পুনরায় চালু করার দ্বারা ডিভাইসের আপটাইম সীমাবদ্ধ করুন</translation>
 <translation id="2127599828444728326">এই সাইটগুলিতে বিজ্ঞপ্তি মঞ্জুর করুন</translation>
 <translation id="2131902621292742709">ব্যাটারি পাওয়ার চলাকালীন স্ক্রীনের উজ্জ্বলতা হ্রাসে বিলম্ব</translation>
+<translation id="2134437727173969994">স্ক্রীন লক করার অনুমতি দেয়</translation>
 <translation id="2137064848866899664">এই নীতিটি সেট করা থাকলে, পুনরায় চালু করার সময় প্রতিবার প্রতিটি প্রদর্শন নির্দিষ্ট ওরিয়েন্টেশনে ঘোরানো হয়, এবং নীতির মান পরিবর্তন হওয়ার পরে প্রথমবার এটি সংযুক্ত করা হয়। ব্যবহারকারীরা লগ-ইন করার পরে সেটিংস পৃষ্ঠার মাধ্যমে প্রদর্শনের আবর্তন পরিবর্তন করতে পারবে, কিন্তু তাদের সেটিংটি পরের বার পুনরায় চালু করার সময় নীতির মান দ্বারা ওভাররােইড করা হবে।
 
       এই নীতিটি প্রাথমিক ও সকল মাধ্যমিক প্রদর্শন, উভয় ক্ষেত্রে প্রযোজ্য।
@@ -877,6 +883,7 @@
 <translation id="3967075520570946456">OS আপগ্রেডের পরে প্রথম বার ব্রাউজার লঞ্চ হওয়ার সময় স্বাগত পাতা দেখানো সক্ষম করে।</translation>
 <translation id="3973371701361892765">তাকটি কখনই স্বয়ংক্রিয়ভাবে লুকায়িত রাখবেন না</translation>
 <translation id="3984028218719007910">লগআউটের পরে <ph name="PRODUCT_OS_NAME" /> স্থানীয় ডেটা রাখবে কি না তা নির্ধারণ করে৷ সত্যতে সেট থাকলে, <ph name="PRODUCT_OS_NAME" /> কোনো স্থির অ্যাকাউন্টকে রাখবে না ও লগ আউটের পরে ব্যবহারকারী সেশন থেকে সমস্ত ডেটা পরিত্যাগ করা হবে৷ এই নীতি মিথ্যাতে সেট থাকলে বা কনফিগার করা না থাকলে, ডিভাইস (এনক্রিপ্ট হওয়া) স্থানীয় ব্যবহারকারী ডেটা রাখতে পারে৷</translation>
+<translation id="3997519162482760140">SAML লগইন পৃষ্ঠাগুলিতে যেসব URL কে ভিডিও ক্যাপচার ডিভাইসে অ্যাক্সেস দেওয়া হবে</translation>
 <translation id="4001275826058808087">এন্টারপ্রাইজ ডিভাইসগুলির জন্য IT প্রশাসক, Chrome OS নথিভুক্তকরণের মাধ্যমে ব্যবহারকারীদের অফারগুলি ভাঙ্গানোর জন্য ব্যবহারকারীদের মঞ্জুরি দেওয়া হবে কিনা তা নিয়ন্ত্রণ করতে এই ফ্ল্যাগ ব্যবহার করতে পারে৷
 
       যদি এই নীতি সত্য হিসাবে সেট করা থাকে বা সেট না করে ছেড়ে রাখা হয়, তবে Chrome OS নথিভুক্তকরণের মাধ্যমে ব্যবহারকারীরা অফারগুলি ভাঙ্গাতে পারবে৷
@@ -913,6 +920,9 @@
           এই নীতিটিকে সেট না করলে, একটি ডিফল্ট সময়কাল ব্যবহৃত হয়৷
 
           নীতির মানটি মিলিসেকেন্ডে নির্ধারণ করা উচিত৷</translation>
+<translation id="4115096483386877940">স্ক্রীন লক করার অনুমতি দেয়।
+
+      এই নীতিটি মিথ্যাতে সেট করা থাকলে, ব্যবহারকারিরা স্ক্রীন লক করতে পারবে না (শুধুমাত্র ব্যবহারকারির অধিবেশন থেকে সাইন আউট করা সম্ভব হবে)। এই নীতিটি সত্যতে সেট করা থাকলে বা সেট না করা থাকলে, যেসব ব্যবহারকারি পাসওয়ার্ড দিয়ে প্রমাণীকরণ করেছেন তারা স্ক্রীণ লক করতে পারবেন।</translation>
 <translation id="4121350739760194865">নতুন ট্যাব পৃষ্ঠাটিতে উপস্থিত হওয়া থেকে অ্যাপ প্রচারগুলিকে প্রতিহত করুন</translation>
 <translation id="4147054660081653009">‘দূরবর্তী অ্যাক্সেস হোস্ট টোকেন যাচাইকরণ Url’ এর সাথে সংযোগ করার জন্য ক্লায়েন্ট শংসাপত্র।
 
diff --git a/components/policy/resources/policy_templates_ca.xtb b/components/policy/resources/policy_templates_ca.xtb
index 01d4ae9..ef8c3ca 100644
--- a/components/policy/resources/policy_templates_ca.xtb
+++ b/components/policy/resources/policy_templates_ca.xtb
@@ -144,6 +144,7 @@
 <translation id="1608755754295374538">URL als quals els dispositius de captura d'àudio podran accedir sense confirmació.</translation>
 <translation id="1617235075406854669">Activa la supressió de l'historial de baixades i del navegador</translation>
 <translation id="1617384279878333801">Permet que s'utilitzi l'opció Afegeix una persona al gestor de perfils</translation>
+<translation id="163200210584085447">Els patrons d'aquesta llista es compararan amb l'origen de la seguretat de l'URL sol·licitant. Si es troba alguna coincidència, l'URL obtindrà permís per accedir a dispositius de captura de vídeo en pàgines d'inici de sessió amb SAML. Si no es troba cap coincidència, l'accés es denegarà automàticament. Els patrons comodí no es permeten.</translation>
 <translation id="1655229863189977773">Defineix la mida de la memòria cau del disc en bytes</translation>
 <translation id="166427968280387991">Servidor intermediari</translation>
 <translation id="1675002386741412210">Compatible amb:</translation>
@@ -259,6 +260,7 @@
 <translation id="2113068765175018713">Limita el temps d'activitat del dispositiu mitjançant el reinici automàtic</translation>
 <translation id="2127599828444728326">Permet les notificacions en aquests llocs</translation>
 <translation id="2131902621292742709">Retard d'atenuació de pantalla quan s'utilitza bateria</translation>
+<translation id="2134437727173969994">Permet bloquejar la pantalla</translation>
 <translation id="2137064848866899664">Si aquesta política s'estableix, després de cada reinici es giren totes les
       visualitzacions segons l'orientació especificada. També es giren la primera vegada
       que es connecten després d'haver canviat el valor de la política. Els usuaris poden
@@ -840,6 +842,7 @@
 <translation id="3967075520570946456">Activa que es mostri la pàgina de benvinguda la primera vegada que s'inicia el navegador després d'actualitzar el sistema operatiu.</translation>
 <translation id="3973371701361892765">No amaguis mai el prestatge automàticament</translation>
 <translation id="3984028218719007910">Determina si <ph name="PRODUCT_OS_NAME" /> conserva les dades de comptes locals després de tancar la sessió. Si es defineix a «true» (cert), <ph name="PRODUCT_OS_NAME" /> no conserva cap compte persistent i es descartaran totes les dades de la sessió de l'usuari després de tancar la sessió. Si aquesta política es defineix a «false» (fals) o no es configura, el dispositiu pot conservar dades d'usuari locals (xifrades).</translation>
+<translation id="3997519162482760140">URL que obtindran permís per accedir a dispositius de captura de vídeo en pàgines d'inici de sessió amb SAML</translation>
 <translation id="4001275826058808087">Els administradors de TI de dispositius empresarials poden utilitzar aquesta marca per controlar si es permet als usuaris bescanviar ofertes mitjançant el registre de Chrome OS.
 
       Si aquesta política es configura com a "true" o si no es configura, els usuaris podran bescanviar ofertes mitjançant el registre de Chrome OS.
@@ -865,6 +868,9 @@
           Quan aquesta política no es defineix, s'utilitza un temps predeterminat.
 
           El valor de la política s'ha d'indicar en mil·lisegons.</translation>
+<translation id="4115096483386877940">Permet bloquejar la pantalla.
+
+      Si aquesta política s'estableix en "false", els usuaris no poden bloquejar la pantalla (només poden tancar la sessió d'usuari). Si s'estableix en "true" o no s'estableix, els usuaris que s'han autenticat amb una contrasenya poden bloquejar la pantalla.</translation>
 <translation id="4121350739760194865">Impedeix que les promocions d'aplicacions apareguin a la pestanya nova</translation>
 <translation id="4147054660081653009">Certificat de client per connectar-se a RemoteAccessHostTokenValidationUrl.
 
diff --git a/components/policy/resources/policy_templates_cs.xtb b/components/policy/resources/policy_templates_cs.xtb
index 87331ba..a573bbd 100644
--- a/components/policy/resources/policy_templates_cs.xtb
+++ b/components/policy/resources/policy_templates_cs.xtb
@@ -143,6 +143,7 @@
 <translation id="1608755754295374538">Adresy URL, kterým bude udělen přístup pro záznam zvuku bez zobrazení výzvy</translation>
 <translation id="1617235075406854669">Aktivovat smazání historie prohlížeče a stahování</translation>
 <translation id="1617384279878333801">Povolit přidání uživatele ve správci profilů</translation>
+<translation id="163200210584085447">Vzory v tomto seznamu budou porovnány s žádající adresou URL. Pokud bude nalezena shoda, bude na přihlašovacích stránkách SAML udělen přístup k zařízením pro záznam videa. Pokud shoda nalezena nebude, přístup bude automaticky odepřen. Vzory se zástupnými znaky nejsou povoleny.</translation>
 <translation id="1655229863189977773">Nastavit velikost diskové mezipaměti v bajtech</translation>
 <translation id="166427968280387991">Proxy server</translation>
 <translation id="1675002386741412210">Podpora:</translation>
@@ -260,6 +261,7 @@
 <translation id="2113068765175018713">Omezit provozní dobu zařízení automatickým restartováním</translation>
 <translation id="2127599828444728326">Povolit na těchto stránkách oznámení</translation>
 <translation id="2131902621292742709">Prodleva snížení jasu obrazovky při napájení z baterie</translation>
+<translation id="2134437727173969994">Povolit uzamknutí obrazovky</translation>
 <translation id="2137064848866899664">Pokud je tato zásada nastavena, každý displej se při prvním připojení po změně hodnoty zásady a při každém restartu otočí do požadované orientace. Uživatelé mohou otočení displeje po přihlášení na stránce nastavení změnit, ale při příštím restartu se jejich nastavení hodnotou zásady přepíše.
 
 Tato zásada platí pro primární i pro všechny sekundární displeje.
@@ -867,6 +869,7 @@
 <translation id="3967075520570946456">Aktivovat při prvním spuštění prohlížeče po přechodu na vyšší verzi OS zobrazení uvítací stránky</translation>
 <translation id="3973371701361892765">Nikdy poličku automaticky neskrývat</translation>
 <translation id="3984028218719007910">Určuje, zda systém <ph name="PRODUCT_OS_NAME" /> po odhlášení zachová místní data účtu. Pokud je tato zásada nastavena na hodnotu True, nebude systém <ph name="PRODUCT_OS_NAME" /> uchovávat žádné účty trvale a všechna data relace uživatele budou po odhlášení smazána. Pokud je tato zásada nastavena na hodnotu False, nebo není nastavena, může zařízení uchovat (šifrovaná) místní uživatelská data.</translation>
+<translation id="3997519162482760140">Adresy URL, kterým bude na přihlašovacích stránkách SAML udělen přístup k zařízením pro záznam videa</translation>
 <translation id="4001275826058808087">Administrátoři IT spravující podniková zařízení mohou pomocí tohoto příznaku uživatelům povolit nebo zakázat uplatnění zvláštních nabídek při registraci systému Chrome OS.
 
       Pokud je tato zásada nastavena na hodnotu true nebo ponechána bez nastavení, uživatelé budou moci při registraci systému Chrome OS uplatňovat zvláštní nabídky.
@@ -900,6 +903,9 @@
           Není-li tato zásada nastavena, bude použita výchozí doba.
 
           Hodnota zásady se zadává v milisekundách.</translation>
+<translation id="4115096483386877940">Povolit uzamknutí obrazovky.
+
+Pokud je tato zásada nastavena na hodnotu false, uživatelé nebudou moci uzamknout obrazovku (k dispozici bude pouze odhlášení od uživatelské relace). Pokud je tato zásada nastavena na hodnotu true nebo není nastavena, uživatelé ověření pomocí hesla budou moci obrazovku uzamknout.</translation>
 <translation id="4121350739760194865">Zabraňuje zobrazování propagace aplikací na stránce Nová karta</translation>
 <translation id="4147054660081653009">Klientský certifikát pro připojení k adrese RemoteAccessHostTokenValidationUrl.
 
diff --git a/components/policy/resources/policy_templates_da.xtb b/components/policy/resources/policy_templates_da.xtb
index ca7bcf8..242b0bd5 100644
--- a/components/policy/resources/policy_templates_da.xtb
+++ b/components/policy/resources/policy_templates_da.xtb
@@ -144,6 +144,11 @@
 <translation id="1608755754295374538">Webadresser, der får adgang til lydoptagelsesenheder, uden at du skal give tilladelse hertil</translation>
 <translation id="1617235075406854669">Aktivér sletning af browser- og downloadhistorik</translation>
 <translation id="1617384279878333801">Aktivér funktionen Tilføj person i profiladministratoren</translation>
+<translation id="163200210584085447">Mønstre på denne liste sammenlignes med sikkerhedskilden
+      for den anmodede webadresse.  Hvis der findes et match, gives der
+      adgang til videooptagelsesenheder på SAML-loginsider.  Hvis der ikke findes
+      noget match, nægtes der automatisk adgang.  Mønstre med jokertegn
+      tillades ikke.</translation>
 <translation id="1655229863189977773">Angiv diskcache i bytes</translation>
 <translation id="166427968280387991">Proxyserver</translation>
 <translation id="1675002386741412210">Understøttes på:</translation>
@@ -259,6 +264,7 @@
 <translation id="2113068765175018713">Begræns oppetid for enheden vha. automatisk genstart</translation>
 <translation id="2127599828444728326">Tillad underretninger på disse websites</translation>
 <translation id="2131902621292742709">Skærmnedtoningsforsinkelse, når batteriet bruges</translation>
+<translation id="2134437727173969994">Tillad låsning af skærmen</translation>
 <translation id="2137064848866899664">Hvis denne politik er angivet, roteres hver visning i den
       angivne retning ved hver genstart og første gang, der oprettes forbindelse,
       efter politikkens værdi ændres. Brugere kan ændre visningens
@@ -853,6 +859,7 @@
 <translation id="3967075520570946456">Aktivér visning af velkomstsiden, når browseren genstartes efter opgradering af operativsystemet.</translation>
 <translation id="3973371701361892765">Skjul aldrig hylden automatisk</translation>
 <translation id="3984028218719007910">Bestemmer, om <ph name="PRODUCT_OS_NAME" /> bevarer lokale kontodata efter logout. Hvis den er angivet til sand, er der ingen vedvarende konti, der bevares af <ph name="PRODUCT_OS_NAME" />, og alle data fra brugersessionen kasseres efter logout. Hvis denne politik er angivet til falsk eller ikke er konfigureret, kan enheden beholde (krypterede) lokale brugerdata.</translation>
+<translation id="3997519162482760140">Webadresser, der får adgang til videooptagelsesenheder på SAML-loginsider</translation>
 <translation id="4001275826058808087">It-administratorer for virksomhedsenheder kan bruge denne markering til at kontrollere, om brugerne skal have tilladelse til at indløse tilbud via Chrome OS-registrering.
 
       Hvis denne politik er angivet til Sand eller ikke er angivet, kan brugerne indløse kampagnetilbud via Chrome OS-registrering.
@@ -878,6 +885,9 @@
           Hvis denne politik ikke indstilles, anvendes standardindstillingen.
 
           Værdien for politikken bør angives i millisekunder.</translation>
+<translation id="4115096483386877940">Tillad låsning af skærmen.
+
+      Hvis denne politik er angivet som falsk, kan brugerne ikke låse skærmen (de kan kun logge ud fra brugersessionen). Hvis indstillingen er angivet som sand eller ikke er angivet, kan brugere, der har godkendt med en adgangskode, låse skærmen.</translation>
 <translation id="4121350739760194865">Undgå, at appkampagner vises på ny fane-siden</translation>
 <translation id="4147054660081653009">Klientcertifikat til at oprette forbindelse til RemoteAccessHostTokenValidationUrl.
 
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb
index 1f3556e8..135fc38b 100644
--- a/components/policy/resources/policy_templates_de.xtb
+++ b/components/policy/resources/policy_templates_de.xtb
@@ -144,6 +144,11 @@
 <translation id="1608755754295374538">URLs, denen ohne Nachfrage Zugriff auf Audioaufnahmegeräte gestattet wird</translation>
 <translation id="1617235075406854669">Löschen des Browserverlaufs und des Downloadverlaufs aktivieren</translation>
 <translation id="1617384279878333801">"Person hinzufügen" im Profilmanager aktivieren</translation>
+<translation id="163200210584085447">Muster in dieser Liste werden mit der Sicherheitsherkunft
+      der anfragenden URL abgeglichen. Bei einer Übereinstimmung wird der Zugriff
+      auf Videoaufnahmegeräte auf SAML-Log-in-Seiten gestattet. Wird keine Übereinstimmung
+      erkannt, dann wird der Zugriff automatisch verweigert. Platzhaltermuster
+      sind nicht zulässig.</translation>
 <translation id="1655229863189977773">Cache-Größe für Datenträger in Byte festlegen</translation>
 <translation id="166427968280387991">Proxyserver</translation>
 <translation id="1675002386741412210">Unterstützt von:</translation>
@@ -255,6 +260,7 @@
 <translation id="2113068765175018713">Betriebsdauer der Geräte durch automatische Neustarts begrenzen</translation>
 <translation id="2127599828444728326">Benachrichtigungen auf diesen Websites zulassen</translation>
 <translation id="2131902621292742709">Verzögerung für die Bildschirmabdunkelung im Akkubetrieb</translation>
+<translation id="2134437727173969994">Sperren des Bildschirms erlauben</translation>
 <translation id="2137064848866899664">Bei Festlegen dieser Richtlinie wird jeder Bildschirm bei
       jedem Neustart und beim erstmaligen Herstellen der Verbindung nach
       Änderung des Richtlinienwerts in die angegebene Ausrichtung gedreht.
@@ -841,6 +847,7 @@
 <translation id="3967075520570946456">Einblendung der Begrüßungsseite beim ersten Start des Browsers nach einer Aktualisierung des Betriebssystems aktivieren</translation>
 <translation id="3973371701361892765">Ablage nie automatisch ausblenden</translation>
 <translation id="3984028218719007910">Legt fest, ob lokale Kontodaten nach der Abmeldung in <ph name="PRODUCT_OS_NAME" /> gespeichert werden. Bei Einstellung auf "true" werden Konten nicht dauerhaft in <ph name="PRODUCT_OS_NAME" /> gespeichert und alle Daten der Nutzersitzung werden nach der Abmeldung verworfen. Ist die Richtlinie auf "false" gesetzt oder nicht konfiguriert, können (verschlüsselte) lokale Nutzerdaten auf dem Gerät verbleiben.</translation>
+<translation id="3997519162482760140">URLs, denen auf SAML-Log-in-Seiten Zugriff auf Videoaufnahmegeräte gestattet wird</translation>
 <translation id="4001275826058808087">IT-Administratoren von Unternehmensgeräten können hiermit festlegen, ob Nutzer Angebote über die Chrome OS-Registrierung einlösen können.
 
       Wenn diese Richtlinie auf "True" gesetzt oder nicht konfiguriert ist, können Nutzer Angebote über die Chrome OS-Registrierung einlösen.
@@ -866,6 +873,9 @@
           Ist diese Richtlinie nicht konfiguriert, wird ein Standardwert verwendet.
 
           Der Wert für die Richtlinie muss in Millisekunden angegeben werden.</translation>
+<translation id="4115096483386877940">Sperren des Bildschirms erlauben
+
+      Ist diese Richtlinie auf "False" festgelegt, dann können Nutzer den Bildschirm nicht sperren, sondern sich lediglich von der Nutzersitzung abmelden. Ist diese Einstellung hingegen auf "True" oder gar nicht festgelegt, dann können Nutzer, die sich mit einem Passwort authentifiziert haben, den Bildschirm sperren.</translation>
 <translation id="4121350739760194865">App-Werbung nicht auf der "Neuer Tab"-Seite anzeigen</translation>
 <translation id="4147054660081653009">Clientzertifikat zur Herstellung einer Verbindung zu "RemoteAccessHostTokenValidationUrl"
 
diff --git a/components/policy/resources/policy_templates_el.xtb b/components/policy/resources/policy_templates_el.xtb
index e7506ed3..fdc9201 100644
--- a/components/policy/resources/policy_templates_el.xtb
+++ b/components/policy/resources/policy_templates_el.xtb
@@ -154,6 +154,11 @@
 <translation id="1608755754295374538">Διευθύνσεις URL που θα έχουν πρόσβαση στις συσκευές καταγραφής ήχου χωρίς ερώτηση</translation>
 <translation id="1617235075406854669">Ενεργοποίηση διαγραφής του ιστορικού περιήγησης και του ιστορικού λήψεων</translation>
 <translation id="1617384279878333801">Ενεργοποίηση προσθήκης ατόμου στο διαχειριστή προφίλ</translation>
+<translation id="163200210584085447">Τα μοτίβα που περιλαμβάνονται σε αυτήν τη λίστα θα αντιστοιχιστούν με την
+      προέλευση ασφαλείας του URL που στέλνει το αίτημα.  Εάν βρεθεί αντιστοίχιση, θα παραχωρείται πρόσβαση
+      στις συσκευές καταγραφής βίντεο στις σελίδες σύνδεσης SAML.  Εάν δεν βρεθεί
+      αντιστοίχιση, το αίτημα πρόσβασης θα απορρίπτεται αυτόματα.  Δεν επιτρέπονται τα μοτίβα
+      χαρακτήρων μπαλαντέρ.</translation>
 <translation id="1655229863189977773">Ορισμός μεγέθους προσωρινής μνήμης δίσκου σε byte</translation>
 <translation id="166427968280387991">Διακομιστής μεσολάβησης</translation>
 <translation id="1675002386741412210">Υποστηρίζεται σε:</translation>
@@ -275,6 +280,7 @@
 <translation id="2113068765175018713">Περιορισμός χρόνου λειτουργίας συσκευής με αυτόματη επανεκκίνηση</translation>
 <translation id="2127599828444728326">Να επιτρέπονται οι ειδοποιήσεις σε αυτούς τους ιστότοπους</translation>
 <translation id="2131902621292742709">Καθυστέρηση θαμπώματος οθόνης κατά τη λειτουργία με μπαταρία</translation>
+<translation id="2134437727173969994">Να επιτρέπεται το κλείδωμα της οθόνης</translation>
 <translation id="2137064848866899664">Εάν έχει οριστεί αυτή η πολιτική, κάθε οθόνη θα περιστρέφεται
       με συγκεκριμένο προσανατολισμό σε κάθε επανεκκίνηση και την πρώτη φορά που συνδέεται
       αφού αλλάξει η τιμή πολιτικής. Οι χρήστες μπορούν να αλλάξουν τον προσανατολισμό της οθόνης
@@ -892,6 +898,7 @@
 <translation id="3967075520570946456">Ενεργοποίηση εμφάνισης της σελίδας υποδοχής στην πρώτη εκκίνηση του προγράμματος περιήγησης μετά από αναβάθμιση του λειτουργικού συστήματος.</translation>
 <translation id="3973371701361892765">Να μην γίνεται ποτέ αυτόματη απόκρυψη του ραφιού</translation>
 <translation id="3984028218719007910">Καθορίζει εάν το <ph name="PRODUCT_OS_NAME" /> διατηρεί τα τοπικά δεδομένα λογαριασμού μετά την αποσύνδεση. Εάν έχει οριστεί ως αληθές, οι προσωρινοί λογαριασμοί διατηρούνται από το <ph name="PRODUCT_OS_NAME" /> και όλα τα δεδομένα τα οποίο προέρχονται από τη συνεδρία χρήση θα απορριφθούν μετά την αποσύνδεση. Εάν αυτή η πολιτική έχει οριστεί ως ψευδής ή δεν έχει διαμορφωθεί, η συσκευή ενδέχεται να διατηρήσει τα δεδομένα χρήστη (κρυπτογραφημένα).</translation>
+<translation id="3997519162482760140">URL στα οποία θα εκχωρείται πρόσβαση σε συσκευές καταγραφής βίντεο σε σελίδες σύνδεσης SAML</translation>
 <translation id="4001275826058808087">Οι διαχειριστές πληροφορικής για εταιρικές συσκευές μπορούν να χρησιμοποιήσουν αυτήν την επισήμανση, για να επιτρέψουν στους χρήστες την εξαργύρωση προσφορών μέσω της εγγραφής στο Chrome OS.
 
       Εάν η τιμή αυτής της πολιτικής οριστεί ως αληθής ή δεν οριστεί, οι χρήστες θα μπορούν να εξαργυρώσουν προσφορές μέσω της εγγραφής στο Chrome OS.
@@ -926,6 +933,9 @@
           Όταν καταργείται η ρύθμιση αυτής της πολιτικής, χρησιμοποιείται μια προεπιλεγμένη χρονική διάρκεια.
 
           Η τιμή πολιτικής πρέπει να προσδιορίζεται σε χιλιοστά δευτερολέπτου.</translation>
+<translation id="4115096483386877940">Μα επιτρέπεται το κλείδωμα της οθόνης.
+
+      Εάν αυτή η πολιτική οριστεί ως ψευδής, οι χρήστες δεν θα μπορούν να κλειδώσουν την οθόνη (θα είναι δυνατή μόνο η αποσύνδεση από την περίοδο σύνδεσης χρήστη). Εάν αυτή η ρύθμιση οριστεί ως αληθής ή δεν οριστεί, οι χρήστες οι οποίες προέβησαν σε έλεγχο ταυτότητας με κωδικό πρόσβασης μπορούν να κλειδώσουν την οθόνη.</translation>
 <translation id="4121350739760194865">Να μην επιτρέπεται η εμφάνιση προσφορών εφαρμογών στη σελίδα νέας καρτέλας</translation>
 <translation id="4147054660081653009">Πιστοποιητικό πελάτη για σύνδεση στην πολιτική RemoteAccessHostTokenValidationUrl.
 
diff --git a/components/policy/resources/policy_templates_en-GB.xtb b/components/policy/resources/policy_templates_en-GB.xtb
index 36e3f1c1..6c338c65 100644
--- a/components/policy/resources/policy_templates_en-GB.xtb
+++ b/components/policy/resources/policy_templates_en-GB.xtb
@@ -154,6 +154,11 @@
 <translation id="1608755754295374538">URLs that will be granted access to audio capture devices without prompt</translation>
 <translation id="1617235075406854669">Enable deleting browser and download history</translation>
 <translation id="1617384279878333801">Enable add person in profile manager</translation>
+<translation id="163200210584085447">Patterns in this list will be matched against the security
+      origin of the requesting URL.  If a match is found, access to video
+      capture devices will be granted on SAML login pages.  If no match is
+      found, access will be automatically denied.  Wildcard patterns are not
+      allowed.</translation>
 <translation id="1655229863189977773">Set disk cache size in bytes</translation>
 <translation id="166427968280387991">Proxy server</translation>
 <translation id="1675002386741412210">Supported on:</translation>
@@ -275,6 +280,7 @@
 <translation id="2113068765175018713">Limit device uptime by automatically rebooting</translation>
 <translation id="2127599828444728326">Allow notifications on these sites</translation>
 <translation id="2131902621292742709">Screen dim delay when running on battery power</translation>
+<translation id="2134437727173969994">Permit locking the screen</translation>
 <translation id="2137064848866899664">If this policy is set, each display is rotated to the
       specified orientation on every reboot and the first time that it is connected
       after the policy value has changed. Users may change the display
@@ -906,6 +912,7 @@
 <translation id="3967075520570946456">Enable showing the welcome page on the first browser launch following OS upgrade.</translation>
 <translation id="3973371701361892765">Never auto-hide the shelf</translation>
 <translation id="3984028218719007910">Determines whether <ph name="PRODUCT_OS_NAME" /> keeps local account data after logout. If set to true, no persistent accounts are kept by <ph name="PRODUCT_OS_NAME" /> and all data from the user session will be discarded after logout. If this policy is set to false or not configured, the device may keep (encrypted) local user data.</translation>
+<translation id="3997519162482760140">URLs that will be granted access to video capture devices on SAML login pages</translation>
 <translation id="4001275826058808087">IT admins for enterprise devices can use this flag to control whether to allow users to redeem offers through Chrome OS Registration.
 
       If this policy is set to true or left not set, users will be able to redeem offers through Chrome OS Registration.
@@ -939,6 +946,9 @@
           When this policy is unset, a default length of time is used.
 
           The policy value should be specified in milliseconds.</translation>
+<translation id="4115096483386877940">Permit locking the screen.
+
+      If this policy is set to false, users will not be able to lock the screen (only signing out from the user session will be possible). If this setting is set to true or not set, users who authenticated with a password can lock the screen.</translation>
 <translation id="4121350739760194865">Prevent app promotions from appearing on the new tab page</translation>
 <translation id="4147054660081653009">Client certificate for connecting to RemoteAccessHostTokenValidationUrl.
 
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb
index e741a48..4736723 100644
--- a/components/policy/resources/policy_templates_es-419.xtb
+++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -143,6 +143,11 @@
 <translation id="1608755754295374538">Las URL que recibirán acceso a dispositivos de captura de audio sin solicitarlo</translation>
 <translation id="1617235075406854669">Habilita la eliminación del historial de descargas y del navegador.</translation>
 <translation id="1617384279878333801">Habilitar opción para agregar persona al administrador de perfiles</translation>
+<translation id="163200210584085447">Los patrones en esta lista se compararán con el origen
+       de seguridad de la URL solicitante. Si se encuentra una coincidencia,
+       se concede acceso a los dispositivos de captura de video en las páginas
+       de acceso de SAML. Si no se encuentra una coincidencia, el acceso
+       se rechaza de forma automática. Los patrones comodines no se permiten.</translation>
 <translation id="1655229863189977773">Establecer el tamaño del caché de disco en bytes</translation>
 <translation id="166427968280387991">Servidor proxy</translation>
 <translation id="1675002386741412210">Compatible con:</translation>
@@ -254,6 +259,7 @@
 <translation id="2113068765175018713">Limita el tiempo de actividad del dispositivo mediante un reinicio automático.</translation>
 <translation id="2127599828444728326">Permitir notificaciones en estos sitios</translation>
 <translation id="2131902621292742709">Demora de atenuación de pantalla con batería</translation>
+<translation id="2134437727173969994">Permite bloquear la pantalla</translation>
 <translation id="2137064848866899664">Si se establece esta política, la pantalla rotará en la orientación que se especifica en cada reinicio y la primera vez que se conecte luego de que se cambie el valor de la política. Los usuarios pueden cambiar la rotación de la pantalla a través de la página de configuración después de acceder, pero el valor de la política anulará la configuración en el siguiente reinicio.
 
       Esta política se aplica tanto a las pantallas principales como a las secundarias.
@@ -833,6 +839,7 @@
 <translation id="3967075520570946456">Habilitar la aparición de la página de bienvenida al iniciar el navegador por primera vez después de la actualización del SO</translation>
 <translation id="3973371701361892765">Nunca ocultar automáticamente los archivos</translation>
 <translation id="3984028218719007910">Determina si <ph name="PRODUCT_OS_NAME" /> mantiene los datos de cuenta locales tras cerrar la sesión. Si el valor se establece en "true", <ph name="PRODUCT_OS_NAME" /> no conservará ninguna cuenta de forma permanente y todos los datos de la sesión del usuario se descartarán al cerrar la sesión. Si esta política no se configura o se establece en "false", el dispositivo puede guardar datos de usuario locales (encriptados).</translation>
+<translation id="3997519162482760140">URL a las que se les concede acceso a los dispositivos de captura de video en las páginas de acceso de SAML</translation>
 <translation id="4001275826058808087">Los administradores TI de dispositivos empresariales pueden usar esta marca para controlar si permiten a los usuarios canjear ofertas a través del registro del Sistema operativo de Chrome.
 
       Si esta política se establece en True o no se establece, los usuarios podrán canjear ofertas a través del registro del Sistema operativo de Chrome.
@@ -858,6 +865,9 @@
           Si no se establece esta política, se utilizará un período de tiempo predeterminado.
 
           El valor de la política debe especificarse en milisegundos.</translation>
+<translation id="4115096483386877940">Permite bloquear la pantalla.
+
+      Si esta política se establece como falsa, los usuarios no podrán bloquear la pantalla (solo podrán salir de la sesión). Si esta política se establece como verdadera o no se establece, los usuarios autenticados con una contraseña podrán bloquear la pantalla.</translation>
 <translation id="4121350739760194865">Impedir que aparezcan las promociones de aplicaciones en la página de la nueva pestaña</translation>
 <translation id="4147054660081653009">Certificado de cliente para conectarse a  RemoteAccessHostTokenValidationUrl
 
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb
index 8443207..33a088b 100644
--- a/components/policy/resources/policy_templates_es.xtb
+++ b/components/policy/resources/policy_templates_es.xtb
@@ -150,6 +150,10 @@
 <translation id="1608755754295374538">URLs a las que se concederá acceso a dispositivos de captura de audio sin confirmación</translation>
 <translation id="1617235075406854669">Habilitar eliminación de historial de navegación y de descargas</translation>
 <translation id="1617384279878333801">Habilitar la opción para añadir usuarios en el administrador de perfiles</translation>
+<translation id="163200210584085447">Los patrones de esta lista se compararán con el origen de seguridad
+      de la URL solicitante. Si se encuentra alguna coincidencia, se concederá acceso a dispositivos de captura de vídeo
+      en páginas de inicio de sesión con SAML. De lo contrario, el acceso se denegará automáticamente. Los patrones comodín no están
+      permitidos.</translation>
 <translation id="1655229863189977773">Establecer tamaño de caché de disco en bytes</translation>
 <translation id="166427968280387991">Servidor proxy</translation>
 <translation id="1675002386741412210">Compatible con:</translation>
@@ -275,6 +279,7 @@
 <translation id="2113068765175018713">Limitar tiempo de actividad de dispositivo mediante reinicio automático</translation>
 <translation id="2127599828444728326">Permitir notificaciones en estos sitios</translation>
 <translation id="2131902621292742709">Retraso de atenuado de pantalla cuando el dispositivo funciona con la batería</translation>
+<translation id="2134437727173969994">Permitir que se bloquee la pantalla</translation>
 <translation id="2137064848866899664">Si se establece esta política, se girará cada pantalla a la
       orientación especificada cada vez que se reinicie el dispositivo y la primera vez que se conecte
       después de cambiar el valor de la política. Los usuarios podrán cambiar la rotación
@@ -903,6 +908,7 @@
 <translation id="3967075520570946456">Habilitar la opción para que aparezca la página de bienvenida al abrir el navegador por primera vez después de actualizar el sistema operativo.</translation>
 <translation id="3973371701361892765">No ocultar automáticamente los archivos</translation>
 <translation id="3984028218719007910">Permite determinar si <ph name="PRODUCT_OS_NAME" /> mantiene los datos de cuenta locales tras cerrar la sesión. Si el valor se establece en "true", <ph name="PRODUCT_OS_NAME" /> no conservará ninguna cuenta de forma permanente y todos los datos de la sesión del usuario se descartarán al cerrar la sesión. Si esta política no se configura o el valor correspondiente se establece en "false", el dispositivo puede guardar datos de usuario locales (encriptados).</translation>
+<translation id="3997519162482760140">URLs a las que los dispositivos de captura de vídeo podrán acceder en las páginas de inicio de sesión con SAML</translation>
 <translation id="4001275826058808087">Los administradores de TI para dispositivos de empresa pueden utilizar esta opción para controlar si permiten que los usuarios canjeen ofertas a través del servicio de registro de Chrome OS.
 
 Si esta política se establece en True o no se establece, los usuarios podrán canjear ofertas a través del servicio de registro de Chrome OS.
@@ -936,6 +942,9 @@
           Cuando no se establece esta política, se utiliza un valor de tiempo predeterminado.
 
           El valor de la política se debe especificar en milisegundos.</translation>
+<translation id="4115096483386877940">Permite bloquear la pantalla.
+
+      Si se asigna el valor False a esta política, los usuarios no pueden bloquear la pantalla (solo pueden cerrar su sesión de usuario). Si se asigna True o si no se establece ningún valor, los usuarios autenticados mediante contraseña pueden bloquear la pantalla.</translation>
 <translation id="4121350739760194865">Evitar que las promociones de aplicaciones aparezcan en la página Nueva pestaña</translation>
 <translation id="4147054660081653009">Certificado de cliente para establecer conexión con RemoteAccessHostTokenValidationUrl.
 
diff --git a/components/policy/resources/policy_templates_et.xtb b/components/policy/resources/policy_templates_et.xtb
index 72cde85e..86fb13b 100644
--- a/components/policy/resources/policy_templates_et.xtb
+++ b/components/policy/resources/policy_templates_et.xtb
@@ -154,6 +154,11 @@
 <translation id="1608755754295374538">URL-id, millele antakse ilma küsimata juurdepääs helijäädvustusseadmetele</translation>
 <translation id="1617235075406854669">Brauseri ja allalaadimiste ajaloo kustutamise lubamine</translation>
 <translation id="1617384279878333801">Inimese profiilihalduris lisamise lubamine</translation>
+<translation id="163200210584085447">Selles loendis olevaid mustreid võrreldakse taotleva URL-i
+      algse turvalisusega. Vaste leidmisel antakse SAML-i
+      sisselogimislehtedele juurdepääs videosalvestusseadmetele. Kui vastet
+      ei leita, blokeeritakse juurdepääs automaatselt. Metamärgiga mustreid
+      ei lubata.</translation>
 <translation id="1655229863189977773">Määrake ketta vahemälu suurus baitides</translation>
 <translation id="166427968280387991">Puhverserver</translation>
 <translation id="1675002386741412210">Toetatud:</translation>
@@ -275,6 +280,7 @@
 <translation id="2113068765175018713">Seadme tööaja piiramine automaatse taaskäivitamisega</translation>
 <translation id="2127599828444728326">Luba märguanded nendel saitidel</translation>
 <translation id="2131902621292742709">Ekraani hämardamise viiteaeg akutoite kasutamisel</translation>
+<translation id="2134437727173969994">Keela ekraani lukustamine</translation>
 <translation id="2137064848866899664">Selle reegli määramisel pööratakse iga ekraan
       määratud suunda igal taaskäivitamisel ja esimesel korral, kui see pärast
       reegli väärtuse muutmist ühendatakse. Kasutajad saavad ekraani
@@ -889,6 +895,7 @@
 <translation id="3967075520570946456">Tervituslehe kuvamise lubamine brauseri esmakordsel käivitamisel pärast operatsioonisüsteemi täiendamist.</translation>
 <translation id="3973371701361892765">Ära peida hoidlat kunagi automaatselt</translation>
 <translation id="3984028218719007910">Määrab, kas <ph name="PRODUCT_OS_NAME" /> säilitab kohaliku konto andmed pärast väljalogimist. Selle reegli lubamisel ei säilita <ph name="PRODUCT_OS_NAME" /> kontode andmeid ja kasutaja seansi kõik andmed eemaldatakse pärast väljalogimist. Kui keelate selle reegli või jätate määramata, siis võib seade säilitada kohaliku kasutaja andmeid (krüptitult).</translation>
+<translation id="3997519162482760140">URL-id, millele antakse SAML-i sisselogimislehtedel juurdepääs videosalvestusseadmetele</translation>
 <translation id="4001275826058808087">Ettevõtte seadmete IT-administraatorid saavad selle märgistuse abil juhtida, kas lubada kasutajatel pakkumisi lunastada Chrome OS-i registreerimise abil.
 
       Kui see reegel määratakse tõeseks või seda ei määrata, saavad kasutajad pakkumisi lunastada Chrome OS-i registreerimise abil.
@@ -922,6 +929,9 @@
           Kui jätate selle reegli määramata, kasutatakse vaikeaega.
 
           Reegli väärtus tuleb määrata millisekundites.</translation>
+<translation id="4115096483386877940">Keela ekraani lukustamine.
+
+      Kui selle reegli väärtuseks määratakse Väär, ei saa kasutajad ekraani lukustada (võimalik on ainult kasutajaseansist väljalogimine). Kui selle seade väärtuseks määratakse Tõene või väärtust ei määrata, saavad parooliga autentinud kasutajad ekraani lukustada.</translation>
 <translation id="4121350739760194865">Rakenduste reklaamide ilmumise takistamine uuel vahelehel</translation>
 <translation id="4147054660081653009">Kliendi sertifikaat reegliga RemoteAccessHostTokenValidationUrl ühendamiseks.
 
diff --git a/components/policy/resources/policy_templates_fa.xtb b/components/policy/resources/policy_templates_fa.xtb
index 171e46df..fc3f370 100644
--- a/components/policy/resources/policy_templates_fa.xtb
+++ b/components/policy/resources/policy_templates_fa.xtb
@@ -138,6 +138,10 @@
 <translation id="1608755754295374538">نشانی‌های وب که بدون سؤال از کاربر اجازه دسترسی به دستگاه‌های ضبط صدا را خواهند داشت</translation>
 <translation id="1617235075406854669">فعال‌سازی حذف سابقه مرور و بارگیری</translation>
 <translation id="1617384279878333801">فعال کردن افزودن شخص از مدیر نمایه</translation>
+<translation id="163200210584085447">‏الگوهای این فهرست با نسخه اصلی نشانی وب درخواستی مطابقت داده می‌شوند
+      اگر مورد منطبقی پیدا شد، دسترسی به دستگاه‌های ضبط ویدیو در صفحه‌های ورود به سیستم
+      SAML ارائه می‌شود. اگر مورد منطبقی پیدا نشد، دسترسی به‌صورت خودکار رد می‌شود.
+      الگوهای نویسه عام مجاز نیستند.</translation>
 <translation id="1655229863189977773">تنظیم اندازه حافظهٔ پنهان دیسک در واحد بایت</translation>
 <translation id="166427968280387991">سرور پروکسی</translation>
 <translation id="1675002386741412210">پشتیبانی شده در تاریخ:</translation>
@@ -259,6 +263,7 @@
 <translation id="2113068765175018713">محدود کردن زمان روشن بودن بدون وقفه دستگاه با راه‌اندازی مجددد خودکار آن</translation>
 <translation id="2127599828444728326">اجازه به اعلانها در این سایت‌ها</translation>
 <translation id="2131902621292742709">تأخیر تارشدن صفحه هنگام کار با باتری</translation>
+<translation id="2134437727173969994">قفل صفحه مجاز</translation>
 <translation id="2137064848866899664">اگر این خط‌مشی تنظیم شود، هر صفحه‌نمایشی در هر راه‌اندازی مجدد،
       و اولین بار که بعد از تغییر مقدار خط‌مشی متصل شد، در جهت تعیین شده
       می‌چرخد. کاربران می‌توانند چرخش صفحه‌نمایش را
@@ -832,6 +837,7 @@
 <translation id="3967075520570946456">فعال کردن نمایش صفحه خوشامدگویی در هنگام اولین اجرای مرورگر پس از ارتقای سیستم عامل.</translation>
 <translation id="3973371701361892765">هرگز قفسه بصورت خودکار پنهان نشود</translation>
 <translation id="3984028218719007910">تعین می‌کند آیا <ph name="PRODUCT_OS_NAME" /> داده‌های حساب محلی را بعد از خروج حفظ کند یا نه. در صورت تنظیم روی درست، هیچ حساب دائمی توسط <ph name="PRODUCT_OS_NAME" /> حفظ نمی‌شود و از همه داده‌های جلسه کاربر بعد از خروج از سیستم صرفنظر می‌شود. اگر این خط‌مشی روی نادرست تنظیم شود یا پیکربندی نشود، ممکن است دستگاه داده‌های کاربر محلی (رمزگذاری‌شده) را حفظ کند.</translation>
+<translation id="3997519162482760140">‏نشانی‌های وب که اجازه دسترسی به دستگاه‌های ضبط ویدیو را در صفحه‌های ورود به سیستم SAML خواهند داشت</translation>
 <translation id="4001275826058808087">‏سرپرستان فناوری اطلاعات برای دستگاه‌های شرکتی می‌توانند از این پرچم استفاده کنند تا کنترل کنند آیا به کاربران اجازه دهند از پیشنهادات از طریق ثبت Chrome OS استفاده کنند.
 
       اگر این خط‌مشی روی درست تنظیم شود یا تنظیم نشده رها شود، کاربران می‌توانند از طریق ثبت Chrome OS از پیشنهادات استفاده کنند.
@@ -857,6 +863,9 @@
           وقتی این خط‌مشی تنظیم نشده باشد، مدت زمان پیش‌فرض استفاده می‌شود.
 
           مقدار خط‌مشی باید برحسب میلی ثانیه باشد.</translation>
+<translation id="4115096483386877940">قفل کردن صفحه‌ مجاز باشد.
+
+      اگر این خط‌مشی روی نادرست تنظیم شود، کاربران نمی‌توانند صفحه‌ را قفل کنند (فقط خروج از سیستم از جلسه کاربر امکان‌پذیر است). اگر این تنظیم روی درست تنظیم شود یا تنظیم‌نشده رها شود، کاربرانی که با گذرواژه احراز هویت شدند می‌توانند قفل صفحه‌ را باز کنند.</translation>
 <translation id="4121350739760194865">مانع از نمایش تبلیغات برنامه در صفحه برگهٔ جدید می‌شود</translation>
 <translation id="4147054660081653009">‏گواهی کلاینت برای اتصال به RemoteAccessHostTokenValidationUrl.
 
diff --git a/components/policy/resources/policy_templates_fi.xtb b/components/policy/resources/policy_templates_fi.xtb
index 3bbacf6..56f99f3 100644
--- a/components/policy/resources/policy_templates_fi.xtb
+++ b/components/policy/resources/policy_templates_fi.xtb
@@ -144,6 +144,11 @@
 <translation id="1608755754295374538">URL-osoitteet, joille on myönnetty pääsy äänikaappauslaitteisiin ilman erillisen luvan pyytämistä</translation>
 <translation id="1617235075406854669">Salli selaus- ja lataushistorian poistaminen</translation>
 <translation id="1617384279878333801">Salli profiilien luominen käyttäjäprofiilien hallinnassa</translation>
+<translation id="163200210584085447">Tämän luettelon osoitemalleja verrataan pyytävän URL-osoitteen
+      suojaustiedon alkuperään. Jos vastaavuus havaitaan, videontallennuslaitteiden
+      käyttö sallitaan SAML-kirjautumissivuilla. Jos vastaavuutta ei löydetä,
+      käyttö estetään automaattisesti. Jokerimerkkien käyttö malleissa ei ole
+      sallittua.</translation>
 <translation id="1655229863189977773">Aseta levyn välimuistin koko tavuina</translation>
 <translation id="166427968280387991">Välityspalvelin</translation>
 <translation id="1675002386741412210">Tuettu kohteissa:</translation>
@@ -254,6 +259,7 @@
 <translation id="2113068765175018713">Rajoita laitteen käyttöaikaa automaattisella uudelleenkäynnistyksellä</translation>
 <translation id="2127599828444728326">Salli ilmoitukset näillä sivustoilla</translation>
 <translation id="2131902621292742709">Ruudun himmennyksen viive käytettäessä laitetta akkuvirralla</translation>
+<translation id="2134437727173969994">Salli näytön lukitseminen</translation>
 <translation id="2137064848866899664">Kun tämä käytäntö on määritetty, jokaista näyttöä kierretään
       käytännön mukaisesti aina laitteen uudelleenkäynnistyksen yhteydessä ja 
       ensimmäisellä kerralla, kun se yhdistetään käytännön arvomuutoksen jälkeen. 
@@ -841,6 +847,7 @@
 <translation id="3967075520570946456">Määritä tervetulosivun näyttäminen, kun selain käynnistetään ensimmäisen kerran käyttöjärjestelmän päivityksen jälkeen.</translation>
 <translation id="3973371701361892765">Älä koskaan piilota hyllyä automaattisesti</translation>
 <translation id="3984028218719007910">Määrittää, säilyttääkö <ph name="PRODUCT_OS_NAME" /> paikalliset käyttäjätilitiedot uloskirjautumisen jälkeen. Jos asetus on tosi, <ph name="PRODUCT_OS_NAME" /> ei säilytä tilitietoja pysyvästi ja käyttökerran tiedot poistetaan uloskirjautumisen jälkeen. Jos käytännön asetus on epätosi tai sitä ei määritetä, paikalliset käyttäjätiedot voidaan tallentaa laitteelle salattuina.</translation>
+<translation id="3997519162482760140">URL-osoitteet, joille sallitaan videon kaappauslaitteiden käyttö SAML-kirjautumissivuilla</translation>
 <translation id="4001275826058808087">Yrityslaitteiden järjestelmänvalvojat voivat hallita tämän käytännön avulla, sallitaanko käyttäjien lunastaa tarjouksia Chrome-käyttöjärjestelmän rekisteröitymisen kautta.
 
       Jos käytännön arvoksi on asetettu tosi tai sille ei aseteta mitään arvoa, käyttäjät voivat lunastaa tarjouksia Chrome-käyttöjärjestelmän rekisteröitymisen kautta.
@@ -866,6 +873,9 @@
           Kun tälle käytännölle ei ole asetettu arvoa, se käyttää ajan oletusarvoa.
 
           Tämän käytännön arvo täytyy määrittää millisekunteina.</translation>
+<translation id="4115096483386877940">Salli näytön lukitseminen
+
+      Jos tämän käytännön arvo on Epätosi, käyttäjät voivat lukita näytön (vain istunnosta uloskirjautuminen on mahdollista). Jos käytännön arvo on Tosi tai sitä ei aseteta, salasanatodennuksen tehneet käyttäjät voivat lukita näytön.</translation>
 <translation id="4121350739760194865">Estä sovelluskampanjoita näkymästä uusi välilehti -sivulla</translation>
 <translation id="4147054660081653009">Asiakasvarmenne yhteyden muodostamiseksi osoitteeseen RemoteAccessHostTokenValidationUrl.
 
diff --git a/components/policy/resources/policy_templates_fil.xtb b/components/policy/resources/policy_templates_fil.xtb
index d8c5d8b7..2559860 100644
--- a/components/policy/resources/policy_templates_fil.xtb
+++ b/components/policy/resources/policy_templates_fil.xtb
@@ -154,6 +154,9 @@
 <translation id="1608755754295374538">Mga URL na mabibigyan ng access sa mga device na nakakakuha ng audio nang walang prompt</translation>
 <translation id="1617235075406854669">Paganahin ang pagtatanggal ng browser at kasaysayan ng pag-download</translation>
 <translation id="1617384279878333801">I-enable ang magdagdag ng tao sa profile manager</translation>
+<translation id="163200210584085447">Itutugma ang mga pattern na nasa listahang ito sa security
+      origin ng humihiling na URL.  Kung may makikitang katugma, magbibigay ng access sa mga device na nagka-capture ng video sa mga page ng pag-login ng SAML.  Kung walang makitang
+      katugma, awtomatikong tatanggihan ang pag-access.  Hindi pinapayagan ang mga wildcard pattern.</translation>
 <translation id="1655229863189977773">Itakda ang laki ng cache ng disk sa bytes</translation>
 <translation id="166427968280387991">Proxy server</translation>
 <translation id="1675002386741412210">Suportado sa:</translation>
@@ -275,6 +278,7 @@
 <translation id="2113068765175018713">Limitahan ang uptime ng device sa pamamagitan ng awtomatikong pag-reboot</translation>
 <translation id="2127599828444728326">Payagan ang mga notification sa mga site na ito</translation>
 <translation id="2131902621292742709">Delay ng pag-dim ng screen kapag tumatakbo gamit ang power ng baterya</translation>
+<translation id="2134437727173969994">Payagan ang pagla-lock ng screen</translation>
 <translation id="2137064848866899664">Kung itatakda ang patakarang ito, iro-rotate ang bawat display sa
       nakatakdang oryentasyon sa bawat pag-reboot, at sa unang pagkakataon na ikokonekta ito
       pagkatapos mabago ang value ng patakaran. Maaaring baguhin ng mga user ang pag-rotate ng display
@@ -899,6 +903,7 @@
 <translation id="3967075520570946456">I-enable ang pagpapakita ng welcome page sa unang paglulunsad ng browser kasunod ng pag-upgrade ng OS.</translation>
 <translation id="3973371701361892765">Huwag kailanman awtomatikong itago ang shelf</translation>
 <translation id="3984028218719007910">Tinutukoy kung pinapanatili ng <ph name="PRODUCT_OS_NAME" /> ang lokal na data ng account pagkatapos ng pag-logout. Kung nakatakda sa true, walang mga umiiral nang account ang pananatilihin ng <ph name="PRODUCT_OS_NAME" /> at idi-discard ang lahat ng data mula sa session ng user pagkatapos ng pag-logout. Kung nakatakda sa false o hindi naka-configure ang patakarang ito, maaaring magpanatili ng (na-encrypt na) lokal na data ng user ang device.</translation>
+<translation id="3997519162482760140">Mga URL na bibigyan ng access sa mga device na nagka-capture ng video sa mga page ng pag-login ng SAML</translation>
 <translation id="4001275826058808087">Magagamit ng mga IT admin para sa mga enterprise device ang flag na ito upang kontrolin kung papayagan ang mga user na kumuha ng mga alok sa pamamagitan ng Pagpaparehistro ng Chrome OS.
 
       Kung itinakda sa true o iniwang hindi nakatakda ang patakarang ito, makakakuha ng mga alok ang mga user sa pamamagitan ng Pagpaparehistro ng Chrome OS.
@@ -932,6 +937,9 @@
           Kapag hindi nakatakda ang patakarang ito, may default na tagal ng oras na gagamitin.
 
           Dapat tukuyin ang halaga ng patakaran ayon sa millisecond.</translation>
+<translation id="4115096483386877940">Payagan ang pagla-lock ng screen.
+
+      Kung nakatakda sa false ang patakarang ito, hindi mala-lock ng mga user ang screen (ang posible lang ay ang pagsa-sign out mula sa session ng user). Kung nakatakda sa true o hindi naitakda ang setting na ito, mala-lock ang screen ng mga user na napatotohanan gamit ang isang password.</translation>
 <translation id="4121350739760194865">Pigilan ang paglitaw ng mga pag-promote ng app sa pahina ng bagong tab</translation>
 <translation id="4147054660081653009">Certificate ng client para sa pagkonekta sa RemoteAccessHostTokenValidationUrl.
 
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb
index 40949ce..9be2a8d 100644
--- a/components/policy/resources/policy_templates_fr.xtb
+++ b/components/policy/resources/policy_templates_fr.xtb
@@ -155,6 +155,12 @@
 <translation id="1608755754295374538">URL autorisées à accéder aux appareils de capture audio sans avis préalable</translation>
 <translation id="1617235075406854669">Activer la suppression de l'historique du navigateur et de l'historique des téléchargements</translation>
 <translation id="1617384279878333801">Autoriser l'ajout de personnes dans le gestionnaire de profils</translation>
+<translation id="163200210584085447">Les formats de cette liste seront mis en correspondance avec la source
+      de sécurité de l'URL à l'origine de la demande. En cas de correspondance,
+      l'accès aux appareils de capture vidéo est autorisé sur les pages de
+      connexion SAML. Si aucune correspondance n'est détectée, l'accès est
+      automatiquement refusé. Les formats contenant des caractères génériques
+      ne sont pas autorisés.</translation>
 <translation id="1655229863189977773">Définir la taille du cache du disque en octets</translation>
 <translation id="166427968280387991">Serveur proxy</translation>
 <translation id="1675002386741412210">Compatible avec :</translation>
@@ -276,6 +282,7 @@
 <translation id="2113068765175018713">Limiter le temps de fonctionnement de l'appareil en redémarrant automatiquement</translation>
 <translation id="2127599828444728326">Autoriser les notifications sur ces sites</translation>
 <translation id="2131902621292742709">Délai d'assombrissement de l'écran (batterie)</translation>
+<translation id="2134437727173969994">Autoriser le verrouillage de l'écran</translation>
 <translation id="2137064848866899664">Si cette règle est définie, chaque écran pivote en fonction de
       l'orientation spécifiée à chaque redémarrage et lors de sa première
       connexion après la modification de la valeur de la règle. Les utilisateurs
@@ -908,6 +915,7 @@
 <translation id="3967075520570946456">Activer l'affichage de la page d'accueil à la première exécution du navigateur suivant la mise à jour de l'OS</translation>
 <translation id="3973371701361892765">Ne jamais masquer automatiquement l'étagère</translation>
 <translation id="3984028218719007910">Détermine si <ph name="PRODUCT_OS_NAME" /> doit conserver les données locales des comptes après la déconnexion. Si cette règle est définie sur "true", aucun compte persistant n'est conservé par <ph name="PRODUCT_OS_NAME" />. Par ailleurs, toutes les données de la session utilisateur sont supprimées après la déconnexion. Si cette règle est définie sur "false" ou si elle n'est pas configurée, l'appareil peut conserver des données utilisateur locales (chiffrées).</translation>
+<translation id="3997519162482760140">URL autorisées à accéder aux appareils de capture vidéo sur les pages de connexion SAML</translation>
 <translation id="4001275826058808087">Les administrateurs informatiques des appareils d'entreprise peuvent utiliser cet indicateur pour autoriser ou non les utilisateurs à profiter de leurs offres via le service d'enregistrement de Chrome OS.
 
       Si cette règle est définie sur "True" ou si elle n'est pas définie, les utilisateurs peuvent utiliser leurs offres via ce service.
@@ -941,6 +949,9 @@
                       Si cette règle n'est pas définie, une durée par défaut est utilisée.
 
                       La valeur de cette règle doit être indiquée en millisecondes.</translation>
+<translation id="4115096483386877940">Autoriser le verrouillage de l'écran.
+
+      Si cette règle est définie sur "False", les utilisateurs ne peuvent pas verrouiller l'écran (seule la déconnexion de la session de l'utilisateur est possible). Si ce paramètre est défini sur "True", ou s'il n'est pas configuré, les utilisateurs ayant procédé à l'authentification avec un mot de passe peuvent verrouiller l'écran.</translation>
 <translation id="4121350739760194865">Empêcher les promotions pour des applications de s'afficher sur la page Nouvel onglet</translation>
 <translation id="4147054660081653009">Certificat client pour se connecter à RemoteAccessHostTokenValidationUrl.
 
diff --git a/components/policy/resources/policy_templates_gu.xtb b/components/policy/resources/policy_templates_gu.xtb
index 320e1fe..4241784 100644
--- a/components/policy/resources/policy_templates_gu.xtb
+++ b/components/policy/resources/policy_templates_gu.xtb
@@ -154,6 +154,10 @@
 <translation id="1608755754295374538">URL કે જેને વિના સંકેતે ઑડિઓ કેપ્ચર ઉપકરણોની ઍક્સેસ આપવામાં આવશે</translation>
 <translation id="1617235075406854669">બ્રાઉઝર અને ડાઉનલોડ ઇતિહાસને કાઢી નાખવાનું સક્ષમ કરો</translation>
 <translation id="1617384279878333801">પ્રોફાઇલ સંચાલકમાં વ્યક્તિ ઉમેરવાનું સક્ષમ કરવું</translation>
+<translation id="163200210584085447">આ સૂચિમાંની પેટર્ન વિનંતી કરવામાં આવનાર URL ને સુરક્ષા મૂળ સામે મેળ કરવામાં
+      આવશે.  જો કોઈ મેળ મળે છે, તો SAML લોગિન પૃષ્ઠો પર વિડિઓ કૅપ્ચર ઉપકરણોની       
+      ઍક્સેસ આપવામાં આવશે. જો કોઈ મેળ મળતો નથી, તો ઍક્સેસ આપમેળે નકારવામાં 
+      આવશે.  વાઇલ્ડકાર્ડ પેટર્નની મંજૂરી નથી.</translation>
 <translation id="1655229863189977773">ડિસ્ક કૅસ કદને બાઇટ્સમાં સેટ કરો</translation>
 <translation id="166427968280387991">પ્રોક્સી સર્વર</translation>
 <translation id="1675002386741412210">આના પર સપોર્ટેડ:</translation>
@@ -270,6 +274,7 @@
 <translation id="2113068765175018713">આપમેળે રીબૂટ કરીને ડિવાઇસ કાર્યકાલને મર્યાદિત કરો</translation>
 <translation id="2127599828444728326">આ સાઇટ્સ પર સૂચનાઓને મંજૂરી આપો</translation>
 <translation id="2131902621292742709">જ્યારે બેટરી પાવર પર ચાલી રહ્યું હોય ત્યારે સ્ક્રીન મંદ વિલંબ</translation>
+<translation id="2134437727173969994">સ્ક્રીનને લૉક કરવાની મંજૂરી આપો</translation>
 <translation id="2137064848866899664">જો આ નીતિ સેટ કરેલી હોય, તો દરેક રીબૂટ પર અને 
       નીતિ મૂલ્ય બદલ્યાં પછી પહેલી વખત તે કનેક્ટ કરવામાં આવે ત્યારે દરેક પ્રદર્શન ચોક્કસ 
       ઓરિએન્ટેશન પર ફેરવવામાં આવે છે. વપરાશકર્તાઓ લોગ ઇન કર્યાં પછી સેટિંગ્સ પૃષ્ઠ 
@@ -896,6 +901,7 @@
 <translation id="3967075520570946456">OS અપગ્રેડ બાદ, પહેલીવાર બ્રાઉઝર લોન્ચ કરવા પર સ્વાગત પૃષ્ઠ દર્શાવવાનું સક્ષમ કરવું.</translation>
 <translation id="3973371701361892765">આ શેલ્ફને ક્યારેય સ્વતઃછુપાવો કરશો નહીં</translation>
 <translation id="3984028218719007910">લૉગ આઉટ કર્યા પછી <ph name="PRODUCT_OS_NAME" /> સ્થાનિક ડેટાને રાખે કે નહીં તે નિર્ધારિત કરે છે. જો true પર સેટ છે, તો <ph name="PRODUCT_OS_NAME" /> દ્વારા સતત એકાઉન્ટ્સ રાખવામાં આવશે નહીં લૉગઆઉટ પછી વપરાશકર્તા સત્રનાં બધા ડેટાને છોડવામાં આવશે. જો આ નીતિ false પર સેટ છે અથવા કન્ફિગર કરેલી નથી, તો ઉપકરણ (એન્ક્રિપ્ટેડ) સ્થાનિક વપરાશકર્તા ડેટા રાખી શકે છે.</translation>
+<translation id="3997519162482760140">URL કે જેને SAML લોગિન પૃષ્ઠો પર વિડિઓ કૅપ્ચર ઉપકરણોની ઍક્સેસ આપવામાં આવશે</translation>
 <translation id="4001275826058808087">એન્ટરપ્રાઇઝ ઉપકરણો માટે આઇટી સંચાલકો Chrome OS નોંધણી દ્વારા વપરાશકર્તાઓને ઓફર્સને રીડિમ કરવાની મંજૂરી આપવી કે નહીં તે નિયંત્રિત કરવા માટે આ ધ્વજનો ઉપયોગ કરી શકે છે.
 
       જો આ નીતિ ટ્રુ પર સેટ કરી છે અથવા સેટ કર્યા વિના છોડી દીધી છે, તો વપરાશકર્તાઓ Chrome OS નોંધણી દ્વારા ઓફર્સને રીડિમ કરી શકશે.
@@ -929,6 +935,9 @@
           જ્યારે આ નીતિ અનસેટ હોય, ત્યારે ડિફોલ્ટ સમયની લંબાઈનો ઉપયોગ થાય છે.
 
           આ નીતિ મૂલ્ય મિલિસેકન્ડ્સમાં નિર્દિષ્ટ હોવું જોઈએ.</translation>
+<translation id="4115096483386877940">સ્ક્રીનને લૉક કરવાની મંજૂરી આપો.
+
+      જો આ નીતિ false પર સેટ કરેલ છે, તો વપરાશકર્તાઓ સ્ક્રીનને લૉક કરવામાં સમર્થ હશે નહીં (ફક્ત વપરાશકર્તા સત્રથી સાઇન આઉટ કરવું જ શક્ય હશે). જો આ સેટિંગ true પર સેટ કરેલ છે અથવા તો સેટ કરેલ નથી, તો વપરાશકર્તાઓ જે પાસવર્ડ વડે પ્રમાણીકૃત થયેલ છે તે સ્ક્રીનને લૉક કરી શકે છે.</translation>
 <translation id="4121350739760194865">એપ્લિકેશન  પ્રમોશનને નવા ટૅબ પૃષ્ઠ પર દેખાવાથી અટકાવો</translation>
 <translation id="4147054660081653009">RemoteAccessHostTokenValidationUrl પર કનેક્ટ કરવા માટેનું ક્લાઇન્ટ પ્રમાણપત્ર.
 
diff --git a/components/policy/resources/policy_templates_hi.xtb b/components/policy/resources/policy_templates_hi.xtb
index 12287a8..1f8954b 100644
--- a/components/policy/resources/policy_templates_hi.xtb
+++ b/components/policy/resources/policy_templates_hi.xtb
@@ -150,6 +150,11 @@
 <translation id="1608755754295374538">ऐसे URL जिन्हें संकेत किए बिना ऑडियो कैप्चर डिवाइस की एक्सेस दी जाएगी</translation>
 <translation id="1617235075406854669">ब्राउज़र और डाउनलोड इतिहास हटाना सक्षम करें</translation>
 <translation id="1617384279878333801">प्रोफ़ाइल प्रबंधक में व्‍यक्‍ति जोड़ना सक्षम करें</translation>
+<translation id="163200210584085447">इस सूची के पैटर्न का मिलान अनुरोध करने वाले
+      URL के सुरक्षा मूल से किया जाएगा.  यदि मिलान हो जाता है, तो SAML लॉगिन पृष्ठों
+      पर वीडियो कैप्चर डिवाइस का एक्सेस प्रदान कर दिया जाएगा.  यदि कोई मिलान नहीं
+      होता है, तो एक्सेस अपने आप अस्वीकृत हो जाएगा.  वाइल्डकार्ड पैटर्न स्वीकार्य
+      नहीं हैं.</translation>
 <translation id="1655229863189977773">डिस्‍क संचय आकार को बाइट में सेट करें</translation>
 <translation id="166427968280387991">प्रॉक्सी सर्वर</translation>
 <translation id="1675002386741412210">इस पर समर्थित:</translation>
@@ -270,6 +275,7 @@
 <translation id="2113068765175018713">स्वचालित रूप से रीबूट करके डिवाइस अपटाइम सीमित करें</translation>
 <translation id="2127599828444728326">इन साइटों पर नोटिफिकेशन की अनुमति दें</translation>
 <translation id="2131902621292742709">बैटरी पावर पर चलते समय स्क्रीन मंद विलंब</translation>
+<translation id="2134437727173969994">स्क्रीन लॉक करने की अनुमति</translation>
 <translation id="2137064848866899664">यदि यह पॉलिसी सेट की जाती है, तो प्रत्‍येक बार रीबूट करने
       और पॉलिसी मान बदलने के बाद उसके पहली बार कनेक्‍ट होने पर
       प्रत्‍येक प्रदर्शन को विशिष्‍ट अभिविन्‍यास में घुमाया जाता है. उपयोगकर्ता, प्रवेश करने के बाद सेटिंग पृष्‍ठ के माध्‍यम से प्रदर्शन को घुमा सकते हैं, लेकिन अगली बार
@@ -881,6 +887,7 @@
 <translation id="3967075520570946456">OS अपग्रेड होने के बाद, पहले ब्राउज़र लॉन्‍च पर स्‍वागत पृष्‍ठ दिखाना सक्षम करें.</translation>
 <translation id="3973371701361892765">शेल्फ़ को कभी भी स्वत:-न छिपाएं</translation>
 <translation id="3984028218719007910">लॉगआउट के बाद <ph name="PRODUCT_OS_NAME" /> स्‍थानीय खाता डेटा रखना या न रखना निर्धारित करें. यदि सही पर सेट हो, तो <ph name="PRODUCT_OS_NAME" /> द्वारा कोई निरंतर खाता नहीं रखा जाएगा और उपयोगकर्ता सत्र से सभी डेटा लॉगआउट के बाद उपयोगकर्ता सत्र छोड़ दिए जाएंगे. यदि यह नीति गलत पर सेट हो या कॉन्‍फ़िगर नहीं की गई हो, तो डिवाइस (एनक्रिप्ट किया गया) स्‍थानीय उपयोगकर्ता डेटा रख सकता है.</translation>
+<translation id="3997519162482760140">ऐसे URL जिन्हें SAML लॉगिन पृष्ठों पर वीडियो कैप्चर डिवाइस का एक्सेस प्रदान किया जाएगा</translation>
 <translation id="4001275826058808087">एंटरप्राइज़ डिवाइस के आईटी व्यवस्थापक इस फ़्लैग का उपयोग यह नियंत्रित करने के लिए कर सकते हैं कि उपयोगकर्ताओं को Chrome OS पंजीकरण के द्वारा ऑफ़र रिडीम कराने की अनुमति दी जाए या नहीं.
 
       यदि यह नीति सही पर सेट है या सेट किए बिना छोड़ दी जाती है, तो उपयोगकर्ता Chrome OS पंजीकरण के द्वारा ऑफ़र रिडीम करा सकेंगे.
@@ -912,6 +919,9 @@
           जब नीति सेट नहीं की जाती, तो एक डिफ़ॉल्ट समयावधि का उपयोग किया जाता है.
 
           नीति का मान मिलीसेकंड में निर्दिष्ट किया जाना चाहिए.</translation>
+<translation id="4115096483386877940">स्क्रीन लॉक करने की अनुमति.
+
+      यदि यह पॉलिसी असत्य पर सेट है, तो उपयोगकर्ता स्क्रीन को लॉक नहीं कर सकेंगे (केवल उपयोगकर्ता सत्र से प्रस्थान करना संभव होगा). यदि यह पॉलिसी सत्य पर सेट है या सेट नहीं है, तो पासवर्ड से प्रमाणीकृत किए गए उपयोगकर्ता स्क्रीन को लॉक कर सकते हैं.</translation>
 <translation id="4121350739760194865">ऐप्‍लिकेशन प्रचारों को नए टैब पृष्ठ पर दिखाई देने से रोकें</translation>
 <translation id="4147054660081653009">RemoteAccessHostTokenValidationUrl से कनेक्ट करने के लिए क्लाइंट प्रमाणपत्र.
 
diff --git a/components/policy/resources/policy_templates_hr.xtb b/components/policy/resources/policy_templates_hr.xtb
index 5165bc3..ed78949 100644
--- a/components/policy/resources/policy_templates_hr.xtb
+++ b/components/policy/resources/policy_templates_hr.xtb
@@ -144,6 +144,11 @@
 <translation id="1608755754295374538">URL-ovi koji će dobiti pristup uređajima za snimanje zvuka bez postavljanja upita</translation>
 <translation id="1617235075406854669">Omogući brisanje povijesti preglednika i preuzimanja</translation>
 <translation id="1617384279878333801">Omogućivanje dodavanja osobe u upravitelju profila</translation>
+<translation id="163200210584085447">Uzorci na tom popisu usporedit će se sa sigurnosnim
+      izvorištem URL-a koji šalje zahtjev. Ako se podudaranje pronađe, pristup
+      uređajima za videosnimanje dodijelit će se na SAML stranicama za
+      prijavu. Ako se podudaranje ne pronađe, pristup će se automatski odbiti.
+      Uzorci sa zamjenskim znakovima nisu dopušteni.</translation>
 <translation id="1655229863189977773">Postavite veličinu predmemorije diska u bajtovima</translation>
 <translation id="166427968280387991">Proxy poslužitelj</translation>
 <translation id="1675002386741412210">Podržano na:</translation>
@@ -259,6 +264,7 @@
 <translation id="2113068765175018713">Ograničavanje vremena rada uređaja automatskim ponovnim pokretanjem sustava</translation>
 <translation id="2127599828444728326">Dopuštanje obavijesti na ovim web-lokacijama</translation>
 <translation id="2131902621292742709">Odgoda zatamnjivanja zaslona za vrijeme baterijskog napajanja</translation>
+<translation id="2134437727173969994">Dopusti zaključavanje zaslona</translation>
 <translation id="2137064848866899664">Ako se to pravilo postavi, svaki se zaslon zakreće na navedeno
       usmjerenje pri svakom ponovnom pokretanju i prilikom prvog povezivanja
       nakon promjene vrijednosti pravila. Korisnici mogu promijeniti usmjerenje
@@ -840,6 +846,7 @@
 <translation id="3967075520570946456">Omogućivanje prikazivanja stranice dobrodošlice prilikom prvog pokretanja preglednika nakon nadogradnje OS-a.</translation>
 <translation id="3973371701361892765">Nikada nemoj automatski sakriti policu</translation>
 <translation id="3984028218719007910">Određuje hoće li sustav <ph name="PRODUCT_OS_NAME" /> zadržati lokalne podatke računa nakon odjave. Ako je to pravilo postavljeno na "istinito", sustav <ph name="PRODUCT_OS_NAME" /> ne zadržava trajne račune i svi podaci s korisnikove sesije bit će odbačeni nakon odjave. Ako je to pravilo postavljeno na "lažno" ili ako nije konfigurirano, uređaj će možda zadržavati (kriptirane) lokalne korisničke podatke.</translation>
+<translation id="3997519162482760140">URL-ovi koji će dobiti pristup uređajima za videosnimanje na SAML stranicama za prijavu</translation>
 <translation id="4001275826058808087">IT administratori za poslovne uređaje pomoću te oznake mogu kontrolirati hoće li korisnici moći iskoristiti ponude registracijom OS-a Chrome.
 
       Ako je ovo pravilo postavljeno na istinito ili ako nije postavljeno, korisnici će moći iskoristiti ponude registracijom OS-a Chrome.
@@ -865,6 +872,9 @@
           Kada pravilo nije postavljeno, upotrebljava se zadano vrijeme.
 
           Vrijednost pravila treba navesti u milisekundama.</translation>
+<translation id="4115096483386877940">Dopusti zaključavanje zaslona.
+
+      Ako se to pravilo postavi na False, korisnici neće moći zaključati zaslon (bit će moguća samo odjava s korisničke sesije). Ako se to pravilo postavi na True ili se ne postavi, korisnici koji su se autentificirali zaporkom moći će zaključati zaslon.</translation>
 <translation id="4121350739760194865">Sprječavanje prikaza promocija aplikacija na stranici Nova kartica</translation>
 <translation id="4147054660081653009">Certifikat klijenta za povezivanje na RemoteAccessHostTokenValidationUrl.
 
diff --git a/components/policy/resources/policy_templates_hu.xtb b/components/policy/resources/policy_templates_hu.xtb
index a8c78485..58746f4 100644
--- a/components/policy/resources/policy_templates_hu.xtb
+++ b/components/policy/resources/policy_templates_hu.xtb
@@ -143,6 +143,11 @@
 <translation id="1608755754295374538">Azon URL-ek, amelyek rákérdezés nélkül hozzáférést kapnak a hangrögzítő eszközökhöz</translation>
 <translation id="1617235075406854669">Böngészési és letöltési előzmények törlésének engedélyezése</translation>
 <translation id="1617384279878333801">Engedélyezi a személyek hozzáadását a profilkezelőben</translation>
+<translation id="163200210584085447">A listában szereplő mintákat a rendszer egyezteti a kérelmező
+      URL biztonsági eredetével. Ha van egyezés, a böngésző a SAML
+      bejelentkező oldalakon engedélyezi a videórögzítő eszközökhöz való
+      hozzáférést. Ha nincs egyezés, a böngésző automatikusan megtagadja
+      a hozzáférést. A helyettesítőkarakter-minták használata nem megengedett.</translation>
 <translation id="1655229863189977773">Lemezgyorsítótár méretének beállítása bájtban</translation>
 <translation id="166427968280387991">Proxyszerver</translation>
 <translation id="1675002386741412210">Támogatott a következőkön:</translation>
@@ -259,6 +264,7 @@
 <translation id="2113068765175018713">Eszköz működési idejének korlátozása automatikus újraindítással</translation>
 <translation id="2127599828444728326">Értesítések engedélyezése ezeken a webhelyeken</translation>
 <translation id="2131902621292742709">Képernyő elsötétítésének késleltetése akkumulátorról való működés során</translation>
+<translation id="2134437727173969994">A képernyő zárolásának engedélyezése</translation>
 <translation id="2137064848866899664">Ha a házirend be van állítva, minden kijelző elfordul a
       megadott tájolásba minden újraindításkor, illetve a házirend értékének
       módosítása utáni első csatlakozáskor. A felhasználók bejelentkezés után
@@ -843,6 +849,7 @@
 <translation id="3967075520570946456">Az üdvözlőoldal megjelenítésének engedélyezése az operációs rendszer frissítését követő első böngészőindításkor.</translation>
 <translation id="3973371701361892765">A polc soha ne legyen automatikusan elrejtve</translation>
 <translation id="3984028218719007910">Meghatározza, hogy a(z) <ph name="PRODUCT_OS_NAME" /> megtartja-e a helyi fiókadatokat a kijelentkezést követően. Ha a beállítás igaz, akkor a(z) <ph name="PRODUCT_OS_NAME" /> nem tart meg állandó fiókokat, és a rendszer elveti a felhasználói munkamenet minden adatát a kijelentkezés után. Ha a házirend beállítása hamis, vagy nincs beállítva a házirend, akkor az eszköz megtarthatja a (titkosított) helyi felhasználói adatokat.</translation>
+<translation id="3997519162482760140">Azon URL-ek, amelyek hozzáférést kapnak a videórögzítő eszközökhöz a SAML bejelentkezési oldalakon</translation>
 <translation id="4001275826058808087">Vállalati eszközök rendszergazdái annak szabályozására használhatják ezt a jelölőt, hogy engedélyezik-e a felhasználóknak az ajánlatok beváltását Chrome OS-regisztráció útján.
 
       Ha a házirend értéke igaz, vagy ha nincs beállítva, a felhasználók beválthatnak ajánlatokat Chrome OS-regisztráció útján.
@@ -868,6 +875,9 @@
           Ha a házirend nincs beállítva, a rendszer az alapértelmezett időtartamot használja.
 
           A házirend értékét ezredmásodpercben kell megadni.</translation>
+<translation id="4115096483386877940">A képernyő zárolásának engedélyezése.
+
+      Ha a házirend értéke hamis, a felhasználók nem tudják zárolni a képernyőt (csak a felhasználói munkamenetből való kijelentkezés lesz lehetséges). Ha a beállítás igaz, vagy ha nincs megadva, a jelszóval hitelesített felhasználók zárolhatják a képernyőt.</translation>
 <translation id="4121350739760194865">Megakadályozza az alkalmazáspromóciók megjelenését az új lap oldalon</translation>
 <translation id="4147054660081653009">Klienstanúsítvány a RemoteAccessHostTokenValidationUrl eléréséhez.
 
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb
index 482c8d1..d938776 100644
--- a/components/policy/resources/policy_templates_id.xtb
+++ b/components/policy/resources/policy_templates_id.xtb
@@ -144,6 +144,11 @@
 <translation id="1608755754295374538">URL yang akan diberi akses ke perangkat perekam audio tanpa peringatan</translation>
 <translation id="1617235075406854669">Aktifkan penghapusan riwayat unduhan atau browser</translation>
 <translation id="1617384279878333801">Mengaktifkan tambahkan orang di pengelola profil</translation>
+<translation id="163200210584085447">Pola dalam daftar ini akan dicocokkan dengan
+      asal keamanan URL yang meminta.  Jika ditemukan kecocokan, akses ke perangkat
+      perekam video akan diberikan di laman masuk SAML.  Jika tidak ditemukan
+      kecocokan, akses akan ditolak secara otomatis.  Pola karakter pengganti
+      tidak diizinkan.</translation>
 <translation id="1655229863189977773">Setel ukuran cache disk dalam bita</translation>
 <translation id="166427968280387991">Server proxy</translation>
 <translation id="1675002386741412210">Didukung di:</translation>
@@ -259,6 +264,7 @@
 <translation id="2113068765175018713">Membatasi waktu operasi perangkat dengan melakukan booting ulang secara otomatis</translation>
 <translation id="2127599828444728326">Izinkan pemberitahuan di situs ini</translation>
 <translation id="2131902621292742709">Penundaan peredupan layar saat menggunakan daya baterai</translation>
+<translation id="2134437727173969994">Mengizinkan penguncian layar</translation>
 <translation id="2137064848866899664">Jika kebijakan ini disetel, tiap layar akan diputar dengan orientasi tertentu
       setiap kali melakukan boot ulang dan pertama kalinya layar tersambung
       setelah nilai kebijakan berubah. Pengguna dapat mengubah rotasi layar
@@ -846,6 +852,7 @@
 <translation id="3967075520570946456">Mengaktifkan menampilkan laman selamat datang saat peluncuran browser pertama setelah peningkatan versi OS.</translation>
 <translation id="3973371701361892765">Jangan sembunyikan rak secara otomatis</translation>
 <translation id="3984028218719007910">Menentukan apakah <ph name="PRODUCT_OS_NAME" /> menyimpan data akun lokal setelah keluar. Jika disetel ke true, maka tidak ada akun yang terus menerus disimpan oleh <ph name="PRODUCT_OS_NAME" /> dan semua data dari sesi pengguna akan dihapus setelah keluar. Jika kebijakan ini disetel ke false atau tidak dikonfigurasi, perangkat dapat menyimpan data pengguna lokal (yang dienkripsi).</translation>
+<translation id="3997519162482760140">URL yang akan diberi akses ke perangkat perekam video di laman masuk SAML</translation>
 <translation id="4001275826058808087">Admin TI untuk perangkat perusahaan dapat menggunakan tanda ini untuk mengontrol apakah mengizinkan pengguna menukarkan penawaran melalui Pendaftaran Chrome OS atau tidak.
 
       Jika kebijakan ini disetel ke true atau tidak disetel, pengguna akan dapat menukarkan penawaran melalui Pendaftaran Chrome OS.
@@ -871,6 +878,9 @@
           Saat kebijakan ini tidak disetel, panjang waktu default digunakan.
 
           Nilai kebijakan harus ditetapkan dalam milidetik.</translation>
+<translation id="4115096483386877940">Mengizinkan penguncian layar.
+
+      Jika kebijakan ini disetel ke false. pengguna tidak akan dapat mengunci layar (mereka hanya dapat keluar dari sesi pengguna). Jika setelan ini disetel ke true atau tidak disetel, pengguna yang diautentikasi dengan sandi dapat mengunci layar.</translation>
 <translation id="4121350739760194865">Mencegah promosi apl muncul di laman tab baru</translation>
 <translation id="4147054660081653009">Sertifikat klien untuk menyambung ke RemoteAccessHostTokenValidationUrl.
 
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb
index d21d685..54efc832 100644
--- a/components/policy/resources/policy_templates_it.xtb
+++ b/components/policy/resources/policy_templates_it.xtb
@@ -137,6 +137,7 @@
 <translation id="1608755754295374538">URL a cui verrà concesso l'accesso ai dispositivi di acquisizione audio senza richieste</translation>
 <translation id="1617235075406854669">Attiva eliminazione cronologia del browser e dei download</translation>
 <translation id="1617384279878333801">Attiva la funzione Aggiungi persona in Profile Manager</translation>
+<translation id="163200210584085447">I pattern di questo elenco verranno confrontati con l'origine di sicurezza dell'URL richiedente. Se viene trovata una corrispondenza, l'accesso ai dispositivi di acquisizione video verrà concesso sulle pagine di accesso SAML. In caso contrario, l'accesso verrà automaticamente negato. Non sono consentite sequenze con caratteri jolly.</translation>
 <translation id="1655229863189977773">Imposta le dimensioni della cache su disco in byte</translation>
 <translation id="166427968280387991">Server proxy</translation>
 <translation id="1675002386741412210">Supportato su:</translation>
@@ -248,6 +249,7 @@
 <translation id="2113068765175018713">Limita il tempo di attività del dispositivo riavviandolo automaticamente</translation>
 <translation id="2127599828444728326">Consenti notifiche su questi siti</translation>
 <translation id="2131902621292742709">Ritardo oscuramento schermo in caso di utilizzo della batteria</translation>
+<translation id="2134437727173969994">Consenti blocco dello schermo</translation>
 <translation id="2137064848866899664">Se la norma viene impostata, ogni schermo viene ruotato secondo l'orientamento specificato, a ogni riavvio e la prima volta che viene collegato in seguito alla modifica della norma. Dopo aver eseguito l'accesso, gli utenti possono modificare la rotazione dello schermo tramite la pagina delle impostazioni ma, al successivo riavvio, la loro impostazione viene sostituita dal valore della norma.
 
       La norma si applica allo schermo principale e a tutti gli schermi secondari.
@@ -819,6 +821,7 @@
 <translation id="3967075520570946456">Attiva la visualizzazione della pagina di benvenuto al primo avvio del browser successivo all'upgrade del sistema operativo.</translation>
 <translation id="3973371701361892765">Non nascondere mai automaticamente lo shelf</translation>
 <translation id="3984028218719007910">Consente di stabilire se tenere o meno memorizzati in <ph name="PRODUCT_OS_NAME" /> i dati degli account locali dopo l'uscita. Se la norma viene impostata su true, in <ph name="PRODUCT_OS_NAME" /> non verranno conservati gli account persistenti e tutti i dati della sessione utente verranno eliminati dopo l'uscita. Se la norma viene impostata su false o non viene configurata, il dispositivo potrebbe conservare i dati utente locali (crittografati).</translation>
+<translation id="3997519162482760140">URL a cui verrà concesso l'accesso ai dispositivi di acquisizione video su pagine di accesso SAML</translation>
 <translation id="4001275826058808087">Gli amministratori IT di dispositivi aziendali possono utilizzare questo flag per stabilire se consentire agli utenti di utilizzare le offerte tramite la registrazione a Chrome OS.
 
       Se questa norma viene impostata su true o non viene impostata, gli utenti potranno utilizzare le offerte tramite la registrazione a Chrome OS.
@@ -844,6 +847,9 @@
 Se questa norma non viene impostata, viene utilizzato un periodo di tempo predefinito.
 
 Il valore della norma deve essere specificato in millisecondi.</translation>
+<translation id="4115096483386877940">Consenti blocco dello schermo.
+
+Se la norma viene impostata su false, gli utenti non potranno bloccare lo schermo (sarà possibile solo la disconnessione dalla sessione utente). Se la norma viene impostata su true o non viene del tutto impostata, gli utenti autenticati mediante password potranno bloccare lo schermo.</translation>
 <translation id="4121350739760194865">Impedisci la visualizzazione delle promozioni di applicazioni nella pagina Nuova scheda</translation>
 <translation id="4147054660081653009">Il certificato client per la connessione a RemoteAccessHostTokenValidationUrl.
 
diff --git a/components/policy/resources/policy_templates_iw.xtb b/components/policy/resources/policy_templates_iw.xtb
index a7a9e87..6e2806d2 100644
--- a/components/policy/resources/policy_templates_iw.xtb
+++ b/components/policy/resources/policy_templates_iw.xtb
@@ -142,6 +142,10 @@
 <translation id="1608755754295374538">כתובות אתרים שיקבלו גישה למכשירי הקלטת אודיו ללא הצגת בקשה</translation>
 <translation id="1617235075406854669">הפעל את מחיקת היסטוריית הדפדפן וההורדות</translation>
 <translation id="1617384279878333801">הפעלת הוספת אדם במנהל הפרופיל</translation>
+<translation id="163200210584085447">‏תבניות ברשימה הזו יעברו השוואה למקור האבטחה
+      של כתובת האתר שממנה הגיעה הבקשה. אם תימצא התאמה, הגישה להתקני
+      צילום הווידאו תוענק בדפי כניסה מסוג SAML.  אם לא תימצא התאמה, הגישה
+      תישלל באופן אוטומטי. אין להשתמש בתבניות הכוללות תווים כלליים לחיפוש.</translation>
 <translation id="1655229863189977773">הגדר גודל קובץ שמור של דיסק בבייטיים</translation>
 <translation id="166427968280387991">‏שרת Proxy</translation>
 <translation id="1675002386741412210">נתמכת ב:</translation>
@@ -254,6 +258,7 @@
 <translation id="2113068765175018713">הגבלת משך פעילות המכשיר באמצעות אתחול אוטומטי</translation>
 <translation id="2127599828444728326">אפשר התראות באתרים אלה</translation>
 <translation id="2131902621292742709">השהיה של עמעום מסך בעת השימוש בסוללה</translation>
+<translation id="2134437727173969994">אפשר את נעילת המסך</translation>
 <translation id="2137064848866899664">הפעלת מדיניות זו גורמת לסיבוב של כל תצוגה
       לכיוון המוגדר בכל הפעלה מחדש וכן בפעם הראשונה שבה המכשיר מחובר
       אחרי שינוי ערך המדיניות. משתמשים יכולים לשנות את סיבוב התצוגה
@@ -835,6 +840,7 @@
 <translation id="3967075520570946456">הפעל את הצגת דף הפתיחה בהפעלה ראשונה של הדפדפן לאחר שדרוג של מערכת ההפעלה.</translation>
 <translation id="3973371701361892765">לעולם אל תסתיר אוטומטית את המדף</translation>
 <translation id="3984028218719007910">קובעת אם <ph name="PRODUCT_OS_NAME" /> ישמור את נתוני החשבון המקומיים לאחר התנתקות. אם הוגדר כ'אמת', לא יישמרו חשבונות קבועים כלשהם על ידי <ph name="PRODUCT_OS_NAME" /> וכל נתוני ההפעלה של המשתמש יסולקו לאחר התנתקות. אם מדיניות זו מוגדרת כ'שקר' או שאינה מוגדרת, המכשיר יכול לשמור את נתוני המשתמש המקומיים (מוצפנים).</translation>
+<translation id="3997519162482760140">‏כתובות אתרים שיקבלו גישה להתקני צילום וידאו בדפי כניסה מסוג SAML</translation>
 <translation id="4001275826058808087">‏מנהלי IT עבור מכשירים ארגוניים יכולים להשתמש בסימון הזה כדי לקבוע אם לאפשר למשתמשים לממש מבצעים באמצעות הרשמה של מערכת ההפעלה של Chrome.
 
       אם המדיניות הזו מוגדרת כ-true או אינה מוגדרת, משתמשים יוכלו לממש מבצעים באמצעות הרשמה של מערכת ההפעלה של Chrome.
@@ -862,6 +868,9 @@
           כשהמדיניות הזו אינה מוגדרת, נעשה שימוש במשך זמן שנקבע כברירת מחדל.
 
           ערך המדיניות צריך להיות באלפיות שנייה.</translation>
+<translation id="4115096483386877940">אפשר את נעילת המסך.
+
+      אם מדיניות זו מקבלת את הערך 'לא נכון', משתמשים לא יוכלו לנעול את המסך (הפעולה היחידה שתהיה אפשרית היא יציאה מביקור המשתמש). אם ההגדרה הזו מקבלת את הערך 'נכון' או לא מקבלת ערך, משתמשים שיעברו אימות באמצעות סיסמה יוכלו לנעול את המסך.</translation>
 <translation id="4121350739760194865">מנע הצגה של קידומי מכירות של יישומים בדף הכרטיסייה החדשה</translation>
 <translation id="4147054660081653009">‏אישור לקוח להתחברות ל-RemoteAccessHostTokenValidationUrl.
 
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb
index cbdd0b98..97c5b90 100644
--- a/components/policy/resources/policy_templates_ja.xtb
+++ b/components/policy/resources/policy_templates_ja.xtb
@@ -145,6 +145,11 @@
 <translation id="1608755754295374538">ユーザー確認なしで音声キャプチャ デバイスへのアクセスが許可される URL</translation>
 <translation id="1617235075406854669">閲覧とダウンロードの履歴を削除可能にする</translation>
 <translation id="1617384279878333801">プロフィール マネージャでユーザーを追加することを有効にする</translation>
+<translation id="163200210584085447">このリストに指定されているパターンと、リクエスト元 URL の
+      セキュリティ オリジンが照合されます。一致するものが見つかった場合は、
+      動画キャプチャ デバイスへのアクセスが SAML ログインページで許可されます。
+      一致するものが見つからない場合、アクセスは自動的に拒否されます。
+      ワイルドカードのパターンは許可されません。</translation>
 <translation id="1655229863189977773">ディスク キャッシュ サイズをバイト単位で設定する</translation>
 <translation id="166427968280387991">プロキシ サーバー</translation>
 <translation id="1675002386741412210">サポート対象:</translation>
@@ -260,6 +265,7 @@
 <translation id="2113068765175018713">自動再起動を行ってデバイスの稼働時間を制限する</translation>
 <translation id="2127599828444728326">これらのサイトの通知を許可する</translation>
 <translation id="2131902621292742709">画面が暗くなるまでの時間(バッテリー電源での実行時)</translation>
+<translation id="2134437727173969994">画面のロックを許可</translation>
 <translation id="2137064848866899664">このポリシーが設定されている場合、個々のディスプレイは再起動のときに毎回と、ポリシーの値が変更されてから最初に接続が行われるときに、指定方向に回転します。ユーザーはログイン後に設定ページからディスプレイの回転方法を変更することができますが、次に再起動したときにはポリシーの値が再適用されます。
 
       このポリシーは、メインのディスプレイと予備のディスプレイすべてに適用されます。
@@ -836,6 +842,7 @@
 <translation id="3967075520570946456">OS アップグレード後に初めてブラウザを起動したときのウェルカム ページの表示を有効にします。</translation>
 <translation id="3973371701361892765">シェルフを自動的に非表示にしない</translation>
 <translation id="3984028218719007910">ログアウト後に <ph name="PRODUCT_OS_NAME" /> がローカル アカウントのデータを保持するかどうかを指定します。true に設定した場合、<ph name="PRODUCT_OS_NAME" /> は永続的アカウントを保持していないため、ユーザー セッションのすべてのデータがログアウト後に破棄されます。このポリシーを false に設定した場合または未設定の場合、端末は(暗号化された)ローカル ユーザー データを保持できます。</translation>
+<translation id="3997519162482760140">SAML ログインページで動画キャプチャ デバイスへのアクセスを許可する URL</translation>
 <translation id="4001275826058808087">企業向けデバイスの IT 管理者はこのフラグを使用して、Chrome OS の登録特典の利用をユーザーに許可するかどうかを指定できます。
 
       このポリシーを true に設定した場合または未設定の場合、ユーザーは Chrome OS の登録特典を利用できます。
@@ -861,6 +868,9 @@
           このポリシーを設定しないと、デフォルトの時間が使用されます。
 
           ポリシーの値はミリ秒単位で指定してください。</translation>
+<translation id="4115096483386877940">画面のロックを許可します。
+
+      このポリシーが false に設定されている場合、ユーザーは画面をロックできません(ユーザー セッションからのログアウトのみ可能です)。この設定が true または設定されていない場合、パスワードで認証されたユーザーは画面をロックできます。</translation>
 <translation id="4121350739760194865">アプリのプロモーションが新しいタブ ページに表示されないようにする</translation>
 <translation id="4147054660081653009">RemoteAccessHostTokenValidationUrl に接続するためのクライアント証明書です。
 
diff --git a/components/policy/resources/policy_templates_kn.xtb b/components/policy/resources/policy_templates_kn.xtb
index d3ea3ed..f41753b 100644
--- a/components/policy/resources/policy_templates_kn.xtb
+++ b/components/policy/resources/policy_templates_kn.xtb
@@ -134,6 +134,11 @@
 <translation id="1608755754295374538">ಪ್ರಾಂಪ್ಟ್ ಇಲ್ಲದೆಯೇ ಆಡಿಯೊ ಸೆರೆಹಿಡಿಯುವಿಕೆ ಸಾಧನಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಪೂರೈಸುವಂತಹ URL ಗಳು</translation>
 <translation id="1617235075406854669">ಬ್ರೌಸರ್ ಅನ್ನು ಅಳಿಸುವುದನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ ಮತ್ತು ಇತಿಹಾಸವನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ</translation>
 <translation id="1617384279878333801">ಪ್ರೊಫೈಲ್ ಮ್ಯಾನೇಜರ್‌ನಲ್ಲಿ ವ್ಯಕ್ತಿ ಸೇರಿಸು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
+<translation id="163200210584085447">ಈ ಪಟ್ಟಿಯಲ್ಲಿರುವ ಪ್ಯಾಟರ್ನ್‌ಗಳು ವಿನಂತಿಸುತ್ತಿರುವ URL ನ ಸುರಕ್ಷತೆ ಮೂಲದ ವಿರುದ್ಧವಾಗಿ
+      ಹೊಂದಾಣಿಕೆ ಮಾಡಲಾಗುತ್ತದೆ. ಹೊಂದಾಣಿಕೆ ಕಂಡುಬಂದರೆ, SAML ಲಾಗ್‌ಇನ್ ಪುಟಗಳಲ್ಲಿ
+      ವೀಡಿಯೊ ಸೆರೆಹಿಡಿಯುವಿಕೆ ಸಾಧನಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸಲಾಗುತ್ತದೆ. ಯಾವುದೇ ಹೊಂದಾಣಿಕೆ
+      ಕಂಡುಬರದಿದ್ದರೆ, ಪ್ರವೇಶವನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿರಾಕರಿಸಲಾಗುವುದು. ವೈಲ್ಡ್‌ಕಾರ್ಡ್ ಪ್ಯಾಟರ್ನ್‌ಗಳನ್ನು
+      ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ.</translation>
 <translation id="1655229863189977773">ಡಿಸ್ಕ್ ಸಂಗ್ರಹ ಗಾತ್ರವನ್ನು ಬೈಟ್‌ಗಳಲ್ಲಿ ಹೊಂದಿಸಿ</translation>
 <translation id="166427968280387991">ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್</translation>
 <translation id="1675002386741412210">ಇದನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ:</translation>
@@ -245,6 +250,7 @@
 <translation id="2113068765175018713">ಸ್ವಯಂಚಾಲಿತವಾಗಿ ರೀಬೂಟ್ ಮಾಡುವ ಮೂಲಕ ಸಾಧನದ ಮುಕ್ತಾಯ ಅವಧಿಯನ್ನು ಮಿತಿಗೊಳಿಸಿ</translation>
 <translation id="2127599828444728326">ಈ ಸೈಟ್‌ಗಳಲ್ಲಿ ಅಧಿಸೂಚನೆಗಳನ್ನು ಅನುಮತಿಸಿ</translation>
 <translation id="2131902621292742709">ಬ್ಯಾಟರಿ ಪವರ್‌ನಲ್ಲಿ ರನ್‌ ಆಗುತ್ತಿರುವಾಗ ಪರದೆ ಮಂದವಾಗುವಿಕೆ ವಿಳಂಬವಾಗುತ್ತದೆ</translation>
+<translation id="2134437727173969994">ಪರದೆ ಲಾಕ್‌ ಮಾಡುವಿಕೆಯನ್ನು ಅನುಮತಿಸಿ</translation>
 <translation id="2137064848866899664">ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸಿದಲ್ಲಿ, ಪ್ರತಿ ಮರುಬೂಟ್‌ನಲ್ಲಿ ಮತ್ತು ನೀತಿಯ ಮೌಲ್ಯವನ್ನು ಬದಲಾಯಿಸಿದ ನಂತರ ಅದನ್ನು ಮೊದಲ ಬಾರಿ ಸಂಪರ್ಕಪಡಿಸಿದಾಗ ಪ್ರತಿ ಪ್ರದರ್ಶನವನ್ನು ನಿರ್ದಿಷ್ಟ ಓರಿಯಂಟೇಶನ್‌ಗೆ ತಿರುಗಿಸಲಾಗುತ್ತದೆ. ಲಾಗ್ ಇನ್ ಮಾಡಿದ ನಂತರ ಸೆಟ್ಟಿಂಗ್‌ಗಳ ಮೂಲಕ ಪ್ರದರ್ಶನ ತಿರುಗಿಸುವಿಕೆಯನ್ನು ಬಳಕೆದಾರರು ಬದಲಾಯಿಸಬಹುದು. ಆದರೆ ಅವರ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಮುಂದಿನ ಮರುಬೂಟ್‌ನಲ್ಲಿ ನೀತಿ ಮೌಲ್ಯದಿಂದ ಅತಿಕ್ರಮಿಸಲಾಗುತ್ತದೆ.
 
 ಈ ನೀತಿಯು ಪ್ರಾಥಮಿಕ ಮತ್ತು ಎಲ್ಲಾ ದ್ವಿತೀಯ ಪ್ರದರ್ಶನಗಳಿಗೆ ಅನ್ವಯಿಸುತ್ತದೆ.
@@ -820,6 +826,7 @@
 <translation id="3967075520570946456">OS ಅಪ್‌ಗ್ರೇಡ್ ನಂತರ ಮೊದಲ ಬಾರಿಗೆ ಬ್ರೌಸರ್ ಪ್ರಾರಂಭಗೊಳ್ಳುವ ಸಮಯದಲ್ಲಿ ಸ್ವಾಗತ ಪುಟ ತೋರಿಸಲ್ಪಡುವುದನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation>
 <translation id="3973371701361892765">ಶೆಲ್ಫ್ ಅನ್ನು ಎಂದಿಗೂ ಸ್ವಯಂ-ಮರೆಮಾಡಬೇಡಿ</translation>
 <translation id="3984028218719007910">ಲಾಗ್ಔಟ್ ಆದ ನಂತರ ಸ್ಥಳೀಯ ಖಾತೆ ಡೇಟಾವನ್ನು <ph name="PRODUCT_OS_NAME" /> ಇರಿಸುತ್ತದೆಯೇ ಎಂಬುದನ್ನು ನಿರ್ಧರಿಸುತ್ತದೆ. 'ನಿಜ' ಎಂದು ಹೊಂದಿಸಿದರೆ, ಶಾಶ್ವತ ಖಾತೆಗಳು <ph name="PRODUCT_OS_NAME" /> ನಿಂದ ಇರಿಸಲಾಗುವುದಿಲ್ಲ ಮತ್ತು ಲಾಗ್‍ಔಟ್‌ನ ನಂತರ ಬಳಕೆದಾರ ಸೆಶನ್‌ನಿಂದ ಎಲ್ಲಾ ಡೇಟಾವನ್ನು ತಿರಸ್ಕರಿಸಲಾಗುವುದು. ಈ ನೀತಿಯನ್ನು 'ತಪ್ಪು' ಎಂದು ಹೊಂದಿಸಿದರೆ ಅಥವಾ ಕಾನ್ಫಿಗರ್ ಮಾಡದಿದ್ದರೆ, ಸಾಧನವು (ಎನ್‌ಕ್ರಿಪ್ಟ್ ಮಾಡಲಾದ) ಸ್ಥಳೀಯ ಬಳಕೆದಾರ ಡೇಟಾವನ್ನು ಇರಿಸುತ್ತದೆ.</translation>
+<translation id="3997519162482760140">SAML ಲಾಗಿನ್‌ ಪುಟಗಳಲ್ಲಿ ವೀಡಿಯೊ ಸರೆಹಿಡಿಯುವಿಕೆ ಸಾಧನಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಪೂರೈಸುವಂತಹ URL ಗಳು</translation>
 <translation id="4001275826058808087">Chrome OS ನೋಂದಣೆಯ ಮೂಲಕ ಕೊಡುಗೆಗಳನ್ನು ಮರುಪಡೆದುಕೊಳ್ಳಲು ಬಳಕೆದಾರರನ್ನು ಅನುಮತಿಸಬೇಕೆ ಬೇಡವೇ ಎಂಬುದನ್ನು ನಿಯಂತ್ರಿಸಲು ಎಂಟರ್‌ಪ್ರೈಸ್ ಸಾಧನಗಳಿಗಾಗಿ IT ನಿರ್ವಹಣೆಗಳು ಈ ಫ್ಲ್ಯಾಗ್ ಬಳಸಬಹುದು.
 
       ಈ ನೀತಿಯನ್ನು ಸರಿ ಎಂದು ಹೊಂದಿಸಿದರೆ ಅಥವಾ ಹೊಂದಿಸದೆ ಬಿಟ್ಟರೆ, Chrome OS ನೋಂದಣಿ ಮೂಲಕ ಬಳಕೆದಾರರಿಗೆ ಕೊಡುಗೆಗಳನ್ನು ಪಡೆದುಕೊಳ್ಳಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ. 
@@ -850,6 +857,9 @@
     ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದಿದ್ದಲ್ಲಿ, ಸಮಯದ ಡೀಫಾಲ್ಟ್ ಅಳತೆಯನ್ನು ಬಳಸಲಾಗುತ್ತದೆ. 
   
     ನೀತಿ ಮೌಲ್ಯವನ್ನು ಮಿಲಿಸೆಕೆಂಡುಗಳಲ್ಲಿ ನಿರ್ದಿಷ್ಟಪಡಿಸಬೇಕು.</translation>
+<translation id="4115096483386877940">ಪರದೆ ಲಾಕ್‌ ಮಾಡುವಿಕೆಯನ್ನು ಅನುಮತಿಸಿ.
+
+      ಈ ನೀತಿಯನ್ನು ತಪ್ಪು ಎಂದು ಹೊಂದಿಸಿದ್ದರೆ, ಬಳಕೆದಾರರು ಪರದೆಯನ್ನು ಲಾಕ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ (ಬಳಕೆದಾರ ಸೆಶನ್‌ನಿಂದ ಸೈನ್ ಔಟ್ ಮಾಡಲು ಮಾತ್ರ ಸಾಧ್ಯವಾಗುತ್ತದೆ). ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಸರಿ ಎಂಬುದಕ್ಕೆ ಹೊಂದಿಸಿದ್ದರೆ ಅಥವಾ ಹೊಂದಿಸದಿದ್ದರೆ, ಪಾಸ್‌ವರ್ಡ್‌ನೊಂದಿಗೆ ದೃಢೀಕರಿಸಿದ ಬಳಕೆದಾರರು ಪರದೆ ಲಾಕ್ ಮಾಡಬಹುದು.</translation>
 <translation id="4121350739760194865">ಹೊಸ ಟ್ಯಾಬ್ ಪುಟದಲ್ಲಿ ಅಪ್ಲಿಕೇಶನ್ ಪ್ರಚಾರಗಳನ್ನು ತಡೆಗಟ್ಟುತ್ತದೆ</translation>
 <translation id="4147054660081653009">RemoteAccessHostTokenValidationUrl ಗೆ ಸಂಪರ್ಕಪಡಿಸಲು ಕ್ಲೈಂಟ್ ಪ್ರಮಾಣಪತ್ರ.
 
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb
index 4a9ff61..79dced5 100644
--- a/components/policy/resources/policy_templates_ko.xtb
+++ b/components/policy/resources/policy_templates_ko.xtb
@@ -154,6 +154,11 @@
 <translation id="1608755754295374538">별도 메시지를 표시하지 않고 오디오 캡처 기기에 대한 액세스 권한이 부여되는 URL입니다.</translation>
 <translation id="1617235075406854669">브라우저 및 다운로드 기록을 삭제하도록 설정합니다.</translation>
 <translation id="1617384279878333801">프로필 관리자에서 사용자 추가 사용 설정</translation>
+<translation id="163200210584085447">이 목록의 패턴을 요청 URL의 보안 출처와 비교합니다.
+      일치하는 항목이 확인되는 경우 SAML 로그인 페이지에서
+      동영상 캡처 기기에 액세스할 수 있는 권한이 부여됩니다.
+      일치하는 항목이 확인되지 않는 경우 액세스가 자동으로 거부됩니다.
+      와일드 카드 패턴은 허용되지 않습니다.</translation>
 <translation id="1655229863189977773">디스크 캐시 크기 설정(바이트)</translation>
 <translation id="166427968280387991">프록시 서버</translation>
 <translation id="1675002386741412210">지원:</translation>
@@ -275,6 +280,7 @@
 <translation id="2113068765175018713">자동으로 재부팅하여 기기 가동 시간 제한</translation>
 <translation id="2127599828444728326">이 사이트에서 알림 허용</translation>
 <translation id="2131902621292742709">배터리 전원으로 실행할 때 화면 어둡게 하기 지연</translation>
+<translation id="2134437727173969994">화면 잠금 허용</translation>
 <translation id="2137064848866899664">이 정책이 설정되면 각 디스플레이는
       재부팅될 때마다, 그리고 정책 값이 변경된 후
       처음으로 연결될 때 지정된 방향으로 회전됩니다. 사용자는 로그인한 뒤
@@ -897,6 +903,7 @@
 <translation id="3967075520570946456">OS 업그레이드 후 처음 브라우저를 실행하면 시작 페이지가 표시되도록 합니다.</translation>
 <translation id="3973371701361892765">실행기를 자동으로 숨기지 않음</translation>
 <translation id="3984028218719007910"><ph name="PRODUCT_OS_NAME" />이(가) 로그아웃 뒤에 로컬 계정 데이터를 유지할 지를 결정합니다. true로 설정하면, <ph name="PRODUCT_OS_NAME" />이(가) 유지하는 영구 계정이 없으며 사용자 세션의 모든 데이터가 로그아웃 뒤에 삭제됩니다. 이 정책이 false로 설정되거나 구성되지 않으면 기기는 암호화된 로컬 사용자 데이터를 유지합니다.</translation>
+<translation id="3997519162482760140">SAML 로그인 페이지에서 동영상 캡처 기기에 액세스할 수 있는 권한이 부여되는 URL입니다.</translation>
 <translation id="4001275826058808087">기업 기기를 담당하는 IT 관리자는 이 플래그를 사용하여 사용자가 Chrome OS 등록을 통해 쿠폰을 사용하도록 할지 여부를 제어할 수 있습니다.
 
       이 정책이 true로 설정되어 있거나 설정되어 있지 않으면 사용자는 Chrome OS 등록을 통해 쿠폰을 사용할 수 있습니다.
@@ -930,6 +937,9 @@
           이 정책이 설정되어 있지 않으면 기본 설정된 시간이 적용됩니다.
 
           정책 값은 밀리초 단위로 지정되어야 합니다.</translation>
+<translation id="4115096483386877940">화면 잠금을 허용합니다.
+
+      이 정책을 false로 설정하면 사용자가 화면을 잠글 수 없습니다(사용자 세션에서 로그아웃만 가능). 이 설정이 true로 설정되거나 설정되지 않으면 비밀번호로 인증받은 사용자는 화면을 잠글 수 있습니다.</translation>
 <translation id="4121350739760194865">앱 프로모션이 새 탭 페이지에 표시되지 않도록 합니다.</translation>
 <translation id="4147054660081653009">RemoteAccessHostTokenValidationUrl에 연결하기 위한 클라이언트 인증서입니다.
 
diff --git a/components/policy/resources/policy_templates_lt.xtb b/components/policy/resources/policy_templates_lt.xtb
index b26aeb2..5c7d192 100644
--- a/components/policy/resources/policy_templates_lt.xtb
+++ b/components/policy/resources/policy_templates_lt.xtb
@@ -154,6 +154,11 @@
 <translation id="1608755754295374538">URL, kuriems bus suteikta prieiga prie garso užfiksavimo įrenginių be paraginimo</translation>
 <translation id="1617235075406854669">Įgalinti naršyklės ištrynimą ir atsisiuntimo istoriją</translation>
 <translation id="1617384279878333801">Asmens pridėjimo profilių tvarkymo priemonėje įgalinimas</translation>
+<translation id="163200210584085447">Šiame sąraše pateikti šablonai bus atitaikomi
+      pagal užklausą pateikiančio URL saugos kilmę. Jei bus rasta atitiktis, prieiga prie vaizdo įrašus
+      fiksuojančių įrenginių bus suteikta SAML prisijungimo puslapiuose. Neradus atitikties,
+      prieiga bus automatiškai uždrausta. Pakaitos simbolių šablonai
+      neleidžiami.</translation>
 <translation id="1655229863189977773">Nustatyti disko talpyklos dydį baitais</translation>
 <translation id="166427968280387991">Tarpinis serveris</translation>
 <translation id="1675002386741412210">Palaikoma naudojant:</translation>
@@ -275,6 +280,7 @@
 <translation id="2113068765175018713">Apriboti įrenginio veiksenos laiką automatiškai įkeliant operacinę sistemą iš naujo</translation>
 <translation id="2127599828444728326">Leisti pranešimus šiose svetainėse</translation>
 <translation id="2131902621292742709">Ekrano pritemdymo delsa, kai naudojama akumuliatoriaus energija</translation>
+<translation id="2134437727173969994">Leidimas užrakinti ekraną</translation>
 <translation id="2137064848866899664">Jei ši politika nustatyta, kiekvienas ekranas pasukamas
       nurodyta kryptimi kiekvieną kartą paleidus įrenginį iš naujo ir pirmą kartą
       jį prijungus po politikos pasikeitimo. Naudotojai gali prisijungti ir keisti ekrano
@@ -906,6 +912,7 @@
 <translation id="3967075520570946456">Įgalinkite darbo pradžios puslapio rodymą pirmą kartą paleidus naršyklę po OS naujovinimo.</translation>
 <translation id="3973371701361892765">Niekada automatiškai neslėpti lentynos</translation>
 <translation id="3984028218719007910">Nustatoma, ar „<ph name="PRODUCT_OS_NAME" />“ paliekami vietiniai paskyros duomenys atsijungus. Jei nustatyta į „true“ (tiesa), jokios nuolatinės paskyros nelaikomos „<ph name="PRODUCT_OS_NAME" />“ ir visi duomenys iš naudotojo sesijos atmetami atsijungus. Jei ši politika nustatyta į „false“ (netiesa) arba nesukonfigūruota, įrenginyje gali būti laikomi (šifruoti) vietiniai naudotojo duomenys.</translation>
+<translation id="3997519162482760140">URL, kuriems bus suteikta prieiga prie vaizdo įrašus fiksuojančių įrenginių SAML prisijungimo puslapiuose</translation>
 <translation id="4001275826058808087">Įmonės įrenginių IT administratoriai gali naudoti šią žymą, kad valdytų, ar leisti naudotojams išpirkti pasiūlymus vykdant „Chrome“ OS registraciją.
 
       Jei ši politika galioja arba nėra nustatyta, naudotojai galės išpirkti pasiūlymus vykdydami „Chrome“ OS registraciją.
@@ -939,6 +946,9 @@
           Kai ši politika nenustatyta, naudojama numatytoji laiko trukmė.
 
           Politikos vertė turėtų būti nurodyta milisekundėmis.</translation>
+<translation id="4115096483386877940">Leidimas užrakinti ekraną.
+
+      Jei ši politika nustatyta kaip „false“, naudotojai negalės užrakinti ekrano (bus galima tik atsijungti nuo naudotojo seanso). Jei nustatymas nustatytas kaip „true“ arba nenustatytas, ekraną galės užrakinti naudotojai, autentifikuoti naudojant slaptažodį.</translation>
 <translation id="4121350739760194865">Neleisti rodyti programų reklamų naujo skirtuko puslapyje</translation>
 <translation id="4147054660081653009">Kliento sertifikatas, skirtas prisijungti prie „RemoteAccessHostTokenValidationUrl“.
 
diff --git a/components/policy/resources/policy_templates_ml.xtb b/components/policy/resources/policy_templates_ml.xtb
index 8e5cf13..194bebf5 100644
--- a/components/policy/resources/policy_templates_ml.xtb
+++ b/components/policy/resources/policy_templates_ml.xtb
@@ -152,6 +152,11 @@
 <translation id="1608755754295374538">ആവശ്യപ്പെടാതെ തന്നെ ഓഡിയോ ക്യാപ്‌ചർ ഉപകരണങ്ങളിലേക്ക് ആക്‌സസ്സ് ലഭിക്കുന്ന URL-കൾ</translation>
 <translation id="1617235075406854669">ബ്രൗസർ, ഡൗൺലോഡ് ചരിത്രം എന്നിവ ഇല്ലാതാക്കുന്നത് പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="1617384279878333801">പ്രൊഫൈൽ മാനേജറിൽ വ്യക്തിയേ ചേർക്കുന്നത്  പ്രവർത്തനക്ഷമമാക്കുക</translation>
+<translation id="163200210584085447">ഈ ലിസ്റ്റിലെ പാറ്റേണുകൾ, അഭ്യർത്ഥിക്കുന്ന URL-ന്റെ
+      സുരക്ഷാ ഉറവിടവുമായി യോജിക്കുന്നതായിരിക്കും.  യോജിക്കുന്ന ഒരെണ്ണം
+      കണ്ടെത്തിയാൽ, SAML ലോഗിൻ പേജുകളിൽ വീഡിയോ ക്യാപ്ച്ചർ
+      ഉപകരണങ്ങളിലേക്കുള്ള ആക്‌സസ്സ് അനുവദിക്കും.  യോജിക്കുന്നതൊന്നും
+      കണ്ടെത്തിയില്ലെങ്കിൽ ആക്‌സസ്സ് സ്വയം നിരസിക്കപ്പെടും.  വൈൽഡ്‌കാർഡ് പാറ്റേണുകൾ അനുവദനീയമല്ല.</translation>
 <translation id="1655229863189977773">ഡിസ്‌ക് കാഷെ വലുപ്പം ബൈറ്റുകളിൽ സജ്ജമാക്കുക</translation>
 <translation id="166427968280387991">പ്രോക്സി സെര്‍വര്‍</translation>
 <translation id="1675002386741412210">ഇനി പറയുന്നതില്‍ പിന്തുണയ്ക്കുന്നു:</translation>
@@ -275,6 +280,7 @@
 <translation id="2113068765175018713">യാന്ത്രികമായി റീബൂട്ടുചെയ്‌ത് ഉപകരണ പ്രവർത്തനസമയം നിയന്ത്രിക്കുക</translation>
 <translation id="2127599828444728326">ഈ സൈറ്റുകളില്‍ അറിയിപ്പുകളെ അനുവദിക്കുക</translation>
 <translation id="2131902621292742709">ബാറ്ററി പവറിൽ പ്രവർത്തിക്കുമ്പോൾ സ്‌ക്രീൻ തെളിച്ചം കുറയുന്നതിന്റെ കാലതാമസം</translation>
+<translation id="2134437727173969994">സ്‌ക്രീൻ ലോക്കുചെയ്യൽ അനുവദിക്കുക</translation>
 <translation id="2137064848866899664">ഈ നയം സജ്ജമാക്കിയെങ്കിൽ, നയത്തിന്റെ മൂല്യം
       മാറിയതിനുശേഷവും ഓരോ തവണ റീബൂട്ട് ചെയ്യുമ്പോഴും ഇത് ആദ്യമായി
       കണക്‌റ്റുചെയ്യുമ്പോൾ നിർദ്ദിഷ്‌ട ഓറിയന്റേഷനിലേക്ക് ഓരോ ഡിസ്‌പ്ലേയും
@@ -905,6 +911,7 @@
 <translation id="3967075520570946456">OS അപ്‌ഗ്രേഡിനെ തുടർന്നുള്ള ആദ്യ ബ്രൗസർ സമാരംഭിക്കലിൽ സ്വാഗത പേജ് കാണിക്കുന്നത് പ്രവർത്തനക്ഷമമാക്കുക.</translation>
 <translation id="3973371701361892765">ഷെൽഫ് ഒരിക്കലും യാന്ത്രികമായി മറയ്‌ക്കരുത്</translation>
 <translation id="3984028218719007910">ലോഗ്ഔട്ടിന് ശേഷം പ്രാദേശിക അക്കൗണ്ട് ഡാറ്റയെ <ph name="PRODUCT_OS_NAME" /> സൂക്ഷിക്കണോ എന്നത് നിർണ്ണയിക്കുന്നു. ട്രൂ എന്നായി സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, നിലനിൽക്കുന്ന അക്കൗണ്ടുകളൊന്നും <ph name="PRODUCT_OS_NAME" /> സൂക്ഷിക്കില്ല കൂടാതെ ലോഗ്ഔട്ടിന് ശേഷം ഉപയോക്തൃ സെഷനിൽ നിന്നുള്ള എല്ലാ ഡാറ്റയും നിരസിക്കപ്പെടുകയും ചെയ്യും. ഈ നയം ഫാൾസ് എന്നായി സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിലോ കോൺഫിഗർ ചെയ്‌തിട്ടില്ലെങ്കിലോ, ഉപകരണം പ്രാദേശിക ഉപയോക്തൃ ഡാറ്റ സൂക്ഷിച്ചേക്കാം (എൻക്രിപ്റ്റുചെയ്‌തത്).</translation>
+<translation id="3997519162482760140">SAML ലോഗിൻ പേജുകളിലെ വീഡിയോ ക്യാപ്‌ച്ചർ ഉപകരണങ്ങളിലേക്ക് ആക്‌സസ്സ് ലഭിക്കുന്ന URL-കൾ</translation>
 <translation id="4001275826058808087">Chrome OS രജിസ്‌ട്രേഷൻ മുഖേന ഓഫറുകൾ വീണ്ടെടുക്കാൻ ഉപയോക്താക്കളെ അനുവദിക്കണോയെന്നത് നിയന്ത്രിക്കാൻ എന്റർപ്രൈസ് ഉപകരണങ്ങൾക്കായുള്ള IT അഡ്‌മിനുകൾക്ക് ഈ ഫ്ലാഗ് ഉപയോഗിക്കാനാകും.
 
       ഈ നയം true ആയി സജ്ജീകരിക്കുകയോ സജ്ജീകരിക്കാതെ വിടുകയോ ചെയ്‌തിട്ടുണ്ടെങ്കിൽ, ഉപയോക്താക്കൾക്ക് Chrome OS രജിസ്‌ട്രേഷനിലൂടെ ഓഫറുകൾ വീണ്ടെടുക്കാനാകും.
@@ -938,6 +945,9 @@
           ഈ നയം സജ്ജീകരിക്കാതിരിക്കുമ്പോൾ, ഒരു സ്ഥിര സമയ ദൈർഘ്യം ഉപയോഗിക്കുന്നു.
 
           നയ മൂല്യം മില്ലിസെക്കൻഡിൽ വ്യക്തമാക്കണം.</translation>
+<translation id="4115096483386877940">സ്‌ക്രീൻ ലോക്കുചെയ്യൽ അനുവദിക്കുക.
+
+      ഈ നയം തെറ്റാണെന്ന് സജ്ജമാക്കിയിരിക്കുന്നെങ്കിൽ, ഉപയോക്താക്കൾക്ക് സ്‌ക്രീൻ ലോക്കുചെയ്യാൻ കഴിയില്ല (ഉപയോക്തൃ സെഷനിൽ നിന്ന് സൈൻ ഔട്ട് ചെയ്യാൻ മാത്രമേ കഴിയൂ). ഈ ക്രമീകരണം ശരിയാണെന്ന് സജ്ജമാക്കിയിരിക്കുകയോ സജ്ജമാക്കാതെ വിടുകയോ ചെയ്‌തിരിക്കുന്നെങ്കിൽ, ഒരു പാസ്‌വേഡ് ഉപയോഗിച്ച് വിശ്വാസ്യത ഉറപ്പാക്കിയ ഉപയോക്താക്കൾക്കേ സ്‌ക്രീൻ ലോക്കുചെയ്യാൻ കഴിയൂ.</translation>
 <translation id="4121350739760194865">പുതിയ ടാബ് പേജിൽ ദൃശ്യമാകുന്നതിൽ നിന്നും അപ്ലിക്കേഷൻ പ്രൊമോഷനുകളെ തടയുക</translation>
 <translation id="4147054660081653009">RemoteAccessHostTokenValidationUrl എന്നതിലേക്ക് കണക്റ്റുചെയ്യാനുള്ള ക്ലയന്റ് സർട്ടിഫിക്കറ്റ്.
 
diff --git a/components/policy/resources/policy_templates_mr.xtb b/components/policy/resources/policy_templates_mr.xtb
index 5d1556a5..2e7a213 100644
--- a/components/policy/resources/policy_templates_mr.xtb
+++ b/components/policy/resources/policy_templates_mr.xtb
@@ -145,6 +145,8 @@
 <translation id="1608755754295374538">सूचनेशिवाय ऑडिओ कॅप्चर डिव्हाइसेसवर प्रवेश मंजूर करणार असलेल्या URL</translation>
 <translation id="1617235075406854669">ब्राउझर आणि डाउनलोड इतिहास हटविणे सक्षम करा</translation>
 <translation id="1617384279878333801">प्रोफाईल व्‍यवस्‍थापकामध्ये व्यक्ती जोडा सक्षम करा</translation>
+<translation id="163200210584085447">या सूचीमधील नमुने विनंती करणार्‍या URLच्या मूळ सुरक्षिततेशी जुळवले जातील.  जुळणी आढळल्यास, 
+SAML लॉगिन पृष्ठावर व्हिडिओ कॅप्चर डिव्हाइसेसवर प्रवेश करणे मंजूर केले जाईल. जुळणी न आढळल्यास, प्रवेश स्वयंचलितपणे नाकारला जाईल. वाइल्डकार्ड नमुन्यांना अनुमती नाही.</translation>
 <translation id="1655229863189977773">डिस्क कॅशे आकार बाइटमध्‍ये सेट करा</translation>
 <translation id="166427968280387991">प्रॉक्सी सर्व्हर</translation>
 <translation id="1675002386741412210">यावर समर्थित:</translation>
@@ -263,6 +265,7 @@
 <translation id="2113068765175018713">स्वयंचलितपणे रीबूट करून डिव्हाइस चालू असण्याच्या वेळेवर मर्यादा घाला</translation>
 <translation id="2127599828444728326">या साइटवरील अधिसूचनांना परवानगी द्या</translation>
 <translation id="2131902621292742709">बॅटरी उर्जेवर चालताना स्क्रीन अंधुक विलंब</translation>
+<translation id="2134437727173969994">स्क्रीन लॉक करण्याची परवानगी</translation>
 <translation id="2137064848866899664">हे धोरण सेट केलेले असल्यास, प्रत्येक प्रदर्शन हे
       प्रत्येक रीबूट केल्यानंतर आणि धोरण मूल्य बदलल्‍यानंतर प्रथम वेळी कनेक्ट
       केले जाते तेव्‍हा निर्दिष्‍ट केलेल्या अभिमुखतेवर फिरविले जाते. वापरकर्त्यांनी
@@ -888,6 +891,7 @@
 <translation id="3967075520570946456">OS श्रेणीसुधारणेनंतर प्रथम ब्राउझर लाँच केल्‍यावर स्वागत पृष्‍ठ दर्शविणे सक्षम करा.</translation>
 <translation id="3973371701361892765">शेल्फ कधीही स्वयं-लपवू नका</translation>
 <translation id="3984028218719007910">लॉगआउट केल्यानंतर <ph name="PRODUCT_OS_NAME" /> ने स्थानिक खाते डेटा ठेवावा किंवा नाही ते निर्धारित करते. खरे वर सेट केल्यास, <ph name="PRODUCT_OS_NAME" /> कडून कोणतीही सातत्यपूर्ण खाती ठेवली जात नाही आणि वापरकर्ता सत्रातील सर्व डेटा लॉग आऊटनंतर काढून टाकण्यात येतो. हे धोरण चुकीचे वर सेट केले असल्यास किंवा कॉन्फिगर केले नसल्यास, डिव्हाइस स्थानिक वापरकर्ता डेटा (कूटबद्ध केलेला) ठेऊ शकते.</translation>
+<translation id="3997519162482760140">SAML लॉगिन पृष्ठांंवर व्हिडिओ कॅप्चर डिव्हाइसेसवर प्रवेश मंजूर करणार असलेल्या URL</translation>
 <translation id="4001275826058808087">एन्टरप्राइझ डिव्हाइसेससाठी IT प्रशासन Chrome OS नोंदणीद्वारे ऑफरची पूर्तता करण्यासाठी वापरकर्त्यांना अनुमती द्यावी किंवा नाही हे नियंत्रित करण्यासाठी हे ध्वजांकन वापरू शकते.
 
       हे धोरण सत्य वर सेट केले असल्यास किंवा सेट न करता सोडले असल्यास, वापरकर्ते Chrome OS नोंदणीद्वारे ऑफरची पूर्तता करण्यात सक्षम होतील.
@@ -921,6 +925,9 @@
           जेव्हा हे धोरण सेट केलेले नसते, तेव्हा वेळेची डीफॉल्ट लांबी वापरली जाते.
 
           धोरण मूल्य मिलिसेकंदांमध्ये निर्दिष्ट केले जावे.</translation>
+<translation id="4115096483386877940">स्क्रीन लॉक करण्याची परवानगी.
+
+     ही पॉलिसी असत्यावर सेट असल्यास, वापरकर्ते स्क्रीन लॉक करण्‍यास सक्षम राहणार नाही (केवळ वापरकर्ता सत्रावरून साइन आउट करणे शक्य असेल). ही सेटिंग सत्यावर सेट केलेली असल्यास किंवा सेट नसल्यास, संकेतशब्दासह प्रमाणीकृत असलेले वापरकर्ते स्क्रीन लॉक करू शकतात.</translation>
 <translation id="4121350739760194865">अनुप्रयोग जाहिरातींना नवीन टॅब पृष्ठावर दिसण्यापासून प्रतिबंधित करा</translation>
 <translation id="4147054660081653009">RemoteAccessHostTokenValidationUrl ला कनेक्‍ट करण्‍यासाठी क्लायंट प्रमाणपत्र.
 
diff --git a/components/policy/resources/policy_templates_ms.xtb b/components/policy/resources/policy_templates_ms.xtb
index 3471f42..dc0ead90 100644
--- a/components/policy/resources/policy_templates_ms.xtb
+++ b/components/policy/resources/policy_templates_ms.xtb
@@ -154,6 +154,11 @@
 <translation id="1608755754295374538">URL yang akan diberikan akses kepada peranti tangkapan audio tanpa gesaan</translation>
 <translation id="1617235075406854669">Dayakan pemadaman sejarah penyemak imbas dan muat turun</translation>
 <translation id="1617384279878333801">Dayakan tambah orang dalam pengurus profil</translation>
+<translation id="163200210584085447">Corak dalam senarai ini akan dipadankan dengan keselamatan
+      asal URL yang meminta.  Jika padanan ditemui, akses kepada peranti
+      tangkapan video akan diberi pada halaman log masuk SAML.  Jika padanan tidak
+      ditemui, akan akan ditolak secara automatik.  Corak kad bebas tidak
+      dibenarkan.</translation>
 <translation id="1655229863189977773">Tetapkan saiz cache cakera dalam bait</translation>
 <translation id="166427968280387991">Pelayan proksi</translation>
 <translation id="1675002386741412210">Disokong pada:</translation>
@@ -279,6 +284,7 @@
 <translation id="2113068765175018713">Hadkan masa hidup peranti melalui but semula automatik.</translation>
 <translation id="2127599828444728326">Benarkan pemberitahuan pada tapak ini</translation>
 <translation id="2131902621292742709">Kelewatan pemalapan skrin apabila dijalankan dengan kuasa bateri</translation>
+<translation id="2134437727173969994">Benarkan mengunci skrin</translation>
 <translation id="2137064848866899664">Jika dasar ini ditetapkan, setiap paparan diputar kepada
       orientasi yang ditetapkan pada setiap but semula dan pada kali pertama
       disambungkan selepas nilai dasar diubah. Pengguna boleh menukar
@@ -906,6 +912,7 @@
 <translation id="3967075520570946456">Dayakan pemaparan halaman aluan semasa pelancaran penyemak imbas yang pertama sesudah peningkatan OS.</translation>
 <translation id="3973371701361892765">Jangan sekali-kali sembunyikan rak secara automatik</translation>
 <translation id="3984028218719007910">Memastikan sama ada <ph name="PRODUCT_OS_NAME" /> menyimpan data akaun setempat selepas log keluar. Jika ditetapkan kepada benar, tiada akaun berulang akan disimpan oleh <ph name="PRODUCT_OS_NAME" /> dan semua data dari sesi pengguna akan dibuang selepas log keluar. Jika dasar ini ditetapkan kepada palsu atau tidak dikonfigurasi, peranti boleh menyimpan data pengguna setempat (disulitkan).</translation>
+<translation id="3997519162482760140">URL yang akan diberikan akses kepada peranti tangkapan video pada halaman log masuk SAML</translation>
 <translation id="4001275826058808087">Pentadbir IT untuk peranti perusahaan boleh menggunakan bendera ini untuk mengawal sama ada membenarkan pengguna menebus tawaran melalui Pendaftaran OS Chrome.
 
       Jika dasar ini ditetapkan kepada benar atau dibiarkan tanpa ditetapkan, pengguna dapat menebus tawaran melalui Pendaftaran OS Chrome.
@@ -939,6 +946,9 @@
           Apabila dasar ini tidak ditetapkan, panjang masa lalai digunakan.
 
           Nilai dasar harus dinyatakan dalam milisaat.</translation>
+<translation id="4115096483386877940">Benarkan mengunci skrin.
+
+      Jika dasar ini ditetapkan kepada palsu, pengguna tidak akan dapat mengunci skrin (hanya boleh mengelog keluar daripada sesi pengguna). Jika tetapan ini ditetapkan kepada benar atau tidak ditetapkan, pengguna yang mengesahkan menggunakan kata laluan boleh mengunci skrin.</translation>
 <translation id="4121350739760194865">Elakkan promosi apl daripada muncul pada halaman tab baharu</translation>
 <translation id="4147054660081653009">Sijil pelanggan untuk bersambung ke RemoteAccessHostTokenValidationUrl.
 
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb
index 61e17ed..19582c4 100644
--- a/components/policy/resources/policy_templates_nl.xtb
+++ b/components/policy/resources/policy_templates_nl.xtb
@@ -145,6 +145,12 @@
 <translation id="1608755754295374538">URL's die zonder prompt toegang krijgen tot apparaten voor het vastleggen van audio</translation>
 <translation id="1617235075406854669">Verwijderen van browser- en downloadgeschiedenis inschakelen</translation>
 <translation id="1617384279878333801">'Persoon toevoegen in profielbeheer' toestaan</translation>
+<translation id="163200210584085447">Patronen in deze lijst worden vergeleken met de
+      beveiligingsoorsprong van de aanvragende URL. Als een overeenkomst
+      wordt gevonden, wordt toegang tot apparaten voor het vastleggen van
+      video verleend op SAML-inlogpagina's. Als er geen overeenkomst wordt
+      gevonden, wordt toegang automatisch geweigerd. Patronen met jokertekens
+      zijn niet toegestaan</translation>
 <translation id="1655229863189977773">Grootte van schijfcache in bytes instellen</translation>
 <translation id="166427968280387991">Proxyserver</translation>
 <translation id="1675002386741412210">Ondersteund op:</translation>
@@ -266,6 +272,7 @@
 <translation id="2113068765175018713">Uptime van apparaat beperken door automatisch opnieuw op te starten</translation>
 <translation id="2127599828444728326">Meldingen op deze sites toestaan</translation>
 <translation id="2131902621292742709">Vertraging van dimmen van scherm wanneer op de accu wordt gewerkt</translation>
+<translation id="2134437727173969994">Schermvergrendeling toestaan</translation>
 <translation id="2137064848866899664">Als dit beleid is ingesteld, wordt elke display bij opnieuw opstarten
       gedraaid tot de gespecificeerde stand, plus de eerste keer dat de
       display wordt aangesloten nadat de beleidswaarde is gewijzigd.
@@ -888,6 +895,7 @@
 <translation id="3967075520570946456">Inschakelen dat de welkomstpagina wordt weergegeven bij de eerste keer opstarten van de browser na een upgrade van het besturingssysteem.</translation>
 <translation id="3973371701361892765">Archief nooit automatisch verbergen</translation>
 <translation id="3984028218719007910">Bepaalt of <ph name="PRODUCT_OS_NAME" /> na het afmelden lokale accountgegevens bewaart. Als dit is ingesteld op 'true', bewaart <ph name="PRODUCT_OS_NAME" /> geen bestaande accounts en worden alle gegevens over de gebruikerssessie na het afmelden gewist. Als dit beleid is ingesteld op 'false' of niet is geconfigureerd, bewaart het apparaat mogelijk (gecodeerde) lokale gebruikersgegevens.</translation>
+<translation id="3997519162482760140">URL's die toegang krijgen tot apparaten voor het vastleggen van video op SAML-inlogpagina's</translation>
 <translation id="4001275826058808087">IT-beheerders voor zakelijke apparaten kunnen deze markering gebruiken om te bepalen of gebruikers aanbiedingen kunnen inwisselen via registratie van Chrome OS.
 
       Als dit beleid is ingesteld op 'true' (waar) of niet wordt ingesteld, kunnen gebruikers aanbiedingen inwisselen via registratie van Chrome OS.
@@ -921,6 +929,9 @@
           Als dit beleid niet is ingesteld, wordt een standaardtijdsduur gebruikt.
 
           De beleidswaarde moet in milliseconden worden opgegeven.</translation>
+<translation id="4115096483386877940">Schermvergrendeling toestaan.
+
+      Als dit beleid wordt ingesteld op 'false' (onwaar), kunnen gebruikers het scherm niet vergrendelen (alleen afmelden bij de gebruikerssessie is mogelijk). Als deze instelling wordt ingesteld op 'true' (waar) of niet wordt ingesteld, kunnen gebruikers die verificatie met een wachtwoord hebben uitgevoerd, het scherm vergrendelen.</translation>
 <translation id="4121350739760194865">Voorkomen dat app-promoties worden weergegeven op de pagina 'Nieuw tabblad'</translation>
 <translation id="4147054660081653009">Clientcertificaat voor verbinding met RemoteAccessHostTokenValidationUrl.
 
diff --git a/components/policy/resources/policy_templates_no.xtb b/components/policy/resources/policy_templates_no.xtb
index 0e4977e..e01156b 100644
--- a/components/policy/resources/policy_templates_no.xtb
+++ b/components/policy/resources/policy_templates_no.xtb
@@ -149,6 +149,11 @@
 <translation id="1608755754295374538">Nettadresser som uten forespørsel blir gitt tilgang til enheter med lydopptak</translation>
 <translation id="1617235075406854669">Gjør det mulig å slette nettleser- og nedlastingslogg</translation>
 <translation id="1617384279878333801">Slå på «Legg til person» i profilbehandlingen</translation>
+<translation id="163200210584085447">Mønstrene på denne listen stilles opp mot sikkerhetskilden
+      til nettadressen forespørselen kommer fra. Hvis det finnes samsvar, blir det gitt
+      tilgang til videoopptaksenheter på SAML-påloggingssider. Hvis det ikke blir funnet
+      samsvar, blir tilgangen avvist automatisk. Mønstre med jokertegn er ikke
+      tillatt.</translation>
 <translation id="1655229863189977773">Angi størrelse på diskbuffer i byte</translation>
 <translation id="166427968280387991">Proxytjener</translation>
 <translation id="1675002386741412210">Støttes på:</translation>
@@ -268,6 +273,7 @@
 <translation id="2113068765175018713">Begrens enhetens driftstid ved å bruke automatisk omstart</translation>
 <translation id="2127599828444728326">Tillat varslinger på disse nettstedene</translation>
 <translation id="2131902621292742709">Forsinkelse for nedtonet skjerm når enheten kjører på batteristrøm</translation>
+<translation id="2134437727173969994">Tillat låsing av skjermen</translation>
 <translation id="2137064848866899664">Hvis denne regelen er angitt, roteres alle skjermer til den
       spesifiserte retningen hver gang enheten starter, og første gang den kobles
       til etter at regelverdien er endret. Brukerne kan endre skjermrotasjonen
@@ -547,7 +553,7 @@
 
           Lar deg spesifisere hvilken proxy-tjener som brukes av <ph name="PRODUCT_NAME" />, og hindrer brukerne i å endre innstillingene for proxy-tjenere. ARC-apper kan også bruke denne proxy-tjeneren.
 
-          Hvis du velger at det aldri skal brukes proxy-tjenere og alltid kobles til direkte, ignoreres alle andre alternativer.
+          Hvis du velger å aldri bruke proxy-tjenere og alltid koble til direkte, ignoreres alle andre alternativer.
 
           Hvis du velger at systeminnstillingene for proxy-tjenere skal brukes, eller at proxy-tjenere skal oppdages automatisk, ignoreres alle andre alternativer.
 
@@ -672,7 +678,7 @@
 <translation id="3206731874112238027">Slå av forhåndsvisning av utskrifter (avviklet)</translation>
 <translation id="3208854390109736596">Lar deg spesifisere hvilken proxy-tjener som brukes av <ph name="PRODUCT_NAME" />, og hindrer brukerne i å endre innstillingene for proxy-tjenere. ARC-apper kan også bruke denne proxy-tjeneren.
 
-      Hvis du velger at det aldri skal brukes proxy-tjenere og alltid kobles til direkte, ignoreres alle andre alternativer.
+      Hvis du velger å aldri bruke proxy-tjenere og alltid koble til direkte, ignoreres alle andre alternativer.
 
       Hvis du velger at proxy-tjenere skal oppdages automatisk, ignoreres alle andre alternativer.
 
@@ -870,6 +876,7 @@
 <translation id="3967075520570946456">Slå på visning av velkomstsiden ved den første oppstarten av nettleseren etter at operativsystemet er oppgradert.</translation>
 <translation id="3973371701361892765">Aldri skjul hyllen automatisk</translation>
 <translation id="3984028218719007910">Avgjør om <ph name="PRODUCT_OS_NAME" /> beholder lokal kontodata etter avlogging. Hvis retningslinjen er angitt som Sann, beholdes det ikke noen vedvarende kontoer av <ph name="PRODUCT_OS_NAME" />, og all data fra brukerøkten blir forkastet etter avlogging. Hvis denne retningslinjen er angitt som Usann eller ikke er konfigurert, kan enheten beholde (kryptert) lokal brukerdata.</translation>
+<translation id="3997519162482760140">Nettadresser som gis tilgang til videoopptaksenheter på SAML-påloggingssider</translation>
 <translation id="4001275826058808087">IT-administratorer for bedriftsenheter kan bruke denne markeringen til å kontrollere om brukerne kan innløse tilbud via Chrome OS- registrering.
 
       Hvis denne innstillingen angis som sann eller ikke angis, kan brukere innløse tilbud via Chrome OS-registrering.
@@ -897,6 +904,9 @@
           Når innstillingen ikke er konfigurert, brukes standard tidslengde.
 
           Innstillingsverdien må angis i millisekunder.</translation>
+<translation id="4115096483386877940">Tillat låsing av skjermen.
+
+      Hvis denne regelen settes til false (usann), kan ikke brukerne låse skjermen (det er bare mulig å logge av fra brukerøkten). Hvis denne regelen settes til true (sann) eller ikke angis, kan brukere som har autentisert med et passord, låse skjermen.</translation>
 <translation id="4121350739760194865">Gjør at programkampanjer ikke vises på siden Ny fane</translation>
 <translation id="4147054660081653009">Klientsertifikat for tilkobling til RemoteAccessHostTokenValidationUrl.
 
@@ -1409,7 +1419,7 @@
       Denne retningslinjen påvirker alle typer lagringsmedier, for eksempel USB-flashstasjoner, eksterne harddisker, SD-kort og andre minnekort, optisk lagring osv. Intern lagring påvirkes ikke, så filer du har lastet ned til nedlastingsmappen, er fortsatt tilgjengelige. Google Disk påvirkes heller ikke av denne retningslinjen.
 
       Hvis denne innstillingen er deaktivert eller ikke konfigurert, kan brukere anvende alle typer ekstern lagring som støttes, på enhetene sine.</translation>
-<translation id="6076099373507468537">Definerer listen over USB-enheter som kan kobles fra kjernedriveren, så de kan brukes via chrome.usb API direkte i nettprogrammer. Oppføringene er par av leverandør- og produktkoder som identifiserer spesifikke USB-enheter.
+<translation id="6076099373507468537">Definerer listen over USB-enheter som kan kobles fra kjernedriveren, så de kan brukes via chrome.usb API direkte i nettprogrammer. Oppføringene er parvise leverandør- og produktkoder som identifiserer spesifikke USB-enheter.
 
       Hvis denne regelen ikke er spesifisert, er listen over frakoblingsbare USB-enheter tom.</translation>
 <translation id="6095999036251797924">Angir hvor mye tid som kan gå uten brukeraktivitet før skjermen låses når nettstrøm eller batteri brukes.
@@ -1941,7 +1951,7 @@
       Hvis regelen settes til false (usann), rapporteres ikke øktinformasjonen.
       Hvis den settes til true (sann) eller ikke angis, rapporteres øktinformasjonen.</translation>
 <translation id="7774768074957326919">Bruk systeminnstillingene for mellomtjener</translation>
-<translation id="7775831859772431793">Du kan spesifisere nettadressen til proxytjeneren her.
+<translation id="7775831859772431793">Du kan spesifisere nettadressen til proxy-tjeneren her.
 
           Denne regelen trer bare i kraft hvis du har valgt manuelle innstillinger for proxy-tjenere under «Velg hvordan innstillinger for proxy-tjener angis».
 
@@ -2359,7 +2369,7 @@
           Protokollbehandlere som registreres via denne innstillingen, slås sammen med de som er registrert av brukeren, og begge er tilgjengelige for bruk. Brukeren kan overstyre protokollbehandlerne som innstillingen har installert, ved å installere en ny standardbehandler, men kan ikke fjerne en protokollbehandler som er registrert via en innstilling.</translation>
 <translation id="913138516158420759">Lar deg spesifisere hvilken proxy-tjener som brukes av <ph name="PRODUCT_NAME" />, og hindrer brukerne i å endre innstillingene for proxy-tjenere. ARC-apper kan også bruke denne proxy-tjeneren.
 
-          Hvis du velger at det aldri skal brukes proxy-tjenere og alltid kobles til direkte, ignoreres alle andre alternativer.
+          Hvis du velger å aldri bruke proxy-tjenere og alltid koble til direkte, ignoreres alle andre alternativer.
 
           Hvis du velger at systeminnstillingene for proxy-tjenere skal brukes, ignoreres alle andre alternativer.
 
diff --git a/components/policy/resources/policy_templates_pl.xtb b/components/policy/resources/policy_templates_pl.xtb
index f044705..bbe8c63 100644
--- a/components/policy/resources/policy_templates_pl.xtb
+++ b/components/policy/resources/policy_templates_pl.xtb
@@ -145,6 +145,11 @@
 <translation id="1608755754295374538">Adresy URL, które bez pytania otrzymają dostęp do urządzeń do nagrywania dźwięku</translation>
 <translation id="1617235075406854669">Włącz usuwanie historii przeglądarki i pobierania</translation>
 <translation id="1617384279878333801">Włącz dodawanie osób w menedżerze profili</translation>
+<translation id="163200210584085447">Wzorce na tej liście są dopasowywane do źródła zabezpieczeń adresu URL,
+      z którego pochodzi żądanie. Po znalezieniu odpowiednika dostęp do urządzeń
+      rejestrujących wideo jest udzielany na stronach logowania SAML. Jeśli
+      odpowiednik nie zostanie znaleziony, następuje automatyczna odmowa
+      dostępu. Wzorce z użyciem symboli wieloznacznych są niedozwolone</translation>
 <translation id="1655229863189977773">Ustaw rozmiar dyskowej pamięci podręcznej w bajtach</translation>
 <translation id="166427968280387991">Serwer proxy</translation>
 <translation id="1675002386741412210">Obsługiwana przez:</translation>
@@ -252,6 +257,7 @@
 <translation id="2113068765175018713">Ogranicz czas działania urządzenia przez automatyczne ponowne uruchamianie</translation>
 <translation id="2127599828444728326">Zezwalaj na powiadomienia w tych witrynach.</translation>
 <translation id="2131902621292742709">Opóźnienie przyciemnienia ekranu przy zasilaniu z baterii</translation>
+<translation id="2134437727173969994">Zezwól na blokowanie ekranu</translation>
 <translation id="2137064848866899664">Kiedy ta zasada jest skonfigurowana, każdy ekran jest obracany do określonej
       orientacji po każdym ponownym uruchomieniu urządzenia
       oraz przy pierwszym podłączeniu po zmianie wartości tej zasady.
@@ -843,6 +849,7 @@
 <translation id="3967075520570946456">Włącz wyświetlanie strony powitalnej przy pierwszym uruchomieniu przeglądarki po uaktualnieniu systemu operacyjnego.</translation>
 <translation id="3973371701361892765">Nigdy nie autoukrywaj półki</translation>
 <translation id="3984028218719007910">Określa, czy <ph name="PRODUCT_OS_NAME" /> przechowuje po wylogowaniu dane konta lokalnego. W przypadku włączenia trwałe konta nie są przechowywane przez <ph name="PRODUCT_OS_NAME" /> i po wylogowaniu wszystkie dane z sesji użytkownika są usuwane. Jeśli ta zasada będzie wyłączona lub nieskonfigurowana, urządzenie może przechowywać zaszyfrowane lokalne dane użytkownika.</translation>
+<translation id="3997519162482760140">Adresy URL, które będą mieć dostęp do urządzeń rejestrujących wideo na stronach logowania SAML</translation>
 <translation id="4001275826058808087">Administratorzy IT urządzeń firmowych mogą przy użyciu tej flagi określić, czy użytkownicy mogą korzystać z ofert w procesie rejestracji systemu operacyjnego Chrome.
 
       Jeśli nie skonfigurujesz tej zasady lub ustawisz dla niej wartość prawda, użytkownicy będą mogli wykorzystywać oferty przy rejestracji systemu operacyjnego Chrome.
@@ -870,6 +877,9 @@
           Jeśli ta zasada nie jest ustawiona, używana jest domyślna wartość długości czasu.
 
           Wartość tej zasady powinna być określona w milisekundach.</translation>
+<translation id="4115096483386877940">Uprawnienie do blokowania ekranu.
+
+      Jeśli ta zasada jest ustawiona na wartość fałsz, użytkownicy nie mogą blokować ekranu (mogą się tylko wylogować z sesji użytkownika). Jeśli ustawiona jest wartość prawda lub zasada nie została skonfigurowana, użytkownicy, którzy przeprowadzili uwierzytelnianie hasłem, mogą blokować ekran.</translation>
 <translation id="4121350739760194865">Zablokuj wyświetlanie promocji aplikacji na stronie Nowa karta</translation>
 <translation id="4147054660081653009">Certyfikat klienta umożliwiający nawiązanie połączenia z RemoteAccessHostTokenValidationUrl.
 
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb
index 38bb1512..fd60591 100644
--- a/components/policy/resources/policy_templates_pt-BR.xtb
+++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -140,6 +140,11 @@
 <translation id="1608755754295374538">URLs que terão acesso a dispositivos de captura de áudio sem solicitação</translation>
 <translation id="1617235075406854669">Ativar exclusão do histórico do navegador e de downloads</translation>
 <translation id="1617384279878333801">Ativar a adição de pessoa no gerenciador de perfil</translation>
+<translation id="163200210584085447">Os padrões nesta lista serão comparados com a origem
+      de segurança do URL solicitante. Se for encontrada uma correspondência, o acesso a dispositivos de captura
+      de vídeo será concedido em páginas de login SAML. Se nenhuma correspondência for
+      encontrada, o acesso será negado automaticamente. Padrões curingas não são
+      permitidos.</translation>
 <translation id="1655229863189977773">Define o tamanho do cache de disco em bytes</translation>
 <translation id="166427968280387991">Servidor proxy</translation>
 <translation id="1675002386741412210">Com suporte em:</translation>
@@ -247,6 +252,7 @@
 <translation id="2113068765175018713">Limitar tempo de execução do dispositivo reiniciando automaticamente</translation>
 <translation id="2127599828444728326">Permitir notificações nesses sites</translation>
 <translation id="2131902621292742709">Intervalo de escurecimento de tela no funcionamento com energia da bateria</translation>
+<translation id="2134437727173969994">Autorizar bloqueio da tela</translation>
 <translation id="2137064848866899664">Se esta política está definida, cada tela gira para a
       orientação especificada em cada reinicialização e na primeira vez em que se conectar
       após a alteração do valor da política. É possível alterar a rotação
@@ -827,6 +833,7 @@
 <translation id="3967075520570946456">Ativar a exibição da página de boas-vindas na primeira inicialização do navegador após a atualização do sistema operacional.</translation>
 <translation id="3973371701361892765">Nunca ocultar automaticamente a estante</translation>
 <translation id="3984028218719007910">Determina se o <ph name="PRODUCT_OS_NAME" /> deve manter os dados locais da conta após a saída. Se for configurada como true, nenhuma conta persistente será mantida pelo <ph name="PRODUCT_OS_NAME" /> e todos os dados da sessão do usuário serão descartados após a saída. Se esta política for configurada como false ou não for configurada, o dispositivo poderá manter os dados locais do usuário (criptografados).</translation>
+<translation id="3997519162482760140">URLs que terão acesso a dispositivos de captura de vídeo em páginas de login SAML</translation>
 <translation id="4001275826058808087">Administradores de TI de dispositivos corporativos podem usar essa sinalização para controlar se os usuários têm permissão para resgatar ofertas por meio de registro do Chrome OS.
 
       Se essa política for definida como "true" ou não for definida, os usuários terão permissão para resgatar ofertas por meio do registro do Chrome OS.
@@ -852,6 +859,9 @@
           Quando esta política não está definida, é usado um período padrão.
 
           O valor da política deve ser especificado em milissegundos.</translation>
+<translation id="4115096483386877940">Autorizar bloqueio da tela.
+
+      Se esta política for definida como false, os usuários não poderão bloquear a tela (só será possível sair da sessão do usuário). Se esta configuração for definida como true ou não for definida, os usuários que fizeram a autenticação com uma senha poderão bloquear a tela.</translation>
 <translation id="4121350739760194865">Evitar que promoções de aplicativos apareçam na página nova guia</translation>
 <translation id="4147054660081653009">Certificado do cliente para conexão a RemoteAccessHostTokenValidationUrl.
 
diff --git a/components/policy/resources/policy_templates_pt-PT.xtb b/components/policy/resources/policy_templates_pt-PT.xtb
index 344b689..13b9c19 100644
--- a/components/policy/resources/policy_templates_pt-PT.xtb
+++ b/components/policy/resources/policy_templates_pt-PT.xtb
@@ -144,6 +144,11 @@
 <translation id="1608755754295374538">URLs aos quais será concedido acesso a dispositivos de captura de áudio imediatamente</translation>
 <translation id="1617235075406854669">Ativar a eliminação do histórico de transferências e do navegador</translation>
 <translation id="1617384279878333801">Ativar adicionar pessoa no gestor de perfis</translation>
+<translation id="163200210584085447">Os padrões nesta lista serão comparados com a origem de
+      segurança do URL que faz o pedido. Caso seja encontrada uma correspondência, o acesso a dispositivos de
+      captura de vídeo é concedido nas páginas de início de sessão SAML. Caso não seja encontrada uma
+      correspondência, o acesso é automaticamente negado. Não são permitidos padrões com
+      carateres universais.</translation>
 <translation id="1655229863189977773">Definir o tamanho da cache do disco em bytes</translation>
 <translation id="166427968280387991">Servidor proxy</translation>
 <translation id="1675002386741412210">Suportado em:</translation>
@@ -259,6 +264,7 @@
 <translation id="2113068765175018713">Limitar o tempo de atividade do dispositivo reiniciando automaticamente</translation>
 <translation id="2127599828444728326">Permitir notificações nestes Web sites</translation>
 <translation id="2131902621292742709">Atraso do escurecimento do ecrã quando o dispositivo está a utilizar a energia da bateria</translation>
+<translation id="2134437727173969994">Permitir o bloqueio do ecrã</translation>
 <translation id="2137064848866899664">Se esta política estiver definida, cada ecrã é rodado para a
       orientação especificada em todos os reinícios e da primeira vez que for ligado
       após a alteração do valor da política. Os utilizadores podem alterar a rotação
@@ -845,6 +851,7 @@
 <translation id="3967075520570946456">Ativar a apresentação da página de boas-vindas da primeira vez que o navegador for iniciado após uma atualização do SO.</translation>
 <translation id="3973371701361892765">Nunca ocultar automaticamente a prateleira</translation>
 <translation id="3984028218719007910">Determina se o <ph name="PRODUCT_OS_NAME" /> mantém os dados de contas locais depois de terminar sessão. Se esta política estiver definida como verdadeira, o <ph name="PRODUCT_OS_NAME" /> não mantém contas persistentes e todos os dados da sessão do utilizador serão rejeitados depois de terminar sessão. Se estiver definida como falsa ou não estiver configurada, o dispositivo pode manter dados de utilizadores locais (encriptados).</translation>
+<translation id="3997519162482760140">URLs aos quais será concedido acesso a dispositivos de captura de vídeo nas páginas de início de sessão SAML</translation>
 <translation id="4001275826058808087">Os administradores de TI para dispositivos empresariais podem utilizar este sinalizador para permitir que os utilizadores resgatem ofertas através do Registo no SO Chrome.
 
       Se esta política estiver definida como verdadeira ou não estiver definida, os utilizadores poderão resgatar ofertas através do Registo no SO Chrome.
@@ -870,6 +877,9 @@
           Quando esta política não está definida, utiliza-se um período de tempo predefinido.
 
           O valor da política deve ser especificado em milissegundos.</translation>
+<translation id="4115096483386877940">Permitir o bloqueio do ecrã.
+
+      Se esta política estiver definida como falsa, os utilizadores não podem bloquear o ecrã (podem apenas terminar a sessão de utilizador). Se esta política estiver definida como verdadeira ou não estiver definida, os utilizadores que efetuaram a autenticação com uma palavra-passe podem bloquear o ecrã.</translation>
 <translation id="4121350739760194865">Impedir a apresentação de promoções de aplicações na página de novo separador</translation>
 <translation id="4147054660081653009">Certificado de cliente para associação a RemoteAccessHostTokenValidationUrl.
 
diff --git a/components/policy/resources/policy_templates_ro.xtb b/components/policy/resources/policy_templates_ro.xtb
index 8f25f26c..9a72da1 100644
--- a/components/policy/resources/policy_templates_ro.xtb
+++ b/components/policy/resources/policy_templates_ro.xtb
@@ -146,6 +146,11 @@
 <translation id="1608755754295374538">Adresele URL cărora li se va acorda acces automat la dispozitivele de capturare a conținutului audio</translation>
 <translation id="1617235075406854669">Permite ștergerea istoricului browserului și a istoricului descărcărilor</translation>
 <translation id="1617384279878333801">Activează adăugarea persoanelor în managerul de profiluri</translation>
+<translation id="163200210584085447">Șabloanele din această listă vor fi comparate cu
+      originea de securitate a adresei URL solicitante. Dacă este identificată o potrivire, accesul la dispozitivele de capturare a
+      conținutului video va fi acordat pe paginile de conectare SAML. Dacă nu este identificată nicio potrivire,
+      accesul va fi refuzat automat. Șabloanele cu metacaractere nu sunt
+      permise.</translation>
 <translation id="1655229863189977773">Setați dimensiunea în octeți a memoriei cache pe disc</translation>
 <translation id="166427968280387991">Server proxy</translation>
 <translation id="1675002386741412210">Acceptat de:</translation>
@@ -265,6 +270,7 @@
 <translation id="2113068765175018713">Limitează durata de funcționare a dispozitivului prin repornirea automată a acestuia</translation>
 <translation id="2127599828444728326">Permiteți notificări pentru aceste site-uri</translation>
 <translation id="2131902621292742709">Interval până la reducerea luminozității ecranului la funcționarea pe baterie</translation>
+<translation id="2134437727173969994">Permite blocarea ecranului</translation>
 <translation id="2137064848866899664">Dacă această politică este configurată, după fiecare repornire și la prima conectare
       după ce s-a schimbat valoarea politicii, fiecare afișaj este rotit la
       orientarea specificată. Utilizatorii pot să schimbe rotirea
@@ -859,6 +865,7 @@
 <translation id="3967075520570946456">Activează afișarea paginii de întâmpinare la prima lansare a browserului după upgrade-ul sistemului de operare.</translation>
 <translation id="3973371701361892765">Nu ascundeți niciodată automat raftul</translation>
 <translation id="3984028218719007910">Această politică stabilește dacă <ph name="PRODUCT_OS_NAME" /> păstrează datele contului local după deconectare. Dacă politica este activată, <ph name="PRODUCT_OS_NAME" /> nu va păstra conturi persistente, iar toate datele din sesiunea utilizatorului vor fi eliminate după deconectare. Dacă această politică nu este activată sau nu este configurată, dispozitivul poate păstra (criptate) datele locale ale utilizatorului.</translation>
+<translation id="3997519162482760140">Adresele URL cărora li se va acorda acces la dispozitivele de capturare a conținutului video pe paginile de conectare SAML</translation>
 <translation id="4001275826058808087">Administratorii IT pentru dispozitivele companiei pot utiliza acest marcaj pentru a controla dacă utilizatorii pot valorifica oferte prin înregistrarea sistemului de operare Chrome.
 
       Dacă politica este activată sau nu este configurată, utilizatorii pot valorifica oferte prin înregistrarea sistemului de operare Chrome.
@@ -884,6 +891,9 @@
           Dacă politica nu este setată, se utilizează un interval de timp prestabilit.
 
           Valoarea politicii trebuie să fie specificată în milisecunde.</translation>
+<translation id="4115096483386877940">Permite blocarea ecranului.
+
+      Dacă această politică este dezactivată, utilizatorii nu vor putea bloca ecranul (va fi posibilă numai deconectarea de la sesiunea pentru utilizatori). Dacă această setare este activată sau nu este configurată, utilizatorii care s-au autentificat folosind o parolă vor putea bloca ecranul.</translation>
 <translation id="4121350739760194865">Împiedicați promoțiile aplicațiilor să apară în pagina Filă nouă</translation>
 <translation id="4147054660081653009">Certificat de client pentru conectarea la RemoteAccessHostTokenValidationUrl.
 
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb
index 285a380..38ef6d5 100644
--- a/components/policy/resources/policy_templates_ru.xtb
+++ b/components/policy/resources/policy_templates_ru.xtb
@@ -133,6 +133,11 @@
 <translation id="1608755754295374538">URL, которым доступ к аудиозаписывающим устройствам предоставляется без запроса</translation>
 <translation id="1617235075406854669">Удаление истории просмотров и загрузок браузера</translation>
 <translation id="1617384279878333801">Разрешить добавлять людей через менеджер профилей</translation>
+<translation id="163200210584085447">Шаблоны, указанные в списке, сверяются с 
+      запрашивающим URL. При обнаружении соответствия доступ к
+      видеоустройствам предоставляется на страницах входа SAML.
+      Если соответствия не обнаружено, доступ будет автоматически
+      блокирован. Подстановочные знаки запрещены.</translation>
 <translation id="1655229863189977773">Задать объем кеша в байтах</translation>
 <translation id="166427968280387991">Прокси-сервер</translation>
 <translation id="1675002386741412210">Поддерживается в:</translation>
@@ -241,6 +246,7 @@
 <translation id="2113068765175018713">Ограничение продолжительности работы устройства за счет автоматической перезагрузки</translation>
 <translation id="2127599828444728326">Разрешить оповещения на этих сайтах</translation>
 <translation id="2131902621292742709">Задержка затемнения экрана при работе от батареи</translation>
+<translation id="2134437727173969994">Разрешить блокировку экрана</translation>
 <translation id="2137064848866899664">Если правило задано, система будет поворачивать изображение на экране устройства
       на указанное количество градусов при каждой перезагрузке, а также после установки
       нового значения. Пользователи, выполнившие вход в аккаунт, могут изменить поворот
@@ -822,6 +828,7 @@
 <translation id="3967075520570946456">Включить показ стартовой страницы при первом запуске браузера после обновления ОС</translation>
 <translation id="3973371701361892765">Отображение панели загрузок</translation>
 <translation id="3984028218719007910">Определяет, будут ли в <ph name="PRODUCT_OS_NAME" /> сохраняться локально данные аккаунта после выхода. Если этот параметр задан, в <ph name="PRODUCT_OS_NAME" /> не будет постоянных аккаунтов и все данные о сеансе будут удалены после выхода. Если же эти правила не заданы (по умолчанию), на устройстве могут сохраняться пользовательские данные (в зашифрованном виде).</translation>
+<translation id="3997519162482760140">URL, для которых доступ к видеоустройствам предоставляется на страницах входа SAML</translation>
 <translation id="4001275826058808087">Контроль за доступом пользователей к службе регистрации Chrome OS для активации бонусов
 
       Если задано значение true или правило не настроено, пользователи могут использовать бонусы через службу регистрации Chrome OS.
@@ -847,6 +854,9 @@
 Если значение не задано, используется значение по умолчанию.
 
 Значение правила следует указывать в миллисекундах.</translation>
+<translation id="4115096483386877940">Разрешить блокировку экрана.
+
+      Если это правило отключено, пользователи не смогут блокировать экран (доступен только выход из сеанса). В противном случае функция будет доступна только тем, кто использует пароли.</translation>
 <translation id="4121350739760194865">Запрет на появление рекламы приложений на странице быстрого доступа</translation>
 <translation id="4147054660081653009">Сертификат клиента для подключения к RemoteAccessHostTokenValidationUrl.
 
diff --git a/components/policy/resources/policy_templates_sk.xtb b/components/policy/resources/policy_templates_sk.xtb
index 86245a35c..1fad751 100644
--- a/components/policy/resources/policy_templates_sk.xtb
+++ b/components/policy/resources/policy_templates_sk.xtb
@@ -149,6 +149,7 @@
 <translation id="1608755754295374538">Webové adresy, ktorým bude udelený prístup k zariadeniam na zachytávanie zvuku bez zobrazenia výzvy</translation>
 <translation id="1617235075406854669">Povoliť odstránenie histórie prehliadača a sťahovania</translation>
 <translation id="1617384279878333801">Povoliť pridanie osoby pomocou správcu profilov</translation>
+<translation id="163200210584085447">Vzory v tomto zozname sa porovnajú s pôvodom zabezpečenia webovej adresy, ktorá odoslala žiadosť. Ak sa nájde zhoda, prístup k zariadeniam na zaznamenávanie videa sa udelí na prihlasovacích stránkach SAML. Ak sa zhoda nenájde, prístup bude automaticky odmietnutý. Vzory zástupných znakov nie sú povolené.</translation>
 <translation id="1655229863189977773">Nastaviť veľkosť vyrovnávacej pamäte disku v bajtoch</translation>
 <translation id="166427968280387991">Server proxy</translation>
 <translation id="1675002386741412210">Podporované na:</translation>
@@ -270,6 +271,7 @@
 <translation id="2113068765175018713">Obmedziť časové obdobie prevádzky zariadenia automatickým reštartovaním</translation>
 <translation id="2127599828444728326">Povoliť upozornenia na týchto webových stránkach</translation>
 <translation id="2131902621292742709">Oneskorenie zníženia jasu obrazovky pri napájaní z batérie</translation>
+<translation id="2134437727173969994">Povoliť uzamykanie obrazovky</translation>
 <translation id="2137064848866899664">Ak nastavíte toto pravidlo, všetky obrazovky budú otočené
       určeným smerom, keď ich reštartujete alebo prvýkrát pripojíte
       po zmene hodnoty tohto pravidla. Prihlásení používatelia môžu
@@ -896,6 +898,7 @@
 <translation id="3967075520570946456">Aktivovať zobrazenie uvítacej stránky pri prvom spustení prehliadača po prechode na vyššiu verziu OS</translation>
 <translation id="3973371701361892765">Poličku nikdy neskrývať automaticky</translation>
 <translation id="3984028218719007910">Určuje, či má systém <ph name="PRODUCT_OS_NAME" /> po odhlásení zachovať miestne údaje o účte. Ak je toto pravidlo nastavené na hodnotu true, systém <ph name="PRODUCT_OS_NAME" /> nebude uchovávať žiadne trvalé účty a všetky údaje z relácií používateľov budú po odhlásení odstránené. Ak je toto pravidlo nastavené na hodnotu false, alebo nie je nakonfigurované, zariadenie môže uchovávať (zašifrované) miestne údaje používateľa.</translation>
+<translation id="3997519162482760140">Webové adresy, ktorým bude udelený prístup k zariadeniam na zaznamenávanie videa na prihlasovacích stránkach SAML</translation>
 <translation id="4001275826058808087">Správcovia IT spravujúci podnikové zariadenia môžu pomocou tohto pravidla povoliť alebo zakázať používateľom uplatniť ponuky pri registrácii OS Chrome.
 
       Ak je toto pravidlo nastavené na hodnotu true alebo je ponechané bez nastavenia, používatelia si pri registrácii OS Chrome budú môcť uplatniť ponuky.
@@ -929,6 +932,8 @@
           Ak toto pravidlo nastavené nie je, použije sa predvolená doba.
 
           Hodnota pravidla by mala byť uvedená v milisekundách.</translation>
+<translation id="4115096483386877940">Povolenie uzamykania obrazovky.
+      Ak je toto pravidlo nastavené na hodnotu False, používatelia nebudú môcť uzamykať obrazovku (možné bude iba odhlásenie sa z relácie používateľa). Ak je toto pravidlo nastavené na hodnotu True alebo je ponechané nenastavené, používatelia, ktorí overili svoju totožnosť heslom, budú môcť obrazovku uzamykať.</translation>
 <translation id="4121350739760194865">Zabraňuje tomu, aby sa propagácie aplikácií zobrazovali na stránke Nová karta</translation>
 <translation id="4147054660081653009">Certifikát klienta na pripojenie k adrese RemoteAccessHostTokenValidationUrl.
 
diff --git a/components/policy/resources/policy_templates_sl.xtb b/components/policy/resources/policy_templates_sl.xtb
index ec0ab1a..1c59b18c 100644
--- a/components/policy/resources/policy_templates_sl.xtb
+++ b/components/policy/resources/policy_templates_sl.xtb
@@ -154,6 +154,11 @@
 <translation id="1608755754295374538">URL-ji, ki jim bo brez poziva dovoljen dostop do naprav za zajem zvoka</translation>
 <translation id="1617235075406854669">Omogočanje brisanja zgodovine brskalnika in prenosov</translation>
 <translation id="1617384279878333801">Omogočanje dodajanja oseb v upravitelju profilov</translation>
+<translation id="163200210584085447">Vzorci na tem seznamu se bodo primerjali z varnostnim
+      izvorom zahtevajočega URL-ja. Če bo najdeno ujemanje, bo dostop
+      do naprav za zajemanje videa odobren na straneh za prijavo SAML. Če ne bo najdeno nobeno
+      ujemanje, bo dostop samodejno zavrnjen. Vzorci z nadomestnimi znaki
+      niso dovoljeni.</translation>
 <translation id="1655229863189977773">Nastavi velikost predpomnilnika diska v bajtih</translation>
 <translation id="166427968280387991">Strežnik proxy</translation>
 <translation id="1675002386741412210">Na voljo podpora za:</translation>
@@ -275,6 +280,7 @@
 <translation id="2113068765175018713">Omejitev časa dejavnosti naprave samodejnim vnovičnim zagonom</translation>
 <translation id="2127599828444728326">Dovoli obvestila na teh mestih</translation>
 <translation id="2131902621292742709">Časovni zamik zatemnitve zaslona ob napajanju iz akumulatorja</translation>
+<translation id="2134437727173969994">Dovoli zaklepanje zaslona</translation>
 <translation id="2137064848866899664">Če je ta pravilnik nastavljen, je vsak zaslon zasukan na
       določeno postavitev pri vsakem vnovičnem zagonu in pri prvi povezavi
       po spremembi vrednosti pravilnika. Uporabnik lahko po prijavi
@@ -905,6 +911,7 @@
 <translation id="3967075520570946456">Omogočanje prikaza pozdravne strani ob prvem zagonu brskalnika po nadgradnji operacijskega sistema</translation>
 <translation id="3973371701361892765">Nikoli samodejno ne skrij police</translation>
 <translation id="3984028218719007910">Določa, ali <ph name="PRODUCT_OS_NAME" /> po odjavi ohrani lokalne podatke o računu. Če je pravilnik omogočen, <ph name="PRODUCT_OS_NAME" /> ne shrani trajnih računov in vsi podatki seje uporabnika se po odjavi izbrišejo. Če je pravilnik onemogočen ali ni nastavljen, lahko naprava hrani (šifrirane) lokalne podatke uporabnikov.</translation>
+<translation id="3997519162482760140">URL-ji, ki jim bo odobren dostop do naprav za zajem videa na straneh za prijavo SAML</translation>
 <translation id="4001275826058808087">Skrbniki za IT, ki upravljajo naprave v podjetju, lahko s to zastavico določijo, ali je uporabnikom dovoljeno unovčiti ponudbe prek registracije sistema Chrome OS.
 
       Če je vrednost pravilnika nastavljena na »true« ali pravilnik ni nastavljen, lahko uporabniki unovčijo ponudbe prek registracije sistema Chrome OS.
@@ -938,6 +945,9 @@
           Če pravilnik ni nastavljen, velja privzeto trajanje.
 
           Vrednost pravilnika naj bo navedena v milisekundah.</translation>
+<translation id="4115096483386877940">Dovoli zaklepanje zaslona.
+
+      Če je ta pravilnik onemogočen, uporabniki ne bodo mogli zakleniti zaslona (mogoča bo samo odjava iz uporabniške seje). Če je ta nastavitev omogočena ali nastavljena, bodo lahko zaslon zaklenili uporabniki, ki so preverili pristnost z geslom.</translation>
 <translation id="4121350739760194865">Onemogoči prikaz oglasov za programe na strani »Nov zavihek«.</translation>
 <translation id="4147054660081653009">Potrdilo odjemalca za vzpostavljanje povezave s tem: RemoteAccessHostTokenValidationUrl.
 
diff --git a/components/policy/resources/policy_templates_sr.xtb b/components/policy/resources/policy_templates_sr.xtb
index 7d15c67..99685ff 100644
--- a/components/policy/resources/policy_templates_sr.xtb
+++ b/components/policy/resources/policy_templates_sr.xtb
@@ -153,6 +153,11 @@
 <translation id="1608755754295374538">URL-ови којима ће бити одобрен приступ уређајима за снимање звука без приказивања упита</translation>
 <translation id="1617235075406854669">Омогућавање брисања историје прегледача и преузимања</translation>
 <translation id="1617384279878333801">Омогући додавање особа у менаџер профила</translation>
+<translation id="163200210584085447">Обрасци на овој листи ће се поредити са безбедносним
+      пореклом URL-а који шаље захтев. Ако се пронађе подударање, приступ
+      уређајима за снимање видео садржаја биће одобрен на SAML страницама за пријављивање. Ако се не пронађе
+      подударање, приступ ће аутоматски бити одбијен. Обрасци са џокерским знаковима
+      нису дозвољени.</translation>
 <translation id="1655229863189977773">Подешавање величине кеша диска у бајтовима</translation>
 <translation id="166427968280387991">Прокси сервер</translation>
 <translation id="1675002386741412210">Подржано на:</translation>
@@ -274,6 +279,7 @@
 <translation id="2113068765175018713">Ограничавање времена исправног рада уређаја аутоматским поновним покретањем</translation>
 <translation id="2127599828444728326">Омогући обавештења на овим сајтовима</translation>
 <translation id="2131902621292742709">Време до затамњивања екрана када се користи батерија</translation>
+<translation id="2134437727173969994">Дозвољава закључавање екрана</translation>
 <translation id="2137064848866899664">Ако сте подесили ове смернице, сваки екран се ротира у
       наведени положај при сваком рестартовању и првом повезивању
       после промене вредности смерница. Корисници могу да мењају ротирање
@@ -890,6 +896,7 @@
 <translation id="3967075520570946456">Омогући приказивање странице за добродошлицу при првом покретању прегледача након надоградње ОС-а.</translation>
 <translation id="3973371701361892765">Никада аутоматски не сакривај полицу</translation>
 <translation id="3984028218719007910">Одређују да ли <ph name="PRODUCT_OS_NAME" /> задржава локалне податке о налогу после одјављивања. Ако буду подешене на Тачно, <ph name="PRODUCT_OS_NAME" /> не задржава никакве сталне налоге и сви подаци из корисничке сесије ће бити одбачени након одјављивања. Ако ове смернице буду подешене на Нетачно или не буду конфигурисане, уређај може да задржи (шифроване) локалне корисничке податке.</translation>
+<translation id="3997519162482760140">URL-ови којима ће бити одобрен приступ уређајима за снимање видео садржаја на SAML страницама за пријављивање</translation>
 <translation id="4001275826058808087">IT администратори уређаја за предузећа могу да користе ову ознаку да би одредили да ли ће дозволити корисницима да искоришћавају понуде преко регистрације за Chrome ОС.
 
       Ако подесите ове смернице на Тачно или их не подесите, корисници ће моћи да искоришћавају понуде преко регистрације за Chrome ОС.
@@ -923,6 +930,9 @@
           Када ове смернице нису подешене, користи се подразумевани период.
 
           Вредност смерница треба да буде наведена у милисекундама.</translation>
+<translation id="4115096483386877940">Дозвољава закључавање екрана.
+
+      Ако су ове смернице подешене на Нетачно, корисници неће моћи да закључају екран (биће могуће само одјављивање из корисничке сесије). Ако је ово подешавање подешено на Тачно или није подешено, корисници чија аутентичност је потврђена помоћу лозинке могу да закључају екран.</translation>
 <translation id="4121350739760194865">Спречи приказивање промоција апликација на страници Нова картица</translation>
 <translation id="4147054660081653009">Клијентски сертификат за повезивање са смерницама RemoteAccessHostTokenValidationUrl.
 
diff --git a/components/policy/resources/policy_templates_sv.xtb b/components/policy/resources/policy_templates_sv.xtb
index 727a7706..73785cdf 100644
--- a/components/policy/resources/policy_templates_sv.xtb
+++ b/components/policy/resources/policy_templates_sv.xtb
@@ -154,6 +154,11 @@
 <translation id="1608755754295374538">Webbadresser som ska ges tillgång till ljudinspelningsenheter utan meddelande</translation>
 <translation id="1617235075406854669">Aktivera borttagning av webb- och nedladdningshistorik</translation>
 <translation id="1617384279878333801">Gör att en person kan läggas till i profilhanteraren</translation>
+<translation id="163200210584085447">Mönster på den här listan kommer att matchas mot den begärande
+      webbadressens säkerhetsursprung. Om det blir en träff får adressen
+      åtkomst till videoinspelningsenheter på inloggningssidor med SAML.
+      Om det inte blir någon träff nekas åtkomst automatiskt. Mönster
+      med jokertecken får inte användas.</translation>
 <translation id="1655229863189977773">Ange enhetens cachestorlek i byte</translation>
 <translation id="166427968280387991">Proxyserver</translation>
 <translation id="1675002386741412210">Stöds av:</translation>
@@ -279,6 +284,7 @@
 <translation id="2113068765175018713">Begränsa enhetens upptid genom att starta om automatiskt</translation>
 <translation id="2127599828444728326">Tillåt meddelanden på dessa webbplatser</translation>
 <translation id="2131902621292742709">Skärmdämpningstid när enheten drivs av batteriet</translation>
+<translation id="2134437727173969994">Tillåt att skärmen låses</translation>
 <translation id="2137064848866899664">När den här principen har ställts in roteras alla skärmar till
       den angivna riktningen vid varje omstart och första gången som skärmen
       ansluts efter att värdet i principen har ändrats. Användarna kan ändra
@@ -909,6 +915,7 @@
 <translation id="3967075520570946456">Gör att välkomstsidan visas när webbläsaren startas för första gången efter en uppgradering av operativsystemet.</translation>
 <translation id="3973371701361892765">Dölj aldrig hyllan automatiskt</translation>
 <translation id="3984028218719007910">Avgör om <ph name="PRODUCT_OS_NAME" /> ska spara lokala kontodata efter utloggning. Om värdet är sant sparas inga konton permanent av <ph name="PRODUCT_OS_NAME" /> och alla data från användarsessionen kasseras efter utloggning. Om policyn är inställd på falskt eller inte konfigurerad kan lokala användardata sparas (krypterade) i enheten.</translation>
+<translation id="3997519162482760140">Webbadresser som ska beviljas åtkomst till videoinspelningsenheter på inloggningssidor med SAML</translation>
 <translation id="4001275826058808087">IT-administratörer för företagsenheter kan använda den här flaggan för att styra om användarna ska kunna utnyttja erbjudanden via registrering i Chrome OS.
 
       Om policyn är inställd på sant eller inte är inställd kan användarna utnyttja erbjudanden via registrering i Chrome OS.
@@ -942,6 +949,9 @@
           Om policyn inte är inställd används standardtiden.
 
           Policyns värde anges i millisekunder.</translation>
+<translation id="4115096483386877940">Tillåt att skärmen låses.
+
+      Om principen är inställd på falskt kan användare inte låsa skärmen (utan endast logga ut från användarsessionen). Om principen är inställd på sant eller inte har angetts kan användare som har autentiserats med ett lösenord låsa skärmen.</translation>
 <translation id="4121350739760194865">Förhindra att appkampanjer visas på den nya fliksidan</translation>
 <translation id="4147054660081653009">Klientcertifikat för anslutning till RemoteAccessHostTokenValidationUrl.
 
diff --git a/components/policy/resources/policy_templates_sw.xtb b/components/policy/resources/policy_templates_sw.xtb
index 791ec61..6865eda 100644
--- a/components/policy/resources/policy_templates_sw.xtb
+++ b/components/policy/resources/policy_templates_sw.xtb
@@ -146,6 +146,10 @@
 <translation id="1608755754295374538">URL ambazo zitapewa ufikiaji wa vifaa vya kunasa sauti bila ushawishi</translation>
 <translation id="1617235075406854669">Washa ufutaji wa historia ya upakuaji na kivinjari</translation>
 <translation id="1617384279878333801">Washa kipengee cha kuongeza mtu katika kidhibiti cha wasifu</translation>
+<translation id="163200210584085447">Michoro katika orodha hii italinganishwa na asili ya
+      usalama wa ombi la URL. Zikilingana, idhini ya kufikia vifaa vya
+      kurekodi video itatolewa kwenye kurasa za kuingia katika SAML. Ikiwa hazilingani,
+     idhini ya kufikia itakataliwa kiotomatiki. Michoro ya herufi wakilishi hairuhusiwi.</translation>
 <translation id="1655229863189977773">Weka ukubwa wa akiba ya diski katika baiti</translation>
 <translation id="166427968280387991">Seva ya proksi</translation>
 <translation id="1675002386741412210">Imehimiliwa kwenye:</translation>
@@ -269,6 +273,7 @@
 <translation id="2113068765175018713">Wekea kifaa vizuizi vya muda wa kuwaka kwa kuzima na kuwasha kiotomatiki</translation>
 <translation id="2127599828444728326">Ruhusu arifa katika tovuti hizi</translation>
 <translation id="2131902621292742709">Ufifili wa skrini unachelewa wakati wa kuendesha kwa nishati ya betri</translation>
+<translation id="2134437727173969994">Ruhusu kufunga skrini</translation>
 <translation id="2137064848866899664">Sera hii ikiwekwa, kila onyesho litazungushwa hadi
       mkao uliobainishwa kila inapowashwa tena, na mara ya kwanza inapounganishwa
       baada ya thamani ya sera kubadilika. Watumiaji wanaweza kubadilisha mzunguko 
@@ -887,6 +892,7 @@
 <translation id="3967075520570946456">Washa kipengee cha kuonyesha ukurasa wa kukaribisha unapofungua kivinjari kwa mara ya kwanza baada ya kupata toleo jipya la Mfumo wa Uendeshaji.</translation>
 <translation id="3973371701361892765">Usiwahi kuficha rafu kiotomatiki</translation>
 <translation id="3984028218719007910">Inathibitisha iwapo <ph name="PRODUCT_OS_NAME" /> inaweka data ya akaunti ya karibu baada ya kuondoka. Ikiwa imewekwa kwenye ndivyo, hakuna akaunti za kudumu zinazowekwa kwa <ph name="PRODUCT_OS_NAME" /> na data yote kutoka kwenye kipindi cha mtumiaji itatupwa baada ya kuondoka. Ikiwa sera hii imewekwa kuwa sivyo au haijasanidiwa, kifaa kinaweza kuweka data ya mtumiaji wa karibu (iliyosimbwa fiche).</translation>
+<translation id="3997519162482760140">URL zitakazopewa idhini ya kufikia vifaa vya kurekodi video kwenye kurasa za kuingia katika SAML</translation>
 <translation id="4001275826058808087">Usimamizi wa IT kwa vifaa vya biashara unaweza kutumia alama hii kudhibiti iwapo itaruhusu watumiaji kukomboa matoleo kupitia Usajili wa Chrome OS.
 
       Iwapo sera hii itawekwa kuwa ndivyo au kuachwa bila kuwekwa, watumiaji wataweza kukomboa matoleo kupitia Usajili wa Chrome OS.
@@ -920,6 +926,9 @@
           Sera hii inapokuwa haijawekwa, urefu wa muda wa chaguo-msingi hutumiwa.
 
           Sera ya thamani inastahili kubainishwa kwa nukta.</translation>
+<translation id="4115096483386877940">Ruhusu kufunga skrini.
+
+      Sera hii ikiwekwa kuwa sivyo, watumiaji hawataweza kufunga skrini (wataweza tu kuondoka kwenye kipindi cha mtumiaji). Sera hii ikiwekwa kuwa ndivyo au isipowekwa, watumiaji walioidhinisha kwa kutumia nenosiri wanaweza kufunga skrini.</translation>
 <translation id="4121350739760194865">Zuia utambulishaji dhidi ya kuonekana kwenye ukurasa mpya wa kichupo</translation>
 <translation id="4147054660081653009">Cheti cha seva teja cha kuunganisha kwenye RemoteAccessHostTokenValidatioUrl.
 
diff --git a/components/policy/resources/policy_templates_ta.xtb b/components/policy/resources/policy_templates_ta.xtb
index b9222f6..02e1750 100644
--- a/components/policy/resources/policy_templates_ta.xtb
+++ b/components/policy/resources/policy_templates_ta.xtb
@@ -136,6 +136,11 @@
 <translation id="1608755754295374538">அறிவுறுத்தல் இல்லாமல் ஆடியோ பிடிப்புச் சாதனங்களுக்கு அணுகல் உள்ள URLகள்</translation>
 <translation id="1617235075406854669">உலாவி மற்றும் பதிவிறக்க வரலாற்றின் நீக்கத்தை இயக்கு</translation>
 <translation id="1617384279878333801">சுயவிவர நிர்வாகியில் நபரைச் சேர் என்பதை இயக்கும்</translation>
+<translation id="163200210584085447">இந்தப் பட்டியலில் உள்ள வடிவங்கள்,
+      கோரப்படும் URL இன் பாதுகாப்பு மூலத்துடன் ஒப்பிடப்படும்.  ஏதேனும் பொருத்தம் இருந்தால், வீடியோ
+      எடுக்கும் சாதனங்களுக்கு SAML உள்நுழைவுப் பக்கங்களில் அணுகல் வழங்கப்படும். எதுவும் பொருந்தவில்லை
+      எனில், தானாகவே அணுகல் நிராகரிக்கப்படும்.  சிறப்புக் குறி வடிவங்கள்
+      அனுமதிக்கப்படாது.</translation>
 <translation id="1655229863189977773">வட்டு தற்காலிக சேமிப்பு அளவை பைட்களில் அமை</translation>
 <translation id="166427968280387991">ப்ராக்ஸி சேவையகம்</translation>
 <translation id="1675002386741412210">இவற்றில் ஆதரிக்கப்படுகிறது:</translation>
@@ -252,6 +257,7 @@
 <translation id="2113068765175018713">தானாக மறுதொடக்கம் செய்வதன் மூலம் சாதனத்தின் இயக்க நேரத்தை வரம்பிடவும்</translation>
 <translation id="2127599828444728326">இந்த தளங்களில் அறிவிப்புகளை அனுமதி</translation>
 <translation id="2131902621292742709">பேட்டரி சக்தியில் இயங்கும்போது திரை மங்கல் தாமதமாகும்</translation>
+<translation id="2134437727173969994">திரையைப் பூட்டுவதை அனுமதி</translation>
 <translation id="2137064848866899664">இந்தக் கொள்கை அமைக்கப்பட்டால், ஒவ்வொரு முறை மறுதொடக்கம் செய்யப்படும் போதும், கொள்கையின் மதிப்பானது மாற்றப்பட்ட பிறகு முதல்முறையாக இணைக்கப்படும் போதும், ஒவ்வொரு காட்சியும் குறிப்பிடப்பட்ட திசையமைப்பிற்குச் சுழற்றப்படும். உள்நுழைந்த பின் அமைப்புகள் பக்கத்தின் வழியாகக் காட்சியின் சுழற்சியைப் பயனர்கள் மாற்றலாம், ஆனால் அடுத்த முறை மறுதொடக்கம் செய்யப்படும் போது கொள்கையின் மதிப்பால் அவற்றின் மதிப்பு மேலெழுதப்படும்.
 
       இந்தக் கொள்கை முதன்மை மற்றும் அனைத்து இரண்டாம்நிலைச் சாதனங்கள் இரண்டிற்கும் பொருந்தும்.
@@ -830,6 +836,7 @@
 <translation id="3967075520570946456">OS மேம்படுத்தலைத் தொடர்ந்து முதல்முறையாகத் தொடங்கும் போது வரவேற்புப் பக்கத்தைக் காட்டுவதை இயக்கும்.</translation>
 <translation id="3973371701361892765">அடுக்கை ஒருபோதும் மறைக்காதே</translation>
 <translation id="3984028218719007910">வெளியேறிய பிறகு உள்ளார்ந்த கணக்குத் தரவை <ph name="PRODUCT_OS_NAME" /> வைக்க வேண்டுமா என்பதைத் தீர்மானிக்கும். true என அமைக்கப்பட்டால், நிலையான கணக்குகள் எதுவும் <ph name="PRODUCT_OS_NAME" /> ஆல் வைக்கப்படாது, மேலும் வெளியேறிய பிறகு பயனர் அமர்விலிருக்கும் எல்லா தரவும் நிராகரிக்கப்படும். இந்தக் கொள்கை false என அமைக்கப்பட்டால் அல்லது உள்ளமைக்கப்படாவிட்டால், உள்ளார்ந்த பயனர் தரவை (குறியாக்கப்பட்ட) சாதனம் வைத்துக்கொண்டிருக்கலாம்.</translation>
+<translation id="3997519162482760140">SAML உள்நுழைவுப் பக்கங்களில் வீடியோ எடுக்கும் சாதனங்களுக்கு அணுகல் வழங்கப்படும் URLகள்</translation>
 <translation id="4001275826058808087">இந்தக் கொடியை Chrome OS இல் பதிவுசெய்தல் வழியாகச் சலுகைகளை மீட்டெடுக்க பயனர்களை அனுமதிக்கலாமா என்பதைக் கட்டுப்படுத்த நிறுவன சாதனங்களுக்கான IT நிர்வாகிகள் பயன்படுத்தலாம்.
 
       இந்தக் கொள்கை சரி என்பதற்கு அமைக்கப்பட்டிருந்தால் அல்லது அமைக்காமல் விட்டால், Chrome OS இல் பதிவுசெய்தல் வழியாகச் சலுகைகளைப் பயனர்களால் மீட்டெடுக்க முடியும்.
@@ -855,6 +862,9 @@
           இந்தக் கொள்கை அமைக்கப்படாதபோது, நேரத்தின் இயல்பான அளவு பயன்படுத்தப்படும்.
 
           கொள்கை மதிப்பை மில்லிவினாடிகளில் மட்டுமே குறிப்பிட வேண்டும்.</translation>
+<translation id="4115096483386877940">திரையைப் பூட்டுவதை அனுமதி.
+
+      இந்தக் கொள்கை "தவறு" என அமைக்கப்பட்டால், பயனர்களால் திரையைப் பூட்ட முடியாது (பயனர் அமர்விலிருந்து வெளியேற மட்டுமே முடியும்). இந்த அமைப்பு "சரி" என அமைக்கப்பட்டாலோ அல்லது அமைக்கப்படாமல் இருந்தாலோ, கடவுச்சொல்லுடன் அங்கீகரிக்கப்பட்ட பயனர்களால் திரையைப் பூட்ட முடியும்.</translation>
 <translation id="4121350739760194865">புதிய தாவல் பக்கத்தில் தோன்றுவதிலிருந்து பயன்பாட்டு விளம்பரங்களைத் தடு</translation>
 <translation id="4147054660081653009">RemoteAccessHostTokenValidationUrl உடன் இணைப்பதற்கான க்ளையன்ட் சான்றிதழ்.
 
diff --git a/components/policy/resources/policy_templates_te.xtb b/components/policy/resources/policy_templates_te.xtb
index 2adc485..66ad316 100644
--- a/components/policy/resources/policy_templates_te.xtb
+++ b/components/policy/resources/policy_templates_te.xtb
@@ -144,6 +144,11 @@
 <translation id="1608755754295374538">ప్రాంప్ట్ చేయబడకుండా ఆడియో క్యాప్చర్ పరికరాలకు ప్రాప్యత మంజూరు చేయబడే URLలు</translation>
 <translation id="1617235075406854669">బ్రౌజర్ మరియు డౌన్‌లోడ్ చరిత్ర తొలగింపును ప్రారంభించండి</translation>
 <translation id="1617384279878333801">ప్రొఫైల్ నిర్వాహికిలో వ్యక్తిని జోడించగల సామర్థ్యాన్ని ప్రారంభిస్తుంది</translation>
+<translation id="163200210584085447">ఈ జాబితాలోని నమూనాలు అభ్యర్థిస్తున్న URL భద్రతా
+      మూలాధారంతో సరిపోల్చబడతాయి.  సరిపోలినది కనుగొనబడితే, వీడియో సంగ్రహణ పరికరాలకు
+      SAML లాగిన్ పేజీల్లో ప్రాప్యత మంజూరు చేయబడుతుంది.  సరిపోలినది ఏదీ
+      కనుగొనబడకపోతే, ప్రాప్యత స్వయంచాలకంగా తిరస్కరించబడుతుంది.  వైల్డ్‌కార్డ్ నమూనాలు
+      అనుమతించబడవు.</translation>
 <translation id="1655229863189977773">డిస్క్ కాష్ పరిమాణాన్ని బైట్‌ల్లో సెట్ చేయండి</translation>
 <translation id="166427968280387991">ప్రాక్సీ సర్వర్</translation>
 <translation id="1675002386741412210">లో మద్దతిస్తుంది:</translation>
@@ -255,6 +260,7 @@
 <translation id="2113068765175018713">స్వయంచాలకంగా రీబూట్ చేయడం ద్వారా పరికరం యొక్క గరిష్ట సమయాన్ని పరిమితం చేయండి</translation>
 <translation id="2127599828444728326">ఈ సైట్‌లలో ప్రకటనలను అనుమతించు</translation>
 <translation id="2131902621292742709">బ్యాటరీ శక్తితో అమలవుతున్నప్పుడు స్క్రీన్ మసక ఆలస్యం</translation>
+<translation id="2134437727173969994">స్క్రీన్ లాక్ చేయడానికి అనుమతి</translation>
 <translation id="2137064848866899664">ఈ విధానం సెట్ చేయబడితే, ప్రతి డిస్‌ప్లే రీబూట్ చేసే ప్రతిసారి
       మరియు విధానం విలువ మారిన తర్వాత కనెక్ట్ చేయబడే మొదటిసారి పేర్కొన్న
       దృగ్విన్యాసానికి తిప్పబడుతుంది. వినియోగదారులు లాగిన్ చేసిన తర్వాత
@@ -854,6 +860,7 @@
 <translation id="3967075520570946456">OS అప్‌గ్రేడ్ చేసిన అనంతరం మొదటిసారి బ్రౌజర్‌ను ప్రారంభించినప్పుడు స్వాగత పేజీని చూపడం ప్రారంభిస్తుంది.</translation>
 <translation id="3973371701361892765">అరను ఎప్పుడూ స్వయంచాలకంగా దాచవద్దు</translation>
 <translation id="3984028218719007910">లాగ్ అవుట్ చేసిన తర్వాత స్థానిక ఖాతా డేటాని <ph name="PRODUCT_OS_NAME" /> ఉంచుతుందో లేదో నిర్ధారిస్తుంది. ఒప్పుకి సెట్ చేయబడితే, <ph name="PRODUCT_OS_NAME" /> ద్వారా నిరంతర ఖాతాలు ఉండబడవు మరియు వినియోగదారు సెషన్ నుండి మొత్తం డేటా లాగ్ అవుట్ చేయబడిన తర్వాత విస్మరించబడతాయి. ఈ విధానం తప్పుకి సెట్ చేయబడితే లేదా కాన్ఫిగర్ చేయబడితే, పరికరం స్థానిక వినియోగదారు డేటాని ఉంచవచ్చు (గుప్తీకరించిన).</translation>
+<translation id="3997519162482760140">SAML లాగిన్ పేజీల్లో వీడియో సంగ్రహణ పరికరాలకు ప్రాప్యత మంజూరు చేయబడే URLలు</translation>
 <translation id="4001275826058808087">Chrome OS నమోదు ద్వారా ఆఫర్‌లను రీడీమ్ చేయడానికి వినియోగదారులను అనుమతించాలా లేదా అనేదాన్ని నియంత్రించడానికి ఎంటర్‌ప్రైజ్ పరికరాల కోసం IT నిర్వాహకులు ఈ ఫ్లాగ్‌ను ఉపయోగించవచ్చు .
 
       ఈ విధానాన్ని ఒప్పుకి సెట్ చేస్తే లేదా సెట్ చేయకుండా వదిలేస్తే, వినియోగదారులు Chrome OS నమోదు ద్వారా ఆఫర్‌లను రీడీమ్ చేయగలరు.
@@ -879,6 +886,9 @@
           ఈ విధానాన్ని సెట్ చేయకుండా వదిలేసినప్పుడు, డిఫాల్ట్ సమయం ఉపయోగించబడుతుంది.
 
           విధానం విలువను మిల్లీసెకన్లలో పేర్కొనాలి.</translation>
+<translation id="4115096483386877940">స్క్రీన్‌ను లాక్ చేయడానికి అనుమతి.
+
+      ఈ విధానాన్ని తప్పుకు సెట్ చేస్తే, వినియోగదారులు స్క్రీన్‌ను లాక్ చేయలేరు (వినియోగదారు సెషన్ నుండి సైన్ అవుట్ చేయడం మాత్రమే సాధ్యమవుతుంది). ఈ సెట్టింగ్‌ను ఒప్పుకు సెట్ చేస్తే లేదా సెట్ చేయకుండా వదిలివేస్తే, పాస్‌వర్డ్ కలిగి ఉండే వినియోగదారులు స్క్రీన్‌ను లాక్ చేయగలరు.</translation>
 <translation id="4121350739760194865">అనువర్తన ప్రచారాలు క్రొత్త ట్యాబ్ పేజీలో కనిపించడాన్ని నిరోధించండి</translation>
 <translation id="4147054660081653009">RemoteAccessHostTokenValidationUrlకి కనెక్ట్ చేయడానికి క్లయింట్ ప్రమాణపత్రం.
 
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb
index 5bb7cb1..df3591a 100644
--- a/components/policy/resources/policy_templates_th.xtb
+++ b/components/policy/resources/policy_templates_th.xtb
@@ -140,6 +140,10 @@
 <translation id="1608755754295374538">URL ที่จะได้รับสิทธิ์การเข้าถึงอุปกรณ์จับเสียงโดยไม่ต้องแจ้ง</translation>
 <translation id="1617235075406854669">เปิดใช้งานการนำออกเบราว์เซอร์และประวัติการดาวน์โหลด</translation>
 <translation id="1617384279878333801">เปิดใช้การเพิ่มบุคคลลงในตัวจัดการโปรไฟล์</translation>
+<translation id="163200210584085447">รูปแบบในรายการนี้จะได้รับการจับคู่กับต้นทาง
+      การรักษาความปลอดภัยของ URL ที่ขอ หากพบว่าตรงกัน ระบบจะอนุญาตให้
+      เข้าถึงอุปกรณ์จับภาพวิดีโอในหน้าการเข้าสู่ระบบ SAML หากไม่พบว่าตรงกัน
+      ระบบจะปฏิเสธการเข้าถึงโดยอัตโนมัติ และไม่อนุญาตให้ใช้รูปแบบสัญลักษณ์แทน</translation>
 <translation id="1655229863189977773">ตั้งค่าขนาดแคชของดิสก์เป็นไบต์</translation>
 <translation id="166427968280387991">พร็อกซีเซิร์ฟเวอร์</translation>
 <translation id="1675002386741412210">ได้รับการสนับสนุนบน:</translation>
@@ -255,6 +259,7 @@
 <translation id="2113068765175018713">จำกัดเวลาใช้งานของอุปกรณ์โดยการรีบูตอัตโนมัติ</translation>
 <translation id="2127599828444728326">อนุญาตการแจ้งเตือนในไซต์เหล่านี้</translation>
 <translation id="2131902621292742709">ระยะหน่วงเวลาการหรี่แสงหน้าจอเมื่อทำงานโดยใช้พลังงานแบตเตอรี่</translation>
+<translation id="2134437727173969994">อนุญาตให้ล็อกหน้าจอ</translation>
 <translation id="2137064848866899664">หากตั้งค่านโยบายนี้ จอแสดงผลแต่ละเครื่องจะ
       หมุนไปตามแนวที่กำหนดทุกครั้งที่เริ่มต้นระบบใหม่ และเมื่อเชื่อมต่อเป็นครั้งแรก
       หลังจากเปลี่ยนค่าของนโยบาย ผู้ใช้สามารถเปลี่ยนการหมุนหน้าจอ
@@ -840,6 +845,7 @@
 <translation id="3967075520570946456">เปิดใช้การแสดงหน้าต้อนรับเมื่อเรียกใช้เบราว์เซอร์ครั้งแรกหลังการอัปเกรดระบบปฏิบัติการ</translation>
 <translation id="3973371701361892765">ไม่ซ่อนชั้นวางอัตโนมัติเลย</translation>
 <translation id="3984028218719007910">กำหนดว่าจะให้ <ph name="PRODUCT_OS_NAME" /> เก็บข้อมูลบัญชีในตัวเครื่องหลังจากที่ออกจากระบบหรือไม่ หากตั้งค่าเป็น "จริง" <ph name="PRODUCT_OS_NAME" /> จะไม่เก็บบัญชีใดๆ ไว้อย่างถาวร และข้อมูลทั้งหมดจากเซสชันผู้ใช้จะถูกยกเลิกหลังจากที่ออกจากระบบ ถ้านโยบายนี้ถูกกำหนดเป็น "เท็จ" หรือไม่กำหนดค่า อุปกรณ์อาจเก็บข้อมูลผู้ใช้ในตัวเครื่องไว้ (โดยที่เข้ารหัส)</translation>
+<translation id="3997519162482760140">URL ที่จะได้รับสิทธิ์การเข้าถึงอุปกรณ์จับภาพวิดีโอในหน้าการเข้าสู่ระบบ SAML</translation>
 <translation id="4001275826058808087">ผู้ดูแลระบบ IT สำหรับอุปกรณ์ขององค์กรสามารถใช้การตั้งสถานะนี้เพื่อควบคุมว่าจะอนุญาตผู้ใช้ให้แลกรับข้อเสนอพิเศษผ่านการลงทะเบียน Chrome OS ไหม
 
       หากนโยบายนี้ตั้งค่าเป็นจริงหรือไม่มีการตั้งค่า ผู้ใช้จะสามารถแลกรับข้อเสนอพิเศษผ่านการลงทะเบียน Chrome OS ได้
@@ -864,6 +870,9 @@
           เมื่อนโยบายไม่มีการตั้งค่า ระบบจะใช้ระยะเวลาในค่าเริ่มต้น
 
           ค่านโยบายควรกำหนดในหน่วยมิลลิวินาที</translation>
+<translation id="4115096483386877940">อนุญาตให้ล็อกหน้าจอ
+
+      หากตั้งค่านโยบายนี้เป็น False ผู้ใช้จะไม่สามารถล็อกหน้าจอได้ (ล็อกได้ก็ต่อเมื่อออกจากระบบเซสชันผู้ใช้แล้วเท่านั้น) หากตั้งค่าเป็น True หรือไม่ได้ตั้งค่า ต้องเป็นผู้ใช้ที่ตรวจสอบสิทธิ์ด้วยรหัสผ่านเท่านั้นจึงจะล็อกหน้าจอได้</translation>
 <translation id="4121350739760194865">ป้องกันไม่ให้การส่งเสริมของแอปพลิเคชันไปปรากฏบนหน้าแท็บใหม่</translation>
 <translation id="4147054660081653009">ใบรับรองไคลเอ็นต์สำหรับการเชื่อมต่อกับ RemoteAccessHostTokenValidationUrl
 
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb
index ef3c91a..cb86fbf 100644
--- a/components/policy/resources/policy_templates_tr.xtb
+++ b/components/policy/resources/policy_templates_tr.xtb
@@ -156,6 +156,11 @@
 <translation id="1608755754295374538">Soru sorulmadan ses yakalama cihazlarına erişim verilecek URL'ler</translation>
 <translation id="1617235075406854669">Tarayıcı ve indirme geçmişinin silinmesini etkinleştir</translation>
 <translation id="1617384279878333801">Profil yöneticisinde kişi eklemeyi etkinleştir</translation>
+<translation id="163200210584085447">Bu listedeki kalıplar, istek yapan URL'nin güvenlik kaynağı ile
+      karşılaştırılır. Eşleşme bulunursa, SAML giriş sayfalarında video
+      yakalama cihazlarına erişim izni verilir. Herhangi bir eşleşme
+      bulunmazsa, erişim otomatik olarak reddedilir. Joker karakter kalıplarına
+      izin verilmez.</translation>
 <translation id="1655229863189977773">Disk önbelleği boyutunu bayt olarak ayarla</translation>
 <translation id="166427968280387991">Proxy sunucu</translation>
 <translation id="1675002386741412210">Desteklendiği yerler:</translation>
@@ -281,6 +286,7 @@
 <translation id="2113068765175018713">Otomatik bir şekilde yeniden başlatarak cihazın açık kalma süresini sınırlandır</translation>
 <translation id="2127599828444728326">Bu sitelerde bildirimlere izin ver</translation>
 <translation id="2131902621292742709">Pil gücüyle çalışırken ekran karartma gecikmesi</translation>
+<translation id="2134437727173969994">Ekranı kilitlemeye izin ver</translation>
 <translation id="2137064848866899664">Bu politika ayarlanırsa her bir ekran, her yeniden
       başlatmada ve politika değeri değiştirildikten sonra ilk kez bağlanıldığında
       belirtilen yönde döndürülür. Kullanıcılar, giriş yaptıktan sonra ayarlar
@@ -896,6 +902,7 @@
 <translation id="3967075520570946456">OS yeni sürüme geçirildikten sonra, tarayıcı ilk başlatıldığında karşılama sayfasının gösterilmesini etkinleştir.</translation>
 <translation id="3973371701361892765">Rafı hiçbir zaman otomatik olarak gizleme</translation>
 <translation id="3984028218719007910">Çıkış yapıldıktan sonra yerel hesap verilerinin <ph name="PRODUCT_OS_NAME" /> tarafından korunup korunmayacağını belirler. True değerine ayarlanırsa, kalıcı hesaplar <ph name="PRODUCT_OS_NAME" /> tarafından korunmaz ve çıkış yapıldıktan sonra kullanıcı oturumuna ilişkin tüm veriler kaybedilir. Bu politika false değerine ayarlanırsa veya hiçbir şekilde ayarlanmazsa, cihaz (şifreli) yerel kullanıcı verilerini koruyabilir.</translation>
+<translation id="3997519162482760140">SAML oturum açma sayfalarında video yakalama cihazlarına erişimin verileceği URL'ler</translation>
 <translation id="4001275826058808087">Kurumsal cihazların BT yöneticileri, kullanıcıların Chrome OS Kaydı'nı kullanarak tekliflerden yararlanıp yararlanamayacağını belirlemek için bu bayrağı kullanabilirler.
 
       Bu politika doğru seçeneğine ayarlanırsa veya ayarlanmadan bırakılırsa kullanıcılar Chrome OS Kaydı aracılığıyla tekliflerden yararlanabilirler.
@@ -929,6 +936,9 @@
           Bu politika ayarlanmadan bırakılırsa, varsayılan süre kullanılır.
 
           Politika değeri milisaniye olarak belirtilmelidir.</translation>
+<translation id="4115096483386877940">Ekranı kilitlemeye izin ver.
+
+      Bu politika yanlış (false) değerine ayarlanırsa kullanıcılar ekranı kilitleyemez (sadece kullanıcı oturumunu kapatmaları mümkün olur). Bu ayar doğru (true) değerine ayarlanırsa veya ayarlanmadan bırakılırsa, bir şifreyle kimlik doğrulaması yapan kullanıcılar ekranı kilitleyebilir.</translation>
 <translation id="4121350739760194865">Uygulama tanıtımlarının yeni sekme sayfasında görünmesini önle</translation>
 <translation id="4147054660081653009">RemoteAccessHostTokenValidationUrl'ye bağlanmak için istemci sertifikası.
 
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb
index 3351856d..c62c8e6 100644
--- a/components/policy/resources/policy_templates_uk.xtb
+++ b/components/policy/resources/policy_templates_uk.xtb
@@ -146,6 +146,11 @@
 <translation id="1608755754295374538">URL-адреси, яким завжди надаватиметься доступ до пристроїв запису аудіо</translation>
 <translation id="1617235075406854669">Увімкнути видалення історії веб-перегляду та завантажень</translation>
 <translation id="1617384279878333801">Додавати користувачів у менеджері профілю</translation>
+<translation id="163200210584085447">Зразки в цьому списку зіставлятимуться з джерелом
+      безпеки запитаної URL-адреси. Якщо буде знайдено збіг, доступ до пристроїв
+      запису відео надаватиметься на сторінках входу SAML.  Якщо збіг не буде знайдено,
+      у доступі буде відмовлено автоматично. Заборонено шукати
+      збіги за шаблоном.</translation>
 <translation id="1655229863189977773">Установити кеш-пам’ять диска в байтах</translation>
 <translation id="166427968280387991">Проксі-сервер</translation>
 <translation id="1675002386741412210">Підтримується в:</translation>
@@ -261,6 +266,7 @@
 <translation id="2113068765175018713">Обмежувати режим роботи пристрою за допомогою автоматичного перезавантаження</translation>
 <translation id="2127599828444728326">Дозволити сповіщення на цих сайтах</translation>
 <translation id="2131902621292742709">Затримка затемнення екрана, коли використовується заряд акумулятора</translation>
+<translation id="2134437727173969994">Дозволити блокування екрана</translation>
 <translation id="2137064848866899664">Якщо це правило встановлено, дисплей обертається до вказаної
       орієнтації під час кожного перезапуску та під час першого
       з’єднання після заміни значення правила. Користувач, який
@@ -848,6 +854,7 @@
 <translation id="3967075520570946456">Показувати сторінку привітання під час першого запуску веб-переглядача після оновлення ОС.</translation>
 <translation id="3973371701361892765">Ніколи автоматично не ховати полицю</translation>
 <translation id="3984028218719007910">Визначає, чи <ph name="PRODUCT_OS_NAME" /> зберігає локальні дані облікового запису після виходу. Якщо значення встановлено як "true", <ph name="PRODUCT_OS_NAME" /> не зберігає постійні облікові записи, а всі дані сеансу користувача будуть видалені після виходу. Якщо значення правила встановлено як "false" або правило не налаштовано, пристрій може зберігати (зашифровані) локальні дані користувача.</translation>
+<translation id="3997519162482760140">URL-адреси, які матимуть доступ до пристроїв запису відео на сторінках входу SAML</translation>
 <translation id="4001275826058808087">ІT-адміністратори корпоративних пристроїв можуть використовувати це правило, щоб керувати можливістю користувачів отоварювати пропозиції через реєстрацію ОС Chrome.
 
       Якщо для цього правила встановлено значення "true" або значення не задано, користувачі зможуть отоварювати пропозиції через реєстрацію ОС Chrome.
@@ -873,6 +880,9 @@
           Якщо це правило не налаштовано, використовується період часу за умовчанням.
 
           Значення правила має вказуватися в мілісекундах.</translation>
+<translation id="4115096483386877940">Дозволити блокування екрана.
+
+      Якщо для цього правила вибрано значення "false", користувачі не зможуть блокувати екран (можна буде лише вийти із сеансу користувача). Якщо це правило не налаштовано або для нього вибрано значення "true", користувачі, які ввели пароль і пройшли автентифікацію, зможуть блокувати екран.</translation>
 <translation id="4121350739760194865">Запобігання появи реклами програм на сторінці нової вкладки</translation>
 <translation id="4147054660081653009">Сертифікат клієнта на під’єднання до правила "RemoteAccessHostTokenValidationUrl".
 
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb
index 7f98224..592d648 100644
--- a/components/policy/resources/policy_templates_vi.xtb
+++ b/components/policy/resources/policy_templates_vi.xtb
@@ -154,6 +154,11 @@
 <translation id="1608755754295374538">Các URL sẽ được cấp quyền truy cập thiết bị ghi âm mà không cần phải hiển thị lời nhắc</translation>
 <translation id="1617235075406854669">Bật xóa lịch sử trình duyệt và lịch sử tải xuống</translation>
 <translation id="1617384279878333801">Bật tính năng thêm người trong trình quản lý hồ sơ</translation>
+<translation id="163200210584085447">Các mẫu trong danh sách này sẽ được đối sánh dựa trên nguồn gốc
+      bảo mật của URL yêu cầu.  Nếu tìm thấy mẫu phù hợp, quyền
+      truy cập thiết bị quay video sẽ được cấp trên
+      các trang đăng nhập SAML.  Nếu không tìm thấy mẫu
+      phù hợp, quyền truy cập sẽ tự động bị từ chối.  Các mẫu ký tự đại          diện không được phép.</translation>
 <translation id="1655229863189977773">Đặt kích thước bộ nhớ cache của đĩa theo byte</translation>
 <translation id="166427968280387991">Máy chủ proxy</translation>
 <translation id="1675002386741412210">Hỗ trợ trên:</translation>
@@ -273,6 +278,7 @@
 <translation id="2113068765175018713">Giới hạn thời gian hoạt động của thiết bị bằng cách tự động khởi động lại</translation>
 <translation id="2127599828444728326">Cho phép thông báo trên các trang web này</translation>
 <translation id="2131902621292742709">Độ trễ mờ màn hình khi chạy trên nguồn pin</translation>
+<translation id="2134437727173969994">Cho phép khóa màn hình</translation>
 <translation id="2137064848866899664">Nếu chính sách này được đặt, mỗi màn hình sẽ được xoay theo
       hướng đã chỉ định mỗi khi khởi động lại và lần đầu tiên màn hình được kết nối
       sau khi giá trị chính sách thay đổi. Người dùng có thể thay đổi chế độ
@@ -894,6 +900,7 @@
 <translation id="3967075520570946456">Bật hiển thị trang chào mừng vào lần khởi chạy trình duyệt đầu tiên sau khi nâng cấp hệ điều hành.</translation>
 <translation id="3973371701361892765">Không bao giờ tự động ẩn giá</translation>
 <translation id="3984028218719007910">Xác định liệu <ph name="PRODUCT_OS_NAME" /> có lưu dữ liệu tài khoản trên máy sau khi đăng xuất hay không. Nếu được đặt thành đúng, không có tài khoản lâu dài nào được <ph name="PRODUCT_OS_NAME" /> lưu và tất cả các dữ liệu từ phiên của người dùng sẽ bị hủy bỏ sau khi đăng xuất. Nếu chính sách này được đặt thành sai hoặc không được định cấu hình, thiết bị có thể lưu lại dữ liệu người dùng trên máy (được mã hóa).</translation>
+<translation id="3997519162482760140">URL sẽ được cấp quyền truy cập thiết bị quay video trên các trang đăng nhập SAML</translation>
 <translation id="4001275826058808087">Quản trị viên CNTT của thiết bị doanh nghiệp có thể sử dụng cờ này để kiểm soát xem có cho phép người dùng đổi phiếu mua hàng thông qua Đăng ký Chrome OS hay không.
 
       Nếu chính sách này được đặt thành true hoặc không được đặt, người dùng sẽ có thể đổi phiếu mua hàng thông qua Đăng ký Chrome OS.
@@ -927,6 +934,9 @@
           Khi chính sách này không được đặt, khoảng thời gian mặc định sẽ được sử dụng.
 
           Phải chỉ định giá trị chính sách bằng mili giây.</translation>
+<translation id="4115096483386877940">Cho phép khóa màn hình.
+
+      Nếu chính sách này được đặt thành false, người dùng sẽ không thể khóa màn hình (chỉ có thể đăng xuất khỏi phiên người dùng). Nếu cài đặt này được đặt thành true hoặc không được đặt, người dùng đã xác thực bằng mật khẩu có thể khóa màn hình.</translation>
 <translation id="4121350739760194865">Chặn các quảng cáo ứng dụng xuất hiện trên trang tab mới</translation>
 <translation id="4147054660081653009">Chứng chỉ ứng dụng để kết nối với RemoteAccessHostTokenValidationUrl.
 
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb
index a2b471ff..910da547 100644
--- a/components/policy/resources/policy_templates_zh-CN.xtb
+++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -135,6 +135,7 @@
 <translation id="1608755754295374538">无需提示用户即可使用音频捕获设备的网址</translation>
 <translation id="1617235075406854669">允许删除浏览器历史记录和下载记录</translation>
 <translation id="1617384279878333801">允许通过个人资料管理器添加用户</translation>
+<translation id="163200210584085447">系统会将此列表中的网址格式与请求网址的安全来源进行比对。如果找到了匹配项,系统将允许相应网址通过 SAML 登录页面访问视频捕获设备。如果未找到匹配项,系统将自动拒绝授予访问权限。不允许使用通配符模式。</translation>
 <translation id="1655229863189977773">设置磁盘缓存大小(字节)</translation>
 <translation id="166427968280387991">代理服务器</translation>
 <translation id="1675002386741412210">支持的环境:</translation>
@@ -246,6 +247,7 @@
 <translation id="2113068765175018713">通过自动重启限制设备的正常运行时间</translation>
 <translation id="2127599828444728326">允许在这些网站上显示通知</translation>
 <translation id="2131902621292742709">使用电源供电时的屏幕变暗延迟时间</translation>
+<translation id="2134437727173969994">允许锁定屏幕</translation>
 <translation id="2137064848866899664">如果您设置了此政策,那么每个显示屏在每次重新启动后或在此政策的值更改后首次连入时,都会旋转到指定方向。用户可以在登录后通过“设置”页面更改显示屏旋转角度,但在显示屏下次重新启动后,他们设置的旋转角度将会被此政策的值覆盖。
 
       此政策适用于主要显示屏和所有辅助显示屏。
@@ -814,6 +816,7 @@
 <translation id="3967075520570946456">在操作系统升级后,允许该浏览器首次启动时显示欢迎页面。</translation>
 <translation id="3973371701361892765">一律不自动隐藏任务栏</translation>
 <translation id="3984028218719007910">确定 <ph name="PRODUCT_OS_NAME" />是否要在退出后保留本地帐户数据。如果将此政策设置为 true,<ph name="PRODUCT_OS_NAME" />就不会持续保留帐户,且会在退出后舍弃用户会话中的所有数据。如果未配置此政策或将其设置为 false,设备就会保留(经过加密的)本地用户数据。</translation>
+<translation id="3997519162482760140">可通过 SAML 登录页面访问视频捕获设备的网址</translation>
 <translation id="4001275826058808087">企业设备的IT管理员可以使用此项控制是否允许用户通过注册Chrome操作系统兑换优惠。
 
       如果此政策设为true或未设置,用户将能够通过注册Chrome操作系统兑换优惠。
@@ -839,6 +842,9 @@
           如果未设置此政策,系统将使用默认的时间长度。
 
           指定的政策值应以毫秒为单位。</translation>
+<translation id="4115096483386877940">允许锁定屏幕。
+
+      如果此政策设为 false,用户将无法锁定屏幕(只能退出用户会话)。如果此设置设为 true 或未设置,则使用密码通过身份验证的用户可以锁定屏幕。</translation>
 <translation id="4121350739760194865">阻止在新标签页上显示应用宣传信息</translation>
 <translation id="4147054660081653009">连接到 RemoteAccessHostTokenValidationUrl 时使用的客户端证书。
 
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb
index a161e30..389ecb4ad 100644
--- a/components/policy/resources/policy_templates_zh-TW.xtb
+++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -144,6 +144,11 @@
 <translation id="1608755754295374538">系統會直接授權存取音訊擷取裝置而不需提示的網址</translation>
 <translation id="1617235075406854669">啟用刪除瀏覽器和下載紀錄</translation>
 <translation id="1617384279878333801">允許在設定檔管理員中新增使用者</translation>
+<translation id="163200210584085447">系統會比對這份清單中的模式與要求網址的
+      安全性來源。如果找到相符的結果,系統就會
+      在 SAML 登入網頁授權存取錄影裝置。如果找不到
+      相符的結果,系統會自動拒絕存取權。禁止使用
+      萬用模式。</translation>
 <translation id="1655229863189977773">設定磁碟快取大小 (以位元組為單位)</translation>
 <translation id="166427968280387991">Proxy 伺服器:</translation>
 <translation id="1675002386741412210">支援環境:</translation>
@@ -259,6 +264,7 @@
 <translation id="2113068765175018713">透過自動重新啟動的方式限制裝置的正常運作時間</translation>
 <translation id="2127599828444728326">允許這些網站的通知</translation>
 <translation id="2131902621292742709">在電池供電環境下執行時的螢幕調暗延遲時間</translation>
+<translation id="2134437727173969994">允許鎖定畫面</translation>
 <translation id="2137064848866899664">如果設定這項政策,每次重新啟動時,
       以及在這個政策值發生變更後首次連線時,
       每個畫面都會依指定的角度旋轉。
@@ -842,6 +848,7 @@
 <translation id="3967075520570946456">允許在作業系統升級後首次啟動瀏覽器時顯示歡迎網頁。</translation>
 <translation id="3973371701361892765">永不自動隱藏檔案櫃</translation>
 <translation id="3984028218719007910">決定登出後 <ph name="PRODUCT_OS_NAME" /> 是否要保留本機帳戶資料。如果設為 True,<ph name="PRODUCT_OS_NAME" /> 不會保留任何永久帳戶,並且在登出後會刪除使用者工作階段的所有資料。如果這項政策設為 False 或未設定,裝置會保留 (加密) 本機使用者資料。</translation>
+<translation id="3997519162482760140">可在 SAML 登入網頁獲得錄影裝置存取權的網址</translation>
 <translation id="4001275826058808087">企業裝置的 IT 管理員可使用這個標記來控制是否允許使用者透過註冊 Chrome 作業系統來兌換優惠。
 
       如果將這項政策設為 True 或未設定這項政策,使用者將可透過註冊 Chrome 作業系統來兌換優惠。
@@ -867,6 +874,9 @@
           如果您未設定這項政策,系統會使用預設時間長度。
 
           指定政策值時需以毫秒為單位。</translation>
+<translation id="4115096483386877940">允許鎖定畫面。
+
+      如果將這項政策設為 false,使用者將無法鎖定畫面 (只能登出使用者工作階段)。如果將這項政策設為 true 或不設定這項政策,則使用密碼通過驗證的使用者可以鎖定畫面。</translation>
 <translation id="4121350739760194865">阻止應用程式宣傳資訊在新分頁上顯示</translation>
 <translation id="4147054660081653009">用於連接 RemoteAccessHostTokenValidationUrl 的用戶端憑證。
 
diff --git a/components/safe_browsing_db.gypi b/components/safe_browsing_db.gypi
index 8ceb9cf..bb48ae2d 100644
--- a/components/safe_browsing_db.gypi
+++ b/components/safe_browsing_db.gypi
@@ -49,6 +49,7 @@
         'safe_browsing_db/v4_local_database_manager.h',
         'safe_browsing_db/v4_local_database_manager.cc',
         'safe_browsing_db/v4_store.h',
+        'safe_browsing_db/v4_store.cc',
         'safe_browsing_db/v4_update_protocol_manager.h',
         'safe_browsing_db/v4_update_protocol_manager.cc',
       ],
diff --git a/components/safe_browsing_db/BUILD.gn b/components/safe_browsing_db/BUILD.gn
index 0da73fe..df4dc8fb9 100644
--- a/components/safe_browsing_db/BUILD.gn
+++ b/components/safe_browsing_db/BUILD.gn
@@ -167,6 +167,7 @@
     ":v4_protocol_manager_util",
     ":v4_store",
     "//base",
+    "//content/public/browser",
   ]
 }
 
@@ -221,9 +222,12 @@
 
 source_set("v4_store") {
   sources = [
+    "v4_store.cc",
     "v4_store.h",
   ]
-  deps = []
+  deps = [
+    "//base",
+  ]
 }
 
 source_set("v4_update_protocol_manager") {
diff --git a/components/safe_browsing_db/database_manager.h b/components/safe_browsing_db/database_manager.h
index 9a15bed6e..f560ee3 100644
--- a/components/safe_browsing_db/database_manager.h
+++ b/components/safe_browsing_db/database_manager.h
@@ -131,12 +131,6 @@
   // method must be called on the IO thread.
   virtual bool MatchDownloadWhitelistString(const std::string& str) = 0;
 
-  // Check if the |url| matches any of the full-length hashes from the off-
-  // domain inclusion whitelist. Returns true if there was a match and false
-  // otherwise. To make sure we are conservative, we will return true if an
-  // error occurs.  This method must be called on the IO thread.
-  virtual bool MatchInclusionWhitelistUrl(const GURL& url) = 0;
-
   // Check if |str|, a lowercase DLL file name, matches any of the full-length
   // hashes from the module whitelist.  Returns true if there was a match and
   // false otherwise.  To make sure we are conservative we will return true if
diff --git a/components/safe_browsing_db/remote_database_manager.cc b/components/safe_browsing_db/remote_database_manager.cc
index eb476b7..472cffc 100644
--- a/components/safe_browsing_db/remote_database_manager.cc
+++ b/components/safe_browsing_db/remote_database_manager.cc
@@ -207,12 +207,6 @@
   return true;
 }
 
-bool RemoteSafeBrowsingDatabaseManager::MatchInclusionWhitelistUrl(
-    const GURL& url) {
-  NOTREACHED();
-  return true;
-}
-
 bool RemoteSafeBrowsingDatabaseManager::MatchModuleWhitelistString(
     const std::string& str) {
   NOTREACHED();
diff --git a/components/safe_browsing_db/remote_database_manager.h b/components/safe_browsing_db/remote_database_manager.h
index ffe2dbc8..17ce3011 100644
--- a/components/safe_browsing_db/remote_database_manager.h
+++ b/components/safe_browsing_db/remote_database_manager.h
@@ -61,7 +61,6 @@
   bool MatchMalwareIP(const std::string& ip_address) override;
   bool MatchDownloadWhitelistUrl(const GURL& url) override;
   bool MatchDownloadWhitelistString(const std::string& str) override;
-  bool MatchInclusionWhitelistUrl(const GURL& url) override;
   bool MatchModuleWhitelistString(const std::string& str) override;
   bool CheckResourceUrl(const GURL& url, Client* client) override;
   bool IsMalwareKillSwitchOn() override;
diff --git a/components/safe_browsing_db/test_database_manager.cc b/components/safe_browsing_db/test_database_manager.cc
index 1c3a91e..0e47fe1 100644
--- a/components/safe_browsing_db/test_database_manager.cc
+++ b/components/safe_browsing_db/test_database_manager.cc
@@ -94,12 +94,6 @@
   return true;
 }
 
-bool TestSafeBrowsingDatabaseManager::MatchInclusionWhitelistUrl(
-    const GURL& url) {
-  NOTIMPLEMENTED();
-  return true;
-}
-
 bool TestSafeBrowsingDatabaseManager::MatchModuleWhitelistString(
     const std::string& str) {
   NOTIMPLEMENTED();
diff --git a/components/safe_browsing_db/test_database_manager.h b/components/safe_browsing_db/test_database_manager.h
index ae98b9a1..ec8f818 100644
--- a/components/safe_browsing_db/test_database_manager.h
+++ b/components/safe_browsing_db/test_database_manager.h
@@ -43,7 +43,6 @@
   bool MatchMalwareIP(const std::string& ip_address) override;
   bool MatchDownloadWhitelistUrl(const GURL& url) override;
   bool MatchDownloadWhitelistString(const std::string& str) override;
-  bool MatchInclusionWhitelistUrl(const GURL& url) override;
   bool MatchModuleWhitelistString(const std::string& str) override;
   bool IsMalwareKillSwitchOn() override;
   bool IsCsdWhitelistKillSwitchOn() override;
diff --git a/components/safe_browsing_db/util.cc b/components/safe_browsing_db/util.cc
index 0b77f7f6..822d1293 100644
--- a/components/safe_browsing_db/util.cc
+++ b/components/safe_browsing_db/util.cc
@@ -59,14 +59,13 @@
 const char kExtensionBlacklist[] = "goog-badcrxids-digestvar";
 const char kIPBlacklist[] = "goog-badip-digest256";
 const char kUnwantedUrlList[] = "goog-unwanted-shavar";
-const char kInclusionWhitelist[] = "goog-csdinclusionwhite-sha256";
 const char kModuleWhitelist[] = "goog-whitemodule-digest256";
 const char kResourceBlacklist[] = "goog-badresource-shavar";
 
-const char* kAllLists[11] = {
+const char* kAllLists[10] = {
     kMalwareList,        kPhishingList,       kBinUrlList,  kCsdWhiteList,
     kDownloadWhiteList,  kExtensionBlacklist, kIPBlacklist, kUnwantedUrlList,
-    kInclusionWhitelist, kModuleWhitelist, kResourceBlacklist,
+    kModuleWhitelist,    kResourceBlacklist,
 };
 
 ListType GetListId(const base::StringPiece& name) {
@@ -87,8 +86,6 @@
     id = IPBLACKLIST;
   } else if (name == kUnwantedUrlList) {
     id = UNWANTEDURL;
-  } else if (name == kInclusionWhitelist) {
-    id = INCLUSIONWHITELIST;
   } else if (name == kModuleWhitelist) {
     id = MODULEWHITELIST;
   } else if (name == kResourceBlacklist) {
@@ -125,9 +122,6 @@
     case UNWANTEDURL:
       *list = kUnwantedUrlList;
       break;
-    case INCLUSIONWHITELIST:
-      *list = kInclusionWhitelist;
-      break;
     case MODULEWHITELIST:
       *list = kModuleWhitelist;
     case RESOURCEBLACKLIST:
diff --git a/components/safe_browsing_db/util.h b/components/safe_browsing_db/util.h
index 6748976..78d6bbd2 100644
--- a/components/safe_browsing_db/util.h
+++ b/components/safe_browsing_db/util.h
@@ -132,14 +132,12 @@
 extern const char kIPBlacklist[];
 // SafeBrowsing unwanted URL list.
 extern const char kUnwantedUrlList[];
-// SafeBrowsing off-domain inclusion whitelist list name.
-extern const char kInclusionWhitelist[];
 // SafeBrowsing module whitelist list name.
 extern const char kModuleWhitelist[];
 // Blacklisted resource URLs list name.
 extern const char kResourceBlacklist[];
 /// This array must contain all Safe Browsing lists.
-extern const char* kAllLists[11];
+extern const char* kAllLists[10];
 
 enum ListType {
   INVALID = -1,
@@ -161,7 +159,7 @@
   // See above comment.  Leave 13 available.
   UNWANTEDURL = 14,
   // See above comment.  Leave 15 available.
-  INCLUSIONWHITELIST = 16,
+  // Obsolete INCLUSIONWHITELIST = 16,
   // See above comment.  Leave 17 available.
   MODULEWHITELIST = 18,
   // See above comment. Leave 19 available.
diff --git a/components/safe_browsing_db/v4_database.cc b/components/safe_browsing_db/v4_database.cc
index 328bedc..16f3ec07 100644
--- a/components/safe_browsing_db/v4_database.cc
+++ b/components/safe_browsing_db/v4_database.cc
@@ -2,41 +2,103 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <memory>
+
+#include "base/callback.h"
+#include "base/message_loop/message_loop.h"
 #include "components/safe_browsing_db/v4_database.h"
+#include "content/public/browser/browser_thread.h"
+
+using content::BrowserThread;
 
 namespace safe_browsing {
 
+namespace {
+
+V4Store* CreateStore(
+    const scoped_refptr<base::SequencedTaskRunner>& task_runner,
+    const base::FilePath& store_path) {
+  return new V4Store(task_runner, store_path);
+}
+
+}  // namespace
+
 // static
 V4DatabaseFactory* V4Database::factory_ = NULL;
 
 // static
-// Factory method, should be called on the Safe Browsing sequenced task runner,
-// which is also passed to the function as |db_task_runner|.
-V4Database* V4Database::Create(
+void V4Database::Create(
     const scoped_refptr<base::SequencedTaskRunner>& db_task_runner,
     const base::FilePath& base_path,
-    ListInfoMap list_info_map) {
+    ListInfoMap list_info_map,
+    NewDatabaseReadyCallback callback) {
+  const scoped_refptr<base::SingleThreadTaskRunner>& callback_task_runner =
+      base::MessageLoop::current()->task_runner();
+  db_task_runner->PostTask(
+      FROM_HERE,
+      base::Bind(&V4Database::CreateOnTaskRunner, db_task_runner, base_path,
+                 list_info_map, callback_task_runner, callback));
+}
+
+// static
+void V4Database::CreateOnTaskRunner(
+    const scoped_refptr<base::SequencedTaskRunner>& db_task_runner,
+    const base::FilePath& base_path,
+    ListInfoMap list_info_map,
+    const scoped_refptr<base::SingleThreadTaskRunner>& callback_task_runner,
+    NewDatabaseReadyCallback callback) {
   DCHECK(db_task_runner->RunsTasksOnCurrentThread());
+  DCHECK(!base_path.empty());
+
+  std::unique_ptr<V4Database> v4_database;
   if (!factory_) {
     StoreMap store_map;
-    // TODO(vakh): Populate the store_map using list_suffix_map.
-    return new V4Database(db_task_runner, std::move(store_map));
+
+    for (const auto& list_info : list_info_map) {
+      UpdateListIdentifier update_list_identifier = list_info.first;
+      const base::FilePath::CharType suffix = list_info.second;
+
+      const base::FilePath store_path =
+          base::FilePath(base_path.value() + suffix);
+      (*store_map)[update_list_identifier].reset(
+          CreateStore(db_task_runner, store_path));
+    }
+
+    v4_database.reset(new V4Database(db_task_runner, std::move(store_map)));
   } else {
-    return factory_->CreateV4Database(db_task_runner, base_path, list_info_map);
+    v4_database.reset(
+        factory_->CreateV4Database(db_task_runner, base_path, list_info_map));
   }
+  callback_task_runner->PostTask(
+      FROM_HERE, base::Bind(callback, base::Passed(&v4_database)));
 }
 
 V4Database::V4Database(
     const scoped_refptr<base::SequencedTaskRunner>& db_task_runner,
-    StoreMap store_map) {
+    StoreMap store_map)
+    : db_task_runner_(db_task_runner), store_map_(std::move(store_map)) {
+  DCHECK(db_task_runner->RunsTasksOnCurrentThread());
   // TODO(vakh): Implement skeleton
 }
 
+// static
+void V4Database::Destroy(std::unique_ptr<V4Database> v4_database) {
+  if (v4_database.get()) {
+    v4_database->db_task_runner_->DeleteSoon(FROM_HERE, v4_database.release());
+  }
+}
+
 V4Database::~V4Database() {}
 
 bool V4Database::ResetDatabase() {
-  // TODO(vakh): Delete the stores. Delete the backing files.
-  return true;
+  DCHECK(db_task_runner_->RunsTasksOnCurrentThread());
+  bool reset_success = true;
+  for (const auto& store_id_and_store : *store_map_) {
+    if (!store_id_and_store.second->Reset()) {
+      reset_success = false;
+    }
+  }
+  return reset_success;
 }
 
 }  // namespace safe_browsing
diff --git a/components/safe_browsing_db/v4_database.h b/components/safe_browsing_db/v4_database.h
index 509939e6..f39e82b 100644
--- a/components/safe_browsing_db/v4_database.h
+++ b/components/safe_browsing_db/v4_database.h
@@ -8,6 +8,7 @@
 #include "base/files/file_path.h"
 #include "base/memory/ref_counted.h"
 #include "base/sequenced_task_runner.h"
+#include "base/single_thread_task_runner.h"
 #include "components/safe_browsing_db/v4_protocol_manager_util.h"
 #include "components/safe_browsing_db/v4_store.h"
 
@@ -15,6 +16,9 @@
 
 class V4Database;
 
+typedef base::Callback<void(std::unique_ptr<V4Database>)>
+    NewDatabaseReadyCallback;
+
 typedef const base::hash_map<UpdateListIdentifier,
                              const base::FilePath::CharType>
     ListInfoMap;
@@ -43,18 +47,19 @@
 // The V4Database serves as a single place to manage all the V4Stores.
 class V4Database {
  public:
-  // Factory method for obtaining a V4Database implementation.
-  // It is not thread safe.
-  // The availability of each list is controlled by the one flag on this
-  // method.
-  static V4Database* Create(
+  // Factory method to create a V4Database. It creates the database on the
+  // provided |db_task_runner|. When the database creation is complete, it calls
+  // the NewDatabaseReadyCallback on the same thread as it was called.
+  static void Create(
       const scoped_refptr<base::SequencedTaskRunner>& db_task_runner,
       const base::FilePath& base_path,
-      ListInfoMap list_info_map);
+      ListInfoMap list_info_map,
+      NewDatabaseReadyCallback callback);
 
-  V4Database(
-     const scoped_refptr<base::SequencedTaskRunner>& db_task_runner,
-     StoreMap store_map);
+  // Destroys the provided v4_database on its task_runner since this may be a
+  // long operation.
+  static void Destroy(std::unique_ptr<V4Database> v4_database);
+
   virtual ~V4Database();
 
   // Deletes the current database and creates a new one.
@@ -66,7 +71,25 @@
     factory_ = factory;
   }
 
+ protected:
+  V4Database(const scoped_refptr<base::SequencedTaskRunner>& db_task_runner,
+             StoreMap store_map);
+
  private:
+  // Factory method to create a V4Database. When the database creation is
+  // complete, it calls the NewDatabaseReadyCallback on |callback_task_runner|.
+  static void CreateOnTaskRunner(
+      const scoped_refptr<base::SequencedTaskRunner>& db_task_runner,
+      const base::FilePath& base_path,
+      ListInfoMap list_info_map,
+      const scoped_refptr<base::SingleThreadTaskRunner>& callback_task_runner,
+      NewDatabaseReadyCallback callback);
+
+  const scoped_refptr<base::SequencedTaskRunner> db_task_runner_;
+
+  // Map of UpdateListIdentifier to the V4Store.
+  StoreMap store_map_;
+
   // The factory that controls the creation of V4Database objects.
   // This is used *only* by tests.
   static V4DatabaseFactory* factory_;
diff --git a/components/safe_browsing_db/v4_local_database_manager.cc b/components/safe_browsing_db/v4_local_database_manager.cc
index 376d26ed..eb18755 100644
--- a/components/safe_browsing_db/v4_local_database_manager.cc
+++ b/components/safe_browsing_db/v4_local_database_manager.cc
@@ -6,6 +6,7 @@
 
 #include <vector>
 
+#include "base/callback.h"
 #include "components/safe_browsing_db/safebrowsing.pb.h"
 #include "content/public/browser/browser_thread.h"
 
@@ -13,7 +14,12 @@
 
 namespace safe_browsing {
 
-V4LocalDatabaseManager::V4LocalDatabaseManager() : enabled_(false) {}
+V4LocalDatabaseManager::V4LocalDatabaseManager(const base::FilePath& base_path)
+    : base_path_(base_path), enabled_(false) {
+  DCHECK(!base_path_.empty());
+  DVLOG(1) << "V4LocalDatabaseManager::V4LocalDatabaseManager: "
+           << "base_path_: " << base_path_.AsUTF8Unsafe();
+}
 
 V4LocalDatabaseManager::~V4LocalDatabaseManager() {
   DCHECK(!enabled_);
@@ -89,12 +95,6 @@
   return true;
 }
 
-bool V4LocalDatabaseManager::MatchInclusionWhitelistUrl(const GURL& url) {
-  // TODO(vakh): Implement this skeleton.
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  return true;
-}
-
 bool V4LocalDatabaseManager::MatchModuleWhitelistString(
     const std::string& str) {
   // TODO(vakh): Implement this skeleton.
@@ -123,8 +123,9 @@
 bool V4LocalDatabaseManager::CheckBrowseUrl(const GURL& url, Client* client) {
   // TODO(vakh): Implement this skeleton.
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  if (!enabled_)
+  if (!enabled_) {
     return true;
+  }
 
   // Don't defer the resource load.
   return true;
@@ -141,13 +142,23 @@
     const V4ProtocolConfig& config) {
   SafeBrowsingDatabaseManager::StartOnIOThread(request_context_getter, config);
 
-#if defined(OS_WIN) || defined (OS_LINUX) || defined (OS_MACOSX)
+  SetupUpdateProtocolManager(request_context_getter, config);
+
+  SetupDatabase();
+
+  enabled_ = true;
+}
+
+void V4LocalDatabaseManager::SetupUpdateProtocolManager(
+    net::URLRequestContextGetter* request_context_getter,
+    const V4ProtocolConfig& config) {
+#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_MACOSX)
   // TODO(vakh): Remove this if/endif block when the V4Database is implemented.
   // Filed as http://crbug.com/608075
   UpdateListIdentifier update_list_identifier;
 #if defined(OS_WIN)
   update_list_identifier.platform_type = WINDOWS_PLATFORM;
-#elif defined (OS_LINUX)
+#elif defined(OS_LINUX)
   update_list_identifier.platform_type = LINUX_PLATFORM;
 #else
   update_list_identifier.platform_type = OSX_PLATFORM;
@@ -159,28 +170,75 @@
 
   V4UpdateCallback callback = base::Bind(
       &V4LocalDatabaseManager::UpdateRequestCompleted, base::Unretained(this));
+
   v4_update_protocol_manager_ = V4UpdateProtocolManager::Create(
       request_context_getter, config, current_list_states_, callback);
+}
 
-  enabled_ = true;
+void V4LocalDatabaseManager::SetupDatabase() {
+  DCHECK(!base_path_.empty());
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
+  // Only get a new task runner if there isn't one already. If the service has
+  // previously been started and stopped, a task runner could already exist.
+  if (!task_runner_) {
+    base::SequencedWorkerPool* pool = BrowserThread::GetBlockingPool();
+    task_runner_ = pool->GetSequencedTaskRunnerWithShutdownBehavior(
+        pool->GetSequenceToken(), base::SequencedWorkerPool::SKIP_ON_SHUTDOWN);
+  }
+
+  // TODO(vakh): list_info_map should probably be a hard-coded map.
+  ListInfoMap list_info_map;
+
+  // Do not create the database on the IO thread since this may be an expensive
+  // operation. Instead, do that on the task_runner and when the new database
+  // has been created, swap it out on the IO thread.
+  NewDatabaseReadyCallback db_ready_callback = base::Bind(
+      &V4LocalDatabaseManager::DatabaseReady, base::Unretained(this));
+  V4Database::Create(task_runner_, base_path_, list_info_map,
+                     db_ready_callback);
+}
+
+void V4LocalDatabaseManager::DatabaseReady(
+    std::unique_ptr<V4Database> v4_database) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
+  // The following check is needed because it is possible that by the time the
+  // database is ready, StopOnIOThread has been called.
+  if (enabled_) {
+    v4_database_ = std::move(v4_database);
+
+    // The database is in place. Start fetching updates now.
+    v4_update_protocol_manager_->ScheduleNextUpdate();
+  } else {
+    // Schedule the deletion of v4_database off IO thread.
+    V4Database::Destroy(std::move(v4_database));
+  }
 }
 
 void V4LocalDatabaseManager::StopOnIOThread(bool shutdown) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
+  enabled_ = false;
+
+  // Delete the V4Database. Any pending writes to disk are completed.
+  // This operation happens on the task_runner on which v4_database_ operates
+  // and doesn't block the IO thread.
+  V4Database::Destroy(std::move(v4_database_));
+
   // Delete the V4UpdateProtocolManager.
   // This cancels any in-flight update request.
-  if (v4_update_protocol_manager_.get()) {
-    v4_update_protocol_manager_.reset();
-  }
+  v4_update_protocol_manager_.reset();
 
-  enabled_ = false;
   SafeBrowsingDatabaseManager::StopOnIOThread(shutdown);
 }
 
 void V4LocalDatabaseManager::UpdateRequestCompleted(
     const std::vector<ListUpdateResponse>& responses) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
   // TODO(vakh): Updates downloaded. Store them on disk and record new state.
+  v4_update_protocol_manager_->ScheduleNextUpdate();
 }
 
 }  // namespace safe_browsing
diff --git a/components/safe_browsing_db/v4_local_database_manager.h b/components/safe_browsing_db/v4_local_database_manager.h
index ac8900c..e1ccb77 100644
--- a/components/safe_browsing_db/v4_local_database_manager.h
+++ b/components/safe_browsing_db/v4_local_database_manager.h
@@ -27,7 +27,7 @@
  public:
   // Construct V4LocalDatabaseManager.
   // Must be initialized by calling StartOnIOThread() before using.
-  V4LocalDatabaseManager();
+  V4LocalDatabaseManager(const base::FilePath& base_path);
 
   //
   // SafeBrowsingDatabaseManager implementation
@@ -41,9 +41,8 @@
   bool IsDownloadProtectionEnabled() const override;
   bool CheckBrowseUrl(const GURL& url, Client* client) override;
   void CancelCheck(Client* client) override;
-  void StartOnIOThread(
-      net::URLRequestContextGetter* request_context_getter,
-      const V4ProtocolConfig& config) override;
+  void StartOnIOThread(net::URLRequestContextGetter* request_context_getter,
+                       const V4ProtocolConfig& config) override;
   void StopOnIOThread(bool shutdown) override;
   bool CheckDownloadUrl(const std::vector<GURL>& url_chain,
                         Client* client) override;
@@ -53,7 +52,6 @@
   bool MatchMalwareIP(const std::string& ip_address) override;
   bool MatchDownloadWhitelistUrl(const GURL& url) override;
   bool MatchDownloadWhitelistString(const std::string& str) override;
-  bool MatchInclusionWhitelistUrl(const GURL& url) override;
   bool MatchModuleWhitelistString(const std::string& str) override;
   bool CheckResourceUrl(const GURL& url, Client* client) override;
   bool IsMalwareKillSwitchOn() override;
@@ -66,6 +64,20 @@
   // successfully.
   void UpdateRequestCompleted(const std::vector<ListUpdateResponse>& responses);
 
+  void SetupUpdateProtocolManager(
+      net::URLRequestContextGetter* request_context_getter,
+      const V4ProtocolConfig& config);
+
+  void SetupDatabase();
+
+  void DatabaseReady(std::unique_ptr<V4Database> v4_database);
+
+  void OnCloseDatabase();
+
+  // The base directory under which to create the files that contain hashes.
+  const base::FilePath base_path_;
+
+  // Whether the service is running.
   bool enabled_;
 
   // Stores the current status of the lists to download from the SafeBrowsing
@@ -78,8 +90,12 @@
   std::unique_ptr<V4UpdateProtocolManager> v4_update_protocol_manager_;
 
   // The database that manages the stores containing the hash prefix updates.
+  // All writes to this variable must happen on the IO thread only.
   std::unique_ptr<V4Database> v4_database_;
 
+  // The sequenced task runner for running safe browsing database operations.
+  scoped_refptr<base::SequencedTaskRunner> task_runner_;
+
   friend class base::RefCountedThreadSafe<V4LocalDatabaseManager>;
   DISALLOW_COPY_AND_ASSIGN(V4LocalDatabaseManager);
 };  // class V4LocalDatabaseManager
diff --git a/components/safe_browsing_db/v4_store.cc b/components/safe_browsing_db/v4_store.cc
new file mode 100644
index 0000000..a400172
--- /dev/null
+++ b/components/safe_browsing_db/v4_store.cc
@@ -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.
+
+#include "components/safe_browsing_db/v4_store.h"
+
+namespace safe_browsing {
+
+V4Store::V4Store(const scoped_refptr<base::SequencedTaskRunner>& task_runner,
+                 const base::FilePath& store_path) {}
+
+V4Store::~V4Store() {}
+
+bool V4Store::Reset() {
+  // TODO(vakh): Implement skeleton.
+  return true;
+}
+
+}  // namespace safe_browsing
diff --git a/components/safe_browsing_db/v4_store.h b/components/safe_browsing_db/v4_store.h
index be9ff9d..c1294c7 100644
--- a/components/safe_browsing_db/v4_store.h
+++ b/components/safe_browsing_db/v4_store.h
@@ -5,9 +5,26 @@
 #ifndef COMPONENTS_SAFE_BROWSING_DB_V4_STORE_H_
 #define COMPONENTS_SAFE_BROWSING_DB_V4_STORE_H_
 
+#include "base/files/file_path.h"
+#include "base/memory/ref_counted.h"
+#include "base/sequenced_task_runner.h"
+
 namespace safe_browsing {
 
 class V4Store {
+ public:
+  // The |task_runner| is used to ensure that the operations in this file are
+  // performed on the correct thread. |store_path| specifies the location on
+  // disk for this file.
+  V4Store(const scoped_refptr<base::SequencedTaskRunner>& task_runner,
+          const base::FilePath& store_path);
+  virtual ~V4Store();
+
+  // Reset internal state and delete the backing file.
+  virtual bool Reset();
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(V4Store);
 };
 
 }  // namespace safe_browsing
diff --git a/components/safe_browsing_db/v4_update_protocol_manager.cc b/components/safe_browsing_db/v4_update_protocol_manager.cc
index 71b4ade0..483d57871 100644
--- a/components/safe_browsing_db/v4_update_protocol_manager.cc
+++ b/components/safe_browsing_db/v4_update_protocol_manager.cc
@@ -100,8 +100,9 @@
     const base::hash_map<UpdateListIdentifier, std::string>&
         current_list_states,
     V4UpdateCallback callback) {
-  if (!factory_)
+  if (!factory_) {
     factory_ = new V4UpdateProtocolManagerFactoryImpl();
+  }
   return factory_->CreateProtocolManager(request_context_getter, config,
                                          current_list_states, callback);
 }
@@ -116,7 +117,7 @@
     const V4ProtocolConfig& config,
     const base::hash_map<UpdateListIdentifier, std::string>&
         current_list_states,
-    V4UpdateCallback callback)
+    V4UpdateCallback update_callback)
     : current_list_states_(current_list_states),
       update_error_count_(0),
       update_back_off_mult_(1),
@@ -126,8 +127,11 @@
       config_(config),
       request_context_getter_(request_context_getter),
       url_fetcher_id_(0),
-      callback_(callback) {
-  ScheduleNextUpdate(false /* no back off */);
+      update_callback_(update_callback) {
+  // Do not auto-schedule updates. Let the owner (V4LocalDatabaseManager) do it
+  // when it is ready to process updates.
+  DVLOG(1) << "V4UpdateProtocolManager::V4UpdateProtocolManager: "
+           << "next_update_interval_: " << next_update_interval_;
 }
 
 V4UpdateProtocolManager::~V4UpdateProtocolManager() {}
@@ -136,7 +140,13 @@
   return update_timer_.IsRunning();
 }
 
-void V4UpdateProtocolManager::ScheduleNextUpdate(bool back_off) {
+void V4UpdateProtocolManager::ScheduleNextUpdate() {
+  ScheduleNextUpdateWithBackoff(false);
+}
+
+void V4UpdateProtocolManager::ScheduleNextUpdateWithBackoff(bool back_off) {
+  DCHECK(CalledOnValidThread());
+
   // TODO(vakh): Set disable_auto_update correctly using the command line
   // switch.
   if (config_.disable_auto_update) {
@@ -154,11 +164,24 @@
 base::TimeDelta V4UpdateProtocolManager::GetNextUpdateInterval(bool back_off) {
   DCHECK(CalledOnValidThread());
   DCHECK(next_update_interval_ > base::TimeDelta());
+
   base::TimeDelta next = next_update_interval_;
   if (back_off) {
     next = V4ProtocolManagerUtil::GetNextBackOffInterval(
         &update_error_count_, &update_back_off_mult_);
   }
+
+  if (!last_response_time_.is_null()) {
+    // The callback spent some time updating the database, including disk I/O.
+    // Do not wait that extra time.
+    base::TimeDelta callback_time = Time::Now() - last_response_time_;
+    if (callback_time < next) {
+      next -= callback_time;
+    } else {
+      // If the callback took too long, schedule the next update with no delay.
+      next = base::TimeDelta();
+    }
+  }
   DVLOG(1) << "V4UpdateProtocolManager::GetNextUpdateInterval: "
            << "next_interval: " << next;
   return next;
@@ -168,6 +191,7 @@
     base::TimeDelta interval) {
   DCHECK(CalledOnValidThread());
   DCHECK(interval >= base::TimeDelta());
+
   // Unschedule any current timer.
   update_timer_.Stop();
   update_timer_.Start(FROM_HERE, interval, this,
@@ -252,8 +276,8 @@
     return;
   }
 
-  std::string req_base64 = GetBase64SerializedUpdateRequestProto(
-      current_list_states_);
+  std::string req_base64 =
+      GetBase64SerializedUpdateRequestProto(current_list_states_);
   GURL update_url = GetUpdateUrl(req_base64);
 
   request_.reset(net::URLFetcher::Create(url_fetcher_id_++, update_url,
@@ -278,10 +302,10 @@
   V4ProtocolManagerUtil::RecordHttpResponseOrErrorCode(
       "SafeBrowsing.V4UpdateHttpResponseOrErrorCode", status, response_code);
 
+  last_response_time_ = Time::Now();
+
   std::vector<ListUpdateResponse> list_update_responses;
-  bool back_off;
   if (status.is_success() && response_code == net::HTTP_OK) {
-    back_off = false;
     RecordUpdateResult(V4OperationResult::STATUS_200);
     ResetUpdateErrors();
     std::string data;
@@ -290,11 +314,14 @@
       list_update_responses.clear();
       RecordUpdateResult(V4OperationResult::PARSE_ERROR);
     }
+    request_.reset();
+
     // Invoke the callback with list_update_responses.
     // The caller should update its state now, based on list_update_responses.
-    callback_.Run(list_update_responses);
+    // The callback must call ScheduleNextUpdate() at the end to resume
+    // downloading updates.
+    update_callback_.Run(list_update_responses);
   } else {
-    back_off = true;
     DVLOG(1) << "SafeBrowsing GetEncodedUpdates request for: "
              << source->GetURL() << " failed with error: " << status.error()
              << " and response code: " << response_code;
@@ -306,9 +333,10 @@
     }
     // TODO(vakh): Figure out whether it is just a network error vs backoff vs
     // another condition and RecordUpdateResult more accurately.
+
+    request_.reset();
+    ScheduleNextUpdateWithBackoff(true);
   }
-  request_.reset();
-  ScheduleNextUpdate(back_off);
 }
 
 GURL V4UpdateProtocolManager::GetUpdateUrl(
diff --git a/components/safe_browsing_db/v4_update_protocol_manager.h b/components/safe_browsing_db/v4_update_protocol_manager.h
index 4b924a85..92be606 100644
--- a/components/safe_browsing_db/v4_update_protocol_manager.h
+++ b/components/safe_browsing_db/v4_update_protocol_manager.h
@@ -68,6 +68,9 @@
   // net::URLFetcherDelegate interface.
   void OnURLFetchComplete(const net::URLFetcher* source) override;
 
+  // Schedule the next update without backoff.
+  void ScheduleNextUpdate();
+
  protected:
   // Constructs a V4UpdateProtocolManager that issues network requests using
   // |request_context_getter|.
@@ -124,8 +127,8 @@
   // Returns whether another update is currently scheduled.
   bool IsUpdateScheduled() const;
 
-  // Schedule the next update, considering whether we are in backoff.
-  void ScheduleNextUpdate(bool back_off);
+  // Schedule the next update with backoff specified.
+  void ScheduleNextUpdateWithBackoff(bool back_off);
 
   // Schedule the next update, after the given interval.
   void ScheduleNextUpdateAfterInterval(base::TimeDelta interval);
@@ -165,7 +168,7 @@
   int url_fetcher_id_;
 
   // The callback that's called when GetUpdates completes.
-  V4UpdateCallback callback_;
+  V4UpdateCallback update_callback_;
 
   // The pending update request. The request must be canceled when the object is
   // destroyed.
@@ -174,6 +177,8 @@
   // Timer to setup the next update request.
   base::OneShotTimer update_timer_;
 
+  base::Time last_response_time_;
+
   DISALLOW_COPY_AND_ASSIGN(V4UpdateProtocolManager);
 };
 
diff --git a/components/safe_browsing_db/v4_update_protocol_manager_unittest.cc b/components/safe_browsing_db/v4_update_protocol_manager_unittest.cc
index b981672..0147225 100644
--- a/components/safe_browsing_db/v4_update_protocol_manager_unittest.cc
+++ b/components/safe_browsing_db/v4_update_protocol_manager_unittest.cc
@@ -242,7 +242,7 @@
   // No error, back off multiplier is unchanged.
   EXPECT_EQ(0ul, pm->update_error_count_);
   EXPECT_EQ(1ul, pm->update_back_off_mult_);
-  EXPECT_TRUE(pm->IsUpdateScheduled());
+  EXPECT_FALSE(pm->IsUpdateScheduled());
 }
 
 TEST_F(V4UpdateProtocolManagerTest, TestGetUpdatesWithOneBackoff) {
@@ -295,7 +295,7 @@
   // No error, back off multiplier is unchanged.
   EXPECT_EQ(0ul, pm->update_error_count_);
   EXPECT_EQ(1ul, pm->update_back_off_mult_);
-  EXPECT_TRUE(pm->IsUpdateScheduled());
+  EXPECT_FALSE(pm->IsUpdateScheduled());
 }
 
 }  // namespace safe_browsing
diff --git a/components/safe_json/public/interfaces/OWNERS b/components/safe_json/public/interfaces/OWNERS
new file mode 100644
index 0000000..9e621796
--- /dev/null
+++ b/components/safe_json/public/interfaces/OWNERS
@@ -0,0 +1,13 @@
+# Changes to Mojo interfaces require a security review to avoid
+# introducing new sandbox escapes.
+per-file *.mojom=set noparent
+per-file *.mojom=dcheng@chromium.org
+per-file *.mojom=inferno@chromium.org
+per-file *.mojom=jln@chromium.org
+per-file *.mojom=jschuh@chromium.org
+per-file *.mojom=kenrb@chromium.org
+per-file *.mojom=mkwst@chromium.org
+per-file *.mojom=nasko@chromium.org
+per-file *.mojom=palmer@chromium.org
+per-file *.mojom=tsepez@chromium.org
+per-file *.mojom=wfh@chromium.org
diff --git a/components/scheduler/renderer/renderer_scheduler.cc b/components/scheduler/renderer/renderer_scheduler.cc
index aa5be006..bb56c1c7 100644
--- a/components/scheduler/renderer/renderer_scheduler.cc
+++ b/components/scheduler/renderer/renderer_scheduler.cc
@@ -65,14 +65,16 @@
       return "none";
     case UseCase::COMPOSITOR_GESTURE:
       return "compositor_gesture";
-    case UseCase::MAIN_THREAD_GESTURE:
-      return "main_thread_gesture";
+    case UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING:
+      return "main_thread_custom_input_handling";
     case UseCase::SYNCHRONIZED_GESTURE:
       return "synchronized_gesture";
     case UseCase::TOUCHSTART:
       return "touchstart";
     case UseCase::LOADING:
       return "loading";
+    case UseCase::MAIN_THREAD_GESTURE:
+      return "main_thread_gesture";
     default:
       NOTREACHED();
       return nullptr;
diff --git a/components/scheduler/renderer/renderer_scheduler.h b/components/scheduler/renderer/renderer_scheduler.h
index 51ed4b18..c6116ea 100644
--- a/components/scheduler/renderer/renderer_scheduler.h
+++ b/components/scheduler/renderer/renderer_scheduler.h
@@ -45,12 +45,29 @@
 
   // Keep RendererScheduler::UseCaseToString in sync with this enum.
   enum class UseCase {
+    // No active use case detected.
     NONE,
+    // A continuous gesture (e.g., scroll, pinch) which is being driven by the
+    // compositor thread.
     COMPOSITOR_GESTURE,
-    MAIN_THREAD_GESTURE,
-    SYNCHRONIZED_GESTURE,  // Both threads in the critical path.
+    // An unspecified touch gesture which is being handled by the main thread.
+    // Note that since we don't have a full view of the use case, we should be
+    // careful to prioritize all work equally.
+    MAIN_THREAD_CUSTOM_INPUT_HANDLING,
+    // A continuous gesture (e.g., scroll, pinch) which is being driven by the
+    // compositor thread but also observed by the main thread. An example is
+    // synchronized scrolling where a scroll listener on the main thread changes
+    // page layout based on the current scroll position.
+    SYNCHRONIZED_GESTURE,
+    // A gesture has recently started and we are about to run main thread touch
+    // listeners to find out the actual gesture type. To minimize touch latency,
+    // only input handling work should run in this state.
     TOUCHSTART,
+    // The page is loading.
     LOADING,
+    // A continuous gesture (e.g., scroll) which is being handled by the main
+    // thread.
+    MAIN_THREAD_GESTURE,
     // Must be the last entry.
     USE_CASE_COUNT,
     FIRST_USE_CASE = NONE,
diff --git a/components/scheduler/renderer/renderer_scheduler_impl.cc b/components/scheduler/renderer/renderer_scheduler_impl.cc
index 4606081..135cdabc 100644
--- a/components/scheduler/renderer/renderer_scheduler_impl.cc
+++ b/components/scheduler/renderer/renderer_scheduler_impl.cc
@@ -140,6 +140,7 @@
       in_idle_period(false),
       begin_main_frame_on_critical_path(false),
       last_gesture_was_compositor_driven(false),
+      default_gesture_prevented(true),
       have_seen_touchstart(false) {}
 
 RendererSchedulerImpl::AnyThread::~AnyThread() {}
@@ -493,6 +494,9 @@
         // yet where the gesture will run.
         AnyThread().last_gesture_was_compositor_driven = false;
         AnyThread().have_seen_touchstart = true;
+        // Assume the default gesture is prevented until we see evidence
+        // otherwise.
+        AnyThread().default_gesture_prevented = true;
         break;
 
       case blink::WebInputEvent::TouchMove:
@@ -515,6 +519,7 @@
         AnyThread().last_gesture_was_compositor_driven =
             input_event_state == InputEventState::EVENT_CONSUMED_BY_COMPOSITOR;
         AnyThread().awaiting_touch_start_response = false;
+        AnyThread().default_gesture_prevented = false;
         break;
 
       case blink::WebInputEvent::GestureFlingCancel:
@@ -569,6 +574,7 @@
   return MainThreadOnly().touchstart_expected_soon ||
          use_case == UseCase::TOUCHSTART ||
          use_case == UseCase::MAIN_THREAD_GESTURE ||
+         use_case == UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING ||
          use_case == UseCase::SYNCHRONIZED_GESTURE;
 }
 
@@ -589,6 +595,7 @@
       return MainThreadOnly().touchstart_expected_soon;
 
     case UseCase::MAIN_THREAD_GESTURE:
+    case UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING:
     case UseCase::SYNCHRONIZED_GESTURE:
       return compositor_task_runner_->HasPendingImmediateWork() ||
              MainThreadOnly().touchstart_expected_soon;
@@ -739,16 +746,29 @@
       }
       break;
 
-    case UseCase::MAIN_THREAD_GESTURE:
-      // In main thread gestures we don't have perfect knowledge about which
-      // things we should be prioritizing, so we don't attempt to block
-      // expensive tasks because we don't know whether they were integral to the
-      // page's functionality or not.
+    case UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING:
+      // In main thread input handling scenarios we don't have perfect knowledge
+      // about which things we should be prioritizing, so we don't attempt to
+      // block expensive tasks because we don't know whether they were integral
+      // to the page's functionality or not.
       new_policy.compositor_queue_policy.priority =
           main_thread_compositing_is_fast ? TaskQueue::HIGH_PRIORITY
                                           : TaskQueue::NORMAL_PRIORITY;
       break;
 
+    case UseCase::MAIN_THREAD_GESTURE:
+      // A main thread gesture is for example a scroll gesture which is handled
+      // by the main thread. Since we know the established gesture type, we can
+      // be a little more aggressive about prioritizing compositing and input
+      // handling over other tasks.
+      new_policy.compositor_queue_policy.priority = TaskQueue::HIGH_PRIORITY;
+      if (touchstart_expected_soon) {
+        expensive_task_policy = ExpensiveTaskPolicy::BLOCK;
+      } else {
+        expensive_task_policy = ExpensiveTaskPolicy::THROTTLE;
+      }
+      break;
+
     case UseCase::TOUCHSTART:
       new_policy.compositor_queue_policy.priority = TaskQueue::HIGH_PRIORITY;
       new_policy.loading_queue_policy.is_enabled = false;
@@ -911,12 +931,15 @@
     }
 
     // Yes a gesture has been established.  Based on how the gesture is handled
-    // we need to choose between one of three use cases:
+    // we need to choose between one of four use cases:
     // 1. COMPOSITOR_GESTURE where the gesture is processed only on the
     //    compositor thread.
     // 2. MAIN_THREAD_GESTURE where the gesture is processed only on the main
     //    thread.
-    // 3. SYNCHRONIZED_GESTURE where the gesture is processed on both threads.
+    // 3. MAIN_THREAD_CUSTOM_INPUT_HANDLING where the main thread processes a
+    //    stream of input events and has prevented a default gesture from being
+    //    started.
+    // 4. SYNCHRONIZED_GESTURE where the gesture is processed on both threads.
     // TODO(skyostil): Consider removing in_idle_period_ and
     // HadAnIdlePeriodRecently() unless we need them here.
     if (AnyThread().last_gesture_was_compositor_driven) {
@@ -926,7 +949,11 @@
         return UseCase::COMPOSITOR_GESTURE;
       }
     }
-    return UseCase::MAIN_THREAD_GESTURE;
+    if (AnyThread().default_gesture_prevented) {
+      return UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING;
+    } else {
+      return UseCase::MAIN_THREAD_GESTURE;
+    }
   }
 
   // TODO(alexclarke): return UseCase::LOADING if signals suggest the system is
@@ -943,6 +970,7 @@
     case UseCase::NONE:
       return base::TimeDelta::FromMilliseconds(kRailsResponseTimeMillis);
 
+    case UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING:
     case UseCase::MAIN_THREAD_GESTURE:
     case UseCase::SYNCHRONIZED_GESTURE:
       return MainThreadOnly().idle_time_estimator.GetExpectedIdleDuration(
@@ -1096,6 +1124,8 @@
                     AnyThread().begin_main_frame_on_critical_path);
   state->SetBoolean("last_gesture_was_compositor_driven",
                     AnyThread().last_gesture_was_compositor_driven);
+  state->SetBoolean("default_gesture_prevented",
+                    AnyThread().default_gesture_prevented);
   state->SetDouble("expected_loading_task_duration",
                    MainThreadOnly()
                        .loading_task_cost_estimator.expected_task_duration()
diff --git a/components/scheduler/renderer/renderer_scheduler_impl.h b/components/scheduler/renderer/renderer_scheduler_impl.h
index f765eaa..2ec8887 100644
--- a/components/scheduler/renderer/renderer_scheduler_impl.h
+++ b/components/scheduler/renderer/renderer_scheduler_impl.h
@@ -362,6 +362,7 @@
     bool in_idle_period;
     bool begin_main_frame_on_critical_path;
     bool last_gesture_was_compositor_driven;
+    bool default_gesture_prevented;
     bool have_seen_touchstart;
   };
 
diff --git a/components/scheduler/renderer/renderer_scheduler_impl_unittest.cc b/components/scheduler/renderer/renderer_scheduler_impl_unittest.cc
index 09120d6..de5aefc 100644
--- a/components/scheduler/renderer/renderer_scheduler_impl_unittest.cc
+++ b/components/scheduler/renderer/renderer_scheduler_impl_unittest.cc
@@ -193,7 +193,7 @@
     std::string use_case =
         RendererScheduler::UseCaseToString(MainThreadOnly().current_use_case);
     if (MainThreadOnly().touchstart_expected_soon) {
-      use_cases_.push_back(use_case + " scroll expected");
+      use_cases_.push_back(use_case + " touchstart expected");
     } else {
       use_cases_.push_back(use_case);
     }
@@ -345,13 +345,13 @@
     if (touch_event_policy == TouchEventPolicy::SEND_TOUCH_START) {
       scheduler_->DidHandleInputEventOnCompositorThread(
           FakeInputEvent(blink::WebInputEvent::TouchStart),
-          RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR);
+          RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD);
       scheduler_->DidHandleInputEventOnCompositorThread(
           FakeInputEvent(blink::WebInputEvent::TouchMove),
-          RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR);
+          RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD);
       scheduler_->DidHandleInputEventOnCompositorThread(
           FakeInputEvent(blink::WebInputEvent::TouchMove),
-          RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR);
+          RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD);
     }
     scheduler_->DidHandleInputEventOnCompositorThread(
         FakeInputEvent(blink::WebInputEvent::GestureScrollBegin),
@@ -406,7 +406,7 @@
 
     // Main thread gesture policy update.
     EXPECT_TRUE(scheduler_->PolicyNeedsUpdateForTesting());
-    EXPECT_EQ(UseCase::MAIN_THREAD_GESTURE,
+    EXPECT_EQ(UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING,
               ForceUpdatePolicyAndGetCurrentUseCase());
     EXPECT_FALSE(scheduler_->PolicyNeedsUpdateForTesting());
 
@@ -448,13 +448,15 @@
       scheduler_->DidHandleInputEventOnMainThread(
           FakeInputEvent(blink::WebInputEvent::TouchMove));
     }
-    scheduler_->DidHandleInputEventOnCompositorThread(
-        FakeInputEvent(gesture_type),
-        RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD);
-    scheduler_->DidHandleInputEventOnMainThread(FakeInputEvent(gesture_type));
+    if (gesture_type != blink::WebInputEvent::Undefined) {
+      scheduler_->DidHandleInputEventOnCompositorThread(
+          FakeInputEvent(gesture_type),
+          RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD);
+      scheduler_->DidHandleInputEventOnMainThread(FakeInputEvent(gesture_type));
+    }
   }
 
-  void SimulateMainThreadGestureCompositorTask(
+  void SimulateMainThreadInputHandlingCompositorTask(
       base::TimeDelta begin_main_frame_duration) {
     scheduler_->DidHandleInputEventOnCompositorThread(
         FakeInputEvent(blink::WebInputEvent::TouchMove),
@@ -877,7 +879,8 @@
               testing::ElementsAre(std::string("C1"), std::string("C2"),
                                    std::string("L1"), std::string("D1"),
                                    std::string("D2"), std::string("I1")));
-  EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_GESTURE, CurrentUseCase());
+  EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING,
+            CurrentUseCase());
 }
 
 TEST_F(RendererSchedulerImplTest,
@@ -957,7 +960,8 @@
               testing::ElementsAre(std::string("C1"), std::string("C2"),
                                    std::string("L1"), std::string("D1"),
                                    std::string("D2"), std::string("I1")));
-  EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_GESTURE, CurrentUseCase());
+  EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING,
+            CurrentUseCase());
   scheduler_->DidHandleInputEventOnMainThread(
       FakeInputEvent(blink::WebInputEvent::GestureFlingStart));
 }
@@ -975,7 +979,8 @@
               testing::ElementsAre(std::string("C1"), std::string("C2"),
                                    std::string("L1"), std::string("D1"),
                                    std::string("D2"), std::string("I1")));
-  EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_GESTURE, CurrentUseCase());
+  EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING,
+            CurrentUseCase());
   scheduler_->DidHandleInputEventOnMainThread(
       FakeInputEvent(blink::WebInputEvent::GestureFlingStart));
 }
@@ -1015,14 +1020,15 @@
               testing::ElementsAre(std::string("C1"), std::string("T1")));
 }
 
-TEST_F(RendererSchedulerImplTest, ExpensiveTimersDoRunWhenMainThreadScrolling) {
+TEST_F(RendererSchedulerImplTest,
+       ExpensiveTimersDontRunWhenMainThreadScrolling) {
   std::vector<std::string> run_order;
 
   scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true);
   SimulateExpensiveTasks(timer_task_runner_);
   DoMainFrame();
   SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START,
-                                 blink::WebInputEvent::GestureScrollBegin);
+                                 blink::WebInputEvent::GestureScrollUpdate);
 
   PostTestTasks(&run_order, "C1 T1");
 
@@ -1030,6 +1036,26 @@
   EXPECT_FALSE(TouchStartExpectedSoon());
   EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_GESTURE, CurrentUseCase());
 
+  EXPECT_THAT(run_order, testing::ElementsAre(std::string("C1")));
+}
+
+TEST_F(RendererSchedulerImplTest,
+       ExpensiveTimersDoRunWhenMainThreadInputHandling) {
+  std::vector<std::string> run_order;
+
+  scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true);
+  SimulateExpensiveTasks(timer_task_runner_);
+  DoMainFrame();
+  SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START,
+                                 blink::WebInputEvent::Undefined);
+
+  PostTestTasks(&run_order, "C1 T1");
+
+  RunUntilIdle();
+  EXPECT_FALSE(TouchStartExpectedSoon());
+  EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING,
+            CurrentUseCase());
+
   EXPECT_THAT(run_order,
               testing::ElementsAre(std::string("C1"), std::string("T1")));
 }
@@ -1048,7 +1074,8 @@
 
   RunUntilIdle();
   EXPECT_FALSE(TouchStartExpectedSoon());
-  EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_GESTURE, CurrentUseCase());
+  EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING,
+            CurrentUseCase());
 
   EXPECT_THAT(run_order,
               testing::ElementsAre(std::string("C1"), std::string("T1")));
@@ -1280,7 +1307,8 @@
               testing::ElementsAre(std::string("C1"), std::string("C2"),
                                    std::string("D1"), std::string("D2"),
                                    std::string("I1")));
-  EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_GESTURE, CurrentUseCase());
+  EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING,
+            CurrentUseCase());
 }
 
 TEST_F(RendererSchedulerImplTest,
@@ -1361,7 +1389,7 @@
        TestCompositorPolicyEnds_MainThreadHandlesInput) {
   SimulateMainThreadGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START,
                                  blink::WebInputEvent::GestureScrollBegin);
-  EXPECT_EQ(UseCase::MAIN_THREAD_GESTURE,
+  EXPECT_EQ(UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING,
             ForceUpdatePolicyAndGetCurrentUseCase());
 
   clock_->Advance(base::TimeDelta::FromMilliseconds(1000));
@@ -1542,7 +1570,7 @@
       FakeInputEvent(blink::WebInputEvent::GestureFlingStart),
       RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD);
   RunUntilIdle();
-  EXPECT_EQ(UseCase::MAIN_THREAD_GESTURE, CurrentUseCase());
+  EXPECT_EQ(UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, CurrentUseCase());
 
   // Simulate the input event being queued for a very long time. The compositor
   // task we post here represents the enqueued input task.
@@ -1553,7 +1581,7 @@
 
   // Even though we exceeded the input priority escalation period, we should
   // still be in main thread gesture since the input remains queued.
-  EXPECT_EQ(UseCase::MAIN_THREAD_GESTURE, CurrentUseCase());
+  EXPECT_EQ(UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, CurrentUseCase());
 
   // After the escalation period ends we should go back into normal mode.
   clock_->Advance(priority_escalation_after_input_duration() * 2);
@@ -1739,7 +1767,7 @@
   SimulateCompositorGestureStart(TouchEventPolicy::SEND_TOUCH_START);
 
   // We expect the first call to IsHighPriorityWorkAnticipated to be called
-  // after recieving an input event (but before the UpdateTask was processed) to
+  // after receiving an input event (but before the UpdateTask was processed) to
   // call UpdatePolicy.
   EXPECT_EQ(1, mock_scheduler_->update_policy_count_);
   scheduler_->IsHighPriorityWorkAnticipated();
@@ -1756,18 +1784,31 @@
   scheduler_->DidHandleInputEventOnCompositorThread(
       FakeInputEvent(blink::WebInputEvent::GestureScrollEnd),
       RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR);
+  scheduler_->DidHandleInputEventOnCompositorThread(
+      FakeInputEvent(blink::WebInputEvent::TouchEnd),
+      RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD);
+
+  scheduler_->DidHandleInputEventOnMainThread(
+      FakeInputEvent(blink::WebInputEvent::TouchStart));
+  scheduler_->DidHandleInputEventOnMainThread(
+      FakeInputEvent(blink::WebInputEvent::TouchMove));
+  scheduler_->DidHandleInputEventOnMainThread(
+      FakeInputEvent(blink::WebInputEvent::TouchMove));
+  scheduler_->DidHandleInputEventOnMainThread(
+      FakeInputEvent(blink::WebInputEvent::TouchEnd));
 
   EXPECT_EQ(2, mock_scheduler_->update_policy_count_);
 
   // We expect both the urgent and the delayed updates to run in addition to the
   // earlier updated cause by IsHighPriorityWorkAnticipated, a final update
-  // transitions from 'not_scrolling scroll expected' to 'not_scrolling'.
+  // transitions from 'not_scrolling touchstart expected' to 'not_scrolling'.
   RunUntilIdle();
-  EXPECT_THAT(mock_scheduler_->use_cases_,
-              testing::ElementsAre(
-                  std::string("none"), std::string("compositor_gesture"),
-                  std::string("compositor_gesture scroll expected"),
-                  std::string("none scroll expected"), std::string("none")));
+  EXPECT_THAT(
+      mock_scheduler_->use_cases_,
+      testing::ElementsAre(
+          std::string("none"), std::string("compositor_gesture"),
+          std::string("compositor_gesture touchstart expected"),
+          std::string("none touchstart expected"), std::string("none")));
 }
 
 class RendererSchedulerImplWithMessageLoopTest
@@ -2301,7 +2342,7 @@
 
   SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START,
                                  blink::WebInputEvent::GestureScrollBegin);
-  EXPECT_EQ(UseCase::MAIN_THREAD_GESTURE,
+  EXPECT_EQ(UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING,
             ForceUpdatePolicyAndGetCurrentUseCase());
 
   scheduler_->DidHandleInputEventOnCompositorThread(
@@ -2526,7 +2567,8 @@
   SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START,
                                  blink::WebInputEvent::GestureScrollBegin);
   RunUntilIdle();
-  EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_GESTURE, CurrentUseCase());
+  EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING,
+            CurrentUseCase());
 
   EXPECT_TRUE(LoadingTasksSeemExpensive());
   EXPECT_FALSE(TimerTasksSeemExpensive());
@@ -2549,10 +2591,10 @@
     scheduler_->WillBeginFrame(begin_frame_args);
 
     compositor_task_runner_->PostTask(
-        FROM_HERE,
-        base::Bind(
-            &RendererSchedulerImplTest::SimulateMainThreadGestureCompositorTask,
-            base::Unretained(this), base::TimeDelta::FromMilliseconds(8)));
+        FROM_HERE, base::Bind(&RendererSchedulerImplTest::
+                                  SimulateMainThreadInputHandlingCompositorTask,
+                              base::Unretained(this),
+                              base::TimeDelta::FromMilliseconds(8)));
     timer_task_runner_->PostTask(
         FROM_HERE, base::Bind(&RendererSchedulerImplTest::SimulateTimerTask,
                               base::Unretained(this),
@@ -2560,7 +2602,8 @@
 
     RunUntilIdle();
     EXPECT_TRUE(simulate_timer_task_ran_) << " i = " << i;
-    EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_GESTURE, CurrentUseCase())
+    EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING,
+              CurrentUseCase())
         << " i = " << i;
     EXPECT_FALSE(LoadingTasksSeemExpensive()) << " i = " << i;
     EXPECT_FALSE(TimerTasksSeemExpensive()) << " i = " << i;
@@ -2611,7 +2654,7 @@
 }
 
 TEST_F(RendererSchedulerImplTest,
-       ExpensiveTimer_NotBlocked_UseCase_MAIN_THREAD_GESTURE) {
+       ExpensiveTimer_NotBlocked_UseCase_MAIN_THREAD_CUSTOM_INPUT_HANDLING) {
   scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true);
   SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START,
                                  blink::WebInputEvent::TouchMove);
@@ -2626,17 +2669,18 @@
     scheduler_->WillBeginFrame(begin_frame_args);
 
     compositor_task_runner_->PostTask(
-        FROM_HERE,
-        base::Bind(
-            &RendererSchedulerImplTest::SimulateMainThreadGestureCompositorTask,
-            base::Unretained(this), base::TimeDelta::FromMilliseconds(8)));
+        FROM_HERE, base::Bind(&RendererSchedulerImplTest::
+                                  SimulateMainThreadInputHandlingCompositorTask,
+                              base::Unretained(this),
+                              base::TimeDelta::FromMilliseconds(8)));
     timer_task_runner_->PostTask(
         FROM_HERE, base::Bind(&RendererSchedulerImplTest::SimulateTimerTask,
                               base::Unretained(this),
                               base::TimeDelta::FromMilliseconds(10)));
 
     RunUntilIdle();
-    EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_GESTURE, CurrentUseCase())
+    EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING,
+              CurrentUseCase())
         << " i = " << i;
     EXPECT_FALSE(LoadingTasksSeemExpensive()) << " i = " << i;
     if (i == 0) {
@@ -2680,6 +2724,8 @@
 
 TEST_F(RendererSchedulerImplTest,
        EstimateLongestJankFreeTaskDuration_UseCase_MAIN_THREAD_GESTURE) {
+  SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START,
+                                 blink::WebInputEvent::GestureScrollUpdate);
   cc::BeginFrameArgs begin_frame_args = cc::BeginFrameArgs::Create(
       BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(),
       base::TimeDelta::FromMilliseconds(16), cc::BeginFrameArgs::NORMAL);
@@ -2688,9 +2734,9 @@
 
   compositor_task_runner_->PostTask(
       FROM_HERE,
-      base::Bind(
-          &RendererSchedulerImplTest::SimulateMainThreadGestureCompositorTask,
-          base::Unretained(this), base::TimeDelta::FromMilliseconds(5)));
+      base::Bind(&RendererSchedulerImplTest::
+                     SimulateMainThreadInputHandlingCompositorTask,
+                 base::Unretained(this), base::TimeDelta::FromMilliseconds(5)));
 
   RunUntilIdle();
   EXPECT_EQ(UseCase::MAIN_THREAD_GESTURE, CurrentUseCase());
@@ -2700,6 +2746,29 @@
             scheduler_->EstimateLongestJankFreeTaskDuration());
 }
 
+TEST_F(
+    RendererSchedulerImplTest,
+    EstimateLongestJankFreeTaskDuration_UseCase_MAIN_THREAD_CUSTOM_INPUT_HANDLING) {
+  cc::BeginFrameArgs begin_frame_args = cc::BeginFrameArgs::Create(
+      BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(),
+      base::TimeDelta::FromMilliseconds(16), cc::BeginFrameArgs::NORMAL);
+  begin_frame_args.on_critical_path = false;
+  scheduler_->WillBeginFrame(begin_frame_args);
+
+  compositor_task_runner_->PostTask(
+      FROM_HERE,
+      base::Bind(&RendererSchedulerImplTest::
+                     SimulateMainThreadInputHandlingCompositorTask,
+                 base::Unretained(this), base::TimeDelta::FromMilliseconds(5)));
+
+  RunUntilIdle();
+  EXPECT_EQ(UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, CurrentUseCase());
+
+  // 16ms frame - 5ms compositor work = 11ms for other stuff.
+  EXPECT_EQ(base::TimeDelta::FromMilliseconds(11),
+            scheduler_->EstimateLongestJankFreeTaskDuration());
+}
+
 TEST_F(RendererSchedulerImplTest,
        EstimateLongestJankFreeTaskDuration_UseCase_SYNCHRONIZED_GESTURE) {
   SimulateCompositorGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START);
@@ -2911,8 +2980,8 @@
 
 TEST_F(RendererSchedulerImplTest,
        ExpensiveTimerTaskBlocked_SYNCHRONIZED_GESTURE_TouchStartExpected) {
-  SimulateCompositorGestureStart(TouchEventPolicy::SEND_TOUCH_START);
   SimulateExpensiveTasks(timer_task_runner_);
+  SimulateCompositorGestureStart(TouchEventPolicy::SEND_TOUCH_START);
   scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true);
   ForceTouchStartToBeExpectedSoon();
 
@@ -3011,8 +3080,8 @@
   EXPECT_EQ(1000u, run_order.size());
 }
 
-TEST_F(RendererSchedulerImplTest, MAIN_THREAD_GESTURE_CompositingExpensive) {
-  SimulateMainThreadGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START,
+TEST_F(RendererSchedulerImplTest, MAIN_THREAD_CUSTOM_INPUT_HANDLING) {
+  SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START,
                                  blink::WebInputEvent::GestureScrollBegin);
 
   // With the compositor task taking 20ms, there is not enough time to run
@@ -3029,6 +3098,49 @@
     begin_frame_args.on_critical_path = true;
     scheduler_->WillBeginFrame(begin_frame_args);
     scheduler_->DidHandleInputEventOnCompositorThread(
+        FakeInputEvent(blink::WebInputEvent::TouchMove),
+        RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD);
+
+    simulate_compositor_task_ran_ = false;
+    compositor_task_runner_->PostTask(
+        FROM_HERE,
+        base::Bind(&RendererSchedulerImplTest::SimulateMainThreadCompositorTask,
+                   base::Unretained(this),
+                   base::TimeDelta::FromMilliseconds(20)));
+
+    mock_task_runner_->RunTasksWhile(
+        base::Bind(&RendererSchedulerImplTest::SimulatedCompositorTaskPending,
+                   base::Unretained(this)));
+    EXPECT_EQ(UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, CurrentUseCase())
+        << "i = " << i;
+  }
+
+  // Timer tasks should not have been starved by the expensive compositor
+  // tasks.
+  EXPECT_EQ(TaskQueue::NORMAL_PRIORITY,
+            scheduler_->CompositorTaskRunner()->GetQueuePriority());
+  EXPECT_EQ(1000u, run_order.size());
+}
+
+TEST_F(RendererSchedulerImplTest, MAIN_THREAD_GESTURE) {
+  SimulateMainThreadGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START,
+                                 blink::WebInputEvent::GestureScrollBegin);
+
+  // With the compositor task taking 20ms, there is not enough time to run
+  // other tasks in the same 16ms frame. However because this is a main thread
+  // gesture instead of custom main thread input handling, we allow the timer
+  // tasks to be starved.
+  std::vector<std::string> run_order;
+  for (int i = 0; i < 1000; i++)
+    PostTestTasks(&run_order, "T1");
+
+  for (int i = 0; i < 100; i++) {
+    cc::BeginFrameArgs begin_frame_args = cc::BeginFrameArgs::Create(
+        BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(),
+        base::TimeDelta::FromMilliseconds(16), cc::BeginFrameArgs::NORMAL);
+    begin_frame_args.on_critical_path = true;
+    scheduler_->WillBeginFrame(begin_frame_args);
+    scheduler_->DidHandleInputEventOnCompositorThread(
         FakeInputEvent(blink::WebInputEvent::GestureScrollUpdate),
         RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD);
 
@@ -3045,11 +3157,9 @@
     EXPECT_EQ(UseCase::MAIN_THREAD_GESTURE, CurrentUseCase()) << "i = " << i;
   }
 
-  // Timer tasks should not have been starved by the expensive compositor
-  // tasks.
-  EXPECT_EQ(TaskQueue::NORMAL_PRIORITY,
+  EXPECT_EQ(TaskQueue::HIGH_PRIORITY,
             scheduler_->CompositorTaskRunner()->GetQueuePriority());
-  EXPECT_EQ(1000u, run_order.size());
+  EXPECT_EQ(279u, run_order.size());
 }
 
 }  // namespace scheduler
diff --git a/components/signin/core/browser/fake_signin_manager.cc b/components/signin/core/browser/fake_signin_manager.cc
index 2071eea..a4912d5f 100644
--- a/components/signin/core/browser/fake_signin_manager.cc
+++ b/components/signin/core/browser/fake_signin_manager.cc
@@ -17,6 +17,10 @@
 
 FakeSigninManagerBase::~FakeSigninManagerBase() {}
 
+void FakeSigninManagerBase::SignIn(const std::string& account_id) {
+  SetAuthenticatedAccountId(account_id);
+}
+
 #if !defined(OS_CHROMEOS)
 
 FakeSigninManager::FakeSigninManager(
diff --git a/components/signin/core/browser/fake_signin_manager.h b/components/signin/core/browser/fake_signin_manager.h
index 272fe10..83b2728 100644
--- a/components/signin/core/browser/fake_signin_manager.h
+++ b/components/signin/core/browser/fake_signin_manager.h
@@ -23,6 +23,8 @@
   FakeSigninManagerBase(SigninClient* client,
                         AccountTrackerService* account_tracker_service);
   ~FakeSigninManagerBase() override;
+
+  void SignIn(const std::string& account_id);
 };
 
 #if !defined(OS_CHROMEOS)
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb
index 73e5c98..7ebcf90 100644
--- a/components/strings/components_strings_no.xtb
+++ b/components/strings/components_strings_no.xtb
@@ -199,7 +199,7 @@
 <translation id="2969319727213777354">Klokken må være riktig stilt før du kan opprette sikre tilkoblinger. Grunnen til dette er at sertifikatene nettsteder identifiserer seg med, bare er gyldige i visse tidsperioder. Ettersom klokken på enheten din er feil, kan ikke Google Chrome bekrefte disse sertifikatene.</translation>
 <translation id="2972581237482394796">Gjø&amp;r om</translation>
 <translation id="2985306909656435243">Hvis du slår på dette alternativet, lagrer Chromium en kopi av kortet ditt på denne enheten, slik at det går raskere å fylle ut skjemaer.</translation>
-<translation id="2989984781570875765">Legg inn utløpsdatoen og den tresifrede verifiseringskoden du finner på baksiden av <ph name="CREDIT_CARD" /></translation>
+<translation id="2989984781570875765">Legg inn utløpsdatoen og den tresifrede verifiseringskoden du finner på baksiden av dette kortet: <ph name="CREDIT_CARD" /></translation>
 <translation id="2991174974383378012">Deling med nettsteder</translation>
 <translation id="3005723025932146533">Vis lagret kopi</translation>
 <translation id="3010559122411665027">Listeoppføring «<ph name="ENTRY_INDEX" />»: <ph name="ERROR" /></translation>
@@ -347,7 +347,7 @@
 <translation id="450710068430902550">Deling med administratoren</translation>
 <translation id="4522570452068850558">Detaljer</translation>
 <translation id="4535734014498033861">Tilkobling til mellomtjener mislyktes.</translation>
-<translation id="4553532082208702698">Skriv inn den firesifrede verfiseringskoden du finner på forsiden av <ph name="CREDIT_CARD" /></translation>
+<translation id="4553532082208702698">Skriv inn den firesifrede verfiseringskoden du finner på forsiden av dette kortet: <ph name="CREDIT_CARD" /></translation>
 <translation id="4558551763791394412">Prøv å slå av utvidelsene dine.</translation>
 <translation id="4587425331216688090">Vil du fjerne adressen fra Chrome?</translation>
 <translation id="4592951414987517459">Tilkoblingen til <ph name="DOMAIN" /> er kryptert med en moderne chifferserie.</translation>
@@ -355,7 +355,7 @@
 <translation id="4668929960204016307">,</translation>
 <translation id="4670097147947922288">Dette er en utvidelsesside.</translation>
 <translation id="467662567472608290">Denne tjeneren kunne ikke bevise at den er <ph name="DOMAIN" />. Sikkerhetssertifikatet til tjeneren inneholder feil. Dette kan være forårsaket av en feilkonfigurering eller en angriper som avskjærer tilkoblingen din.</translation>
-<translation id="4683417246209150705">Skriv inn den tresifrede verifiseringskoden du finner på baksiden av <ph name="CREDIT_CARD" /></translation>
+<translation id="4683417246209150705">Skriv inn den tresifrede verifiseringskoden du finner på baksiden av dette kortet: <ph name="CREDIT_CARD" /></translation>
 <translation id="4697214168136963651"><ph name="URL" /> ble blokkert</translation>
 <translation id="4701488924964507374"><ph name="SENTENCE1" /> <ph name="SENTENCE2" /></translation>
 <translation id="4708268264240856090">Tilkoblingen ble avbrutt</translation>
@@ -440,8 +440,8 @@
 <translation id="5650551054760837876">Ingen søkeresultater funnet.</translation>
 <translation id="5663999524854166235">Skriv inn den tresifrede verifiseringskoden du finner på baksiden av kortet ditt</translation>
 <translation id="5677928146339483299">Blokkert</translation>
-<translation id="5696590819423335174">Skriv inn utløpsdatoen og den firesifrede verifiseringskoden du finner på forsiden av <ph name="CREDIT_CARD" /></translation>
-<translation id="5699278517904102888">Skriv inn den tresifrede verifiseringskoden du finner på baksiden av <ph name="CREDIT_CARD" /></translation>
+<translation id="5696590819423335174">Skriv inn utløpsdatoen og den firesifrede verifiseringskoden du finner på forsiden av dette kortet: <ph name="CREDIT_CARD" /></translation>
+<translation id="5699278517904102888">Skriv inn den tresifrede verifiseringskoden du finner på baksiden av dette kortet: <ph name="CREDIT_CARD" /></translation>
 <translation id="5710435578057952990">Identiteten til dette nettstedet er ikke verifisert.</translation>
 <translation id="5720705177508910913">Gjeldende bruker</translation>
 <translation id="5785756445106461925">Denne siden inneholder i tillegg andre ressurser som ikke er sikre. Disse ressursene er synlige for andre mens de sendes frem og tilbake, og eventuelle angripere kan modifisere dem for å endre på utseendet til siden.</translation>
@@ -605,7 +605,7 @@
 <translation id="7610193165460212391">Verdien er utenfor rekkevidden <ph name="VALUE" />.</translation>
 <translation id="7613889955535752492">Utløpsdato: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation>
 <translation id="7615602087246926389">Du har allerede data som er kryptert med en annen versjon av Google-kontopassordet ditt. Skriv det inn nedenfor.</translation>
-<translation id="7633887239437305289">Skriv inn den firesifrede verifiseringskoden du finner på forsiden av <ph name="CREDIT_CARD" /></translation>
+<translation id="7633887239437305289">Skriv inn den firesifrede verifiseringskoden du finner på forsiden av dette kortet: <ph name="CREDIT_CARD" /></translation>
 <translation id="7634554953375732414">Tilkoblingen til dette nettstedet er ikke privat.</translation>
 <translation id="7637571805876720304">Vil du fjerne kredittkortet fra Chromium?</translation>
 <translation id="7643817847124207232">Internett-tilkoblingen er blitt borte.</translation>
diff --git a/components/sync_driver/device_info_service.cc b/components/sync_driver/device_info_service.cc
index 9dd6104..f7292f9 100644
--- a/components/sync_driver/device_info_service.cc
+++ b/components/sync_driver/device_info_service.cc
@@ -228,7 +228,8 @@
   // have created the processor ourselves because we had no metadata. So there
   // must not be any metadata on disk.
   if (has_metadata_loaded_) {
-    change_processor()->OnMetadataLoaded(base::WrapUnique(new MetadataBatch()));
+    change_processor()->OnMetadataLoaded(syncer::SyncError(),
+                                         base::WrapUnique(new MetadataBatch()));
     TryReconcileLocalAndStored();
   }
 }
@@ -430,7 +431,7 @@
       LOG(WARNING) << "Failed to deserialize entity metadata.";
     }
   }
-  change_processor()->OnMetadataLoaded(std::move(batch));
+  change_processor()->OnMetadataLoaded(syncer::SyncError(), std::move(batch));
   TryReconcileLocalAndStored();
 }
 
diff --git a/components/sync_driver/device_info_service_unittest.cc b/components/sync_driver/device_info_service_unittest.cc
index 8b0f726..e4467623 100644
--- a/components/sync_driver/device_info_service_unittest.cc
+++ b/components/sync_driver/device_info_service_unittest.cc
@@ -21,6 +21,7 @@
 #include "sync/api/fake_model_type_change_processor.h"
 #include "sync/api/metadata_batch.h"
 #include "sync/api/model_type_store.h"
+#include "sync/internal_api/public/test/data_type_error_handler_mock.h"
 #include "sync/internal_api/public/test/model_type_store_test_util.h"
 #include "sync/protocol/data_type_state.pb.h"
 #include "sync/util/time.h"
@@ -143,7 +144,8 @@
     delete_set_.insert(client_tag);
   }
 
-  void OnMetadataLoaded(std::unique_ptr<MetadataBatch> batch) override {
+  void OnMetadataLoaded(syncer::SyncError error,
+                        std::unique_ptr<MetadataBatch> batch) override {
     std::swap(metadata_, batch);
   }
 
@@ -206,6 +208,10 @@
     service_->AddObserver(this);
   }
 
+  void OnSyncStarting() {
+    service()->OnSyncStarting(&error_handler_, StartCallback());
+  }
+
   // Creates the service and runs any outstanding tasks. This will typically
   // cause all initialization callbacks between the sevice and store to fire.
   void InitializeAndPump() {
@@ -217,7 +223,7 @@
   // service that sync wants to start and forces the processor to be created.
   void InitializeAndPumpAndStart() {
     InitializeAndPump();
-    service()->OnSyncStarting(StartCallback());
+    OnSyncStarting();
     ASSERT_TRUE(processor_);
   }
 
@@ -322,6 +328,9 @@
 
   std::unique_ptr<LocalDeviceInfoProviderMock> local_device_;
 
+  // Mock error handler passed to the processor.
+  syncer::DataTypeErrorHandlerMock error_handler_;
+
   // Not initialized immediately (upon test's constructor). This allows each
   // test case to modify the dependencies the service will be constructed with.
   std::unique_ptr<DeviceInfoService> service_;
@@ -340,7 +349,7 @@
 TEST_F(DeviceInfoServiceTest, EmptyDataReconciliation) {
   InitializeAndPump();
   ASSERT_EQ(0u, service()->GetAllDeviceInfo().size());
-  service()->OnSyncStarting(StartCallback());
+  OnSyncStarting();
   ScopedVector<DeviceInfo> all_device_info(service()->GetAllDeviceInfo());
   ASSERT_EQ(1u, all_device_info.size());
   ASSERT_TRUE(
@@ -349,7 +358,7 @@
 
 TEST_F(DeviceInfoServiceTest, EmptyDataReconciliationSlowLoad) {
   InitializeService();
-  service()->OnSyncStarting(StartCallback());
+  OnSyncStarting();
   ASSERT_EQ(0u, service()->GetAllDeviceInfo().size());
   base::RunLoop().RunUntilIdle();
   ScopedVector<DeviceInfo> all_device_info(service()->GetAllDeviceInfo());
diff --git a/components/sync_driver/generic_change_processor_unittest.cc b/components/sync_driver/generic_change_processor_unittest.cc
index 2b6d717..6ae483ec3 100644
--- a/components/sync_driver/generic_change_processor_unittest.cc
+++ b/components/sync_driver/generic_change_processor_unittest.cc
@@ -34,7 +34,7 @@
 #include "sync/internal_api/public/user_share.h"
 #include "sync/internal_api/public/write_node.h"
 #include "sync/internal_api/public/write_transaction.h"
-#include "testing/gmock/include/gmock/gmock-matchers.h"
+#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace sync_driver {
diff --git a/components/sync_driver/non_blocking_data_type_controller.cc b/components/sync_driver/non_blocking_data_type_controller.cc
index 64e17b2..cdcda97 100644
--- a/components/sync_driver/non_blocking_data_type_controller.cc
+++ b/components/sync_driver/non_blocking_data_type_controller.cc
@@ -82,6 +82,7 @@
   }
 
   model_type_service->OnSyncStarting(
+      this,
       base::Bind(&NonBlockingDataTypeController::OnProcessorStarted, this));
 }
 
diff --git a/components/sync_driver/non_ui_data_type_controller.cc b/components/sync_driver/non_ui_data_type_controller.cc
index 25516c9..38910b5 100644
--- a/components/sync_driver/non_ui_data_type_controller.cc
+++ b/components/sync_driver/non_ui_data_type_controller.cc
@@ -270,8 +270,6 @@
                             ModelTypeToHistogramInt(type()),
                             syncer::MODEL_TYPE_COUNT);
   if (!model_load_callback_.is_null()) {
-    syncer::SyncMergeResult local_merge_result(type());
-    local_merge_result.set_error(error);
     model_load_callback_.Run(type(), error);
   }
 }
diff --git a/components/sync_driver/non_ui_model_type_controller_unittest.cc b/components/sync_driver/non_ui_model_type_controller_unittest.cc
index cf4241b..512a8f7e 100644
--- a/components/sync_driver/non_ui_model_type_controller_unittest.cc
+++ b/components/sync_driver/non_ui_model_type_controller_unittest.cc
@@ -232,6 +232,7 @@
     if (model_thread_runner_->BelongsToCurrentThread()) {
       if (!type_processor_->IsAllowingChanges()) {
         type_processor_->OnMetadataLoaded(
+            syncer::SyncError(),
             base::WrapUnique(new syncer_v2::MetadataBatch()));
       }
     } else {
diff --git a/components/sync_driver/ui_model_type_controller_unittest.cc b/components/sync_driver/ui_model_type_controller_unittest.cc
index 04df8a4..5b77713 100644
--- a/components/sync_driver/ui_model_type_controller_unittest.cc
+++ b/components/sync_driver/ui_model_type_controller_unittest.cc
@@ -180,6 +180,7 @@
         &UIModelTypeControllerTest::LoadModelsDone, base::Unretained(this)));
     if (!type_processor_->IsAllowingChanges()) {
       type_processor_->OnMetadataLoaded(
+          syncer::SyncError(),
           base::WrapUnique(new syncer_v2::MetadataBatch()));
     }
 
diff --git a/components/test_runner/layout_test_runtime_flags.cc b/components/test_runner/layout_test_runtime_flags.cc
index 0488e55..46bd808 100644
--- a/components/test_runner/layout_test_runtime_flags.cc
+++ b/components/test_runner/layout_test_runtime_flags.cc
@@ -52,7 +52,6 @@
   set_dump_resource_priorities(false);
   set_dump_resource_response_mime_types(false);
   set_dump_navigation_policy(false);
-  set_intercept_post_message(false);
 
   set_dump_title_changes(false);
   set_dump_icon_changes(false);
diff --git a/components/test_runner/layout_test_runtime_flags.h b/components/test_runner/layout_test_runtime_flags.h
index 42b7000..1d59004 100644
--- a/components/test_runner/layout_test_runtime_flags.h
+++ b/components/test_runner/layout_test_runtime_flags.h
@@ -146,9 +146,6 @@
   // WebFrameClient::decidePolicyForNavigation.
   DEFINE_BOOL_LAYOUT_TEST_RUNTIME_FLAG(dump_navigation_policy)
 
-  // Bound variable to set whether postMessages should be intercepted or not
-  DEFINE_BOOL_LAYOUT_TEST_RUNTIME_FLAG(intercept_post_message)
-
   // If true, output a message when the page title is changed.
   DEFINE_BOOL_LAYOUT_TEST_RUNTIME_FLAG(dump_title_changes)
 
diff --git a/components/test_runner/test_runner.cc b/components/test_runner/test_runner.cc
index 3be81d7..1a6aa90e 100644
--- a/components/test_runner/test_runner.cc
+++ b/components/test_runner/test_runner.cc
@@ -212,7 +212,6 @@
   void SetDomainRelaxationForbiddenForURLScheme(bool forbidden,
                                                 const std::string& scheme);
   void SetImagesAllowed(bool allowed);
-  void SetInterceptPostMessage(bool value);
   void SetIsolatedWorldContentSecurityPolicy(int world_id,
                                              const std::string& policy);
   void SetIsolatedWorldSecurityOrigin(int world_id,
@@ -274,7 +273,6 @@
   bool FindString(const std::string& search_text,
                   const std::vector<std::string>& options_array);
   bool HasCustomPageSizeStyle(int page_index);
-  bool InterceptPostMessage();
   bool IsChooserShown();
 
   bool IsCommandEnabled(const std::string& command);
@@ -441,9 +439,6 @@
       .SetMethod("hasCustomPageSizeStyle",
                  &TestRunnerBindings::HasCustomPageSizeStyle)
       .SetMethod("insertStyleSheet", &TestRunnerBindings::InsertStyleSheet)
-      .SetProperty("interceptPostMessage",
-                   &TestRunnerBindings::InterceptPostMessage,
-                   &TestRunnerBindings::SetInterceptPostMessage)
       .SetMethod("isChooserShown", &TestRunnerBindings::IsChooserShown)
       .SetMethod("isCommandEnabled", &TestRunnerBindings::IsCommandEnabled)
       .SetMethod("keepWebHistory", &TestRunnerBindings::NotImplemented)
@@ -1473,19 +1468,6 @@
   return false;
 }
 
-bool TestRunnerBindings::InterceptPostMessage() {
-  if (runner_)
-    return runner_->shouldInterceptPostMessage();
-  return false;
-}
-
-void TestRunnerBindings::SetInterceptPostMessage(bool value) {
-  if (runner_) {
-    runner_->layout_test_runtime_flags_.set_intercept_post_message(value);
-    runner_->OnLayoutTestRuntimeFlagsChanged();
-  }
-}
-
 void TestRunnerBindings::ForceNextWebGLContextCreationToFail() {
   if (view_runner_)
     view_runner_->ForceNextWebGLContextCreationToFail();
@@ -1899,10 +1881,6 @@
   return layout_test_runtime_flags_.policy_delegate_should_notify_done();
 }
 
-bool TestRunner::shouldInterceptPostMessage() const {
-  return layout_test_runtime_flags_.intercept_post_message();
-}
-
 bool TestRunner::shouldDumpResourcePriorities() const {
   return layout_test_runtime_flags_.dump_resource_priorities();
 }
diff --git a/components/test_runner/test_runner.h b/components/test_runner/test_runner.h
index e687160c..91d88b6 100644
--- a/components/test_runner/test_runner.h
+++ b/components/test_runner/test_runner.h
@@ -150,7 +150,6 @@
   bool policyDelegateEnabled() const;
   bool policyDelegateIsPermissive() const;
   bool policyDelegateShouldNotifyDone() const;
-  bool shouldInterceptPostMessage() const;
   bool shouldDumpResourcePriorities() const;
   void setToolTipText(const blink::WebString&);
   void setDragImage(const blink::WebImage& drag_image);
diff --git a/components/test_runner/web_frame_test_client.cc b/components/test_runner/web_frame_test_client.cc
index 3ebeb98..0453c995 100644
--- a/components/test_runner/web_frame_test_client.cc
+++ b/components/test_runner/web_frame_test_client.cc
@@ -730,19 +730,6 @@
   return result;
 }
 
-bool WebFrameTestClient::willCheckAndDispatchMessageEvent(
-    blink::WebLocalFrame* source_frame,
-    blink::WebFrame* target_frame,
-    blink::WebSecurityOrigin target,
-    blink::WebDOMMessageEvent event) {
-  if (test_runner_->shouldInterceptPostMessage()) {
-    delegate_->PrintMessage("intercepted postMessage\n");
-    return true;
-  }
-
-  return false;
-}
-
 void WebFrameTestClient::checkIfAudioSinkExistsAndIsAuthorized(
     const blink::WebString& sink_id,
     const blink::WebSecurityOrigin& security_origin,
diff --git a/components/test_runner/web_frame_test_client.h b/components/test_runner/web_frame_test_client.h
index 4214475..86f624e3 100644
--- a/components/test_runner/web_frame_test_client.h
+++ b/components/test_runner/web_frame_test_client.h
@@ -101,11 +101,6 @@
                              unsigned identifier) override;
   blink::WebNavigationPolicy decidePolicyForNavigation(
       const blink::WebFrameClient::NavigationPolicyInfo& info) override;
-  bool willCheckAndDispatchMessageEvent(
-      blink::WebLocalFrame* source_frame,
-      blink::WebFrame* target_frame,
-      blink::WebSecurityOrigin target,
-      blink::WebDOMMessageEvent event) override;
   void checkIfAudioSinkExistsAndIsAuthorized(
       const blink::WebString& sink_id,
       const blink::WebSecurityOrigin& security_origin,
diff --git a/components/test_runner/web_frame_test_proxy.h b/components/test_runner/web_frame_test_proxy.h
index 94d309e..83224b9 100644
--- a/components/test_runner/web_frame_test_proxy.h
+++ b/components/test_runner/web_frame_test_proxy.h
@@ -273,18 +273,6 @@
     return test_client()->userMediaClient();
   }
 
-  bool willCheckAndDispatchMessageEvent(
-      blink::WebLocalFrame* source_frame,
-      blink::WebFrame* target_frame,
-      blink::WebSecurityOrigin target,
-      blink::WebDOMMessageEvent event) override {
-    if (test_client()->willCheckAndDispatchMessageEvent(
-            source_frame, target_frame, target, event))
-      return true;
-    return Base::willCheckAndDispatchMessageEvent(
-        source_frame, target_frame, target, event);
-  }
-
   void postAccessibilityEvent(const blink::WebAXObject& object,
                               blink::WebAXEvent event) override {
     test_client()->postAccessibilityEvent(object, event);
diff --git a/content/browser/browser_context.cc b/content/browser/browser_context.cc
index f89d0ae..a782fc4 100644
--- a/content/browser/browser_context.cc
+++ b/content/browser/browser_context.cc
@@ -406,13 +406,12 @@
 
     if (base::CommandLine::ForCurrentProcess()->HasSwitch(
             switches::kMojoLocalStorage)) {
-      connection->AddEmbeddedApplication(
-          user_service::kUserServiceName,
-          base::Bind(
-              &user_service::CreateUserShellClient,
-              BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE),
-              BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB)),
-          nullptr);
+      MojoApplicationInfo info;
+      info.application_factory = base::Bind(
+          &user_service::CreateUserShellClient,
+          BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE),
+          BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB));
+      connection->AddEmbeddedApplication(user_service::kUserServiceName, info);
     }
   }
 }
diff --git a/content/browser/browser_plugin/browser_plugin_guest.cc b/content/browser/browser_plugin/browser_plugin_guest.cc
index 0d023583..a6479fd 100644
--- a/content/browser/browser_plugin/browser_plugin_guest.cc
+++ b/content/browser/browser_plugin/browser_plugin_guest.cc
@@ -767,7 +767,8 @@
   delegate_->DidAttach(GetGuestProxyRoutingID());
   RenderWidgetHostViewGuest* rwhv = static_cast<RenderWidgetHostViewGuest*>(
       web_contents()->GetRenderWidgetHostView());
-  rwhv->RegisterSurfaceNamespaceId();
+  if (rwhv)
+    rwhv->RegisterSurfaceNamespaceId();
   has_render_view_ = true;
 
   RecordAction(base::UserMetricsAction("BrowserPlugin.Guest.Attached"));
diff --git a/content/browser/compositor/gpu_process_transport_factory.cc b/content/browser/compositor/gpu_process_transport_factory.cc
index 20b49fc..62eef31 100644
--- a/content/browser/compositor/gpu_process_transport_factory.cc
+++ b/content/browser/compositor/gpu_process_transport_factory.cc
@@ -99,6 +99,7 @@
 scoped_refptr<content::ContextProviderCommandBuffer> CreateContextCommon(
     scoped_refptr<gpu::GpuChannelHost> gpu_channel_host,
     gpu::SurfaceHandle surface_handle,
+    bool support_locking,
     content::ContextProviderCommandBuffer* shared_context_provider,
     content::command_buffer_metrics::ContextType type) {
   DCHECK(
@@ -126,14 +127,14 @@
   attributes.bind_generates_resource = false;
   attributes.lose_context_when_out_of_memory = true;
 
-  bool automatic_flushes = false;
+  constexpr bool automatic_flushes = false;
 
   GURL url("chrome://gpu/GpuProcessTransportFactory::CreateContextCommon");
   return make_scoped_refptr(new content::ContextProviderCommandBuffer(
       std::move(gpu_channel_host), gpu::GPU_STREAM_DEFAULT,
       gpu::GpuStreamPriority::NORMAL, surface_handle, url,
-      gfx::PreferIntegratedGpu, automatic_flushes, gpu::SharedMemoryLimits(),
-      attributes, shared_context_provider, type));
+      gfx::PreferIntegratedGpu, automatic_flushes, support_locking,
+      gpu::SharedMemoryLimits(), attributes, shared_context_provider, type));
 }
 
 #if defined(OS_MACOSX)
@@ -361,8 +362,9 @@
       shared_worker_context_provider_ = nullptr;
     } else {
       if (!shared_worker_context_provider_) {
+        const bool support_locking = true;
         shared_worker_context_provider_ = CreateContextCommon(
-            gpu_channel_host, gpu::kNullSurfaceHandle, nullptr,
+            gpu_channel_host, gpu::kNullSurfaceHandle, support_locking, nullptr,
             command_buffer_metrics::BROWSER_WORKER_CONTEXT);
         // TODO(vadimt): Remove ScopedTracker below once crbug.com/125248 is
         // fixed. Tracking time in BindToCurrentThread.
@@ -371,9 +373,7 @@
                 "125248"
                 " GpuProcessTransportFactory::EstablishedGpuChannel"
                 "::Worker"));
-        if (shared_worker_context_provider_->BindToCurrentThread())
-          shared_worker_context_provider_->SetupLock();
-        else
+        if (!shared_worker_context_provider_->BindToCurrentThread())
           shared_worker_context_provider_ = nullptr;
       }
 
@@ -381,8 +381,9 @@
       // display compositor. It shares resources with the worker context, so if
       // we failed to make a worker context, just start over and try again.
       if (shared_worker_context_provider_) {
+        bool support_locking = false;
         context_provider = CreateContextCommon(
-            std::move(gpu_channel_host), data->surface_handle,
+            std::move(gpu_channel_host), data->surface_handle, support_locking,
             shared_worker_context_provider_.get(),
             command_buffer_metrics::DISPLAY_COMPOSITOR_ONSCREEN_CONTEXT);
         // TODO(vadimt): Remove ScopedTracker below once crbug.com/125248 is
@@ -686,9 +687,10 @@
 
   // We need a separate context from the compositor's so that skia and gl_helper
   // don't step on each other.
+  bool support_locking = false;
   shared_main_thread_contexts_ = CreateContextCommon(
-      std::move(gpu_channel_host), gpu::kNullSurfaceHandle, nullptr,
-      command_buffer_metrics::BROWSER_OFFSCREEN_MAINTHREAD_CONTEXT);
+      std::move(gpu_channel_host), gpu::kNullSurfaceHandle, support_locking,
+      nullptr, command_buffer_metrics::BROWSER_OFFSCREEN_MAINTHREAD_CONTEXT);
   shared_main_thread_contexts_->SetLostContextCallback(base::Bind(
       &GpuProcessTransportFactory::OnLostMainThreadSharedContextInsideCallback,
       callback_factory_.GetWeakPtr()));
diff --git a/content/browser/download/mhtml_generation_browsertest.cc b/content/browser/download/mhtml_generation_browsertest.cc
index 517a246..00f3aeb 100644
--- a/content/browser/download/mhtml_generation_browsertest.cc
+++ b/content/browser/download/mhtml_generation_browsertest.cc
@@ -12,6 +12,7 @@
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "content/public/browser/web_contents.h"
+#include "content/public/common/mhtml_generation_params.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/content_browser_test.h"
 #include "content/public/test/content_browser_test_utils.h"
@@ -40,19 +41,17 @@
   }
 
   void GenerateMHTML(const base::FilePath& path, const GURL& url) {
-    GenerateMHTML(path, url, false);
+    GenerateMHTML(MHTMLGenerationParams(path), url);
   }
 
-  void GenerateMHTML(const base::FilePath& path,
-                     const GURL& url,
-                     bool use_binary_encoding) {
+  void GenerateMHTML(const MHTMLGenerationParams& params, const GURL& url) {
     NavigateToURL(shell(), url);
 
     base::RunLoop run_loop;
+
     shell()->web_contents()->GenerateMHTML(
-        path, use_binary_encoding,
-        base::Bind(&MHTMLGenerationTest::MHTMLGenerated, this,
-                   run_loop.QuitClosure()));
+        params, base::Bind(&MHTMLGenerationTest::MHTMLGenerated, this,
+                           run_loop.QuitClosure()));
 
     // Block until the MHTML is generated.
     run_loop.Run();
@@ -121,7 +120,7 @@
   path = path.Append(FILE_PATH_LITERAL("test_binary.mht"));
 
   GURL url(embedded_test_server()->GetURL("/page_with_image.html"));
-  GenerateMHTML(path, url, false);
+  GenerateMHTML(path, url);
   ASSERT_FALSE(HasFailure());
   EXPECT_GT(file_size(), 0);  // Verify the size reported by the callback.
   EXPECT_GT(ReadFileSizeFromDisk(path), 100);  // Verify the actual file size.
@@ -141,7 +140,10 @@
   path = path.Append(FILE_PATH_LITERAL("test_binary.mht"));
 
   GURL url(embedded_test_server()->GetURL("/page_with_image.html"));
-  GenerateMHTML(path, url, true);
+  MHTMLGenerationParams params(path);
+  params.use_binary_encoding = true;
+
+  GenerateMHTML(params, url);
   ASSERT_FALSE(HasFailure());
   EXPECT_GT(file_size(), 0);  // Verify the size reported by the callback.
   EXPECT_GT(ReadFileSizeFromDisk(path), 100);  // Verify the actual file size.
@@ -153,6 +155,50 @@
   EXPECT_THAT(mhtml, ContainsRegex("Content-Location:.*blank.jpg"));
 }
 
+IN_PROC_BROWSER_TEST_F(MHTMLGenerationTest, GenerateMHTMLIgnoreNoStore) {
+  base::FilePath path(temp_dir_.path());
+  path = path.Append(FILE_PATH_LITERAL("test.mht"));
+
+  GURL url(embedded_test_server()->GetURL("/nostore.html"));
+
+  // Generate MHTML without specifying the FAIL_FOR_NO_STORE_MAIN_FRAME policy.
+  GenerateMHTML(path, url);
+
+  // We expect that there wasn't an error (file size -1 indicates an error.)
+  ASSERT_FALSE(HasFailure());
+
+  std::string mhtml;
+  ASSERT_TRUE(base::ReadFileToString(path, &mhtml));
+
+  // Make sure the contents of the body are present.
+  EXPECT_THAT(mhtml, HasSubstr("test body"));
+
+  // Make sure that URL of the content is present.
+  EXPECT_THAT(mhtml, ContainsRegex("Content-Location:.*/nostore.html"));
+}
+
+IN_PROC_BROWSER_TEST_F(MHTMLGenerationTest, GenerateMHTMLObeyNoStoreMainFrame) {
+  base::FilePath path(temp_dir_.path());
+  path = path.Append(FILE_PATH_LITERAL("test.mht"));
+
+  GURL url(embedded_test_server()->GetURL("/nostore.html"));
+
+  // Generate MHTML, specifying the FAIL_FOR_NO_STORE_MAIN_FRAME policy.
+  MHTMLGenerationParams params(path);
+  params.cache_control_policy =
+      content::MHTMLCacheControlPolicy::FAIL_FOR_NO_STORE_MAIN_FRAME;
+
+  GenerateMHTML(params, url);
+  // We expect that there was an error (file size -1 indicates an error.)
+  EXPECT_EQ(-1, file_size());
+
+  std::string mhtml;
+  ASSERT_TRUE(base::ReadFileToString(path, &mhtml));
+
+  // Make sure the contents are missing.
+  EXPECT_THAT(mhtml, Not(HasSubstr("test body")));
+}
+
 // Test suite that allows testing --site-per-process against cross-site frames.
 // See http://dev.chromium.org/developers/design-documents/site-isolation.
 class MHTMLGenerationSitePerProcessTest : public MHTMLGenerationTest {
diff --git a/content/browser/download/mhtml_generation_manager.cc b/content/browser/download/mhtml_generation_manager.cc
index b92917b..60feca0 100644
--- a/content/browser/download/mhtml_generation_manager.cc
+++ b/content/browser/download/mhtml_generation_manager.cc
@@ -24,6 +24,7 @@
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/render_process_host_observer.h"
 #include "content/public/browser/web_contents.h"
+#include "content/public/common/mhtml_generation_params.h"
 #include "net/base/mime_util.h"
 
 namespace content {
@@ -34,7 +35,7 @@
  public:
   Job(int job_id,
       WebContents* web_contents,
-      bool use_binary_encoding,
+      const MHTMLGenerationParams& params,
       const GenerateMHTMLCallback& callback);
   ~Job() override;
 
@@ -88,8 +89,10 @@
   // See also MHTMLGenerationManager::id_to_job_ map.
   int job_id_;
 
-  // Whether to use binary encoding while generating MHTML.
-  bool use_binary_encoding_;
+  // User-configurable parameters. Includes the file location, binary encoding
+  // choices, and whether to skip storing resources marked
+  // Cache-Control: no-store.
+  MHTMLGenerationParams params_;
 
   // The IDs of frames that still need to be processed.
   std::queue<int> pending_frame_tree_node_ids_;
@@ -125,10 +128,10 @@
 
 MHTMLGenerationManager::Job::Job(int job_id,
                                  WebContents* web_contents,
-                                 bool use_binary_encoding,
+                                 const MHTMLGenerationParams& params,
                                  const GenerateMHTMLCallback& callback)
     : job_id_(job_id),
-      use_binary_encoding_(use_binary_encoding),
+      params_(params),
       frame_tree_node_id_of_busy_frame_(FrameTreeNode::kFrameTreeNodeInvalidId),
       mhtml_boundary_marker_(net::GenerateMimeMultipartBoundary()),
       salt_(base::GenerateGUID()),
@@ -178,7 +181,8 @@
   FrameMsg_SerializeAsMHTML_Params ipc_params;
   ipc_params.job_id = job_id_;
   ipc_params.mhtml_boundary_marker = mhtml_boundary_marker_;
-  ipc_params.mhtml_binary_encoding = use_binary_encoding_;
+  ipc_params.mhtml_binary_encoding = params_.use_binary_encoding;
+  ipc_params.mhtml_cache_control_policy = params_.cache_control_policy;
 
   int frame_tree_node_id = pending_frame_tree_node_ids_.front();
   pending_frame_tree_node_ids_.pop();
@@ -297,16 +301,15 @@
 }
 
 void MHTMLGenerationManager::SaveMHTML(WebContents* web_contents,
-                                       bool use_binary_encoding,
-                                       const base::FilePath& file_path,
+                                       const MHTMLGenerationParams& params,
                                        const GenerateMHTMLCallback& callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
-  int job_id = NewJob(web_contents, use_binary_encoding, callback);
+  int job_id = NewJob(web_contents, params, callback);
 
   BrowserThread::PostTaskAndReplyWithResult(
       BrowserThread::FILE, FROM_HERE,
-      base::Bind(&MHTMLGenerationManager::CreateFile, file_path),
+      base::Bind(&MHTMLGenerationManager::CreateFile, params.file_path),
       base::Bind(&MHTMLGenerationManager::OnFileAvailable,
                  base::Unretained(this),  // Safe b/c |this| is a singleton.
                  job_id));
@@ -403,13 +406,12 @@
 }
 
 int MHTMLGenerationManager::NewJob(WebContents* web_contents,
-                                   bool use_binary_encoding,
+                                   const MHTMLGenerationParams& params,
                                    const GenerateMHTMLCallback& callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   int job_id = next_job_id_++;
-  id_to_job_[job_id] =
-      new Job(job_id, web_contents, use_binary_encoding, callback);
+  id_to_job_[job_id] = new Job(job_id, web_contents, params, callback);
   return job_id;
 }
 
diff --git a/content/browser/download/mhtml_generation_manager.h b/content/browser/download/mhtml_generation_manager.h
index 8a76f4f..d360cce 100644
--- a/content/browser/download/mhtml_generation_manager.h
+++ b/content/browser/download/mhtml_generation_manager.h
@@ -1,7 +1,6 @@
 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
-
 #ifndef CONTENT_BROWSER_DOWNLOAD_MHTML_GENERATION_MANAGER_H_
 #define CONTENT_BROWSER_DOWNLOAD_MHTML_GENERATION_MANAGER_H_
 
@@ -15,6 +14,7 @@
 #include "base/macros.h"
 #include "base/memory/singleton.h"
 #include "base/process/process.h"
+#include "content/public/common/mhtml_generation_params.h"
 #include "ipc/ipc_platform_file.h"
 
 namespace base {
@@ -40,8 +40,7 @@
   // Instructs the render view to generate a MHTML representation of the current
   // page for |web_contents|.
   void SaveMHTML(WebContents* web_contents,
-                 bool use_binary_encoding,
-                 const base::FilePath& file_path,
+                 const MHTMLGenerationParams& params,
                  const GenerateMHTMLCallback& callback);
 
   // Handler for FrameHostMsg_SerializeAsMHTMLResponse (a notification from the
@@ -75,7 +74,7 @@
 
   // Creates and registers a new job.
   int NewJob(WebContents* web_contents,
-             bool use_binary_encoding,
+             const MHTMLGenerationParams& params,
              const GenerateMHTMLCallback& callback);
 
   // Finds job by id.  Returns nullptr if no job with a given id was found.
diff --git a/content/browser/download/save_package.cc b/content/browser/download/save_package.cc
index 040543d..7704eb4a 100644
--- a/content/browser/download/save_package.cc
+++ b/content/browser/download/save_package.cc
@@ -48,6 +48,7 @@
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/resource_context.h"
 #include "content/public/browser/web_contents.h"
+#include "content/public/common/mhtml_generation_params.h"
 #include "net/base/filename_util.h"
 #include "net/base/io_buffer.h"
 #include "net/base/mime_util.h"
@@ -338,8 +339,9 @@
     DCHECK(!saved_main_directory_path_.empty());
     GetSavableResourceLinks();
   } else if (save_type_ == SAVE_PAGE_TYPE_AS_MHTML) {
+    MHTMLGenerationParams mhtml_generation_params(saved_main_file_path_);
     web_contents()->GenerateMHTML(
-        saved_main_file_path_, false /* use_binary_encoding */,
+        mhtml_generation_params,
         base::Bind(&SavePackage::OnMHTMLGenerated, this));
   } else {
     DCHECK_EQ(SAVE_PAGE_TYPE_AS_ONLY_HTML, save_type_);
diff --git a/content/browser/frame_host/cross_process_frame_connector.cc b/content/browser/frame_host/cross_process_frame_connector.cc
index 3df81a6..6002fcaa 100644
--- a/content/browser/frame_host/cross_process_frame_connector.cc
+++ b/content/browser/frame_host/cross_process_frame_connector.cc
@@ -143,6 +143,41 @@
     main_view->ProcessAckedTouchEvent(touch, ack_result);
 }
 
+void CrossProcessFrameConnector::BubbleScrollEvent(
+    const blink::WebInputEvent& event) {
+  auto parent_view = GetParentRenderWidgetHostView();
+
+  if (!parent_view)
+    return;
+
+  gfx::Vector2d offset_from_parent = child_frame_rect_.OffsetFromOrigin();
+  if (event.type == blink::WebInputEvent::GestureScrollUpdate) {
+    blink::WebGestureEvent resent_gesture_event;
+    memcpy(&resent_gesture_event, &event, sizeof(resent_gesture_event));
+    resent_gesture_event.x += offset_from_parent.x();
+    resent_gesture_event.y += offset_from_parent.y();
+    // TODO(wjmaclean, kenrb): The resendingPluginId field is used by
+    // BrowserPlugin to associate bubbled events with each plugin, which is
+    // not needed for OOPIFs. However the field needs to be set in order
+    // to prompt the parent frame's RenderWidgetHostImpl to
+    // manage the gesture scroll event lifetime (in particular creating the
+    // GestureScrollBegin and GestureScrollEnd events). This can be converted
+    // to a flag or otherwise refactored out when BrowserPlugin supporting
+    // code is eventually removed (https://crbug.com/533069).
+    resent_gesture_event.resendingPluginId = 1;
+    ui::LatencyInfo latency_info;
+    parent_view->ProcessGestureEvent(resent_gesture_event, latency_info);
+  } else if (event.type == blink::WebInputEvent::MouseWheel) {
+    blink::WebMouseWheelEvent resent_wheel_event;
+    memcpy(&resent_wheel_event, &event, sizeof(resent_wheel_event));
+    resent_wheel_event.x += offset_from_parent.x();
+    resent_wheel_event.y += offset_from_parent.y();
+    parent_view->ProcessMouseWheelEvent(resent_wheel_event);
+  } else {
+    NOTIMPLEMENTED();
+  }
+}
+
 bool CrossProcessFrameConnector::HasFocus() {
   RenderWidgetHostViewBase* root_view = GetRootRenderWidgetHostView();
   if (root_view)
diff --git a/content/browser/frame_host/cross_process_frame_connector.h b/content/browser/frame_host/cross_process_frame_connector.h
index a1e04d8..b913399 100644
--- a/content/browser/frame_host/cross_process_frame_connector.h
+++ b/content/browser/frame_host/cross_process_frame_connector.h
@@ -100,6 +100,9 @@
   // Pass acked touch events to the root view for gesture processing.
   void ForwardProcessAckedTouchEvent(const TouchEventWithLatencyInfo& touch,
                                      InputEventAckState ack_result);
+  // Gesture and wheel events with unused scroll deltas must be bubbled to
+  // ancestors who may consume the delta.
+  void BubbleScrollEvent(const blink::WebInputEvent& event);
 
   // Determines whether the root RenderWidgetHostView (and thus the current
   // page) has focus.
diff --git a/content/browser/frame_host/frame_tree_node.cc b/content/browser/frame_host/frame_tree_node.cc
index 73ef0c3..dff90f0 100644
--- a/content/browser/frame_host/frame_tree_node.cc
+++ b/content/browser/frame_host/frame_tree_node.cc
@@ -277,16 +277,11 @@
 }
 
 FrameTreeNode* FrameTreeNode::PreviousSibling() const {
-  if (!parent_)
-    return nullptr;
+  return GetSibling(-1);
+}
 
-  for (size_t i = 0; i < parent_->child_count(); ++i) {
-    if (parent_->child_at(i) == this)
-      return (i == 0) ? nullptr : parent_->child_at(i - 1);
-  }
-
-  NOTREACHED() << "FrameTreeNode not found in its parent's children.";
-  return nullptr;
+FrameTreeNode* FrameTreeNode::NextSibling() const {
+  return GetSibling(1);
 }
 
 bool FrameTreeNode::IsLoading() const {
@@ -494,4 +489,22 @@
           new TracedFrameTreeNode(*this)));
 }
 
+FrameTreeNode* FrameTreeNode::GetSibling(int relative_offset) const {
+  if (!parent_)
+    return nullptr;
+
+  for (size_t i = 0; i < parent_->child_count(); ++i) {
+    if (parent_->child_at(i) == this) {
+      if ((relative_offset < 0 && static_cast<size_t>(-relative_offset) > i) ||
+          i + relative_offset >= parent_->child_count()) {
+        return nullptr;
+      }
+      return parent_->child_at(i + relative_offset);
+    }
+  }
+
+  NOTREACHED() << "FrameTreeNode not found in its parent's children.";
+  return nullptr;
+}
+
 }  // namespace content
diff --git a/content/browser/frame_host/frame_tree_node.h b/content/browser/frame_host/frame_tree_node.h
index a8a9eed..e65e142 100644
--- a/content/browser/frame_host/frame_tree_node.h
+++ b/content/browser/frame_host/frame_tree_node.h
@@ -206,6 +206,10 @@
   // |children_|, or nullptr if there is no such node.
   FrameTreeNode* PreviousSibling() const;
 
+  // Return the node immediately following this node in its parent's
+  // |children_|, or nullptr if there is no such node.
+  FrameTreeNode* NextSibling() const;
+
   // Returns true if this node is in a loading state.
   bool IsLoading() const;
 
@@ -276,6 +280,8 @@
 
   void TraceSnapshot() const;
 
+  FrameTreeNode* GetSibling(int relative_offset) const;
+
   // The next available browser-global FrameTreeNode ID.
   static int next_frame_tree_node_id_;
 
diff --git a/content/browser/frame_host/frame_tree_unittest.cc b/content/browser/frame_host/frame_tree_unittest.cc
index 73861575..2fe9434 100644
--- a/content/browser/frame_host/frame_tree_unittest.cc
+++ b/content/browser/frame_host/frame_tree_unittest.cc
@@ -342,8 +342,8 @@
   EXPECT_EQ(nullptr, frame_tree->FindByName("no such frame"));
 }
 
-// Check that PreviousSibling() is retrieved correctly.
-TEST_F(FrameTreeTest, PreviousSibling) {
+// Check that PreviousSibling() and NextSibling() are retrieved correctly.
+TEST_F(FrameTreeTest, GetSibling) {
   main_test_rfh()->InitializeRenderFrameIfNeeded();
 
   // Add a few child frames to the main frame.
@@ -368,11 +368,19 @@
       blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties());
   FrameTreeNode* grandchild = child1->child_at(0);
 
+  // Test PreviousSibling().
   EXPECT_EQ(nullptr, root->PreviousSibling());
   EXPECT_EQ(nullptr, child0->PreviousSibling());
   EXPECT_EQ(child0, child1->PreviousSibling());
   EXPECT_EQ(child1, child2->PreviousSibling());
   EXPECT_EQ(nullptr, grandchild->PreviousSibling());
+
+  // Test NextSibling().
+  EXPECT_EQ(nullptr, root->NextSibling());
+  EXPECT_EQ(child1, child0->NextSibling());
+  EXPECT_EQ(child2, child1->NextSibling());
+  EXPECT_EQ(nullptr, child2->NextSibling());
+  EXPECT_EQ(nullptr, grandchild->NextSibling());
 }
 
 // Do some simple manipulations of the frame tree, making sure that
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index de78df1..7a95b0fa 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -134,6 +134,28 @@
   }
 }
 
+// Ensure that we reset nav_entry_id_ in OnDidCommitProvisionalLoad if any of
+// the validations fail and lead to an early return.  Call disable() once we
+// know the commit will be successful.  Resetting nav_entry_id_ avoids acting on
+// any UpdateState or UpdateTitle messages after an ignored commit.
+class ScopedCommitStateResetter {
+ public:
+  explicit ScopedCommitStateResetter(RenderFrameHostImpl* render_frame_host)
+      : render_frame_host_(render_frame_host), disabled_(false) {}
+
+  ~ScopedCommitStateResetter() {
+    if (!disabled_) {
+      render_frame_host_->set_nav_entry_id(0);
+    }
+  }
+
+  void disable() { disabled_ = true; }
+
+ private:
+  RenderFrameHostImpl* render_frame_host_;
+  bool disabled_;
+};
+
 }  // namespace
 
 // static
@@ -708,6 +730,10 @@
 
   // The renderer process is gone, so this frame can no longer be loading.
   ResetLoadingState();
+
+  // Any future UpdateState or UpdateTitle messages from this or a recreated
+  // process should be ignored until the next commit.
+  set_nav_entry_id(0);
 }
 
 bool RenderFrameHostImpl::CreateRenderFrame(int proxy_routing_id,
@@ -951,6 +977,7 @@
 // get a new page_id because we need to create a new navigation entry for that
 // action.
 void RenderFrameHostImpl::OnDidCommitProvisionalLoad(const IPC::Message& msg) {
+  ScopedCommitStateResetter commit_state_resetter(this);
   RenderProcessHost* process = GetProcess();
 
   // Read the parameters out of the IPC message directly to avoid making another
@@ -1109,6 +1136,9 @@
   accessibility_reset_count_ = 0;
   frame_tree_node()->navigator()->DidNavigate(this, validated_params);
 
+  // Since we didn't early return, it's safe to keep the commit state.
+  commit_state_resetter.disable();
+
   // For a top-level frame, there are potential security concerns associated
   // with displaying graphics from a previously loaded page after the URL in
   // the omnibar has been changed. It is unappealing to clear the page
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h
index 45d8ca0c..663bace6 100644
--- a/content/browser/frame_host/render_frame_host_impl.h
+++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -583,6 +583,8 @@
                            RestoreSubframeFileAccessForHistoryNavigation);
   FRIEND_TEST_ALL_PREFIXES(RenderFrameHostManagerTest,
                            RenderViewInitAfterNewProxyAndProcessKill);
+  FRIEND_TEST_ALL_PREFIXES(RenderFrameHostManagerTest,
+                           UnloadPushStateOnCrossProcessNavigation);
   FRIEND_TEST_ALL_PREFIXES(SitePerProcessBrowserTest, CrashSubframe);
   FRIEND_TEST_ALL_PREFIXES(SitePerProcessBrowserTest,
                            RenderViewHostIsNotReusedAfterDelayedSwapOutACK);
diff --git a/content/browser/frame_host/render_frame_host_manager_browsertest.cc b/content/browser/frame_host/render_frame_host_manager_browsertest.cc
index 18100bf..ae972e8f 100644
--- a/content/browser/frame_host/render_frame_host_manager_browsertest.cc
+++ b/content/browser/frame_host/render_frame_host_manager_browsertest.cc
@@ -939,10 +939,9 @@
   // http://crbug.com/153701 is fixed.
 }
 
-// Test for crbug.com/278336. MessagePorts should work cross-process. I.e.,
-// messages which contain Transferables and get intercepted by
-// RenderViewImpl::willCheckAndDispatchMessageEvent (because the RenderView is
-// swapped out) should work.
+// Test for crbug.com/278336. MessagePorts should work cross-process. Messages
+// which contain Transferables that need to be forwarded between processes via
+// RenderFrameProxy::willCheckAndDispatchMessageEvent should work.
 // Specifically:
 // 1) Create 2 windows (opener and "foo") and send "foo" cross-process.
 // 2) Post a message containing a message port from opener to "foo".
@@ -2720,4 +2719,41 @@
                     "window.domAutomationController.send(ctrlClickLink());"));
 }
 
+// Ensure that we don't update the wrong NavigationEntry's title after an
+// ignored commit during a cross-process navigation.
+// See https://crbug.con/577449.
+IN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest,
+                       UnloadPushStateOnCrossProcessNavigation) {
+  StartEmbeddedServer();
+  WebContentsImpl* web_contents =
+      static_cast<WebContentsImpl*>(shell()->web_contents());
+  FrameTreeNode* root = web_contents->GetFrameTree()->root();
+
+  // Give an initial page an unload handler that does a pushState, which will be
+  // ignored by the browser process.  It then does a title update which is
+  // meant for a NavigationEntry that will never be created.
+  EXPECT_TRUE(NavigateToURL(
+      shell(), embedded_test_server()->GetURL("a.com", "/title2.html")));
+  EXPECT_TRUE(ExecuteScript(root->current_frame_host(),
+                            "window.onunload=function(e){"
+                            "history.pushState({}, 'foo', 'foo');"
+                            "document.title='foo'; };\n"));
+  base::string16 title = web_contents->GetTitle();
+  NavigationEntryImpl* entry = web_contents->GetController().GetEntryAtIndex(0);
+
+  // Navigate the first tab to a different site and wait for the old process to
+  // complete its unload handler and exit.
+  RenderFrameHostImpl* rfh_a = root->current_frame_host();
+  rfh_a->DisableSwapOutTimerForTesting();
+  RenderProcessHostWatcher exit_observer(
+      rfh_a->GetProcess(), RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT);
+  TestNavigationObserver commit_observer(web_contents);
+  shell()->LoadURL(embedded_test_server()->GetURL("b.com", "/title1.html"));
+  commit_observer.Wait();
+  exit_observer.Wait();
+
+  // Ensure the entry's title hasn't changed after the ignored commit.
+  EXPECT_EQ(title, entry->GetTitle());
+}
+
 }  // namespace content
diff --git a/content/browser/frame_host/render_widget_host_view_child_frame.cc b/content/browser/frame_host/render_widget_host_view_child_frame.cc
index 62bb821..7101a901 100644
--- a/content/browser/frame_host/render_widget_host_view_child_frame.cc
+++ b/content/browser/frame_host/render_widget_host_view_child_frame.cc
@@ -332,6 +332,27 @@
   }
 }
 
+void RenderWidgetHostViewChildFrame::WheelEventAck(
+    const blink::WebMouseWheelEvent& event,
+    InputEventAckState ack_result) {
+  if (frame_connector_ &&
+      (ack_result == INPUT_EVENT_ACK_STATE_NOT_CONSUMED ||
+       ack_result == INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS))
+    frame_connector_->BubbleScrollEvent(event);
+}
+
+void RenderWidgetHostViewChildFrame::GestureEventAck(
+    const blink::WebGestureEvent& event,
+    InputEventAckState ack_result) {
+  bool not_consumed = ack_result == INPUT_EVENT_ACK_STATE_NOT_CONSUMED ||
+                      ack_result == INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS;
+  // GestureScrollBegin/End are always consumed by the target frame, so we only
+  // forward GestureScrollUpdate.
+  if (frame_connector_ &&
+      event.type == blink::WebInputEvent::GestureScrollUpdate && not_consumed)
+    frame_connector_->BubbleScrollEvent(event);
+}
+
 void RenderWidgetHostViewChildFrame::SurfaceDrawn(uint32_t output_surface_id,
                                                   cc::SurfaceDrawStatus drawn) {
   cc::CompositorFrameAck ack;
diff --git a/content/browser/frame_host/render_widget_host_view_child_frame.h b/content/browser/frame_host/render_widget_host_view_child_frame.h
index 7aff9f6..9a2bd5e 100644
--- a/content/browser/frame_host/render_widget_host_view_child_frame.h
+++ b/content/browser/frame_host/render_widget_host_view_child_frame.h
@@ -121,6 +121,10 @@
       const base::Callback<void(const gfx::Rect&, bool)>& callback) override;
   bool CanCopyToVideoFrame() const override;
   bool HasAcceleratedSurface(const gfx::Size& desired_size) override;
+  void WheelEventAck(const blink::WebMouseWheelEvent& event,
+                     InputEventAckState ack_result) override;
+  void GestureEventAck(const blink::WebGestureEvent& event,
+                       InputEventAckState ack_result) override;
   void OnSwapCompositorFrame(
       uint32_t output_surface_id,
       std::unique_ptr<cc::CompositorFrame> frame) override;
diff --git a/content/browser/gpu/gpu_ipc_browsertests.cc b/content/browser/gpu/gpu_ipc_browsertests.cc
index fb20bfa..039febd 100644
--- a/content/browser/gpu/gpu_ipc_browsertests.cc
+++ b/content/browser/gpu/gpu_ipc_browsertests.cc
@@ -35,12 +35,13 @@
   attributes.samples = 0;
   attributes.sample_buffers = 0;
   attributes.bind_generates_resource = false;
-  bool automatic_flushes = false;
+  constexpr bool automatic_flushes = false;
+  constexpr bool support_locking = false;
   return make_scoped_refptr(new content::ContextProviderCommandBuffer(
       std::move(gpu_channel_host), gpu::GPU_STREAM_DEFAULT,
       gpu::GpuStreamPriority::NORMAL, gpu::kNullSurfaceHandle, GURL(),
-      gfx::PreferIntegratedGpu, automatic_flushes, gpu::SharedMemoryLimits(),
-      attributes, nullptr,
+      gfx::PreferIntegratedGpu, automatic_flushes, support_locking,
+      gpu::SharedMemoryLimits(), attributes, nullptr,
       content::command_buffer_metrics::OFFSCREEN_CONTEXT_FOR_TESTING));
 }
 
diff --git a/content/browser/gpu/gpu_surface_tracker.h b/content/browser/gpu/gpu_surface_tracker.h
index bb5c5c4a..51cad76 100644
--- a/content/browser/gpu/gpu_surface_tracker.h
+++ b/content/browser/gpu/gpu_surface_tracker.h
@@ -22,7 +22,7 @@
 // This class is used on Android and Mac, and is responsible for tracking native
 // window surfaces exposed to the GPU process. Every surface gets registered to
 // this class, and gets a handle.  The handle can be passed to
-// GpuChannelHost::CreateCommandBuffer or to
+// CommandBufferProxyImpl::Create or to
 // GpuMemoryBufferManager::AllocateGpuMemoryBuffer.
 // On Android, the handle is used in the GPU process to get a reference to the
 // ANativeWindow, using GpuSurfaceLookup (implemented by
diff --git a/content/browser/mojo/browser_shell_connection.cc b/content/browser/mojo/browser_shell_connection.cc
index a39e8ee..71e3bf3 100644
--- a/content/browser/mojo/browser_shell_connection.cc
+++ b/content/browser/mojo/browser_shell_connection.cc
@@ -6,6 +6,7 @@
 
 #include "base/bind.h"
 #include "content/browser/mojo/constants.h"
+#include "content/public/common/mojo_application_info.h"
 #include "services/shell/public/interfaces/connector.mojom.h"
 
 namespace content {
@@ -25,10 +26,9 @@
 
 void BrowserShellConnection::AddEmbeddedApplication(
     const base::StringPiece& name,
-    const EmbeddedApplicationRunner::FactoryCallback& callback,
-    const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) {
+    const MojoApplicationInfo& info) {
   std::unique_ptr<EmbeddedApplicationRunner> app(
-      new EmbeddedApplicationRunner(callback, task_runner));
+      new EmbeddedApplicationRunner(name, info));
   AddShellClientRequestHandler(
       name, base::Bind(&EmbeddedApplicationRunner::BindShellClientRequest,
                        base::Unretained(app.get())));
diff --git a/content/browser/mojo/browser_shell_connection.h b/content/browser/mojo/browser_shell_connection.h
index 75e5876..6296832 100644
--- a/content/browser/mojo/browser_shell_connection.h
+++ b/content/browser/mojo/browser_shell_connection.h
@@ -15,6 +15,7 @@
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_piece.h"
 #include "content/common/mojo/embedded_application_runner.h"
+#include "content/public/common/mojo_application_info.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
 #include "services/shell/public/cpp/connector.h"
 #include "services/shell/public/cpp/interface_factory.h"
@@ -49,14 +50,10 @@
   shell::Connector* GetConnector();
 
   // Adds an embedded application to this connection's ShellClientFactory.
-  // |callback| will be used to create a new instance of the application on
-  // |task_runner|'s thread if no instance is running when an incoming
-  // connection is made to |name|. If |task_runner| is null, the calling thread
-  // will be used to run the application.
-  void AddEmbeddedApplication(
-      const base::StringPiece& name,
-      const EmbeddedApplicationRunner::FactoryCallback& callback,
-      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner);
+  // |info| provides details on how to construct new instances of the
+  // application when an incoming connection is made to |name|.
+  void AddEmbeddedApplication(const base::StringPiece& name,
+                              const MojoApplicationInfo& info);
 
   // Adds a generic ShellClientRequestHandler for a given application name. This
   // will be used to satisfy any incoming calls to CreateShellClient() which
diff --git a/content/browser/mojo/mojo_shell_context.cc b/content/browser/mojo/mojo_shell_context.cc
index e99e14f..9ed0b91 100644
--- a/content/browser/mojo/mojo_shell_context.cc
+++ b/content/browser/mojo/mojo_shell_context.cc
@@ -278,11 +278,8 @@
 
   ContentBrowserClient::StaticMojoApplicationMap apps;
   GetContentClient()->browser()->RegisterInProcessMojoApplications(&apps);
-  for (const auto& entry : apps) {
-    browser_shell_connection->AddEmbeddedApplication(
-        entry.first, entry.second.application_factory,
-        entry.second.application_task_runner);
-  }
+  for (const auto& entry : apps)
+    browser_shell_connection->AddEmbeddedApplication(entry.first, entry.second);
 
   ContentBrowserClient::OutOfProcessMojoApplicationMap sandboxed_apps;
   GetContentClient()
diff --git a/content/browser/renderer_host/compositor_impl_android.cc b/content/browser/renderer_host/compositor_impl_android.cc
index 7180df1..2aedd74 100644
--- a/content/browser/renderer_host/compositor_impl_android.cc
+++ b/content/browser/renderer_host/compositor_impl_android.cc
@@ -663,6 +663,7 @@
 
     GURL url("chrome://gpu/CompositorImpl::CreateOutputSurface");
     constexpr bool automatic_flushes = false;
+    constexpr bool support_locking = false;
 
     constexpr size_t kBytesPerPixel = 4;
     const size_t full_screen_texture_size_in_bytes =
@@ -686,8 +687,9 @@
     context_provider = new ContextProviderCommandBuffer(
         std::move(gpu_channel_host), gpu::GPU_STREAM_DEFAULT,
         gpu::GpuStreamPriority::NORMAL, surface_handle_, url,
-        gfx::PreferIntegratedGpu, automatic_flushes, limits, attributes,
-        nullptr, command_buffer_metrics::DISPLAY_COMPOSITOR_ONSCREEN_CONTEXT);
+        gfx::PreferIntegratedGpu, automatic_flushes, support_locking, limits,
+        attributes, nullptr,
+        command_buffer_metrics::DISPLAY_COMPOSITOR_ONSCREEN_CONTEXT);
     DCHECK(context_provider.get());
 
     real_output_surface = base::WrapUnique(new OutputSurfaceWithoutParent(
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
index 109b6bf..c457e2c 100644
--- a/content/browser/renderer_host/render_view_host_impl.cc
+++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -980,8 +980,7 @@
 }
 
 void RenderViewHostImpl::OnShowFullscreenWidget(int route_id) {
-  if (is_active_)
-    delegate_->ShowCreatedFullscreenWidget(route_id);
+  delegate_->ShowCreatedFullscreenWidget(route_id);
   Send(new ViewMsg_Move_ACK(route_id));
 }
 
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc
index 2c0dafc..2f4d49c 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -182,13 +182,15 @@
   // screen readback to be mapped.
   limits.mapped_memory_reclaim_limit = full_screen_texture_size_in_bytes;
 
-  bool automatic_flushes = false;
-  GURL url("chrome://gpu/RenderWidgetHostViewAndroid");
+  constexpr bool automatic_flushes = false;
+  constexpr bool support_locking = false;
+  const GURL url("chrome://gpu/RenderWidgetHostViewAndroid");
 
   provider_ = new ContextProviderCommandBuffer(
       std::move(gpu_channel_host), gpu::GPU_STREAM_DEFAULT,
       gpu::GpuStreamPriority::NORMAL, gpu::kNullSurfaceHandle, url,
-      gfx::PreferIntegratedGpu, automatic_flushes, limits, attributes, nullptr,
+      gfx::PreferIntegratedGpu, automatic_flushes, support_locking, limits,
+      attributes, nullptr,
       command_buffer_metrics::BROWSER_OFFSCREEN_MAINTHREAD_CONTEXT);
   if (!provider_->BindToCurrentThread())
     return;
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc
index e0700c5..9e312c8 100644
--- a/content/browser/site_per_process_browsertest.cc
+++ b/content/browser/site_per_process_browsertest.cc
@@ -802,10 +802,15 @@
   gfx::Rect last_rect() const { return last_rect_; }
 
   void Wait() {
-    last_rect_ = gfx::Rect();
     message_loop_runner_->Run();
   }
 
+  void Reset() {
+    last_rect_ = gfx::Rect();
+    message_loop_runner_ = new content::MessageLoopRunner;
+    frame_rect_received_ = false;
+  }
+
  private:
   ~FrameRectChangedMessageFilter() override {}
 
@@ -908,6 +913,154 @@
   EXPECT_LT(update_rect.y(), bounds.y() - rwhv_root->GetViewBounds().y());
 }
 
+// Test that scrolling a nested out-of-process iframe bubbles unused scroll
+// delta to a parent frame.
+#if defined(OS_ANDROID)
+// Browser process hit testing is not implemented on Android.
+// https://crbug.com/491334
+#define MAYBE_ScrollBubblingFromOOPIFTest DISABLED_ScrollBubblingFromOOPIFTest
+#else
+#define MAYBE_ScrollBubblingFromOOPIFTest ScrollBubblingFromOOPIFTest
+#endif
+IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
+                       MAYBE_ScrollBubblingFromOOPIFTest) {
+  GURL main_url(embedded_test_server()->GetURL(
+      "a.com", "/cross_site_iframe_factory.html?a(b)"));
+  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();
+  ASSERT_EQ(1U, root->child_count());
+
+  FrameTreeNode* parent_iframe_node = root->child_at(0);
+
+  // This test uses the position of the nested iframe within the parent iframe
+  // to infer the scroll position of the parent. FrameRectChangedMessageFilter
+  // catches updates to the position in order to avoid busy waiting.
+  // It gets set created early to catch the initial rects from the navigation.
+  scoped_refptr<FrameRectChangedMessageFilter> filter =
+      new FrameRectChangedMessageFilter();
+  parent_iframe_node->current_frame_host()->GetProcess()->AddFilter(
+      filter.get());
+
+  GURL site_url(embedded_test_server()->GetURL(
+      "b.com", "/frame_tree/page_with_positioned_frame.html"));
+  NavigateFrameToURL(parent_iframe_node, site_url);
+
+  EXPECT_EQ(
+      " Site A ------------ proxies for B C\n"
+      "   +--Site B ------- proxies for A C\n"
+      "        +--Site C -- proxies for A B\n"
+      "Where A = http://a.com/\n"
+      "      B = http://b.com/\n"
+      "      C = http://baz.com/",
+      DepictFrameTree(root));
+
+  RenderWidgetHostViewBase* rwhv_parent =
+      static_cast<RenderWidgetHostViewBase*>(
+          parent_iframe_node->current_frame_host()
+              ->GetRenderWidgetHost()
+              ->GetView());
+
+  FrameTreeNode* nested_iframe_node = parent_iframe_node->child_at(0);
+  RenderWidgetHostViewBase* rwhv_nested =
+      static_cast<RenderWidgetHostViewBase*>(
+          nested_iframe_node->current_frame_host()
+              ->GetRenderWidgetHost()
+              ->GetView());
+
+  SurfaceHitTestReadyNotifier notifier(
+      static_cast<RenderWidgetHostViewChildFrame*>(rwhv_nested));
+  notifier.WaitForSurfaceReady();
+
+  // Save the original offset as a point of reference.
+  filter->Wait();
+  gfx::Rect update_rect = filter->last_rect();
+  int initial_y = update_rect.y();
+  filter->Reset();
+
+  // Scroll the parent frame downward.
+  blink::WebMouseWheelEvent scroll_event;
+  scroll_event.type = blink::WebInputEvent::MouseWheel;
+  scroll_event.x = 1;
+  scroll_event.y = 1;
+  scroll_event.deltaX = 0.0f;
+  scroll_event.deltaY = -5.0f;
+  rwhv_parent->ProcessMouseWheelEvent(scroll_event);
+
+  // Ensure that the view position is propagated to the child properly.
+  filter->Wait();
+  update_rect = filter->last_rect();
+  EXPECT_LT(update_rect.y(), initial_y);
+  filter->Reset();
+
+  // Now scroll the nested frame upward, which should bubble to the parent.
+  // The upscroll exceeds the amount that the frame was initially scrolled
+  // down to account for rounding.
+  scroll_event.deltaY = 6.0f;
+  rwhv_nested->ProcessMouseWheelEvent(scroll_event);
+
+  filter->Wait();
+  // This loop isn't great, but it accounts for the possibility of multiple
+  // incremental updates happening as a result of the scroll animation.
+  // A failure condition of this test is that the loop might not terminate
+  // due to bubbling not working properly. If the overscroll bubbles to the
+  // parent iframe then the nested frame's y coord will return to its
+  // initial position.
+  update_rect = filter->last_rect();
+  while (update_rect.y() > initial_y) {
+    base::RunLoop run_loop;
+    base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+        FROM_HERE, run_loop.QuitClosure(), TestTimeouts::tiny_timeout());
+    run_loop.Run();
+    update_rect = filter->last_rect();
+  }
+
+  filter->Reset();
+
+  // Scroll the parent down again in order to test scroll bubbling from
+  // gestures.
+  scroll_event.deltaY = -5.0f;
+  rwhv_parent->ProcessMouseWheelEvent(scroll_event);
+
+  // Ensure ensuing offset change is received, and then reset the filter.
+  filter->Wait();
+  filter->Reset();
+
+  // Scroll down the nested iframe via gesture. This requires 3 separate input
+  // events.
+  blink::WebGestureEvent gesture_event;
+  gesture_event.type = blink::WebGestureEvent::GestureScrollBegin;
+  gesture_event.sourceDevice = blink::WebGestureDeviceTouchpad;
+  gesture_event.x = 1;
+  gesture_event.y = 1;
+  rwhv_nested->GetRenderWidgetHost()->ForwardGestureEvent(gesture_event);
+
+  gesture_event.type = blink::WebGestureEvent::GestureScrollUpdate;
+  gesture_event.data.scrollUpdate.deltaX = 0.0f;
+  gesture_event.data.scrollUpdate.deltaY = 6.0f;
+  gesture_event.data.scrollUpdate.velocityX = 0;
+  gesture_event.data.scrollUpdate.velocityY = 0;
+  rwhv_nested->GetRenderWidgetHost()->ForwardGestureEvent(gesture_event);
+
+  gesture_event.type = blink::WebGestureEvent::GestureScrollEnd;
+  rwhv_nested->GetRenderWidgetHost()->ForwardGestureEvent(gesture_event);
+
+  filter->Wait();
+  update_rect = filter->last_rect();
+  // As above, if this loop does not terminate then it indicates an issue
+  // with scroll bubbling.
+  while (update_rect.y() > initial_y) {
+    base::RunLoop run_loop;
+    base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+        FROM_HERE, run_loop.QuitClosure(), TestTimeouts::tiny_timeout());
+    run_loop.Run();
+    update_rect = filter->last_rect();
+  }
+}
+
 // Test that mouse events are being routed to the correct RenderWidgetHostView
 // based on coordinates.
 #if defined(OS_ANDROID) || defined(THREAD_SANITIZER)
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index e44ae4f..5621f827 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -105,6 +105,7 @@
 #include "content/public/common/bindings_policy.h"
 #include "content/public/common/browser_plugin_guest_mode.h"
 #include "content/public/common/browser_side_navigation_policy.h"
+#include "content/public/common/child_process_host.h"
 #include "content/public/common/content_constants.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/common/page_zoom.h"
@@ -404,6 +405,7 @@
       zoom_scroll_remainder_(0),
       render_view_message_source_(NULL),
       render_frame_message_source_(NULL),
+      fullscreen_widget_process_id_(ChildProcessHost::kInvalidUniqueID),
       fullscreen_widget_routing_id_(MSG_ROUTING_NONE),
       fullscreen_widget_had_focus_at_shutdown_(false),
       is_subframe_(false),
@@ -855,10 +857,6 @@
     browser_plugin_embedder_->CancelGuestDialogs();
 }
 
-int WebContentsImpl::GetFullscreenWidgetRoutingID() const {
-  return fullscreen_widget_routing_id_;
-}
-
 void WebContentsImpl::ClosePage() {
   GetRenderViewHost()->ClosePage();
 }
@@ -876,8 +874,8 @@
 RenderWidgetHostView* WebContentsImpl::GetFullscreenRenderWidgetHostView()
     const {
   RenderWidgetHost* const widget_host =
-      RenderWidgetHostImpl::FromID(GetRenderProcessHost()->GetID(),
-                                   GetFullscreenWidgetRoutingID());
+      RenderWidgetHostImpl::FromID(fullscreen_widget_process_id_,
+                                   fullscreen_widget_routing_id_);
   return widget_host ? widget_host->GetView() : NULL;
 }
 
@@ -1679,12 +1677,15 @@
     return;
 
   if (render_widget_host &&
-      render_widget_host->GetRoutingID() == fullscreen_widget_routing_id_) {
+      render_widget_host->GetRoutingID() == fullscreen_widget_routing_id_ &&
+      render_widget_host->GetProcess()->GetID() ==
+          fullscreen_widget_process_id_) {
     if (delegate_ && delegate_->EmbedsFullscreenWidget())
       delegate_->ExitFullscreenModeForTab(this);
     FOR_EACH_OBSERVER(WebContentsObserver,
                       observers_,
                       DidDestroyFullscreenWidget());
+    fullscreen_widget_process_id_ = ChildProcessHost::kInvalidUniqueID;
     fullscreen_widget_routing_id_ = MSG_ROUTING_NONE;
     if (fullscreen_widget_had_focus_at_shutdown_)
       view_->RestoreFocus();
@@ -2176,6 +2177,8 @@
   if (is_fullscreen) {
     DCHECK_EQ(MSG_ROUTING_NONE, fullscreen_widget_routing_id_);
     view_->StoreFocus();
+    fullscreen_widget_process_id_ =
+        widget_host_view->GetRenderWidgetHost()->GetProcess()->GetID();
     fullscreen_widget_routing_id_ = route_id;
     if (delegate_ && delegate_->EmbedsFullscreenWidget()) {
       widget_host_view->InitAsChild(GetRenderWidgetHostView()->GetNativeView());
@@ -2803,11 +2806,9 @@
 }
 
 void WebContentsImpl::GenerateMHTML(
-    const base::FilePath& file,
-    bool use_binary_encoding,
+    const MHTMLGenerationParams& params,
     const base::Callback<void(int64_t)>& callback) {
-  MHTMLGenerationManager::GetInstance()->SaveMHTML(this, use_binary_encoding,
-                                                   file, callback);
+  MHTMLGenerationManager::GetInstance()->SaveMHTML(this, params, callback);
 }
 
 const std::string& WebContentsImpl::GetContentsMimeType() const {
@@ -4426,9 +4427,10 @@
   NavigationEntryImpl* entry = controller_.GetEntryWithPageID(
       render_frame_host->GetSiteInstance(), page_id);
 
-  // TODO(creis): Find a way to use nav entry IDs to locate the entry to update,
-  // and intentionally skip updates when the most recent commit was ignored.
-  // See https://crbug.com/577449.
+  // TODO(creis): Switch to use this as the default.
+  NavigationEntryImpl* new_entry = controller_.GetEntryWithUniqueID(
+      static_cast<RenderFrameHostImpl*>(render_frame_host)->nav_entry_id());
+  DCHECK_EQ(entry, new_entry);
 
   // We can handle title updates when we don't have an entry in
   // UpdateTitleForEntry, but only if the update is from the current RVH.
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h
index 92919be4..ef56b7d 100644
--- a/content/browser/web_contents/web_contents_impl.h
+++ b/content/browser/web_contents/web_contents_impl.h
@@ -83,6 +83,7 @@
 struct ColorSuggestion;
 struct FaviconURL;
 struct LoadNotificationDetails;
+struct MHTMLGenerationParams;
 struct ResourceRedirectDetails;
 struct ResourceRequestDetails;
 
@@ -167,10 +168,6 @@
   // plugins it is hosting.
   void CancelActiveAndPendingDialogs();
 
-  // Gets the current fullscreen render widget's routing ID. Returns
-  // MSG_ROUTING_NONE when there is no fullscreen render widget.
-  int GetFullscreenWidgetRoutingID() const;
-
   // Invoked when visible SSL state (as defined by SSLStatus) changes.
   void DidChangeVisibleSSLState();
 
@@ -355,8 +352,7 @@
   void SaveFrameWithHeaders(const GURL& url,
                             const Referrer& referrer,
                             const std::string& headers) override;
-  void GenerateMHTML(const base::FilePath& file,
-                     bool use_binary_encoding,
+  void GenerateMHTML(const MHTMLGenerationParams& params,
                      const base::Callback<void(int64_t)>& callback) override;
   const std::string& GetContentsMimeType() const override;
   bool WillNotifyDisconnection() const override;
@@ -1317,6 +1313,10 @@
   // outlive it.
   std::set<RenderWidgetHostImpl*> created_widgets_;
 
+  // Process id of the shown fullscreen widget, or kInvalidUniqueID if there is
+  // no fullscreen widget.
+  int fullscreen_widget_process_id_;
+
   // Routing id of the shown fullscreen widget or MSG_ROUTING_NONE otherwise.
   int fullscreen_widget_routing_id_;
 
diff --git a/content/child/assert_matching_enums.cc b/content/child/assert_matching_enums.cc
index 69025290..21e5771 100644
--- a/content/child/assert_matching_enums.cc
+++ b/content/child/assert_matching_enums.cc
@@ -6,10 +6,12 @@
 // from Blink are valid.
 
 #include "base/macros.h"
+#include "content/public/common/mhtml_generation_params.h"
 #include "content/public/common/screen_orientation_values.h"
 #include "media/base/mime_util.h"
 #include "third_party/WebKit/public/platform/WebMimeRegistry.h"
 #include "third_party/WebKit/public/platform/modules/screen_orientation/WebScreenOrientationLockType.h"
+#include "third_party/WebKit/public/web/WebFrameSerializerCacheControlPolicy.h"
 
 namespace content {
 
@@ -44,4 +46,13 @@
 STATIC_ASSERT_ENUM(blink::WebMimeRegistry::MayBeSupported,
                    media::MayBeSupported);
 
+// MHTMLCacheControlPolicy
+STATIC_ASSERT_ENUM(blink::WebFrameSerializerCacheControlPolicy::None,
+                   MHTMLCacheControlPolicy::NONE);
+STATIC_ASSERT_ENUM(
+    blink::WebFrameSerializerCacheControlPolicy::FailForNoStoreMainFrame,
+    MHTMLCacheControlPolicy::FAIL_FOR_NO_STORE_MAIN_FRAME);
+STATIC_ASSERT_ENUM(blink::WebFrameSerializerCacheControlPolicy::Last,
+                   MHTMLCacheControlPolicy::LAST);
+
 } // namespace content
diff --git a/content/child/notifications/notification_manager.cc b/content/child/notifications/notification_manager.cc
index f769e7a..e95e7a8 100644
--- a/content/child/notifications/notification_manager.cc
+++ b/content/child/notifications/notification_manager.cc
@@ -209,7 +209,7 @@
   }
 }
 
-blink::mojom::PermissionStatus NotificationManager::checkPermission(
+blink::mojom::blink::PermissionStatus NotificationManager::checkPermission(
     const blink::WebSecurityOrigin& origin) {
   blink::mojom::PermissionStatus permission_status =
       blink::mojom::PermissionStatus::DENIED;
@@ -220,7 +220,7 @@
   thread_safe_sender_->Send(new PlatformNotificationHostMsg_CheckPermission(
       blink::WebStringToGURL(origin.toString()), &permission_status));
 
-  return permission_status;
+  return static_cast<blink::mojom::blink::PermissionStatus>(permission_status);
 }
 
 bool NotificationManager::OnMessageReceived(const IPC::Message& message) {
diff --git a/content/child/notifications/notification_manager.h b/content/child/notifications/notification_manager.h
index 638fa4b..88ad278 100644
--- a/content/child/notifications/notification_manager.h
+++ b/content/child/notifications/notification_manager.h
@@ -61,7 +61,7 @@
                        int64_t persistent_notification_id) override;
   void notifyDelegateDestroyed(
       blink::WebNotificationDelegate* delegate) override;
-  blink::mojom::PermissionStatus checkPermission(
+  blink::mojom::blink::PermissionStatus checkPermission(
       const blink::WebSecurityOrigin& origin) override;
 
   // Called by the NotificationDispatcher.
diff --git a/content/child/process_control_impl.cc b/content/child/process_control_impl.cc
index 7a1e4d7..2954486 100644
--- a/content/child/process_control_impl.cc
+++ b/content/child/process_control_impl.cc
@@ -30,8 +30,7 @@
     RegisterApplications(&apps);
     for (const auto& app : apps) {
       std::unique_ptr<EmbeddedApplicationRunner> runner(
-          new EmbeddedApplicationRunner(app.second.application_factory,
-                                        app.second.application_task_runner));
+          new EmbeddedApplicationRunner(app.first, app.second));
       runner->SetQuitClosure(base::Bind(&ProcessControlImpl::OnApplicationQuit,
                                         base::Unretained(this)));
       apps_.insert(std::make_pair(app.first, std::move(runner)));
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
index de37147..29b72e11 100644
--- a/content/child/runtime_features.cc
+++ b/content/child/runtime_features.cc
@@ -61,8 +61,8 @@
   if (command_line.HasSwitch(switches::kEnableExperimentalWebPlatformFeatures))
     WebRuntimeFeatures::enableExperimentalFeatures(true);
 
-  WebRuntimeFeatures::enableExperimentalFramework(
-      base::FeatureList::IsEnabled(features::kExperimentalFramework));
+  WebRuntimeFeatures::enableOriginTrials(
+      base::FeatureList::IsEnabled(features::kOriginTrials));
 
   if (command_line.HasSwitch(switches::kEnableWebBluetooth))
     WebRuntimeFeatures::enableWebBluetooth(true);
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn
index 284ec467..b4005ba 100644
--- a/content/common/BUILD.gn
+++ b/content/common/BUILD.gn
@@ -39,6 +39,7 @@
     "//base/third_party/dynamic_annotations",
     "//build/util:webkit_version",
     "//cc",
+    "//cc/ipc",
     "//cc/surfaces",
     "//components/mus/public/interfaces",
     "//components/tracing",
diff --git a/content/common/cc_messages.h b/content/common/cc_messages.h
deleted file mode 100644
index 0c69111a..0000000
--- a/content/common/cc_messages.h
+++ /dev/null
@@ -1,351 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// IPC Messages sent between compositor instances.
-
-#include "cc/output/begin_frame_args.h"
-#include "cc/output/compositor_frame.h"
-#include "cc/output/compositor_frame_ack.h"
-#include "cc/output/filter_operation.h"
-#include "cc/output/viewport_selection_bound.h"
-#include "cc/quads/debug_border_draw_quad.h"
-#include "cc/quads/draw_quad.h"
-#include "cc/quads/io_surface_draw_quad.h"
-#include "cc/quads/picture_draw_quad.h"
-#include "cc/quads/render_pass.h"
-#include "cc/quads/render_pass_draw_quad.h"
-#include "cc/quads/shared_quad_state.h"
-#include "cc/quads/solid_color_draw_quad.h"
-#include "cc/quads/stream_video_draw_quad.h"
-#include "cc/quads/surface_draw_quad.h"
-#include "cc/quads/texture_draw_quad.h"
-#include "cc/quads/tile_draw_quad.h"
-#include "cc/quads/yuv_video_draw_quad.h"
-#include "cc/resources/resource_format.h"
-#include "cc/resources/returned_resource.h"
-#include "cc/resources/transferable_resource.h"
-#include "cc/surfaces/surface_id.h"
-#include "cc/surfaces/surface_sequence.h"
-#include "content/common/content_export.h"
-#include "gpu/ipc/common/gpu_command_buffer_traits.h"
-#include "ipc/ipc_message_macros.h"
-#include "ui/gfx/ipc/gfx_param_traits.h"
-#include "ui/gfx/ipc/skia/gfx_skia_param_traits.h"
-
-#ifndef CONTENT_COMMON_CC_MESSAGES_H_
-#define CONTENT_COMMON_CC_MESSAGES_H_
-
-namespace gfx {
-class Transform;
-}
-
-namespace cc {
-class FilterOperations;
-}
-
-namespace IPC {
-
-template <>
-struct ParamTraits<cc::FilterOperation> {
-  typedef cc::FilterOperation param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct ParamTraits<cc::FilterOperations> {
-  typedef cc::FilterOperations param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct ParamTraits<sk_sp<SkImageFilter> > {
-  typedef sk_sp<SkImageFilter> param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct CONTENT_EXPORT ParamTraits<cc::RenderPass> {
-  typedef cc::RenderPass param_type;
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template<>
-struct CONTENT_EXPORT ParamTraits<cc::CompositorFrame> {
-  typedef cc::CompositorFrame param_type;
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* p);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template<>
-struct CONTENT_EXPORT ParamTraits<cc::CompositorFrameAck> {
-  typedef cc::CompositorFrameAck param_type;
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* p);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template<>
-struct CONTENT_EXPORT ParamTraits<cc::DelegatedFrameData> {
-  typedef cc::DelegatedFrameData param_type;
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* p);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct CONTENT_EXPORT ParamTraits<cc::DrawQuad::Resources> {
-  typedef cc::DrawQuad::Resources param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* p);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct CONTENT_EXPORT ParamTraits<cc::StreamVideoDrawQuad::OverlayResources> {
-  typedef cc::StreamVideoDrawQuad::OverlayResources param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* p);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct CONTENT_EXPORT ParamTraits<cc::TextureDrawQuad::OverlayResources> {
-  typedef cc::TextureDrawQuad::OverlayResources param_type;
-  static void GetSize(base::PickleSizer* s, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* p);
-  static void Log(const param_type& p, std::string* l);
-};
-
-}  // namespace IPC
-
-#endif  // CONTENT_COMMON_CC_MESSAGES_H_
-
-// Multiply-included message file, hence no include guard.
-
-#define IPC_MESSAGE_START CCMsgStart
-#undef IPC_MESSAGE_EXPORT
-#define IPC_MESSAGE_EXPORT CONTENT_EXPORT
-
-IPC_ENUM_TRAITS_MAX_VALUE(cc::DrawQuad::Material, cc::DrawQuad::MATERIAL_LAST)
-IPC_ENUM_TRAITS_MAX_VALUE(cc::IOSurfaceDrawQuad::Orientation,
-                          cc::IOSurfaceDrawQuad::ORIENTATION_LAST)
-IPC_ENUM_TRAITS_MAX_VALUE(cc::FilterOperation::FilterType,
-                          cc::FilterOperation::FILTER_TYPE_LAST )
-IPC_ENUM_TRAITS_MAX_VALUE(cc::ResourceFormat, cc::RESOURCE_FORMAT_MAX)
-IPC_ENUM_TRAITS_MAX_VALUE(cc::SelectionBoundType, cc::SELECTION_BOUND_TYPE_LAST)
-IPC_ENUM_TRAITS_MAX_VALUE(SkXfermode::Mode, SkXfermode::kLastMode)
-IPC_ENUM_TRAITS_MAX_VALUE(cc::YUVVideoDrawQuad::ColorSpace,
-                          cc::YUVVideoDrawQuad::COLOR_SPACE_LAST)
-
-IPC_STRUCT_TRAITS_BEGIN(cc::RenderPassId)
-  IPC_STRUCT_TRAITS_MEMBER(layer_id)
-  IPC_STRUCT_TRAITS_MEMBER(index)
-IPC_STRUCT_TRAITS_END()
-
-IPC_STRUCT_TRAITS_BEGIN(cc::SurfaceId)
-  IPC_STRUCT_TRAITS_MEMBER(id)
-IPC_STRUCT_TRAITS_END()
-
-IPC_STRUCT_TRAITS_BEGIN(cc::SurfaceSequence)
-  IPC_STRUCT_TRAITS_MEMBER(id_namespace)
-  IPC_STRUCT_TRAITS_MEMBER(sequence)
-IPC_STRUCT_TRAITS_END()
-
-IPC_STRUCT_TRAITS_BEGIN(cc::DrawQuad)
-  IPC_STRUCT_TRAITS_MEMBER(material)
-  IPC_STRUCT_TRAITS_MEMBER(rect)
-  IPC_STRUCT_TRAITS_MEMBER(opaque_rect)
-  IPC_STRUCT_TRAITS_MEMBER(visible_rect)
-  IPC_STRUCT_TRAITS_MEMBER(needs_blending)
-  IPC_STRUCT_TRAITS_MEMBER(resources)
-IPC_STRUCT_TRAITS_END()
-
-IPC_STRUCT_TRAITS_BEGIN(cc::DebugBorderDrawQuad)
-  IPC_STRUCT_TRAITS_PARENT(cc::DrawQuad)
-  IPC_STRUCT_TRAITS_MEMBER(color)
-  IPC_STRUCT_TRAITS_MEMBER(width)
-IPC_STRUCT_TRAITS_END()
-
-IPC_STRUCT_TRAITS_BEGIN(cc::IOSurfaceDrawQuad)
-  IPC_STRUCT_TRAITS_PARENT(cc::DrawQuad)
-  IPC_STRUCT_TRAITS_MEMBER(io_surface_size)
-  IPC_STRUCT_TRAITS_MEMBER(orientation)
-IPC_STRUCT_TRAITS_END()
-
-IPC_STRUCT_TRAITS_BEGIN(cc::RenderPassDrawQuad)
-  IPC_STRUCT_TRAITS_PARENT(cc::DrawQuad)
-  IPC_STRUCT_TRAITS_MEMBER(render_pass_id)
-  IPC_STRUCT_TRAITS_MEMBER(mask_uv_scale)
-  IPC_STRUCT_TRAITS_MEMBER(mask_texture_size)
-  IPC_STRUCT_TRAITS_MEMBER(filters)
-  IPC_STRUCT_TRAITS_MEMBER(filters_scale)
-  IPC_STRUCT_TRAITS_MEMBER(background_filters)
-IPC_STRUCT_TRAITS_END()
-
-IPC_STRUCT_TRAITS_BEGIN(cc::SolidColorDrawQuad)
-  IPC_STRUCT_TRAITS_PARENT(cc::DrawQuad)
-  IPC_STRUCT_TRAITS_MEMBER(color)
-  IPC_STRUCT_TRAITS_MEMBER(force_anti_aliasing_off)
-IPC_STRUCT_TRAITS_END()
-
-IPC_STRUCT_TRAITS_BEGIN(cc::StreamVideoDrawQuad)
-  IPC_STRUCT_TRAITS_PARENT(cc::DrawQuad)
-  IPC_STRUCT_TRAITS_MEMBER(overlay_resources)
-  IPC_STRUCT_TRAITS_MEMBER(matrix)
-IPC_STRUCT_TRAITS_END()
-
-IPC_STRUCT_TRAITS_BEGIN(cc::SurfaceDrawQuad)
-  IPC_STRUCT_TRAITS_PARENT(cc::DrawQuad)
-  IPC_STRUCT_TRAITS_MEMBER(surface_id)
-IPC_STRUCT_TRAITS_END()
-
-IPC_STRUCT_TRAITS_BEGIN(cc::TextureDrawQuad)
-  IPC_STRUCT_TRAITS_PARENT(cc::DrawQuad)
-  IPC_STRUCT_TRAITS_MEMBER(overlay_resources)
-  IPC_STRUCT_TRAITS_MEMBER(premultiplied_alpha)
-  IPC_STRUCT_TRAITS_MEMBER(uv_top_left)
-  IPC_STRUCT_TRAITS_MEMBER(uv_bottom_right)
-  IPC_STRUCT_TRAITS_MEMBER(background_color)
-  IPC_STRUCT_TRAITS_MEMBER(vertex_opacity[0])
-  IPC_STRUCT_TRAITS_MEMBER(vertex_opacity[1])
-  IPC_STRUCT_TRAITS_MEMBER(vertex_opacity[2])
-  IPC_STRUCT_TRAITS_MEMBER(vertex_opacity[3])
-  IPC_STRUCT_TRAITS_MEMBER(y_flipped)
-  IPC_STRUCT_TRAITS_MEMBER(nearest_neighbor)
-IPC_STRUCT_TRAITS_END()
-
-IPC_STRUCT_TRAITS_BEGIN(cc::TileDrawQuad)
-  IPC_STRUCT_TRAITS_PARENT(cc::DrawQuad)
-  IPC_STRUCT_TRAITS_MEMBER(tex_coord_rect)
-  IPC_STRUCT_TRAITS_MEMBER(texture_size)
-  IPC_STRUCT_TRAITS_MEMBER(swizzle_contents)
-  IPC_STRUCT_TRAITS_MEMBER(nearest_neighbor)
-IPC_STRUCT_TRAITS_END()
-
-IPC_STRUCT_TRAITS_BEGIN(cc::YUVVideoDrawQuad)
-  IPC_STRUCT_TRAITS_PARENT(cc::DrawQuad)
-  IPC_STRUCT_TRAITS_MEMBER(ya_tex_coord_rect)
-  IPC_STRUCT_TRAITS_MEMBER(uv_tex_coord_rect)
-  IPC_STRUCT_TRAITS_MEMBER(ya_tex_size)
-  IPC_STRUCT_TRAITS_MEMBER(uv_tex_size)
-  IPC_STRUCT_TRAITS_MEMBER(color_space)
-  IPC_STRUCT_TRAITS_MEMBER(resource_offset)
-  IPC_STRUCT_TRAITS_MEMBER(resource_multiplier)
-IPC_STRUCT_TRAITS_END()
-
-IPC_STRUCT_TRAITS_BEGIN(cc::SharedQuadState)
-IPC_STRUCT_TRAITS_MEMBER(quad_to_target_transform)
-IPC_STRUCT_TRAITS_MEMBER(quad_layer_bounds)
-IPC_STRUCT_TRAITS_MEMBER(visible_quad_layer_rect)
-  IPC_STRUCT_TRAITS_MEMBER(clip_rect)
-  IPC_STRUCT_TRAITS_MEMBER(is_clipped)
-  IPC_STRUCT_TRAITS_MEMBER(opacity)
-  IPC_STRUCT_TRAITS_MEMBER(blend_mode)
-  IPC_STRUCT_TRAITS_MEMBER(sorting_context_id)
-IPC_STRUCT_TRAITS_END()
-
-IPC_STRUCT_TRAITS_BEGIN(cc::TransferableResource)
-  IPC_STRUCT_TRAITS_MEMBER(id)
-  IPC_STRUCT_TRAITS_MEMBER(format)
-  IPC_STRUCT_TRAITS_MEMBER(filter)
-  IPC_STRUCT_TRAITS_MEMBER(size)
-  IPC_STRUCT_TRAITS_MEMBER(mailbox_holder)
-  IPC_STRUCT_TRAITS_MEMBER(read_lock_fences_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(is_software)
-  IPC_STRUCT_TRAITS_MEMBER(gpu_memory_buffer_id)
-  IPC_STRUCT_TRAITS_MEMBER(is_overlay_candidate)
-IPC_STRUCT_TRAITS_END()
-
-IPC_STRUCT_TRAITS_BEGIN(cc::ReturnedResource)
-  IPC_STRUCT_TRAITS_MEMBER(id)
-  IPC_STRUCT_TRAITS_MEMBER(sync_token)
-  IPC_STRUCT_TRAITS_MEMBER(count)
-  IPC_STRUCT_TRAITS_MEMBER(lost)
-IPC_STRUCT_TRAITS_END()
-
-IPC_STRUCT_TRAITS_BEGIN(cc::ViewportSelectionBound)
-  IPC_STRUCT_TRAITS_MEMBER(type)
-  IPC_STRUCT_TRAITS_MEMBER(edge_top)
-  IPC_STRUCT_TRAITS_MEMBER(edge_bottom)
-  IPC_STRUCT_TRAITS_MEMBER(visible)
-IPC_STRUCT_TRAITS_END()
-
-IPC_STRUCT_TRAITS_BEGIN(cc::ViewportSelection)
-  IPC_STRUCT_TRAITS_MEMBER(start)
-  IPC_STRUCT_TRAITS_MEMBER(end)
-  IPC_STRUCT_TRAITS_MEMBER(is_editable)
-  IPC_STRUCT_TRAITS_MEMBER(is_empty_text_form_control)
-IPC_STRUCT_TRAITS_END()
-
-IPC_ENUM_TRAITS_MAX_VALUE( \
-    cc::BeginFrameArgs::BeginFrameArgsType, \
-    cc::BeginFrameArgs::BEGIN_FRAME_ARGS_TYPE_MAX - 1)
-
-IPC_STRUCT_TRAITS_BEGIN(cc::BeginFrameArgs)
-  IPC_STRUCT_TRAITS_MEMBER(frame_time)
-  IPC_STRUCT_TRAITS_MEMBER(deadline)
-  IPC_STRUCT_TRAITS_MEMBER(interval)
-  IPC_STRUCT_TRAITS_MEMBER(type)
-IPC_STRUCT_TRAITS_END()
-
-IPC_STRUCT_TRAITS_BEGIN(cc::CompositorFrameMetadata)
-  IPC_STRUCT_TRAITS_MEMBER(device_scale_factor)
-  IPC_STRUCT_TRAITS_MEMBER(root_scroll_offset)
-  IPC_STRUCT_TRAITS_MEMBER(page_scale_factor)
-  IPC_STRUCT_TRAITS_MEMBER(scrollable_viewport_size)
-  IPC_STRUCT_TRAITS_MEMBER(root_layer_size)
-  IPC_STRUCT_TRAITS_MEMBER(min_page_scale_factor)
-  IPC_STRUCT_TRAITS_MEMBER(max_page_scale_factor)
-  IPC_STRUCT_TRAITS_MEMBER(root_overflow_x_hidden)
-  IPC_STRUCT_TRAITS_MEMBER(root_overflow_y_hidden)
-  IPC_STRUCT_TRAITS_MEMBER(location_bar_offset)
-  IPC_STRUCT_TRAITS_MEMBER(location_bar_content_translation)
-  IPC_STRUCT_TRAITS_MEMBER(root_background_color)
-  IPC_STRUCT_TRAITS_MEMBER(selection)
-  IPC_STRUCT_TRAITS_MEMBER(latency_info)
-  IPC_STRUCT_TRAITS_MEMBER(satisfies_sequences)
-  IPC_STRUCT_TRAITS_MEMBER(referenced_surfaces)
-IPC_STRUCT_TRAITS_END()
-
-IPC_STRUCT_TRAITS_BEGIN(cc::GLFrameData)
-  IPC_STRUCT_TRAITS_MEMBER(mailbox)
-  IPC_STRUCT_TRAITS_MEMBER(sync_token)
-  IPC_STRUCT_TRAITS_MEMBER(size)
-  IPC_STRUCT_TRAITS_MEMBER(sub_buffer_rect)
-IPC_STRUCT_TRAITS_END()
diff --git a/content/common/cc_messages_perftest.cc b/content/common/cc_messages_perftest.cc
index 629668f..7914b1a 100644
--- a/content/common/cc_messages_perftest.cc
+++ b/content/common/cc_messages_perftest.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/common/cc_messages.h"
-
 #include <utility>
 
 #include "base/test/launcher/unit_test_launcher.h"
 #include "base/test/test_suite.h"
+#include "cc/ipc/cc_param_traits.h"
 #include "cc/output/compositor_frame.h"
+#include "cc/quads/picture_draw_quad.h"
 #include "ipc/ipc_message.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/perf/perf_test.h"
diff --git a/content/common/cc_messages_unittest.cc b/content/common/cc_messages_unittest.cc
index c42a6d7..b2134db 100644
--- a/content/common/cc_messages_unittest.cc
+++ b/content/common/cc_messages_unittest.cc
@@ -2,8 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/common/cc_messages.h"
-
 #include <stddef.h>
 #include <string.h>
 #include <algorithm>
@@ -11,11 +9,13 @@
 
 #include "base/macros.h"
 #include "build/build_config.h"
+#include "cc/ipc/cc_param_traits.h"
 #include "cc/output/compositor_frame.h"
+#include "cc/quads/picture_draw_quad.h"
+#include "cc/quads/render_pass_draw_quad.h"
 #include "content/public/common/common_param_traits.h"
 #include "ipc/ipc_message.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/khronos/GLES2/gl2ext.h"
 #include "third_party/skia/include/effects/SkBlurImageFilter.h"
 
 #if defined(OS_POSIX)
diff --git a/content/common/content_message_generator.h b/content/common/content_message_generator.h
index 0021f418..5de191c 100644
--- a/content/common/content_message_generator.h
+++ b/content/common/content_message_generator.h
@@ -12,7 +12,6 @@
 #include "content/common/bluetooth/bluetooth_messages.h"
 #include "content/common/browser_plugin/browser_plugin_messages.h"
 #include "content/common/cache_storage/cache_storage_messages.h"
-#include "content/common/cc_messages.h"
 #include "content/common/clipboard_messages.h"
 #include "content/common/database_messages.h"
 #include "content/common/device_sensors/device_light_messages.h"
diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h
index 4de5ff7..18ae363 100644
--- a/content/common/frame_messages.h
+++ b/content/common/frame_messages.h
@@ -30,6 +30,7 @@
 #include "content/public/common/context_menu_params.h"
 #include "content/public/common/frame_navigate_params.h"
 #include "content/public/common/javascript_message_type.h"
+#include "content/public/common/mhtml_generation_params.h"
 #include "content/public/common/page_importance_signals.h"
 #include "content/public/common/page_state.h"
 #include "content/public/common/resource_response.h"
@@ -500,6 +501,9 @@
   // intended for sharing.
   IPC_STRUCT_MEMBER(bool, mhtml_binary_encoding)
 
+  IPC_STRUCT_MEMBER(content::MHTMLCacheControlPolicy,
+                    mhtml_cache_control_policy)
+
   // Frame to content-id map.
   // Keys are routing ids of either RenderFrames or RenderFrameProxies.
   // Values are MHTML content-ids - see WebFrameSerializer::generateMHTMLParts.
diff --git a/content/common/gpu/client/context_provider_command_buffer.cc b/content/common/gpu/client/context_provider_command_buffer.cc
index d63c365b..e681ff17 100644
--- a/content/common/gpu/client/context_provider_command_buffer.cc
+++ b/content/common/gpu/client/context_provider_command_buffer.cc
@@ -61,6 +61,7 @@
     const GURL& active_url,
     gfx::GpuPreference gpu_preference,
     bool automatic_flushes,
+    bool support_locking,
     const gpu::SharedMemoryLimits& memory_limits,
     const gpu::gles2::ContextCreationAttribHelper& attributes,
     ContextProviderCommandBuffer* shared_context_provider,
@@ -71,6 +72,7 @@
       active_url_(active_url),
       gpu_preference_(gpu_preference),
       automatic_flushes_(automatic_flushes),
+      support_locking_(support_locking),
       memory_limits_(memory_limits),
       attributes_(attributes),
       context_type_(type),
@@ -150,13 +152,11 @@
         default_task_runner_;
     if (!task_runner)
       task_runner = base::ThreadTaskRunnerHandle::Get();
-    command_buffer_ = channel_->CreateCommandBuffer(
-        surface_handle_, gfx::Size(), shared_command_buffer, stream_id_,
-        stream_priority_, serialized_attributes, active_url_, gpu_preference_,
+    command_buffer_ = gpu::CommandBufferProxyImpl::Create(
+        std::move(channel_), surface_handle_, gfx::Size(),
+        shared_command_buffer, stream_id_, stream_priority_,
+        std::move(serialized_attributes), active_url_, gpu_preference_,
         std::move(task_runner));
-    // The command buffer takes ownership of the |channel_|, so no need to keep
-    // a reference around here.
-    channel_ = nullptr;
     if (!command_buffer_) {
       DLOG(ERROR) << "GpuChannelHost failed to create command buffer.";
       command_buffer_metrics::UmaRecordContextInitFailed(context_type_);
@@ -238,6 +238,13 @@
   std::string unique_context_name =
       base::StringPrintf("%s-%p", type_name.c_str(), gles2_impl_.get());
   ContextGL()->TraceBeginCHROMIUM("gpu_toplevel", unique_context_name.c_str());
+  // If support_locking_ is true, the context may be used from multiple
+  // threads, and any async callstacks will need to hold the same lock, so
+  // give it to the command buffer.
+  // We don't hold a lock here since there's no need, so set the lock very last
+  // to prevent asserts that we're not holding it.
+  if (support_locking_)
+    command_buffer_->SetLock(&context_lock_);
   return true;
 }
 
@@ -283,12 +290,6 @@
   }
 }
 
-void ContextProviderCommandBuffer::SetupLock() {
-  DCHECK(bind_succeeded_);
-  DCHECK(context_thread_checker_.CalledOnValidThread());
-  command_buffer_->SetLock(&context_lock_);
-}
-
 void ContextProviderCommandBuffer::SetDefaultTaskRunner(
     scoped_refptr<base::SingleThreadTaskRunner> default_task_runner) {
   DCHECK(!bind_succeeded_);
@@ -296,6 +297,7 @@
 }
 
 base::Lock* ContextProviderCommandBuffer::GetLock() {
+  DCHECK(support_locking_);
   return &context_lock_;
 }
 
diff --git a/content/common/gpu/client/context_provider_command_buffer.h b/content/common/gpu/client/context_provider_command_buffer.h
index 47bfa023..26edb349 100644
--- a/content/common/gpu/client/context_provider_command_buffer.h
+++ b/content/common/gpu/client/context_provider_command_buffer.h
@@ -55,6 +55,7 @@
       const GURL& active_url,
       gfx::GpuPreference gpu_preference,
       bool automatic_flushes,
+      bool support_locking,
       const gpu::SharedMemoryLimits& memory_limits,
       const gpu::gles2::ContextCreationAttribHelper& attributes,
       ContextProviderCommandBuffer* shared_context_provider,
@@ -75,11 +76,6 @@
   void SetLostContextCallback(
       const LostContextCallback& lost_context_callback) override;
 
-  // Sets up a lock so this context can be used from multiple threads. After
-  // calling this, all functions without explicit thread usage constraints can
-  // be used on any thread while the lock returned by GetLock() is acquired.
-  void SetupLock();
-
   // Set the default task runner for command buffers to use for handling IPCs.
   // If not specified, this will be the ThreadTaskRunner for the thread on
   // which BindToThread is called.
@@ -109,15 +105,16 @@
   bool bind_succeeded_ = false;
   bool bind_failed_ = false;
 
-  int32_t stream_id_;
-  gpu::GpuStreamPriority stream_priority_;
-  gpu::SurfaceHandle surface_handle_;
-  GURL active_url_;
-  gfx::GpuPreference gpu_preference_;
-  bool automatic_flushes_;
-  gpu::SharedMemoryLimits memory_limits_;
-  gpu::gles2::ContextCreationAttribHelper attributes_;
-  command_buffer_metrics::ContextType context_type_;
+  const int32_t stream_id_;
+  const gpu::GpuStreamPriority stream_priority_;
+  const gpu::SurfaceHandle surface_handle_;
+  const GURL active_url_;
+  const gfx::GpuPreference gpu_preference_;
+  const bool automatic_flushes_;
+  const bool support_locking_;
+  const gpu::SharedMemoryLimits memory_limits_;
+  const gpu::gles2::ContextCreationAttribHelper attributes_;
+  const command_buffer_metrics::ContextType context_type_;
 
   scoped_refptr<SharedProviders> shared_providers_;
   scoped_refptr<gpu::GpuChannelHost> channel_;
diff --git a/content/common/mojo/embedded_application_runner.cc b/content/common/mojo/embedded_application_runner.cc
index fd3ba17..2bbd45e5 100644
--- a/content/common/mojo/embedded_application_runner.cc
+++ b/content/common/mojo/embedded_application_runner.cc
@@ -10,6 +10,7 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/single_thread_task_runner.h"
+#include "base/threading/thread.h"
 #include "base/threading/thread_checker.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "services/shell/public/cpp/shell_connection.h"
@@ -19,19 +20,50 @@
 class EmbeddedApplicationRunner::Instance
     : public base::RefCountedThreadSafe<Instance> {
  public:
-  explicit Instance(
-      const EmbeddedApplicationRunner::FactoryCallback& callback,
-      const base::Closure& quit_closure)
-      : factory_callback_(callback),
+  Instance(const base::StringPiece& name,
+           const MojoApplicationInfo& info,
+           const base::Closure& quit_closure)
+      : name_(name.as_string()),
+        factory_callback_(info.application_factory),
+        use_own_thread_(!info.application_task_runner && info.use_own_thread),
         quit_closure_(quit_closure),
-        quit_task_runner_(base::ThreadTaskRunnerHandle::Get()) {
-    // This object may be used exclusively from a single thread which may be
-    // different from the one that created it.
-    thread_checker_.DetachFromThread();
+        quit_task_runner_(base::ThreadTaskRunnerHandle::Get()),
+        application_task_runner_(info.application_task_runner) {
+    application_thread_checker_.DetachFromThread();
+
+    if (!use_own_thread_ && !application_task_runner_)
+      application_task_runner_ = base::ThreadTaskRunnerHandle::Get();
   }
 
   void BindShellClientRequest(shell::mojom::ShellClientRequest request) {
-    DCHECK(thread_checker_.CalledOnValidThread());
+    DCHECK(runner_thread_checker_.CalledOnValidThread());
+
+    if (use_own_thread_ && !thread_) {
+      // Start a new thread if necessary.
+      thread_.reset(new base::Thread(name_));
+      thread_->Start();
+      application_task_runner_ = thread_->task_runner();
+    }
+
+    DCHECK(application_task_runner_);
+    application_task_runner_->PostTask(
+        FROM_HERE,
+        base::Bind(&Instance::BindShellClientRequestOnApplicationThread, this,
+                   base::Passed(&request)));
+  }
+
+  void ShutDown() {
+    DCHECK(runner_thread_checker_.CalledOnValidThread());
+    if (thread_) {
+      application_task_runner_ = nullptr;
+      thread_.reset();
+    }
+  }
+
+ private:
+  void BindShellClientRequestOnApplicationThread(
+      shell::mojom::ShellClientRequest request) {
+    DCHECK(application_thread_checker_.CalledOnValidThread());
 
     if (!shell_client_) {
       shell_client_ = factory_callback_.Run(
@@ -49,10 +81,14 @@
  private:
   friend class base::RefCountedThreadSafe<Instance>;
 
-  ~Instance() { DCHECK(thread_checker_.CalledOnValidThread()); }
+  ~Instance() {
+    // If this instance had its own thread, it MUST be explicitly destroyed by
+    // ShutDown() on the runner's thread by the time this destructor is run.
+    DCHECK(!thread_);
+  }
 
   void OnShellConnectionLost(shell::ShellConnection* connection) {
-    DCHECK(thread_checker_.CalledOnValidThread());
+    DCHECK(application_thread_checker_.CalledOnValidThread());
 
     for (auto it = shell_connections_.begin(); it != shell_connections_.end();
          ++it) {
@@ -64,41 +100,63 @@
   }
 
   void Quit() {
+    DCHECK(application_thread_checker_.CalledOnValidThread());
+
     shell_connections_.clear();
     shell_client_.reset();
-    quit_task_runner_->PostTask(FROM_HERE, quit_closure_);
+    quit_task_runner_->PostTask(
+        FROM_HERE, base::Bind(&Instance::QuitOnRunnerThread, this));
   }
 
-  base::ThreadChecker thread_checker_;
-  const FactoryCallback factory_callback_;
-  std::unique_ptr<shell::ShellClient> shell_client_;
-  std::vector<std::unique_ptr<shell::ShellConnection>> shell_connections_;
+  void QuitOnRunnerThread() {
+    DCHECK(runner_thread_checker_.CalledOnValidThread());
+    ShutDown();
+    quit_closure_.Run();
+  }
+
+  const std::string name_;
+  const MojoApplicationInfo::ApplicationFactory factory_callback_;
+  const bool use_own_thread_;
   const base::Closure quit_closure_;
   const scoped_refptr<base::SingleThreadTaskRunner> quit_task_runner_;
 
+  // Thread checker used to ensure certain operations happen only on the
+  // runner's (i.e. our owner's) thread.
+  base::ThreadChecker runner_thread_checker_;
+
+  // Thread checker used to ensure certain operations happen only on the
+  // application task runner's thread.
+  base::ThreadChecker application_thread_checker_;
+
+  // These fields must only be accessed from the runner's thread.
+  std::unique_ptr<base::Thread> thread_;
+  scoped_refptr<base::SingleThreadTaskRunner> application_task_runner_;
+
+  // These fields must only be accessed from the application thread, except in
+  // the destructor which may run on either the runner thread or the application
+  // thread.
+  std::unique_ptr<shell::ShellClient> shell_client_;
+  std::vector<std::unique_ptr<shell::ShellConnection>> shell_connections_;
+
   DISALLOW_COPY_AND_ASSIGN(Instance);
 };
 
 EmbeddedApplicationRunner::EmbeddedApplicationRunner(
-    const FactoryCallback& callback,
-    const scoped_refptr<base::SingleThreadTaskRunner>& task_runner)
-    : application_task_runner_(
-          task_runner ? task_runner : base::ThreadTaskRunnerHandle::Get()),
-      weak_factory_(this) {
-  instance_ = new Instance(callback,
+    const base::StringPiece& name,
+    const MojoApplicationInfo& info)
+    : weak_factory_(this) {
+  instance_ = new Instance(name, info,
                            base::Bind(&EmbeddedApplicationRunner::OnQuit,
                                       weak_factory_.GetWeakPtr()));
 }
 
 EmbeddedApplicationRunner::~EmbeddedApplicationRunner() {
+  instance_->ShutDown();
 }
 
 void EmbeddedApplicationRunner::BindShellClientRequest(
     shell::mojom::ShellClientRequest request) {
-  application_task_runner_->PostTask(
-      FROM_HERE,
-      base::Bind(&Instance::BindShellClientRequest, instance_,
-                 base::Passed(&request)));
+  instance_->BindShellClientRequest(std::move(request));
 }
 
 void EmbeddedApplicationRunner::SetQuitClosure(
@@ -107,7 +165,8 @@
 }
 
 void EmbeddedApplicationRunner::OnQuit() {
-  quit_closure_.Run();
+  if (!quit_closure_.is_null())
+    quit_closure_.Run();
 }
 
 }  // namespace content
diff --git a/content/common/mojo/embedded_application_runner.h b/content/common/mojo/embedded_application_runner.h
index ab4b5b5..017f093 100644
--- a/content/common/mojo/embedded_application_runner.h
+++ b/content/common/mojo/embedded_application_runner.h
@@ -12,6 +12,8 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "base/single_thread_task_runner.h"
+#include "base/strings/string_piece.h"
+#include "content/public/common/mojo_application_info.h"
 #include "services/shell/public/cpp/shell_client.h"
 #include "services/shell/public/interfaces/shell_client.mojom.h"
 
@@ -25,21 +27,11 @@
 // EmbeddedApplicationRunner instance.
 class EmbeddedApplicationRunner {
  public:
-  // Callback used to construct a new instance of the embedded application. Note
-  // that |quit_closure| destroys the returned ShellClient instance when run.
-  using FactoryCallback = base::Callback<
-      std::unique_ptr<shell::ShellClient>(const base::Closure& quit_closure)>;
-
-  // Constructs a runner which hosts the application on |task_runner|'s thread.
-  // If an existing instance of the app is not running when an incoming
-  // connection is made, |callback| will be run on |task_runner|'s thread to
-  // create a new instance which will live on that thread.
-  //
-  // If |task_runner| is null, the calling thread's TaskRunner is used.
-  EmbeddedApplicationRunner(
-      const FactoryCallback& callback,
-      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner);
-
+  // Constructs a runner which hosts a Mojo application. If an existing instance
+  // of the app is not running when an incoming connection is made, details from
+  // |info| will be used to construct a new instance.
+  EmbeddedApplicationRunner(const base::StringPiece& name,
+                            const MojoApplicationInfo& info);
   ~EmbeddedApplicationRunner();
 
   // Binds an incoming ShellClientRequest for this application. If the
@@ -56,11 +48,6 @@
 
   void OnQuit();
 
-  // The TaskRunner on which the factory callback will be run. The
-  // shell::ShellClient it returns will live and die on this TaskRunner's
-  // thread.
-  const scoped_refptr<base::SingleThreadTaskRunner> application_task_runner_;
-
   // A reference to the application instance which may operate on the
   // |application_task_runner_|'s thread.
   scoped_refptr<Instance> instance_;
diff --git a/content/common/sandbox_mac.mm b/content/common/sandbox_mac.mm
index 73fee33..ab87ff4a 100644
--- a/content/common/sandbox_mac.mm
+++ b/content/common/sandbox_mac.mm
@@ -39,7 +39,7 @@
 #include "sandbox/mac/seatbelt.h"
 #include "third_party/icu/source/common/unicode/uchar.h"
 #include "ui/base/layout.h"
-#include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 
 extern "C" {
 void CGSSetDenyWindowServerConnections(bool);
@@ -329,7 +329,7 @@
   if (sandbox_type == SANDBOX_TYPE_GPU) {
     // Preload either the desktop GL or the osmesa so, depending on the
     // --use-gl flag.
-    gfx::GLSurface::InitializeOneOff();
+    gl::init::InitializeGLOneOff();
 
     // Preload VideoToolbox.
     media::InitializeVideoToolbox();
diff --git a/content/common/view_messages.h b/content/common/view_messages.h
index ec1e8aa..38ce9ba 100644
--- a/content/common/view_messages.h
+++ b/content/common/view_messages.h
@@ -12,6 +12,7 @@
 #include "base/process/process.h"
 #include "base/strings/string16.h"
 #include "build/build_config.h"
+#include "cc/ipc/cc_param_traits.h"
 #include "cc/output/begin_frame_args.h"
 #include "cc/output/compositor_frame.h"
 #include "cc/output/compositor_frame_ack.h"
diff --git a/content/content_common.gypi b/content/content_common.gypi
index e480bdf..93cce9c 100644
--- a/content/content_common.gypi
+++ b/content/content_common.gypi
@@ -6,6 +6,7 @@
   'dependencies': [
     '../base/base.gyp:base',
     '../cc/cc.gyp:cc',
+    '../cc/ipc/cc_ipc.gyp:cc_ipc',
     '../components/tracing.gyp:tracing',
     '../device/bluetooth/bluetooth.gyp:device_bluetooth',
     '../gpu/command_buffer/command_buffer.gyp:gles2_utils',
@@ -45,6 +46,7 @@
     '../ui/gfx/ipc/gfx_ipc.gyp:gfx_ipc',
     '../ui/gfx/ipc/skia/gfx_ipc_skia.gyp:gfx_ipc_skia',
     '../ui/gl/gl.gyp:gl',
+    '../ui/gl/init/gl_init.gyp:gl_init',
     '../ui/shell_dialogs/shell_dialogs.gyp:shell_dialogs',
     '../url/url.gyp:url_lib',
     '../url/ipc/url_ipc.gyp:url_ipc',
@@ -144,6 +146,8 @@
       'public/common/media_stream_request.h',
       'public/common/menu_item.cc',
       'public/common/menu_item.h',
+      'public/common/mhtml_generation_params.cc',
+      'public/common/mhtml_generation_params.h',
       'public/common/mojo_application_info.cc',
       'public/common/mojo_application_info.h',
       'public/common/mojo_channel_switches.cc',
@@ -255,8 +259,6 @@
       'common/cache_storage/cache_storage_messages.h',
       'common/cache_storage/cache_storage_types.cc',
       'common/cache_storage/cache_storage_types.h',
-      'common/cc_messages.cc',
-      'common/cc_messages.h',
       'common/child_process_host_impl.cc',
       'common/child_process_host_impl.h',
       'common/child_process_messages.h',
diff --git a/content/content_gpu.gypi b/content/content_gpu.gypi
index a75555f..041ae41 100644
--- a/content/content_gpu.gypi
+++ b/content/content_gpu.gypi
@@ -12,6 +12,7 @@
     '../media/media.gyp:media_gpu',
     '../skia/skia.gyp:skia',
     '../ui/gl/gl.gyp:gl',
+    '../ui/gl/init/gl_init.gyp:gl_init',
     'content_common_mojo_bindings.gyp:content_common_mojo_bindings',
   ],
   'sources': [
diff --git a/content/content_tests.gypi b/content/content_tests.gypi
index c62170f..aa9f243d 100644
--- a/content/content_tests.gypi
+++ b/content/content_tests.gypi
@@ -837,6 +837,7 @@
       'dependencies': [
         '../cc/blink/cc_blink.gyp:cc_blink',
         '../cc/cc.gyp:cc',
+        '../cc/ipc/cc_ipc.gyp:cc_ipc',
         '../cc/cc_tests.gyp:cc_test_support',
         '../components/components.gyp:display_compositor',
         '../components/scheduler/scheduler.gyp:scheduler',
diff --git a/content/gpu/BUILD.gn b/content/gpu/BUILD.gn
index 63d8adf1..1b3aa77 100644
--- a/content/gpu/BUILD.gn
+++ b/content/gpu/BUILD.gn
@@ -63,6 +63,7 @@
     "//ui/events/ipc",
     "//ui/gfx/ipc",
     "//ui/gl",
+    "//ui/gl/init",
   ]
 
   if (mojo_media_host == "gpu") {
diff --git a/content/gpu/gpu_child_thread.cc b/content/gpu/gpu_child_thread.cc
index fe38be7..fec9818 100644
--- a/content/gpu/gpu_child_thread.cc
+++ b/content/gpu/gpu_child_thread.cc
@@ -38,6 +38,7 @@
 #include "ui/gl/gl_implementation.h"
 #include "ui/gl/gl_switches.h"
 #include "ui/gl/gpu_switching_manager.h"
+#include "ui/gl/init/gl_factory.h"
 #include "url/gurl.h"
 
 #if defined(USE_OZONE)
@@ -199,8 +200,8 @@
          base::CommandLine::ForCurrentProcess()->HasSwitch(
              switches::kInProcessGPU));
 
-  if (!gfx::GLSurface::InitializeOneOff())
-    VLOG(1) << "gfx::GLSurface::InitializeOneOff failed";
+  if (!gl::init::InitializeGLOneOff())
+    VLOG(1) << "gl::init::InitializeGLOneOff failed";
 
   g_thread_safe_sender.Get() = thread_safe_sender();
   g_lazy_tls.Pointer()->Set(this);
diff --git a/content/gpu/gpu_main.cc b/content/gpu/gpu_main.cc
index 7cfe9187f..8dec744 100644
--- a/content/gpu/gpu_main.cc
+++ b/content/gpu/gpu_main.cc
@@ -42,6 +42,7 @@
 #include "ui/gl/gl_surface.h"
 #include "ui/gl/gl_switches.h"
 #include "ui/gl/gpu_switching_manager.h"
+#include "ui/gl/init/gl_factory.h"
 
 #if defined(OS_WIN)
 #include <dwmapi.h>
@@ -54,8 +55,8 @@
 #endif
 
 #if defined(OS_WIN)
-#include "base/win/windows_version.h"
 #include "base/win/scoped_com_initializer.h"
+#include "base/win/windows_version.h"
 #include "media/gpu/dxva_video_decode_accelerator_win.h"
 #include "sandbox/win/src/sandbox.h"
 #endif
@@ -275,13 +276,13 @@
     bool gl_already_initialized = false;
 #if defined(OS_MACOSX)
     if (!command_line.HasSwitch(switches::kNoSandbox)) {
-      // On Mac, if the sandbox is enabled, then GLSurface::InitializeOneOff()
+      // On Mac, if the sandbox is enabled, then gl::init::InitializeGLOneOff()
       // is called from the sandbox warmup code before getting here.
       gl_already_initialized = true;
     }
 #endif
     if (command_line.HasSwitch(switches::kInProcessGPU)) {
-      // With in-process GPU, GLSurface::InitializeOneOff() is called from
+      // With in-process GPU, gl::init::InitializeGLOneOff() is called from
       // GpuChildThread before getting here.
       gl_already_initialized = true;
     }
@@ -290,7 +291,7 @@
     bool gl_initialized =
         gl_already_initialized
             ? gfx::GetGLImplementation() != gfx::kGLImplementationNone
-            : gfx::GLSurface::InitializeOneOff();
+            : gl::init::InitializeGLOneOff();
     if (gl_initialized) {
       // We need to collect GL strings (VENDOR, RENDERER) for blacklisting
       // purposes. However, on Mac we don't actually use them. As documented in
@@ -334,7 +335,7 @@
       UMA_HISTOGRAM_TIMES("GPU.CollectContextGraphicsInfo",
                           collect_context_time);
     } else {  // gl_initialized
-      VLOG(1) << "gfx::GLSurface::InitializeOneOff failed";
+      VLOG(1) << "gl::init::InitializeGLOneOff failed";
       dead_on_arrival = true;
     }
 
@@ -524,18 +525,18 @@
 
 void CreateDummyGlContext() {
   scoped_refptr<gfx::GLSurface> surface(
-      gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size()));
+      gl::init::CreateOffscreenGLSurface(gfx::Size()));
   if (!surface.get()) {
-    DVLOG(1) << "gfx::GLSurface::CreateOffscreenGLSurface failed";
+    DVLOG(1) << "gl::init::CreateOffscreenGLSurface failed";
     return;
   }
 
   // On Linux, this is needed to make sure /dev/nvidiactl has
   // been opened and its descriptor cached.
-  scoped_refptr<gfx::GLContext> context(gfx::GLContext::CreateGLContext(
-      NULL, surface.get(), gfx::PreferDiscreteGpu));
+  scoped_refptr<gfx::GLContext> context(
+      gl::init::CreateGLContext(NULL, surface.get(), gfx::PreferDiscreteGpu));
   if (!context.get()) {
-    DVLOG(1) << "gfx::GLContext::CreateGLContext failed";
+    DVLOG(1) << "gl::init::CreateGLContext failed";
     return;
   }
 
diff --git a/content/gpu/gpu_process_control_impl.cc b/content/gpu/gpu_process_control_impl.cc
index 21051fc1..0ecc58b6 100644
--- a/content/gpu/gpu_process_control_impl.cc
+++ b/content/gpu/gpu_process_control_impl.cc
@@ -29,6 +29,7 @@
 
   MojoApplicationInfo app_info;
   app_info.application_factory = base::Bind(&media::CreateMojoMediaApplication);
+  app_info.use_own_thread = true;
   apps->insert(std::make_pair("mojo:media", app_info));
 #endif
 }
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java
index db1ce867..e9af227 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java
@@ -1508,8 +1508,7 @@
     @SuppressWarnings("javadoc")
     public void onAttachedToWindow() {
         setAccessibilityState(mAccessibilityManager.isEnabled());
-        setTextHandlesTemporarilyHidden(false);
-        restoreSelectionPopupsIfNecessary();
+        updateTextSelectionUI(true);
         ScreenOrientationListener.getInstance().addObserver(this, mContext);
         GamepadList.onAttachedToWindow(mContext);
         mAccessibilityManager.addAccessibilityStateChangeListener(this);
@@ -1517,6 +1516,23 @@
     }
 
     /**
+     * Update the text selection UI depending on the focus of the page. This will hide the selection
+     * handles and selection popups if focus is lost.
+     * TODO(mdjones): This was added as a temporary measure to hide text UI while Reader Mode or
+     * Contextual Search are showing. This should be removed in favor of proper focusing of the
+     * panel's ContentViewCore (which is currently not being added to the view hierarchy).
+     * @param focused If the ContentViewCore currently has focus.
+     */
+    public void updateTextSelectionUI(boolean focused) {
+        setTextHandlesTemporarilyHidden(!focused);
+        if (focused) {
+            restoreSelectionPopupsIfNecessary();
+        } else {
+            hidePopupsAndPreserveSelection();
+        }
+    }
+
+    /**
      * @see View#onDetachedFromWindow()
      */
     @SuppressWarnings("javadoc")
@@ -1533,8 +1549,7 @@
         // Override the handle visibility explicitly to address this, but
         // preserve the underlying selection for detachment cases like screen
         // locking and app switching.
-        setTextHandlesTemporarilyHidden(true);
-        hidePopupsAndPreserveSelection();
+        updateTextSelectionUI(false);
         mSystemCaptioningBridge.removeListener(this);
     }
 
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/InputMethodManagerWrapper.java b/content/public/android/java/src/org/chromium/content/browser/input/InputMethodManagerWrapper.java
index 673a374..8340504 100644
--- a/content/public/android/java/src/org/chromium/content/browser/input/InputMethodManagerWrapper.java
+++ b/content/public/android/java/src/org/chromium/content/browser/input/InputMethodManagerWrapper.java
@@ -22,12 +22,13 @@
  * Wrapper around Android's InputMethodManager
  */
 public class InputMethodManagerWrapper {
+    private static final boolean DEBUG_LOGS = false;
     private static final String TAG = "cr_Ime";
 
     private final Context mContext;
 
     public InputMethodManagerWrapper(Context context) {
-        Log.d(TAG, "Constructor");
+        if (DEBUG_LOGS) Log.d(TAG, "Constructor");
         mContext = context;
     }
 
@@ -39,7 +40,7 @@
      * @see android.view.inputmethod.InputMethodManager#restartInput(View)
      */
     public void restartInput(View view) {
-        Log.d(TAG, "restartInput");
+        if (DEBUG_LOGS) Log.d(TAG, "restartInput");
         getInputMethodManager().restartInput(view);
     }
 
@@ -47,7 +48,7 @@
      * @see android.view.inputmethod.InputMethodManager#showSoftInput(View, int, ResultReceiver)
      */
     public void showSoftInput(View view, int flags, ResultReceiver resultReceiver) {
-        Log.d(TAG, "showSoftInput");
+        if (DEBUG_LOGS) Log.d(TAG, "showSoftInput");
         getInputMethodManager().showSoftInput(view, flags, resultReceiver);
     }
 
@@ -56,7 +57,7 @@
      */
     public boolean isActive(View view) {
         final boolean active = getInputMethodManager().isActive(view);
-        Log.d(TAG, "isActive: " + active);
+        if (DEBUG_LOGS) Log.d(TAG, "isActive: " + active);
         return active;
     }
 
@@ -65,7 +66,7 @@
      */
     public boolean hideSoftInputFromWindow(IBinder windowToken, int flags,
             ResultReceiver resultReceiver) {
-        Log.d(TAG, "hideSoftInputFromWindow");
+        if (DEBUG_LOGS) Log.d(TAG, "hideSoftInputFromWindow");
         return getInputMethodManager().hideSoftInputFromWindow(windowToken, flags, resultReceiver);
     }
 
@@ -74,7 +75,7 @@
      */
     public void updateSelection(View view, int selStart, int selEnd,
             int candidatesStart, int candidatesEnd) {
-        Log.d(TAG, "updateSelection: SEL [%d, %d], COM [%d, %d]", selStart, selEnd,
+        if (DEBUG_LOGS) Log.d(TAG, "updateSelection: SEL [%d, %d], COM [%d, %d]", selStart, selEnd,
                 candidatesStart, candidatesEnd);
         getInputMethodManager().updateSelection(view, selStart, selEnd, candidatesStart,
                 candidatesEnd);
@@ -86,7 +87,7 @@
      */
     @TargetApi(Build.VERSION_CODES.LOLLIPOP)
     public void updateCursorAnchorInfo(View view, CursorAnchorInfo cursorAnchorInfo) {
-        Log.d(TAG, "updateCursorAnchorInfo");
+        if (DEBUG_LOGS) Log.d(TAG, "updateCursorAnchorInfo");
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
             getInputMethodManager().updateCursorAnchorInfo(view, cursorAnchorInfo);
         }
@@ -99,14 +100,14 @@
     public void notifyUserAction() {
         // On N and above, this is not needed.
         if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) return;
-        Log.d(TAG, "notifyUserAction");
+        if (DEBUG_LOGS) Log.d(TAG, "notifyUserAction");
         InputMethodManager manager = getInputMethodManager();
         try {
             Method method = InputMethodManager.class.getMethod("notifyUserAction");
             method.invoke(manager);
         } catch (NoSuchMethodException | IllegalAccessException | IllegalArgumentException
                 | InvocationTargetException e) {
-            Log.d(TAG, "notifyUserAction failed");
+            if (DEBUG_LOGS) Log.d(TAG, "notifyUserAction failed");
             return;
         }
     }
diff --git a/content/public/browser/web_contents.h b/content/public/browser/web_contents.h
index af1d3e21..6aa00e6 100644
--- a/content/public/browser/web_contents.h
+++ b/content/public/browser/web_contents.h
@@ -60,6 +60,7 @@
 struct CustomContextMenuContext;
 struct DropData;
 struct Manifest;
+struct MHTMLGenerationParams;
 struct PageImportanceSignals;
 struct RendererPreferences;
 
@@ -547,8 +548,7 @@
   // 'base64'.  Binary encoding is known to have interoperability issues and is
   // not the recommended encoding for shareable content.
   virtual void GenerateMHTML(
-      const base::FilePath& file,
-      bool use_binary_encoding,
+      const MHTMLGenerationParams& params,
       const base::Callback<void(int64_t /* size of the file */)>& callback) = 0;
 
   // Returns the contents MIME type after a navigation.
diff --git a/content/public/common/common_param_traits_macros.h b/content/public/common/common_param_traits_macros.h
index 532344c..3a1b8fbe 100644
--- a/content/public/common/common_param_traits_macros.h
+++ b/content/public/common/common_param_traits_macros.h
@@ -10,6 +10,7 @@
 
 #include "build/build_config.h"
 #include "content/public/common/console_message_level.h"
+#include "content/public/common/mhtml_generation_params.h"
 #include "content/public/common/referrer.h"
 #include "content/public/common/security_style.h"
 #include "content/public/common/ssl_status.h"
@@ -43,6 +44,8 @@
                           net::NetworkChangeNotifier::CONNECTION_LAST)
 IPC_ENUM_TRAITS_MAX_VALUE(content::ConsoleMessageLevel,
                           content::CONSOLE_MESSAGE_LEVEL_LAST)
+IPC_ENUM_TRAITS_MAX_VALUE(content::MHTMLCacheControlPolicy,
+                          content::MHTMLCacheControlPolicy::LAST)
 IPC_ENUM_TRAITS_MAX_VALUE(content::SecurityStyle,
                           content::SECURITY_STYLE_LAST)
 IPC_ENUM_TRAITS_MAX_VALUE(blink::WebReferrerPolicy,
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index 15cf2c6..74151991 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -30,10 +30,6 @@
 const base::Feature kDocumentWriteEvaluator{"DocumentWriteEvaluator",
                                             base::FEATURE_DISABLED_BY_DEFAULT};
 
-// The Experimental Framework for controlling access to API experiments.
-const base::Feature kExperimentalFramework{"ExperimentalFramework",
-                                           base::FEATURE_ENABLED_BY_DEFAULT};
-
 // Enable the material design playback UI for media elements.  This is always
 // on for OS_ANDROID, but may be enabled by experiment for other platforms.
 const base::Feature kNewMediaPlaybackUi{"NewMediaPlaybackUi",
@@ -58,6 +54,10 @@
     "OptimizeForSmallResource",
     base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Origin Trials for controlling access to feature/API experiments.
+const base::Feature kOriginTrials{"OriginTrials",
+                                  base::FEATURE_ENABLED_BY_DEFAULT};
+
 // Partial support for pointer event feature.
 const base::Feature kPointerEvents{"PointerEvent",
                                    base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index 02c1582..bec9e48 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -20,11 +20,11 @@
 CONTENT_EXPORT extern const base::Feature kCredentialManagementAPI;
 CONTENT_EXPORT extern const base::Feature kDownloadResumption;
 CONTENT_EXPORT extern const base::Feature kDocumentWriteEvaluator;
-CONTENT_EXPORT extern const base::Feature kExperimentalFramework;
 CONTENT_EXPORT extern const base::Feature kNewMediaPlaybackUi;
 CONTENT_EXPORT extern const base::Feature kMediaDocumentDownloadButton;
 CONTENT_EXPORT extern const base::Feature kNonValidatingReloadOnRefreshContent;
 CONTENT_EXPORT extern const base::Feature kOptimizeIPCForSmallResource;
+CONTENT_EXPORT extern const base::Feature kOriginTrials;
 CONTENT_EXPORT extern const base::Feature kPointerEvents;
 CONTENT_EXPORT extern const base::Feature kScrollAnchoring;
 CONTENT_EXPORT extern const base::Feature kStaleWhileRevalidate;
diff --git a/content/public/common/mhtml_generation_params.cc b/content/public/common/mhtml_generation_params.cc
new file mode 100644
index 0000000..f5011aa
--- /dev/null
+++ b/content/public/common/mhtml_generation_params.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 "content/public/common/mhtml_generation_params.h"
+
+#include "base/files/file_path.h"
+
+namespace content {
+
+MHTMLGenerationParams::MHTMLGenerationParams(const base::FilePath& file_path)
+    : file_path(file_path) {}
+
+}  // namespace content
diff --git a/content/public/common/mhtml_generation_params.h b/content/public/common/mhtml_generation_params.h
new file mode 100644
index 0000000..c61879f
--- /dev/null
+++ b/content/public/common/mhtml_generation_params.h
@@ -0,0 +1,45 @@
+// 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_PUBLIC_COMMON_MHTML_GENERATION_PARAMS_H_
+#define CONTENT_PUBLIC_COMMON_MHTML_GENERATION_PARAMS_H_
+
+#include "base/files/file_path.h"
+#include "content/common/content_export.h"
+
+namespace content {
+
+// Options for changing serialization behavior based on the CacheControl header
+// of each subresource.
+enum class MHTMLCacheControlPolicy {
+  NONE = 0,
+  FAIL_FOR_NO_STORE_MAIN_FRAME,
+
+  // |LAST| is used in content/public/common/common_param_traits_macros.h with
+  // IPC_ENUM_TRAITS_MAX_VALUE macro. Keep the value up to date. Otherwise
+  // a new value can not be passed to the renderer.
+  LAST = FAIL_FOR_NO_STORE_MAIN_FRAME
+};
+
+struct CONTENT_EXPORT MHTMLGenerationParams {
+  MHTMLGenerationParams(const base::FilePath& file_path);
+  ~MHTMLGenerationParams() = default;
+
+  // The file that will contain the generated MHTML.
+  base::FilePath file_path;
+
+  // Uses Content-Transfer-Encoding: binary when encoding.  See
+  // https://tools.ietf.org/html/rfc2045 for details about
+  // Content-Transfer-Encoding.
+  bool use_binary_encoding = false;
+
+  // By default, MHTML includes all subresources.  This flag can be used to
+  // cause the generator to fail or silently ignore resources if the
+  // Cache-Control header is used.
+  MHTMLCacheControlPolicy cache_control_policy = MHTMLCacheControlPolicy::NONE;
+};
+
+}  // namespace content
+
+#endif  // CONTENT_PUBLIC_COMMON_MHTML_GENERATION_PARAMS_H_
diff --git a/content/public/common/mojo_application_info.cc b/content/public/common/mojo_application_info.cc
index 23250d83..4c2c534 100644
--- a/content/public/common/mojo_application_info.cc
+++ b/content/public/common/mojo_application_info.cc
@@ -5,16 +5,13 @@
 #include "content/public/common/mojo_application_info.h"
 
 #include "base/callback.h"
-#include "base/single_thread_task_runner.h"
 
 namespace content {
 
 MojoApplicationInfo::MojoApplicationInfo() {}
 
-MojoApplicationInfo::MojoApplicationInfo(const MojoApplicationInfo& other) {
-  application_factory = other.application_factory;
-  application_task_runner = other.application_task_runner;
-}
+MojoApplicationInfo::MojoApplicationInfo(const MojoApplicationInfo& other)
+    = default;
 
 MojoApplicationInfo::~MojoApplicationInfo() {}
 
diff --git a/content/public/common/mojo_application_info.h b/content/public/common/mojo_application_info.h
index 72513bdf..b5bcc44 100644
--- a/content/public/common/mojo_application_info.h
+++ b/content/public/common/mojo_application_info.h
@@ -18,6 +18,8 @@
 
 namespace content {
 
+// MojoApplicationInfo provides details necessary to construct and bind new
+// instances of embedded Mojo applications.
 struct CONTENT_EXPORT MojoApplicationInfo {
   using ApplicationFactory = base::Callback<std::unique_ptr<shell::ShellClient>(
       const base::Closure& quit_closure)>;
@@ -26,8 +28,21 @@
   MojoApplicationInfo(const MojoApplicationInfo& other);
   ~MojoApplicationInfo();
 
+  // A factory function which will be called to produce a new ShellClient
+  // instance for this app whenever one is needed.
   ApplicationFactory application_factory;
+
+  // The task runner on which to construct and bind new ShellClient instances
+  // for this app. If null, behavior depends on the value of |use_own_thread|
+  // below.
   scoped_refptr<base::SingleThreadTaskRunner> application_task_runner;
+
+  // If |application_task_runner| is null, setting this to |true| will give
+  // each instance of this app its own thread to run on. Setting this to |false|
+  // (the default) will instead run the app on the main thread's task runner.
+  //
+  // If |application_task_runner| is not null, this value is ignored.
+  bool use_own_thread = false;
 };
 
 }  // namespace content
diff --git a/content/public/renderer/render_frame.h b/content/public/renderer/render_frame.h
index 8f42075..06fb036 100644
--- a/content/public/renderer/render_frame.h
+++ b/content/public/renderer/render_frame.h
@@ -93,10 +93,6 @@
   // Returns the associated WebFrame.
   virtual blink::WebLocalFrame* GetWebFrame() = 0;
 
-  // Gets the focused element. If no such element exists then
-  // the element will be Null.
-  virtual blink::WebElement GetFocusedElement() const = 0;
-
    // Gets WebKit related preferences associated with this frame.
   virtual WebPreferences& GetWebkitPreferences() = 0;
 
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn
index dbc5f5e..13138ab1 100644
--- a/content/renderer/BUILD.gn
+++ b/content/renderer/BUILD.gn
@@ -32,6 +32,7 @@
     "//base:i18n",
     "//cc",
     "//cc/blink",
+    "//cc/ipc",
     "//cc/proto",
     "//cc/surfaces",
     "//cc/surfaces:surface_id",
@@ -75,6 +76,7 @@
     "//storage/common",
     "//third_party/WebKit/public:blink",
     "//third_party/WebKit/public:mojo_bindings",
+    "//third_party/WebKit/public:mojo_bindings_blink",
     "//third_party/boringssl",
     "//third_party/icu",
     "//third_party/libjingle",
diff --git a/content/renderer/android/synchronous_compositor_proxy.cc b/content/renderer/android/synchronous_compositor_proxy.cc
index 10fcf90..ae6a131 100644
--- a/content/renderer/android/synchronous_compositor_proxy.cc
+++ b/content/renderer/android/synchronous_compositor_proxy.cc
@@ -7,9 +7,9 @@
 #include "base/auto_reset.h"
 #include "base/command_line.h"
 #include "base/memory/shared_memory.h"
+#include "cc/ipc/cc_param_traits.h"
 #include "content/common/android/sync_compositor_messages.h"
 #include "content/common/android/sync_compositor_statics.h"
-#include "content/common/cc_messages.h"
 #include "content/public/common/content_switches.h"
 #include "ipc/ipc_message.h"
 #include "ipc/ipc_sender.h"
diff --git a/content/renderer/media/video_track_recorder.cc b/content/renderer/media/video_track_recorder.cc
index 6110997a..8da8f30 100644
--- a/content/renderer/media/video_track_recorder.cc
+++ b/content/renderer/media/video_track_recorder.cc
@@ -46,23 +46,32 @@
 // - receives VideoFrames on |origin_task_runner_| and runs OnEncodedVideoCB on
 // that thread as well. This task runner is cached on first frame arrival, and
 // is supposed to be the render IO thread (but this is not enforced);
-// - uses an internal |encoding_thread_| for actual encoder interactions, namely
-// configuration, encoding (which might take some time) and destruction.
+// - uses an internal |encoding_task_runner_| for actual encoder interactions,
+// namely configuration, encoding (which might take some time) and destruction.
+// This task runner can be passed on the creation. If nothing is passed, a new
+// encoding thread is created and used.
 class VideoTrackRecorder::Encoder : public base::RefCountedThreadSafe<Encoder> {
  public:
   Encoder(const OnEncodedVideoCB& on_encoded_video_callback,
-          int32_t bits_per_second)
+          int32_t bits_per_second,
+          scoped_refptr<base::SingleThreadTaskRunner> encoding_task_runner =
+              nullptr)
       : main_task_runner_(base::MessageLoop::current()->task_runner()),
-        encoding_thread_(new base::Thread("EncodingThread")),
+        encoding_task_runner_(encoding_task_runner),
         paused_(false),
         on_encoded_video_callback_(on_encoded_video_callback),
         bits_per_second_(bits_per_second) {
     DCHECK(!on_encoded_video_callback_.is_null());
+    if (encoding_thread_)
+      return;
+    encoding_thread_.reset(new base::Thread("EncodingThread"));
+    encoding_thread_->Start();
+    encoding_task_runner_ = encoding_thread_->task_runner();
   }
 
   // Start encoding |frame|, returning via |on_encoded_video_callback_|. This
-  // call will also trigger a ConfigureEncoderOnEncodingThread() upon first
-  // frame arrival or parameter change, and an EncodeOnEncodingThread() to
+  // call will also trigger a ConfigureEncoderOnEncodingTaskRunner() upon first
+  // frame arrival or parameter change, and an EncodeOnEncodingTaskRunner() to
   // actually encode the frame.
   void StartFrameEncode(const scoped_refptr<VideoFrame>& frame,
                         base::TimeTicks capture_timestamp);
@@ -73,9 +82,10 @@
   friend class base::RefCountedThreadSafe<Encoder>;
   virtual ~Encoder() {}
 
-  virtual void EncodeOnEncodingThread(const scoped_refptr<VideoFrame>& frame,
-                                      base::TimeTicks capture_timestamp) = 0;
-  virtual void ConfigureEncoderOnEncodingThread(const gfx::Size& size) = 0;
+  virtual void EncodeOnEncodingTaskRunner(
+      const scoped_refptr<VideoFrame>& frame,
+      base::TimeTicks capture_timestamp) = 0;
+  virtual void ConfigureEncoderOnEncodingTaskRunner(const gfx::Size& size) = 0;
 
   // Used to shutdown properly on the same thread we were created.
   const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
@@ -83,7 +93,10 @@
   // Task runner where frames to encode and reply callbacks must happen.
   scoped_refptr<base::SingleThreadTaskRunner> origin_task_runner_;
 
-  // Thread for encoding. Active for the lifetime of VpxEncoder.
+  // Task runner where encoding interactions happen.
+  scoped_refptr<base::SingleThreadTaskRunner> encoding_task_runner_;
+
+  // Optional thread for encoding. Active for the lifetime of VpxEncoder.
   std::unique_ptr<base::Thread> encoding_thread_;
 
   // While |paused_|, frames are not encoded. Used only from |encoding_thread_|.
@@ -119,14 +132,14 @@
   if (frame->format() == media::PIXEL_FORMAT_YV12A)
     frame = media::WrapAsI420VideoFrame(video_frame);
 
-  encoding_thread_->task_runner()->PostTask(
-      FROM_HERE, base::Bind(&Encoder::EncodeOnEncodingThread,
-                            this, frame, capture_timestamp));
+  encoding_task_runner_->PostTask(
+      FROM_HERE, base::Bind(&Encoder::EncodeOnEncodingTaskRunner, this, frame,
+                            capture_timestamp));
 }
 
 void VideoTrackRecorder::Encoder::SetPaused(bool paused) {
-  if (!encoding_thread_->task_runner()->BelongsToCurrentThread()) {
-    encoding_thread_->task_runner()->PostTask(
+  if (!encoding_task_runner_->BelongsToCurrentThread()) {
+    encoding_task_runner_->PostTask(
         FROM_HERE, base::Bind(&Encoder::SetPaused, this, paused));
     return;
   }
@@ -180,9 +193,9 @@
  private:
   // VideoTrackRecorder::Encoder
   ~VpxEncoder() override;
-  void EncodeOnEncodingThread(const scoped_refptr<VideoFrame>& frame,
+  void EncodeOnEncodingTaskRunner(const scoped_refptr<VideoFrame>& frame,
                               base::TimeTicks capture_timestamp) override;
-  void ConfigureEncoderOnEncodingThread(const gfx::Size& size) override;
+  void ConfigureEncoderOnEncodingTaskRunner(const gfx::Size& size) override;
 
   // Returns true if |codec_config_| has been filled in at least once.
   bool IsInitialized() const;
@@ -232,9 +245,9 @@
  private:
   // VideoTrackRecorder::Encoder
   ~H264Encoder() override;
-  void EncodeOnEncodingThread(const scoped_refptr<VideoFrame>& frame,
+  void EncodeOnEncodingTaskRunner(const scoped_refptr<VideoFrame>& frame,
                               base::TimeTicks capture_timestamp) override;
-  void ConfigureEncoderOnEncodingThread(const gfx::Size& size) override;
+  void ConfigureEncoderOnEncodingTaskRunner(const gfx::Size& size) override;
 
   // |openh264_encoder_| is a special scoped pointer to guarantee proper
   // destruction, also when reconfiguring due to parameters change. Only used on
@@ -266,9 +279,7 @@
     : Encoder(on_encoded_video_callback, bits_per_second),
       use_vp9_(use_vp9) {
   codec_config_.g_timebase.den = 0;  // Not initialized.
-
-  DCHECK(!encoding_thread_->IsRunning());
-  encoding_thread_->Start();
+  DCHECK(encoding_thread_->IsRunning());
 }
 
 VpxEncoder::~VpxEncoder() {
@@ -278,15 +289,16 @@
                                          base::Passed(&encoder_)));
 }
 
-void VpxEncoder::EncodeOnEncodingThread(const scoped_refptr<VideoFrame>& frame,
-                                        base::TimeTicks capture_timestamp) {
-  TRACE_EVENT0("video", "VpxEncoder::EncodeOnEncodingThread");
-  DCHECK(encoding_thread_->task_runner()->BelongsToCurrentThread());
+void VpxEncoder::EncodeOnEncodingTaskRunner(
+    const scoped_refptr<VideoFrame>& frame,
+    base::TimeTicks capture_timestamp) {
+  TRACE_EVENT0("video", "VpxEncoder::EncodeOnEncodingTaskRunner");
+  DCHECK(encoding_task_runner_->BelongsToCurrentThread());
 
   const gfx::Size frame_size = frame->visible_rect().size();
   if (!IsInitialized() ||
       gfx::Size(codec_config_.g_w, codec_config_.g_h) != frame_size) {
-    ConfigureEncoderOnEncodingThread(frame_size);
+    ConfigureEncoderOnEncodingTaskRunner(frame_size);
   }
 
   vpx_image_t vpx_image;
@@ -338,8 +350,8 @@
                  keyframe));
 }
 
-void VpxEncoder::ConfigureEncoderOnEncodingThread(const gfx::Size& size) {
-  DCHECK(encoding_thread_->task_runner()->BelongsToCurrentThread());
+void VpxEncoder::ConfigureEncoderOnEncodingTaskRunner(const gfx::Size& size) {
+  DCHECK(encoding_task_runner_->BelongsToCurrentThread());
   if (IsInitialized()) {
     // TODO(mcasas) VP8 quirk/optimisation: If the new |size| is strictly less-
     // than-or-equal than the old size, in terms of area, the existing encoder
@@ -428,13 +440,13 @@
 }
 
 bool VpxEncoder::IsInitialized() const {
-  DCHECK(encoding_thread_->task_runner()->BelongsToCurrentThread());
+  DCHECK(encoding_task_runner_->BelongsToCurrentThread());
   return codec_config_.g_timebase.den != 0;
 }
 
 base::TimeDelta VpxEncoder::EstimateFrameDuration(
     const scoped_refptr<VideoFrame>& frame) {
-  DCHECK(encoding_thread_->task_runner()->BelongsToCurrentThread());
+  DCHECK(encoding_task_runner_->BelongsToCurrentThread());
 
   using base::TimeDelta;
   TimeDelta predicted_frame_duration;
@@ -471,8 +483,7 @@
     const VideoTrackRecorder::OnEncodedVideoCB& on_encoded_video_callback,
     int32_t bits_per_second)
     : Encoder(on_encoded_video_callback, bits_per_second) {
-  DCHECK(!encoding_thread_->IsRunning());
-  encoding_thread_->Start();
+  DCHECK(encoding_thread_->IsRunning());
 }
 
 H264Encoder::~H264Encoder() {
@@ -482,14 +493,15 @@
                                          base::Passed(&openh264_encoder_)));
 }
 
-void H264Encoder::EncodeOnEncodingThread(const scoped_refptr<VideoFrame>& frame,
-                                         base::TimeTicks capture_timestamp) {
-  TRACE_EVENT0("video", "H264Encoder::EncodeOnEncodingThread");
-  DCHECK(encoding_thread_->task_runner()->BelongsToCurrentThread());
+void H264Encoder::EncodeOnEncodingTaskRunner(
+    const scoped_refptr<VideoFrame>& frame,
+    base::TimeTicks capture_timestamp) {
+  TRACE_EVENT0("video", "H264Encoder::EncodeOnEncodingTaskRunner");
+  DCHECK(encoding_task_runner_->BelongsToCurrentThread());
 
   const gfx::Size frame_size = frame->visible_rect().size();
   if (!openh264_encoder_ || configured_size_ != frame_size) {
-    ConfigureEncoderOnEncodingThread(frame_size);
+    ConfigureEncoderOnEncodingTaskRunner(frame_size);
     first_frame_timestamp_ = capture_timestamp;
   }
 
@@ -539,8 +551,8 @@
                  base::Passed(&data), capture_timestamp, is_key_frame));
 }
 
-void H264Encoder::ConfigureEncoderOnEncodingThread(const gfx::Size& size) {
-  DCHECK(encoding_thread_->task_runner()->BelongsToCurrentThread());
+void H264Encoder::ConfigureEncoderOnEncodingTaskRunner(const gfx::Size& size) {
+  DCHECK(encoding_task_runner_->BelongsToCurrentThread());
   ISVCEncoder* temp_encoder = nullptr;
   if (WelsCreateSVCEncoder(&temp_encoder) != 0) {
     NOTREACHED() << "Failed to create OpenH264 encoder";
diff --git a/content/renderer/notification_permission_dispatcher.cc b/content/renderer/notification_permission_dispatcher.cc
index bb07048e..f038b5c 100644
--- a/content/renderer/notification_permission_dispatcher.cc
+++ b/content/renderer/notification_permission_dispatcher.cc
@@ -11,6 +11,7 @@
 #include "content/public/renderer/render_frame.h"
 #include "third_party/WebKit/public/platform/WebSecurityOrigin.h"
 #include "third_party/WebKit/public/platform/WebString.h"
+#include "third_party/WebKit/public/platform/modules/permissions/permission_status.mojom-blink.h"
 #include "third_party/WebKit/public/platform/modules/permissions/permission_status.mojom.h"
 #include "third_party/WebKit/public/web/modules/notifications/WebNotificationPermissionCallback.h"
 
@@ -48,7 +49,10 @@
     blink::mojom::PermissionStatus status) {
   DCHECK(callback);
 
-  callback->permissionRequestComplete(status);
+  blink::mojom::blink::PermissionStatus blink_status =
+      static_cast<blink::mojom::blink::PermissionStatus>(status);
+
+  callback->permissionRequestComplete(blink_status);
 }
 
 }  // namespace content
diff --git a/content/renderer/pepper/pepper_video_encoder_host.cc b/content/renderer/pepper/pepper_video_encoder_host.cc
index ee8f8dc..b50ac5f 100644
--- a/content/renderer/pepper/pepper_video_encoder_host.cc
+++ b/content/renderer/pepper/pepper_video_encoder_host.cc
@@ -525,11 +525,12 @@
   if (!channel)
     return false;
 
-  std::vector<int32_t> attribs(1, PP_GRAPHICS3DATTRIB_NONE);
-  command_buffer_ = channel->CreateCommandBuffer(
-      gpu::kNullSurfaceHandle, gfx::Size(), nullptr, gpu::GPU_STREAM_DEFAULT,
-      gpu::GpuStreamPriority::NORMAL, attribs, GURL::EmptyGURL(),
-      gfx::PreferIntegratedGpu, base::ThreadTaskRunnerHandle::Get());
+  std::vector<int32_t> attribs = {PP_GRAPHICS3DATTRIB_NONE};
+  command_buffer_ = gpu::CommandBufferProxyImpl::Create(
+      std::move(channel), gpu::kNullSurfaceHandle, gfx::Size(), nullptr,
+      gpu::GPU_STREAM_DEFAULT, gpu::GpuStreamPriority::NORMAL,
+      std::move(attribs), GURL::EmptyGURL(), gfx::PreferIntegratedGpu,
+      base::ThreadTaskRunnerHandle::Get());
   if (!command_buffer_) {
     Close();
     return false;
diff --git a/content/renderer/pepper/ppb_graphics_3d_impl.cc b/content/renderer/pepper/ppb_graphics_3d_impl.cc
index 2c98cfb..6438418 100644
--- a/content/renderer/pepper/ppb_graphics_3d_impl.cc
+++ b/content/renderer/pepper/ppb_graphics_3d_impl.cc
@@ -227,7 +227,7 @@
   gfx::Size surface_size;
   std::vector<int32_t> attribs;
   gfx::GpuPreference gpu_preference = gfx::PreferDiscreteGpu;
-  // TODO(alokp): Change GpuChannelHost::CreateCommandBuffer()
+  // TODO(alokp): Change CommandBufferProxyImpl::Create()
   // interface to accept width and height in the attrib_list so that
   // we do not need to filter for width and height here.
   if (attrib_list) {
@@ -265,10 +265,11 @@
     share_buffer = share_graphics->GetCommandBufferProxy();
   }
 
-  command_buffer_ = channel->CreateCommandBuffer(
-      gpu::kNullSurfaceHandle, surface_size, share_buffer,
-      gpu::GPU_STREAM_DEFAULT, gpu::GpuStreamPriority::NORMAL, attribs,
-      GURL::EmptyGURL(), gpu_preference, base::ThreadTaskRunnerHandle::Get());
+  command_buffer_ = gpu::CommandBufferProxyImpl::Create(
+      std::move(channel), gpu::kNullSurfaceHandle, surface_size, share_buffer,
+      gpu::GPU_STREAM_DEFAULT, gpu::GpuStreamPriority::NORMAL,
+      std::move(attribs), GURL::EmptyGURL(), gpu_preference,
+      base::ThreadTaskRunnerHandle::Get());
   if (!command_buffer_)
     return false;
 
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 79bdb6c8..e50f698 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -69,6 +69,7 @@
 #include "content/public/common/content_switches.h"
 #include "content/public/common/context_menu_params.h"
 #include "content/public/common/isolated_world_ids.h"
+#include "content/public/common/mhtml_generation_params.h"
 #include "content/public/common/page_state.h"
 #include "content/public/common/resource_response.h"
 #include "content/public/common/url_constants.h"
@@ -1004,7 +1005,6 @@
       in_frame_tree_(false),
       render_view_(params.render_view->AsWeakPtr()),
       routing_id_(params.routing_id),
-      render_frame_proxy_(NULL),
       is_detaching_(false),
       proxy_routing_id_(MSG_ROUTING_NONE),
 #if defined(ENABLE_PLUGINS)
@@ -1221,10 +1221,10 @@
 RenderWidgetFullscreenPepper* RenderFrameImpl::CreatePepperFullscreenContainer(
     PepperPluginInstanceImpl* plugin) {
   GURL active_url;
-  if (render_view_->webview() && render_view_->webview()->mainFrame())
-    active_url = GURL(render_view_->webview()->mainFrame()->document().url());
+  if (render_view_->webview())
+    active_url = render_view()->GetURLForGraphicsContext3D();
   RenderWidgetFullscreenPepper* widget = RenderWidgetFullscreenPepper::Create(
-      GetRenderWidget()->routing_id(), GetRenderWidget()->compositor_deps(),
+      render_view()->routing_id(), GetRenderWidget()->compositor_deps(),
       plugin, active_url, GetRenderWidget()->screenInfo());
   widget->show(blink::WebNavigationPolicyIgnore);
   return widget;
@@ -1573,11 +1573,6 @@
   if (is_main_frame_)
     render_view_->SetSwappedOut(true);
 
-  // Set the proxy here, since OnStop() below could cause an onload event
-  // handler to execute, which could trigger code such as
-  // willCheckAndDispatchMessageEvent() that needs the proxy.
-  set_render_frame_proxy(proxy);
-
   // Transfer settings such as initial drawing parameters to the remote frame,
   // if one is created, that will replace this frame.
   if (!is_main_frame_)
@@ -1695,36 +1690,32 @@
 }
 
 void RenderFrameImpl::OnUndo() {
-  frame_->executeCommand(WebString::fromUTF8("Undo"), GetFocusedElement());
+  frame_->executeCommand(WebString::fromUTF8("Undo"));
 }
 
 void RenderFrameImpl::OnRedo() {
-  frame_->executeCommand(WebString::fromUTF8("Redo"), GetFocusedElement());
+  frame_->executeCommand(WebString::fromUTF8("Redo"));
 }
 
 void RenderFrameImpl::OnCut() {
   base::AutoReset<bool> handling_select_range(&handling_select_range_, true);
-  frame_->executeCommand(WebString::fromUTF8("Cut"), GetFocusedElement());
+  frame_->executeCommand(WebString::fromUTF8("Cut"));
 }
 
 void RenderFrameImpl::OnCopy() {
   base::AutoReset<bool> handling_select_range(&handling_select_range_, true);
-  WebNode current_node = frame_->contextMenuNode();
-  frame_->executeCommand(WebString::fromUTF8("Copy"), current_node.isNull()
-                                                          ? GetFocusedElement()
-                                                          : current_node);
+  frame_->executeCommand(WebString::fromUTF8("Copy"));
 }
 
 void RenderFrameImpl::OnPaste() {
   base::AutoReset<bool> handling_select_range(&handling_select_range_, true);
   base::AutoReset<bool> handling_paste(&is_pasting_, true);
-  frame_->executeCommand(WebString::fromUTF8("Paste"), GetFocusedElement());
+  frame_->executeCommand(WebString::fromUTF8("Paste"));
 }
 
 void RenderFrameImpl::OnPasteAndMatchStyle() {
   base::AutoReset<bool> handling_select_range(&handling_select_range_, true);
-  frame_->executeCommand(
-      WebString::fromUTF8("PasteAndMatchStyle"), GetFocusedElement());
+  frame_->executeCommand(WebString::fromUTF8("PasteAndMatchStyle"));
 }
 
 #if defined(OS_MACOSX)
@@ -1740,12 +1731,12 @@
 #endif
 
 void RenderFrameImpl::OnDelete() {
-  frame_->executeCommand(WebString::fromUTF8("Delete"), GetFocusedElement());
+  frame_->executeCommand(WebString::fromUTF8("Delete"));
 }
 
 void RenderFrameImpl::OnSelectAll() {
   base::AutoReset<bool> handling_select_range(&handling_select_range_, true);
-  frame_->executeCommand(WebString::fromUTF8("SelectAll"), GetFocusedElement());
+  frame_->executeCommand(WebString::fromUTF8("SelectAll"));
 }
 
 void RenderFrameImpl::OnSelectRange(const gfx::Point& base,
@@ -1784,7 +1775,7 @@
 
 void RenderFrameImpl::OnUnselect() {
   base::AutoReset<bool> handling_select_range(&handling_select_range_, true);
-  frame_->executeCommand(WebString::fromUTF8("Unselect"), GetFocusedElement());
+  frame_->executeCommand(WebString::fromUTF8("Unselect"));
 }
 
 void RenderFrameImpl::OnMoveRangeSelectionExtent(const gfx::Point& point) {
@@ -1977,7 +1968,7 @@
 }
 
 void RenderFrameImpl::OnExecuteNoValueEditCommand(const std::string& name) {
-  frame_->executeCommand(WebString::fromUTF8(name), GetFocusedElement());
+  frame_->executeCommand(WebString::fromUTF8(name));
 }
 
 void RenderFrameImpl::OnExtendSelectionAndDelete(int before, int after) {
@@ -2240,14 +2231,6 @@
   return frame_;
 }
 
-WebElement RenderFrameImpl::GetFocusedElement() const {
-  WebDocument doc = frame_->document();
-  if (!doc.isNull())
-    return doc.focusedElement();
-
-  return WebElement();
-}
-
 WebPreferences& RenderFrameImpl::GetWebkitPreferences() {
   return render_view_->GetWebkitPreferences();
 }
@@ -4150,34 +4133,6 @@
   return midi_dispatcher_;
 }
 
-bool RenderFrameImpl::willCheckAndDispatchMessageEvent(
-    blink::WebLocalFrame* source_frame,
-    blink::WebFrame* target_frame,
-    blink::WebSecurityOrigin target_origin,
-    blink::WebDOMMessageEvent event) {
-  DCHECK(!frame_ || frame_ == target_frame);
-
-  // TODO(alexmos, nasko): When swapped-out:// disappears, this should be
-  // cleaned up so that RenderFrameProxy::postMessageEvent is the only path for
-  // cross-process postMessages.
-
-  // It is possible to get here on a swapped-out frame without a
-  // |render_frame_proxy_|. This happens when:
-  // - This process only has one active RenderView and is about to go away
-  //   (e.g., due to cross-process navigation).
-  // - The top frame has a subframe with an unload handler.
-  // - The subframe sends a postMessage to the top-level frame in its unload
-  //   handler.
-  // See https://crbug.com/475651 for details.  We return false here, since we
-  // don't want to deliver the message to the new process in this case.
-  if (!render_frame_proxy_)
-    return false;
-
-  render_frame_proxy_->postMessageEvent(
-      source_frame, render_frame_proxy_->web_frame(), target_origin, event);
-  return true;
-}
-
 blink::WebString RenderFrameImpl::userAgentOverride() {
   if (!render_view_->webview() || !render_view_->webview()->mainFrame() ||
       render_view_->renderer_preferences_.user_agent_override.empty()) {
@@ -4954,9 +4909,12 @@
 
   // Generate MHTML header if needed.
   if (IsMainFrame()) {
-    data =
-        WebFrameSerializer::generateMHTMLHeader(mhtml_boundary, GetWebFrame());
-    if (file.WriteAtCurrentPos(data.data(), data.size()) < 0) {
+    blink::WebFrameSerializerCacheControlPolicy policy =
+        static_cast<blink::WebFrameSerializerCacheControlPolicy>(
+            params.mhtml_cache_control_policy);
+    success = WebFrameSerializer::generateMHTMLHeader(mhtml_boundary, policy,
+                                                      GetWebFrame(), &data);
+    if (success && file.WriteAtCurrentPos(data.data(), data.size()) < 0) {
       success = false;
     }
   }
@@ -5042,8 +5000,7 @@
 
     if (!result) {
       // Don't leave text selected as you move to the next frame.
-      search_frame->executeCommand(WebString::fromUTF8("Unselect"),
-                                   GetFocusedElement());
+      search_frame->executeCommand(WebString::fromUTF8("Unselect"));
 
       // Find the next frame, but skip the invisible ones.
       do {
@@ -5056,8 +5013,7 @@
                search_frame != focused_frame);
 
       // Make sure selection doesn't affect the search operation in new frame.
-      search_frame->executeCommand(WebString::fromUTF8("Unselect"),
-                                   GetFocusedElement());
+      search_frame->executeCommand(WebString::fromUTF8("Unselect"));
 
       // If we have multiple frames and we have wrapped back around to the
       // focused frame, we need to search it once more allowing wrap within
@@ -5136,8 +5092,7 @@
 
   bool clear_selection = action == STOP_FIND_ACTION_CLEAR_SELECTION;
   if (clear_selection) {
-    view->focusedFrame()->executeCommand(WebString::fromUTF8("Unselect"),
-                                         GetFocusedElement());
+    view->focusedFrame()->executeCommand(WebString::fromUTF8("Unselect"));
   }
 
   WebLocalFrame* frame = GetWebFrame();
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index 6ab8b37..a38836e 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -31,7 +31,6 @@
 #include "content/public/renderer/render_frame.h"
 #include "content/renderer/frame_blame_context.h"
 #include "content/renderer/mojo/blink_service_registry_impl.h"
-#include "content/renderer/render_frame_proxy.h"
 #include "content/renderer/renderer_webcookiejar_impl.h"
 #include "ipc/ipc_message.h"
 #include "ipc/ipc_platform_file.h"
@@ -230,12 +229,6 @@
 
   ~RenderFrameImpl() override;
 
-  // TODO(nasko): This can be removed once we don't have a swapped out state on
-  // RenderFrames. See https://crbug.com/357747.
-  void set_render_frame_proxy(RenderFrameProxy* proxy) {
-    render_frame_proxy_ = proxy;
-  }
-
   // Called by RenderWidget when meaningful layout has happened.
   // See RenderFrameObserver::DidMeaningfulLayout declaration for details.
   void DidMeaningfulLayout(blink::WebMeaningfulLayout layout_type);
@@ -384,7 +377,6 @@
   RenderView* GetRenderView() override;
   int GetRoutingID() override;
   blink::WebLocalFrame* GetWebFrame() override;
-  blink::WebElement GetFocusedElement() const override;
   WebPreferences& GetWebkitPreferences() override;
   int ShowContextMenu(ContextMenuClient* client,
                       const ContextMenuParams& params) override;
@@ -587,11 +579,6 @@
   blink::WebUserMediaClient* userMediaClient() override;
   blink::WebEncryptedMediaClient* encryptedMediaClient() override;
   blink::WebMIDIClient* webMIDIClient() override;
-  bool willCheckAndDispatchMessageEvent(
-      blink::WebLocalFrame* source_frame,
-      blink::WebFrame* target_frame,
-      blink::WebSecurityOrigin target_origin,
-      blink::WebDOMMessageEvent event) override;
   blink::WebString userAgentOverride() override;
   blink::WebString doNotTrackValue() override;
   bool allowWebGL(bool default_value) override;
@@ -1046,9 +1033,6 @@
   base::WeakPtr<RenderViewImpl> render_view_;
   int routing_id_;
 
-  // TODO(nasko): This can be removed once we don't have a swapped out state on
-  // RenderFrame. See https://crbug.com/357747.
-  RenderFrameProxy* render_frame_proxy_;
   bool is_detaching_;
 
   // If this frame was created to replace a proxy, this will store the routing
diff --git a/content/renderer/render_frame_proxy.cc b/content/renderer/render_frame_proxy.cc
index 0b550b9..c2a22327e 100644
--- a/content/renderer/render_frame_proxy.cc
+++ b/content/renderer/render_frame_proxy.cc
@@ -166,15 +166,6 @@
 }
 
 RenderFrameProxy::~RenderFrameProxy() {
-  // TODO(nasko): Set the render_frame_proxy to null to avoid a double deletion
-  // when detaching the main frame. This can be removed once RenderFrameImpl and
-  // RenderFrameProxy have been completely decoupled. See
-  // https://crbug.com/357747.
-  RenderFrameImpl* render_frame =
-      RenderFrameImpl::FromRoutingID(frame_routing_id_);
-  if (render_frame)
-    render_frame->set_render_frame_proxy(nullptr);
-
   render_widget_->UnregisterRenderFrameProxy(this);
 
   CHECK(!web_frame_);
@@ -384,7 +375,7 @@
   delete this;
 }
 
-void RenderFrameProxy::postMessageEvent(
+void RenderFrameProxy::forwardPostMessage(
     blink::WebLocalFrame* source_frame,
     blink::WebRemoteFrame* target_frame,
     blink::WebSecurityOrigin target_origin,
diff --git a/content/renderer/render_frame_proxy.h b/content/renderer/render_frame_proxy.h
index 3ccbd9b..8187fd2 100644
--- a/content/renderer/render_frame_proxy.h
+++ b/content/renderer/render_frame_proxy.h
@@ -124,10 +124,10 @@
 
   // blink::WebRemoteFrameClient implementation:
   void frameDetached(DetachType type) override;
-  void postMessageEvent(blink::WebLocalFrame* sourceFrame,
-                        blink::WebRemoteFrame* targetFrame,
-                        blink::WebSecurityOrigin target,
-                        blink::WebDOMMessageEvent event) override;
+  void forwardPostMessage(blink::WebLocalFrame* sourceFrame,
+                          blink::WebRemoteFrame* targetFrame,
+                          blink::WebSecurityOrigin target,
+                          blink::WebDOMMessageEvent event) override;
   void initializeChildFrame(float scale_factor) override;
   void navigate(const blink::WebURLRequest& request,
                 bool should_replace_current_entry) override;
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
index 7a2915d..2266d55 100644
--- a/content/renderer/render_thread_impl.cc
+++ b/content/renderer/render_thread_impl.cc
@@ -407,6 +407,7 @@
 scoped_refptr<ContextProviderCommandBuffer> CreateOffscreenContext(
     scoped_refptr<gpu::GpuChannelHost> gpu_channel_host,
     const gpu::SharedMemoryLimits& limits,
+    bool support_locking,
     command_buffer_metrics::ContextType type,
     int32_t stream_id,
     gpu::GpuStreamPriority stream_priority) {
@@ -429,8 +430,8 @@
       std::move(gpu_channel_host), stream_id, stream_priority,
       gpu::kNullSurfaceHandle,
       GURL("chrome://gpu/RenderThreadImpl::CreateOffscreenContext"),
-      gfx::PreferIntegratedGpu, automatic_flushes, limits, attributes, nullptr,
-      type));
+      gfx::PreferIntegratedGpu, automatic_flushes, support_locking, limits,
+      attributes, nullptr, type));
 }
 
 }  // namespace
@@ -1420,14 +1421,14 @@
   // This context is only used to create textures and mailbox them, so
   // use lower limits than the default.
   gpu::SharedMemoryLimits limits = gpu::SharedMemoryLimits::ForMailboxContext();
+  bool support_locking = true;
   scoped_refptr<ContextProviderCommandBuffer> media_context_provider =
-      CreateOffscreenContext(gpu_channel_host, limits,
+      CreateOffscreenContext(gpu_channel_host, limits, support_locking,
                              command_buffer_metrics::RENDER_WORKER_CONTEXT,
                              gpu::GPU_STREAM_DEFAULT,
                              gpu::GpuStreamPriority::NORMAL);
   if (!media_context_provider->BindToCurrentThread())
     return nullptr;
-  media_context_provider->SetupLock();
 
   scoped_refptr<base::SingleThreadTaskRunner> media_task_runner =
       GetMediaThreadTaskRunner();
@@ -1470,8 +1471,9 @@
     return nullptr;
   }
 
+  bool support_locking = false;
   shared_main_thread_contexts_ = CreateOffscreenContext(
-      std::move(gpu_channel_host), gpu::SharedMemoryLimits(),
+      std::move(gpu_channel_host), gpu::SharedMemoryLimits(), support_locking,
       command_buffer_metrics::RENDERER_MAINTHREAD_CONTEXT,
       gpu::GPU_STREAM_DEFAULT, gpu::GpuStreamPriority::NORMAL);
   if (!shared_main_thread_contexts_->BindToCurrentThread())
@@ -1988,14 +1990,13 @@
     stream_priority = gpu::GpuStreamPriority::LOW;
   }
 
+  bool support_locking = true;
   shared_worker_context_provider_ = CreateOffscreenContext(
-      std::move(gpu_channel_host), gpu::SharedMemoryLimits(),
+      std::move(gpu_channel_host), gpu::SharedMemoryLimits(), support_locking,
       command_buffer_metrics::RENDER_WORKER_CONTEXT, stream_id,
       stream_priority);
   if (!shared_worker_context_provider_->BindToCurrentThread())
     shared_worker_context_provider_ = nullptr;
-  if (shared_worker_context_provider_)
-    shared_worker_context_provider_->SetupLock();
   return shared_worker_context_provider_;
 }
 
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc
index 1c8e44e..9eca996 100644
--- a/content/renderer/render_view_browsertest.cc
+++ b/content/renderer/render_view_browsertest.cc
@@ -51,6 +51,7 @@
 #include "content/renderer/history_controller.h"
 #include "content/renderer/history_serialization.h"
 #include "content/renderer/navigation_state_impl.h"
+#include "content/renderer/render_frame_proxy.h"
 #include "content/renderer/render_process.h"
 #include "content/renderer/render_view_impl.h"
 #include "content/shell/browser/shell.h"
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index df3decf8..b530435b 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -1695,8 +1695,7 @@
     // key (but it's the exception). Once one edit command is not executed, it
     // seems safest to not execute the rest.
     if (!frame->executeCommand(WebString::fromUTF8(it->name),
-                               WebString::fromUTF8(it->value),
-                               GetFocusedElement()))
+                               WebString::fromUTF8(it->value)))
       break;
     did_execute_command = true;
   }
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index 30bd0de..4094e62 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -778,20 +778,21 @@
   attributes.lose_context_when_out_of_memory = true;
 
   constexpr bool automatic_flushes = false;
+  constexpr bool support_locking = false;
 
-    // The compositor context shares resources with the worker context unless
-    // the worker is async.
-    ContextProviderCommandBuffer* share_context = worker_context_provider.get();
-    if (compositor_deps_->IsAsyncWorkerContextEnabled())
-      share_context = nullptr;
+  // The compositor context shares resources with the worker context unless
+  // the worker is async.
+  ContextProviderCommandBuffer* share_context = worker_context_provider.get();
+  if (compositor_deps_->IsAsyncWorkerContextEnabled())
+    share_context = nullptr;
 
-    scoped_refptr<ContextProviderCommandBuffer> context_provider(
-        new ContextProviderCommandBuffer(
-            std::move(gpu_channel_host), gpu::GPU_STREAM_DEFAULT,
-            gpu::GpuStreamPriority::NORMAL, gpu::kNullSurfaceHandle,
-            GetURLForGraphicsContext3D(), gfx::PreferIntegratedGpu,
-            automatic_flushes, limits, attributes, share_context,
-            command_buffer_metrics::RENDER_COMPOSITOR_CONTEXT));
+  scoped_refptr<ContextProviderCommandBuffer> context_provider(
+      new ContextProviderCommandBuffer(
+          std::move(gpu_channel_host), gpu::GPU_STREAM_DEFAULT,
+          gpu::GpuStreamPriority::NORMAL, gpu::kNullSurfaceHandle,
+          GetURLForGraphicsContext3D(), gfx::PreferIntegratedGpu,
+          automatic_flushes, support_locking, limits, attributes, share_context,
+          command_buffer_metrics::RENDER_COMPOSITOR_CONTEXT));
 
 #if defined(OS_ANDROID)
   if (RenderThreadImpl::current()->sync_compositor_message_filter()) {
diff --git a/content/renderer/renderer_blink_platform_impl.cc b/content/renderer/renderer_blink_platform_impl.cc
index d55df42..c043249 100644
--- a/content/renderer/renderer_blink_platform_impl.cc
+++ b/content/renderer/renderer_blink_platform_impl.cc
@@ -1086,16 +1086,17 @@
   else
     attributes.context_type = gpu::gles2::CONTEXT_TYPE_WEBGL1;
 
-  bool automatic_flushes = true;
+  constexpr bool automatic_flushes = true;
+  constexpr bool support_locking = false;
   // Prefer discrete GPU for WebGL.
-  gfx::GpuPreference gpu_preference = gfx::PreferDiscreteGpu;
+  constexpr gfx::GpuPreference gpu_preference = gfx::PreferDiscreteGpu;
 
   scoped_refptr<ContextProviderCommandBuffer> provider(
       new ContextProviderCommandBuffer(
           std::move(gpu_channel_host), gpu::GPU_STREAM_DEFAULT,
           gpu::GpuStreamPriority::NORMAL, gpu::kNullSurfaceHandle,
           GURL(top_document_web_url), gpu_preference, automatic_flushes,
-          gpu::SharedMemoryLimits(), attributes, share_context,
+          support_locking, gpu::SharedMemoryLimits(), attributes, share_context,
           command_buffer_metrics::OFFSCREEN_CONTEXT_FOR_WEBGL));
   if (will_bind_to_current_thread == blink::Platform::BindToCurrentThread) {
     if (!provider->BindToCurrentThread()) {
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 5d49764..4768b7d 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -49,6 +49,7 @@
     "//cc",
     "//cc:test_support",
     "//cc/blink",
+    "//cc/ipc",
     "//cc/surfaces",
     "//components/display_compositor",
     "//components/scheduler:scheduler",
@@ -634,6 +635,7 @@
     "//base/third_party/dynamic_annotations",
     "//cc",
     "//cc:test_support",
+    "//cc/ipc",
     "//cc/surfaces",
     "//components/display_compositor",
     "//components/scheduler",
@@ -886,6 +888,7 @@
   deps = [
     "//base/test:test_support",
     "//cc",
+    "//cc/ipc",
     "//content/browser:for_content_tests",
     "//content/public/browser",
     "//content/public/common",
diff --git a/content/test/data/nostore.html b/content/test/data/nostore.html
new file mode 100644
index 0000000..5ca34a9
--- /dev/null
+++ b/content/test/data/nostore.html
@@ -0,0 +1,4 @@
+<html>
+<head><title>Cache-Control: no-store Test Page</title></head>
+<body>Cache-Control: no-store test body</body>
+</html>
diff --git a/content/test/data/nostore.html.mock-http-headers b/content/test/data/nostore.html.mock-http-headers
new file mode 100644
index 0000000..a3f0e9d
--- /dev/null
+++ b/content/test/data/nostore.html.mock-http-headers
@@ -0,0 +1,2 @@
+HTTP/1.1 200 OK
+cache-control: no-store
diff --git a/content/test/gpu/gpu_tests/context_lost_expectations.py b/content/test/gpu/gpu_tests/context_lost_expectations.py
index 5eb4122..b2aaa0a 100644
--- a/content/test/gpu/gpu_tests/context_lost_expectations.py
+++ b/content/test/gpu/gpu_tests/context_lost_expectations.py
@@ -38,3 +38,10 @@
               ['android'], bug=609629)
     self.Fail('ContextLost.WebGLContextLostInHiddenTab',
               ['android'], bug=609629)
+
+    # Nexus 6
+    # The Nexus 6 times out on these tests while waiting for the JS to complete
+    self.Fail('ContextLost.WebGLContextLostFromLoseContextExtension',
+              ['android', ('qualcomm', 'Adreno (TM) 420')], bug=611906)
+    self.Fail('ContextLost.WebGLContextLostFromQuantity',
+              ['android', ('qualcomm', 'Adreno (TM) 420')], bug=611906)
diff --git a/content/test/gpu/gpu_tests/gpu_process_expectations.py b/content/test/gpu/gpu_tests/gpu_process_expectations.py
index eca14cb..97375eb4 100644
--- a/content/test/gpu/gpu_tests/gpu_process_expectations.py
+++ b/content/test/gpu/gpu_tests/gpu_process_expectations.py
@@ -13,40 +13,29 @@
 
     self.Fail('GpuProcess.video', ['linux'], bug=257109)
 
-    # Nexus 5X
+    # Android
     self.Fail('GpuProcess.no_gpu_process',
-              ['android', ('qualcomm', 'Adreno (TM) 418')], bug=610951)
+              ['android'], bug=611930)
+    self.Fail('GpuProcess.identify_active_gpu1',
+              ['android'], bug=611930)
+    self.Fail('GpuProcess.identify_active_gpu2',
+              ['android'], bug=611930)
+    self.Fail('GpuProcess.identify_active_gpu3',
+              ['android'], bug=611930)
+    self.Fail('GpuProcess.identify_active_gpu4',
+              ['android'], bug=611930)
+    self.Fail('GpuProcess.readback_webgl_gpu_process',
+              ['android'], bug=611930)
+    self.Fail('GpuProcess.driver_bug_workarounds_upon_gl_renderer',
+              ['android'], bug=611930)
+
+    # Nexus 5X
     # Skip this test because expecting it to fail will still run it.
     self.Skip('GpuProcess.skip_gpu_process',
               ['android', ('qualcomm', 'Adreno (TM) 418')], bug=610951)
-    self.Fail('GpuProcess.identify_active_gpu1',
-              ['android', ('qualcomm', 'Adreno (TM) 418')], bug=610951)
-    self.Fail('GpuProcess.identify_active_gpu2',
-              ['android', ('qualcomm', 'Adreno (TM) 418')], bug=610951)
-    self.Fail('GpuProcess.identify_active_gpu3',
-              ['android', ('qualcomm', 'Adreno (TM) 418')], bug=610951)
-    self.Fail('GpuProcess.identify_active_gpu4',
-              ['android', ('qualcomm', 'Adreno (TM) 418')], bug=610951)
-    self.Fail('GpuProcess.readback_webgl_gpu_process',
-              ['android', ('qualcomm', 'Adreno (TM) 418')], bug=610951)
-    self.Fail('GpuProcess.driver_bug_workarounds_upon_gl_renderer',
-              ['android', ('qualcomm', 'Adreno (TM) 418')], bug=610951)
 
     # Nexus 9
-    self.Fail('GpuProcess.no_gpu_process',
-              ['android', 'nvidia'], bug=610023)
     # Skip this test because expecting it to fail will still run it.
     self.Skip('GpuProcess.skip_gpu_process',
               ['android', 'nvidia'], bug=610023)
-    self.Fail('GpuProcess.identify_active_gpu1',
-              ['android', 'nvidia'], bug=610023)
-    self.Fail('GpuProcess.identify_active_gpu2',
-              ['android', 'nvidia'], bug=610023)
-    self.Fail('GpuProcess.identify_active_gpu3',
-              ['android', 'nvidia'], bug=610023)
-    self.Fail('GpuProcess.identify_active_gpu4',
-              ['android', 'nvidia'], bug=610023)
-    self.Fail('GpuProcess.readback_webgl_gpu_process',
-              ['android', 'nvidia'], bug=610023)
-    self.Fail('GpuProcess.driver_bug_workarounds_upon_gl_renderer',
-              ['android', 'nvidia'], bug=610023)
+
diff --git a/content/test/gpu/gpu_tests/maps_expectations.py b/content/test/gpu/gpu_tests/maps_expectations.py
index afe2ef9..2960d3c 100644
--- a/content/test/gpu/gpu_tests/maps_expectations.py
+++ b/content/test/gpu/gpu_tests/maps_expectations.py
@@ -12,11 +12,6 @@
     # self.Fail('Maps.maps_001',
     #     ['mac', 'amd', ('nvidia', 0x1234)], bug=123)
 
-    # Nexus 5X
+    # Android
     self.Fail('Maps.maps_002',
-              ['android', ('qualcomm', 'Adreno (TM) 418')], bug=610951)
-
-    # Nexus 9
-    self.Fail('Maps.maps_002',
-          ['android', 'nvidia'], bug=610034)
-
+              ['android'], bug=611932)
diff --git a/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py b/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py
index 3f1ff0d4..f41aeeb 100644
--- a/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py
+++ b/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py
@@ -88,15 +88,6 @@
     # Failing because the tests are using invalid combinations of source and
     # destination formats, see https://github.com/KhronosGroup/WebGL/issues/1628
     self.Fail('conformance2/textures/webgl_canvas/' +
-        'tex-2d-r8-red-unsigned_byte.html',
-        ['d3d9', 'd3d11', 'opengl'], bug=483282)
-    self.Fail('conformance2/textures/webgl_canvas/' +
-        'tex-2d-rg8-rg-unsigned_byte.html',
-        ['d3d9', 'd3d11', 'opengl'], bug=483282)
-    self.Fail('conformance2/textures/webgl_canvas/' +
-        'tex-2d-rgb8-rgb-unsigned_byte.html',
-        ['d3d9', 'd3d11', 'opengl'], bug=483282)
-    self.Fail('conformance2/textures/webgl_canvas/' +
         'tex-2d-rgb565-rgb-unsigned_byte.html',
         ['d3d9', 'd3d11', 'opengl'], bug=483282)
     self.Fail('conformance2/textures/webgl_canvas/' +
@@ -117,21 +108,10 @@
 
     # Windows only.
 
-    self.Fail('deqp/functional/gles3/negativefragmentapi.html',
-        ['win'], bug=483282)
     self.Fail('deqp/functional/gles3/vertexarrays.html',
         ['win'], bug=483282)
 
     self.Fail('conformance2/textures/canvas/' +
-        'tex-2d-r8-red-unsigned_byte.html',
-        ['win'], bug=483282)
-    self.Fail('conformance2/textures/canvas/' +
-        'tex-2d-rg8-rg-unsigned_byte.html',
-        ['win'], bug=483282)
-    self.Fail('conformance2/textures/canvas/' +
-        'tex-2d-rgb8-rgb-unsigned_byte.html',
-        ['win'], bug=483282)
-    self.Fail('conformance2/textures/canvas/' +
         'tex-2d-rgb565-rgb-unsigned_byte.html',
         ['win'], bug=483282)
     self.Fail('conformance2/textures/canvas/' +
@@ -161,8 +141,6 @@
         ['win'], bug=483282)
     self.Skip('conformance2/transform_feedback/transform_feedback.html',
         ['win'], bug=483282)
-    self.Fail('conformance2/glsl3/const-array-init.html',
-        ['win'], bug=1198) # angle bug ID
     self.Skip('conformance2/reading/read-pixels-into-pixel-pack-buffer.html',
         ['win'], bug=1266) # angle bug ID
     self.Fail('conformance2/state/gl-object-get-calls.html',
@@ -418,6 +396,8 @@
         ['linux'], bug=483282)
     self.Fail('conformance2/rendering/draw-buffers.html',
         ['linux'], bug=483282)
+    self.Fail('deqp/functional/gles3/texturefiltering/cube_sizes_00.html',
+        ['linux'], bug=606021)
 
     self.Skip('deqp/data/gles3/shaders/qualification_order.html',
         ['linux', 'amd', 'intel'], bug=483282)
@@ -427,26 +407,24 @@
     # Linux NVIDIA only.
     self.Fail('conformance2/glsl3/array-complex-indexing.html',
         ['linux', 'nvidia'], bug=606498)
-    self.Fail('deqp/functional/gles3/fbostatequery.html',
-        ['linux', 'nvidia'], bug=483282)
-    self.Fail('deqp/functional/gles3/shaderswitch.html',
-        ['linux', 'nvidia'], bug=605646)
-    self.Fail('deqp/functional/gles3/texturefiltering/cube_sizes_00.html',
-        ['linux', 'nvidia'], bug=606021)
     self.Fail('deqp/functional/gles3/vertexarrays.html',
         ['linux', 'nvidia', 'debug'], bug=483282)
 
     # Linux NVIDIA with ANGLE only
     self.Fail('deqp/functional/gles3/buffercopy.html',
         ['linux', 'nvidia', 'opengl'], bug=483282)
+    self.Fail('deqp/functional/gles3/bufferobjectquery.html',
+        ['linux', 'nvidia', 'opengl'], bug=483282)
     self.Fail('conformance2/buffers/bound-buffer-size-change-test.html',
         ['linux', 'nvidia', 'opengl'], bug=483282)
+    self.Fail('conformance2/buffers/buffer-copying-contents.html',
+        ['linux', 'nvidia', 'opengl'], bug=483282)
     self.Fail('conformance2/reading/read-pixels-pack-parameters.html',
         ['linux', 'nvidia', 'opengl'], bug=483282)
+    self.Fail('conformance2/transform_feedback/transform_feedback.html',
+        ['linux', 'nvidia', 'opengl'], bug=483282)
 
     # Linux Intel with ANGLE only
-    self.Fail('deqp/functional/gles3/texturefiltering/cube_sizes_00.html',
-        ['linux', 'intel', 'opengl'], bug=606021)
     self.Fail('deqp/functional/gles3/pixelbufferobject.html',
         ['linux', 'intel', 'opengl'], bug=483282)
 
@@ -486,6 +464,8 @@
         ['linux', 'amd'], bug=295792)
     self.Fail('conformance2/textures/misc/tex-mipmap-levels.html',
         ['linux', 'amd'], bug=483282)
+    self.Fail('conformance2/textures/misc/tex-unpack-params.html',
+        ['linux', 'amd', 'no_angle'], bug=483282)
 
     # Conflicting expectations to test that the
     # "Expectations Have No collisions" unittest works.
diff --git a/content/test/gpu/gpu_tests/webgl_conformance_expectations.py b/content/test/gpu/gpu_tests/webgl_conformance_expectations.py
index 1b59953..a48a8f97 100644
--- a/content/test/gpu/gpu_tests/webgl_conformance_expectations.py
+++ b/content/test/gpu/gpu_tests/webgl_conformance_expectations.py
@@ -86,6 +86,30 @@
     # Nexus 5
     self.Fail('WebglExtension.OES_texture_float_linear',
               ['android', ('qualcomm', 'Adreno (TM) 330')])
+    self.Fail('conformance/extensions/angle-instanced-arrays.html',
+              ['android', ('qualcomm', 'Adreno (TM) 330')], bug=611943)
+    self.Fail('conformance/extensions/ext-texture-filter-anisotropic.html',
+              ['android', ('qualcomm', 'Adreno (TM) 330')], bug=611943)
+    self.Fail('conformance/extensions/oes-texture-half-float.html',
+              ['android', ('qualcomm', 'Adreno (TM) 330')], bug=611943)
+    self.Fail('conformance/extensions/oes-texture-half-float-with-canvas.html',
+              ['android', ('qualcomm', 'Adreno (TM) 330')], bug=611943)
+    self.Fail('conformance/extensions/webgl-compressed-texture-atc.html',
+              ['android', ('qualcomm', 'Adreno (TM) 330')], bug=611943)
+    self.Fail('conformance/glsl/bugs/' +
+              'array-of-struct-with-int-first-position.html',
+              ['android', ('qualcomm', 'Adreno (TM) 330')], bug=611943)
+    self.Fail('conformance/glsl/bugs/gl-fragcoord-multisampling-bug.html',
+              ['android', ('qualcomm', 'Adreno (TM) 330')], bug=611943)
+    self.Fail('conformance/glsl/bugs/sampler-struct-function-arg.html',
+              ['android', ('qualcomm', 'Adreno (TM) 330')], bug=611943)
+    self.Fail('conformance/glsl/matrices/glsl-mat4-to-mat3.html',
+              ['android', ('qualcomm', 'Adreno (TM) 330')], bug=611943)
+    self.Fail('conformance/glsl/misc/shader-struct-scope.html',
+              ['android', ('qualcomm', 'Adreno (TM) 330')], bug=611943)
+    self.Fail('conformance/glsl/misc/' +
+              'shader-with-vec4-vec3-vec4-conditional.html',
+              ['android', ('qualcomm', 'Adreno (TM) 330')], bug=611943)
 
     # Nexus 5X
     self.Fail('conformance/extensions/oes-texture-float-with-image-data.html',
@@ -160,10 +184,69 @@
               'tex-2d-rgb-rgb-unsigned_byte.html',
               ['android', 'android-content-shell',
                ('qualcomm', 'Adreno (TM) 418')], bug=610951)
+    self.Fail('conformance/textures/video/' +
+              'tex-2d-rgb-rgb-unsigned_short_5_6_5.html',
+              ['android', 'android-content-shell',
+               ('qualcomm', 'Adreno (TM) 418')], bug=610951)
+    self.Fail('conformance/textures/video/tex-2d-rgba-rgba-unsigned_byte.html',
+              ['android', 'android-content-shell',
+               ('qualcomm', 'Adreno (TM) 418')], bug=610951)
+    self.Fail('conformance/textures/video/' +
+              'tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html',
+              ['android', 'android-content-shell',
+               ('qualcomm', 'Adreno (TM) 418')], bug=610951)
+    self.Fail('conformance/textures/video/' +
+              'tex-2d-rgba-rgba-unsigned_short_5_5_5_1.html',
+              ['android', 'android-content-shell',
+               ('qualcomm', 'Adreno (TM) 418')], bug=610951)
+    self.Fail('conformance/textures/webgl_canvas/' +
+              'tex-2d-rgb-rgb-unsigned_byte.html',
+              ['android', ('qualcomm', 'Adreno (TM) 418')], bug=610951)
+    self.Fail('conformance/textures/webgl_canvas/' +
+              'tex-2d-rgb-rgb-unsigned_short_5_6_5.html',
+              ['android', ('qualcomm', 'Adreno (TM) 418')], bug=610951)
+    self.Fail('conformance/textures/webgl_canvas/' +
+              'tex-2d-rgba-rgba-unsigned_byte.html',
+              ['android', ('qualcomm', 'Adreno (TM) 418')], bug=610951)
+    self.Fail('conformance/textures/webgl_canvas/' +
+              'tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html',
+              ['android', ('qualcomm', 'Adreno (TM) 418')], bug=610951)
+    self.Fail('conformance/textures/webgl_canvas/' +
+              'tex-2d-rgba-rgba-unsigned_short_5_5_5_1.html',
+              ['android', ('qualcomm', 'Adreno (TM) 418')], bug=610951)
+    self.Fail('conformance/textures/image_bitmap_from_image_data/' +
+              'tex-2d-rgb-rgb-unsigned_byte.html',
+              ['android', ('qualcomm', 'Adreno (TM) 418')], bug=610951)
+    self.Fail('conformance/textures/image_bitmap_from_image_data/' +
+              'tex-2d-rgb-rgb-unsigned_short_5_6_5.html',
+              ['android', ('qualcomm', 'Adreno (TM) 418')], bug=610951)
 
     # Nexus 6
     self.Fail('WebglExtension.EXT_sRGB',
               ['android', ('qualcomm', 'Adreno (TM) 420')])
+    self.Fail('conformance/context/context-size-change.html',
+              ['android', ('qualcomm', 'Adreno (TM) 420')], bug=611945)
+    self.Fail('conformance/extensions/oes-texture-half-float.html',
+              ['android', ('qualcomm', 'Adreno (TM) 420')], bug=611945)
+    self.Fail('conformance/extensions/oes-texture-half-float-with-canvas.html',
+              ['android', ('qualcomm', 'Adreno (TM) 420')], bug=611945)
+    self.Fail('conformance/extensions/' +
+              'oes-texture-half-float-with-image-data.html',
+              ['android', ('qualcomm', 'Adreno (TM) 420')], bug=611945)
+    self.Fail('conformance/extensions/oes-texture-half-float-with-image.html',
+              ['android', ('qualcomm', 'Adreno (TM) 420')], bug=611945)
+    self.Fail('conformance/extensions/oes-texture-half-float-with-video.html',
+              ['android', ('qualcomm', 'Adreno (TM) 420')], bug=611945)
+    self.Fail('conformance/extensions/webgl-compressed-texture-atc.html',
+              ['android', ('qualcomm', 'Adreno (TM) 420')], bug=611945)
+    self.Fail('conformance/glsl/bugs/gl-fragcoord-multisampling-bug.html',
+              ['android', ('qualcomm', 'Adreno (TM) 420')], bug=611945)
+    self.Fail('conformance/glsl/bugs/qualcomm-crash.html',
+              ['android', ('qualcomm', 'Adreno (TM) 420')], bug=611945)
+    self.Fail('conformance/glsl/bugs/sampler-struct-function-arg.html',
+              ['android', ('qualcomm', 'Adreno (TM) 420')], bug=611945)
+    self.Fail('conformance/glsl/misc/shader-struct-scope.html',
+              ['android', ('qualcomm', 'Adreno (TM) 420')], bug=611945)
 
     # Nexus 9
     self.Fail('WebglExtension.WEBGL_compressed_texture_atc',
diff --git a/device/bluetooth/bluez/bluetooth_gatt_bluez_unittest.cc b/device/bluetooth/bluez/bluetooth_gatt_bluez_unittest.cc
index e2cc16a2..ce7087e 100644
--- a/device/bluetooth/bluez/bluetooth_gatt_bluez_unittest.cc
+++ b/device/bluetooth/bluez/bluetooth_gatt_bluez_unittest.cc
@@ -450,7 +450,6 @@
   // value changed signals. Service changed should be fired once for
   // descriptor added.
   EXPECT_EQ(0, observer.gatt_service_changed_count());
-  EXPECT_EQ(1, observer.gatt_discovery_complete_count());
   EXPECT_EQ(3, observer.gatt_characteristic_added_count());
   EXPECT_EQ(0, observer.gatt_characteristic_removed_count());
   EXPECT_EQ(0, observer.gatt_characteristic_value_changed_count());
@@ -471,7 +470,6 @@
   fake_bluetooth_gatt_characteristic_client_->ExposeHeartRateCharacteristics(
       fake_bluetooth_gatt_service_client_->GetHeartRateServicePath());
   EXPECT_EQ(0, observer.gatt_service_changed_count());
-  EXPECT_EQ(1, observer.gatt_discovery_complete_count());
   EXPECT_EQ(6, observer.gatt_characteristic_added_count());
   EXPECT_EQ(3, observer.gatt_characteristic_removed_count());
   EXPECT_EQ(0, observer.gatt_characteristic_value_changed_count());
@@ -927,14 +925,12 @@
       device->GetGattService(observer.last_gatt_service_id());
 
   EXPECT_EQ(0, observer.gatt_service_changed_count());
-  EXPECT_EQ(0, observer.gatt_discovery_complete_count());
   EXPECT_EQ(0, observer.gatt_descriptor_value_changed_count());
   EXPECT_TRUE(service->GetCharacteristics().empty());
 
   // Run the message loop so that the characteristics appear.
   base::MessageLoop::current()->Run();
   EXPECT_EQ(0, observer.gatt_service_changed_count());
-  EXPECT_EQ(1, observer.gatt_discovery_complete_count());
 
   // Only the Heart Rate Measurement characteristic has a descriptor.
   BluetoothRemoteGattCharacteristic* characteristic =
diff --git a/device/bluetooth/bluez/bluetooth_remote_gatt_service_bluez.cc b/device/bluetooth/bluez/bluetooth_remote_gatt_service_bluez.cc
index d409a34..6031388 100644
--- a/device/bluetooth/bluez/bluetooth_remote_gatt_service_bluez.cc
+++ b/device/bluetooth/bluez/bluetooth_remote_gatt_service_bluez.cc
@@ -165,19 +165,7 @@
           ->GetProperties(object_path);
   DCHECK(properties);
 
-  if (property_name != properties->characteristics.name()) {
-    NotifyServiceChanged();
-    return;
-  }
-
-  if (discovery_complete_)
-    return;
-
-  VLOG(1) << "All characteristics were discovered for service: "
-          << object_path.value();
-  discovery_complete_ = true;
-  DCHECK(GetAdapter());
-  GetAdapter()->NotifyGattDiscoveryComplete(this);
+  NotifyServiceChanged();
 }
 
 void BluetoothRemoteGattServiceBlueZ::GattCharacteristicAdded(
diff --git a/device/bluetooth/dbus/bluetooth_gatt_application_service_provider_impl.cc b/device/bluetooth/dbus/bluetooth_gatt_application_service_provider_impl.cc
index 873ea320..6c7909e 100644
--- a/device/bluetooth/dbus/bluetooth_gatt_application_service_provider_impl.cc
+++ b/device/bluetooth/dbus/bluetooth_gatt_application_service_provider_impl.cc
@@ -86,28 +86,10 @@
   // Key: Interface name. [ {s ]
   interface_dict_writer.AppendString(attribute_interface);
   // Value: Open a array for properties_list. [ a{sv}} ]
-  WriteAttributeProperties(&interface_dict_writer, attribute_provider);
+  attribute_provider->WriteProperties(&interface_dict_writer);
   writer->CloseContainer(&interface_dict_writer);
 }
 
-void BluetoothGattApplicationServiceProviderImpl::WriteAttributeProperties(
-    dbus::MessageWriter* writer,
-    BluetoothGattServiceServiceProvider* service_provider) {
-  service_provider->WriteProperties(writer);
-}
-
-void BluetoothGattApplicationServiceProviderImpl::WriteAttributeProperties(
-    dbus::MessageWriter* writer,
-    BluetoothGattCharacteristicServiceProvider* characteristic_provider) {
-  characteristic_provider->WriteProperties(writer, nullptr);
-}
-
-void BluetoothGattApplicationServiceProviderImpl::WriteAttributeProperties(
-    dbus::MessageWriter* writer,
-    BluetoothGattDescriptorServiceProvider* descriptor_provider) {
-  descriptor_provider->WriteProperties(writer, nullptr);
-}
-
 void BluetoothGattApplicationServiceProviderImpl::GetManagedObjects(
     dbus::MethodCall* method_call,
     dbus::ExportedObject::ResponseSender response_sender) {
diff --git a/device/bluetooth/dbus/bluetooth_gatt_characteristic_client.cc b/device/bluetooth/dbus/bluetooth_gatt_characteristic_client.cc
index afc31ea..0002ddb 100644
--- a/device/bluetooth/dbus/bluetooth_gatt_characteristic_client.cc
+++ b/device/bluetooth/dbus/bluetooth_gatt_characteristic_client.cc
@@ -16,13 +16,6 @@
 
 namespace bluez {
 
-namespace {
-
-// TODO(armansito): Move this constant to cros_system_api.
-const char kValueProperty[] = "Value";
-
-}  // namespace
-
 // static
 const char BluetoothGattCharacteristicClient::kNoResponseError[] =
     "org.chromium.Error.NoResponse";
@@ -37,12 +30,10 @@
     : dbus::PropertySet(object_proxy, interface_name, callback) {
   RegisterProperty(bluetooth_gatt_characteristic::kUUIDProperty, &uuid);
   RegisterProperty(bluetooth_gatt_characteristic::kServiceProperty, &service);
-  RegisterProperty(kValueProperty, &value);
+  RegisterProperty(bluetooth_gatt_characteristic::kValueProperty, &value);
   RegisterProperty(bluetooth_gatt_characteristic::kNotifyingProperty,
                    &notifying);
   RegisterProperty(bluetooth_gatt_characteristic::kFlagsProperty, &flags);
-  RegisterProperty(bluetooth_gatt_characteristic::kDescriptorsProperty,
-                   &descriptors);
 }
 
 BluetoothGattCharacteristicClient::Properties::~Properties() {}
diff --git a/device/bluetooth/dbus/bluetooth_gatt_characteristic_client.h b/device/bluetooth/dbus/bluetooth_gatt_characteristic_client.h
index fe0a9f7..85851c3 100644
--- a/device/bluetooth/dbus/bluetooth_gatt_characteristic_client.h
+++ b/device/bluetooth/dbus/bluetooth_gatt_characteristic_client.h
@@ -47,10 +47,6 @@
     // descriptor bit field. [read-only, optional]
     dbus::Property<std::vector<std::string>> flags;
 
-    // Array of object paths representing the descriptors of this
-    // characteristic. [read-only]
-    dbus::Property<std::vector<dbus::ObjectPath>> descriptors;
-
     Properties(dbus::ObjectProxy* object_proxy,
                const std::string& interface_name,
                const PropertyChangedCallback& callback);
diff --git a/device/bluetooth/dbus/bluetooth_gatt_characteristic_service_provider.h b/device/bluetooth/dbus/bluetooth_gatt_characteristic_service_provider.h
index af46228..041467e 100644
--- a/device/bluetooth/dbus/bluetooth_gatt_characteristic_service_provider.h
+++ b/device/bluetooth/dbus/bluetooth_gatt_characteristic_service_provider.h
@@ -43,8 +43,7 @@
   // Writes the characteristics's properties into the provided writer. If
   // value is not null, it is written also, otherwise no value property is
   // written.
-  virtual void WriteProperties(dbus::MessageWriter* writer,
-                               const std::vector<uint8_t>* value) {}
+  virtual void WriteProperties(dbus::MessageWriter* writer) {}
 
   virtual const dbus::ObjectPath& object_path() const = 0;
 
diff --git a/device/bluetooth/dbus/bluetooth_gatt_characteristic_service_provider_impl.cc b/device/bluetooth/dbus/bluetooth_gatt_characteristic_service_provider_impl.cc
index 587705b..3b3a44b 100644
--- a/device/bluetooth/dbus/bluetooth_gatt_characteristic_service_provider_impl.cc
+++ b/device/bluetooth/dbus/bluetooth_gatt_characteristic_service_provider_impl.cc
@@ -182,19 +182,6 @@
     return;
   }
 
-  // If getting the "Value" property, obtain the value from the delegate.
-  if (property_name == bluetooth_gatt_characteristic::kValueProperty) {
-    DCHECK(delegate_);
-    delegate_->GetValue(
-        base::Bind(&BluetoothGattCharacteristicServiceProviderImpl::OnGet,
-                   weak_ptr_factory_.GetWeakPtr(), method_call,
-                   response_sender),
-        base::Bind(&BluetoothGattCharacteristicServiceProviderImpl::OnFailure,
-                   weak_ptr_factory_.GetWeakPtr(), method_call,
-                   response_sender));
-    return;
-  }
-
   std::unique_ptr<dbus::Response> response =
       dbus::Response::FromMethodCall(method_call);
   dbus::MessageWriter writer(response.get());
@@ -224,75 +211,15 @@
 void BluetoothGattCharacteristicServiceProviderImpl::Set(
     dbus::MethodCall* method_call,
     dbus::ExportedObject::ResponseSender response_sender) {
-  VLOG(2) << "BluetoothGattCharacteristicServiceProvider::Set: "
+  VLOG(2) << "BluetoothGattCharacteristicServiceProviderImpl::Set: "
           << object_path_.value();
   DCHECK(OnOriginThread());
-
-  dbus::MessageReader reader(method_call);
-
-  std::string interface_name;
-  std::string property_name;
-  dbus::MessageReader variant_reader(NULL);
-  if (!reader.PopString(&interface_name) || !reader.PopString(&property_name) ||
-      !reader.PopVariant(&variant_reader) || reader.HasMoreData()) {
-    std::unique_ptr<dbus::ErrorResponse> error_response =
-        dbus::ErrorResponse::FromMethodCall(method_call, kErrorInvalidArgs,
-                                            "Expected 'ssv'.");
-    response_sender.Run(std::move(error_response));
-    return;
-  }
-
-  // Only the GATT characteristic interface is allowed.
-  if (interface_name !=
-      bluetooth_gatt_characteristic::kBluetoothGattCharacteristicInterface) {
-    std::unique_ptr<dbus::ErrorResponse> error_response =
-        dbus::ErrorResponse::FromMethodCall(
-            method_call, kErrorInvalidArgs,
-            "No such interface: '" + interface_name + "'.");
-    response_sender.Run(std::move(error_response));
-    return;
-  }
-
-  // Only the "Value" property is writeable.
-  if (property_name != bluetooth_gatt_characteristic::kValueProperty) {
-    std::string error_name;
-    std::string error_message;
-    if (property_name == bluetooth_gatt_characteristic::kUUIDProperty ||
-        property_name == bluetooth_gatt_characteristic::kServiceProperty) {
-      error_name = kErrorPropertyReadOnly;
-      error_message = "Read-only property: '" + property_name + "'.";
-    } else {
-      error_name = kErrorInvalidArgs;
-      error_message = "No such property: '" + property_name + "'.";
-    }
-    std::unique_ptr<dbus::ErrorResponse> error_response =
-        dbus::ErrorResponse::FromMethodCall(method_call, error_name,
-                                            error_message);
-    response_sender.Run(std::move(error_response));
-    return;
-  }
-
-  // Obtain the value.
-  const uint8_t* bytes = NULL;
-  size_t length = 0;
-  if (!variant_reader.PopArrayOfBytes(&bytes, &length)) {
-    std::unique_ptr<dbus::ErrorResponse> error_response =
-        dbus::ErrorResponse::FromMethodCall(
-            method_call, kErrorInvalidArgs,
-            "Property '" + property_name + "' has type 'ay'.");
-    response_sender.Run(std::move(error_response));
-    return;
-  }
-
-  // Pass the set request onto the delegate.
-  std::vector<uint8_t> value(bytes, bytes + length);
-  DCHECK(delegate_);
-  delegate_->SetValue(
-      value,
-      base::Bind(&BluetoothGattCharacteristicServiceProviderImpl::OnSet,
-                 weak_ptr_factory_.GetWeakPtr(), method_call, response_sender),
-      base::Bind(&BluetoothGattCharacteristicServiceProviderImpl::OnFailure,
-                 weak_ptr_factory_.GetWeakPtr(), method_call, response_sender));
+  // All of the properties on this interface are read-only, so just return
+  // error.
+  std::unique_ptr<dbus::ErrorResponse> error_response =
+      dbus::ErrorResponse::FromMethodCall(method_call, kErrorPropertyReadOnly,
+                                          "All properties are read-only.");
+  response_sender.Run(std::move(error_response));
 }
 
 void BluetoothGattCharacteristicServiceProviderImpl::GetAll(
@@ -324,14 +251,11 @@
     return;
   }
 
-  // Try to obtain the value from the delegate. We will construct the
-  // response in the success callback.
-  DCHECK(delegate_);
-  delegate_->GetValue(
-      base::Bind(&BluetoothGattCharacteristicServiceProviderImpl::OnGetAll,
-                 weak_ptr_factory_.GetWeakPtr(), method_call, response_sender),
-      base::Bind(&BluetoothGattCharacteristicServiceProviderImpl::OnFailure,
-                 weak_ptr_factory_.GetWeakPtr(), method_call, response_sender));
+  std::unique_ptr<dbus::Response> response =
+      dbus::Response::FromMethodCall(method_call);
+  dbus::MessageWriter writer(response.get());
+  WriteProperties(&writer);
+  response_sender.Run(std::move(response));
 }
 
 void BluetoothGattCharacteristicServiceProviderImpl::ReadValue(
@@ -403,20 +327,6 @@
                             << method_name;
 }
 
-void BluetoothGattCharacteristicServiceProviderImpl::OnGetAll(
-    dbus::MethodCall* method_call,
-    dbus::ExportedObject::ResponseSender response_sender,
-    const std::vector<uint8_t>& value) {
-  VLOG(2) << "Characteristic value obtained from delegate. Responding to "
-          << "GetAll.";
-
-  std::unique_ptr<dbus::Response> response =
-      dbus::Response::FromMethodCall(method_call);
-  dbus::MessageWriter writer(response.get());
-  WriteProperties(&writer, &value);
-  response_sender.Run(std::move(response));
-}
-
 void BluetoothGattCharacteristicServiceProviderImpl::OnReadValue(
     dbus::MethodCall* method_call,
     dbus::ExportedObject::ResponseSender response_sender,
@@ -442,8 +352,7 @@
 }
 
 void BluetoothGattCharacteristicServiceProviderImpl::WriteProperties(
-    dbus::MessageWriter* writer,
-    const std::vector<uint8_t>* value) {
+    dbus::MessageWriter* writer) {
   dbus::MessageWriter array_writer(NULL);
   dbus::MessageWriter dict_entry_writer(NULL);
   dbus::MessageWriter variant_writer(NULL);
@@ -463,17 +372,6 @@
   dict_entry_writer.AppendVariantOfObjectPath(service_path_);
   array_writer.CloseContainer(&dict_entry_writer);
 
-  if (value) {
-    // Value:
-    array_writer.OpenDictEntry(&dict_entry_writer);
-    dict_entry_writer.AppendString(
-        bluetooth_gatt_characteristic::kValueProperty);
-    dict_entry_writer.OpenVariant("ay", &variant_writer);
-    variant_writer.AppendArrayOfBytes(value->data(), value->size());
-    dict_entry_writer.CloseContainer(&variant_writer);
-    array_writer.CloseContainer(&dict_entry_writer);
-  }
-
   // Flags:
   array_writer.OpenDictEntry(&dict_entry_writer);
   dict_entry_writer.AppendString(bluetooth_gatt_characteristic::kFlagsProperty);
@@ -485,30 +383,6 @@
   writer->CloseContainer(&array_writer);
 }
 
-void BluetoothGattCharacteristicServiceProviderImpl::OnGet(
-    dbus::MethodCall* method_call,
-    dbus::ExportedObject::ResponseSender response_sender,
-    const std::vector<uint8_t>& value) {
-  VLOG(2) << "Returning characteristic value obtained from delegate.";
-  std::unique_ptr<dbus::Response> response =
-      dbus::Response::FromMethodCall(method_call);
-  dbus::MessageWriter writer(response.get());
-  dbus::MessageWriter variant_writer(NULL);
-
-  writer.OpenVariant("ay", &variant_writer);
-  variant_writer.AppendArrayOfBytes(value.data(), value.size());
-  writer.CloseContainer(&variant_writer);
-
-  response_sender.Run(std::move(response));
-}
-
-void BluetoothGattCharacteristicServiceProviderImpl::OnSet(
-    dbus::MethodCall* method_call,
-    dbus::ExportedObject::ResponseSender response_sender) {
-  VLOG(2) << "Successfully set characteristic value. Return success.";
-  response_sender.Run(dbus::Response::FromMethodCall(method_call));
-}
-
 void BluetoothGattCharacteristicServiceProviderImpl::OnFailure(
     dbus::MethodCall* method_call,
     dbus::ExportedObject::ResponseSender response_sender) {
diff --git a/device/bluetooth/dbus/bluetooth_gatt_characteristic_service_provider_impl.h b/device/bluetooth/dbus/bluetooth_gatt_characteristic_service_provider_impl.h
index 608b515a..b9308760 100644
--- a/device/bluetooth/dbus/bluetooth_gatt_characteristic_service_provider_impl.h
+++ b/device/bluetooth/dbus/bluetooth_gatt_characteristic_service_provider_impl.h
@@ -93,19 +93,7 @@
                 const std::vector<uint8_t>& value);
 
   // Writes an array of the service's properties into the provided writer.
-  void WriteProperties(dbus::MessageWriter* writer,
-                       const std::vector<uint8_t>* value) override;
-
-  // Called by the Delegate in response to a successful method call to get the
-  // characteristic value.
-  void OnGet(dbus::MethodCall* method_call,
-             dbus::ExportedObject::ResponseSender response_sender,
-             const std::vector<uint8_t>& value);
-
-  // Called by the Delegate in response to a successful method call to set the
-  // characteristic value.
-  void OnSet(dbus::MethodCall* method_call,
-             dbus::ExportedObject::ResponseSender response_sender);
+  void WriteProperties(dbus::MessageWriter* writer) override;
 
   // Called by the Delegate in response to a method to call to read the value
   // of this characteristic.
diff --git a/device/bluetooth/dbus/bluetooth_gatt_descriptor_service_provider.h b/device/bluetooth/dbus/bluetooth_gatt_descriptor_service_provider.h
index 6c5b582..98bc7f1c 100644
--- a/device/bluetooth/dbus/bluetooth_gatt_descriptor_service_provider.h
+++ b/device/bluetooth/dbus/bluetooth_gatt_descriptor_service_provider.h
@@ -43,8 +43,7 @@
   // Writes the descriptor's properties into the provided writer. If
   // value is not null, it is written also, otherwise no value property is
   // written.
-  virtual void WriteProperties(dbus::MessageWriter* writer,
-                               const std::vector<uint8_t>* value) {}
+  virtual void WriteProperties(dbus::MessageWriter* writer) {}
 
   virtual const dbus::ObjectPath& object_path() const = 0;
 
diff --git a/device/bluetooth/dbus/bluetooth_gatt_descriptor_service_provider_impl.cc b/device/bluetooth/dbus/bluetooth_gatt_descriptor_service_provider_impl.cc
index f2b3de4..95a4940 100644
--- a/device/bluetooth/dbus/bluetooth_gatt_descriptor_service_provider_impl.cc
+++ b/device/bluetooth/dbus/bluetooth_gatt_descriptor_service_provider_impl.cc
@@ -150,19 +150,6 @@
     return;
   }
 
-  // If getting the "Value" property, obtain the value from the delegate.
-  if (property_name == bluetooth_gatt_descriptor::kValueProperty) {
-    DCHECK(delegate_);
-    delegate_->GetValue(
-        base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnGet,
-                   weak_ptr_factory_.GetWeakPtr(), method_call,
-                   response_sender),
-        base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnFailure,
-                   weak_ptr_factory_.GetWeakPtr(), method_call,
-                   response_sender));
-    return;
-  }
-
   std::unique_ptr<dbus::Response> response =
       dbus::Response::FromMethodCall(method_call);
   dbus::MessageWriter writer(response.get());
@@ -193,75 +180,15 @@
 void BluetoothGattDescriptorServiceProviderImpl::Set(
     dbus::MethodCall* method_call,
     dbus::ExportedObject::ResponseSender response_sender) {
-  VLOG(2) << "BluetoothGattDescriptorServiceProvider::Set: "
+  VLOG(2) << "BluetoothGattDescriptorServiceProviderImpl::Set: "
           << object_path_.value();
   DCHECK(OnOriginThread());
-
-  dbus::MessageReader reader(method_call);
-
-  std::string interface_name;
-  std::string property_name;
-  dbus::MessageReader variant_reader(NULL);
-  if (!reader.PopString(&interface_name) || !reader.PopString(&property_name) ||
-      !reader.PopVariant(&variant_reader) || reader.HasMoreData()) {
-    std::unique_ptr<dbus::ErrorResponse> error_response =
-        dbus::ErrorResponse::FromMethodCall(method_call, kErrorInvalidArgs,
-                                            "Expected 'ssv'.");
-    response_sender.Run(std::move(error_response));
-    return;
-  }
-
-  // Only the GATT descriptor interface is allowed.
-  if (interface_name !=
-      bluetooth_gatt_descriptor::kBluetoothGattDescriptorInterface) {
-    std::unique_ptr<dbus::ErrorResponse> error_response =
-        dbus::ErrorResponse::FromMethodCall(
-            method_call, kErrorInvalidArgs,
-            "No such interface: '" + interface_name + "'.");
-    response_sender.Run(std::move(error_response));
-    return;
-  }
-
-  // Only the "Value" property is writeable.
-  if (property_name != bluetooth_gatt_descriptor::kValueProperty) {
-    std::string error_name;
-    std::string error_message;
-    if (property_name == bluetooth_gatt_descriptor::kUUIDProperty ||
-        property_name == bluetooth_gatt_descriptor::kCharacteristicProperty) {
-      error_name = kErrorPropertyReadOnly;
-      error_message = "Read-only property: '" + property_name + "'.";
-    } else {
-      error_name = kErrorInvalidArgs;
-      error_message = "No such property: '" + property_name + "'.";
-    }
-    std::unique_ptr<dbus::ErrorResponse> error_response =
-        dbus::ErrorResponse::FromMethodCall(method_call, error_name,
-                                            error_message);
-    response_sender.Run(std::move(error_response));
-    return;
-  }
-
-  // Obtain the value.
-  const uint8_t* bytes = NULL;
-  size_t length = 0;
-  if (!variant_reader.PopArrayOfBytes(&bytes, &length)) {
-    std::unique_ptr<dbus::ErrorResponse> error_response =
-        dbus::ErrorResponse::FromMethodCall(
-            method_call, kErrorInvalidArgs,
-            "Property '" + property_name + "' has type 'ay'.");
-    response_sender.Run(std::move(error_response));
-    return;
-  }
-
-  // Pass the set request onto the delegate.
-  std::vector<uint8_t> value(bytes, bytes + length);
-  DCHECK(delegate_);
-  delegate_->SetValue(
-      value,
-      base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnSet,
-                 weak_ptr_factory_.GetWeakPtr(), method_call, response_sender),
-      base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnFailure,
-                 weak_ptr_factory_.GetWeakPtr(), method_call, response_sender));
+  // All of the properties on this interface are read-only, so just return
+  // error.
+  std::unique_ptr<dbus::ErrorResponse> error_response =
+      dbus::ErrorResponse::FromMethodCall(method_call, kErrorPropertyReadOnly,
+                                          "All properties are read-only.");
+  response_sender.Run(std::move(error_response));
 }
 
 void BluetoothGattDescriptorServiceProviderImpl::GetAll(
@@ -293,14 +220,11 @@
     return;
   }
 
-  // Try to obtain the value from the delegate. We will construct the
-  // response in the success callback.
-  DCHECK(delegate_);
-  delegate_->GetValue(
-      base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnGetAll,
-                 weak_ptr_factory_.GetWeakPtr(), method_call, response_sender),
-      base::Bind(&BluetoothGattDescriptorServiceProviderImpl::OnFailure,
-                 weak_ptr_factory_.GetWeakPtr(), method_call, response_sender));
+  std::unique_ptr<dbus::Response> response =
+      dbus::Response::FromMethodCall(method_call);
+  dbus::MessageWriter writer(response.get());
+  WriteProperties(&writer);
+  response_sender.Run(std::move(response));
 }
 
 void BluetoothGattDescriptorServiceProviderImpl::OnExported(
@@ -311,23 +235,8 @@
                             << method_name;
 }
 
-void BluetoothGattDescriptorServiceProviderImpl::OnGetAll(
-    dbus::MethodCall* method_call,
-    dbus::ExportedObject::ResponseSender response_sender,
-    const std::vector<uint8_t>& value) {
-  VLOG(2) << "Descriptor value obtained from delegate. Responding to "
-          << "GetAll.";
-
-  std::unique_ptr<dbus::Response> response =
-      dbus::Response::FromMethodCall(method_call);
-  dbus::MessageWriter writer(response.get());
-  WriteProperties(&writer, &value);
-  response_sender.Run(std::move(response));
-}
-
 void BluetoothGattDescriptorServiceProviderImpl::WriteProperties(
-    dbus::MessageWriter* writer,
-    const std::vector<uint8_t>* value) {
+    dbus::MessageWriter* writer) {
   dbus::MessageWriter array_writer(NULL);
   dbus::MessageWriter dict_entry_writer(NULL);
   dbus::MessageWriter variant_writer(NULL);
@@ -347,16 +256,6 @@
   dict_entry_writer.AppendVariantOfObjectPath(characteristic_path_);
   array_writer.CloseContainer(&dict_entry_writer);
 
-  if (value) {
-    // Value:
-    array_writer.OpenDictEntry(&dict_entry_writer);
-    dict_entry_writer.AppendString(bluetooth_gatt_descriptor::kValueProperty);
-    dict_entry_writer.OpenVariant("ay", &variant_writer);
-    variant_writer.AppendArrayOfBytes(value->data(), value->size());
-    dict_entry_writer.CloseContainer(&variant_writer);
-    array_writer.CloseContainer(&dict_entry_writer);
-  }
-
   // Flags:
   array_writer.OpenDictEntry(&dict_entry_writer);
   dict_entry_writer.AppendString(bluetooth_gatt_descriptor::kFlagsProperty);
@@ -368,32 +267,6 @@
   writer->CloseContainer(&array_writer);
 }
 
-// Called by the Delegate in response to a successful method call to get the
-// descriptor value.
-void BluetoothGattDescriptorServiceProviderImpl::OnGet(
-    dbus::MethodCall* method_call,
-    dbus::ExportedObject::ResponseSender response_sender,
-    const std::vector<uint8_t>& value) {
-  VLOG(2) << "Returning descriptor value obtained from delegate.";
-  std::unique_ptr<dbus::Response> response =
-      dbus::Response::FromMethodCall(method_call);
-  dbus::MessageWriter writer(response.get());
-  dbus::MessageWriter variant_writer(NULL);
-
-  writer.OpenVariant("ay", &variant_writer);
-  variant_writer.AppendArrayOfBytes(value.data(), value.size());
-  writer.CloseContainer(&variant_writer);
-
-  response_sender.Run(std::move(response));
-}
-
-void BluetoothGattDescriptorServiceProviderImpl::OnSet(
-    dbus::MethodCall* method_call,
-    dbus::ExportedObject::ResponseSender response_sender) {
-  VLOG(2) << "Successfully set descriptor value. Return success.";
-  response_sender.Run(dbus::Response::FromMethodCall(method_call));
-}
-
 void BluetoothGattDescriptorServiceProviderImpl::OnFailure(
     dbus::MethodCall* method_call,
     dbus::ExportedObject::ResponseSender response_sender) {
diff --git a/device/bluetooth/dbus/bluetooth_gatt_descriptor_service_provider_impl.h b/device/bluetooth/dbus/bluetooth_gatt_descriptor_service_provider_impl.h
index 5c02e2d..ce1bc0c 100644
--- a/device/bluetooth/dbus/bluetooth_gatt_descriptor_service_provider_impl.h
+++ b/device/bluetooth/dbus/bluetooth_gatt_descriptor_service_provider_impl.h
@@ -63,29 +63,10 @@
                   const std::string& method_name,
                   bool success);
 
-  // Called by the Delegate in response to a method to call to get all
-  // properties, in which the delegate has successfully returned the
-  // descriptor value.
-  void OnGetAll(dbus::MethodCall* method_call,
-                dbus::ExportedObject::ResponseSender response_sender,
-                const std::vector<uint8_t>& value);
-
   // Writes the characteristics's properties into the provided writer. If
   // value is not null, it is written also, otherwise no value property is
   // written.
-  void WriteProperties(dbus::MessageWriter* writer,
-                       const std::vector<uint8_t>* value) override;
-
-  // Called by the Delegate in response to a successful method call to get the
-  // descriptor value.
-  void OnGet(dbus::MethodCall* method_call,
-             dbus::ExportedObject::ResponseSender response_sender,
-             const std::vector<uint8_t>& value);
-
-  // Called by the Delegate in response to a successful method call to set the
-  // descriptor value.
-  void OnSet(dbus::MethodCall* method_call,
-             dbus::ExportedObject::ResponseSender response_sender);
+  void WriteProperties(dbus::MessageWriter* writer) override;
 
   // Called by the Delegate in response to a failed method call to get or set
   // the descriptor value.
diff --git a/device/bluetooth/dbus/bluetooth_gatt_service_client.cc b/device/bluetooth/dbus/bluetooth_gatt_service_client.cc
index 469ef92..bcc0fa8c 100644
--- a/device/bluetooth/dbus/bluetooth_gatt_service_client.cc
+++ b/device/bluetooth/dbus/bluetooth_gatt_service_client.cc
@@ -23,8 +23,6 @@
   RegisterProperty(bluetooth_gatt_service::kIncludesProperty, &includes);
   RegisterProperty(bluetooth_gatt_service::kDeviceProperty, &device);
   RegisterProperty(bluetooth_gatt_service::kPrimaryProperty, &primary);
-  RegisterProperty(bluetooth_gatt_service::kCharacteristicsProperty,
-                   &characteristics);
 }
 
 BluetoothGattServiceClient::Properties::~Properties() {}
diff --git a/device/bluetooth/dbus/bluetooth_gatt_service_client.h b/device/bluetooth/dbus/bluetooth_gatt_service_client.h
index 641f505..f0dd162 100644
--- a/device/bluetooth/dbus/bluetooth_gatt_service_client.h
+++ b/device/bluetooth/dbus/bluetooth_gatt_service_client.h
@@ -32,10 +32,6 @@
     // Whether or not this service is a primary service.
     dbus::Property<bool> primary;
 
-    // Array of object paths representing the characteristics of this service.
-    // [read-only]
-    dbus::Property<std::vector<dbus::ObjectPath>> characteristics;
-
     // Array of object paths representing the included services of this service.
     // [read-only]
     dbus::Property<std::vector<dbus::ObjectPath>> includes;
diff --git a/device/bluetooth/dbus/bluetooth_gatt_service_service_provider_impl.cc b/device/bluetooth/dbus/bluetooth_gatt_service_service_provider_impl.cc
index 210dfc27..c72be59 100644
--- a/device/bluetooth/dbus/bluetooth_gatt_service_service_provider_impl.cc
+++ b/device/bluetooth/dbus/bluetooth_gatt_service_service_provider_impl.cc
@@ -138,10 +138,9 @@
 void BluetoothGattServiceServiceProviderImpl::Set(
     dbus::MethodCall* method_call,
     dbus::ExportedObject::ResponseSender response_sender) {
-  VLOG(2) << "BluetoothGattServiceServiceProvider::Set: "
+  VLOG(2) << "BluetoothGattServiceServiceProviderImpl::Set: "
           << object_path_.value();
   DCHECK(OnOriginThread());
-
   // All of the properties on this interface are read-only, so just return
   // error.
   std::unique_ptr<dbus::ErrorResponse> error_response =
diff --git a/device/bluetooth/dbus/fake_bluetooth_gatt_characteristic_client.cc b/device/bluetooth/dbus/fake_bluetooth_gatt_characteristic_client.cc
index bb746163..5953c7e8 100644
--- a/device/bluetooth/dbus/fake_bluetooth_gatt_characteristic_client.cc
+++ b/device/bluetooth/dbus/fake_bluetooth_gatt_characteristic_client.cc
@@ -387,11 +387,6 @@
           kClientCharacteristicConfigurationUUID));
   DCHECK(ccc_path.IsValid());
   heart_rate_measurement_ccc_desc_path_ = ccc_path.value();
-
-  std::vector<dbus::ObjectPath> desc_paths;
-  desc_paths.push_back(ccc_path);
-
-  heart_rate_measurement_properties_->descriptors.ReplaceValue(desc_paths);
 }
 
 void FakeBluetoothGattCharacteristicClient::HideHeartRateCharacteristics() {
diff --git a/device/bluetooth/dbus/fake_bluetooth_gatt_service_client.cc b/device/bluetooth/dbus/fake_bluetooth_gatt_service_client.cc
index 09c56e2..cc080118 100644
--- a/device/bluetooth/dbus/fake_bluetooth_gatt_service_client.cc
+++ b/device/bluetooth/dbus/fake_bluetooth_gatt_service_client.cc
@@ -177,13 +177,6 @@
               ->GetBluetoothGattCharacteristicClient());
   char_client->ExposeHeartRateCharacteristics(
       dbus::ObjectPath(heart_rate_service_path_));
-
-  std::vector<dbus::ObjectPath> char_paths;
-  char_paths.push_back(char_client->GetHeartRateMeasurementPath());
-  char_paths.push_back(char_client->GetBodySensorLocationPath());
-  char_paths.push_back(char_client->GetHeartRateControlPointPath());
-
-  heart_rate_service_properties_->characteristics.ReplaceValue(char_paths);
 }
 
 }  // namespace bluez
diff --git a/extensions/common/api/_permission_features.json b/extensions/common/api/_permission_features.json
index 2f9d159e..14fbf18 100644
--- a/extensions/common/api/_permission_features.json
+++ b/extensions/common/api/_permission_features.json
@@ -150,7 +150,8 @@
       "81986D4F846CEDDDB962643FA501D1780DD441BB",  // http://crbug.com/407693
       "89715614FAA2B4C2853802D70261D2A9D0756FC8",  // http://crbug.com/455986
       "61FF4757F9420B62B19BA5C96084649339DB31F5",  // http://crbug.com/587613
-      "F3013F58BED982D1BC75943792FF877E5D458672"   // http://crbug.com/587613
+      "F3013F58BED982D1BC75943792FF877E5D458672",  // http://crbug.com/587613
+      "2F6F6FDB84E0290ABAB7A9D7571EB344821E5F12"   // http://crbug.com/610452
     ]
   },
   "cast": {
@@ -281,7 +282,8 @@
       "4F25792AF1AA7483936DE29C07806F203C7170A0",  // http://crbug.com/407693
       "BD8781D757D830FC2E85470A1B6E8A718B7EE0D9",  // http://crbug.com/407693
       "4AC2B6C63C6480D150DFDA13E4A5956EB1D0DDBB",  // http://crbug.com/407693
-      "81986D4F846CEDDDB962643FA501D1780DD441BB"   // http://crbug.com/407693
+      "81986D4F846CEDDDB962643FA501D1780DD441BB",  // http://crbug.com/407693
+      "2F6F6FDB84E0290ABAB7A9D7571EB344821E5F12"   // http://crbug.com/610452
     ]
   },
   "power": {
diff --git a/gpu/BUILD.gn b/gpu/BUILD.gn
index 1759ef2..9e96a4a 100644
--- a/gpu/BUILD.gn
+++ b/gpu/BUILD.gn
@@ -391,6 +391,7 @@
     "//testing/perf",
     "//ui/gfx/geometry",
     "//ui/gl",
+    "//ui/gl/init",
   ]
 
   # This target should not require the Chrome executable to run.
diff --git a/gpu/command_buffer/service/BUILD.gn b/gpu/command_buffer/service/BUILD.gn
index 7dd6ea4..6a90413 100644
--- a/gpu/command_buffer/service/BUILD.gn
+++ b/gpu/command_buffer/service/BUILD.gn
@@ -155,6 +155,7 @@
     "//ui/gfx",
     "//ui/gfx/geometry",
     "//ui/gl",
+    "//ui/gl/init",
   ]
 
   if (is_mac) {
diff --git a/gpu/command_buffer/service/in_process_command_buffer.cc b/gpu/command_buffer/service/in_process_command_buffer.cc
index 5d4bb0cd..22d2468 100644
--- a/gpu/command_buffer/service/in_process_command_buffer.cc
+++ b/gpu/command_buffer/service/in_process_command_buffer.cc
@@ -44,6 +44,7 @@
 #include "ui/gl/gl_image.h"
 #include "ui/gl/gl_image_shared_memory.h"
 #include "ui/gl/gl_share_group.h"
+#include "ui/gl/init/gl_factory.h"
 
 #if defined(OS_WIN)
 #include <windows.h>
@@ -342,9 +343,9 @@
 
   if (!surface_.get()) {
     if (params.is_offscreen)
-      surface_ = gfx::GLSurface::CreateOffscreenGLSurface(params.size);
+      surface_ = gl::init::CreateOffscreenGLSurface(params.size);
     else
-      surface_ = gfx::GLSurface::CreateViewGLSurface(params.window);
+      surface_ = gl::init::CreateViewGLSurface(params.window);
   }
 
   if (!surface_.get()) {
@@ -364,7 +365,7 @@
           .use_virtualized_gl_contexts) {
     context_ = gl_share_group_->GetSharedContext();
     if (!context_.get()) {
-      context_ = gfx::GLContext::CreateGLContext(
+      context_ = gl::init::CreateGLContext(
           gl_share_group_.get(), surface_.get(), params.gpu_preference);
       gl_share_group_->SetSharedContext(context_.get());
     }
@@ -377,8 +378,8 @@
       context_ = NULL;
     }
   } else {
-    context_ = gfx::GLContext::CreateGLContext(
-        gl_share_group_.get(), surface_.get(), params.gpu_preference);
+    context_ = gl::init::CreateGLContext(gl_share_group_.get(), surface_.get(),
+                                         params.gpu_preference);
   }
 
   if (!context_.get()) {
diff --git a/gpu/command_buffer/tests/gl_manager.cc b/gpu/command_buffer/tests/gl_manager.cc
index a52e209..5ff6c8b 100644
--- a/gpu/command_buffer/tests/gl_manager.cc
+++ b/gpu/command_buffer/tests/gl_manager.cc
@@ -43,6 +43,7 @@
 #include "ui/gl/gl_image_ref_counted_memory.h"
 #include "ui/gl/gl_share_group.h"
 #include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 
 #if defined(OS_MACOSX)
 #include "ui/gfx/mac/io_surface.h"
@@ -312,7 +313,7 @@
 
   decoder_->set_engine(executor_.get());
 
-  surface_ = gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size());
+  surface_ = gl::init::CreateOffscreenGLSurface(gfx::Size());
   ASSERT_TRUE(surface_.get() != NULL) << "could not create offscreen surface";
 
   if (base_context_) {
@@ -327,9 +328,8 @@
       ASSERT_TRUE(context_->Initialize(
           surface_.get(), gfx::PreferIntegratedGpu));
     } else {
-      context_ = gfx::GLContext::CreateGLContext(share_group_.get(),
-                                                 surface_.get(),
-                                                 gpu_preference);
+      context_ = gl::init::CreateGLContext(share_group_.get(), surface_.get(),
+                                           gpu_preference);
     }
   }
   ASSERT_TRUE(context_.get() != NULL) << "could not create GL context";
@@ -392,12 +392,11 @@
           new gfx::GLShareGroup);
       gfx::Size size(4, 4);
       base_surface_ = new scoped_refptr<gfx::GLSurface>(
-          gfx::GLSurface::CreateOffscreenGLSurface(size));
+          gl::init::CreateOffscreenGLSurface(size));
       gfx::GpuPreference gpu_preference(gfx::PreferDiscreteGpu);
-      base_context_ = new scoped_refptr<gfx::GLContext>(
-          gfx::GLContext::CreateGLContext(base_share_group_->get(),
-                                          base_surface_->get(),
-                                          gpu_preference));
+      base_context_ =
+          new scoped_refptr<gfx::GLContext>(gl::init::CreateGLContext(
+              base_share_group_->get(), base_surface_->get(), gpu_preference));
     #endif
   }
   ++use_count_;
diff --git a/gpu/command_buffer/tests/gl_tests_main.cc b/gpu/command_buffer/tests/gl_tests_main.cc
index e2b93fd..0c79c11 100644
--- a/gpu/command_buffer/tests/gl_tests_main.cc
+++ b/gpu/command_buffer/tests/gl_tests_main.cc
@@ -15,7 +15,7 @@
 #include "gpu/config/gpu_info_collector.h"
 #include "gpu/config/gpu_util.h"
 #include "testing/gmock/include/gmock/gmock.h"
-#include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 
 #if defined(OS_ANDROID)
 #include "base/android/jni_android.h"
@@ -34,7 +34,7 @@
   gpu::CollectBasicGraphicsInfo(&gpu_info);
   gpu::ApplyGpuDriverBugWorkarounds(gpu_info,
                                     base::CommandLine::ForCurrentProcess());
-  gfx::GLSurface::InitializeOneOff();
+  gl::init::InitializeGLOneOff();
   ::gles2::Initialize();
   return testSuite->Run();
 }
diff --git a/gpu/command_buffer/tests/gl_unittests_android.cc b/gpu/command_buffer/tests/gl_unittests_android.cc
index 9bdd503..2767f16 100644
--- a/gpu/command_buffer/tests/gl_unittests_android.cc
+++ b/gpu/command_buffer/tests/gl_unittests_android.cc
@@ -17,6 +17,7 @@
 #include "ui/gfx/native_widget_types.h"
 #include "ui/gl/android/surface_texture.h"
 #include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 
 namespace gpu {
 
@@ -40,7 +41,7 @@
   EXPECT_TRUE(window != NULL);
 
   scoped_refptr<gfx::GLSurface> gl_surface =
-      gfx::GLSurface::CreateViewGLSurface(window);
+      gl::init::CreateViewGLSurface(window);
   EXPECT_TRUE(gl_surface.get() != NULL);
 
   gl_.SetSurface(gl_surface.get());
diff --git a/gpu/command_buffer_service.gypi b/gpu/command_buffer_service.gypi
index 895cf31b..6a86e49 100644
--- a/gpu/command_buffer_service.gypi
+++ b/gpu/command_buffer_service.gypi
@@ -22,6 +22,7 @@
     '../ui/gfx/gfx.gyp:gfx',
     '../ui/gfx/gfx.gyp:gfx_geometry',
     '../ui/gl/gl.gyp:gl',
+    '../ui/gl/init/gl_init.gyp:gl_init',
     '<(angle_path)/src/angle.gyp:commit_id',
     '<(angle_path)/src/angle.gyp:translator',
   ],
diff --git a/gpu/config/BUILD.gn b/gpu/config/BUILD.gn
index d75e143..aa6fa7ea 100644
--- a/gpu/config/BUILD.gn
+++ b/gpu/config/BUILD.gn
@@ -77,6 +77,7 @@
     "//base",
     "//third_party/re2",
     "//ui/gl",
+    "//ui/gl/init",
   ]
 
   # Prefer mesa GL headers to system headers, which cause problems on Win.
diff --git a/gpu/config/gpu_info_collector.cc b/gpu/config/gpu_info_collector.cc
index 5ecbaba..e07379c 100644
--- a/gpu/config/gpu_info_collector.cc
+++ b/gpu/config/gpu_info_collector.cc
@@ -24,12 +24,13 @@
 #include "ui/gl/gl_implementation.h"
 #include "ui/gl/gl_surface.h"
 #include "ui/gl/gl_version_info.h"
+#include "ui/gl/init/gl_factory.h"
 
 namespace {
 
 scoped_refptr<gfx::GLSurface> InitializeGLSurface() {
   scoped_refptr<gfx::GLSurface> surface(
-      gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size()));
+      gl::init::CreateOffscreenGLSurface(gfx::Size()));
   if (!surface.get()) {
     LOG(ERROR) << "gfx::GLContext::CreateOffscreenGLSurface failed";
     return NULL;
@@ -39,13 +40,10 @@
 }
 
 scoped_refptr<gfx::GLContext> InitializeGLContext(gfx::GLSurface* surface) {
-
   scoped_refptr<gfx::GLContext> context(
-      gfx::GLContext::CreateGLContext(NULL,
-                                      surface,
-                                      gfx::PreferIntegratedGpu));
+      gl::init::CreateGLContext(nullptr, surface, gfx::PreferIntegratedGpu));
   if (!context.get()) {
-    LOG(ERROR) << "gfx::GLContext::CreateGLContext failed";
+    LOG(ERROR) << "gl::init::CreateGLContext failed";
     return NULL;
   }
 
diff --git a/gpu/gles2_conform_support/egl/context.cc b/gpu/gles2_conform_support/egl/context.cc
index 8bdd48d..9228efa 100644
--- a/gpu/gles2_conform_support/egl/context.cc
+++ b/gpu/gles2_conform_support/egl/context.cc
@@ -19,6 +19,7 @@
 #include "gpu/gles2_conform_support/egl/display.h"
 #include "gpu/gles2_conform_support/egl/surface.h"
 #include "gpu/gles2_conform_support/egl/thread_state.h"
+#include "ui/gl/init/gl_factory.h"
 
 // The slight complexification in this file comes from following properties:
 // 1) Command buffer connection (context) can not be established without a
@@ -271,8 +272,8 @@
 
   decoder->set_engine(command_executor.get());
 
-  scoped_refptr<gfx::GLContext> gl_context(gfx::GLContext::CreateGLContext(
-      nullptr, gl_surface, gfx::PreferDiscreteGpu));
+  scoped_refptr<gfx::GLContext> gl_context(
+      gl::init::CreateGLContext(nullptr, gl_surface, gfx::PreferDiscreteGpu));
   if (!gl_context)
     return false;
 
diff --git a/gpu/gles2_conform_support/egl/display.cc b/gpu/gles2_conform_support/egl/display.cc
index b4e01587..f80820f6 100644
--- a/gpu/gles2_conform_support/egl/display.cc
+++ b/gpu/gles2_conform_support/egl/display.cc
@@ -8,6 +8,7 @@
 #include "gpu/gles2_conform_support/egl/context.h"
 #include "gpu/gles2_conform_support/egl/surface.h"
 #include "gpu/gles2_conform_support/egl/thread_state.h"
+#include "ui/gl/init/gl_factory.h"
 
 namespace egl {
 
@@ -178,8 +179,7 @@
                                            EGLint height) {
   lock_.AssertAcquired();
   scoped_refptr<gfx::GLSurface> gl_surface;
-  gl_surface =
-      gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size(width, height));
+  gl_surface = gl::init::CreateOffscreenGLSurface(gfx::Size(width, height));
   if (!gl_surface)
     return ts->ReturnError(EGL_BAD_ALLOC, nullptr);
   surfaces_.emplace_back(new Surface(gl_surface.get(), config));
@@ -214,7 +214,7 @@
     return result;
   }
   scoped_refptr<gfx::GLSurface> gl_surface;
-  gl_surface = gfx::GLSurface::CreateViewGLSurface(win);
+  gl_surface = gl::init::CreateViewGLSurface(win);
   if (!gl_surface)
     return ts->ReturnError(EGL_BAD_ALLOC, EGL_NO_SURFACE);
   surfaces_.emplace_back(new Surface(gl_surface.get(), config));
diff --git a/gpu/gles2_conform_support/egl/thread_state.cc b/gpu/gles2_conform_support/egl/thread_state.cc
index 41593cb..13c5f89 100644
--- a/gpu/gles2_conform_support/egl/thread_state.cc
+++ b/gpu/gles2_conform_support/egl/thread_state.cc
@@ -22,6 +22,7 @@
 #include "gpu/gles2_conform_support/egl/test_support.h"
 #include "ui/gl/gl_context.h"
 #include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 
 // Thread local key for ThreadState instance. Accessed when holding g_egl_lock
 // only, since the initialization can not be Guaranteed otherwise.  Not in
@@ -83,7 +84,7 @@
         gpu::ApplyGpuDriverBugWorkarounds(gpu_info, command_line);
       }
 
-      gfx::GLSurface::InitializeOneOff();
+      gl::init::InitializeGLOneOff();
     }
 
     g_egl_default_display = new egl::Display();
diff --git a/gpu/gles2_conform_support/gles2_conform_support.gyp b/gpu/gles2_conform_support/gles2_conform_support.gyp
index 0316ddb..5f97bba 100644
--- a/gpu/gles2_conform_support/gles2_conform_support.gyp
+++ b/gpu/gles2_conform_support/gles2_conform_support.gyp
@@ -35,6 +35,7 @@
         '../../ui/base/ui_base.gyp:ui_base',
         '../../ui/gfx/gfx.gyp:gfx_geometry',
         '../../ui/gl/gl.gyp:gl',
+        '../../ui/gl/init/gl_init.gyp:gl_init',
       ],
       'sources': [
         'egl/config.cc',
diff --git a/gpu/gpu.gyp b/gpu/gpu.gyp
index 027faedf..6aa0a27 100644
--- a/gpu/gpu.gyp
+++ b/gpu/gpu.gyp
@@ -21,6 +21,7 @@
         '../third_party/khronos/khronos.gyp:khronos_headers',
         '../ui/gfx/gfx.gyp:gfx_geometry',
         '../ui/gl/gl.gyp:gl',
+        '../ui/gl/init/gl_init.gyp:gl_init',
         'command_buffer/command_buffer.gyp:gles2_utils',
         'gles2_cmd_helper',
       ],
@@ -50,6 +51,7 @@
         '../base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
         '../ui/gfx/gfx.gyp:gfx_geometry',
         '../ui/gl/gl.gyp:gl',
+        '../ui/gl/init/gl_init.gyp:gl_init',
       ],
       'defines': [
         'GL_IN_PROCESS_CONTEXT_IMPLEMENTATION',
@@ -166,6 +168,7 @@
         '../ui/gfx/gfx.gyp:gfx_geometry',
         '../ui/gfx/gfx.gyp:gfx_test_support',
         '../ui/gl/gl.gyp:gl',
+        '../ui/gl/init/gl_init.gyp:gl_init',
         '../ui/gl/gl.gyp:gl_test_support',
         'command_buffer/command_buffer.gyp:gles2_utils',
         'command_buffer_client',
@@ -319,6 +322,7 @@
         '../third_party/mesa/mesa.gyp:mesa_headers',
         '../ui/gfx/gfx.gyp:gfx_test_support',
         '../ui/gl/gl.gyp:gl',
+        '../ui/gl/init/gl_init.gyp:gl_init',
         '../ui/gl/gl.gyp:gl_unittest_utils',
         '../ui/gl/gl.gyp:gl_test_support',
         '../url/url.gyp:url_lib',
@@ -371,6 +375,7 @@
         '../testing/perf/perf_test.gyp:perf_test',
         '../ui/gfx/gfx.gyp:gfx_geometry',
         '../ui/gl/gl.gyp:gl',
+        '../ui/gl/init/gl_init.gyp:gl_init',
         'command_buffer_service',
       ],
       'sources': [
@@ -403,6 +408,7 @@
         '../ui/gfx/gfx.gyp:gfx_test_support',
         '../ui/gfx/gfx.gyp:gfx_geometry',
         '../ui/gl/gl.gyp:gl',
+        '../ui/gl/init/gl_init.gyp:gl_init',
         'command_buffer/command_buffer.gyp:gles2_utils',
         'command_buffer_client',
         'command_buffer_common',
@@ -521,6 +527,7 @@
         '../gpu/gpu.gyp:command_buffer_service',
         '../ui/gfx/gfx.gyp:gfx_geometry',
         '../ui/gl/gl.gyp:gl',
+        '../ui/gl/init/gl_init.gyp:gl_init',
         'command_buffer/command_buffer.gyp:gles2_utils',
         'gles2_c_lib',
         'gles2_implementation',
diff --git a/gpu/gpu_config.gypi b/gpu/gpu_config.gypi
index df9b3599..5907ce1 100644
--- a/gpu/gpu_config.gypi
+++ b/gpu/gpu_config.gypi
@@ -7,6 +7,7 @@
     '../third_party/re2/re2.gyp:re2',
     '../base/base.gyp:base',
     '../ui/gl/gl.gyp:gl',
+    '../ui/gl/init/gl_init.gyp:gl_init',
   ],
   'include_dirs': [
     '..',
diff --git a/gpu/gpu_ipc_client.gypi b/gpu/gpu_ipc_client.gypi
index f0ad3f2..dfa6a99 100644
--- a/gpu/gpu_ipc_client.gypi
+++ b/gpu/gpu_ipc_client.gypi
@@ -14,6 +14,7 @@
     '../ui/gfx/ipc/geometry/gfx_ipc_geometry.gyp:gfx_ipc_geometry',
     '../ui/gfx/ipc/gfx_ipc.gyp:gfx_ipc',
     '../ui/gl/gl.gyp:gl',
+    '../ui/gl/init/gl_init.gyp:gl_init',
     '../url/url.gyp:url_lib',
     '../url/ipc/url_ipc.gyp:url_ipc',
   ],
diff --git a/gpu/gpu_ipc_common.gypi b/gpu/gpu_ipc_common.gypi
index 6a4a41d5..3bf9ec5 100644
--- a/gpu/gpu_ipc_common.gypi
+++ b/gpu/gpu_ipc_common.gypi
@@ -14,6 +14,7 @@
     '../ui/gfx/ipc/geometry/gfx_ipc_geometry.gyp:gfx_ipc_geometry',
     '../ui/gfx/ipc/gfx_ipc.gyp:gfx_ipc',
     '../ui/gl/gl.gyp:gl',
+    '../ui/gl/init/gl_init.gyp:gl_init',
     '../url/url.gyp:url_lib',
     '../url/ipc/url_ipc.gyp:url_ipc',
   ],
diff --git a/gpu/gpu_ipc_service.gypi b/gpu/gpu_ipc_service.gypi
index 443abbe..f2a86e2 100644
--- a/gpu/gpu_ipc_service.gypi
+++ b/gpu/gpu_ipc_service.gypi
@@ -11,6 +11,7 @@
     '../ui/gfx/gfx.gyp:gfx',
     '../ui/gfx/gfx.gyp:gfx_geometry',
     '../ui/gl/gl.gyp:gl',
+    '../ui/gl/init/gl_init.gyp:gl_init',
     '../url/url.gyp:url_lib',
   ],
   'include_dirs': [
diff --git a/gpu/ipc/client/command_buffer_proxy_impl.cc b/gpu/ipc/client/command_buffer_proxy_impl.cc
index 56dd9a9..82689ad 100644
--- a/gpu/ipc/client/command_buffer_proxy_impl.cc
+++ b/gpu/ipc/client/command_buffer_proxy_impl.cc
@@ -8,9 +8,12 @@
 #include <vector>
 
 #include "base/callback.h"
+#include "base/location.h"
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "base/memory/shared_memory.h"
 #include "base/optional.h"
+#include "base/profiler/scoped_tracker.h"
 #include "base/stl_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/trace_event.h"
@@ -43,15 +46,12 @@
 
 }  // namespace
 
-CommandBufferProxyImpl::CommandBufferProxyImpl(
-    scoped_refptr<GpuChannelHost> channel,
-    int32_t route_id,
-    int32_t stream_id)
+CommandBufferProxyImpl::CommandBufferProxyImpl(int channel_id,
+                                               int32_t route_id,
+                                               int32_t stream_id)
     : lock_(nullptr),
       gpu_control_client_(nullptr),
-      channel_(std::move(channel)),
-      command_buffer_id_(
-          CommandBufferProxyID(channel_->channel_id(), route_id)),
+      command_buffer_id_(CommandBufferProxyID(channel_id, route_id)),
       route_id_(route_id),
       stream_id_(stream_id),
       flush_count_(0),
@@ -63,16 +63,50 @@
       next_signal_id_(0),
       weak_this_(AsWeakPtr()),
       callback_thread_(base::ThreadTaskRunnerHandle::Get()) {
-  DCHECK(channel_);
+  DCHECK(route_id);
   DCHECK_NE(stream_id, GPU_STREAM_INVALID);
 }
 
+// static
+std::unique_ptr<CommandBufferProxyImpl> CommandBufferProxyImpl::Create(
+    scoped_refptr<GpuChannelHost> host,
+    gpu::SurfaceHandle surface_handle,
+    const gfx::Size& size,
+    CommandBufferProxyImpl* share_group,
+    int32_t stream_id,
+    gpu::GpuStreamPriority stream_priority,
+    std::vector<int32_t> attribs,
+    const GURL& active_url,
+    gfx::GpuPreference gpu_preference,
+    scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
+  DCHECK(!share_group || (stream_id == share_group->stream_id_));
+  TRACE_EVENT1("gpu", "GpuChannelHost::CreateViewCommandBuffer",
+               "surface_handle", surface_handle);
+
+  GPUCreateCommandBufferConfig init_params;
+  init_params.surface_handle = surface_handle;
+  init_params.size = size;
+  init_params.share_group_id =
+      share_group ? share_group->route_id_ : MSG_ROUTING_NONE;
+  init_params.stream_id = stream_id;
+  init_params.stream_priority = stream_priority;
+  init_params.attribs = std::move(attribs);
+  init_params.active_url = active_url;
+  init_params.gpu_preference = gpu_preference;
+
+  int32_t route_id = host->GenerateRouteID();
+  std::unique_ptr<CommandBufferProxyImpl> command_buffer = base::WrapUnique(
+      new CommandBufferProxyImpl(host->channel_id(), route_id, stream_id));
+  if (!command_buffer->Initialize(std::move(host), std::move(init_params),
+                                  std::move(task_runner)))
+    return nullptr;
+
+  return command_buffer;
+}
+
 CommandBufferProxyImpl::~CommandBufferProxyImpl() {
   FOR_EACH_OBSERVER(DeletionObserver, deletion_observers_, OnWillDeleteImpl());
-  if (channel_) {
-    channel_->DestroyCommandBuffer(this);
-    channel_ = nullptr;
-  }
+  DisconnectChannel();
 }
 
 bool CommandBufferProxyImpl::OnMessageReceived(const IPC::Message& message) {
@@ -156,11 +190,14 @@
   callback.Run();
 }
 
-bool CommandBufferProxyImpl::Initialize() {
+bool CommandBufferProxyImpl::Initialize(
+    scoped_refptr<GpuChannelHost> channel,
+    const GPUCreateCommandBufferConfig& config,
+    scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
+  DCHECK(!channel_);
   TRACE_EVENT0("gpu", "CommandBufferProxyImpl::Initialize");
-  shared_state_shm_.reset(channel_->factory()
-                              ->AllocateSharedMemory(sizeof(*shared_state()))
-                              .release());
+  shared_state_shm_ =
+      channel->factory()->AllocateSharedMemory(sizeof(*shared_state()));
   if (!shared_state_shm_)
     return false;
 
@@ -171,24 +208,37 @@
 
   // This handle is owned by the GPU process and must be passed to it or it
   // will leak. In otherwords, do not early out on error between here and the
-  // sending of the Initialize IPC below.
+  // sending of the CreateCommandBuffer IPC below.
   base::SharedMemoryHandle handle =
-      channel_->ShareToGpuProcess(shared_state_shm_->handle());
+      channel->ShareToGpuProcess(shared_state_shm_->handle());
   if (!base::SharedMemory::IsHandleValid(handle))
     return false;
 
+
+  // TODO(vadimt): Remove ScopedTracker below once crbug.com/125248 is fixed.
+  tracked_objects::ScopedTracker tracking_profile(
+      FROM_HERE_WITH_EXPLICIT_FUNCTION(
+          "125248 CommandBufferProxyImpl::Initialize"));
+
+  // Route must be added before sending the message, otherwise messages sent
+  // from the GPU process could race against adding ourselves to the filter.
+  channel->AddRouteWithTaskRunner(route_id_, AsWeakPtr(),
+                                  std::move(task_runner));
+
+  // We're blocking the UI thread, which is generally undesirable.
+  // In this case we need to wait for this before we can show any UI /anyway/,
+  // so it won't cause additional jank.
+  // TODO(piman): Make this asynchronous (http://crbug.com/125248).
   bool result = false;
-  if (!Send(new GpuCommandBufferMsg_Initialize(route_id_, handle, &result,
-                                               &capabilities_))) {
-    LOG(ERROR) << "Could not send GpuCommandBufferMsg_Initialize.";
+  bool sent = channel->Send(new GpuChannelMsg_CreateCommandBuffer(
+      config, route_id_, handle, &result, &capabilities_));
+  if (!sent || !result) {
+    DLOG(ERROR) << "Failed to send GpuChannelMsg_CreateCommandBuffer.";
+    channel->RemoveRoute(route_id_);
     return false;
   }
 
-  if (!result) {
-    LOG(ERROR) << "Failed to initialize command buffer service.";
-    return false;
-  }
-
+  channel_ = std::move(channel);
   capabilities_.image = true;
 
   return true;
@@ -800,7 +850,9 @@
   // the client for lost context a single time.
   if (!channel_)
     return;
-  channel_->DestroyCommandBuffer(this);
+  channel_->FlushPendingStream(stream_id_);
+  channel_->Send(new GpuChannelMsg_DestroyCommandBuffer(route_id_));
+  channel_->RemoveRoute(route_id_);
   channel_ = nullptr;
   if (gpu_control_client_)
     gpu_control_client_->OnGpuControlLostContext();
diff --git a/gpu/ipc/client/command_buffer_proxy_impl.h b/gpu/ipc/client/command_buffer_proxy_impl.h
index 6c5ed2d..46a52aa 100644
--- a/gpu/ipc/client/command_buffer_proxy_impl.h
+++ b/gpu/ipc/client/command_buffer_proxy_impl.h
@@ -28,17 +28,26 @@
 #include "gpu/command_buffer/common/command_buffer_shared.h"
 #include "gpu/command_buffer/common/gpu_memory_allocation.h"
 #include "gpu/gpu_export.h"
+#include "gpu/ipc/common/gpu_stream_constants.h"
+#include "gpu/ipc/common/surface_handle.h"
 #include "ipc/ipc_listener.h"
 #include "ui/events/latency_info.h"
 #include "ui/gfx/swap_result.h"
+#include "ui/gl/gpu_preference.h"
 
 struct GPUCommandBufferConsoleMessage;
+struct GPUCreateCommandBufferConfig;
 struct GpuCommandBufferMsg_SwapBuffersCompleted_Params;
+class GURL;
 
 namespace base {
 class SharedMemory;
 }
 
+namespace gfx {
+class Size;
+}
+
 namespace gpu {
 struct GpuProcessHostedCALayerTreeParamsMac;
 struct Mailbox;
@@ -68,11 +77,19 @@
   typedef base::Callback<void(const std::string& msg, int id)>
       GpuConsoleMessageCallback;
 
-  CommandBufferProxyImpl(scoped_refptr<GpuChannelHost> channel,
-                         int32_t route_id,
-                         int32_t stream_id);
+  // Create and connect to a command buffer in the GPU process.
+  static std::unique_ptr<CommandBufferProxyImpl> Create(
+      scoped_refptr<GpuChannelHost> host,
+      gpu::SurfaceHandle surface_handle,
+      const gfx::Size& size,
+      CommandBufferProxyImpl* share_group,
+      int32_t stream_id,
+      gpu::GpuStreamPriority stream_priority,
+      std::vector<int32_t> attribs,
+      const GURL& active_url,
+      gfx::GpuPreference gpu_preference,
+      scoped_refptr<base::SingleThreadTaskRunner> task_runner);
   ~CommandBufferProxyImpl() override;
-  bool Initialize();
 
   // IPC::Listener implementation:
   bool OnMessageReceived(const IPC::Message& message) override;
@@ -149,8 +166,6 @@
 
   int32_t route_id() const { return route_id_; }
 
-  int32_t stream_id() const { return stream_id_; }
-
   const scoped_refptr<GpuChannelHost>& channel() const { return channel_; }
 
   base::SharedMemoryHandle GetSharedStateHandle() const {
@@ -162,6 +177,11 @@
   typedef std::map<int32_t, scoped_refptr<gpu::Buffer>> TransferBufferMap;
   typedef base::hash_map<uint32_t, base::Closure> SignalTaskMap;
 
+  CommandBufferProxyImpl(int channel_id, int32_t route_id, int32_t stream_id);
+  bool Initialize(scoped_refptr<GpuChannelHost> channel,
+                  const GPUCreateCommandBufferConfig& config,
+                  scoped_refptr<base::SingleThreadTaskRunner> task_runner);
+
   void CheckLock() {
     if (lock_) {
       lock_->AssertAcquired();
diff --git a/gpu/ipc/client/gpu_channel_host.cc b/gpu/ipc/client/gpu_channel_host.cc
index 030436e..ddadbdf6 100644
--- a/gpu/ipc/client/gpu_channel_host.cc
+++ b/gpu/ipc/client/gpu_channel_host.cc
@@ -9,16 +9,11 @@
 
 #include "base/atomic_sequence_num.h"
 #include "base/bind.h"
-#include "base/location.h"
-#include "base/memory/ptr_util.h"
-#include "base/posix/eintr_wrapper.h"
-#include "base/profiler/scoped_tracker.h"
 #include "base/single_thread_task_runner.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
-#include "gpu/ipc/client/command_buffer_proxy_impl.h"
 #include "gpu/ipc/common/gpu_messages.h"
 #include "gpu/ipc/common/gpu_param_traits_macros.h"
 #include "ipc/ipc_sync_message_filter.h"
@@ -189,78 +184,6 @@
   flush_info->flushed_stream_flush_id = flush_info->flush_id;
 }
 
-std::unique_ptr<CommandBufferProxyImpl> GpuChannelHost::CreateCommandBuffer(
-    gpu::SurfaceHandle surface_handle,
-    const gfx::Size& size,
-    CommandBufferProxyImpl* share_group,
-    int32_t stream_id,
-    gpu::GpuStreamPriority stream_priority,
-    const std::vector<int32_t>& attribs,
-    const GURL& active_url,
-    gfx::GpuPreference gpu_preference,
-    scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
-  DCHECK(!share_group || (stream_id == share_group->stream_id()));
-  TRACE_EVENT1("gpu", "GpuChannelHost::CreateViewCommandBuffer",
-               "surface_handle", surface_handle);
-
-  GPUCreateCommandBufferConfig init_params;
-  init_params.share_group_id =
-      share_group ? share_group->route_id() : MSG_ROUTING_NONE;
-  init_params.stream_id = stream_id;
-  init_params.stream_priority = stream_priority;
-  init_params.attribs = attribs;
-  init_params.active_url = active_url;
-  init_params.gpu_preference = gpu_preference;
-
-  int32_t route_id = GenerateRouteID();
-
-  // TODO(vadimt): Remove ScopedTracker below once crbug.com/125248 is fixed.
-  tracked_objects::ScopedTracker tracking_profile(
-      FROM_HERE_WITH_EXPLICIT_FUNCTION(
-          "125248 GpuChannelHost::CreateCommandBuffer"));
-
-  // We're blocking the UI thread, which is generally undesirable.
-  // In this case we need to wait for this before we can show any UI /anyway/,
-  // so it won't cause additional jank.
-  // TODO(piman): Make this asynchronous (http://crbug.com/125248).
-
-  bool succeeded = false;
-  if (!Send(new GpuChannelMsg_CreateCommandBuffer(
-          surface_handle, size, init_params, route_id, &succeeded))) {
-    LOG(ERROR) << "Failed to send GpuChannelMsg_CreateCommandBuffer.";
-    return nullptr;
-  }
-
-  if (!succeeded) {
-    LOG(ERROR) << "GpuChannelMsg_CreateCommandBuffer returned failure.";
-    return nullptr;
-  }
-
-  std::unique_ptr<CommandBufferProxyImpl> command_buffer =
-      base::WrapUnique(new CommandBufferProxyImpl(this, route_id, stream_id));
-  AddRouteWithTaskRunner(route_id, command_buffer->AsWeakPtr(),
-                         std::move(task_runner));
-  if (!command_buffer->Initialize())
-    return nullptr;
-
-  return command_buffer;
-}
-
-void GpuChannelHost::DestroyCommandBuffer(
-    CommandBufferProxyImpl* command_buffer) {
-  TRACE_EVENT0("gpu", "GpuChannelHost::DestroyCommandBuffer");
-
-  int32_t route_id = command_buffer->route_id();
-  int32_t stream_id = command_buffer->stream_id();
-  Send(new GpuChannelMsg_DestroyCommandBuffer(route_id));
-  RemoveRoute(route_id);
-
-  AutoLock lock(context_lock_);
-  StreamFlushInfo& flush_info = stream_flush_info_[stream_id];
-  if (flush_info.flush_pending && flush_info.route_id == route_id)
-    flush_info.flush_pending = false;
-}
-
 void GpuChannelHost::DestroyChannel() {
   DCHECK(factory_->IsMainThread());
   AutoLock lock(context_lock_);
diff --git a/gpu/ipc/client/gpu_channel_host.h b/gpu/ipc/client/gpu_channel_host.h
index b1a6978cb..94fb98d 100644
--- a/gpu/ipc/client/gpu_channel_host.h
+++ b/gpu/ipc/client/gpu_channel_host.h
@@ -22,17 +22,12 @@
 #include "gpu/config/gpu_info.h"
 #include "gpu/gpu_export.h"
 #include "gpu/ipc/common/gpu_stream_constants.h"
-#include "gpu/ipc/common/surface_handle.h"
 #include "ipc/ipc_channel_handle.h"
 #include "ipc/ipc_sync_channel.h"
 #include "ipc/message_filter.h"
 #include "ipc/message_router.h"
 #include "ui/events/latency_info.h"
-#include "ui/gfx/geometry/size.h"
 #include "ui/gfx/gpu_memory_buffer.h"
-#include "ui/gl/gpu_preference.h"
-
-class GURL;
 
 namespace base {
 class WaitableEvent;
@@ -47,8 +42,6 @@
 }
 
 namespace gpu {
-class CommandBufferProxyImpl;
-class GpuChannelHost;
 
 class GPU_EXPORT GpuChannelHostFactory {
  public:
@@ -104,21 +97,6 @@
 
   void FlushPendingStream(int32_t stream_id);
 
-  // Create and connect to a command buffer in the GPU process.
-  std::unique_ptr<CommandBufferProxyImpl> CreateCommandBuffer(
-      gpu::SurfaceHandle surface_handle,
-      const gfx::Size& size,
-      CommandBufferProxyImpl* share_group,
-      int32_t stream_id,
-      gpu::GpuStreamPriority stream_priority,
-      const std::vector<int32_t>& attribs,
-      const GURL& active_url,
-      gfx::GpuPreference gpu_preference,
-      scoped_refptr<base::SingleThreadTaskRunner> task_runner);
-
-  // Destroy a command buffer created by this channel.
-  void DestroyCommandBuffer(CommandBufferProxyImpl* command_buffer);
-
   // Destroy this channel. Must be called on the main thread, before
   // destruction.
   void DestroyChannel();
diff --git a/gpu/ipc/common/gpu_messages.h b/gpu/ipc/common/gpu_messages.h
index 3f77e92..01becc2d 100644
--- a/gpu/ipc/common/gpu_messages.h
+++ b/gpu/ipc/common/gpu_messages.h
@@ -53,6 +53,8 @@
 IPC_STRUCT_END()
 
 IPC_STRUCT_BEGIN(GPUCreateCommandBufferConfig)
+  IPC_STRUCT_MEMBER(gpu::SurfaceHandle, surface_handle)
+  IPC_STRUCT_MEMBER(gfx::Size, size)
   IPC_STRUCT_MEMBER(int32_t, share_group_id)
   IPC_STRUCT_MEMBER(int32_t, stream_id)
   IPC_STRUCT_MEMBER(gpu::GpuStreamPriority, stream_priority)
@@ -98,12 +100,12 @@
 // ignored, and it will render directly to the native surface (only the browser
 // process is allowed to create those). Otherwise it will create an offscreen
 // backbuffer of dimensions |size|.
-IPC_SYNC_MESSAGE_CONTROL4_1(GpuChannelMsg_CreateCommandBuffer,
-                            gpu::SurfaceHandle /* surface_handle */,
-                            gfx::Size /* size */,
+IPC_SYNC_MESSAGE_CONTROL3_2(GpuChannelMsg_CreateCommandBuffer,
                             GPUCreateCommandBufferConfig /* init_params */,
                             int32_t /* route_id */,
-                            bool /* succeeded */)
+                            base::SharedMemoryHandle /* shared_state */,
+                            bool /* result */,
+                            gpu::Capabilities /* capabilities */)
 
 // The CommandBufferProxy sends this to the GpuCommandBufferStub in its
 // destructor, so that the stub deletes the actual CommandBufferService
@@ -145,13 +147,6 @@
 // GPU Command Buffer Messages
 // These are messages between a renderer process to the GPU process relating to
 // a single OpenGL context.
-// Initialize a command buffer with the given number of command entries.
-// Returns the shared memory handle for the command buffer mapped to the
-// calling process.
-IPC_SYNC_MESSAGE_ROUTED1_2(GpuCommandBufferMsg_Initialize,
-                           base::SharedMemoryHandle /* shared_state */,
-                           bool /* result */,
-                           gpu::Capabilities /* capabilities */)
 
 // Sets the shared memory buffer used for commands.
 IPC_SYNC_MESSAGE_ROUTED1_0(GpuCommandBufferMsg_SetGetBuffer,
diff --git a/gpu/ipc/service/BUILD.gn b/gpu/ipc/service/BUILD.gn
index cc514a8..052a892 100644
--- a/gpu/ipc/service/BUILD.gn
+++ b/gpu/ipc/service/BUILD.gn
@@ -50,6 +50,7 @@
     "//ui/gfx",
     "//ui/gfx/geometry",
     "//ui/gl",
+    "//ui/gl/init",
     "//url",
   ]
   deps = [
diff --git a/gpu/ipc/service/gpu_channel.cc b/gpu/ipc/service/gpu_channel.cc
index 2cb9b8d..38ad7659 100644
--- a/gpu/ipc/service/gpu_channel.cc
+++ b/gpu/ipc/service/gpu_channel.cc
@@ -892,19 +892,34 @@
 #endif
 
 void GpuChannel::OnCreateCommandBuffer(
-    SurfaceHandle surface_handle,
-    const gfx::Size& size,
     const GPUCreateCommandBufferConfig& init_params,
     int32_t route_id,
-    bool* succeeded) {
+    base::SharedMemoryHandle shared_state_shm,
+    bool* result,
+    gpu::Capabilities* capabilities) {
   TRACE_EVENT2("gpu", "GpuChannel::OnCreateCommandBuffer", "route_id", route_id,
-               "offscreen", (surface_handle == kNullSurfaceHandle));
-  *succeeded = false;
-  if (surface_handle != kNullSurfaceHandle &&
+               "offscreen", (init_params.surface_handle == kNullSurfaceHandle));
+  std::unique_ptr<GpuCommandBufferStub> stub =
+      CreateCommandBuffer(init_params, route_id, shared_state_shm);
+  if (stub) {
+    *result = true;
+    *capabilities = stub->decoder()->GetCapabilities();
+    stubs_.set(route_id, std::move(stub));
+  } else {
+    *result = false;
+    *capabilities = gpu::Capabilities();
+  }
+}
+
+std::unique_ptr<GpuCommandBufferStub> GpuChannel::CreateCommandBuffer(
+    const GPUCreateCommandBufferConfig& init_params,
+    int32_t route_id,
+    base::SharedMemoryHandle shared_state_shm) {
+  if (init_params.surface_handle != kNullSurfaceHandle &&
       !allow_view_command_buffers_) {
     DLOG(ERROR) << "GpuChannel::CreateCommandBuffer(): attempt to create a "
                    "view context on a non-priviledged channel";
-    return;
+    return nullptr;
   }
 
   int32_t share_group_id = init_params.share_group_id;
@@ -912,57 +927,62 @@
 
   if (!share_group && share_group_id != MSG_ROUTING_NONE) {
     DLOG(ERROR)
-        << "GpuChannel::OnCreateCommandBuffer(): invalid share group id";
-    return;
+        << "GpuChannel::CreateCommandBuffer(): invalid share group id";
+    return nullptr;
   }
 
   int32_t stream_id = init_params.stream_id;
   if (share_group && stream_id != share_group->stream_id()) {
-    DLOG(ERROR) << "GpuChannel::OnCreateCommandBuffer(): stream id does not "
+    DLOG(ERROR) << "GpuChannel::CreateCommandBuffer(): stream id does not "
                    "match share group stream id";
-    return;
+    return nullptr;
   }
 
   GpuStreamPriority stream_priority = init_params.stream_priority;
   if (!allow_real_time_streams_ &&
       stream_priority == GpuStreamPriority::REAL_TIME) {
-    DLOG(ERROR) << "GpuChannel::OnCreateCommandBuffer(): real time stream "
+    DLOG(ERROR) << "GpuChannel::CreateCommandBuffer(): real time stream "
                    "priority not allowed";
-    return;
+    return nullptr;
   }
 
   if (share_group && !share_group->decoder()) {
     // This should catch test errors where we did not Initialize the
     // share_group's CommandBuffer.
-    DLOG(ERROR) << "GpuChannel::OnCreateCommandBuffer(): shared context was "
+    DLOG(ERROR) << "GpuChannel::CreateCommandBuffer(): shared context was "
                    "not initialized";
-    return;
+    return nullptr;
   }
 
   if (share_group && share_group->decoder()->WasContextLost()) {
-    DLOG(ERROR) << "GpuChannel::OnCreateCommandBuffer(): shared context was "
+    DLOG(ERROR) << "GpuChannel::CreateCommandBuffer(): shared context was "
                    "already lost";
-    return;
+    return nullptr;
   }
 
   std::unique_ptr<GpuCommandBufferStub> stub(new GpuCommandBufferStub(
       this, sync_point_manager_, task_runner_.get(), share_group,
-      surface_handle, mailbox_manager_.get(), preempted_flag_.get(), size,
-      disallowed_features_, init_params.attribs, init_params.gpu_preference,
-      init_params.stream_id, route_id, watchdog_, init_params.active_url));
+      init_params.surface_handle, mailbox_manager_.get(), preempted_flag_.get(),
+      init_params.size, disallowed_features_, init_params.attribs,
+      init_params.gpu_preference, stream_id, route_id, watchdog_,
+      init_params.active_url));
 
   scoped_refptr<GpuChannelMessageQueue> queue = LookupStream(stream_id);
   if (!queue)
     queue = CreateStream(stream_id, stream_priority);
 
-  if (!AddRoute(route_id, stream_id, stub.get())) {
+  if (!stub->Initialize(shared_state_shm)) {
     DestroyStreamIfNecessary(queue);
-    DLOG(ERROR) << "GpuChannel::OnCreateCommandBuffer(): failed to add route";
-    return;
+    return nullptr;
   }
 
-  stubs_.set(route_id, std::move(stub));
-  *succeeded = true;
+  if (!AddRoute(route_id, stream_id, stub.get())) {
+    DestroyStreamIfNecessary(queue);
+    DLOG(ERROR) << "GpuChannel::CreateCommandBuffer(): failed to add route";
+    return nullptr;
+  }
+
+  return stub;
 }
 
 void GpuChannel::OnDestroyCommandBuffer(int32_t route_id) {
diff --git a/gpu/ipc/service/gpu_channel.h b/gpu/ipc/service/gpu_channel.h
index 7a8cf42..5eca4df 100644
--- a/gpu/ipc/service/gpu_channel.h
+++ b/gpu/ipc/service/gpu_channel.h
@@ -188,15 +188,20 @@
   void RemoveRouteFromStream(int32_t route_id);
 
   // Message handlers for control messages.
-  void OnCreateCommandBuffer(SurfaceHandle surface_handle,
-                             const gfx::Size& size,
-                             const GPUCreateCommandBufferConfig& init_params,
+  void OnCreateCommandBuffer(const GPUCreateCommandBufferConfig& init_params,
                              int32_t route_id,
-                             bool* succeeded);
+                             base::SharedMemoryHandle shared_state_shm,
+                             bool* result,
+                             gpu::Capabilities* capabilities);
   void OnDestroyCommandBuffer(int32_t route_id);
   void OnGetDriverBugWorkArounds(
       std::vector<std::string>* gpu_driver_bug_workarounds);
 
+  std::unique_ptr<GpuCommandBufferStub> CreateCommandBuffer(
+      const GPUCreateCommandBufferConfig& init_params,
+      int32_t route_id,
+      base::SharedMemoryHandle shared_state_shm);
+
   // The lifetime of objects of this class is managed by a GpuChannelManager.
   // The GpuChannelManager destroy all the GpuChannels that they own when they
   // are destroyed. So a raw pointer is safe.
diff --git a/gpu/ipc/service/gpu_channel_manager.cc b/gpu/ipc/service/gpu_channel_manager.cc
index f31f40a..04487ed 100644
--- a/gpu/ipc/service/gpu_channel_manager.cc
+++ b/gpu/ipc/service/gpu_channel_manager.cc
@@ -27,6 +27,7 @@
 #include "gpu/ipc/service/gpu_memory_manager.h"
 #include "ui/gl/gl_bindings.h"
 #include "ui/gl/gl_share_group.h"
+#include "ui/gl/init/gl_factory.h"
 
 namespace gpu {
 
@@ -234,7 +235,7 @@
 gfx::GLSurface* GpuChannelManager::GetDefaultOffscreenSurface() {
   if (!default_offscreen_surface_.get()) {
     default_offscreen_surface_ =
-        gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size());
+        gl::init::CreateOffscreenGLSurface(gfx::Size());
   }
   return default_offscreen_surface_.get();
 }
diff --git a/gpu/ipc/service/gpu_channel_test_common.cc b/gpu/ipc/service/gpu_channel_test_common.cc
index 4939378a..46ac857a 100644
--- a/gpu/ipc/service/gpu_channel_test_common.cc
+++ b/gpu/ipc/service/gpu_channel_test_common.cc
@@ -134,21 +134,24 @@
     : task_runner_(new base::TestSimpleTaskRunner),
       io_task_runner_(new base::TestSimpleTaskRunner),
       sync_point_manager_(new SyncPointManager(false)),
-      channel_manager_delegate_(new TestGpuChannelManagerDelegate()),
-      channel_manager_(
-          new TestGpuChannelManager(gpu_preferences_,
-                                    channel_manager_delegate_.get(),
-                                    task_runner_.get(),
-                                    io_task_runner_.get(),
-                                    sync_point_manager_.get(),
-                                    nullptr)) {}
+      channel_manager_delegate_(new TestGpuChannelManagerDelegate()) {}
 
 GpuChannelTestCommon::~GpuChannelTestCommon() {
-  // Destroying channels causes tasks to run on the IO task runner.
-  channel_manager_ = nullptr;
   // Clear pending tasks to avoid refptr cycles that get flagged by ASAN.
   task_runner_->ClearPendingTasks();
   io_task_runner_->ClearPendingTasks();
 }
 
+void GpuChannelTestCommon::SetUp() {
+  channel_manager_.reset(new TestGpuChannelManager(
+      gpu_preferences_, channel_manager_delegate_.get(), task_runner_.get(),
+      io_task_runner_.get(), sync_point_manager_.get(), nullptr));
+}
+
+void GpuChannelTestCommon::TearDown() {
+  // Destroying channels causes tasks to run on the IO task runner.
+  channel_manager_ = nullptr;
+}
+
+
 }  // namespace gpu
diff --git a/gpu/ipc/service/gpu_channel_test_common.h b/gpu/ipc/service/gpu_channel_test_common.h
index 4a50dd3..0f7d3a4 100644
--- a/gpu/ipc/service/gpu_channel_test_common.h
+++ b/gpu/ipc/service/gpu_channel_test_common.h
@@ -106,6 +106,9 @@
   GpuChannelTestCommon();
   ~GpuChannelTestCommon() override;
 
+  void SetUp() override;
+  void TearDown() override;
+
  protected:
   GpuChannelManager* channel_manager() { return channel_manager_.get(); }
   TestGpuChannelManagerDelegate* channel_manager_delegate() {
diff --git a/gpu/ipc/service/gpu_channel_unittest.cc b/gpu/ipc/service/gpu_channel_unittest.cc
index da7e0d2..23eeb05b 100644
--- a/gpu/ipc/service/gpu_channel_unittest.cc
+++ b/gpu/ipc/service/gpu_channel_unittest.cc
@@ -18,6 +18,8 @@
 
 namespace gpu {
 
+static constexpr int kFakeTextureIds[] = {1, 2};
+
 class GpuChannelTest : public GpuChannelTestCommon {
  public:
   GpuChannelTest() : GpuChannelTestCommon() {}
@@ -27,6 +29,114 @@
     // We need GL bindings to actually initialize command buffers.
     gfx::SetGLGetProcAddressProc(gfx::MockGLInterface::GetGLProcAddress);
     gfx::GLSurfaceTestSupport::InitializeOneOffWithMockBindings();
+
+    // This GLInterface is a stub for the gl driver.
+    gl_interface_.reset(new testing::NiceMock<gfx::MockGLInterface>);
+    gfx::MockGLInterface::SetGLInterface(gl_interface_.get());
+
+    using testing::AnyNumber;
+    using testing::NotNull;
+    using testing::Return;
+    using testing::SetArgPointee;
+    using testing::SetArrayArgument;
+    // We need it to return non-null strings in order for things to not crash.
+    EXPECT_CALL(*gl_interface_, GetString(GL_RENDERER))
+        .Times(AnyNumber())
+        .WillRepeatedly(Return(reinterpret_cast<const GLubyte*>("")));
+    EXPECT_CALL(*gl_interface_, GetString(GL_VERSION))
+        .Times(AnyNumber())
+        .WillRepeatedly(Return(reinterpret_cast<const GLubyte*>("2.0")));
+    EXPECT_CALL(*gl_interface_, GetString(GL_EXTENSIONS))
+        .Times(AnyNumber())
+        .WillRepeatedly(Return(
+            reinterpret_cast<const GLubyte*>("GL_EXT_framebuffer_object ")));
+    // And we need some values to be large enough to initialize ContextGroup.
+    EXPECT_CALL(*gl_interface_,
+                GetIntegerv(GL_MAX_RENDERBUFFER_SIZE, NotNull()))
+        .Times(AnyNumber())
+        .WillRepeatedly(SetArgPointee<1>(512));
+    EXPECT_CALL(*gl_interface_, GetIntegerv(GL_MAX_VERTEX_ATTRIBS, NotNull()))
+        .Times(AnyNumber())
+        .WillRepeatedly(SetArgPointee<1>(8));
+    EXPECT_CALL(*gl_interface_,
+                GetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, NotNull()))
+        .Times(AnyNumber())
+        .WillRepeatedly(SetArgPointee<1>(8));
+    EXPECT_CALL(*gl_interface_,
+                GetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, NotNull()))
+        .Times(AnyNumber())
+        .WillRepeatedly(SetArgPointee<1>(8));
+    EXPECT_CALL(*gl_interface_, GetIntegerv(GL_MAX_TEXTURE_SIZE, NotNull()))
+        .Times(AnyNumber())
+        .WillRepeatedly(SetArgPointee<1>(2048));
+    EXPECT_CALL(*gl_interface_,
+                GetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, NotNull()))
+        .Times(AnyNumber())
+        .WillRepeatedly(SetArgPointee<1>(2048));
+    EXPECT_CALL(*gl_interface_, GetIntegerv(GL_MAX_VARYING_FLOATS, NotNull()))
+        .Times(AnyNumber())
+        .WillRepeatedly(SetArgPointee<1>(8 * 4));
+    EXPECT_CALL(*gl_interface_,
+                GetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS, NotNull()))
+        .Times(AnyNumber())
+        .WillRepeatedly(SetArgPointee<1>(128 * 4));
+    EXPECT_CALL(*gl_interface_,
+                GetIntegerv(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS, NotNull()))
+        .Times(AnyNumber())
+        .WillRepeatedly(SetArgPointee<1>(16 * 4));
+    EXPECT_CALL(*gl_interface_,
+                GetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, NotNull()))
+        .Times(AnyNumber())
+        .WillRepeatedly(SetArgPointee<1>(32));
+    EXPECT_CALL(*gl_interface_, GetIntegerv(GL_MAX_VIEWPORT_DIMS, NotNull()))
+        .Times(AnyNumber())
+        .WillRepeatedly(SetArgPointee<1>(1024 << 8));
+    EXPECT_CALL(*gl_interface_, GetIntegerv(GL_ALPHA_BITS, NotNull()))
+        .Times(AnyNumber())
+        .WillRepeatedly(SetArgPointee<1>(8));
+    EXPECT_CALL(*gl_interface_, GetIntegerv(GL_DEPTH_BITS, NotNull()))
+        .Times(AnyNumber())
+        .WillRepeatedly(SetArgPointee<1>(24));
+    EXPECT_CALL(*gl_interface_, GetIntegerv(GL_STENCIL_BITS, NotNull()))
+        .Times(AnyNumber())
+        .WillRepeatedly(SetArgPointee<1>(8));
+    // Allow generating non-0 resources so code does not DCHECK.
+    EXPECT_CALL(*gl_interface_, GenFramebuffersEXT(1, NotNull()))
+        .Times(AnyNumber())
+        .WillRepeatedly(SetArgPointee<1>(1));
+    EXPECT_CALL(*gl_interface_, GenTextures(1, NotNull()))
+        .Times(AnyNumber())
+        .WillRepeatedly(
+            SetArrayArgument<1>(kFakeTextureIds, kFakeTextureIds + 1));
+    EXPECT_CALL(*gl_interface_, GenTextures(2, NotNull()))
+        .Times(AnyNumber())
+        .WillRepeatedly(
+            SetArrayArgument<1>(kFakeTextureIds, kFakeTextureIds + 2));
+    // And errors should be squashed.
+    EXPECT_CALL(*gl_interface_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER))
+        .Times(AnyNumber())
+        .WillRepeatedly(Return(GL_FRAMEBUFFER_COMPLETE));
+
+    // Dynamic bindings must be set up for the GLES2DecoderImpl, which requires
+    // a GLContext. Use a GLContextStub which does nothing but call through to
+    // our |gl_interface| above.
+    stub_context_ = new gfx::GLContextStub;
+    stub_surface_ = new gfx::GLSurfaceStub;
+    stub_context_->MakeCurrent(stub_surface_.get());
+    gfx::GLSurfaceTestSupport::InitializeDynamicMockBindings(
+        stub_context_.get());
+
+    GpuChannelTestCommon::SetUp();
+  }
+
+  void TearDown() override {
+    GpuChannelTestCommon::TearDown();
+
+    stub_context_ = nullptr;
+    stub_surface_ = nullptr;
+    gfx::MockGLInterface::SetGLInterface(nullptr);
+    gfx::ClearGLBindings();
+    gl_interface_ = nullptr;
   }
 
   GpuChannel* CreateChannel(int32_t client_id,
@@ -50,14 +160,15 @@
     test_channel->HandleMessageForTesting(*msg);
     if (msg->is_sync()) {
       const IPC::Message* reply_msg = test_channel->sink()->GetMessageAt(0);
-      ASSERT_TRUE(reply_msg);
+      CHECK(reply_msg);
+      CHECK(!reply_msg->is_reply_error());
 
-      EXPECT_TRUE(IPC::SyncMessage::IsMessageReplyTo(
+      CHECK(IPC::SyncMessage::IsMessageReplyTo(
           *reply_msg, IPC::SyncMessage::GetMessageId(*msg)));
 
       IPC::MessageReplyDeserializer* deserializer =
           static_cast<IPC::SyncMessage*>(msg)->GetReplyDeserializer();
-      ASSERT_TRUE(deserializer);
+      CHECK(deserializer);
       deserializer->SerializeOutputParameters(*reply_msg);
 
       delete deserializer;
@@ -67,11 +178,25 @@
 
     delete msg;
   }
+
+  base::SharedMemoryHandle GetSharedHandle() {
+    base::SharedMemory shared_memory;
+    shared_memory.CreateAnonymous(10);
+    base::SharedMemoryHandle shmem_handle;
+    shared_memory.ShareToProcess(base::GetCurrentProcessHandle(),
+                                 &shmem_handle);
+    return shmem_handle;
+  }
+
+ private:
+  base::TestMessageLoop message_loop_;
+  std::unique_ptr<gfx::MockGLInterface> gl_interface_;
+  scoped_refptr<gfx::GLContextStub> stub_context_;
+  scoped_refptr<gfx::GLSurfaceStub> stub_surface_;
 };
 
 #if defined(OS_WIN)
-const SurfaceHandle kFakeSurfaceHandle =
-    reinterpret_cast<SurfaceHandle>(1);
+const SurfaceHandle kFakeSurfaceHandle = reinterpret_cast<SurfaceHandle>(1);
 #else
 const SurfaceHandle kFakeSurfaceHandle = 1;
 #endif
@@ -88,17 +213,20 @@
 
   int32_t kRouteId = 1;
   GPUCreateCommandBufferConfig init_params;
+  init_params.surface_handle = surface_handle;
+  init_params.size = gfx::Size();
   init_params.share_group_id = MSG_ROUTING_NONE;
   init_params.stream_id = 0;
   init_params.stream_priority = GpuStreamPriority::NORMAL;
   init_params.attribs = std::vector<int>();
   init_params.active_url = GURL();
   init_params.gpu_preference = gfx::PreferIntegratedGpu;
-  bool succeeded = false;
+  bool result = false;
+  gpu::Capabilities capabilities;
   HandleMessage(channel, new GpuChannelMsg_CreateCommandBuffer(
-                             surface_handle, gfx::Size(), init_params, kRouteId,
-                             &succeeded));
-  EXPECT_TRUE(succeeded);
+                             init_params, kRouteId, GetSharedHandle(), &result,
+                             &capabilities));
+  EXPECT_TRUE(result);
 
   GpuCommandBufferStub* stub = channel->LookupCommandBuffer(kRouteId);
   ASSERT_TRUE(stub);
@@ -116,17 +244,20 @@
 
   int32_t kRouteId = 1;
   GPUCreateCommandBufferConfig init_params;
+  init_params.surface_handle = surface_handle;
+  init_params.size = gfx::Size();
   init_params.share_group_id = MSG_ROUTING_NONE;
   init_params.stream_id = 0;
   init_params.stream_priority = GpuStreamPriority::NORMAL;
   init_params.attribs = std::vector<int>();
   init_params.active_url = GURL();
   init_params.gpu_preference = gfx::PreferIntegratedGpu;
-  bool succeeded = false;
+  bool result = false;
+  gpu::Capabilities capabilities;
   HandleMessage(channel, new GpuChannelMsg_CreateCommandBuffer(
-                             surface_handle, gfx::Size(), init_params, kRouteId,
-                             &succeeded));
-  EXPECT_FALSE(succeeded);
+                             init_params, kRouteId, GetSharedHandle(), &result,
+                             &capabilities));
+  EXPECT_FALSE(result);
 
   GpuCommandBufferStub* stub = channel->LookupCommandBuffer(kRouteId);
   EXPECT_FALSE(stub);
@@ -139,17 +270,20 @@
 
   int32_t kRouteId = 1;
   GPUCreateCommandBufferConfig init_params;
+  init_params.surface_handle = kNullSurfaceHandle;
+  init_params.size = gfx::Size(1, 1);
   init_params.share_group_id = MSG_ROUTING_NONE;
   init_params.stream_id = 0;
   init_params.stream_priority = GpuStreamPriority::NORMAL;
   init_params.attribs = std::vector<int>();
   init_params.active_url = GURL();
   init_params.gpu_preference = gfx::PreferIntegratedGpu;
-  bool succeeded = false;
+  bool result = false;
+  gpu::Capabilities capabilities;
   HandleMessage(channel, new GpuChannelMsg_CreateCommandBuffer(
-                             kNullSurfaceHandle, gfx::Size(1, 1),
-                             init_params, kRouteId, &succeeded));
-  EXPECT_TRUE(succeeded);
+                             init_params, kRouteId, GetSharedHandle(), &result,
+                             &capabilities));
+  EXPECT_TRUE(result);
 
   GpuCommandBufferStub* stub = channel->LookupCommandBuffer(kRouteId);
   EXPECT_TRUE(stub);
@@ -164,17 +298,20 @@
   int32_t kRouteId1 = 1;
   int32_t kStreamId1 = 1;
   GPUCreateCommandBufferConfig init_params;
+  init_params.surface_handle = kNullSurfaceHandle;
+  init_params.size = gfx::Size(1, 1);
   init_params.share_group_id = MSG_ROUTING_NONE;
   init_params.stream_id = kStreamId1;
   init_params.stream_priority = GpuStreamPriority::NORMAL;
   init_params.attribs = std::vector<int>();
   init_params.active_url = GURL();
   init_params.gpu_preference = gfx::PreferIntegratedGpu;
-  bool succeeded = false;
+  bool result = false;
+  gpu::Capabilities capabilities;
   HandleMessage(channel, new GpuChannelMsg_CreateCommandBuffer(
-                             kNullSurfaceHandle, gfx::Size(1, 1),
-                             init_params, kRouteId1, &succeeded));
-  EXPECT_TRUE(succeeded);
+                             init_params, kRouteId1, GetSharedHandle(), &result,
+                             &capabilities));
+  EXPECT_TRUE(result);
 
   GpuCommandBufferStub* stub = channel->LookupCommandBuffer(kRouteId1);
   EXPECT_TRUE(stub);
@@ -189,11 +326,10 @@
   init_params.attribs = std::vector<int>();
   init_params.active_url = GURL();
   init_params.gpu_preference = gfx::PreferIntegratedGpu;
-  succeeded = false;
   HandleMessage(channel, new GpuChannelMsg_CreateCommandBuffer(
-                             kNullSurfaceHandle, gfx::Size(1, 1),
-                             init_params, kRouteId2, &succeeded));
-  EXPECT_FALSE(succeeded);
+                             init_params, kRouteId2, GetSharedHandle(), &result,
+                             &capabilities));
+  EXPECT_FALSE(result);
 
   stub = channel->LookupCommandBuffer(kRouteId2);
   EXPECT_FALSE(stub);
@@ -209,17 +345,20 @@
   int32_t kStreamId1 = 1;
   GpuStreamPriority kStreamPriority1 = GpuStreamPriority::NORMAL;
   GPUCreateCommandBufferConfig init_params;
+  init_params.surface_handle = kNullSurfaceHandle;
+  init_params.size = gfx::Size(1, 1);
   init_params.share_group_id = MSG_ROUTING_NONE;
   init_params.stream_id = kStreamId1;
   init_params.stream_priority = kStreamPriority1;
   init_params.attribs = std::vector<int>();
   init_params.active_url = GURL();
   init_params.gpu_preference = gfx::PreferIntegratedGpu;
-  bool succeeded = false;
+  bool result = false;
+  gpu::Capabilities capabilities;
   HandleMessage(channel, new GpuChannelMsg_CreateCommandBuffer(
-                             kNullSurfaceHandle, gfx::Size(1, 1),
-                             init_params, kRouteId1, &succeeded));
-  EXPECT_TRUE(succeeded);
+                             init_params, kRouteId1, GetSharedHandle(), &result,
+                             &capabilities));
+  EXPECT_TRUE(result);
 
   GpuCommandBufferStub* stub = channel->LookupCommandBuffer(kRouteId1);
   EXPECT_TRUE(stub);
@@ -239,11 +378,10 @@
   init_params.attribs = std::vector<int>();
   init_params.active_url = GURL();
   init_params.gpu_preference = gfx::PreferIntegratedGpu;
-  succeeded = false;
   HandleMessage(channel, new GpuChannelMsg_CreateCommandBuffer(
-                             kNullSurfaceHandle, gfx::Size(1, 1),
-                             init_params, kRouteId2, &succeeded));
-  EXPECT_TRUE(succeeded);
+                             init_params, kRouteId2, GetSharedHandle(), &result,
+                             &capabilities));
+  EXPECT_TRUE(result);
 
   stub = channel->LookupCommandBuffer(kRouteId2);
   EXPECT_TRUE(stub);
@@ -260,17 +398,20 @@
   int32_t kStreamId = 1;
   GpuStreamPriority kStreamPriority = GpuStreamPriority::REAL_TIME;
   GPUCreateCommandBufferConfig init_params;
+  init_params.surface_handle = kNullSurfaceHandle;
+  init_params.size = gfx::Size(1, 1);
   init_params.share_group_id = MSG_ROUTING_NONE;
   init_params.stream_id = kStreamId;
   init_params.stream_priority = kStreamPriority;
   init_params.attribs = std::vector<int>();
   init_params.active_url = GURL();
   init_params.gpu_preference = gfx::PreferIntegratedGpu;
-  bool succeeded = false;
+  bool result = false;
+  gpu::Capabilities capabilities;
   HandleMessage(channel, new GpuChannelMsg_CreateCommandBuffer(
-                             kNullSurfaceHandle, gfx::Size(1, 1),
-                             init_params, kRouteId, &succeeded));
-  EXPECT_FALSE(succeeded);
+                             init_params, kRouteId, GetSharedHandle(), &result,
+                             &capabilities));
+  EXPECT_FALSE(result);
 
   GpuCommandBufferStub* stub = channel->LookupCommandBuffer(kRouteId);
   EXPECT_FALSE(stub);
@@ -287,111 +428,26 @@
   int32_t kStreamId = 1;
   GpuStreamPriority kStreamPriority = GpuStreamPriority::REAL_TIME;
   GPUCreateCommandBufferConfig init_params;
+  init_params.surface_handle = kNullSurfaceHandle;
+  init_params.size = gfx::Size(1, 1);
   init_params.share_group_id = MSG_ROUTING_NONE;
   init_params.stream_id = kStreamId;
   init_params.stream_priority = kStreamPriority;
   init_params.attribs = std::vector<int>();
   init_params.active_url = GURL();
   init_params.gpu_preference = gfx::PreferIntegratedGpu;
-  bool succeeded = false;
+  bool result = false;
+  gpu::Capabilities capabilities;
   HandleMessage(channel, new GpuChannelMsg_CreateCommandBuffer(
-                             kNullSurfaceHandle, gfx::Size(1, 1),
-                             init_params, kRouteId, &succeeded));
-  EXPECT_TRUE(succeeded);
+                             init_params, kRouteId, GetSharedHandle(), &result,
+                             &capabilities));
+  EXPECT_TRUE(result);
 
   GpuCommandBufferStub* stub = channel->LookupCommandBuffer(kRouteId);
   EXPECT_TRUE(stub);
 }
 
 TEST_F(GpuChannelTest, CreateFailsIfSharedContextIsLost) {
-  // This GLInterface is a stub for the gl driver.
-  std::unique_ptr<gfx::MockGLInterface> gl_interface(
-      new testing::NiceMock<gfx::MockGLInterface>);
-  // std::unique_ptr<gfx::MockGLInterface> gl_interface(new
-  // gfx::MockGLInterface);
-  gfx::MockGLInterface::SetGLInterface(gl_interface.get());
-
-  using testing::AnyNumber;
-  using testing::NotNull;
-  using testing::Return;
-  using testing::SetArgPointee;
-  using testing::SetArrayArgument;
-  // We need it to return non-null strings in order for things to not crash.
-  EXPECT_CALL(*gl_interface, GetString(GL_RENDERER))
-      .Times(AnyNumber())
-      .WillRepeatedly(Return(reinterpret_cast<const GLubyte*>("")));
-  EXPECT_CALL(*gl_interface, GetString(GL_VERSION))
-      .Times(AnyNumber())
-      .WillRepeatedly(Return(reinterpret_cast<const GLubyte*>("2.0")));
-  EXPECT_CALL(*gl_interface, GetString(GL_EXTENSIONS))
-      .Times(AnyNumber())
-      .WillRepeatedly(Return(
-          reinterpret_cast<const GLubyte*>("GL_EXT_framebuffer_object ")));
-  // And we need some values to be large enough to initialize ContextGroup.
-  EXPECT_CALL(*gl_interface, GetIntegerv(GL_MAX_RENDERBUFFER_SIZE, NotNull()))
-      .Times(AnyNumber())
-      .WillRepeatedly(SetArgPointee<1>(512));
-  EXPECT_CALL(*gl_interface, GetIntegerv(GL_MAX_VERTEX_ATTRIBS, NotNull()))
-      .Times(AnyNumber())
-      .WillRepeatedly(SetArgPointee<1>(8));
-  EXPECT_CALL(*gl_interface,
-              GetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, NotNull()))
-      .Times(AnyNumber())
-      .WillRepeatedly(SetArgPointee<1>(8));
-  EXPECT_CALL(*gl_interface, GetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, NotNull()))
-      .Times(AnyNumber())
-      .WillRepeatedly(SetArgPointee<1>(8));
-  EXPECT_CALL(*gl_interface, GetIntegerv(GL_MAX_TEXTURE_SIZE, NotNull()))
-      .Times(AnyNumber())
-      .WillRepeatedly(SetArgPointee<1>(2048));
-  EXPECT_CALL(*gl_interface,
-              GetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, NotNull()))
-      .Times(AnyNumber())
-      .WillRepeatedly(SetArgPointee<1>(2048));
-  EXPECT_CALL(*gl_interface, GetIntegerv(GL_MAX_VARYING_FLOATS, NotNull()))
-      .Times(AnyNumber())
-      .WillRepeatedly(SetArgPointee<1>(8 * 4));
-  EXPECT_CALL(*gl_interface,
-              GetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS, NotNull()))
-      .Times(AnyNumber())
-      .WillRepeatedly(SetArgPointee<1>(128 * 4));
-  EXPECT_CALL(*gl_interface,
-              GetIntegerv(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS, NotNull()))
-      .Times(AnyNumber())
-      .WillRepeatedly(SetArgPointee<1>(16 * 4));
-  EXPECT_CALL(*gl_interface,
-              GetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, NotNull()))
-      .Times(AnyNumber())
-      .WillRepeatedly(SetArgPointee<1>(32));
-  EXPECT_CALL(*gl_interface, GetIntegerv(GL_MAX_VIEWPORT_DIMS, NotNull()))
-      .Times(AnyNumber())
-      .WillRepeatedly(SetArgPointee<1>(1024 << 8));
-  // Allow generating non-0 resources so code does not DCHECK.
-  EXPECT_CALL(*gl_interface, GenFramebuffersEXT(1, NotNull()))
-      .Times(AnyNumber())
-      .WillRepeatedly(SetArgPointee<1>(1));
-  int texture_ids[] = {1, 2};
-  EXPECT_CALL(*gl_interface, GenTextures(1, NotNull()))
-      .Times(AnyNumber())
-      .WillRepeatedly(SetArrayArgument<1>(texture_ids, texture_ids + 1));
-  EXPECT_CALL(*gl_interface, GenTextures(2, NotNull()))
-      .Times(AnyNumber())
-      .WillRepeatedly(SetArrayArgument<1>(texture_ids, texture_ids + 2));
-  // And errors should be squashed.
-  EXPECT_CALL(*gl_interface, CheckFramebufferStatusEXT(GL_FRAMEBUFFER))
-      .Times(AnyNumber())
-      .WillRepeatedly(Return(GL_FRAMEBUFFER_COMPLETE));
-
-  // Dynamic bindings must be set up for the GLES2DecoderImpl, which requires a
-  // GLContext. Use a GLContextStub which does nothing but call through to our
-  // |gl_interface| above.
-  scoped_refptr<gfx::GLContextStub> context(new gfx::GLContextStub);
-  scoped_refptr<gfx::GLSurfaceStub> surface(new gfx::GLSurfaceStub);
-  context->MakeCurrent(surface.get());
-  gfx::GLSurfaceTestSupport::InitializeDynamicMockBindings(context.get());
-
-  base::TestMessageLoop message_loop;
-
   int32_t kClientId = 1;
   GpuChannel* channel = CreateChannel(kClientId, false, false);
   ASSERT_TRUE(channel);
@@ -401,52 +457,42 @@
   {
     SCOPED_TRACE("kSharedRouteId");
     GPUCreateCommandBufferConfig init_params;
+    init_params.surface_handle = kNullSurfaceHandle;
+    init_params.size = gfx::Size(1, 1);
     init_params.share_group_id = MSG_ROUTING_NONE;
     init_params.stream_id = 0;
     init_params.stream_priority = GpuStreamPriority::NORMAL;
     init_params.attribs = std::vector<int>();
     init_params.active_url = GURL();
     init_params.gpu_preference = gfx::PreferIntegratedGpu;
-    bool succeeded = false;
+    bool result = false;
+    gpu::Capabilities capabilities;
     HandleMessage(channel, new GpuChannelMsg_CreateCommandBuffer(
-                               kNullSurfaceHandle, gfx::Size(1, 1), init_params,
-                               kSharedRouteId, &succeeded));
-    EXPECT_TRUE(succeeded);
+                               init_params, kSharedRouteId, GetSharedHandle(),
+                               &result, &capabilities));
+    EXPECT_TRUE(result);
   }
   EXPECT_TRUE(channel->LookupCommandBuffer(kSharedRouteId));
 
-  // Initialize the command buffer.
-  {
-    SCOPED_TRACE("kSharedRouteId::Initialize");
-    base::SharedMemory shmem;
-    shmem.CreateAnonymous(10);
-    base::SharedMemoryHandle shmem_handle;
-    shmem.ShareToProcess(base::GetCurrentProcessHandle(), &shmem_handle);
-
-    gpu::Capabilities capabilities;
-    bool succeeded = false;
-    HandleMessage(channel,
-                  new GpuCommandBufferMsg_Initialize(
-                      kSharedRouteId, shmem_handle, &succeeded, &capabilities));
-    EXPECT_TRUE(succeeded);
-  }
-
   // This context shares with the first one, this should be possible.
   int32_t kFriendlyRouteId = 2;
   {
     SCOPED_TRACE("kFriendlyRouteId");
     GPUCreateCommandBufferConfig init_params;
+    init_params.surface_handle = kNullSurfaceHandle;
+    init_params.size = gfx::Size(1, 1);
     init_params.share_group_id = kSharedRouteId;
     init_params.stream_id = 0;
     init_params.stream_priority = GpuStreamPriority::NORMAL;
     init_params.attribs = std::vector<int>();
     init_params.active_url = GURL();
     init_params.gpu_preference = gfx::PreferIntegratedGpu;
-    bool succeeded = false;
+    bool result = false;
+    gpu::Capabilities capabilities;
     HandleMessage(channel, new GpuChannelMsg_CreateCommandBuffer(
-                               kNullSurfaceHandle, gfx::Size(1, 1), init_params,
-                               kFriendlyRouteId, &succeeded));
-    EXPECT_TRUE(succeeded);
+                               init_params, kFriendlyRouteId, GetSharedHandle(),
+                               &result, &capabilities));
+    EXPECT_TRUE(result);
   }
   EXPECT_TRUE(channel->LookupCommandBuffer(kFriendlyRouteId));
 
@@ -459,17 +505,20 @@
   {
     SCOPED_TRACE("kAnotherRouteId");
     GPUCreateCommandBufferConfig init_params;
+    init_params.surface_handle = kNullSurfaceHandle;
+    init_params.size = gfx::Size(1, 1);
     init_params.share_group_id = kSharedRouteId;
     init_params.stream_id = 0;
     init_params.stream_priority = GpuStreamPriority::NORMAL;
     init_params.attribs = std::vector<int>();
     init_params.active_url = GURL();
     init_params.gpu_preference = gfx::PreferIntegratedGpu;
-    bool succeeded = false;
+    bool result = false;
+    gpu::Capabilities capabilities;
     HandleMessage(channel, new GpuChannelMsg_CreateCommandBuffer(
-                               kNullSurfaceHandle, gfx::Size(1, 1), init_params,
-                               kAnotherRouteId, &succeeded));
-    EXPECT_FALSE(succeeded);
+                               init_params, kAnotherRouteId, GetSharedHandle(),
+                               &result, &capabilities));
+    EXPECT_FALSE(result);
   }
   EXPECT_FALSE(channel->LookupCommandBuffer(kAnotherRouteId));
 
@@ -477,14 +526,11 @@
   // to the shared context being lost, not due to it being deleted).
   EXPECT_TRUE(channel->LookupCommandBuffer(kSharedRouteId));
 
-  // Destroy the command buffer we initialized before destoying GL.
+  // Destroy the command buffers we initialized before destoying GL.
+  HandleMessage(channel,
+                new GpuChannelMsg_DestroyCommandBuffer(kFriendlyRouteId));
   HandleMessage(channel,
                 new GpuChannelMsg_DestroyCommandBuffer(kSharedRouteId));
-
-  context = nullptr;
-  surface = nullptr;
-  gfx::MockGLInterface::SetGLInterface(nullptr);
-  gfx::ClearGLBindings();
 }
 
 }  // namespace gpu
diff --git a/gpu/ipc/service/gpu_command_buffer_stub.cc b/gpu/ipc/service/gpu_command_buffer_stub.cc
index 6032dab..adc9cea0 100644
--- a/gpu/ipc/service/gpu_command_buffer_stub.cc
+++ b/gpu/ipc/service/gpu_command_buffer_stub.cc
@@ -38,9 +38,11 @@
 #include "gpu/ipc/service/gpu_watchdog.h"
 #include "gpu/ipc/service/image_transport_surface.h"
 #include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_context.h"
 #include "ui/gl/gl_image.h"
 #include "ui/gl/gl_implementation.h"
 #include "ui/gl/gl_switches.h"
+#include "ui/gl/init/gl_factory.h"
 
 #if defined(OS_WIN)
 #include "base/win/win_util.h"
@@ -291,8 +293,6 @@
   // here. This is so the reply can be delayed if the scheduler is unscheduled.
   bool handled = true;
   IPC_BEGIN_MESSAGE_MAP(GpuCommandBufferStub, message)
-    IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_Initialize,
-                                    OnInitialize);
     IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_SetGetBuffer,
                                     OnSetGetBuffer);
     IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_TakeFrontBuffer, OnTakeFrontBuffer);
@@ -503,13 +503,6 @@
   surface_ = NULL;
 }
 
-void GpuCommandBufferStub::OnInitializeFailed(IPC::Message* reply_message) {
-  Destroy();
-  GpuCommandBufferMsg_Initialize::WriteReplyParams(
-      reply_message, false, Capabilities());
-  Send(reply_message);
-}
-
 scoped_refptr<gfx::GLSurface> GpuCommandBufferStub::CreateSurface() {
   GpuChannelManager* manager = channel_->gpu_channel_manager();
   scoped_refptr<gfx::GLSurface> surface;
@@ -524,10 +517,9 @@
   return surface;
 }
 
-void GpuCommandBufferStub::OnInitialize(
-    base::SharedMemoryHandle shared_state_handle,
-    IPC::Message* reply_message) {
-  TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnInitialize");
+bool GpuCommandBufferStub::Initialize(
+    base::SharedMemoryHandle shared_state_handle) {
+  TRACE_EVENT0("gpu", "GpuCommandBufferStub::Initialize");
   DCHECK(!command_buffer_.get());
 
   std::unique_ptr<base::SharedMemory> shared_state_shm(
@@ -554,8 +546,7 @@
   surface_ = CreateSurface();
   if (!surface_.get()) {
     DLOG(ERROR) << "Failed to create surface.";
-    OnInitializeFailed(reply_message);
-    return;
+    return false;
   }
 
   scoped_refptr<gfx::GLContext> context;
@@ -563,14 +554,13 @@
   if (use_virtualized_gl_context_ && share_group) {
     context = share_group->GetSharedContext();
     if (!context.get()) {
-      context = gfx::GLContext::CreateGLContext(
-          share_group,
+      context = gl::init::CreateGLContext(
+          channel_->share_group(),
           channel_->gpu_channel_manager()->GetDefaultOffscreenSurface(),
           gpu_preference_);
       if (!context.get()) {
         DLOG(ERROR) << "Failed to create shared context for virtualization.";
-        OnInitializeFailed(reply_message);
-        return;
+        return false;
       }
       // Ensure that context creation did not lose track of the intended
       // share_group.
@@ -590,24 +580,21 @@
       context = NULL;
 
       DLOG(ERROR) << "Failed to initialize virtual GL context.";
-      OnInitializeFailed(reply_message);
-      return;
+      return false;
     }
   }
   if (!context.get()) {
-    context = gfx::GLContext::CreateGLContext(
-        share_group, surface_.get(), gpu_preference_);
+    context =
+        gl::init::CreateGLContext(share_group, surface_.get(), gpu_preference_);
   }
   if (!context.get()) {
     DLOG(ERROR) << "Failed to create context.";
-    OnInitializeFailed(reply_message);
-    return;
+    return false;
   }
 
   if (!context->MakeCurrent(surface_.get())) {
     LOG(ERROR) << "Failed to make context current.";
-    OnInitializeFailed(reply_message);
-    return;
+    return false;
   }
 
   if (!context->GetGLStateRestorer()) {
@@ -626,8 +613,7 @@
   if (!decoder_->Initialize(surface_, context, offscreen, initial_size_,
                             disallowed_features_, requested_attribs_)) {
     DLOG(ERROR) << "Failed to initialize decoder.";
-    OnInitializeFailed(reply_message);
-    return;
+    return false;
   }
 
   if (channel_->gpu_channel_manager()->
@@ -661,22 +647,16 @@
   const size_t kSharedStateSize = sizeof(CommandBufferSharedState);
   if (!shared_state_shm->Map(kSharedStateSize)) {
     DLOG(ERROR) << "Failed to map shared state buffer.";
-    OnInitializeFailed(reply_message);
-    return;
+    return false;
   }
   command_buffer_->SetSharedStateBuffer(MakeBackingFromSharedMemory(
       std::move(shared_state_shm), kSharedStateSize));
 
-  Capabilities capabilities = decoder_->GetCapabilities();
-
-  GpuCommandBufferMsg_Initialize::WriteReplyParams(
-      reply_message, true, capabilities);
-  Send(reply_message);
-
   if ((surface_handle_ == kNullSurfaceHandle) && !active_url_.is_empty())
     manager->delegate()->DidCreateOffscreenContext(active_url_);
 
   initialized_ = true;
+  return true;
 }
 
 void GpuCommandBufferStub::OnCreateStreamTexture(uint32_t texture_id,
diff --git a/gpu/ipc/service/gpu_command_buffer_stub.h b/gpu/ipc/service/gpu_command_buffer_stub.h
index 9a2f4c4..811ca5d 100644
--- a/gpu/ipc/service/gpu_command_buffer_stub.h
+++ b/gpu/ipc/service/gpu_command_buffer_stub.h
@@ -88,6 +88,7 @@
       int32_t route_id,
       GpuWatchdog* watchdog,
       const GURL& active_url);
+  bool Initialize(base::SharedMemoryHandle shared_state_shm);
 
   ~GpuCommandBufferStub() override;
 
@@ -151,14 +152,9 @@
 
   bool MakeCurrent();
 
-  // Cleans up and sends reply if OnInitialize failed.
-  void OnInitializeFailed(IPC::Message* reply_message);
-
   scoped_refptr<gfx::GLSurface> CreateSurface();
 
   // Message handlers:
-  void OnInitialize(base::SharedMemoryHandle shared_state_shm,
-                    IPC::Message* reply_message);
   void OnSetGetBuffer(int32_t shm_id, IPC::Message* reply_message);
   void OnTakeFrontBuffer(const Mailbox& mailbox);
   void OnReturnFrontBuffer(const Mailbox& mailbox,
diff --git a/gpu/ipc/service/image_transport_surface_android.cc b/gpu/ipc/service/image_transport_surface_android.cc
index ce1ad886..e73080ca 100644
--- a/gpu/ipc/service/image_transport_surface_android.cc
+++ b/gpu/ipc/service/image_transport_surface_android.cc
@@ -8,6 +8,7 @@
 #include "gpu/ipc/common/gpu_surface_lookup.h"
 #include "gpu/ipc/service/pass_through_image_transport_surface.h"
 #include "ui/gl/gl_surface_egl.h"
+#include "ui/gl/gl_surface_stub.h"
 
 namespace gpu {
 
@@ -17,6 +18,8 @@
     GpuCommandBufferStub* stub,
     SurfaceHandle surface_handle,
     gfx::GLSurface::Format format) {
+  if (gfx::GetGLImplementation() == gfx::kGLImplementationMockGL)
+    return new gfx::GLSurfaceStub;
   DCHECK(GpuSurfaceLookup::GetInstance());
   DCHECK_NE(surface_handle, kNullSurfaceHandle);
   // On Android, the surface_handle is the id of the surface in the
diff --git a/gpu/ipc/service/image_transport_surface_linux.cc b/gpu/ipc/service/image_transport_surface_linux.cc
index 9f60d45..24e21ae 100644
--- a/gpu/ipc/service/image_transport_surface_linux.cc
+++ b/gpu/ipc/service/image_transport_surface_linux.cc
@@ -5,6 +5,7 @@
 #include "gpu/ipc/service/image_transport_surface.h"
 
 #include "gpu/ipc/service/pass_through_image_transport_surface.h"
+#include "ui/gl/init/gl_factory.h"
 
 namespace gpu {
 
@@ -17,10 +18,10 @@
   DCHECK_NE(surface_handle, kNullSurfaceHandle);
   scoped_refptr<gfx::GLSurface> surface;
 #if defined(USE_OZONE)
-  surface = gfx::GLSurface::CreateSurfacelessViewGLSurface(surface_handle);
+  surface = gl::init::CreateSurfacelessViewGLSurface(surface_handle);
 #endif
   if (!surface)
-    surface = gfx::GLSurface::CreateViewGLSurface(surface_handle);
+    surface = gl::init::CreateViewGLSurface(surface_handle);
   if (!surface)
     return surface;
   return scoped_refptr<gfx::GLSurface>(new PassThroughImageTransportSurface(
diff --git a/gpu/ipc/service/image_transport_surface_mac.mm b/gpu/ipc/service/image_transport_surface_mac.mm
index 56da79f..0fc6589f 100644
--- a/gpu/ipc/service/image_transport_surface_mac.mm
+++ b/gpu/ipc/service/image_transport_surface_mac.mm
@@ -8,6 +8,7 @@
 #include "gpu/ipc/service/pass_through_image_transport_surface.h"
 #include "ui/gfx/native_widget_types.h"
 #include "ui/gl/gl_surface_osmesa.h"
+#include "ui/gl/gl_surface_stub.h"
 
 namespace gpu {
 
@@ -56,6 +57,8 @@
     case gfx::kGLImplementationAppleGL:
       return ImageTransportSurfaceCreateNativeSurface(manager, stub,
                                                       surface_handle);
+    case gfx::kGLImplementationMockGL:
+      return new gfx::GLSurfaceStub;
     default:
       // Content shell in DRT mode spins up a gpu process which needs an
       // image transport surface, but that surface isn't used to read pixel
diff --git a/gpu/ipc/service/image_transport_surface_win.cc b/gpu/ipc/service/image_transport_surface_win.cc
index 7cc4454..3bc4faed 100644
--- a/gpu/ipc/service/image_transport_surface_win.cc
+++ b/gpu/ipc/service/image_transport_surface_win.cc
@@ -12,6 +12,7 @@
 #include "ui/gl/gl_bindings.h"
 #include "ui/gl/gl_implementation.h"
 #include "ui/gl/gl_surface_egl.h"
+#include "ui/gl/init/gl_factory.h"
 #include "ui/gl/vsync_provider_win.h"
 
 namespace gpu {
@@ -37,7 +38,7 @@
     if (!egl_surface->Initialize(std::move(vsync_provider)))
       return nullptr;
   } else {
-    surface = gfx::GLSurface::CreateViewGLSurface(surface_handle);
+    surface = gl::init::CreateViewGLSurface(surface_handle);
     if (!surface)
       return nullptr;
   }
diff --git a/gpu/perftests/texture_upload_perftest.cc b/gpu/perftests/texture_upload_perftest.cc
index 3cbcd07..86eeb021d 100644
--- a/gpu/perftests/texture_upload_perftest.cc
+++ b/gpu/perftests/texture_upload_perftest.cc
@@ -25,6 +25,7 @@
 #include "ui/gl/gl_surface.h"
 #include "ui/gl/gl_version_info.h"
 #include "ui/gl/gpu_timing.h"
+#include "ui/gl/init/gl_factory.h"
 #include "ui/gl/scoped_make_current.h"
 
 #if defined(USE_OZONE)
@@ -183,13 +184,13 @@
     // thread.
     base::MessageLoopForUI main_loop;
 #endif
-    static bool gl_initialized = gfx::GLSurface::InitializeOneOff();
+    static bool gl_initialized = gl::init::InitializeGLOneOff();
     DCHECK(gl_initialized);
     // Initialize an offscreen surface and a gl context.
-    surface_ = gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size());
-    gl_context_ = gfx::GLContext::CreateGLContext(NULL,  // share_group
-                                                  surface_.get(),
-                                                  gfx::PreferIntegratedGpu);
+    surface_ = gl::init::CreateOffscreenGLSurface(gfx::Size());
+    gl_context_ =
+        gl::init::CreateGLContext(nullptr,  // share_group
+                                  surface_.get(), gfx::PreferIntegratedGpu);
     ui::ScopedMakeCurrent smc(gl_context_.get(), surface_.get());
     glGenTextures(1, &color_texture_);
     glBindTexture(GL_TEXTURE_2D, color_texture_);
diff --git a/gpu/tools/compositor_model_bench/BUILD.gn b/gpu/tools/compositor_model_bench/BUILD.gn
index b074ee77..fbef186 100644
--- a/gpu/tools/compositor_model_bench/BUILD.gn
+++ b/gpu/tools/compositor_model_bench/BUILD.gn
@@ -24,6 +24,7 @@
       "//base",
       "//build/config/sanitizers:deps",
       "//ui/gl",
+      "//ui/gl/init",
     ]
   }
 }
diff --git a/gpu/tools/compositor_model_bench/compositor_model_bench.cc b/gpu/tools/compositor_model_bench/compositor_model_bench.cc
index 4d77353..dca35a7 100644
--- a/gpu/tools/compositor_model_bench/compositor_model_bench.cc
+++ b/gpu/tools/compositor_model_bench/compositor_model_bench.cc
@@ -35,7 +35,7 @@
 #include "gpu/tools/compositor_model_bench/render_model_utils.h"
 #include "gpu/tools/compositor_model_bench/render_models.h"
 #include "gpu/tools/compositor_model_bench/render_tree.h"
-#include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 
 using base::TimeTicks;
 using base::DirectoryExists;
@@ -186,8 +186,8 @@
 
   // Initialize the OpenGL context.
   bool InitGLContext() {
-    if (!gfx::GLSurface::InitializeOneOff()) {
-      LOG(FATAL) << "gfx::GLSurface::InitializeOneOff failed";
+    if (!gl::init::InitializeGLOneOff()) {
+      LOG(FATAL) << "gl::init::InitializeGLOneOff failed";
       return false;
     }
 
diff --git a/gpu/tools/tools.gyp b/gpu/tools/tools.gyp
index 342a769..c2109c13 100644
--- a/gpu/tools/tools.gyp
+++ b/gpu/tools/tools.gyp
@@ -19,6 +19,7 @@
             '../../base/base.gyp:base',
             '../../build/linux/system.gyp:x11',
             '../../ui/gl/gl.gyp:gl',
+            '../../ui/gl/init/gl_init.gyp:gl_init',
           ],
           'libraries': [
             '-lGL',
diff --git a/ios/chrome/browser/ui/autofill/autofill_client_ios.mm b/ios/chrome/browser/ui/autofill/autofill_client_ios.mm
index 0b9202db9..fc379e7 100644
--- a/ios/chrome/browser/ui/autofill/autofill_client_ios.mm
+++ b/ios/chrome/browser/ui/autofill/autofill_client_ios.mm
@@ -19,6 +19,7 @@
 #include "components/password_manager/core/browser/password_generation_manager.h"
 #include "components/prefs/pref_service.h"
 #include "google_apis/gaia/identity_provider.h"
+#include "ios/chrome/browser/application_context.h"
 #include "ios/chrome/browser/autofill/personal_data_manager_factory.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/web_data_service_factory.h"
@@ -63,11 +64,8 @@
   return identity_provider_.get();
 }
 
-// TODO(dconnelly): [Merge] Does this need a real implementation?
-// http://crbug.com/468326
 rappor::RapporService* AutofillClientIOS::GetRapporService() {
-  NOTIMPLEMENTED();
-  return nullptr;
+  return GetApplicationContext()->GetRapporService();
 }
 
 void AutofillClientIOS::ShowAutofillSettings() {
diff --git a/ipc/attachment_broker.cc b/ipc/attachment_broker.cc
index f53a4cf0..e274144 100644
--- a/ipc/attachment_broker.cc
+++ b/ipc/attachment_broker.cc
@@ -100,6 +100,10 @@
   NOTREACHED();
 }
 
+void AttachmentBroker::ReceivedPeerPid(base::ProcessId peer_pid) {
+  NOTREACHED();
+}
+
 bool AttachmentBroker::IsPrivilegedBroker() {
   NOTREACHED();
   return false;
diff --git a/ipc/attachment_broker.h b/ipc/attachment_broker.h
index 70383ed..a106e29 100644
--- a/ipc/attachment_broker.h
+++ b/ipc/attachment_broker.h
@@ -107,6 +107,10 @@
   virtual void RegisterBrokerCommunicationChannel(Endpoint* endpoint);
   virtual void DeregisterBrokerCommunicationChannel(Endpoint* endpoint);
 
+  // Informs the attachment broker that a channel endpoint has received its
+  // peer's PID.
+  virtual void ReceivedPeerPid(base::ProcessId peer_pid);
+
   // True if and only if this broker is privileged.
   virtual bool IsPrivilegedBroker();
 
diff --git a/ipc/attachment_broker_privileged.h b/ipc/attachment_broker_privileged.h
index 8be24ac..36069c1 100644
--- a/ipc/attachment_broker_privileged.h
+++ b/ipc/attachment_broker_privileged.h
@@ -71,7 +71,7 @@
   void SendMessageToEndpoint(EndpointRunnerPair pair, Message* message);
 
   // Errors that can be reported by subclasses.
-  // These match tools/metrics/histograms.xml.
+  // These match tools/metrics/histograms/histograms.xml.
   // This enum is append-only.
   enum UMAError {
     // The brokerable attachment had a valid destination. This is the success
@@ -108,6 +108,10 @@
     ERROR_COULD_NOT_OPEN_SOURCE_OR_DEST = 13,
     // The broker was asked to transfer a HANDLE with invalid permissions.
     ERROR_INVALID_PERMISSIONS = 14,
+    // The broker was not immediately able to send an attachment.
+    DELAYED = 15,
+    // The broker successfully sent a delayed attachment.
+    DELAYED_SEND = 16,
     ERROR_MAX
   };
 
diff --git a/ipc/attachment_broker_privileged_mac.cc b/ipc/attachment_broker_privileged_mac.cc
index 9dc7635..1a3bcca 100644
--- a/ipc/attachment_broker_privileged_mac.cc
+++ b/ipc/attachment_broker_privileged_mac.cc
@@ -54,7 +54,7 @@
                    base::mac::ScopedMachSendRight(wire_format.mach_port),
                    wire_format.attachment_id);
       mach_port_attachment->reset_mach_port_ownership();
-      SendPrecursorsForProcess(wire_format.destination_process);
+      SendPrecursorsForProcess(wire_format.destination_process, true);
       return true;
     }
     default:
@@ -94,6 +94,11 @@
   }
 }
 
+void AttachmentBrokerPrivilegedMac::ReceivedPeerPid(base::ProcessId peer_pid) {
+  ProcessExtractorsForProcess(peer_pid, false);
+  SendPrecursorsForProcess(peer_pid, false);
+}
+
 bool AttachmentBrokerPrivilegedMac::OnMessageReceived(const Message& msg) {
   bool handled = true;
   switch (msg.type()) {
@@ -106,7 +111,7 @@
 
 void AttachmentBrokerPrivilegedMac::OnReceivedTaskPort(
     base::ProcessHandle process) {
-  SendPrecursorsForProcess(process);
+  SendPrecursorsForProcess(process, true);
 }
 
 AttachmentBrokerPrivilegedMac::AttachmentPrecursor::AttachmentPrecursor(
@@ -152,7 +157,7 @@
 
   AddExtractor(message.get_sender_pid(), wire_format.destination_process,
                wire_format.mach_port, wire_format.attachment_id);
-  ProcessExtractorsForProcess(message.get_sender_pid());
+  ProcessExtractorsForProcess(message.get_sender_pid(), true);
 }
 
 void AttachmentBrokerPrivilegedMac::RoutePrecursorToSelf(
@@ -177,9 +182,9 @@
   AttachmentBrokerPrivileged::EndpointRunnerPair pair =
       GetSenderWithProcessId(dest);
   if (!pair.first) {
-    // Assuming that this message was not sent from a malicious process, the
-    // channel endpoint that would have received this message will block
-    // forever.
+    // The extractor was successfully processed, which implies that the
+    // communication channel was established. This implies that the
+    // communication was taken down in the interim.
     LOG(ERROR) << "Failed to deliver brokerable attachment to process with id: "
                << dest;
     LogError(DESTINATION_NOT_FOUND);
@@ -223,7 +228,8 @@
 }
 
 void AttachmentBrokerPrivilegedMac::SendPrecursorsForProcess(
-    base::ProcessId pid) {
+    base::ProcessId pid,
+    bool store_on_failure) {
   base::AutoLock l(precursors_lock_);
   auto it = precursors_.find(pid);
   if (it == precursors_.end())
@@ -237,11 +243,15 @@
     AttachmentBrokerPrivileged::EndpointRunnerPair pair =
         GetSenderWithProcessId(pid);
     if (!pair.first) {
-      // If there is no sender, then the destination process is no longer
-      // running, or never existed to begin with.
-      LogError(DESTINATION_NOT_FOUND);
-      delete it->second;
-      precursors_.erase(it);
+      if (store_on_failure) {
+        // Try again later.
+        LogError(DELAYED);
+      } else {
+        // If there is no sender, then permanently fail.
+        LogError(DESTINATION_NOT_FOUND);
+        delete it->second;
+        precursors_.erase(it);
+      }
       return;
     }
   }
@@ -318,7 +328,8 @@
 }
 
 void AttachmentBrokerPrivilegedMac::ProcessExtractorsForProcess(
-    base::ProcessId pid) {
+    base::ProcessId pid,
+    bool store_on_failure) {
   base::AutoLock l(extractors_lock_);
   auto it = extractors_.find(pid);
   if (it == extractors_.end())
@@ -329,10 +340,16 @@
     AttachmentBrokerPrivileged::EndpointRunnerPair pair =
         GetSenderWithProcessId(pid);
     if (!pair.first) {
-      // If there is no sender, then the source process is no longer running.
-      LogError(ERROR_SOURCE_NOT_FOUND);
-      delete it->second;
-      extractors_.erase(it);
+      if (store_on_failure) {
+        // If there is no sender, then the communication channel with the source
+        // process has not yet been established. Try again later.
+        LogError(DELAYED);
+      } else {
+        // There is no sender. Permanently fail.
+        LogError(ERROR_SOURCE_NOT_FOUND);
+        delete it->second;
+        extractors_.erase(it);
+      }
       return;
     }
   }
@@ -363,7 +380,7 @@
   AddPrecursor(extractor->dest_pid(),
                base::mac::ScopedMachSendRight(send_right.release()),
                extractor->id());
-  SendPrecursorsForProcess(extractor->dest_pid());
+  SendPrecursorsForProcess(extractor->dest_pid(), true);
 }
 
 void AttachmentBrokerPrivilegedMac::AddExtractor(
diff --git a/ipc/attachment_broker_privileged_mac.h b/ipc/attachment_broker_privileged_mac.h
index 0393fe1..9122a16 100644
--- a/ipc/attachment_broker_privileged_mac.h
+++ b/ipc/attachment_broker_privileged_mac.h
@@ -66,6 +66,7 @@
       const scoped_refptr<IPC::BrokerableAttachment>& attachment,
       base::ProcessId destination_process) override;
   void DeregisterCommunicationChannel(Endpoint* endpoint) override;
+  void ReceivedPeerPid(base::ProcessId peer_pid) override;
 
   // IPC::Listener overrides.
   bool OnMessageReceived(const Message& message) override;
@@ -167,7 +168,10 @@
 
   // Atempts to broker all precursors whose destination is |pid|. Has no effect
   // if |port_provider_| does not have the task port for |pid|.
-  void SendPrecursorsForProcess(base::ProcessId pid);
+  // If a communication channel has not been established from the destination
+  // process, and |store_on_failure| is true, then the precursor is kept for
+  // later reuse. If |store_on_failure| is false, then the precursor is deleted.
+  void SendPrecursorsForProcess(base::ProcessId pid, bool store_on_failure);
 
   // Brokers a single precursor into the task represented by |task_port|.
   // Returns |false| on irrecoverable error.
@@ -180,7 +184,10 @@
 
   // Atempts to process all extractors whose source is |pid|. Has no effect
   // if |port_provider_| does not have the task port for |pid|.
-  void ProcessExtractorsForProcess(base::ProcessId pid);
+  // If a communication channel has not been established from the source
+  // process, and |store_on_failure| is true, then the extractor is kept for
+  // later reuse. If |store_on_failure| is false, then the extractor is deleted.
+  void ProcessExtractorsForProcess(base::ProcessId pid, bool store_on_failure);
 
   // Processes a single extractor whose source pid is represented by
   // |task_port|.
diff --git a/ipc/attachment_broker_privileged_win.cc b/ipc/attachment_broker_privileged_win.cc
index 0647012..ca7f9c6 100644
--- a/ipc/attachment_broker_privileged_win.cc
+++ b/ipc/attachment_broker_privileged_win.cc
@@ -34,7 +34,7 @@
       handle_attachment->reset_handle_ownership();
       if (new_wire_format.handle == 0)
         return false;
-      RouteDuplicatedHandle(new_wire_format);
+      RouteDuplicatedHandle(new_wire_format, true);
       return true;
     }
     case BrokerableAttachment::MACH_PORT:
@@ -45,6 +45,20 @@
   return false;
 }
 
+void AttachmentBrokerPrivilegedWin::ReceivedPeerPid(base::ProcessId peer_pid) {
+  auto it = stored_wire_formats_.find(peer_pid);
+  if (it == stored_wire_formats_.end())
+    return;
+
+  // Make a copy, and destroy the original.
+  WireFormats wire_formats = it->second;
+  stored_wire_formats_.erase(it);
+
+  for (const HandleWireFormat& format : wire_formats) {
+    RouteDuplicatedHandle(format, false);
+  }
+}
+
 bool AttachmentBrokerPrivilegedWin::OnMessageReceived(const Message& msg) {
   bool handled = true;
   switch (msg.type()) {
@@ -70,11 +84,12 @@
 
   HandleWireFormat new_wire_format =
       DuplicateWinHandle(wire_format, message.get_sender_pid());
-  RouteDuplicatedHandle(new_wire_format);
+  RouteDuplicatedHandle(new_wire_format, true);
 }
 
 void AttachmentBrokerPrivilegedWin::RouteDuplicatedHandle(
-    const HandleWireFormat& wire_format) {
+    const HandleWireFormat& wire_format,
+    bool store_on_failure) {
   // This process is the destination.
   if (wire_format.destination_process == base::Process::Current().Pid()) {
     scoped_refptr<BrokerableAttachment> attachment(
@@ -89,16 +104,25 @@
   AttachmentBrokerPrivileged::EndpointRunnerPair pair =
       GetSenderWithProcessId(dest);
   if (!pair.first) {
-    // Assuming that this message was not sent from a malicious process, the
-    // channel endpoint that would have received this message will block
-    // forever.
-    LOG(ERROR) << "Failed to deliver brokerable attachment to process with id: "
-               << dest;
-    LogError(DESTINATION_NOT_FOUND);
+    if (store_on_failure) {
+      LogError(DELAYED);
+      stored_wire_formats_[dest].push_back(wire_format);
+    } else {
+      // Assuming that this message was not sent from a malicious process, the
+      // channel endpoint that would have received this message will block
+      // forever.
+      LOG(ERROR)
+          << "Failed to deliver brokerable attachment to process with id: "
+          << dest;
+      LogError(DESTINATION_NOT_FOUND);
+    }
     return;
   }
 
   LogError(DESTINATION_FOUND);
+  if (!store_on_failure)
+    LogError(DELAYED_SEND);
+
   SendMessageToEndpoint(
       pair, new AttachmentBrokerMsg_WinHandleHasBeenDuplicated(wire_format));
 }
diff --git a/ipc/attachment_broker_privileged_win.h b/ipc/attachment_broker_privileged_win.h
index 467a977..bf2eec82 100644
--- a/ipc/attachment_broker_privileged_win.h
+++ b/ipc/attachment_broker_privileged_win.h
@@ -5,6 +5,9 @@
 #ifndef IPC_ATTACHMENT_BROKER_PRIVILEGED_WIN_H_
 #define IPC_ATTACHMENT_BROKER_PRIVILEGED_WIN_H_
 
+#include <map>
+#include <vector>
+
 #include "base/macros.h"
 #include "ipc/attachment_broker_privileged.h"
 #include "ipc/handle_attachment_win.h"
@@ -24,6 +27,7 @@
   bool SendAttachmentToProcess(
       const scoped_refptr<IPC::BrokerableAttachment>& attachment,
       base::ProcessId destination_process) override;
+  void ReceivedPeerPid(base::ProcessId peer_pid) override;
 
   // IPC::Listener overrides.
   bool OnMessageReceived(const Message& message) override;
@@ -44,7 +48,23 @@
 
   // If the HANDLE's destination is this process, queue it and notify the
   // observers. Otherwise, send it in an IPC to its destination.
-  void RouteDuplicatedHandle(const HandleWireFormat& wire_format);
+  // If the destination process cannot be found, |store_on_failure| indicates
+  // whether the |wire_format| should be stored, or an error should be emitted.
+  void RouteDuplicatedHandle(const HandleWireFormat& wire_format,
+                             bool store_on_failure);
+
+  // Wire formats that cannot be immediately sent to the destination process
+  // because the connection has not been established. If, for some reason, the
+  // connection is never established, then the assumption is that the
+  // destination process died. The resource itself will be cleaned up by the OS,
+  // but the data structure HandleWireFormat will leak. If, at a later point in
+  // time, a new process is created with the same process id, the WireFormats
+  // will be passed to the new process. There is no security problem, since the
+  // resource itself is not being sent. Furthermore, it is unlikely to affect
+  // the functionality of the new process, since AttachmentBroker ids are large,
+  // unguessable nonces.
+  using WireFormats = std::vector<HandleWireFormat>;
+  std::map<base::ProcessId, WireFormats> stored_wire_formats_;
 
   DISALLOW_COPY_AND_ASSIGN(AttachmentBrokerPrivilegedWin);
 };
diff --git a/ipc/ipc_channel_posix.cc b/ipc/ipc_channel_posix.cc
index fffbd2b..df7a758 100644
--- a/ipc/ipc_channel_posix.cc
+++ b/ipc/ipc_channel_posix.cc
@@ -1017,6 +1017,12 @@
 
       if (!FlushPrelimQueue())
         ClosePipeOnError();
+
+      if (IsAttachmentBrokerEndpoint() &&
+          AttachmentBroker::GetGlobal() &&
+          AttachmentBroker::GetGlobal()->IsPrivilegedBroker()) {
+        AttachmentBroker::GetGlobal()->ReceivedPeerPid(pid);
+      }
       break;
 
 #if defined(OS_MACOSX)
diff --git a/ipc/ipc_channel_win.cc b/ipc/ipc_channel_win.cc
index 8bdb7ae3..4321b04 100644
--- a/ipc/ipc_channel_win.cc
+++ b/ipc/ipc_channel_win.cc
@@ -263,6 +263,11 @@
   listener()->OnChannelConnected(claimed_pid);
 
   FlushPrelimQueue();
+
+  if (IsAttachmentBrokerEndpoint() &&
+      AttachmentBroker::GetGlobal()->IsPrivilegedBroker()) {
+    AttachmentBroker::GetGlobal()->ReceivedPeerPid(claimed_pid);
+  }
 }
 
 base::ProcessId ChannelWin::GetSenderPID() {
diff --git a/mash/BUILD.gn b/mash/BUILD.gn
index 42f43bd..1e437de 100644
--- a/mash/BUILD.gn
+++ b/mash/BUILD.gn
@@ -24,6 +24,7 @@
 
 test("mash_unittests") {
   deps = [
+    "//ash/mus:unittests",
     "//base",
     "//base/test:test_config",
     "//base/test:test_support",
diff --git a/mash/unittests_manifest.json b/mash/unittests_manifest.json
index 07461b1..37ff6fb 100644
--- a/mash/unittests_manifest.json
+++ b/mash/unittests_manifest.json
@@ -5,6 +5,9 @@
   "capabilities": {
     "required": {
       "*": { "classes": [ "app" ] },
+      "mojo:ash_sysui": {
+        "interfaces": [ "mash::shelf::mojom::ShelfController" ]
+      },
       "mojo:desktop_wm": {
         "interfaces": [
           "mus::mojom::AcceleratorRegistrar",
diff --git a/mash/wm/root_window_controller.cc b/mash/wm/root_window_controller.cc
index 8fe32a88..552ed05 100644
--- a/mash/wm/root_window_controller.cc
+++ b/mash/wm/root_window_controller.cc
@@ -6,12 +6,17 @@
 
 #include <stdint.h>
 
+#include <map>
+#include <sstream>
+
 #include "base/bind.h"
 #include "components/mus/common/event_matcher_util.h"
 #include "components/mus/common/util.h"
+#include "components/mus/public/cpp/property_type_converters.h"
 #include "components/mus/public/cpp/window.h"
 #include "components/mus/public/cpp/window_tree_connection.h"
 #include "components/mus/public/cpp/window_tree_host_factory.h"
+#include "components/mus/public/interfaces/window_manager.mojom.h"
 #include "mash/session/public/interfaces/session.mojom.h"
 #include "mash/wm/background_layout.h"
 #include "mash/wm/container_ids.h"
@@ -23,6 +28,7 @@
 #include "mash/wm/window_layout.h"
 #include "mash/wm/window_manager.h"
 #include "mash/wm/window_manager_application.h"
+#include "mojo/public/cpp/bindings/type_converter.h"
 #include "services/shell/public/cpp/connector.h"
 #include "ui/mojo/display/display_type_converters.h"
 
@@ -171,7 +177,15 @@
 void RootWindowController::CreateContainer(
     mash::wm::mojom::Container container,
     mash::wm::mojom::Container parent_container) {
-  mus::Window* window = root_->connection()->NewWindow();
+  // Set the window's name to the container name (e.g. "Container::LOGIN"),
+  // which makes the window hierarchy easier to read.
+  std::map<std::string, std::vector<uint8_t>> properties;
+  std::ostringstream container_name;
+  container_name << container;
+  properties[mus::mojom::WindowManager::kName_Property] =
+      mojo::ConvertTo<std::vector<uint8_t>>(container_name.str());
+
+  mus::Window* window = root_->connection()->NewWindow(&properties);
   window->set_local_id(ContainerToLocalId(container));
   layout_managers_[window].reset(new FillLayout(window));
 
diff --git a/mash/wm/shadow.cc b/mash/wm/shadow.cc
index 5de5c45..b188734 100644
--- a/mash/wm/shadow.cc
+++ b/mash/wm/shadow.cc
@@ -199,8 +199,8 @@
       gfx::Rect(aperture_x, aperture_y,
                 image_size_.width() - aperture_x * 2,
                 image_size_.height() - aperture_y * 2));
-  shadow_layer_->UpdateNinePatchOcclusion(
-      content_bounds_ + gfx::Vector2d(interior_inset_, interior_inset_));
+  shadow_layer_->UpdateNinePatchLayerBorder(
+      gfx::Rect(aperture_x, aperture_y, aperture_x * 2, aperture_y * 2));
 }
 
 void Shadow::OnWindowDestroyed(mus::Window* window) {
diff --git a/mash/wm/workspace/workspace_layout_manager_unittest.cc b/mash/wm/workspace/workspace_layout_manager_unittest.cc
new file mode 100644
index 0000000..9d556a8
--- /dev/null
+++ b/mash/wm/workspace/workspace_layout_manager_unittest.cc
@@ -0,0 +1,1143 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/wm/common/workspace/workspace_layout_manager.h"
+
+#include <string>
+#include <utility>
+
+#include "ash/wm/common/window_state.h"
+#include "ash/wm/common/wm_event.h"
+#include "ash/wm/common/workspace/workspace_window_resizer.h"
+#include "base/compiler_specific.h"
+#include "ui/aura/client/aura_constants.h"
+#include "ui/base/ui_base_types.h"
+#include "ui/display/manager/display_layout.h"
+#include "ui/display/screen.h"
+#include "ui/gfx/geometry/insets.h"
+#include "ui/views/widget/widget.h"
+#include "ui/views/widget/widget_delegate.h"
+#include "ui/wm/core/window_util.h"
+
+namespace ash {
+namespace {
+
+class MaximizeDelegateView : public views::WidgetDelegateView {
+ public:
+  explicit MaximizeDelegateView(const gfx::Rect& initial_bounds)
+      : initial_bounds_(initial_bounds) {
+  }
+  ~MaximizeDelegateView() override {}
+
+  bool GetSavedWindowPlacement(const views::Widget* widget,
+                               gfx::Rect* bounds,
+                               ui::WindowShowState* show_state) const override {
+    *bounds = initial_bounds_;
+    *show_state = ui::SHOW_STATE_MAXIMIZED;
+    return true;
+  }
+
+ private:
+  const gfx::Rect initial_bounds_;
+
+  DISALLOW_COPY_AND_ASSIGN(MaximizeDelegateView);
+};
+
+class TestShellObserver : public ShellObserver {
+ public:
+  TestShellObserver() : call_count_(0),
+                        is_fullscreen_(false) {
+    Shell::GetInstance()->AddShellObserver(this);
+  }
+
+  ~TestShellObserver() override {
+    Shell::GetInstance()->RemoveShellObserver(this);
+  }
+
+  void OnFullscreenStateChanged(bool is_fullscreen,
+                                aura::Window* root_window) override {
+    call_count_++;
+    is_fullscreen_ = is_fullscreen;
+  }
+
+  int call_count() const {
+    return call_count_;
+  }
+
+  bool is_fullscreen() const {
+    return is_fullscreen_;
+  }
+
+ private:
+  int call_count_;
+  bool is_fullscreen_;
+
+  DISALLOW_COPY_AND_ASSIGN(TestShellObserver);
+};
+
+}  // namespace
+
+typedef test::AshTestBase WorkspaceLayoutManagerTest;
+
+// Verifies that a window containing a restore coordinate will be restored to
+// to the size prior to minimize, keeping the restore rectangle in tact (if
+// there is one).
+TEST_F(WorkspaceLayoutManagerTest, RestoreFromMinimizeKeepsRestore) {
+  std::unique_ptr<aura::Window> window(
+      CreateTestWindowInShellWithBounds(gfx::Rect(1, 2, 3, 4)));
+  gfx::Rect bounds(10, 15, 25, 35);
+  window->SetBounds(bounds);
+
+  wm::WindowState* window_state = wm::GetWindowState(window.get());
+
+  // This will not be used for un-minimizing window.
+  window_state->SetRestoreBoundsInScreen(gfx::Rect(0, 0, 100, 100));
+  window_state->Minimize();
+  window_state->Restore();
+  EXPECT_EQ("0,0 100x100", window_state->GetRestoreBoundsInScreen().ToString());
+  EXPECT_EQ("10,15 25x35", window.get()->bounds().ToString());
+
+  if (!SupportsMultipleDisplays())
+    return;
+
+  UpdateDisplay("400x300,500x400");
+  window->SetBoundsInScreen(gfx::Rect(600, 0, 100, 100),
+                            ScreenUtil::GetSecondaryDisplay());
+  EXPECT_EQ(Shell::GetAllRootWindows()[1], window->GetRootWindow());
+  window_state->Minimize();
+  // This will not be used for un-minimizing window.
+  window_state->SetRestoreBoundsInScreen(gfx::Rect(0, 0, 100, 100));
+  window_state->Restore();
+  EXPECT_EQ("600,0 100x100", window->GetBoundsInScreen().ToString());
+
+  // Make sure the unminimized window moves inside the display when
+  // 2nd display is disconnected.
+  window_state->Minimize();
+  UpdateDisplay("400x300");
+  window_state->Restore();
+  EXPECT_EQ(Shell::GetPrimaryRootWindow(), window->GetRootWindow());
+  EXPECT_TRUE(
+      Shell::GetPrimaryRootWindow()->bounds().Intersects(window->bounds()));
+}
+
+TEST_F(WorkspaceLayoutManagerTest, KeepMinimumVisibilityInDisplays) {
+  if (!SupportsMultipleDisplays())
+    return;
+
+  UpdateDisplay("300x400,400x500");
+  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
+
+  Shell::GetInstance()->display_manager()->SetLayoutForCurrentDisplays(
+      test::CreateDisplayLayout(display::DisplayPlacement::TOP, 0));
+  EXPECT_EQ("0,-500 400x500", root_windows[1]->GetBoundsInScreen().ToString());
+
+  std::unique_ptr<aura::Window> window1(
+      CreateTestWindowInShellWithBounds(gfx::Rect(10, -400, 200, 200)));
+  EXPECT_EQ("10,-400 200x200", window1->GetBoundsInScreen().ToString());
+
+  // Make sure the caption is visible.
+  std::unique_ptr<aura::Window> window2(
+      CreateTestWindowInShellWithBounds(gfx::Rect(10, -600, 200, 200)));
+  EXPECT_EQ("10,-500 200x200", window2->GetBoundsInScreen().ToString());
+}
+
+TEST_F(WorkspaceLayoutManagerTest, NoMinimumVisibilityForPopupWindows) {
+  UpdateDisplay("300x400");
+
+  // Create a popup window out of display boundaries and make sure it is not
+  // moved to have minimum visibility.
+  std::unique_ptr<aura::Window> window(
+      CreateTestWindowInShellWithDelegateAndType(
+          nullptr, ui::wm::WINDOW_TYPE_POPUP, 0, gfx::Rect(400, 100, 50, 50)));
+  EXPECT_EQ("400,100 50x50", window->GetBoundsInScreen().ToString());
+}
+
+TEST_F(WorkspaceLayoutManagerTest, KeepRestoredWindowInDisplay) {
+  if (!SupportsHostWindowResize())
+    return;
+  std::unique_ptr<aura::Window> window(
+      CreateTestWindowInShellWithBounds(gfx::Rect(1, 2, 30, 40)));
+  wm::WindowState* window_state = wm::GetWindowState(window.get());
+
+  // Maximized -> Normal transition.
+  window_state->Maximize();
+  window_state->SetRestoreBoundsInScreen(gfx::Rect(-100, -100, 30, 40));
+  window_state->Restore();
+  EXPECT_TRUE(
+      Shell::GetPrimaryRootWindow()->bounds().Intersects(window->bounds()));
+  // Y bounds should not be negative.
+  EXPECT_EQ("-5,0 30x40", window->bounds().ToString());
+
+  // Minimized -> Normal transition.
+  window->SetBounds(gfx::Rect(-100, -100, 30, 40));
+  window_state->Minimize();
+  EXPECT_FALSE(
+      Shell::GetPrimaryRootWindow()->bounds().Intersects(window->bounds()));
+  EXPECT_EQ("-100,-100 30x40", window->bounds().ToString());
+  window->Show();
+  EXPECT_TRUE(
+      Shell::GetPrimaryRootWindow()->bounds().Intersects(window->bounds()));
+  // Y bounds should not be negative.
+  EXPECT_EQ("-5,0 30x40", window->bounds().ToString());
+
+  // Fullscreen -> Normal transition.
+  window->SetBounds(gfx::Rect(0, 0, 30, 40));  // reset bounds.
+  ASSERT_EQ("0,0 30x40", window->bounds().ToString());
+  window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_FULLSCREEN);
+  EXPECT_EQ(window->bounds(), window->GetRootWindow()->bounds());
+  window_state->SetRestoreBoundsInScreen(gfx::Rect(-100, -100, 30, 40));
+  window_state->Restore();
+  EXPECT_TRUE(
+      Shell::GetPrimaryRootWindow()->bounds().Intersects(window->bounds()));
+  // Y bounds should not be negative.
+  EXPECT_EQ("-5,0 30x40", window->bounds().ToString());
+}
+
+TEST_F(WorkspaceLayoutManagerTest, MaximizeInDisplayToBeRestored) {
+  if (!SupportsMultipleDisplays())
+    return;
+  UpdateDisplay("300x400,400x500");
+
+  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
+
+  std::unique_ptr<aura::Window> window(
+      CreateTestWindowInShellWithBounds(gfx::Rect(1, 2, 30, 40)));
+  EXPECT_EQ(root_windows[0], window->GetRootWindow());
+
+  wm::WindowState* window_state = wm::GetWindowState(window.get());
+  window_state->SetRestoreBoundsInScreen(gfx::Rect(400, 0, 30, 40));
+  // Maximize the window in 2nd display as the restore bounds
+  // is inside 2nd display.
+  window_state->Maximize();
+  EXPECT_EQ(root_windows[1], window->GetRootWindow());
+  EXPECT_EQ("300,0 400x453", window->GetBoundsInScreen().ToString());
+
+  window_state->Restore();
+  EXPECT_EQ(root_windows[1], window->GetRootWindow());
+  EXPECT_EQ("400,0 30x40", window->GetBoundsInScreen().ToString());
+
+  // If the restore bounds intersects with the current display,
+  // don't move.
+  window_state->SetRestoreBoundsInScreen(gfx::Rect(295, 0, 30, 40));
+  window_state->Maximize();
+  EXPECT_EQ(root_windows[1], window->GetRootWindow());
+  EXPECT_EQ("300,0 400x453", window->GetBoundsInScreen().ToString());
+
+  window_state->Restore();
+  EXPECT_EQ(root_windows[1], window->GetRootWindow());
+  EXPECT_EQ("295,0 30x40", window->GetBoundsInScreen().ToString());
+
+  // Restoring widget state.
+  std::unique_ptr<views::Widget> w1(new views::Widget);
+  views::Widget::InitParams params;
+  params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+  params.delegate = new MaximizeDelegateView(gfx::Rect(400, 0, 30, 40));
+  params.context = root_windows[0];
+  w1->Init(params);
+  w1->Show();
+  EXPECT_TRUE(w1->IsMaximized());
+  EXPECT_EQ(root_windows[1], w1->GetNativeView()->GetRootWindow());
+  EXPECT_EQ("300,0 400x453", w1->GetWindowBoundsInScreen().ToString());
+  w1->Restore();
+  EXPECT_EQ(root_windows[1], w1->GetNativeView()->GetRootWindow());
+  EXPECT_EQ("400,0 30x40", w1->GetWindowBoundsInScreen().ToString());
+}
+
+TEST_F(WorkspaceLayoutManagerTest, FullscreenInDisplayToBeRestored) {
+  if (!SupportsMultipleDisplays())
+    return;
+  UpdateDisplay("300x400,400x500");
+
+  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
+
+  std::unique_ptr<aura::Window> window(
+      CreateTestWindowInShellWithBounds(gfx::Rect(1, 2, 30, 40)));
+  EXPECT_EQ(root_windows[0], window->GetRootWindow());
+
+  wm::WindowState* window_state = wm::GetWindowState(window.get());
+  window_state->SetRestoreBoundsInScreen(gfx::Rect(400, 0, 30, 40));
+  // Maximize the window in 2nd display as the restore bounds
+  // is inside 2nd display.
+  window->SetProperty(aura::client::kShowStateKey,
+                      ui::SHOW_STATE_FULLSCREEN);
+  EXPECT_EQ(root_windows[1], window->GetRootWindow());
+  EXPECT_EQ("300,0 400x500", window->GetBoundsInScreen().ToString());
+
+  window_state->Restore();
+  EXPECT_EQ(root_windows[1], window->GetRootWindow());
+  EXPECT_EQ("400,0 30x40", window->GetBoundsInScreen().ToString());
+
+  // If the restore bounds intersects with the current display,
+  // don't move.
+  window_state->SetRestoreBoundsInScreen(gfx::Rect(295, 0, 30, 40));
+  window->SetProperty(aura::client::kShowStateKey,
+                      ui::SHOW_STATE_FULLSCREEN);
+  EXPECT_EQ(root_windows[1], window->GetRootWindow());
+  EXPECT_EQ("300,0 400x500", window->GetBoundsInScreen().ToString());
+
+  window_state->Restore();
+  EXPECT_EQ(root_windows[1], window->GetRootWindow());
+  EXPECT_EQ("295,0 30x40", window->GetBoundsInScreen().ToString());
+}
+
+// WindowObserver implementation used by DontClobberRestoreBoundsWindowObserver.
+// This code mirrors what BrowserFrameAsh does. In particular when this code
+// sees the window was maximized it changes the bounds of a secondary
+// window. The secondary window mirrors the status window.
+class DontClobberRestoreBoundsWindowObserver : public aura::WindowObserver {
+ public:
+  DontClobberRestoreBoundsWindowObserver() : window_(nullptr) {}
+
+  void set_window(aura::Window* window) { window_ = window; }
+
+  void OnWindowPropertyChanged(aura::Window* window,
+                               const void* key,
+                               intptr_t old) override {
+    if (!window_)
+      return;
+
+    if (wm::GetWindowState(window)->IsMaximized()) {
+      aura::Window* w = window_;
+      window_ = nullptr;
+
+      gfx::Rect shelf_bounds(
+          Shelf::ForPrimaryDisplay()->shelf_layout_manager()->GetIdealBounds());
+      const gfx::Rect& window_bounds(w->bounds());
+      w->SetBounds(gfx::Rect(window_bounds.x(), shelf_bounds.y() - 1,
+                             window_bounds.width(), window_bounds.height()));
+    }
+  }
+
+ private:
+  aura::Window* window_;
+
+  DISALLOW_COPY_AND_ASSIGN(DontClobberRestoreBoundsWindowObserver);
+};
+
+// Creates a window, maximized the window and from within the maximized
+// notification sets the bounds of a window to overlap the shelf. Verifies this
+// doesn't effect the restore bounds.
+TEST_F(WorkspaceLayoutManagerTest, DontClobberRestoreBounds) {
+  DontClobberRestoreBoundsWindowObserver window_observer;
+  std::unique_ptr<aura::Window> window(new aura::Window(nullptr));
+  window->SetType(ui::wm::WINDOW_TYPE_NORMAL);
+  window->Init(ui::LAYER_TEXTURED);
+  window->SetBounds(gfx::Rect(10, 20, 30, 40));
+  // NOTE: for this test to exercise the failure the observer needs to be added
+  // before the parent set. This mimics what BrowserFrameAsh does.
+  window->AddObserver(&window_observer);
+  ParentWindowInPrimaryRootWindow(window.get());
+  window->Show();
+
+  wm::WindowState* window_state = wm::GetWindowState(window.get());
+  window_state->Activate();
+
+  std::unique_ptr<aura::Window> window2(
+      CreateTestWindowInShellWithBounds(gfx::Rect(12, 20, 30, 40)));
+  ::wm::AddTransientChild(window.get(), window2.get());
+  window2->Show();
+
+  window_observer.set_window(window2.get());
+  window_state->Maximize();
+  EXPECT_EQ("10,20 30x40",
+            window_state->GetRestoreBoundsInScreen().ToString());
+  window->RemoveObserver(&window_observer);
+}
+
+// Verifies when a window is maximized all descendant windows have a size.
+TEST_F(WorkspaceLayoutManagerTest, ChildBoundsResetOnMaximize) {
+  std::unique_ptr<aura::Window> window(
+      CreateTestWindowInShellWithBounds(gfx::Rect(10, 20, 30, 40)));
+  window->Show();
+  wm::WindowState* window_state = wm::GetWindowState(window.get());
+  window_state->Activate();
+  std::unique_ptr<aura::Window> child_window(
+      aura::test::CreateTestWindowWithBounds(gfx::Rect(5, 6, 7, 8),
+                                             window.get()));
+  child_window->Show();
+  window_state->Maximize();
+  EXPECT_EQ("5,6 7x8", child_window->bounds().ToString());
+}
+
+// Verifies a window created with maximized state has the maximized
+// bounds.
+TEST_F(WorkspaceLayoutManagerTest, MaximizeWithEmptySize) {
+  std::unique_ptr<aura::Window> window(
+      aura::test::CreateTestWindowWithBounds(gfx::Rect(0, 0, 0, 0), nullptr));
+  wm::GetWindowState(window.get())->Maximize();
+  aura::Window* default_container = Shell::GetContainer(
+      Shell::GetPrimaryRootWindow(), kShellWindowId_DefaultContainer);
+  default_container->AddChild(window.get());
+  window->Show();
+  gfx::Rect work_area(
+      display::Screen::GetScreen()->GetPrimaryDisplay().work_area());
+  EXPECT_EQ(work_area.ToString(), window->GetBoundsInScreen().ToString());
+}
+
+TEST_F(WorkspaceLayoutManagerTest, WindowShouldBeOnScreenWhenAdded) {
+  // Normal window bounds shouldn't be changed.
+  gfx::Rect window_bounds(100, 100, 200, 200);
+  std::unique_ptr<aura::Window> window(
+      CreateTestWindowInShellWithBounds(window_bounds));
+  EXPECT_EQ(window_bounds, window->bounds());
+
+  // If the window is out of the workspace, it would be moved on screen.
+  gfx::Rect root_window_bounds =
+      Shell::GetInstance()->GetPrimaryRootWindow()->bounds();
+  window_bounds.Offset(root_window_bounds.width(), root_window_bounds.height());
+  ASSERT_FALSE(window_bounds.Intersects(root_window_bounds));
+  std::unique_ptr<aura::Window> out_window(
+      CreateTestWindowInShellWithBounds(window_bounds));
+  EXPECT_EQ(window_bounds.size(), out_window->bounds().size());
+  gfx::Rect bounds = out_window->bounds();
+  bounds.Intersect(root_window_bounds);
+
+  // 30% of the window edge must be visible.
+  EXPECT_GT(bounds.width(), out_window->bounds().width() * 0.29);
+  EXPECT_GT(bounds.height(), out_window->bounds().height() * 0.29);
+
+  aura::Window* parent = out_window->parent();
+  parent->RemoveChild(out_window.get());
+  out_window->SetBounds(gfx::Rect(-200, -200, 200, 200));
+  // UserHasChangedWindowPositionOrSize flag shouldn't turn off this behavior.
+  wm::GetWindowState(window.get())->set_bounds_changed_by_user(true);
+  parent->AddChild(out_window.get());
+  EXPECT_GT(bounds.width(), out_window->bounds().width() * 0.29);
+  EXPECT_GT(bounds.height(), out_window->bounds().height() * 0.29);
+
+  // Make sure we always make more than 1/3 of the window edge visible even
+  // if the initial bounds intersects with display.
+  window_bounds.SetRect(-150, -150, 200, 200);
+  bounds = window_bounds;
+  bounds.Intersect(root_window_bounds);
+
+  // Make sure that the initial bounds' visible area is less than 26%
+  // so that the auto adjustment logic kicks in.
+  ASSERT_LT(bounds.width(), out_window->bounds().width() * 0.26);
+  ASSERT_LT(bounds.height(), out_window->bounds().height() * 0.26);
+  ASSERT_TRUE(window_bounds.Intersects(root_window_bounds));
+
+  std::unique_ptr<aura::Window> partially_out_window(
+      CreateTestWindowInShellWithBounds(window_bounds));
+  EXPECT_EQ(window_bounds.size(), partially_out_window->bounds().size());
+  bounds = partially_out_window->bounds();
+  bounds.Intersect(root_window_bounds);
+  EXPECT_GT(bounds.width(), out_window->bounds().width() * 0.29);
+  EXPECT_GT(bounds.height(), out_window->bounds().height() * 0.29);
+
+  // Make sure the window whose 30% width/height is bigger than display
+  // will be placed correctly.
+  window_bounds.SetRect(-1900, -1900, 3000, 3000);
+  std::unique_ptr<aura::Window> window_bigger_than_display(
+      CreateTestWindowInShellWithBounds(window_bounds));
+  EXPECT_GE(root_window_bounds.width(),
+            window_bigger_than_display->bounds().width());
+  EXPECT_GE(root_window_bounds.height(),
+            window_bigger_than_display->bounds().height());
+
+  bounds = window_bigger_than_display->bounds();
+  bounds.Intersect(root_window_bounds);
+  EXPECT_GT(bounds.width(), out_window->bounds().width() * 0.29);
+  EXPECT_GT(bounds.height(), out_window->bounds().height() * 0.29);
+}
+
+// Verifies the size of a window is enforced to be smaller than the work area.
+TEST_F(WorkspaceLayoutManagerTest, SizeToWorkArea) {
+  // Normal window bounds shouldn't be changed.
+  gfx::Size work_area(
+      display::Screen::GetScreen()->GetPrimaryDisplay().work_area().size());
+  const gfx::Rect window_bounds(
+      100, 101, work_area.width() + 1, work_area.height() + 2);
+  std::unique_ptr<aura::Window> window(
+      CreateTestWindowInShellWithBounds(window_bounds));
+  EXPECT_EQ(gfx::Rect(gfx::Point(100, 101), work_area).ToString(),
+      window->bounds().ToString());
+
+  // Directly setting the bounds triggers a slightly different code path. Verify
+  // that too.
+  window->SetBounds(window_bounds);
+  EXPECT_EQ(gfx::Rect(gfx::Point(100, 101), work_area).ToString(),
+      window->bounds().ToString());
+}
+
+TEST_F(WorkspaceLayoutManagerTest, NotifyFullscreenChanges) {
+  TestShellObserver observer;
+  std::unique_ptr<aura::Window> window1(
+      CreateTestWindowInShellWithBounds(gfx::Rect(1, 2, 30, 40)));
+  std::unique_ptr<aura::Window> window2(
+      CreateTestWindowInShellWithBounds(gfx::Rect(1, 2, 30, 40)));
+  wm::WindowState* window_state1 = wm::GetWindowState(window1.get());
+  wm::WindowState* window_state2 = wm::GetWindowState(window2.get());
+  window_state2->Activate();
+
+  const wm::WMEvent toggle_fullscreen_event(wm::WM_EVENT_TOGGLE_FULLSCREEN);
+  window_state2->OnWMEvent(&toggle_fullscreen_event);
+  EXPECT_EQ(1, observer.call_count());
+  EXPECT_TRUE(observer.is_fullscreen());
+
+  // When window1 moves to the front the fullscreen state should change.
+  window_state1->Activate();
+  EXPECT_EQ(2, observer.call_count());
+  EXPECT_FALSE(observer.is_fullscreen());
+
+  // It should change back if window2 becomes active again.
+  window_state2->Activate();
+  EXPECT_EQ(3, observer.call_count());
+  EXPECT_TRUE(observer.is_fullscreen());
+
+  window_state2->OnWMEvent(&toggle_fullscreen_event);
+  EXPECT_EQ(4, observer.call_count());
+  EXPECT_FALSE(observer.is_fullscreen());
+
+  window_state2->OnWMEvent(&toggle_fullscreen_event);
+  EXPECT_EQ(5, observer.call_count());
+  EXPECT_TRUE(observer.is_fullscreen());
+
+  // Closing the window should change the fullscreen state.
+  window2.reset();
+  EXPECT_EQ(6, observer.call_count());
+  EXPECT_FALSE(observer.is_fullscreen());
+}
+
+// Following "Solo" tests were originally written for BaseLayoutManager.
+namespace {
+
+class WorkspaceLayoutManagerSoloTest : public test::AshTestBase {
+ public:
+  WorkspaceLayoutManagerSoloTest() {}
+  ~WorkspaceLayoutManagerSoloTest() override {}
+
+  aura::Window* CreateTestWindow(const gfx::Rect& bounds) {
+    return CreateTestWindowInShellWithBounds(bounds);
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(WorkspaceLayoutManagerSoloTest);
+};
+
+}  // namespace
+
+// Tests normal->maximize->normal.
+TEST_F(WorkspaceLayoutManagerSoloTest, Maximize) {
+  gfx::Rect bounds(100, 100, 200, 200);
+  std::unique_ptr<aura::Window> window(CreateTestWindow(bounds));
+  window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED);
+  // Maximized window fills the work area, not the whole display.
+  EXPECT_EQ(
+      ScreenUtil::GetMaximizedWindowBoundsInParent(window.get()).ToString(),
+      window->bounds().ToString());
+  window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL);
+  EXPECT_EQ(bounds.ToString(), window->bounds().ToString());
+}
+
+// Tests normal->minimize->normal.
+TEST_F(WorkspaceLayoutManagerSoloTest, Minimize) {
+  gfx::Rect bounds(100, 100, 200, 200);
+  std::unique_ptr<aura::Window> window(CreateTestWindow(bounds));
+  window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MINIMIZED);
+  // Note: Currently minimize doesn't do anything except set the state.
+  // See crbug.com/104571.
+  EXPECT_EQ(bounds.ToString(), window->bounds().ToString());
+  window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL);
+  EXPECT_EQ(bounds.ToString(), window->bounds().ToString());
+}
+
+// A WindowDelegate which sets the focus when the window
+// becomes visible.
+class FocusDelegate : public aura::test::TestWindowDelegate {
+ public:
+  FocusDelegate() : window_(nullptr), show_state_(ui::SHOW_STATE_END) {}
+  ~FocusDelegate() override {}
+
+  void set_window(aura::Window* window) { window_ = window; }
+
+  // aura::test::TestWindowDelegate overrides:
+  void OnWindowTargetVisibilityChanged(bool visible) override {
+    if (window_) {
+      if (visible)
+        window_->Focus();
+      show_state_ = window_->GetProperty(aura::client::kShowStateKey);
+    }
+  }
+
+  ui::WindowShowState GetShowStateAndReset() {
+    ui::WindowShowState ret = show_state_;
+    show_state_ = ui::SHOW_STATE_END;
+    return ret;
+  }
+
+ private:
+  aura::Window* window_;
+  ui::WindowShowState show_state_;
+
+  DISALLOW_COPY_AND_ASSIGN(FocusDelegate);
+};
+
+// Make sure that the window's show state is correct in
+// |WindowDelegate::OnWindowTargetVisibilityChanged|, and setting
+// focus in this callback doesn't cause DCHECK error.  See
+// crbug.com/168383.
+TEST_F(WorkspaceLayoutManagerSoloTest, FocusDuringUnminimize) {
+  FocusDelegate delegate;
+  std::unique_ptr<aura::Window> window(CreateTestWindowInShellWithDelegate(
+      &delegate, 0, gfx::Rect(100, 100, 100, 100)));
+  delegate.set_window(window.get());
+  window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MINIMIZED);
+  EXPECT_FALSE(window->IsVisible());
+  EXPECT_EQ(ui::SHOW_STATE_MINIMIZED, delegate.GetShowStateAndReset());
+  window->Show();
+  EXPECT_TRUE(window->IsVisible());
+  EXPECT_EQ(ui::SHOW_STATE_NORMAL, delegate.GetShowStateAndReset());
+}
+
+// Tests maximized window size during root window resize.
+#if defined(OS_WIN) && !defined(USE_ASH)
+// TODO(msw): Broken on Windows. http://crbug.com/584038
+#define MAYBE_MaximizeRootWindowResize DISABLED_MaximizeRootWindowResize
+#else
+#define MAYBE_MaximizeRootWindowResize MaximizeRootWindowResize
+#endif
+TEST_F(WorkspaceLayoutManagerSoloTest, MAYBE_MaximizeRootWindowResize) {
+  gfx::Rect bounds(100, 100, 200, 200);
+  std::unique_ptr<aura::Window> window(CreateTestWindow(bounds));
+  window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED);
+  gfx::Rect initial_work_area_bounds =
+      ScreenUtil::GetMaximizedWindowBoundsInParent(window.get());
+  EXPECT_EQ(initial_work_area_bounds.ToString(), window->bounds().ToString());
+  // Enlarge the root window.  We should still match the work area size.
+  UpdateDisplay("900x700");
+  EXPECT_EQ(
+      ScreenUtil::GetMaximizedWindowBoundsInParent(window.get()).ToString(),
+      window->bounds().ToString());
+  EXPECT_NE(
+      initial_work_area_bounds.ToString(),
+      ScreenUtil::GetMaximizedWindowBoundsInParent(window.get()).ToString());
+}
+
+// Tests normal->fullscreen->normal.
+TEST_F(WorkspaceLayoutManagerSoloTest, Fullscreen) {
+  gfx::Rect bounds(100, 100, 200, 200);
+  std::unique_ptr<aura::Window> window(CreateTestWindow(bounds));
+  window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_FULLSCREEN);
+  // Fullscreen window fills the whole display.
+  EXPECT_EQ(display::Screen::GetScreen()
+                ->GetDisplayNearestWindow(window.get())
+                .bounds()
+                .ToString(),
+            window->bounds().ToString());
+  window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL);
+  EXPECT_EQ(bounds.ToString(), window->bounds().ToString());
+}
+
+// Tests that fullscreen window causes always_on_top windows to stack below.
+TEST_F(WorkspaceLayoutManagerSoloTest, FullscreenSuspendsAlwaysOnTop) {
+  gfx::Rect bounds(100, 100, 200, 200);
+  std::unique_ptr<aura::Window> fullscreen_window(CreateTestWindow(bounds));
+  std::unique_ptr<aura::Window> always_on_top_window1(CreateTestWindow(bounds));
+  std::unique_ptr<aura::Window> always_on_top_window2(CreateTestWindow(bounds));
+  always_on_top_window1->SetProperty(aura::client::kAlwaysOnTopKey, true);
+  always_on_top_window2->SetProperty(aura::client::kAlwaysOnTopKey, true);
+  // Making a window fullscreen temporarily suspends always on top state.
+  fullscreen_window->SetProperty(aura::client::kShowStateKey,
+                                 ui::SHOW_STATE_FULLSCREEN);
+  EXPECT_FALSE(
+      always_on_top_window1->GetProperty(aura::client::kAlwaysOnTopKey));
+  EXPECT_FALSE(
+      always_on_top_window2->GetProperty(aura::client::kAlwaysOnTopKey));
+  EXPECT_NE(nullptr, GetRootWindowController(fullscreen_window->GetRootWindow())
+                         ->GetWindowForFullscreenMode());
+  // Making fullscreen window normal restores always on top windows.
+  fullscreen_window->SetProperty(aura::client::kShowStateKey,
+                                 ui::SHOW_STATE_NORMAL);
+  EXPECT_TRUE(
+      always_on_top_window1->GetProperty(aura::client::kAlwaysOnTopKey));
+  EXPECT_TRUE(
+      always_on_top_window2->GetProperty(aura::client::kAlwaysOnTopKey));
+  EXPECT_EQ(nullptr, GetRootWindowController(fullscreen_window->GetRootWindow())
+                         ->GetWindowForFullscreenMode());
+}
+
+// Tests fullscreen window size during root window resize.
+TEST_F(WorkspaceLayoutManagerSoloTest, FullscreenRootWindowResize) {
+  gfx::Rect bounds(100, 100, 200, 200);
+  std::unique_ptr<aura::Window> window(CreateTestWindow(bounds));
+  // Fullscreen window fills the whole display.
+  window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_FULLSCREEN);
+  EXPECT_EQ(display::Screen::GetScreen()
+                ->GetDisplayNearestWindow(window.get())
+                .bounds()
+                .ToString(),
+            window->bounds().ToString());
+  // Enlarge the root window.  We should still match the display size.
+  UpdateDisplay("800x600");
+  EXPECT_EQ(display::Screen::GetScreen()
+                ->GetDisplayNearestWindow(window.get())
+                .bounds()
+                .ToString(),
+            window->bounds().ToString());
+}
+
+// Tests that when the screen gets smaller the windows aren't bigger than
+// the screen.
+TEST_F(WorkspaceLayoutManagerSoloTest, RootWindowResizeShrinksWindows) {
+  std::unique_ptr<aura::Window> window(
+      CreateTestWindow(gfx::Rect(10, 20, 500, 400)));
+  gfx::Rect work_area = display::Screen::GetScreen()
+                            ->GetDisplayNearestWindow(window.get())
+                            .work_area();
+  // Invariant: Window is smaller than work area.
+  EXPECT_LE(window->bounds().width(), work_area.width());
+  EXPECT_LE(window->bounds().height(), work_area.height());
+
+  // Make the root window narrower than our window.
+  UpdateDisplay("300x400");
+  work_area = display::Screen::GetScreen()
+                  ->GetDisplayNearestWindow(window.get())
+                  .work_area();
+  EXPECT_LE(window->bounds().width(), work_area.width());
+  EXPECT_LE(window->bounds().height(), work_area.height());
+
+  // Make the root window shorter than our window.
+  UpdateDisplay("300x200");
+  work_area = display::Screen::GetScreen()
+                  ->GetDisplayNearestWindow(window.get())
+                  .work_area();
+  EXPECT_LE(window->bounds().width(), work_area.width());
+  EXPECT_LE(window->bounds().height(), work_area.height());
+
+  // Enlarging the root window does not change the window bounds.
+  gfx::Rect old_bounds = window->bounds();
+  UpdateDisplay("800x600");
+  EXPECT_EQ(old_bounds.width(), window->bounds().width());
+  EXPECT_EQ(old_bounds.height(), window->bounds().height());
+}
+
+// Verifies maximizing sets the restore bounds, and restoring
+// restores the bounds.
+TEST_F(WorkspaceLayoutManagerSoloTest, MaximizeSetsRestoreBounds) {
+  std::unique_ptr<aura::Window> window(
+      CreateTestWindow(gfx::Rect(10, 20, 30, 40)));
+  wm::WindowState* window_state = wm::GetWindowState(window.get());
+
+  // Maximize it, which will keep the previous restore bounds.
+  window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED);
+  EXPECT_EQ("10,20 30x40", window_state->GetRestoreBoundsInParent().ToString());
+
+  // Restore it, which should restore bounds and reset restore bounds.
+  window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL);
+  EXPECT_EQ("10,20 30x40", window->bounds().ToString());
+  EXPECT_FALSE(window_state->HasRestoreBounds());
+}
+
+// Verifies maximizing keeps the restore bounds if set.
+TEST_F(WorkspaceLayoutManagerSoloTest, MaximizeResetsRestoreBounds) {
+  std::unique_ptr<aura::Window> window(CreateTestWindow(gfx::Rect(1, 2, 3, 4)));
+
+  wm::WindowState* window_state = wm::GetWindowState(window.get());
+  window_state->SetRestoreBoundsInParent(gfx::Rect(10, 11, 12, 13));
+
+  // Maximize it, which will keep the previous restore bounds.
+  window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED);
+  EXPECT_EQ("10,11 12x13", window_state->GetRestoreBoundsInParent().ToString());
+}
+
+// Verifies that the restore bounds do not get reset when restoring to a
+// maximzied state from a minimized state.
+TEST_F(WorkspaceLayoutManagerSoloTest,
+       BoundsAfterRestoringToMaximizeFromMinimize) {
+  std::unique_ptr<aura::Window> window(CreateTestWindow(gfx::Rect(1, 2, 3, 4)));
+  gfx::Rect bounds(10, 15, 25, 35);
+  window->SetBounds(bounds);
+
+  wm::WindowState* window_state = wm::GetWindowState(window.get());
+  // Maximize it, which should reset restore bounds.
+  window_state->Maximize();
+  EXPECT_EQ(bounds.ToString(),
+            window_state->GetRestoreBoundsInParent().ToString());
+  // Minimize the window. The restore bounds should not change.
+  window_state->Minimize();
+  EXPECT_EQ(bounds.ToString(),
+            window_state->GetRestoreBoundsInParent().ToString());
+
+  // Show the window again. The window should be maximized, and the restore
+  // bounds should not change.
+  window->Show();
+  EXPECT_EQ(bounds.ToString(),
+            window_state->GetRestoreBoundsInParent().ToString());
+  EXPECT_TRUE(window_state->IsMaximized());
+
+  window_state->Restore();
+  EXPECT_EQ(bounds.ToString(), window->bounds().ToString());
+}
+
+// Verify if the window is not resized during screen lock. See: crbug.com/173127
+TEST_F(WorkspaceLayoutManagerSoloTest, NotResizeWhenScreenIsLocked) {
+  SetCanLockScreen(true);
+  std::unique_ptr<aura::Window> window(CreateTestWindow(gfx::Rect(1, 2, 3, 4)));
+  // window with AlwaysOnTop will be managed by BaseLayoutManager.
+  window->SetProperty(aura::client::kAlwaysOnTopKey, true);
+  window->Show();
+
+  ShelfLayoutManager* shelf_layout_manager =
+      Shelf::ForWindow(window.get())->shelf_layout_manager();
+  shelf_layout_manager->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
+
+  window->SetBounds(ScreenUtil::GetMaximizedWindowBoundsInParent(window.get()));
+  gfx::Rect window_bounds = window->bounds();
+  EXPECT_EQ(
+      ScreenUtil::GetMaximizedWindowBoundsInParent(window.get()).ToString(),
+      window_bounds.ToString());
+
+  // The window size should not get touched while we are in lock screen.
+  Shell::GetInstance()->session_state_delegate()->LockScreen();
+  shelf_layout_manager->UpdateVisibilityState();
+  EXPECT_EQ(window_bounds.ToString(), window->bounds().ToString());
+
+  // Coming out of the lock screen the window size should still remain.
+  Shell::GetInstance()->session_state_delegate()->UnlockScreen();
+  shelf_layout_manager->UpdateVisibilityState();
+  EXPECT_EQ(
+      ScreenUtil::GetMaximizedWindowBoundsInParent(window.get()).ToString(),
+      window_bounds.ToString());
+  EXPECT_EQ(window_bounds.ToString(), window->bounds().ToString());
+}
+
+// Following tests are written to test the backdrop functionality.
+
+namespace {
+
+WorkspaceLayoutManager* GetWorkspaceLayoutManager(aura::Window* container) {
+  return static_cast<WorkspaceLayoutManager*>(
+      wm::WmWindowAura::Get(container)->GetLayoutManager());
+}
+
+class WorkspaceLayoutManagerBackdropTest : public test::AshTestBase {
+ public:
+  WorkspaceLayoutManagerBackdropTest() : default_container_(nullptr) {}
+  ~WorkspaceLayoutManagerBackdropTest() override {}
+
+  void SetUp() override {
+    test::AshTestBase::SetUp();
+    UpdateDisplay("800x600");
+    default_container_ = Shell::GetContainer(Shell::GetPrimaryRootWindow(),
+                                             kShellWindowId_DefaultContainer);
+  }
+
+  aura::Window* CreateTestWindow(const gfx::Rect& bounds) {
+    aura::Window* window = CreateTestWindowInShellWithBounds(bounds);
+    return window;
+  }
+
+  // Turn the top window back drop on / off.
+  void ShowTopWindowBackdrop(bool show) {
+    std::unique_ptr<ash::WorkspaceLayoutManagerBackdropDelegate> backdrop;
+    if (show) {
+      backdrop.reset(new ash::WorkspaceBackdropDelegate(default_container_));
+    }
+    GetWorkspaceLayoutManager(default_container_)
+        ->SetMaximizeBackdropDelegate(std::move(backdrop));
+    // Closing and / or opening can be a delayed operation.
+    base::MessageLoop::current()->RunUntilIdle();
+  }
+
+  // Return the default container.
+  aura::Window* default_container() { return default_container_; }
+
+  // Return the order of windows (top most first) as they are in the default
+  // container. If the window is visible it will be a big letter, otherwise a
+  // small one. The backdrop will be an X and unknown windows will be shown as
+  // '!'.
+  std::string GetWindowOrderAsString(aura::Window* backdrop,
+                                     aura::Window* wa,
+                                     aura::Window* wb,
+                                     aura::Window* wc) {
+    std::string result;
+    for (int i = static_cast<int>(default_container()->children().size()) - 1;
+         i >= 0;
+         --i) {
+      if (!result.empty())
+        result += ",";
+      if (default_container()->children()[i] == wa)
+        result += default_container()->children()[i]->IsVisible() ? "A" : "a";
+      else if (default_container()->children()[i] == wb)
+        result += default_container()->children()[i]->IsVisible() ? "B" : "b";
+      else if (default_container()->children()[i] == wc)
+        result += default_container()->children()[i]->IsVisible() ? "C" : "c";
+      else if (default_container()->children()[i] == backdrop)
+        result += default_container()->children()[i]->IsVisible() ? "X" : "x";
+      else
+        result += "!";
+    }
+    return result;
+  }
+
+ private:
+  // The default container.
+  aura::Window* default_container_;
+
+  DISALLOW_COPY_AND_ASSIGN(WorkspaceLayoutManagerBackdropTest);
+};
+
+}  // namespace
+
+// Check that creating the BackDrop without destroying it does not lead into
+// a crash.
+TEST_F(WorkspaceLayoutManagerBackdropTest, BackdropCrashTest) {
+  ShowTopWindowBackdrop(true);
+}
+
+// Verify basic assumptions about the backdrop.
+TEST_F(WorkspaceLayoutManagerBackdropTest, BasicBackdropTests) {
+  // Create a backdrop and see that there is one window (the backdrop) and
+  // that the size is the same as the default container as well as that it is
+  // not visible.
+  ShowTopWindowBackdrop(true);
+  ASSERT_EQ(1U, default_container()->children().size());
+  EXPECT_FALSE(default_container()->children()[0]->IsVisible());
+
+  {
+    // Add a window and make sure that the backdrop is the second child.
+    std::unique_ptr<aura::Window> window(
+        CreateTestWindow(gfx::Rect(1, 2, 3, 4)));
+    window->Show();
+    ASSERT_EQ(2U, default_container()->children().size());
+    EXPECT_TRUE(default_container()->children()[0]->IsVisible());
+    EXPECT_TRUE(default_container()->children()[1]->IsVisible());
+    EXPECT_EQ(window.get(), default_container()->children()[1]);
+    EXPECT_EQ(default_container()->bounds().ToString(),
+              default_container()->children()[0]->bounds().ToString());
+  }
+
+  // With the window gone the backdrop should be invisible again.
+  ASSERT_EQ(1U, default_container()->children().size());
+  EXPECT_FALSE(default_container()->children()[0]->IsVisible());
+
+  // Destroying the Backdrop should empty the container.
+  ShowTopWindowBackdrop(false);
+  ASSERT_EQ(0U, default_container()->children().size());
+}
+
+// Verify that the backdrop gets properly created and placed.
+TEST_F(WorkspaceLayoutManagerBackdropTest, VerifyBackdropAndItsStacking) {
+  std::unique_ptr<aura::Window> window1(
+      CreateTestWindow(gfx::Rect(1, 2, 3, 4)));
+  window1->Show();
+
+  // Get the default container and check that only a single window is in there.
+  ASSERT_EQ(1U, default_container()->children().size());
+  EXPECT_EQ(window1.get(), default_container()->children()[0]);
+  EXPECT_EQ("A",
+            GetWindowOrderAsString(nullptr, window1.get(), nullptr, nullptr));
+
+  // Create 2 more windows and check that they are also in the container.
+  std::unique_ptr<aura::Window> window2(
+      CreateTestWindow(gfx::Rect(10, 2, 3, 4)));
+  std::unique_ptr<aura::Window> window3(
+      CreateTestWindow(gfx::Rect(20, 2, 3, 4)));
+  window2->Show();
+  window3->Show();
+
+  aura::Window* backdrop = nullptr;
+  EXPECT_EQ("C,B,A",
+            GetWindowOrderAsString(backdrop, window1.get(), window2.get(),
+                                   window3.get()));
+
+  // Turn on the backdrop mode and check that the window shows up where it
+  // should be (second highest number).
+  ShowTopWindowBackdrop(true);
+  backdrop = default_container()->children()[2];
+  EXPECT_EQ("C,X,B,A",
+            GetWindowOrderAsString(backdrop, window1.get(), window2.get(),
+                                   window3.get()));
+
+  // Switch the order of windows and check that it still remains in that
+  // location.
+  default_container()->StackChildAtTop(window2.get());
+  EXPECT_EQ("B,X,C,A",
+            GetWindowOrderAsString(backdrop, window1.get(), window2.get(),
+                                   window3.get()));
+
+  // Make the top window invisible and check.
+  window2.get()->Hide();
+  EXPECT_EQ("b,C,X,A",
+            GetWindowOrderAsString(backdrop, window1.get(), window2.get(),
+                                   window3.get()));
+  // Then delete window after window and see that everything is in order.
+  window1.reset();
+  EXPECT_EQ("b,C,X",
+            GetWindowOrderAsString(backdrop, window1.get(), window2.get(),
+                                   window3.get()));
+  window3.reset();
+  EXPECT_EQ("b,x",
+            GetWindowOrderAsString(backdrop, window1.get(), window2.get(),
+                                   window3.get()));
+  ShowTopWindowBackdrop(false);
+  EXPECT_EQ("b", GetWindowOrderAsString(nullptr, window1.get(), window2.get(),
+                                        window3.get()));
+}
+
+// Tests that when hidding the shelf, that the backdrop resizes to fill the
+// entire workspace area.
+TEST_F(WorkspaceLayoutManagerBackdropTest, ShelfVisibilityChangesBounds) {
+  ShelfLayoutManager* shelf_layout_manager =
+      Shelf::ForPrimaryDisplay()->shelf_layout_manager();
+  ShowTopWindowBackdrop(true);
+  RunAllPendingInMessageLoop();
+
+  ASSERT_EQ(SHELF_VISIBLE, shelf_layout_manager->visibility_state());
+  gfx::Rect initial_bounds = default_container()->children()[0]->bounds();
+  shelf_layout_manager->SetAutoHideBehavior(SHELF_AUTO_HIDE_ALWAYS_HIDDEN);
+  shelf_layout_manager->UpdateVisibilityState();
+
+  // When the shelf is re-shown WorkspaceLayoutManager shrinks all children
+  // including the backdrop.
+  shelf_layout_manager->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_NEVER);
+  shelf_layout_manager->UpdateVisibilityState();
+  gfx::Rect reduced_bounds = default_container()->children()[0]->bounds();
+  EXPECT_LT(reduced_bounds.height(), initial_bounds.height());
+
+  shelf_layout_manager->SetAutoHideBehavior(SHELF_AUTO_HIDE_ALWAYS_HIDDEN);
+  shelf_layout_manager->UpdateVisibilityState();
+
+  EXPECT_GT(default_container()->children()[0]->bounds().height(),
+            reduced_bounds.height());
+}
+
+class WorkspaceLayoutManagerKeyboardTest : public test::AshTestBase {
+ public:
+  WorkspaceLayoutManagerKeyboardTest() : layout_manager_(nullptr) {}
+  ~WorkspaceLayoutManagerKeyboardTest() override {}
+
+  void SetUp() override {
+    test::AshTestBase::SetUp();
+    UpdateDisplay("800x600");
+    aura::Window* default_container = Shell::GetContainer(
+        Shell::GetPrimaryRootWindow(), kShellWindowId_DefaultContainer);
+    layout_manager_ = GetWorkspaceLayoutManager(default_container);
+  }
+
+  aura::Window* CreateTestWindow(const gfx::Rect& bounds) {
+    return CreateTestWindowInShellWithBounds(bounds);
+  }
+
+  void ShowKeyboard() {
+    layout_manager_->OnKeyboardBoundsChanging(keyboard_bounds_);
+    restore_work_area_insets_ =
+        display::Screen::GetScreen()->GetPrimaryDisplay().GetWorkAreaInsets();
+    Shell::GetInstance()->SetDisplayWorkAreaInsets(
+        Shell::GetPrimaryRootWindow(),
+        gfx::Insets(0, 0, keyboard_bounds_.height(), 0));
+  }
+
+  void HideKeyboard() {
+    Shell::GetInstance()->SetDisplayWorkAreaInsets(
+        Shell::GetPrimaryRootWindow(),
+        restore_work_area_insets_);
+    layout_manager_->OnKeyboardBoundsChanging(gfx::Rect());
+  }
+
+  void SetKeyboardBounds(const gfx::Rect& bounds) {
+    keyboard_bounds_ = bounds;
+  }
+
+ private:
+  gfx::Insets restore_work_area_insets_;
+  gfx::Rect keyboard_bounds_;
+  WorkspaceLayoutManager* layout_manager_;
+
+  DISALLOW_COPY_AND_ASSIGN(WorkspaceLayoutManagerKeyboardTest);
+};
+
+// Tests that when a child window gains focus the top level window containing it
+// is resized to fit the remaining workspace area.
+TEST_F(WorkspaceLayoutManagerKeyboardTest, ChildWindowFocused) {
+  gfx::Rect work_area(
+      display::Screen::GetScreen()->GetPrimaryDisplay().work_area());
+  gfx::Rect keyboard_bounds(work_area.x(),
+                            work_area.y() + work_area.height() / 2,
+                            work_area.width(),
+                            work_area.height() / 2);
+
+  SetKeyboardBounds(keyboard_bounds);
+
+  aura::test::TestWindowDelegate delegate1;
+  std::unique_ptr<aura::Window> parent_window(
+      CreateTestWindowInShellWithDelegate(&delegate1, -1, work_area));
+  aura::test::TestWindowDelegate delegate2;
+  std::unique_ptr<aura::Window> window(
+      CreateTestWindowInShellWithDelegate(&delegate2, -1, work_area));
+  parent_window->AddChild(window.get());
+
+  wm::ActivateWindow(window.get());
+
+  int available_height =
+      display::Screen::GetScreen()->GetPrimaryDisplay().bounds().height() -
+      keyboard_bounds.height();
+
+  gfx::Rect initial_window_bounds(50, 50, 100, 500);
+  parent_window->SetBounds(initial_window_bounds);
+  EXPECT_EQ(initial_window_bounds.ToString(),
+            parent_window->bounds().ToString());
+  ShowKeyboard();
+  EXPECT_EQ(gfx::Rect(50, 0, 100, available_height).ToString(),
+            parent_window->bounds().ToString());
+  HideKeyboard();
+  EXPECT_EQ(initial_window_bounds.ToString(),
+            parent_window->bounds().ToString());
+}
+
+TEST_F(WorkspaceLayoutManagerKeyboardTest, AdjustWindowForA11yKeyboard) {
+  gfx::Rect work_area(
+      display::Screen::GetScreen()->GetPrimaryDisplay().work_area());
+  gfx::Rect keyboard_bounds(work_area.x(),
+                            work_area.y() + work_area.height() / 2,
+                            work_area.width(),
+                            work_area.height() / 2);
+
+  SetKeyboardBounds(keyboard_bounds);
+
+  aura::test::TestWindowDelegate delegate;
+  std::unique_ptr<aura::Window> window(
+      CreateTestWindowInShellWithDelegate(&delegate, -1, work_area));
+
+  int available_height =
+      display::Screen::GetScreen()->GetPrimaryDisplay().bounds().height() -
+      keyboard_bounds.height();
+
+  wm::ActivateWindow(window.get());
+
+  EXPECT_EQ(gfx::Rect(work_area).ToString(), window->bounds().ToString());
+  ShowKeyboard();
+  EXPECT_EQ(gfx::Rect(work_area.origin(),
+            gfx::Size(work_area.width(), available_height)).ToString(),
+            window->bounds().ToString());
+  HideKeyboard();
+  EXPECT_EQ(gfx::Rect(work_area).ToString(), window->bounds().ToString());
+
+  gfx::Rect small_window_bound(50, 50, 100, 500);
+  window->SetBounds(small_window_bound);
+  EXPECT_EQ(small_window_bound.ToString(), window->bounds().ToString());
+  ShowKeyboard();
+  EXPECT_EQ(gfx::Rect(50, 0, 100, available_height).ToString(),
+            window->bounds().ToString());
+  HideKeyboard();
+  EXPECT_EQ(small_window_bound.ToString(), window->bounds().ToString());
+
+  gfx::Rect occluded_window_bounds(50,
+      keyboard_bounds.y() + keyboard_bounds.height()/2, 50,
+      keyboard_bounds.height()/2);
+  window->SetBounds(occluded_window_bounds);
+  EXPECT_EQ(occluded_window_bounds.ToString(),
+      occluded_window_bounds.ToString());
+  ShowKeyboard();
+  EXPECT_EQ(gfx::Rect(50,
+                      keyboard_bounds.y() - keyboard_bounds.height()/2,
+                      occluded_window_bounds.width(),
+                      occluded_window_bounds.height()).ToString(),
+            window->bounds().ToString());
+  HideKeyboard();
+  EXPECT_EQ(occluded_window_bounds.ToString(), window->bounds().ToString());
+}
+
+}  // namespace ash
diff --git a/media/base/BUILD.gn b/media/base/BUILD.gn
index 4b1cd13..458d4ff 100644
--- a/media/base/BUILD.gn
+++ b/media/base/BUILD.gn
@@ -537,10 +537,8 @@
       "simd/scale_yuv_to_rgb_sse.asm",
     ]
 
-    # TODO(ajwong): Only export if shared_library build...
     yasm_flags = [
       "-DCHROMIUM",
-      "-DEXPORT_SYMBOLS",
 
       # In addition to the same path as source asm, let yasm %include
       # search path be relative to src/ per Chromium policy.
@@ -548,6 +546,10 @@
       rebase_path("..", root_build_dir),
     ]
 
+    if (is_component_build) {
+      yasm_flags += [ "-DEXPORT_SYMBOLS" ]
+    }
+
     inputs = [
       "//third_party/x86inc/x86inc.asm",
       "simd/convert_rgb_to_yuv_ssse3.inc",
diff --git a/media/base/ipc/OWNERS b/media/base/ipc/OWNERS
new file mode 100644
index 0000000..ea2b0ff
--- /dev/null
+++ b/media/base/ipc/OWNERS
@@ -0,0 +1,12 @@
+# For security review of IPC message files.
+per-file *_param_traits.*=set noparent
+per-file *_param_traits.*=dcheng@chromium.org
+per-file *_param_traits.*=inferno@chromium.org
+per-file *_param_traits.*=jln@chromium.org
+per-file *_param_traits.*=jschuh@chromium.org
+per-file *_param_traits.*=kenrb@chromium.org
+per-file *_param_traits.*=mkwst@chromium.org
+per-file *_param_traits.*=nasko@chromium.org
+per-file *_param_traits.*=palmer@chromium.org
+per-file *_param_traits.*=tsepez@chromium.org
+per-file *_param_traits.*=wfh@chromium.org
diff --git a/media/gpu/BUILD.gn b/media/gpu/BUILD.gn
index 5ca89e2..00386d9 100644
--- a/media/gpu/BUILD.gn
+++ b/media/gpu/BUILD.gn
@@ -184,7 +184,10 @@
                  "vt_video_encode_accelerator_mac.cc",
                  "vt_video_encode_accelerator_mac.h",
                ] + get_target_outputs(":libvt_generate_stubs")
-    deps += [ ":libvt_generate_stubs" ]
+    deps += [
+      ":libvt_generate_stubs",
+      "//third_party/webrtc/common_video:common_video",
+    ]
     libs += [
       "CoreFoundation.framework",
       "Foundation.framework",
@@ -368,6 +371,7 @@
       "//ui/gfx/geometry",
       "//ui/gl",
       "//ui/gl:test_support",
+      "//ui/gl/init",
     ]
 
     configs += [ "//third_party/khronos:khronos_headers" ]
diff --git a/media/gpu/DEPS b/media/gpu/DEPS
index 182085c3..bd5343d 100644
--- a/media/gpu/DEPS
+++ b/media/gpu/DEPS
@@ -4,6 +4,8 @@
   "+third_party/libva",
   "+third_party/libyuv",
   "+third_party/v4l-utils",
+  "+third_party/webrtc/common_video",
+  "+third_party/webrtc/system_wrappers",
   "+ui/display/chromeos",
   "+ui/display/types",
   "+ui/platform_window",
diff --git a/media/gpu/ipc/common/OWNERS b/media/gpu/ipc/common/OWNERS
new file mode 100644
index 0000000..107c401
--- /dev/null
+++ b/media/gpu/ipc/common/OWNERS
@@ -0,0 +1,13 @@
+# Changes to IPCs require a security review to avoid introducing
+# new sandbox escapes.
+set noparent
+dcheng@chromium.org
+inferno@chromium.org
+jln@chromium.org
+jschuh@chromium.org
+kenrb@chromium.org
+mkwst@chromium.org
+nasko@chromium.org
+palmer@chromium.org
+tsepez@chromium.org
+wfh@chromium.org
diff --git a/media/gpu/ipc/media_ipc.gyp b/media/gpu/ipc/media_ipc.gyp
index fc81008be..f558216b 100644
--- a/media/gpu/ipc/media_ipc.gyp
+++ b/media/gpu/ipc/media_ipc.gyp
@@ -99,6 +99,11 @@
             },
           },
         }],
+        ['OS=="mac"', {
+          'dependencies': [
+            '../../../third_party/webrtc/common_video/common_video.gyp:common_video',
+          ],
+        }],
       ],
     }
   ]
diff --git a/media/gpu/ipc/service/BUILD.gn b/media/gpu/ipc/service/BUILD.gn
index d8ffd04..16d6922 100644
--- a/media/gpu/ipc/service/BUILD.gn
+++ b/media/gpu/ipc/service/BUILD.gn
@@ -44,4 +44,8 @@
   if (is_win) {
     configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
   }
+
+  if (is_mac) {
+    deps += [ "//third_party/webrtc/common_video:common_video" ]
+  }
 }
diff --git a/media/gpu/rendering_helper.cc b/media/gpu/rendering_helper.cc
index b72dc10..30b1a1e 100644
--- a/media/gpu/rendering_helper.cc
+++ b/media/gpu/rendering_helper.cc
@@ -25,6 +25,7 @@
 #include "ui/gl/gl_context.h"
 #include "ui/gl/gl_implementation.h"
 #include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 
 #if defined(OS_WIN)
 #include <windows.h>
@@ -194,7 +195,7 @@
   cmd_line->AppendSwitchASCII(switches::kUseGL, gfx::kGLImplementationEGLName);
 #endif
 
-  if (!gfx::GLSurface::InitializeOneOff())
+  if (!gl::init::InitializeGLOneOff())
     LOG(FATAL) << "Could not initialize GL";
   done->Signal();
 }
@@ -329,14 +330,14 @@
   render_as_thumbnails_ = params.render_as_thumbnails;
   message_loop_ = base::MessageLoop::current();
 
-  gl_surface_ = gfx::GLSurface::CreateViewGLSurface(window_);
+  gl_surface_ = gl::init::CreateViewGLSurface(window_);
 #if defined(USE_OZONE)
   gl_surface_->Resize(platform_window_delegate_->GetSize(), 1.f, true);
 #endif  // defined(USE_OZONE)
   screen_size_ = gl_surface_->GetSize();
 
-  gl_context_ = gfx::GLContext::CreateGLContext(NULL, gl_surface_.get(),
-                                                gfx::PreferIntegratedGpu);
+  gl_context_ = gl::init::CreateGLContext(nullptr, gl_surface_.get(),
+                                          gfx::PreferIntegratedGpu);
   CHECK(gl_context_->MakeCurrent(gl_surface_.get()));
 
   CHECK_GT(params.window_sizes.size(), 0U);
diff --git a/media/gpu/vt_video_encode_accelerator_mac.cc b/media/gpu/vt_video_encode_accelerator_mac.cc
index 4c996261..fbe174c 100644
--- a/media/gpu/vt_video_encode_accelerator_mac.cc
+++ b/media/gpu/vt_video_encode_accelerator_mac.cc
@@ -11,6 +11,7 @@
 #include "media/base/mac/coremedia_glue.h"
 #include "media/base/mac/corevideo_glue.h"
 #include "media/base/mac/video_frame_mac.h"
+#include "third_party/webrtc/system_wrappers/include/clock.h"
 
 namespace media {
 
@@ -63,8 +64,16 @@
   DISALLOW_IMPLICIT_CONSTRUCTORS(BitstreamBufferRef);
 };
 
+// .5 is set as a minimum to prevent overcompensating for large temporary
+// overshoots. We don't want to degrade video quality too badly.
+// .95 is set to prevent oscillations. When a lower bitrate is set on the
+// encoder than previously set, its output seems to have a brief period of
+// drastically reduced bitrate, so we want to avoid that. In steady state
+// conditions, 0.95 seems to give us better overall bitrate over long periods
+// of time.
 VTVideoEncodeAccelerator::VTVideoEncodeAccelerator()
-    : client_task_runner_(base::ThreadTaskRunnerHandle::Get()),
+    : bitrate_adjuster_(webrtc::Clock::GetRealTimeClock(), .5, .95),
+      client_task_runner_(base::ThreadTaskRunnerHandle::Get()),
       encoder_thread_("VTEncoderThread"),
       encoder_task_weak_factory_(this) {
   encoder_weak_ptr_ = encoder_task_weak_factory_.GetWeakPtr();
@@ -273,6 +282,10 @@
   std::unique_ptr<InProgressFrameEncode> request(
       new InProgressFrameEncode(frame->timestamp(), ref_time));
 
+  // Update the bitrate if needed.
+  RequestEncodingParametersChangeTask(bitrate_adjuster_.GetAdjustedBitrateBps(),
+                                      frame_rate_);
+
   // We can pass the ownership of |request| to the encode callback if
   // successful. Otherwise let it fall out of scope.
   OSStatus status = videotoolbox_glue_->VTCompressionSessionEncodeFrame(
@@ -308,28 +321,39 @@
     uint32_t framerate) {
   DCHECK(encoder_thread_task_runner_->BelongsToCurrentThread());
 
-  frame_rate_ = framerate > 1 ? framerate : 1;
-  target_bitrate_ = bitrate > 1 ? bitrate : 1;
-
   if (!compression_session_) {
     NotifyError(kPlatformFailureError);
     return;
   }
 
-  media::video_toolbox::SessionPropertySetter session_property_setter(
-      compression_session_, videotoolbox_glue_);
-  // TODO(emircan): See crbug.com/425352.
-  bool rv = session_property_setter.Set(
-      videotoolbox_glue_->kVTCompressionPropertyKey_AverageBitRate(),
-      target_bitrate_);
-  rv &= session_property_setter.Set(
-      videotoolbox_glue_->kVTCompressionPropertyKey_ExpectedFrameRate(),
-      frame_rate_);
-  rv &= session_property_setter.Set(
-      videotoolbox_glue_->kVTCompressionPropertyKey_DataRateLimits(),
-      media::video_toolbox::ArrayWithIntegerAndFloat(
-          target_bitrate_ / kBitsPerByte, 1.0f));
-  DLOG_IF(ERROR, !rv) << "Couldn't change session encoding parameters.";
+  bool rv;
+  if (framerate != static_cast<uint32_t>(frame_rate_)) {
+    frame_rate_ = framerate > 1 ? framerate : 1;
+    media::video_toolbox::SessionPropertySetter session_property_setter(
+        compression_session_, videotoolbox_glue_);
+    rv = session_property_setter.Set(
+        videotoolbox_glue_->kVTCompressionPropertyKey_ExpectedFrameRate(),
+        frame_rate_);
+    DLOG_IF(ERROR, !rv)
+        << "Couldn't change frame rate parameters of encode session.";
+  }
+
+  if (bitrate != static_cast<uint32_t>(adjusted_bitrate_)) {
+    target_bitrate_ = bitrate > 1 ? bitrate : 1;
+    bitrate_adjuster_.SetTargetBitrateBps(target_bitrate_);
+    adjusted_bitrate_ = bitrate_adjuster_.GetAdjustedBitrateBps();
+    media::video_toolbox::SessionPropertySetter session_property_setter(
+        compression_session_, videotoolbox_glue_);
+    rv = session_property_setter.Set(
+        videotoolbox_glue_->kVTCompressionPropertyKey_AverageBitRate(),
+        adjusted_bitrate_);
+    rv &= session_property_setter.Set(
+        videotoolbox_glue_->kVTCompressionPropertyKey_DataRateLimits(),
+        media::video_toolbox::ArrayWithIntegerAndFloat(
+            adjusted_bitrate_ / kBitsPerByte, 1.0f));
+    DLOG_IF(ERROR, !rv)
+        << "Couldn't change bitrate parameters of encode session.";
+  }
 }
 
 void VTVideoEncodeAccelerator::DestroyTask() {
@@ -435,6 +459,7 @@
     DLOG(ERROR) << "Cannot copy output from SampleBuffer to AnnexBBuffer.";
     used_buffer_size = 0;
   }
+  bitrate_adjuster_.Update(used_buffer_size);
 
   client_task_runner_->PostTask(
       FROM_HERE, base::Bind(&Client::BitstreamBufferReady, client_,
diff --git a/media/gpu/vt_video_encode_accelerator_mac.h b/media/gpu/vt_video_encode_accelerator_mac.h
index c12558c..ede9822 100644
--- a/media/gpu/vt_video_encode_accelerator_mac.h
+++ b/media/gpu/vt_video_encode_accelerator_mac.h
@@ -12,6 +12,7 @@
 #include "media/base/mac/videotoolbox_helpers.h"
 #include "media/gpu/media_gpu_export.h"
 #include "media/video/video_encode_accelerator.h"
+#include "third_party/webrtc/common_video/include/bitrate_adjuster.h"
 
 namespace media {
 
@@ -107,6 +108,10 @@
   size_t bitstream_buffer_size_;
   int32_t frame_rate_;
   int32_t target_bitrate_;
+  int32_t adjusted_bitrate_;
+
+  // Bitrate adjuster used to fix VideoToolbox's inconsistent bitrate issues.
+  webrtc::BitrateAdjuster bitrate_adjuster_;
 
   // Bitstream buffers ready to be used to return encoded output as a FIFO.
   std::deque<std::unique_ptr<BitstreamBufferRef>> bitstream_buffer_queue_;
diff --git a/media/media.gyp b/media/media.gyp
index f3387a79..7e037f768 100644
--- a/media/media.gyp
+++ b/media/media.gyp
@@ -2149,6 +2149,11 @@
             '<(DEPTH)/third_party/libyuv',
           ],
           'conditions': [
+            ['OS=="mac"', {
+              'dependencies': [
+                '../third_party/webrtc/common_video/common_video.gyp:common_video',
+              ],
+            }],
             ['use_x11==1', {
               'dependencies': [
                 '../ui/gfx/x/gfx_x11.gyp:gfx_x11',
diff --git a/media/media_gpu.gypi b/media/media_gpu.gypi
index 364a3dd..70c1398 100644
--- a/media/media_gpu.gypi
+++ b/media/media_gpu.gypi
@@ -13,6 +13,7 @@
     '../ui/display/display.gyp:display_types',
     '../ui/gfx/gfx.gyp:gfx_geometry',
     '../ui/gl/gl.gyp:gl',
+    '../ui/gl/init/gl_init.gyp:gl_init',
     '../ui/platform_window/platform_window.gyp:platform_window',
   ],
   'sources': [
@@ -34,6 +35,7 @@
       'dependencies': [
         '../media/media.gyp:media',
         '../content/app/resources/content_resources.gyp:content_resources',
+        '../third_party/webrtc/common_video/common_video.gyp:common_video',
         '../ui/accelerated_widget_mac/accelerated_widget_mac.gyp:accelerated_widget_mac'
       ],
       'sources': [
@@ -322,6 +324,7 @@
       'dependencies': [
         '../media/media.gyp:media',
         '../ui/gl/gl.gyp:gl',
+        '../ui/gl/init/gl_init.gyp:gl_init',
       ],
       'link_settings': {
         'libraries': [
diff --git a/mojo/edk/system/channel.cc b/mojo/edk/system/channel.cc
index c8d6931..a00f0ce 100644
--- a/mojo/edk/system/channel.cc
+++ b/mojo/edk/system/channel.cc
@@ -150,7 +150,8 @@
 #if defined(OS_WIN)
   uint32_t max_handles = extra_header_size / sizeof(PlatformHandle);
 #elif defined(OS_MACOSX) && !defined(OS_IOS)
-  uint32_t max_handles = extra_header_size / sizeof(MachPortsEntry);
+  uint32_t max_handles = (extra_header_size - sizeof(MachPortsExtraHeader)) /
+      sizeof(MachPortsEntry);
 #endif
   if (header->num_handles > max_handles) {
     DLOG(ERROR) << "Decoding invalid message:" << header->num_handles
@@ -164,14 +165,20 @@
   DCHECK_EQ(message->extra_header_size(), extra_header_size);
   DCHECK_EQ(message->header_->num_header_bytes, header->num_header_bytes);
 
-  // Copy all payload bytes.
-  memcpy(message->mutable_payload(),
-         static_cast<const char*>(data) + header->num_header_bytes,
-         data_num_bytes - header->num_header_bytes);
-  // Copy extra header bytes.
-  memcpy(message->mutable_extra_header(),
-         static_cast<const char*>(data) + sizeof(Header),
-         message->extra_header_size());
+  if (data_num_bytes > header->num_header_bytes) {
+    // Copy all payload bytes.
+    memcpy(message->mutable_payload(),
+           static_cast<const char*>(data) + header->num_header_bytes,
+           data_num_bytes - header->num_header_bytes);
+  }
+
+  if (message->extra_header_size()) {
+    // Copy extra header bytes.
+    memcpy(message->mutable_extra_header(),
+           static_cast<const char*>(data) + sizeof(Header),
+           message->extra_header_size());
+  }
+
   message->header_->num_handles = header->num_handles;
 
   return message;
@@ -530,9 +537,14 @@
     void* payload = payload_size ? const_cast<Message::Header*>(&header[1])
                                  : nullptr;
 #else
+    if (header->num_header_bytes < sizeof(Message::Header) ||
+        header->num_header_bytes > header->num_bytes) {
+      LOG(ERROR) << "Invalid message header size: " << header->num_header_bytes;
+      return false;
+    }
     size_t extra_header_size =
         header->num_header_bytes - sizeof(Message::Header);
-    const void* extra_header = header + 1;
+    const void* extra_header = extra_header_size ? header + 1 : nullptr;
     size_t payload_size = header->num_bytes - header->num_header_bytes;
     void* payload =
         payload_size ? reinterpret_cast<Message::Header*>(
@@ -543,8 +555,11 @@
 
     ScopedPlatformHandleVectorPtr handles;
     if (header->num_handles > 0) {
-      handles = GetReadPlatformHandles(header->num_handles, extra_header,
-                                       extra_header_size);
+      if (!GetReadPlatformHandles(header->num_handles, extra_header,
+                                 extra_header_size, &handles)) {
+        return false;
+      }
+
       if (!handles) {
         // Not enough handles available for this message.
         break;
@@ -553,8 +568,10 @@
 
     // We've got a complete message! Dispatch it and try another.
     if (header->message_type != Message::Header::MessageType::NORMAL) {
-      OnControlMessage(header->message_type, payload, payload_size,
-                       std::move(handles));
+      if (!OnControlMessage(header->message_type, payload, payload_size,
+                            std::move(handles))) {
+        return false;
+      }
       did_dispatch_message = true;
     } else if (delegate_) {
       delegate_->OnChannelMessage(payload, payload_size, std::move(handles));
@@ -573,5 +590,12 @@
     delegate_->OnChannelError();
 }
 
+bool Channel::OnControlMessage(Message::Header::MessageType message_type,
+                               const void* payload,
+                               size_t payload_size,
+                               ScopedPlatformHandleVectorPtr handles) {
+  return false;
+}
+
 }  // namespace edk
 }  // namespace mojo
diff --git a/mojo/edk/system/channel.h b/mojo/edk/system/channel.h
index 80d53fc..ab93431 100644
--- a/mojo/edk/system/channel.h
+++ b/mojo/edk/system/channel.h
@@ -247,17 +247,25 @@
   // |extra_header| and |extra_header_size| correspond to the extra header data.
   // Depending on the Channel implementation, this body may encode platform
   // handles, or handles may be stored and managed elsewhere by the
-  // implementation.  If |num_handles| handles cannot be returned, this must
-  // return null.
-  virtual ScopedPlatformHandleVectorPtr GetReadPlatformHandles(
+  // implementation.
+  //
+  // Returns |false| on unrecoverable error (i.e. the Channel should be closed).
+  // Returns |true| otherwise. Note that it is possible on some platforms for an
+  // insufficient number of handles to be available when this call is made, but
+  // this is not necessarily an error condition. In such cases this returns
+  // |true| but |*handles| will also be reset to null.
+  virtual bool GetReadPlatformHandles(
       size_t num_handles,
       const void* extra_header,
-      size_t extra_header_size) = 0;
+      size_t extra_header_size,
+      ScopedPlatformHandleVectorPtr* handles) = 0;
 
-  virtual void OnControlMessage(Message::Header::MessageType message_type,
+  // Handles a received control message. Returns |true| if the message is
+  // accepted, or |false| otherwise.
+  virtual bool OnControlMessage(Message::Header::MessageType message_type,
                                 const void* payload,
                                 size_t payload_size,
-                                ScopedPlatformHandleVectorPtr handles) {}
+                                ScopedPlatformHandleVectorPtr handles);
 
  private:
   friend class base::RefCountedThreadSafe<Channel>;
diff --git a/mojo/edk/system/channel_posix.cc b/mojo/edk/system/channel_posix.cc
index 8e6b2ca..72c559bf 100644
--- a/mojo/edk/system/channel_posix.cc
+++ b/mojo/edk/system/channel_posix.cc
@@ -9,6 +9,7 @@
 
 #include <algorithm>
 #include <deque>
+#include <limits>
 #include <memory>
 
 #include "base/bind.h"
@@ -132,10 +133,13 @@
     }
   }
 
-  ScopedPlatformHandleVectorPtr GetReadPlatformHandles(
+  bool GetReadPlatformHandles(
       size_t num_handles,
       const void* extra_header,
-      size_t extra_header_size) override {
+      size_t extra_header_size,
+      ScopedPlatformHandleVectorPtr* handles) override {
+    if (num_handles > std::numeric_limits<uint16_t>::max())
+      return false;
 #if defined(OS_MACOSX) && !defined(OS_IOS)
     // On OSX, we can have mach ports which are located in the extra header
     // section.
@@ -147,41 +151,43 @@
         reinterpret_cast<const MachPortsExtraHeader*>(extra_header);
     size_t num_mach_ports = mach_ports_header->num_ports;
     CHECK(num_mach_ports <= num_handles);
-    if (incoming_platform_handles_.size() + num_mach_ports < num_handles)
-      return nullptr;
+    if (incoming_platform_handles_.size() + num_mach_ports < num_handles) {
+      handles->reset();
+      return true;
+    }
 
-    ScopedPlatformHandleVectorPtr handles(
-        new PlatformHandleVector(num_handles));
+    handles->reset(new PlatformHandleVector(num_handles));
     const MachPortsEntry* mach_ports = mach_ports_header->entries;
     for (size_t i = 0, mach_port_index = 0; i < num_handles; ++i) {
       if (mach_port_index < num_mach_ports &&
           mach_ports[mach_port_index].index == i) {
-        (*handles)[i] = PlatformHandle(
+        (*handles)->at(i) = PlatformHandle(
             static_cast<mach_port_t>(mach_ports[mach_port_index].mach_port));
-        CHECK((*handles)[i].type == PlatformHandle::Type::MACH);
+        CHECK((*handles)->at(i).type == PlatformHandle::Type::MACH);
         // These are actually just Mach port names until they're resolved from
         // the remote process.
-        (*handles)[i].type = PlatformHandle::Type::MACH_NAME;
+        (*handles)->at(i).type = PlatformHandle::Type::MACH_NAME;
         mach_port_index++;
       } else {
         CHECK(!incoming_platform_handles_.empty());
-        (*handles)[i] = incoming_platform_handles_.front();
+        (*handles)->at(i) = incoming_platform_handles_.front();
         incoming_platform_handles_.pop_front();
       }
     }
 #else
-    if (incoming_platform_handles_.size() < num_handles)
-      return nullptr;
+    if (incoming_platform_handles_.size() < num_handles) {
+      handles->reset();
+      return true;
+    }
 
-    ScopedPlatformHandleVectorPtr handles(
-        new PlatformHandleVector(num_handles));
+    handles->reset(new PlatformHandleVector(num_handles));
     for (size_t i = 0; i < num_handles; ++i) {
-      (*handles)[i] = incoming_platform_handles_.front();
+      (*handles)->at(i) = incoming_platform_handles_.front();
       incoming_platform_handles_.pop_front();
     }
 #endif
 
-    return handles;
+    return true;
   }
 
  private:
@@ -395,30 +401,37 @@
   }
 
 #if defined(OS_MACOSX)
-  void OnControlMessage(Message::Header::MessageType message_type,
+  bool OnControlMessage(Message::Header::MessageType message_type,
                         const void* payload,
                         size_t payload_size,
                         ScopedPlatformHandleVectorPtr handles) override {
     switch (message_type) {
       case Message::Header::MessageType::HANDLES_SENT: {
+        if (payload_size == 0)
+          break;
         MessagePtr message(new Channel::Message(
             payload_size, 0, Message::Header::MessageType::HANDLES_SENT_ACK));
         memcpy(message->mutable_payload(), payload, payload_size);
         Write(std::move(message));
-        break;
+        return true;
       }
+
       case Message::Header::MessageType::HANDLES_SENT_ACK: {
+        size_t num_fds = payload_size / sizeof(int);
+        if (num_fds == 0 || payload_size % sizeof(int) != 0)
+          break;
+
         const int* fds = reinterpret_cast<const int*>(payload);
-        size_t num_fds = payload_size / sizeof(*fds);
-        if (payload_size % sizeof(*fds) != 0 || !CloseHandles(fds, num_fds)) {
-          io_task_runner_->PostTask(FROM_HERE,
-                                    base::Bind(&ChannelPosix::OnError, this));
-        }
-        break;
+        if (!CloseHandles(fds, num_fds))
+          break;
+        return true;
       }
+
       default:
-        NOTREACHED();
+        break;
     }
+
+    return false;
   }
 
   // Closes handles referenced by |fds|. Returns false if |num_fds| is 0, or if
diff --git a/mojo/edk/system/channel_win.cc b/mojo/edk/system/channel_win.cc
index 816c8494..be862f9 100644
--- a/mojo/edk/system/channel_win.cc
+++ b/mojo/edk/system/channel_win.cc
@@ -9,6 +9,7 @@
 
 #include <algorithm>
 #include <deque>
+#include <limits>
 #include <memory>
 
 #include "base/bind.h"
@@ -114,18 +115,20 @@
     }
   }
 
-  ScopedPlatformHandleVectorPtr GetReadPlatformHandles(
+  bool GetReadPlatformHandles(
       size_t num_handles,
       const void* extra_header,
-      size_t extra_header_size) override {
+      size_t extra_header_size,
+      ScopedPlatformHandleVectorPtr* handles) override {
+    if (num_handles > std::numeric_limits<uint16_t>::max())
+      return false;
     size_t handles_size = sizeof(PlatformHandle) * num_handles;
     if (handles_size > extra_header_size)
-      return nullptr;
-
-    ScopedPlatformHandleVectorPtr handles(
-        new PlatformHandleVector(num_handles));
-    memcpy(handles->data(), extra_header, handles_size);
-    return handles;
+      return false;
+    DCHECK(extra_header);
+    handles->reset(new PlatformHandleVector(num_handles));
+    memcpy((*handles)->data(), extra_header, handles_size);
+    return true;
   }
 
  private:
diff --git a/mojo/edk/system/ports/node.cc b/mojo/edk/system/ports/node.cc
index 1bee00c..75e9857 100644
--- a/mojo/edk/system/ports/node.cc
+++ b/mojo/edk/system/ports/node.cc
@@ -30,6 +30,8 @@
   // Have we already doled out the last message (i.e., do we expect to NOT
   // receive further messages)?
   uint64_t next_sequence_num = port->message_queue.next_sequence_num();
+  if (port->state == Port::kClosed)
+    return false;
   if (port->peer_closed || port->remove_proxy_on_last_message) {
     if (port->last_sequence_num_to_receive == next_sequence_num - 1)
       return false;
@@ -213,13 +215,13 @@
     // If the port being closed still has unread messages, then we need to take
     // care to close those ports so as to avoid leaking memory.
     port->message_queue.GetReferencedPorts(&referenced_port_names);
+
+    ErasePort_Locked(port_ref.name());
   }
 
   DVLOG(2) << "Sending ObserveClosure from " << port_ref.name() << "@" << name_
            << " to " << peer_port_name << "@" << peer_node_name;
 
-  ErasePort(port_ref.name());
-
   delegate_->ForwardMessage(
       peer_node_name,
       NewInternalMessage(peer_port_name, EventType::kObserveClosure, data));
@@ -821,11 +823,6 @@
   return OK;
 }
 
-void Node::ErasePort(const PortName& port_name) {
-  base::AutoLock lock(ports_lock_);
-  return ErasePort_Locked(port_name);
-}
-
 void Node::ErasePort_Locked(const PortName& port_name) {
   ports_lock_.AssertAcquired();
   ports_.erase(port_name);
diff --git a/mojo/edk/system/ports/node.h b/mojo/edk/system/ports/node.h
index 44179b8..e06942a 100644
--- a/mojo/edk/system/ports/node.h
+++ b/mojo/edk/system/ports/node.h
@@ -154,7 +154,6 @@
 
   int AddPortWithName(const PortName& port_name,
                       const scoped_refptr<Port>& port);
-  void ErasePort(const PortName& port_name);
   void ErasePort_Locked(const PortName& port_name);
   scoped_refptr<Port> GetPort(const PortName& port_name);
   scoped_refptr<Port> GetPort_Locked(const PortName& port_name);
diff --git a/net/cert/sth_distributor.cc b/net/cert/sth_distributor.cc
index 0b8df260..9d56c03 100644
--- a/net/cert/sth_distributor.cc
+++ b/net/cert/sth_distributor.cc
@@ -9,9 +9,10 @@
 #include "net/cert/signed_tree_head.h"
 
 namespace {
-const char kPilotLogID[33] =
-    "\xa4\xb9\x09\x90\xb4\x18\x58\x14\x87\xbb\x13\xa2\xcc\x67\x70\x0a\x3c\x35"
-    "\x98\x04\xf9\x1b\xdf\xb8\xe3\x77\xcd\x0e\xc8\x0d\xdc\x10";
+const uint8_t kPilotLogID[] = {0xa4, 0xb9, 0x09, 0x90, 0xb4, 0x18, 0x58, 0x14,
+                               0x87, 0xbb, 0x13, 0xa2, 0xcc, 0x67, 0x70, 0x0a,
+                               0x3c, 0x35, 0x98, 0x04, 0xf9, 0x1b, 0xdf, 0xb8,
+                               0xe3, 0x77, 0xcd, 0x0e, 0xc8, 0x0d, 0xdc, 0x10};
 }
 
 namespace net {
@@ -26,8 +27,9 @@
 void STHDistributor::NewSTHObserved(const SignedTreeHead& sth) {
   FOR_EACH_OBSERVER(STHObserver, observer_list_, NewSTHObserved(sth));
 
-  if (sth.log_id.compare(0, sth.log_id.size(), kPilotLogID,
-                         arraysize(kPilotLogID) - 1) != 0)
+  if (sth.log_id.compare(0, sth.log_id.size(),
+                         reinterpret_cast<const char*>(kPilotLogID),
+                         sizeof(kPilotLogID)) != 0)
     return;
 
   const base::TimeDelta sth_age = base::Time::Now() - sth.timestamp;
diff --git a/net/http/bidirectional_stream.cc b/net/http/bidirectional_stream.cc
index b49ee58f2..8b83c1e 100644
--- a/net/http/bidirectional_stream.cc
+++ b/net/http/bidirectional_stream.cc
@@ -145,7 +145,7 @@
   return rv;
 }
 
-void BidirectionalStream::SendData(IOBuffer* data,
+void BidirectionalStream::SendData(const scoped_refptr<IOBuffer>& data,
                                    int length,
                                    bool end_stream) {
   DCHECK(stream_impl_);
@@ -157,9 +157,10 @@
   write_buffer_len_list_.push_back(length);
 }
 
-void BidirectionalStream::SendvData(const std::vector<IOBuffer*>& buffers,
-                                    const std::vector<int>& lengths,
-                                    bool end_stream) {
+void BidirectionalStream::SendvData(
+    const std::vector<scoped_refptr<IOBuffer>>& buffers,
+    const std::vector<int>& lengths,
+    bool end_stream) {
   DCHECK(stream_impl_);
   DCHECK_EQ(buffers.size(), lengths.size());
   DCHECK(write_buffer_list_.empty());
diff --git a/net/http/bidirectional_stream.h b/net/http/bidirectional_stream.h
index 71e69d7..86b3fff2d 100644
--- a/net/http/bidirectional_stream.h
+++ b/net/http/bidirectional_stream.h
@@ -126,10 +126,12 @@
   // invoked, and should not be called again until Delegate::OnDataSent is
   // invoked. If |end_stream| is true, the DATA frame will have an END_STREAM
   // flag.
-  void SendData(IOBuffer* data, int length, bool end_stream);
+  void SendData(const scoped_refptr<IOBuffer>& data,
+                int length,
+                bool end_stream);
 
   // Same as SendData except this takes in a vector of IOBuffers.
-  void SendvData(const std::vector<IOBuffer*>& buffers,
+  void SendvData(const std::vector<scoped_refptr<IOBuffer>>& buffers,
                  const std::vector<int>& lengths,
                  bool end_stream);
 
diff --git a/net/http/bidirectional_stream_impl.h b/net/http/bidirectional_stream_impl.h
index b4d00456..8dff82d 100644
--- a/net/http/bidirectional_stream_impl.h
+++ b/net/http/bidirectional_stream_impl.h
@@ -10,6 +10,7 @@
 #include <memory>
 
 #include "base/macros.h"
+#include "base/memory/ref_counted.h"
 #include "net/base/net_export.h"
 #include "net/socket/next_proto.h"
 
@@ -107,9 +108,11 @@
   // Delegate::OnHeadersSent is invoked, and should not be called again until
   // Delegate::OnDataSent is invoked. If |end_stream| is true, the DATA frame
   // will have an END_STREAM flag.
-  virtual void SendData(IOBuffer* data, int length, bool end_stream) = 0;
+  virtual void SendData(const scoped_refptr<IOBuffer>& data,
+                        int length,
+                        bool end_stream) = 0;
 
-  virtual void SendvData(const std::vector<IOBuffer*>& buffers,
+  virtual void SendvData(const std::vector<scoped_refptr<IOBuffer>>& buffers,
                          const std::vector<int>& lengths,
                          bool end_stream) = 0;
 
diff --git a/net/http/bidirectional_stream_unittest.cc b/net/http/bidirectional_stream_unittest.cc
index 2b295361..9fa41cf 100644
--- a/net/http/bidirectional_stream_unittest.cc
+++ b/net/http/bidirectional_stream_unittest.cc
@@ -132,13 +132,15 @@
       loop_->Run();
   }
 
-  void SendData(IOBuffer* data, int length, bool end_of_stream) {
+  void SendData(const scoped_refptr<IOBuffer>& data,
+                int length,
+                bool end_of_stream) {
     not_expect_callback_ = true;
     stream_->SendData(data, length, end_of_stream);
     not_expect_callback_ = false;
   }
 
-  void SendvData(const std::vector<IOBuffer*>& data,
+  void SendvData(const std::vector<scoped_refptr<IOBuffer>>& data,
                  const std::vector<int>& length,
                  bool end_of_stream) {
     not_expect_callback_ = true;
@@ -540,7 +542,7 @@
   scoped_refptr<StringIOBuffer> buf(
       new StringIOBuffer(std::string(kBodyData, kBodyDataSize)));
   // Send a DATA frame.
-  delegate->SendData(buf.get(), buf->size(), true);
+  delegate->SendData(buf, buf->size(), true);
   // ReadData returns asynchronously because no data is buffered.
   int rv = delegate->ReadData();
   EXPECT_EQ(ERR_IO_PENDING, rv);
@@ -671,7 +673,7 @@
       new StringIOBuffer(std::string(kBodyData, kBodyDataSize)));
 
   // Send a DATA frame.
-  delegate->SendData(buf.get(), buf->size(), false);
+  delegate->SendData(buf, buf->size(), false);
   // ReadData and it should return asynchronously because no data is buffered.
   int rv = delegate->ReadData();
   EXPECT_EQ(ERR_IO_PENDING, rv);
@@ -684,7 +686,7 @@
   EXPECT_EQ(1, delegate->on_data_read_count());
 
   // Send a DATA frame.
-  delegate->SendData(buf.get(), buf->size(), false);
+  delegate->SendData(buf, buf->size(), false);
   // ReadData and it should return asynchronously because no data is buffered.
   rv = delegate->ReadData();
   EXPECT_EQ(ERR_IO_PENDING, rv);
@@ -698,7 +700,7 @@
   EXPECT_EQ(2, delegate->on_data_sent_count());
 
   // Send the last body frame. Client half closes.
-  delegate->SendData(buf.get(), buf->size(), true);
+  delegate->SendData(buf, buf->size(), true);
   sequenced_data_->Resume();
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(3, delegate->on_data_sent_count());
@@ -767,8 +769,7 @@
   scoped_refptr<StringIOBuffer> buf(new StringIOBuffer(body_data.substr(0, 5)));
   scoped_refptr<StringIOBuffer> buf2(
       new StringIOBuffer(body_data.substr(5, body_data.size() - 5)));
-  delegate->SendvData({buf.get(), buf2.get()}, {buf->size(), buf2->size()},
-                      true);
+  delegate->SendvData({buf, buf2.get()}, {buf->size(), buf2->size()}, true);
   sequenced_data_->RunUntilPaused();  // OnHeadersReceived.
   // ReadData and it should return asynchronously because no data is buffered.
   EXPECT_EQ(ERR_IO_PENDING, delegate->ReadData());
@@ -1066,7 +1067,7 @@
   // Send a DATA frame.
   scoped_refptr<StringIOBuffer> buf(
       new StringIOBuffer(std::string(kBodyData, kBodyDataSize)));
-  delegate->SendData(buf.get(), buf->size(), false);
+  delegate->SendData(buf, buf->size(), false);
   sequenced_data_->Resume();
   base::RunLoop().RunUntilIdle();
   // Cancel the stream.
diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc
index cb6ec48..cbfb0e0 100644
--- a/net/http/http_network_session.cc
+++ b/net/http/http_network_session.cc
@@ -113,7 +113,7 @@
       quic_max_number_of_lossy_connections(0),
       quic_packet_loss_threshold(1.0f),
       quic_socket_receive_buffer_size(kQuicSocketReceiveBufferSize),
-      quic_delay_tcp_race(false),
+      quic_delay_tcp_race(true),
       quic_max_server_configs_stored_in_properties(0u),
       quic_clock(NULL),
       quic_random(NULL),
diff --git a/net/http/http_stream_factory_impl_unittest.cc b/net/http/http_stream_factory_impl_unittest.cc
index b50fcaf..348a94e0 100644
--- a/net/http/http_stream_factory_impl_unittest.cc
+++ b/net/http/http_stream_factory_impl_unittest.cc
@@ -1641,9 +1641,9 @@
   EXPECT_EQ(OK, stream_impl->ReadData(buffer.get(), 1));
   EXPECT_EQ(kProtoQUIC1SPDY3, stream_impl->GetProtocol());
   EXPECT_EQ("200", delegate.response_headers().find(":status")->second);
-  EXPECT_EQ(1, GetSocketPoolGroupCount(session()->GetTransportSocketPool(
+  EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetTransportSocketPool(
                    HttpNetworkSession::NORMAL_SOCKET_POOL)));
-  EXPECT_EQ(1, GetSocketPoolGroupCount(session()->GetSSLSocketPool(
+  EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetSSLSocketPool(
                    HttpNetworkSession::NORMAL_SOCKET_POOL)));
   EXPECT_EQ(0, GetSocketPoolGroupCount(session()->GetTransportSocketPool(
                    HttpNetworkSession::WEBSOCKET_SOCKET_POOL)));
diff --git a/net/net.gypi b/net/net.gypi
index 5ac20b6..ebb1dc9 100644
--- a/net/net.gypi
+++ b/net/net.gypi
@@ -720,9 +720,17 @@
       'http/url_security_manager.h',
       'http/url_security_manager_posix.cc',
       'http/url_security_manager_win.cc',
+      'nqe/cached_network_quality.cc',
+      'nqe/cached_network_quality.h',
       'nqe/external_estimate_provider.h',
+      'nqe/network_quality.cc',
+      'nqe/network_quality.h',
       'nqe/network_quality_estimator.cc',
       'nqe/network_quality_estimator.h',
+      'nqe/network_quality_observation.h',
+      'nqe/network_quality_observation_source.h',
+      'nqe/observation_buffer.h',
+      'nqe/weighted_observation.h',
       'proxy/dhcp_proxy_script_adapter_fetcher_win.cc',
       'proxy/dhcp_proxy_script_adapter_fetcher_win.h',
       'proxy/dhcp_proxy_script_fetcher.cc',
@@ -1504,6 +1512,7 @@
       'log/trace_net_log_observer_unittest.cc',
       'log/write_to_file_net_log_observer_unittest.cc',
       'nqe/network_quality_estimator_unittest.cc',
+      'nqe/network_quality_observation_unittest.cc',
       'proxy/dhcp_proxy_script_adapter_fetcher_win_unittest.cc',
       'proxy/dhcp_proxy_script_fetcher_factory_unittest.cc',
       'proxy/dhcp_proxy_script_fetcher_win_unittest.cc',
diff --git a/net/nqe/cached_network_quality.cc b/net/nqe/cached_network_quality.cc
new file mode 100644
index 0000000..5902f75a
--- /dev/null
+++ b/net/nqe/cached_network_quality.cc
@@ -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.
+
+#include "net/nqe/cached_network_quality.h"
+
+namespace net {
+
+namespace nqe {
+
+namespace internal {
+
+CachedNetworkQuality::CachedNetworkQuality(
+    const NetworkQuality& network_quality)
+    : last_update_time_(base::TimeTicks::Now()),
+      network_quality_(network_quality) {}
+
+CachedNetworkQuality::CachedNetworkQuality(const CachedNetworkQuality& other)
+    : last_update_time_(other.last_update_time_),
+      network_quality_(other.network_quality_) {}
+
+CachedNetworkQuality::~CachedNetworkQuality() {}
+
+bool CachedNetworkQuality::OlderThan(
+    const CachedNetworkQuality& cached_network_quality) const {
+  return last_update_time_ < cached_network_quality.last_update_time_;
+}
+
+}  // namespace internal
+
+}  // namespace nqe
+
+}  // namespace net
\ No newline at end of file
diff --git a/net/nqe/cached_network_quality.h b/net/nqe/cached_network_quality.h
new file mode 100644
index 0000000..cc0af2f
--- /dev/null
+++ b/net/nqe/cached_network_quality.h
@@ -0,0 +1,49 @@
+// 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 NET_NQE_CACHED_NETWORK_QUALITY_H_
+#define NET_NQE_CACHED_NETWORK_QUALITY_H_
+
+#include "base/macros.h"
+#include "base/time/time.h"
+#include "net/base/net_export.h"
+#include "net/nqe/network_quality.h"
+
+namespace net {
+
+namespace nqe {
+
+namespace internal {
+
+// CachedNetworkQuality stores the quality of a previously seen network.
+class NET_EXPORT_PRIVATE CachedNetworkQuality {
+ public:
+  explicit CachedNetworkQuality(const NetworkQuality& network_quality);
+  CachedNetworkQuality(const CachedNetworkQuality& other);
+  ~CachedNetworkQuality();
+
+  // Returns the network quality associated with this cached entry.
+  const NetworkQuality& network_quality() const { return network_quality_; }
+
+  // Returns true if this cache entry was updated before
+  // |cached_network_quality|.
+  bool OlderThan(const CachedNetworkQuality& cached_network_quality) const;
+
+  // Time when this cache entry was last updated.
+  const base::TimeTicks last_update_time_;
+
+  // Quality of this cached network.
+  const NetworkQuality network_quality_;
+
+ private:
+  DISALLOW_ASSIGN(CachedNetworkQuality);
+};
+
+}  // namespace internal
+
+}  // namespace nqe
+
+}  // namespace net
+
+#endif  // NET_NQE_CACHED_NETWORK_QUALITY_H_
\ No newline at end of file
diff --git a/net/nqe/network_quality.cc b/net/nqe/network_quality.cc
new file mode 100644
index 0000000..cf9a334
--- /dev/null
+++ b/net/nqe/network_quality.cc
@@ -0,0 +1,42 @@
+// 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 "net/nqe/network_quality.h"
+
+namespace net {
+
+namespace nqe {
+
+namespace internal {
+
+base::TimeDelta InvalidRTT() {
+  return base::TimeDelta::Max();
+}
+
+NetworkQuality::NetworkQuality()
+    : NetworkQuality(InvalidRTT(), kInvalidThroughput) {}
+
+NetworkQuality::NetworkQuality(const base::TimeDelta& rtt,
+                               int32_t downstream_throughput_kbps)
+    : rtt_(rtt), downstream_throughput_kbps_(downstream_throughput_kbps) {
+  DCHECK_GE(rtt_, base::TimeDelta());
+  DCHECK_GE(downstream_throughput_kbps_, 0);
+}
+
+NetworkQuality::NetworkQuality(const NetworkQuality& other)
+    : NetworkQuality(other.rtt_, other.downstream_throughput_kbps_) {}
+
+NetworkQuality::~NetworkQuality() {}
+
+NetworkQuality& NetworkQuality::operator=(const NetworkQuality& other) {
+  rtt_ = other.rtt_;
+  downstream_throughput_kbps_ = other.downstream_throughput_kbps_;
+  return *this;
+}
+
+}  // namespace internal
+
+}  // namespace nqe
+
+}  // namespace net
\ No newline at end of file
diff --git a/net/nqe/network_quality.h b/net/nqe/network_quality.h
new file mode 100644
index 0000000..1679bec
--- /dev/null
+++ b/net/nqe/network_quality.h
@@ -0,0 +1,67 @@
+// 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 NET_NQE_NETWORK_QUALITY_H_
+#define NET_NQE_NETWORK_QUALITY_H_
+
+#include <stdint.h>
+
+#include "base/gtest_prod_util.h"
+#include "base/macros.h"
+#include "base/time/time.h"
+#include "net/base/net_export.h"
+
+namespace net {
+
+namespace nqe {
+
+namespace internal {
+
+// Returns the RTT value to be used when the valid RTT is unavailable. Readers
+// should discard RTT if it is set to the value returned by |InvalidRTT()|.
+NET_EXPORT_PRIVATE base::TimeDelta InvalidRTT();
+
+// Throughput is set to |kInvalidThroughput| if a valid value is
+// unavailable. Readers should discard throughput value if it is set to
+// |kInvalidThroughput|.
+const int32_t kInvalidThroughput = 0;
+
+// NetworkQuality is used to cache the quality of a network connection.
+class NET_EXPORT_PRIVATE NetworkQuality {
+ public:
+  NetworkQuality();
+  // |rtt| is the estimate of the round trip time.
+  // |downstream_throughput_kbps| is the estimate of the downstream
+  // throughput in kilobits per second.
+  NetworkQuality(const base::TimeDelta& rtt,
+                 int32_t downstream_throughput_kbps);
+  NetworkQuality(const NetworkQuality& other);
+  ~NetworkQuality();
+
+  NetworkQuality& operator=(const NetworkQuality& other);
+
+  // Returns the estimate of the round trip time at the HTTP layer.
+  const base::TimeDelta& rtt() const { return rtt_; }
+
+  // Returns the estimate of the downstream throughput in Kbps (Kilobits per
+  // second).
+  int32_t downstream_throughput_kbps() const {
+    return downstream_throughput_kbps_;
+  }
+
+ private:
+  // Estimated round trip time at the HTTP layer.
+  base::TimeDelta rtt_;
+
+  // Estimated downstream throughput in kilobits per second.
+  int32_t downstream_throughput_kbps_;
+};
+
+}  // namespace internal
+
+}  // namespace nqe
+
+}  // namespace net
+
+#endif  // NET_NQE_NETWORK_QUALITY_H_
\ No newline at end of file
diff --git a/net/nqe/network_quality_estimator.cc b/net/nqe/network_quality_estimator.cc
index 17c0cba3..309ebe8 100644
--- a/net/nqe/network_quality_estimator.cc
+++ b/net/nqe/network_quality_estimator.cc
@@ -4,7 +4,6 @@
 
 #include "net/nqe/network_quality_estimator.h"
 
-#include <float.h>
 #include <algorithm>
 #include <cmath>
 #include <limits>
@@ -216,8 +215,6 @@
   DISALLOW_COPY_AND_ASSIGN(SocketWatcherFactory);
 };
 
-const int32_t NetworkQualityEstimator::kInvalidThroughput = 0;
-
 NetworkQualityEstimator::NetworkQualityEstimator(
     std::unique_ptr<ExternalEstimateProvider> external_estimates_provider,
     const std::map<std::string, std::string>& variation_params)
@@ -273,11 +270,6 @@
       base::ThreadTaskRunnerHandle::Get(), weak_ptr_factory_.GetWeakPtr()));
 }
 
-// static
-const base::TimeDelta NetworkQualityEstimator::InvalidRTT() {
-  return base::TimeDelta::Max();
-}
-
 void NetworkQualityEstimator::ObtainOperatingParams(
     const std::map<std::string, std::string>& variation_params) {
   DCHECK(thread_checker_.CalledOnValidThread());
@@ -285,8 +277,8 @@
   for (size_t i = 0; i <= NetworkChangeNotifier::CONNECTION_LAST; ++i) {
     NetworkChangeNotifier::ConnectionType type =
         static_cast<NetworkChangeNotifier::ConnectionType>(i);
-    DCHECK_EQ(InvalidRTT(), default_observations_[i].rtt());
-    DCHECK_EQ(kInvalidThroughput,
+    DCHECK_EQ(nqe::internal::InvalidRTT(), default_observations_[i].rtt());
+    DCHECK_EQ(nqe::internal::kInvalidThroughput,
               default_observations_[i].downstream_throughput_kbps());
     int32_t variations_value = kMinimumRTTVariationParameterMsec - 1;
     // Name of the parameter that holds the RTT value for this connection type.
@@ -297,9 +289,9 @@
     if (it != variation_params.end() &&
         base::StringToInt(it->second, &variations_value) &&
         variations_value >= kMinimumRTTVariationParameterMsec) {
-      default_observations_[i] =
-          NetworkQuality(base::TimeDelta::FromMilliseconds(variations_value),
-                         default_observations_[i].downstream_throughput_kbps());
+      default_observations_[i] = nqe::internal::NetworkQuality(
+          base::TimeDelta::FromMilliseconds(variations_value),
+          default_observations_[i].downstream_throughput_kbps());
     }
 
     variations_value = kMinimumThroughputVariationParameterKbps - 1;
@@ -312,8 +304,8 @@
     if (it != variation_params.end() &&
         base::StringToInt(it->second, &variations_value) &&
         variations_value >= kMinimumThroughputVariationParameterKbps) {
-      default_observations_[i] =
-          NetworkQuality(default_observations_[i].rtt(), variations_value);
+      default_observations_[i] = nqe::internal::NetworkQuality(
+          default_observations_[i].rtt(), variations_value);
     }
   }
 }
@@ -325,8 +317,8 @@
   for (size_t i = 0; i < EFFECTIVE_CONNECTION_TYPE_LAST; ++i) {
     EffectiveConnectionType effective_connection_type =
         static_cast<EffectiveConnectionType>(i);
-    DCHECK_EQ(InvalidRTT(), connection_thresholds_[i].rtt());
-    DCHECK_EQ(kInvalidThroughput,
+    DCHECK_EQ(nqe::internal::InvalidRTT(), connection_thresholds_[i].rtt());
+    DCHECK_EQ(nqe::internal::kInvalidThroughput,
               connection_thresholds_[i].downstream_throughput_kbps());
     if (effective_connection_type == EFFECTIVE_CONNECTION_TYPE_UNKNOWN)
       continue;
@@ -340,12 +332,14 @@
             &variations_value) &&
         variations_value >= kMinimumRTTVariationParameterMsec) {
       base::TimeDelta rtt(base::TimeDelta::FromMilliseconds(variations_value));
-      connection_thresholds_[i] = NetworkQuality(
+      connection_thresholds_[i] = nqe::internal::NetworkQuality(
           rtt, connection_thresholds_[i].downstream_throughput_kbps());
 
       // Verify that the RTT values are in decreasing order as the network
       // quality improves.
-      DCHECK(i == 0 || connection_thresholds_[i - 1].rtt() == InvalidRTT() ||
+      DCHECK(i == 0 ||
+             connection_thresholds_[i - 1].rtt() ==
+                 nqe::internal::InvalidRTT() ||
              rtt <= connection_thresholds_[i - 1].rtt());
     }
 
@@ -355,8 +349,8 @@
                                   &variations_value) &&
         variations_value >= kMinimumThroughputVariationParameterKbps) {
       int32_t throughput_kbps = variations_value;
-      connection_thresholds_[i] =
-          NetworkQuality(connection_thresholds_[i].rtt(), throughput_kbps);
+      connection_thresholds_[i] = nqe::internal::NetworkQuality(
+          connection_thresholds_[i].rtt(), throughput_kbps);
 
       // Verify that the throughput values are in increasing order as the
       // network quality improves.
@@ -371,19 +365,22 @@
 
 void NetworkQualityEstimator::AddDefaultEstimates() {
   DCHECK(thread_checker_.CalledOnValidThread());
-  if (default_observations_[current_network_id_.type].rtt() != InvalidRTT()) {
+  if (default_observations_[current_network_id_.type].rtt() !=
+      nqe::internal::InvalidRTT()) {
     RttObservation rtt_observation(
         default_observations_[current_network_id_.type].rtt(),
-        base::TimeTicks::Now(), DEFAULT_FROM_PLATFORM);
+        base::TimeTicks::Now(),
+        NETWORK_QUALITY_OBSERVATION_SOURCE_DEFAULT_FROM_PLATFORM);
     rtt_observations_.AddObservation(rtt_observation);
     NotifyObserversOfRTT(rtt_observation);
   }
   if (default_observations_[current_network_id_.type]
-          .downstream_throughput_kbps() != kInvalidThroughput) {
+          .downstream_throughput_kbps() != nqe::internal::kInvalidThroughput) {
     ThroughputObservation throughput_observation(
         default_observations_[current_network_id_.type]
             .downstream_throughput_kbps(),
-        base::TimeTicks::Now(), DEFAULT_FROM_PLATFORM);
+        base::TimeTicks::Now(),
+        NETWORK_QUALITY_OBSERVATION_SOURCE_DEFAULT_FROM_PLATFORM);
     downstream_throughput_kbps_observations_.AddObservation(
         throughput_observation);
     NotifyObserversOfThroughput(throughput_observation);
@@ -407,14 +404,14 @@
   if (request.load_flags() & LOAD_MAIN_FRAME) {
     base::TimeDelta rtt;
     if (!GetURLRequestRTTEstimate(&rtt))
-      rtt = InvalidRTT();
+      rtt = nqe::internal::InvalidRTT();
 
     int32_t downstream_throughput_kbps;
     if (!GetDownlinkThroughputKbpsEstimate(&downstream_throughput_kbps))
-      downstream_throughput_kbps = kInvalidThroughput;
+      downstream_throughput_kbps = nqe::internal::kInvalidThroughput;
 
     estimated_median_network_quality_ =
-        NetworkQuality(rtt, downstream_throughput_kbps);
+        nqe::internal::NetworkQuality(rtt, downstream_throughput_kbps);
   }
 
   base::TimeTicks now = base::TimeTicks::Now();
@@ -439,16 +436,17 @@
   base::TimeDelta observed_rtt = headers_received_time - request_start_time;
   DCHECK_GE(observed_rtt, base::TimeDelta());
   if (observed_rtt < peak_network_quality_.rtt()) {
-    peak_network_quality_ = NetworkQuality(
+    peak_network_quality_ = nqe::internal::NetworkQuality(
         observed_rtt, peak_network_quality_.downstream_throughput_kbps());
   }
 
-  RttObservation rtt_observation(observed_rtt, now, URL_REQUEST);
+  RttObservation rtt_observation(
+      observed_rtt, now, NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST);
   rtt_observations_.AddObservation(rtt_observation);
   NotifyObserversOfRTT(rtt_observation);
 
   // Compare the RTT observation with the estimated value and record it.
-  if (estimated_median_network_quality_.rtt() != InvalidRTT()) {
+  if (estimated_median_network_quality_.rtt() != nqe::internal::InvalidRTT()) {
     RecordRTTUMA(estimated_median_network_quality_.rtt().InMilliseconds(),
                  observed_rtt.InMilliseconds());
   }
@@ -511,11 +509,12 @@
   DCHECK_GT(downstream_kbps_as_integer, 0.0);
   if (downstream_kbps_as_integer >
       peak_network_quality_.downstream_throughput_kbps())
-    peak_network_quality_ =
-        NetworkQuality(peak_network_quality_.rtt(), downstream_kbps_as_integer);
+    peak_network_quality_ = nqe::internal::NetworkQuality(
+        peak_network_quality_.rtt(), downstream_kbps_as_integer);
 
-  ThroughputObservation throughput_observation(downstream_kbps_as_integer, now,
-                                               URL_REQUEST);
+  ThroughputObservation throughput_observation(
+      downstream_kbps_as_integer, now,
+      NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST);
   downstream_throughput_kbps_observations_.AddObservation(
       throughput_observation);
   NotifyObserversOfThroughput(throughput_observation);
@@ -606,14 +605,14 @@
 void NetworkQualityEstimator::OnConnectionTypeChanged(
     NetworkChangeNotifier::ConnectionType type) {
   DCHECK(thread_checker_.CalledOnValidThread());
-  if (peak_network_quality_.rtt() != InvalidRTT()) {
+  if (peak_network_quality_.rtt() != nqe::internal::InvalidRTT()) {
     base::HistogramBase* rtt_histogram =
         GetHistogram("FastestRTT.", current_network_id_.type, 10 * 1000);
     rtt_histogram->Add(peak_network_quality_.rtt().InMilliseconds());
   }
 
   if (peak_network_quality_.downstream_throughput_kbps() !=
-      kInvalidThroughput) {
+      nqe::internal::kInvalidThroughput) {
     base::HistogramBase* downstream_throughput_histogram =
         GetHistogram("PeakKbps.", current_network_id_.type, 1000 * 1000);
     downstream_throughput_histogram->Add(
@@ -629,9 +628,11 @@
 
     // Add the remaining percentile values.
     static const int kPercentiles[] = {0, 10, 90, 100};
-    std::vector<ObservationSource> disallowed_observation_sources;
-    disallowed_observation_sources.push_back(TCP);
-    disallowed_observation_sources.push_back(QUIC);
+    std::vector<NetworkQualityObservationSource> disallowed_observation_sources;
+    disallowed_observation_sources.push_back(
+        NETWORK_QUALITY_OBSERVATION_SOURCE_TCP);
+    disallowed_observation_sources.push_back(
+        NETWORK_QUALITY_OBSERVATION_SOURCE_QUIC);
     for (size_t i = 0; i < arraysize(kPercentiles); ++i) {
       rtt = GetRTTEstimateInternal(disallowed_observation_sources,
                                    base::TimeTicks(), kPercentiles[i]);
@@ -648,7 +649,7 @@
 
   // Clear the local state.
   last_connection_change_ = base::TimeTicks::Now();
-  peak_network_quality_ = NetworkQuality();
+  peak_network_quality_ = nqe::internal::NetworkQuality();
   downstream_throughput_kbps_observations_.Clear();
   rtt_observations_.Clear();
   current_network_id_ = GetCurrentNetworkID();
@@ -659,22 +660,23 @@
   // unavailable, add the default estimates.
   if (!ReadCachedNetworkQualityEstimate())
     AddDefaultEstimates();
-  estimated_median_network_quality_ = NetworkQuality();
+  estimated_median_network_quality_ = nqe::internal::NetworkQuality();
 }
 
 NetworkQualityEstimator::EffectiveConnectionType
 NetworkQualityEstimator::GetEffectiveConnectionType() const {
   DCHECK(thread_checker_.CalledOnValidThread());
 
-  base::TimeDelta url_request_rtt = InvalidRTT();
+  base::TimeDelta url_request_rtt = nqe::internal::InvalidRTT();
   if (!GetURLRequestRTTEstimate(&url_request_rtt))
-    url_request_rtt = InvalidRTT();
+    url_request_rtt = nqe::internal::InvalidRTT();
 
-  int32_t kbps = kInvalidThroughput;
+  int32_t kbps = nqe::internal::kInvalidThroughput;
   if (!GetDownlinkThroughputKbpsEstimate(&kbps))
-    kbps = kInvalidThroughput;
+    kbps = nqe::internal::kInvalidThroughput;
 
-  if (url_request_rtt == InvalidRTT() && kbps == kInvalidThroughput) {
+  if (url_request_rtt == nqe::internal::InvalidRTT() &&
+      kbps == nqe::internal::kInvalidThroughput) {
     // Quality of the current network is unknown.
     return EFFECTIVE_CONNECTION_TYPE_UNKNOWN;
   }
@@ -687,13 +689,13 @@
     if (i == EFFECTIVE_CONNECTION_TYPE_UNKNOWN)
       continue;
     bool estimated_rtt_is_higher_than_threshold =
-        url_request_rtt != InvalidRTT() &&
-        connection_thresholds_[i].rtt() != InvalidRTT() &&
+        url_request_rtt != nqe::internal::InvalidRTT() &&
+        connection_thresholds_[i].rtt() != nqe::internal::InvalidRTT() &&
         url_request_rtt >= connection_thresholds_[i].rtt();
     bool estimated_throughput_is_lower_than_threshold =
-        kbps != kInvalidThroughput &&
+        kbps != nqe::internal::kInvalidThroughput &&
         connection_thresholds_[i].downstream_throughput_kbps() !=
-            kInvalidThroughput &&
+            nqe::internal::kInvalidThroughput &&
         kbps <= connection_thresholds_[i].downstream_throughput_kbps();
     // Return |type| as the effective connection type if the current network's
     // RTT is worse than the threshold RTT for |type|, or if the current
@@ -711,31 +713,35 @@
 bool NetworkQualityEstimator::GetURLRequestRTTEstimate(
     base::TimeDelta* rtt) const {
   DCHECK(thread_checker_.CalledOnValidThread());
-  std::vector<ObservationSource> disallowed_observation_sources;
-  disallowed_observation_sources.push_back(TCP);
-  disallowed_observation_sources.push_back(QUIC);
+  std::vector<NetworkQualityObservationSource> disallowed_observation_sources;
+  disallowed_observation_sources.push_back(
+      NETWORK_QUALITY_OBSERVATION_SOURCE_TCP);
+  disallowed_observation_sources.push_back(
+      NETWORK_QUALITY_OBSERVATION_SOURCE_QUIC);
   *rtt = GetRTTEstimateInternal(disallowed_observation_sources,
                                 base::TimeTicks(), 50);
-  return (*rtt != InvalidRTT());
+  return (*rtt != nqe::internal::InvalidRTT());
 }
 
 bool NetworkQualityEstimator::GetDownlinkThroughputKbpsEstimate(
     int32_t* kbps) const {
   DCHECK(thread_checker_.CalledOnValidThread());
   *kbps = GetDownlinkThroughputKbpsEstimateInternal(base::TimeTicks(), 50);
-  return (*kbps != kInvalidThroughput);
+  return (*kbps != nqe::internal::kInvalidThroughput);
 }
 
 bool NetworkQualityEstimator::GetRecentURLRequestRTTMedian(
     const base::TimeTicks& begin_timestamp,
     base::TimeDelta* rtt) const {
   DCHECK(thread_checker_.CalledOnValidThread());
-  std::vector<ObservationSource> disallowed_observation_sources;
-  disallowed_observation_sources.push_back(TCP);
-  disallowed_observation_sources.push_back(QUIC);
+  std::vector<NetworkQualityObservationSource> disallowed_observation_sources;
+  disallowed_observation_sources.push_back(
+      NETWORK_QUALITY_OBSERVATION_SOURCE_TCP);
+  disallowed_observation_sources.push_back(
+      NETWORK_QUALITY_OBSERVATION_SOURCE_QUIC);
   *rtt = GetRTTEstimateInternal(disallowed_observation_sources, begin_timestamp,
                                 50);
-  return (*rtt != InvalidRTT());
+  return (*rtt != nqe::internal::InvalidRTT());
 }
 
 bool NetworkQualityEstimator::GetRecentMedianDownlinkThroughputKbps(
@@ -743,34 +749,22 @@
     int32_t* kbps) const {
   DCHECK(thread_checker_.CalledOnValidThread());
   *kbps = GetDownlinkThroughputKbpsEstimateInternal(begin_timestamp, 50);
-  return (*kbps != kInvalidThroughput);
+  return (*kbps != nqe::internal::kInvalidThroughput);
 }
 
-template <typename ValueType>
-NetworkQualityEstimator::ObservationBuffer<ValueType>::ObservationBuffer(
-    double weight_multiplier_per_second)
-    : weight_multiplier_per_second_(weight_multiplier_per_second) {
-  static_assert(kMaximumObservationsBufferSize > 0U,
-                "Minimum size of observation buffer must be > 0");
-  DCHECK_GE(weight_multiplier_per_second_, 0.0);
-  DCHECK_LE(weight_multiplier_per_second_, 1.0);
-}
-
-template <typename ValueType>
-NetworkQualityEstimator::ObservationBuffer<ValueType>::~ObservationBuffer() {}
-
 base::TimeDelta NetworkQualityEstimator::GetRTTEstimateInternal(
-    const std::vector<ObservationSource>& disallowed_observation_sources,
+    const std::vector<NetworkQualityObservationSource>&
+        disallowed_observation_sources,
     const base::TimeTicks& begin_timestamp,
     int percentile) const {
   DCHECK(thread_checker_.CalledOnValidThread());
 
   // RTT observations are sorted by duration from shortest to longest, thus
   // a higher percentile RTT will have a longer RTT than a lower percentile.
-  base::TimeDelta rtt = InvalidRTT();
+  base::TimeDelta rtt = nqe::internal::InvalidRTT();
   if (!rtt_observations_.GetPercentile(begin_timestamp, &rtt, percentile,
                                        disallowed_observation_sources)) {
-    return InvalidRTT();
+    return nqe::internal::InvalidRTT();
   }
   return rtt;
 }
@@ -782,102 +776,15 @@
 
   // Throughput observations are sorted by kbps from slowest to fastest,
   // thus a higher percentile throughput will be faster than a lower one.
-  int32_t kbps = kInvalidThroughput;
+  int32_t kbps = nqe::internal::kInvalidThroughput;
   if (!downstream_throughput_kbps_observations_.GetPercentile(
           begin_timestamp, &kbps, 100 - percentile,
-          std::vector<ObservationSource>())) {
-    return kInvalidThroughput;
+          std::vector<NetworkQualityObservationSource>())) {
+    return nqe::internal::kInvalidThroughput;
   }
   return kbps;
 }
 
-template <typename ValueType>
-void NetworkQualityEstimator::ObservationBuffer<ValueType>::
-    ComputeWeightedObservations(
-        const base::TimeTicks& begin_timestamp,
-        std::vector<WeightedObservation<ValueType>>& weighted_observations,
-        double* total_weight,
-        const std::vector<ObservationSource>& disallowed_observation_sources)
-        const {
-  weighted_observations.clear();
-  double total_weight_observations = 0.0;
-  base::TimeTicks now = base::TimeTicks::Now();
-
-  for (const auto& observation : observations_) {
-    if (observation.timestamp < begin_timestamp)
-      continue;
-    bool disallowed = false;
-    for (const auto& disallowed_source : disallowed_observation_sources) {
-      if (disallowed_source == observation.source)
-        disallowed = true;
-    }
-    if (disallowed)
-      continue;
-    base::TimeDelta time_since_sample_taken = now - observation.timestamp;
-    double weight =
-        pow(weight_multiplier_per_second_, time_since_sample_taken.InSeconds());
-    weight = std::max(DBL_MIN, std::min(1.0, weight));
-
-    weighted_observations.push_back(
-        WeightedObservation<ValueType>(observation.value, weight));
-    total_weight_observations += weight;
-  }
-
-  // Sort the samples by value in ascending order.
-  std::sort(weighted_observations.begin(), weighted_observations.end());
-  *total_weight = total_weight_observations;
-}
-
-template <typename ValueType>
-bool NetworkQualityEstimator::ObservationBuffer<ValueType>::GetPercentile(
-    const base::TimeTicks& begin_timestamp,
-    ValueType* result,
-    int percentile,
-    const std::vector<ObservationSource>& disallowed_observation_sources)
-    const {
-  DCHECK(result);
-  DCHECK_GE(percentile, 0);
-  DCHECK_LE(percentile, 100);
-
-  // Stores WeightedObservation in increasing order of value.
-  std::vector<WeightedObservation<ValueType>> weighted_observations;
-
-  // Total weight of all observations in |weighted_observations|.
-  double total_weight = 0.0;
-
-  ComputeWeightedObservations(begin_timestamp, weighted_observations,
-                              &total_weight, disallowed_observation_sources);
-  if (weighted_observations.empty())
-    return false;
-
-  DCHECK(!weighted_observations.empty());
-  DCHECK_GT(total_weight, 0.0);
-
-  // weighted_observations may have a smaller size than observations_ since the
-  // former contains only the observations later than begin_timestamp.
-  DCHECK_GE(observations_.size(), weighted_observations.size());
-
-  double desired_weight = percentile / 100.0 * total_weight;
-
-  double cumulative_weight_seen_so_far = 0.0;
-  for (const auto& weighted_observation : weighted_observations) {
-    cumulative_weight_seen_so_far += weighted_observation.weight;
-
-    if (cumulative_weight_seen_so_far >= desired_weight) {
-      *result = weighted_observation.value;
-      return true;
-    }
-  }
-
-  // Computation may reach here due to floating point errors. This may happen
-  // if |percentile| was 100 (or close to 100), and |desired_weight| was
-  // slightly larger than |total_weight| (due to floating point errors).
-  // In this case, we return the highest |value| among all observations.
-  // This is same as value of the last observation in the sorted vector.
-  *result = weighted_observations.at(weighted_observations.size() - 1).value;
-  return true;
-}
-
 NetworkQualityEstimator::NetworkID
 NetworkQualityEstimator::GetCurrentNetworkID() const {
   DCHECK(thread_checker_.CalledOnValidThread());
@@ -938,20 +845,22 @@
   if (it == cached_network_qualities_.end())
     return false;
 
-  NetworkQuality network_quality(it->second.network_quality());
+  nqe::internal::NetworkQuality network_quality(it->second.network_quality());
 
-  DCHECK_NE(InvalidRTT(), network_quality.rtt());
-  DCHECK_NE(kInvalidThroughput, network_quality.downstream_throughput_kbps());
+  DCHECK_NE(nqe::internal::InvalidRTT(), network_quality.rtt());
+  DCHECK_NE(nqe::internal::kInvalidThroughput,
+            network_quality.downstream_throughput_kbps());
 
   ThroughputObservation througphput_observation(
       network_quality.downstream_throughput_kbps(), base::TimeTicks::Now(),
-      CACHED_ESTIMATE);
+      NETWORK_QUALITY_OBSERVATION_SOURCE_CACHED_ESTIMATE);
   downstream_throughput_kbps_observations_.AddObservation(
       througphput_observation);
   NotifyObserversOfThroughput(througphput_observation);
 
-  RttObservation rtt_observation(network_quality.rtt(), base::TimeTicks::Now(),
-                                 CACHED_ESTIMATE);
+  RttObservation rtt_observation(
+      network_quality.rtt(), base::TimeTicks::Now(),
+      NETWORK_QUALITY_OBSERVATION_SOURCE_CACHED_ESTIMATE);
   rtt_observations_.AddObservation(rtt_observation);
   NotifyObserversOfRTT(rtt_observation);
 
@@ -1023,7 +932,8 @@
         EXTERNAL_ESTIMATE_PROVIDER_STATUS_RTT_AVAILABLE);
     UMA_HISTOGRAM_TIMES("NQE.ExternalEstimateProvider.RTT", rtt);
     rtt_observations_.AddObservation(
-        RttObservation(rtt, base::TimeTicks::Now(), EXTERNAL_ESTIMATE));
+        RttObservation(rtt, base::TimeTicks::Now(),
+                       NETWORK_QUALITY_OBSERVATION_SOURCE_EXTERNAL_ESTIMATE));
   }
 
   int32_t downstream_throughput_kbps;
@@ -1034,8 +944,9 @@
     UMA_HISTOGRAM_COUNTS("NQE.ExternalEstimateProvider.DownlinkBandwidth",
                          downstream_throughput_kbps);
     downstream_throughput_kbps_observations_.AddObservation(
-        ThroughputObservation(downstream_throughput_kbps,
-                              base::TimeTicks::Now(), EXTERNAL_ESTIMATE));
+        ThroughputObservation(
+            downstream_throughput_kbps, base::TimeTicks::Now(),
+            NETWORK_QUALITY_OBSERVATION_SOURCE_EXTERNAL_ESTIMATE));
   }
 }
 
@@ -1048,16 +959,16 @@
   if (current_network_id_.id.empty())
     return;
 
-  base::TimeDelta rtt = InvalidRTT();
-  int32_t downlink_throughput_kbps = kInvalidThroughput;
+  base::TimeDelta rtt = nqe::internal::InvalidRTT();
+  int32_t downlink_throughput_kbps = nqe::internal::kInvalidThroughput;
 
   if (!GetURLRequestRTTEstimate(&rtt) ||
       !GetDownlinkThroughputKbpsEstimate(&downlink_throughput_kbps)) {
     return;
   }
 
-  NetworkQuality network_quality =
-      NetworkQuality(rtt, downlink_throughput_kbps);
+  nqe::internal::NetworkQuality network_quality =
+      nqe::internal::NetworkQuality(rtt, downlink_throughput_kbps);
 
   if (cached_network_qualities_.size() == kMaximumNetworkQualityCacheSize) {
     // Remove the oldest entry.
@@ -1075,8 +986,9 @@
   DCHECK_LT(cached_network_qualities_.size(),
             static_cast<size_t>(kMaximumNetworkQualityCacheSize));
 
-  cached_network_qualities_.insert(std::make_pair(
-      current_network_id_, CachedNetworkQuality(network_quality)));
+  cached_network_qualities_.insert(
+      std::make_pair(current_network_id_,
+                     nqe::internal::CachedNetworkQuality(network_quality)));
   DCHECK_LE(cached_network_qualities_.size(),
             static_cast<size_t>(kMaximumNetworkQualityCacheSize));
 }
@@ -1088,10 +1000,13 @@
 
   switch (protocol) {
     case SocketPerformanceWatcherFactory::PROTOCOL_TCP:
-      NotifyObserversOfRTT(RttObservation(rtt, base::TimeTicks::Now(), TCP));
+      NotifyObserversOfRTT(RttObservation(
+          rtt, base::TimeTicks::Now(), NETWORK_QUALITY_OBSERVATION_SOURCE_TCP));
       return;
     case SocketPerformanceWatcherFactory::PROTOCOL_QUIC:
-      NotifyObserversOfRTT(RttObservation(rtt, base::TimeTicks::Now(), QUIC));
+      NotifyObserversOfRTT(
+          RttObservation(rtt, base::TimeTicks::Now(),
+                         NETWORK_QUALITY_OBSERVATION_SOURCE_QUIC));
       return;
     default:
       NOTREACHED();
@@ -1114,47 +1029,4 @@
                               observation.source));
 }
 
-NetworkQualityEstimator::CachedNetworkQuality::CachedNetworkQuality(
-    const NetworkQuality& network_quality)
-    : last_update_time_(base::TimeTicks::Now()),
-      network_quality_(network_quality) {}
-
-NetworkQualityEstimator::CachedNetworkQuality::CachedNetworkQuality(
-    const CachedNetworkQuality& other)
-    : last_update_time_(other.last_update_time_),
-      network_quality_(other.network_quality_) {}
-
-NetworkQualityEstimator::CachedNetworkQuality::~CachedNetworkQuality() {}
-
-bool NetworkQualityEstimator::CachedNetworkQuality::OlderThan(
-    const CachedNetworkQuality& cached_network_quality) const {
-  return last_update_time_ < cached_network_quality.last_update_time_;
-}
-
-NetworkQualityEstimator::NetworkQuality::NetworkQuality()
-    : NetworkQuality(NetworkQualityEstimator::InvalidRTT(),
-                     NetworkQualityEstimator::kInvalidThroughput) {}
-
-NetworkQualityEstimator::NetworkQuality::NetworkQuality(
-    const base::TimeDelta& rtt,
-    int32_t downstream_throughput_kbps)
-    : rtt_(rtt), downstream_throughput_kbps_(downstream_throughput_kbps) {
-  DCHECK_GE(rtt_, base::TimeDelta());
-  DCHECK_GE(downstream_throughput_kbps_, 0);
-}
-
-NetworkQualityEstimator::NetworkQuality::NetworkQuality(
-    const NetworkQuality& other)
-    : NetworkQuality(other.rtt_, other.downstream_throughput_kbps_) {}
-
-NetworkQualityEstimator::NetworkQuality::~NetworkQuality() {}
-
-NetworkQualityEstimator::NetworkQuality&
-NetworkQualityEstimator::NetworkQuality::operator=(
-    const NetworkQuality& other) {
-  rtt_ = other.rtt_;
-  downstream_throughput_kbps_ = other.downstream_throughput_kbps_;
-  return *this;
-}
-
 }  // namespace net
diff --git a/net/nqe/network_quality_estimator.h b/net/nqe/network_quality_estimator.h
index 30428d5..8642062 100644
--- a/net/nqe/network_quality_estimator.h
+++ b/net/nqe/network_quality_estimator.h
@@ -8,7 +8,6 @@
 #include <stddef.h>
 #include <stdint.h>
 
-#include <deque>
 #include <map>
 #include <memory>
 #include <string>
@@ -24,7 +23,12 @@
 #include "base/time/time.h"
 #include "net/base/net_export.h"
 #include "net/base/network_change_notifier.h"
+#include "net/nqe/cached_network_quality.h"
 #include "net/nqe/external_estimate_provider.h"
+#include "net/nqe/network_quality.h"
+#include "net/nqe/network_quality_observation.h"
+#include "net/nqe/network_quality_observation_source.h"
+#include "net/nqe/observation_buffer.h"
 #include "net/socket/socket_performance_watcher_factory.h"
 
 namespace base {
@@ -67,29 +71,6 @@
     EFFECTIVE_CONNECTION_TYPE_LAST,
   };
 
-  // On Android, a Java counterpart will be generated for this enum.
-  // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.net
-  // GENERATED_JAVA_CLASS_NAME_OVERRIDE: NetworkQualityObservationSource
-  // GENERATED_JAVA_PREFIX_TO_STRIP:
-  enum ObservationSource {
-    // The observation was taken at the request layer, e.g., a round trip time
-    // is recorded as the time between the request being sent and the first byte
-    // being received.
-    URL_REQUEST,
-    // The observation is taken from TCP statistics maintained by the kernel.
-    TCP,
-    // The observation is taken at the QUIC layer.
-    QUIC,
-    // The observation is a previously cached estimate of the metric.
-    CACHED_ESTIMATE,
-    // The observation is derived from network connection information provided
-    // by the platform. For example, typical RTT and throughput values are used
-    // for a given type of network connection.
-    DEFAULT_FROM_PLATFORM,
-    // The observation came from a Chromium-external source.
-    EXTERNAL_ESTIMATE
-  };
-
   // Observes measurements of round trip time.
   class NET_EXPORT_PRIVATE RTTObserver {
    public:
@@ -98,7 +79,7 @@
     // taken and the source of the observation are provided.
     virtual void OnRTTObservation(int32_t rtt_ms,
                                   const base::TimeTicks& timestamp,
-                                  ObservationSource source) = 0;
+                                  NetworkQualityObservationSource source) = 0;
 
    protected:
     RTTObserver() {}
@@ -113,9 +94,10 @@
    public:
     // Will be called when a new throughput observation is available.
     // Throughput is specified in kilobits per second.
-    virtual void OnThroughputObservation(int32_t throughput_kbps,
-                                         const base::TimeTicks& timestamp,
-                                         ObservationSource source) = 0;
+    virtual void OnThroughputObservation(
+        int32_t throughput_kbps,
+        const base::TimeTicks& timestamp,
+        NetworkQualityObservationSource source) = 0;
 
    protected:
     ThroughputObserver() {}
@@ -272,11 +254,6 @@
   FRIEND_TEST_ALL_PREFIXES(NetworkQualityEstimatorTest, TestAddObservation);
   FRIEND_TEST_ALL_PREFIXES(NetworkQualityEstimatorTest, ObtainOperatingParams);
   FRIEND_TEST_ALL_PREFIXES(NetworkQualityEstimatorTest, HalfLifeParam);
-  FRIEND_TEST_ALL_PREFIXES(URLRequestTestHTTP, NetworkQualityEstimator);
-  FRIEND_TEST_ALL_PREFIXES(NetworkQualityEstimatorTest,
-                           PercentileSameTimestamps);
-  FRIEND_TEST_ALL_PREFIXES(NetworkQualityEstimatorTest,
-                           PercentileDifferentTimestamps);
   FRIEND_TEST_ALL_PREFIXES(NetworkQualityEstimatorTest, ComputedPercentiles);
   FRIEND_TEST_ALL_PREFIXES(NetworkQualityEstimatorTest, TestCaching);
   FRIEND_TEST_ALL_PREFIXES(NetworkQualityEstimatorTest,
@@ -288,205 +265,20 @@
   class SocketWatcher;
   class SocketWatcherFactory;
 
-  // NetworkQuality is used to cache the quality of a network connection.
-  class NET_EXPORT_PRIVATE NetworkQuality {
-   public:
-    NetworkQuality();
-    // |rtt| is the estimate of the round trip time.
-    // |downstream_throughput_kbps| is the estimate of the downstream
-    // throughput in kilobits per second.
-    NetworkQuality(const base::TimeDelta& rtt,
-                   int32_t downstream_throughput_kbps);
-    NetworkQuality(const NetworkQuality& other);
-    ~NetworkQuality();
-
-    NetworkQuality& operator=(const NetworkQuality& other);
-
-    // Returns the estimate of the round trip time.
-    const base::TimeDelta& rtt() const { return rtt_; }
-
-    // Returns the estimate of the downstream throughput in Kbps (Kilobits per
-    // second).
-    int32_t downstream_throughput_kbps() const {
-      return downstream_throughput_kbps_;
-    }
-
-   private:
-    // Estimated round trip time.
-    base::TimeDelta rtt_;
-
-    // Estimated downstream throughput in kilobits per second.
-    int32_t downstream_throughput_kbps_;
-  };
-
-  // CachedNetworkQuality stores the quality of a previously seen network.
-  class NET_EXPORT_PRIVATE CachedNetworkQuality {
-   public:
-    explicit CachedNetworkQuality(const NetworkQuality& network_quality);
-    CachedNetworkQuality(const CachedNetworkQuality& other);
-    ~CachedNetworkQuality();
-
-    // Returns the network quality associated with this cached entry.
-    const NetworkQuality& network_quality() const { return network_quality_; }
-
-    // Returns true if this cache entry was updated before
-    // |cached_network_quality|.
-    bool OlderThan(const CachedNetworkQuality& cached_network_quality) const;
-
-    // Time when this cache entry was last updated.
-    const base::TimeTicks last_update_time_;
-
-    // Quality of this cached network.
-    const NetworkQuality network_quality_;
-
-   private:
-    DISALLOW_ASSIGN(CachedNetworkQuality);
-  };
-
-  // Records observations of network quality metrics (such as round trip time
-  // or throughput), along with the time the observation was made. Observations
-  // can be made at several places in the network stack, thus the observation
-  // source is provided as well. ValueType must be numerical so that statistics
-  // such as median, average can be computed.
-  template <typename ValueType>
-  struct NET_EXPORT_PRIVATE Observation {
-    Observation(const ValueType& value,
-                base::TimeTicks timestamp,
-                ObservationSource source)
-        : value(value), timestamp(timestamp), source(source) {
-      DCHECK(!timestamp.is_null());
-    }
-    ~Observation() {}
-
-    // Value of the observation.
-    const ValueType value;
-
-    // Time when the observation was taken.
-    const base::TimeTicks timestamp;
-
-    // The source of the observation.
-    const ObservationSource source;
-  };
-
-  // Holds an observation and its weight.
-  template <typename ValueType>
-  struct NET_EXPORT_PRIVATE WeightedObservation {
-    WeightedObservation(ValueType value, double weight)
-        : value(value), weight(weight) {}
-    WeightedObservation(const WeightedObservation& other)
-        : WeightedObservation(other.value, other.weight) {}
-
-    WeightedObservation& operator=(const WeightedObservation& other) {
-      value = other.value;
-      weight = other.weight;
-      return *this;
-    }
-
-    // Required for sorting the samples in the ascending order of values.
-    bool operator<(const WeightedObservation& other) const {
-      return (value < other.value);
-    }
-
-    // Value of the sample.
-    ValueType value;
-
-    // Weight of the sample. This is computed based on how much time has passed
-    // since the sample was taken.
-    double weight;
-  };
-
-  // Stores observations sorted by time.
-  template <typename ValueType>
-  class NET_EXPORT_PRIVATE ObservationBuffer {
-   public:
-    explicit ObservationBuffer(double weight_multiplier_per_second);
-    ~ObservationBuffer();
-
-    // Adds |observation| to the buffer. The oldest observation in the buffer
-    // will be evicted to make room if the buffer is already full.
-    void AddObservation(const Observation<ValueType>& observation) {
-      DCHECK_LE(observations_.size(),
-                static_cast<size_t>(kMaximumObservationsBufferSize));
-      // Evict the oldest element if the buffer is already full.
-      if (observations_.size() == kMaximumObservationsBufferSize)
-        observations_.pop_front();
-
-      observations_.push_back(observation);
-      DCHECK_LE(observations_.size(),
-                static_cast<size_t>(kMaximumObservationsBufferSize));
-    }
-
-    // Clears the observations stored in this buffer.
-    void Clear() { observations_.clear(); }
-
-    // Returns true iff the |percentile| value of the observations in this
-    // buffer is available. Sets |result| to the computed |percentile|
-    // value among all observations since |begin_timestamp|. If the value is
-    // unavailable, false is returned and |result| is not modified. Percentile
-    // value is unavailable if all the values in observation buffer are older
-    // than |begin_timestamp|. |result| must not be null.
-    // |disallowed_observation_sources| is the list of observation sources that
-    // should be excluded when computing the percentile.
-    bool GetPercentile(
-        const base::TimeTicks& begin_timestamp,
-        ValueType* result,
-        int percentile,
-        const std::vector<ObservationSource>& disallowed_observation_sources)
-        const WARN_UNUSED_RESULT;
-
-   private:
-    FRIEND_TEST_ALL_PREFIXES(NetworkQualityEstimatorTest, HalfLifeParam);
-
-    // Computes the weighted observations and stores them in
-    // |weighted_observations| sorted by ascending |WeightedObservation.value|.
-    // Only the observations with timestamp later than |begin_timestamp| are
-    // considered. Also, sets |total_weight| to the total weight of all
-    // observations. Should be called only when there is at least one
-    // observation in the buffer. |disallowed_observation_sources| is the list
-    // of observation sources that should be excluded when computing the
-    // weighted observations.
-    void ComputeWeightedObservations(
-        const base::TimeTicks& begin_timestamp,
-        std::vector<WeightedObservation<ValueType>>& weighted_observations,
-        double* total_weight,
-        const std::vector<ObservationSource>& disallowed_observation_sources)
-        const;
-
-    // Holds observations sorted by time, with the oldest observation at the
-    // front of the queue.
-    std::deque<Observation<ValueType>> observations_;
-
-    // The factor by which the weight of an observation reduces every second.
-    // For example, if an observation is 6 seconds old, its weight would be:
-    //     weight_multiplier_per_second_ ^ 6
-    // Calculated from |kHalfLifeSeconds| by solving the following equation:
-    //     weight_multiplier_per_second_ ^ kHalfLifeSeconds = 0.5
-    const double weight_multiplier_per_second_;
-
-    DISALLOW_COPY_AND_ASSIGN(ObservationBuffer);
-  };
-
   // Value of round trip time observations is in base::TimeDelta.
-  typedef net::NetworkQualityEstimator::Observation<base::TimeDelta>
-      RttObservation;
-  typedef net::NetworkQualityEstimator::ObservationBuffer<base::TimeDelta>
+  typedef nqe::internal::Observation<base::TimeDelta> RttObservation;
+  typedef nqe::internal::ObservationBuffer<base::TimeDelta>
       RttObservationBuffer;
 
   // Value of throughput observations is in kilobits per second.
-  typedef net::NetworkQualityEstimator::Observation<int32_t>
-      ThroughputObservation;
-  typedef net::NetworkQualityEstimator::ObservationBuffer<int32_t>
-      ThroughputObservationBuffer;
+  typedef nqe::internal::Observation<int32_t> ThroughputObservation;
+  typedef nqe::internal::ObservationBuffer<int32_t> ThroughputObservationBuffer;
 
   // This does not use a unordered_map or hash_map for code simplicity (key just
   // implements operator<, rather than hash and equality) and because the map is
   // tiny.
-  typedef std::map<NetworkID, CachedNetworkQuality> CachedNetworkQualities;
-
-  // Throughput is set to |kInvalidThroughput| if a valid value is
-  // unavailable. Readers should discard throughput value if it is set to
-  // |kInvalidThroughput|.
-  static const int32_t kInvalidThroughput;
+  typedef std::map<NetworkID, nqe::internal::CachedNetworkQuality>
+      CachedNetworkQualities;
 
   // Tiny transfer sizes may give inaccurate throughput results.
   // Minimum size of the transfer over which the throughput is computed.
@@ -509,9 +301,6 @@
   // Larger size may affect performance.
   static const size_t kMaximumNetworkQualityCacheSize = 10;
 
-  // Maximum number of observations that can be held in the ObservationBuffer.
-  static const size_t kMaximumObservationsBufferSize = 300;
-
   // Time duration (in milliseconds) after which the estimate provided by
   // external estimate provider is considered stale.
   static const int kExternalEstimateProviderFreshnessDurationMsec =
@@ -554,7 +343,8 @@
   // returned estimate with 0.9 probability. Similarly, network is expected to
   // be slower than the returned estimate with 0.1 probability.
   base::TimeDelta GetRTTEstimateInternal(
-      const std::vector<ObservationSource>& disallowed_observation_sources,
+      const std::vector<NetworkQualityObservationSource>&
+          disallowed_observation_sources,
       const base::TimeTicks& begin_timestamp,
       int percentile) const;
   int32_t GetDownlinkThroughputKbpsEstimateInternal(
@@ -623,7 +413,7 @@
   // The accuracy is decreased by ignoring these factors:
   // 1) Multiple URLRequests can occur concurrently.
   // 2) Includes server processing time.
-  NetworkQuality peak_network_quality_;
+  nqe::internal::NetworkQuality peak_network_quality_;
 
   // Cache that stores quality of previously seen networks.
   CachedNetworkQualities cached_network_qualities_;
@@ -638,17 +428,18 @@
   // Default network quality observations obtained from the network quality
   // estimator field trial parameters. The observations are indexed by
   // ConnectionType.
-  NetworkQuality
+  nqe::internal::NetworkQuality
       default_observations_[NetworkChangeNotifier::CONNECTION_LAST + 1];
 
   // Thresholds for different effective connection types obtained from field
   // trial variation params. These thresholds encode how different connection
   // types behave in general. In future, complex encodings (e.g., curve
   // fitting) may be used.
-  NetworkQuality connection_thresholds_[EFFECTIVE_CONNECTION_TYPE_LAST];
+  nqe::internal::NetworkQuality
+      connection_thresholds_[EFFECTIVE_CONNECTION_TYPE_LAST];
 
   // Estimated network quality. Updated on mainframe requests.
-  NetworkQuality estimated_median_network_quality_;
+  nqe::internal::NetworkQuality estimated_median_network_quality_;
 
   // ExternalEstimateProvider that provides network quality using operating
   // system APIs. May be NULL.
diff --git a/net/nqe/network_quality_estimator_unittest.cc b/net/nqe/network_quality_estimator_unittest.cc
index c8827de5..f3a4962 100644
--- a/net/nqe/network_quality_estimator_unittest.cc
+++ b/net/nqe/network_quality_estimator_unittest.cc
@@ -27,6 +27,9 @@
 #include "net/base/network_change_notifier.h"
 #include "net/http/http_status_code.h"
 #include "net/nqe/external_estimate_provider.h"
+#include "net/nqe/network_quality_observation.h"
+#include "net/nqe/network_quality_observation_source.h"
+#include "net/nqe/observation_buffer.h"
 #include "net/socket/socket_performance_watcher.h"
 #include "net/socket/socket_performance_watcher_factory.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
@@ -151,20 +154,19 @@
   struct Observation {
     Observation(int32_t ms,
                 const base::TimeTicks& ts,
-                NetworkQualityEstimator::ObservationSource src)
+                NetworkQualityObservationSource src)
         : rtt_ms(ms), timestamp(ts), source(src) {}
     int32_t rtt_ms;
     base::TimeTicks timestamp;
-    NetworkQualityEstimator::ObservationSource source;
+    NetworkQualityObservationSource source;
   };
 
   std::vector<Observation>& observations() { return observations_; }
 
   // RttObserver implementation:
-  void OnRTTObservation(
-      int32_t rtt_ms,
-      const base::TimeTicks& timestamp,
-      NetworkQualityEstimator::ObservationSource source) override {
+  void OnRTTObservation(int32_t rtt_ms,
+                        const base::TimeTicks& timestamp,
+                        NetworkQualityObservationSource source) override {
     observations_.push_back(Observation(rtt_ms, timestamp, source));
   }
 
@@ -178,11 +180,11 @@
   struct Observation {
     Observation(int32_t kbps,
                 const base::TimeTicks& ts,
-                NetworkQualityEstimator::ObservationSource src)
+                NetworkQualityObservationSource src)
         : throughput_kbps(kbps), timestamp(ts), source(src) {}
     int32_t throughput_kbps;
     base::TimeTicks timestamp;
-    NetworkQualityEstimator::ObservationSource source;
+    NetworkQualityObservationSource source;
   };
 
   std::vector<Observation>& observations() { return observations_; }
@@ -191,7 +193,7 @@
   void OnThroughputObservation(
       int32_t throughput_kbps,
       const base::TimeTicks& timestamp,
-      NetworkQualityEstimator::ObservationSource source) override {
+      NetworkQualityObservationSource source) override {
     observations_.push_back(Observation(throughput_kbps, timestamp, source));
   }
 
@@ -227,9 +229,6 @@
   EXPECT_TRUE(estimator.GetURLRequestRTTEstimate(&rtt));
   EXPECT_TRUE(estimator.GetDownlinkThroughputKbpsEstimate(&kbps));
 
-  EXPECT_TRUE(estimator.GetURLRequestRTTEstimate(&rtt));
-  EXPECT_TRUE(estimator.GetDownlinkThroughputKbpsEstimate(&kbps));
-
   // Check UMA histograms.
   histogram_tester.ExpectTotalCount("NQE.PeakKbps.Unknown", 0);
   histogram_tester.ExpectTotalCount("NQE.FastestRTT.Unknown", 0);
@@ -282,8 +281,9 @@
   context.set_network_quality_estimator(&estimator);
   context.Init();
 
-  // Push 10 more observations than the maximum buffer size.
-  for (size_t i = 0; i < estimator.kMaximumObservationsBufferSize + 10U; ++i) {
+  // Push more observations than the maximum buffer size.
+  const size_t kMaxObservations = 1000;
+  for (size_t i = 0; i < kMaxObservations; ++i) {
     std::unique_ptr<URLRequest> request(context.CreateRequest(
         estimator.GetEchoURL(), DEFAULT_PRIORITY, &test_delegate));
     request->Start();
@@ -299,149 +299,6 @@
   EXPECT_FALSE(estimator.GetDownlinkThroughputKbpsEstimate(&kbps));
 }
 
-// Verifies that the percentiles are correctly computed. All observations have
-// the same timestamp. Kbps percentiles must be in decreasing order. RTT
-// percentiles must be in increasing order.
-TEST(NetworkQualityEstimatorTest, PercentileSameTimestamps) {
-  std::map<std::string, std::string> variation_params;
-  TestNetworkQualityEstimator estimator(variation_params);
-  base::TimeTicks now = base::TimeTicks::Now();
-
-  // Network quality should be unavailable when no observations are available.
-  base::TimeDelta rtt;
-  EXPECT_FALSE(estimator.GetURLRequestRTTEstimate(&rtt));
-  int32_t kbps;
-  EXPECT_FALSE(estimator.GetDownlinkThroughputKbpsEstimate(&kbps));
-
-  // Insert samples from {1,2,3,..., 100}. First insert odd samples, then even
-  // samples. This helps in verifying that the order of samples does not matter.
-  for (int i = 1; i <= 99; i += 2) {
-    estimator.downstream_throughput_kbps_observations_.AddObservation(
-        NetworkQualityEstimator::ThroughputObservation(
-            i, now, NetworkQualityEstimator::URL_REQUEST));
-    estimator.rtt_observations_.AddObservation(
-        NetworkQualityEstimator::RttObservation(
-            base::TimeDelta::FromMilliseconds(i), now,
-            NetworkQualityEstimator::URL_REQUEST));
-    EXPECT_TRUE(estimator.GetURLRequestRTTEstimate(&rtt));
-    EXPECT_TRUE(estimator.GetDownlinkThroughputKbpsEstimate(&kbps));
-  }
-
-  for (int i = 1; i <= 99; i += 2) {
-    // Insert TCP observation which should not be taken into account when
-    // computing median RTT at HTTP layer.
-    estimator.rtt_observations_.AddObservation(
-        NetworkQualityEstimator::RttObservation(
-            base::TimeDelta::FromMilliseconds(10000), now,
-            NetworkQualityEstimator::TCP));
-
-    // Insert QUIC observation which should not be taken into account when
-    // computing median RTT at HTTP layer.
-    estimator.rtt_observations_.AddObservation(
-        NetworkQualityEstimator::RttObservation(
-            base::TimeDelta::FromMilliseconds(10000), now,
-            NetworkQualityEstimator::QUIC));
-  }
-
-  for (int i = 2; i <= 100; i += 2) {
-    estimator.downstream_throughput_kbps_observations_.AddObservation(
-        NetworkQualityEstimator::ThroughputObservation(
-            i, now, NetworkQualityEstimator::URL_REQUEST));
-    estimator.rtt_observations_.AddObservation(
-        NetworkQualityEstimator::RttObservation(
-            base::TimeDelta::FromMilliseconds(i), now,
-            NetworkQualityEstimator::URL_REQUEST));
-    EXPECT_TRUE(estimator.GetURLRequestRTTEstimate(&rtt));
-    EXPECT_TRUE(estimator.GetDownlinkThroughputKbpsEstimate(&kbps));
-  }
-
-  for (int i = 0; i <= 100; ++i) {
-    // Checks if the difference between the two integers is less than 1. This is
-    // required because computed percentiles may be slightly different from
-    // what is expected due to floating point computation errors and integer
-    // rounding off errors.
-    EXPECT_NEAR(estimator.GetDownlinkThroughputKbpsEstimateInternal(
-                    base::TimeTicks(), i),
-                100 - i, 1);
-    std::vector<NetworkQualityEstimator::ObservationSource>
-        disallowed_observation_sources;
-    disallowed_observation_sources.push_back(NetworkQualityEstimator::TCP);
-    disallowed_observation_sources.push_back(NetworkQualityEstimator::QUIC);
-    EXPECT_NEAR(estimator
-                    .GetRTTEstimateInternal(disallowed_observation_sources,
-                                            base::TimeTicks(), i)
-                    .InMilliseconds(),
-                i, 1);
-  }
-
-  EXPECT_TRUE(estimator.GetURLRequestRTTEstimate(&rtt));
-  EXPECT_TRUE(estimator.GetDownlinkThroughputKbpsEstimate(&kbps));
-}
-
-// Verifies that the percentiles are correctly computed. Observations have
-// different timestamps with half the observations being very old and the rest
-// of them being very recent. Percentiles should factor in recent observations
-// much more heavily than older samples. Kbps percentiles must be in decreasing
-// order. RTT percentiles must be in increasing order.
-TEST(NetworkQualityEstimatorTest, PercentileDifferentTimestamps) {
-  std::map<std::string, std::string> variation_params;
-  TestNetworkQualityEstimator estimator(variation_params);
-  base::TimeTicks now = base::TimeTicks::Now();
-  base::TimeTicks very_old = now - base::TimeDelta::FromDays(365);
-
-  // First 50 samples have very old timestamp.
-  for (int i = 1; i <= 50; ++i) {
-    estimator.downstream_throughput_kbps_observations_.AddObservation(
-        NetworkQualityEstimator::ThroughputObservation(
-            i, very_old, NetworkQualityEstimator::URL_REQUEST));
-    estimator.rtt_observations_.AddObservation(
-        NetworkQualityEstimator::RttObservation(
-            base::TimeDelta::FromMilliseconds(i), very_old,
-            NetworkQualityEstimator::URL_REQUEST));
-  }
-
-  // Next 50 (i.e., from 51 to 100) have recent timestamp.
-  for (int i = 51; i <= 100; ++i) {
-    estimator.downstream_throughput_kbps_observations_.AddObservation(
-        NetworkQualityEstimator::ThroughputObservation(
-            i, now, NetworkQualityEstimator::URL_REQUEST));
-
-    // Insert TCP observation which should not be taken into account when
-    // computing median RTT at HTTP layer.
-    estimator.rtt_observations_.AddObservation(
-        NetworkQualityEstimator::RttObservation(
-            base::TimeDelta::FromMilliseconds(10000), now,
-            NetworkQualityEstimator::TCP));
-
-    estimator.rtt_observations_.AddObservation(
-        NetworkQualityEstimator::RttObservation(
-            base::TimeDelta::FromMilliseconds(i), now,
-            NetworkQualityEstimator::URL_REQUEST));
-  }
-
-  std::vector<NetworkQualityEstimator::ObservationSource>
-      disallowed_observation_sources;
-  disallowed_observation_sources.push_back(NetworkQualityEstimator::TCP);
-  disallowed_observation_sources.push_back(NetworkQualityEstimator::QUIC);
-
-  // Older samples have very little weight. So, all percentiles are >= 51
-  // (lowest value among recent observations).
-  for (int i = 1; i < 100; ++i) {
-    // Checks if the difference between the two integers is less than 1. This is
-    // required because computed percentiles may be slightly different from
-    // what is expected due to floating point computation errors and integer
-    // rounding off errors.
-    EXPECT_NEAR(estimator.GetDownlinkThroughputKbpsEstimateInternal(
-                    base::TimeTicks(), i),
-                51 + 0.49 * (100 - i), 1);
-    EXPECT_NEAR(estimator
-                    .GetRTTEstimateInternal(disallowed_observation_sources,
-                                            base::TimeTicks(), i)
-                    .InMilliseconds(),
-                51 + 0.49 * i, 1);
-  }
-}
-
 // This test notifies NetworkQualityEstimator of received data. Next,
 // throughput and RTT percentiles are checked for correctness by doing simple
 // verifications.
@@ -449,15 +306,16 @@
   std::map<std::string, std::string> variation_params;
   TestNetworkQualityEstimator estimator(variation_params);
 
-  std::vector<NetworkQualityEstimator::ObservationSource>
-      disallowed_observation_sources;
-  disallowed_observation_sources.push_back(NetworkQualityEstimator::TCP);
-  disallowed_observation_sources.push_back(NetworkQualityEstimator::QUIC);
+  std::vector<NetworkQualityObservationSource> disallowed_observation_sources;
+  disallowed_observation_sources.push_back(
+      NETWORK_QUALITY_OBSERVATION_SOURCE_TCP);
+  disallowed_observation_sources.push_back(
+      NETWORK_QUALITY_OBSERVATION_SOURCE_QUIC);
 
-  EXPECT_EQ(NetworkQualityEstimator::InvalidRTT(),
+  EXPECT_EQ(nqe::internal::InvalidRTT(),
             estimator.GetRTTEstimateInternal(disallowed_observation_sources,
                                              base::TimeTicks(), 100));
-  EXPECT_EQ(NetworkQualityEstimator::kInvalidThroughput,
+  EXPECT_EQ(nqe::internal::kInvalidThroughput,
             estimator.GetDownlinkThroughputKbpsEstimateInternal(
                 base::TimeTicks(), 100));
 
@@ -467,7 +325,7 @@
   context.Init();
 
   // Number of observations are more than the maximum buffer size.
-  for (size_t i = 0; i < estimator.kMaximumObservationsBufferSize + 100U; ++i) {
+  for (size_t i = 0; i < 1000U; ++i) {
     std::unique_ptr<URLRequest> request(context.CreateRequest(
         estimator.GetEchoURL(), DEFAULT_PRIORITY, &test_delegate));
     request->Start();
@@ -531,9 +389,8 @@
 
   // Peak network quality should not be affected by the network quality
   // estimator field trial.
-  EXPECT_EQ(NetworkQualityEstimator::InvalidRTT(),
-            estimator.peak_network_quality_.rtt());
-  EXPECT_EQ(NetworkQualityEstimator::kInvalidThroughput,
+  EXPECT_EQ(nqe::internal::InvalidRTT(), estimator.peak_network_quality_.rtt());
+  EXPECT_EQ(nqe::internal::kInvalidThroughput,
             estimator.peak_network_quality_.downstream_throughput_kbps());
 
   // Simulate network change to 2G. Only the Kbps default estimate should be
@@ -707,11 +564,12 @@
   // Cache entry will not be added for (NONE, "").
   estimator.downstream_throughput_kbps_observations_.AddObservation(
       NetworkQualityEstimator::ThroughputObservation(
-          1, base::TimeTicks::Now(), NetworkQualityEstimator::URL_REQUEST));
+          1, base::TimeTicks::Now(),
+          NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
   estimator.rtt_observations_.AddObservation(
       NetworkQualityEstimator::RttObservation(
           base::TimeDelta::FromMilliseconds(1000), base::TimeTicks::Now(),
-          NetworkQualityEstimator::URL_REQUEST));
+          NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
   estimator.SimulateNetworkChangeTo(
       NetworkChangeNotifier::ConnectionType::CONNECTION_2G, "test-1");
   EXPECT_EQ(expected_cache_size, estimator.cached_network_qualities_.size());
@@ -721,11 +579,12 @@
   // the cache.
   estimator.downstream_throughput_kbps_observations_.AddObservation(
       NetworkQualityEstimator::ThroughputObservation(
-          1, base::TimeTicks::Now(), NetworkQualityEstimator::URL_REQUEST));
+          1, base::TimeTicks::Now(),
+          NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
   estimator.rtt_observations_.AddObservation(
       NetworkQualityEstimator::RttObservation(
           base::TimeDelta::FromMilliseconds(1000), base::TimeTicks::Now(),
-          NetworkQualityEstimator::URL_REQUEST));
+          NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
 
   estimator.SimulateNetworkChangeTo(
       NetworkChangeNotifier::ConnectionType::CONNECTION_3G, "test-1");
@@ -737,11 +596,12 @@
   // the cache.
   estimator.downstream_throughput_kbps_observations_.AddObservation(
       NetworkQualityEstimator::ThroughputObservation(
-          2, base::TimeTicks::Now(), NetworkQualityEstimator::URL_REQUEST));
+          2, base::TimeTicks::Now(),
+          NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
   estimator.rtt_observations_.AddObservation(
       NetworkQualityEstimator::RttObservation(
           base::TimeDelta::FromMilliseconds(500), base::TimeTicks::Now(),
-          NetworkQualityEstimator::URL_REQUEST));
+          NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
   estimator.SimulateNetworkChangeTo(
       NetworkChangeNotifier::ConnectionType::CONNECTION_3G, "test-2");
   ++expected_cache_size;
@@ -805,11 +665,12 @@
   for (size_t i = 0; i < network_count; ++i) {
     estimator.downstream_throughput_kbps_observations_.AddObservation(
         NetworkQualityEstimator::ThroughputObservation(
-            2, base::TimeTicks::Now(), NetworkQualityEstimator::URL_REQUEST));
+            2, base::TimeTicks::Now(),
+            NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
     estimator.rtt_observations_.AddObservation(
         NetworkQualityEstimator::RttObservation(
             base::TimeDelta::FromMilliseconds(500), base::TimeTicks::Now(),
-            NetworkQualityEstimator::URL_REQUEST));
+            NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
 
     if (i == 100)
       update_time_of_network_100 = base::TimeTicks::Now();
@@ -826,11 +687,12 @@
   // One more call so that the last network is also written to cache.
   estimator.downstream_throughput_kbps_observations_.AddObservation(
       NetworkQualityEstimator::ThroughputObservation(
-          2, base::TimeTicks::Now(), NetworkQualityEstimator::URL_REQUEST));
+          2, base::TimeTicks::Now(),
+          NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
   estimator.rtt_observations_.AddObservation(
       NetworkQualityEstimator::RttObservation(
           base::TimeDelta::FromMilliseconds(500), base::TimeTicks::Now(),
-          NetworkQualityEstimator::URL_REQUEST));
+          NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
   estimator.SimulateNetworkChangeTo(
       NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI,
       base::SizeTToString(network_count - 1));
@@ -857,19 +719,19 @@
   // First sample has very old timestamp.
   estimator.downstream_throughput_kbps_observations_.AddObservation(
       NetworkQualityEstimator::ThroughputObservation(
-          1, old, NetworkQualityEstimator::URL_REQUEST));
+          1, old, NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
   estimator.rtt_observations_.AddObservation(
       NetworkQualityEstimator::RttObservation(
           base::TimeDelta::FromMilliseconds(1), old,
-          NetworkQualityEstimator::URL_REQUEST));
+          NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
 
   estimator.downstream_throughput_kbps_observations_.AddObservation(
       NetworkQualityEstimator::ThroughputObservation(
-          100, now, NetworkQualityEstimator::URL_REQUEST));
+          100, now, NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
   estimator.rtt_observations_.AddObservation(
       NetworkQualityEstimator::RttObservation(
           base::TimeDelta::FromMilliseconds(100), now,
-          NetworkQualityEstimator::URL_REQUEST));
+          NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
 
   const struct {
     base::TimeTicks start_timestamp;
@@ -1248,12 +1110,14 @@
   for (const auto& observation : rtt_observer.observations()) {
     EXPECT_LE(0, observation.rtt_ms);
     EXPECT_LE(0, (observation.timestamp - then).InMilliseconds());
-    EXPECT_EQ(NetworkQualityEstimator::URL_REQUEST, observation.source);
+    EXPECT_EQ(NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST,
+              observation.source);
   }
   for (const auto& observation : throughput_observer.observations()) {
     EXPECT_LE(0, observation.throughput_kbps);
     EXPECT_LE(0, (observation.timestamp - then).InMilliseconds());
-    EXPECT_EQ(NetworkQualityEstimator::URL_REQUEST, observation.source);
+    EXPECT_EQ(NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST,
+              observation.source);
   }
 
   // Verify that observations from TCP and QUIC are passed on to the observers.
@@ -1319,7 +1183,7 @@
   for (size_t i = 0; i < 2; ++i) {
     size_t before_count_tcp_rtt_observations = 0;
     for (const auto& observation : rtt_observer.observations()) {
-      if (observation.source == NetworkQualityEstimator::TCP)
+      if (observation.source == NETWORK_QUALITY_OBSERVATION_SOURCE_TCP)
         ++before_count_tcp_rtt_observations;
     }
 
@@ -1330,7 +1194,7 @@
 
     size_t after_count_tcp_rtt_observations = 0;
     for (const auto& observation : rtt_observer.observations()) {
-      if (observation.source == NetworkQualityEstimator::TCP)
+      if (observation.source == NETWORK_QUALITY_OBSERVATION_SOURCE_TCP)
         ++after_count_tcp_rtt_observations;
     }
     // At least one notification should be received per socket performance
diff --git a/net/nqe/network_quality_observation.h b/net/nqe/network_quality_observation.h
new file mode 100644
index 0000000..5349338d
--- /dev/null
+++ b/net/nqe/network_quality_observation.h
@@ -0,0 +1,53 @@
+// 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 NET_NQE_NETWORK_QUALITY_OBSERVATION_H_
+#define NET_NQE_NETWORK_QUALITY_OBSERVATION_H_
+
+#include <vector>
+
+#include "base/gtest_prod_util.h"
+#include "base/macros.h"
+#include "base/time/time.h"
+#include "net/base/net_export.h"
+#include "net/nqe/network_quality_observation_source.h"
+
+namespace net {
+
+namespace nqe {
+
+namespace internal {
+
+// Records observations of network quality metrics (such as round trip time
+// or throughput), along with the time the observation was made. Observations
+// can be made at several places in the network stack, thus the observation
+// source is provided as well. ValueType must be numerical so that statistics
+// such as median, average can be computed.
+template <typename ValueType>
+struct NET_EXPORT_PRIVATE Observation {
+  Observation(const ValueType& value,
+              base::TimeTicks timestamp,
+              NetworkQualityObservationSource source)
+      : value(value), timestamp(timestamp), source(source) {
+    DCHECK(!timestamp.is_null());
+  }
+  ~Observation() {}
+
+  // Value of the observation.
+  const ValueType value;
+
+  // Time when the observation was taken.
+  const base::TimeTicks timestamp;
+
+  // The source of the observation.
+  const NetworkQualityObservationSource source;
+};
+
+}  // namespace internal
+
+}  // namespace nqe
+
+}  // namespace net
+
+#endif  // NET_NQE_NETWORK_QUALITY_OBSERVATION_H_
\ No newline at end of file
diff --git a/net/nqe/network_quality_observation_source.h b/net/nqe/network_quality_observation_source.h
new file mode 100644
index 0000000..da64c67
--- /dev/null
+++ b/net/nqe/network_quality_observation_source.h
@@ -0,0 +1,40 @@
+// 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 NET_NQE_NETWORK_QUALITY_OBSERVATION_SOURCE_H_
+#define NET_NQE_NETWORK_QUALITY_OBSERVATION_SOURCE_H_
+
+namespace net {
+
+// On Android, a Java counterpart will be generated for this enum.
+// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.net
+// GENERATED_JAVA_CLASS_NAME_OVERRIDE: NetworkQualityObservationSource
+// GENERATED_JAVA_PREFIX_TO_STRIP: NETWORK_QUALITY_OBSERVATION_SOURCE_
+enum NetworkQualityObservationSource {
+  // The observation was taken at the request layer, e.g., a round trip time
+  // is recorded as the time between the request being sent and the first byte
+  // being received.
+  NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST = 0,
+
+  // The observation is taken from TCP statistics maintained by the kernel.
+  NETWORK_QUALITY_OBSERVATION_SOURCE_TCP,
+
+  // The observation is taken at the QUIC layer.
+  NETWORK_QUALITY_OBSERVATION_SOURCE_QUIC,
+
+  // The observation is a previously cached estimate of the metric.
+  NETWORK_QUALITY_OBSERVATION_SOURCE_CACHED_ESTIMATE,
+
+  // The observation is derived from network connection information provided
+  // by the platform. For example, typical RTT and throughput values are used
+  // for a given type of network connection.
+  NETWORK_QUALITY_OBSERVATION_SOURCE_DEFAULT_FROM_PLATFORM,
+
+  // The observation came from a Chromium-external source.
+  NETWORK_QUALITY_OBSERVATION_SOURCE_EXTERNAL_ESTIMATE
+};
+
+}  // namespace net
+
+#endif  // NET_NQE_NETWORK_QUALITY_OBSERVATION_SOURCE_H_
\ No newline at end of file
diff --git a/net/nqe/network_quality_observation_unittest.cc b/net/nqe/network_quality_observation_unittest.cc
new file mode 100644
index 0000000..f8215a2
--- /dev/null
+++ b/net/nqe/network_quality_observation_unittest.cc
@@ -0,0 +1,332 @@
+// 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 "net/nqe/network_quality_observation.h"
+
+#include <stddef.h>
+
+#include <vector>
+
+#include "base/logging.h"
+#include "base/macros.h"
+#include "base/time/time.h"
+#include "net/nqe/network_quality_observation_source.h"
+#include "net/nqe/observation_buffer.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace net {
+
+namespace nqe {
+
+namespace {
+
+// Verifies that the percentiles are correctly computed. All observations have
+// the same timestamp.
+TEST(NetworkQualityObservationTest, PercentileSameTimestamps) {
+  internal::ObservationBuffer<int32_t> int_buffer(0.5);
+  internal::ObservationBuffer<base::TimeDelta> time_delta_buffer(0.5);
+  ASSERT_EQ(0u, int_buffer.Size());
+  ASSERT_LT(0u, int_buffer.Capacity());
+  ASSERT_EQ(0u, time_delta_buffer.Size());
+  ASSERT_LT(0u, time_delta_buffer.Capacity());
+
+  const base::TimeTicks now = base::TimeTicks::Now();
+
+  int32_t result;
+  base::TimeDelta time_delta_result;
+
+  // Percentiles should be unavailable when no observations are available.
+  EXPECT_FALSE(
+      int_buffer.GetPercentile(base::TimeTicks(), &result, 50,
+                               std::vector<NetworkQualityObservationSource>()));
+  EXPECT_FALSE(time_delta_buffer.GetPercentile(
+      base::TimeTicks(), &time_delta_result, 50,
+      std::vector<NetworkQualityObservationSource>()));
+
+  // Insert samples from {1,2,3,..., 100}. First insert odd samples, then even
+  // samples. This helps in verifying that the order of samples does not matter.
+  for (int i = 1; i <= 99; i += 2) {
+    int_buffer.AddObservation(internal::Observation<int32_t>(
+        i, now, NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
+    time_delta_buffer.AddObservation(internal::Observation<base::TimeDelta>(
+        base::TimeDelta::FromMilliseconds(i), now,
+        NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
+    EXPECT_TRUE(int_buffer.GetPercentile(
+        base::TimeTicks(), &result, 50,
+        std::vector<NetworkQualityObservationSource>()));
+    ASSERT_EQ(static_cast<size_t>(i / 2 + 1), int_buffer.Size());
+    EXPECT_TRUE(time_delta_buffer.GetPercentile(
+        base::TimeTicks(), &time_delta_result, 50,
+        std::vector<NetworkQualityObservationSource>()));
+    ASSERT_EQ(static_cast<size_t>(i / 2 + 1), time_delta_buffer.Size());
+  }
+
+  for (int i = 2; i <= 100; i += 2) {
+    int_buffer.AddObservation(internal::Observation<int32_t>(
+        i, now, NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
+    time_delta_buffer.AddObservation(internal::Observation<base::TimeDelta>(
+        base::TimeDelta::FromMilliseconds(i), now,
+        NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
+    EXPECT_TRUE(int_buffer.GetPercentile(
+        base::TimeTicks(), &result, 50,
+        std::vector<NetworkQualityObservationSource>()));
+    ASSERT_EQ(static_cast<size_t>(i / 2 + 50), int_buffer.Size());
+    EXPECT_TRUE(time_delta_buffer.GetPercentile(
+        base::TimeTicks(), &time_delta_result, 50,
+        std::vector<NetworkQualityObservationSource>()));
+    ASSERT_EQ(static_cast<size_t>(i / 2 + 50), time_delta_buffer.Size());
+  }
+
+  ASSERT_EQ(100u, int_buffer.Size());
+  ASSERT_EQ(100u, time_delta_buffer.Size());
+
+  for (int i = 0; i <= 100; ++i) {
+    // Checks if the difference between the two integers is less than 1. This is
+    // required because computed percentiles may be slightly different from
+    // what is expected due to floating point computation errors and integer
+    // rounding off errors.
+    EXPECT_TRUE(int_buffer.GetPercentile(
+        base::TimeTicks(), &result, i,
+        std::vector<NetworkQualityObservationSource>()));
+    EXPECT_TRUE(time_delta_buffer.GetPercentile(
+        base::TimeTicks(), &time_delta_result, i,
+        std::vector<NetworkQualityObservationSource>()));
+    EXPECT_NEAR(result, i, 1);
+    EXPECT_NEAR(time_delta_result.InMilliseconds(), i, 1);
+  }
+
+  EXPECT_FALSE(int_buffer.GetPercentile(
+      now + base::TimeDelta::FromSeconds(1), &result, 50,
+      std::vector<NetworkQualityObservationSource>()));
+  EXPECT_FALSE(time_delta_buffer.GetPercentile(
+      now + base::TimeDelta::FromSeconds(1), &time_delta_result, 50,
+      std::vector<NetworkQualityObservationSource>()));
+
+  // Percentiles should be unavailable when no observations are available.
+  int_buffer.Clear();
+  time_delta_buffer.Clear();
+  EXPECT_FALSE(
+      int_buffer.GetPercentile(base::TimeTicks(), &result, 50,
+                               std::vector<NetworkQualityObservationSource>()));
+  EXPECT_FALSE(time_delta_buffer.GetPercentile(
+      base::TimeTicks(), &time_delta_result, 50,
+      std::vector<NetworkQualityObservationSource>()));
+}
+
+// Verifies that the percentiles are correctly computed. Observations have
+// different timestamps with half the observations being very old and the rest
+// of them being very recent. Percentiles should factor in recent observations
+// much more heavily than older samples.
+TEST(NetworkQualityObservationTest, PercentileDifferentTimestamps) {
+  internal::ObservationBuffer<int32_t> int_buffer(0.5);
+  internal::ObservationBuffer<base::TimeDelta> time_delta_buffer(0.5);
+  const base::TimeTicks now = base::TimeTicks::Now();
+  const base::TimeTicks very_old = now - base::TimeDelta::FromDays(365);
+
+  int32_t result;
+  base::TimeDelta time_delta_result;
+
+  // Network quality should be unavailable when no observations are available.
+  EXPECT_FALSE(
+      int_buffer.GetPercentile(base::TimeTicks(), &result, 50,
+                               std::vector<NetworkQualityObservationSource>()));
+  EXPECT_FALSE(time_delta_buffer.GetPercentile(
+      base::TimeTicks(), &time_delta_result, 50,
+      std::vector<NetworkQualityObservationSource>()));
+
+  // First 50 samples have very old timestamp.
+  for (int i = 1; i <= 50; ++i) {
+    int_buffer.AddObservation(internal::Observation<int32_t>(
+        i, very_old, NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
+    time_delta_buffer.AddObservation(internal::Observation<base::TimeDelta>(
+        base::TimeDelta::FromMilliseconds(i), very_old,
+        NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
+  }
+
+  // Next 50 (i.e., from 51 to 100) have recent timestamp.
+  for (int i = 51; i <= 100; ++i) {
+    int_buffer.AddObservation(internal::Observation<int32_t>(
+        i, now, NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
+    time_delta_buffer.AddObservation(internal::Observation<base::TimeDelta>(
+        base::TimeDelta::FromMilliseconds(i), now,
+        NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
+  }
+
+  // Older samples have very little weight. So, all percentiles are >= 51
+  // (lowest value among recent observations).
+  for (int i = 1; i < 100; ++i) {
+    // Checks if the difference between the two integers is less than 1. This is
+    // required because computed percentiles may be slightly different from
+    // what is expected due to floating point computation errors and integer
+    // rounding off errors.
+    EXPECT_TRUE(int_buffer.GetPercentile(
+        base::TimeTicks(), &result, i,
+        std::vector<NetworkQualityObservationSource>()));
+    EXPECT_NEAR(result, 51 + 0.49 * i, 1);
+
+    EXPECT_TRUE(time_delta_buffer.GetPercentile(
+        base::TimeTicks(), &time_delta_result, i,
+        std::vector<NetworkQualityObservationSource>()));
+    EXPECT_NEAR(time_delta_result.InMilliseconds(), 51 + 0.49 * i, 1);
+  }
+
+  EXPECT_FALSE(int_buffer.GetPercentile(
+      now + base::TimeDelta::FromSeconds(1), &result, 50,
+      std::vector<NetworkQualityObservationSource>()));
+  EXPECT_FALSE(time_delta_buffer.GetPercentile(
+      now + base::TimeDelta::FromSeconds(1), &time_delta_result, 50,
+      std::vector<NetworkQualityObservationSource>()));
+}
+
+// Verifies that the percentiles are correctly computed when some of the
+// observation sources are disallowed. All observations have the same timestamp.
+TEST(NetworkQualityObservationTest, DisallowedObservationSources) {
+  internal::ObservationBuffer<int32_t> int_buffer(0.5);
+  internal::ObservationBuffer<base::TimeDelta> time_delta_buffer(0.5);
+  const base::TimeTicks now = base::TimeTicks::Now();
+
+  int32_t result;
+  base::TimeDelta time_delta_result;
+
+  // Network quality should be unavailable when no observations are available.
+  EXPECT_FALSE(
+      int_buffer.GetPercentile(base::TimeTicks(), &result, 50,
+                               std::vector<NetworkQualityObservationSource>()));
+  EXPECT_FALSE(time_delta_buffer.GetPercentile(
+      base::TimeTicks(), &time_delta_result, 50,
+      std::vector<NetworkQualityObservationSource>()));
+
+  // Insert samples from {1,2,3,..., 100}. First insert odd samples, then even
+  // samples. This helps in verifying that the order of samples does not matter.
+  for (int i = 1; i <= 99; i += 2) {
+    int_buffer.AddObservation(internal::Observation<int32_t>(
+        i, now, NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
+    time_delta_buffer.AddObservation(internal::Observation<base::TimeDelta>(
+        base::TimeDelta::FromMilliseconds(i), now,
+        NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
+  }
+
+  // Add samples for TCP and QUIC observations which should not be taken into
+  // account when computing the percentile.
+  for (int i = 1; i <= 99; i += 2) {
+    int_buffer.AddObservation(internal::Observation<int32_t>(
+        10000, now, NETWORK_QUALITY_OBSERVATION_SOURCE_TCP));
+    int_buffer.AddObservation(internal::Observation<int32_t>(
+        10000, now, NETWORK_QUALITY_OBSERVATION_SOURCE_QUIC));
+    time_delta_buffer.AddObservation(internal::Observation<base::TimeDelta>(
+        base::TimeDelta::FromMilliseconds(10000), now,
+        NETWORK_QUALITY_OBSERVATION_SOURCE_TCP));
+    time_delta_buffer.AddObservation(internal::Observation<base::TimeDelta>(
+        base::TimeDelta::FromMilliseconds(10000), now,
+        NETWORK_QUALITY_OBSERVATION_SOURCE_QUIC));
+  }
+
+  for (int i = 2; i <= 100; i += 2) {
+    int_buffer.AddObservation(internal::Observation<int32_t>(
+        i, now, NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
+    time_delta_buffer.AddObservation(internal::Observation<base::TimeDelta>(
+        base::TimeDelta::FromMilliseconds(i), now,
+        NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
+  }
+
+  std::vector<NetworkQualityObservationSource> disallowed_observation_sources;
+  disallowed_observation_sources.push_back(
+      NETWORK_QUALITY_OBSERVATION_SOURCE_TCP);
+  disallowed_observation_sources.push_back(
+      NETWORK_QUALITY_OBSERVATION_SOURCE_QUIC);
+
+  for (int i = 0; i <= 100; ++i) {
+    // Checks if the difference between the two integers is less than 1. This is
+    // required because computed percentiles may be slightly different from
+    // what is expected due to floating point computation errors and integer
+    // rounding off errors.
+    EXPECT_TRUE(int_buffer.GetPercentile(base::TimeTicks(), &result, i,
+                                         disallowed_observation_sources));
+    EXPECT_NEAR(result, i, 1);
+    EXPECT_TRUE(
+        time_delta_buffer.GetPercentile(base::TimeTicks(), &time_delta_result,
+                                        i, disallowed_observation_sources));
+    EXPECT_NEAR(time_delta_result.InMilliseconds(), i, 1);
+  }
+
+  // Now check the percentile value for TCP and QUIC observations.
+  disallowed_observation_sources.clear();
+  disallowed_observation_sources.push_back(
+      NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST);
+  for (int i = 0; i <= 100; ++i) {
+    // Checks if the difference between the two integers is less than 1. This is
+    // required because computed percentiles may be slightly different from
+    // what is expected due to floating point computation errors and integer
+    // rounding off errors.
+    EXPECT_TRUE(int_buffer.GetPercentile(base::TimeTicks(), &result, i,
+                                         disallowed_observation_sources));
+    EXPECT_NEAR(result, 10000, 1);
+    EXPECT_TRUE(
+        time_delta_buffer.GetPercentile(base::TimeTicks(), &time_delta_result,
+                                        i, disallowed_observation_sources));
+    EXPECT_NEAR(time_delta_result.InMilliseconds(), 10000, 1);
+  }
+}
+
+TEST(NetworkQualityObservationTest, TestGetMedianRTTSince) {
+  internal::ObservationBuffer<int32_t> int_buffer(0.5);
+  internal::ObservationBuffer<base::TimeDelta> time_delta_buffer(0.5);
+  base::TimeTicks now = base::TimeTicks::Now();
+  base::TimeTicks old = now - base::TimeDelta::FromMilliseconds(1);
+  ASSERT_NE(old, now);
+
+  // First sample has very old timestamp.
+  int_buffer.AddObservation(internal::Observation<int32_t>(
+      1, old, NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
+  time_delta_buffer.AddObservation(internal::Observation<base::TimeDelta>(
+      base::TimeDelta::FromMilliseconds(1), old,
+      NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
+
+  int_buffer.AddObservation(internal::Observation<int32_t>(
+      100, now, NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
+  time_delta_buffer.AddObservation(internal::Observation<base::TimeDelta>(
+      base::TimeDelta::FromMilliseconds(100), now,
+      NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST));
+
+  const struct {
+    base::TimeTicks start_timestamp;
+    bool expect_network_quality_available;
+    base::TimeDelta expected_url_request_rtt;
+    int32_t expected_downstream_throughput;
+  } tests[] = {
+      {now + base::TimeDelta::FromSeconds(10), false,
+       base::TimeDelta::FromMilliseconds(0), 0},
+      {now, true, base::TimeDelta::FromMilliseconds(100), 100},
+      {now - base::TimeDelta::FromMicroseconds(500), true,
+       base::TimeDelta::FromMilliseconds(100), 100},
+
+  };
+
+  for (const auto& test : tests) {
+    base::TimeDelta url_request_rtt;
+    int32_t downstream_throughput_kbps;
+    std::vector<NetworkQualityObservationSource> disallowed_observation_sources;
+
+    EXPECT_EQ(
+        test.expect_network_quality_available,
+        time_delta_buffer.GetPercentile(test.start_timestamp, &url_request_rtt,
+                                        50, disallowed_observation_sources));
+    EXPECT_EQ(test.expect_network_quality_available,
+              int_buffer.GetPercentile(test.start_timestamp,
+                                       &downstream_throughput_kbps, 50,
+                                       disallowed_observation_sources));
+
+    if (test.expect_network_quality_available) {
+      EXPECT_EQ(test.expected_url_request_rtt, url_request_rtt);
+      EXPECT_EQ(test.expected_downstream_throughput,
+                downstream_throughput_kbps);
+    }
+  }
+}
+
+}  // namespace
+
+}  // namespace nqe
+
+}  // namespace net
\ No newline at end of file
diff --git a/net/nqe/observation_buffer.h b/net/nqe/observation_buffer.h
new file mode 100644
index 0000000..cc3f1d8
--- /dev/null
+++ b/net/nqe/observation_buffer.h
@@ -0,0 +1,186 @@
+// 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 NET_NQE_OBSERVATION_BUFFER_H_
+#define NET_NQE_OBSERVATION_BUFFER_H_
+
+#include <float.h>
+
+#include <algorithm>
+#include <deque>
+#include <vector>
+
+#include "base/gtest_prod_util.h"
+#include "base/macros.h"
+#include "base/time/time.h"
+#include "net/base/net_export.h"
+#include "net/nqe/network_quality_observation_source.h"
+#include "net/nqe/weighted_observation.h"
+
+namespace net {
+
+namespace nqe {
+
+namespace internal {
+
+// Stores observations sorted by time.
+template <typename ValueType>
+class NET_EXPORT_PRIVATE ObservationBuffer {
+ public:
+  explicit ObservationBuffer(double weight_multiplier_per_second)
+      : weight_multiplier_per_second_(weight_multiplier_per_second) {
+    static_assert(kMaximumObservationsBufferSize > 0U,
+                  "Minimum size of observation buffer must be > 0");
+    DCHECK_GE(weight_multiplier_per_second_, 0.0);
+    DCHECK_LE(weight_multiplier_per_second_, 1.0);
+  }
+
+  ~ObservationBuffer() {}
+
+  // Adds |observation| to the buffer. The oldest observation in the buffer
+  // will be evicted to make room if the buffer is already full.
+  void AddObservation(const Observation<ValueType>& observation) {
+    DCHECK_LE(observations_.size(),
+              static_cast<size_t>(kMaximumObservationsBufferSize));
+    // Evict the oldest element if the buffer is already full.
+    if (observations_.size() == kMaximumObservationsBufferSize)
+      observations_.pop_front();
+
+    observations_.push_back(observation);
+    DCHECK_LE(observations_.size(),
+              static_cast<size_t>(kMaximumObservationsBufferSize));
+  }
+
+  // Returns the number of observations in this buffer.
+  size_t Size() const { return static_cast<size_t>(observations_.size()); }
+
+  // Returns the capacity of this buffer.
+  size_t Capacity() const {
+    return static_cast<size_t>(kMaximumObservationsBufferSize);
+  }
+
+  // Clears the observations stored in this buffer.
+  void Clear() { observations_.clear(); }
+
+  // Returns true iff the |percentile| value of the observations in this
+  // buffer is available. Sets |result| to the computed |percentile|
+  // value among all observations since |begin_timestamp|. If the value is
+  // unavailable, false is returned and |result| is not modified. Percentile
+  // value is unavailable if all the values in observation buffer are older
+  // than |begin_timestamp|.
+  // |result| must not be null.
+  bool GetPercentile(const base::TimeTicks& begin_timestamp,
+                     ValueType* result,
+                     int percentile,
+                     const std::vector<NetworkQualityObservationSource>&
+                         disallowed_observation_sources) const {
+    DCHECK(result);
+    DCHECK_GE(Capacity(), Size());
+    // Stores WeightedObservation in increasing order of value.
+    std::vector<WeightedObservation<ValueType>> weighted_observations;
+
+    // Total weight of all observations in |weighted_observations|.
+    double total_weight = 0.0;
+
+    ComputeWeightedObservations(begin_timestamp, weighted_observations,
+                                &total_weight, disallowed_observation_sources);
+    if (weighted_observations.empty())
+      return false;
+
+    DCHECK(!weighted_observations.empty());
+    DCHECK_GT(total_weight, 0.0);
+
+    // |weighted_observations| may have a smaller size than observations_ since
+    // the former contains only the observations later than begin_timestamp.
+    DCHECK_GE(observations_.size(), weighted_observations.size());
+
+    double desired_weight = percentile / 100.0 * total_weight;
+
+    double cumulative_weight_seen_so_far = 0.0;
+    for (const auto& weighted_observation : weighted_observations) {
+      cumulative_weight_seen_so_far += weighted_observation.weight;
+
+      if (cumulative_weight_seen_so_far >= desired_weight) {
+        *result = weighted_observation.value;
+        return true;
+      }
+    }
+
+    // Computation may reach here due to floating point errors. This may happen
+    // if |percentile| was 100 (or close to 100), and |desired_weight| was
+    // slightly larger than |total_weight| (due to floating point errors).
+    // In this case, we return the highest |value| among all observations.
+    // This is same as value of the last observation in the sorted vector.
+    *result = weighted_observations.at(weighted_observations.size() - 1).value;
+    return true;
+  }
+
+ private:
+  // Maximum number of observations that can be held in the ObservationBuffer.
+  static const size_t kMaximumObservationsBufferSize = 300;
+
+  // Computes the weighted observations and stores them in
+  // |weighted_observations| sorted by ascending |WeightedObservation.value|.
+  // Only the observations with timestamp later than |begin_timestamp| are
+  // considered. Also, sets |total_weight| to the total weight of all
+  // observations. Should be called only when there is at least one
+  // observation in the buffer.
+  void ComputeWeightedObservations(
+      const base::TimeTicks& begin_timestamp,
+      std::vector<WeightedObservation<ValueType>>& weighted_observations,
+      double* total_weight,
+      const std::vector<NetworkQualityObservationSource>&
+          disallowed_observation_sources) const {
+    DCHECK_GE(Capacity(), Size());
+
+    weighted_observations.clear();
+    double total_weight_observations = 0.0;
+    base::TimeTicks now = base::TimeTicks::Now();
+
+    for (const auto& observation : observations_) {
+      if (observation.timestamp < begin_timestamp)
+        continue;
+      bool disallowed = false;
+      for (const auto& disallowed_source : disallowed_observation_sources) {
+        if (disallowed_source == observation.source)
+          disallowed = true;
+      }
+      if (disallowed)
+        continue;
+      base::TimeDelta time_since_sample_taken = now - observation.timestamp;
+      double weight = pow(weight_multiplier_per_second_,
+                          time_since_sample_taken.InSeconds());
+      weight = std::max(DBL_MIN, std::min(1.0, weight));
+
+      weighted_observations.push_back(
+          WeightedObservation<ValueType>(observation.value, weight));
+      total_weight_observations += weight;
+    }
+
+    // Sort the samples by value in ascending order.
+    std::sort(weighted_observations.begin(), weighted_observations.end());
+    *total_weight = total_weight_observations;
+  }
+
+  // Holds observations sorted by time, with the oldest observation at the
+  // front of the queue.
+  std::deque<Observation<ValueType>> observations_;
+
+  // The factor by which the weight of an observation reduces every second.
+  // For example, if an observation is 6 seconds old, its weight would be:
+  //     weight_multiplier_per_second_ ^ 6
+  // Calculated from |kHalfLifeSeconds| by solving the following equation:
+  //     weight_multiplier_per_second_ ^ kHalfLifeSeconds = 0.5
+  const double weight_multiplier_per_second_;
+
+  DISALLOW_COPY_AND_ASSIGN(ObservationBuffer);
+};
+
+}  // namespace internal
+
+}  // namespace nqe
+
+}  // namespace net
+
+#endif  // NET_NQE_OBSERVATION_BUFFER_H_
\ No newline at end of file
diff --git a/net/nqe/weighted_observation.h b/net/nqe/weighted_observation.h
new file mode 100644
index 0000000..287442a0
--- /dev/null
+++ b/net/nqe/weighted_observation.h
@@ -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.
+
+#ifndef NET_NQE_WEIGHTED_OBSERVATION_H_
+#define NET_NQE_WEIGHTED_OBSERVATION_H_
+
+#include <vector>
+
+#include "base/gtest_prod_util.h"
+#include "base/macros.h"
+#include "base/time/time.h"
+#include "net/base/net_export.h"
+#include "net/nqe/network_quality_observation_source.h"
+
+namespace net {
+
+namespace nqe {
+
+namespace internal {
+
+// Holds an observation and its weight.
+template <typename ValueType>
+struct NET_EXPORT_PRIVATE WeightedObservation {
+  WeightedObservation(ValueType value, double weight)
+      : value(value), weight(weight) {}
+  WeightedObservation(const WeightedObservation& other)
+      : WeightedObservation(other.value, other.weight) {}
+
+  WeightedObservation& operator=(const WeightedObservation& other) {
+    value = other.value;
+    weight = other.weight;
+    return *this;
+  }
+
+  // Required for sorting the samples in the ascending order of values.
+  bool operator<(const WeightedObservation& other) const {
+    return (value < other.value);
+  }
+
+  // Value of the sample.
+  ValueType value;
+
+  // Weight of the sample. This is computed based on how much time has passed
+  // since the sample was taken.
+  double weight;
+};
+
+}  // namespace internal
+
+}  // namespace nqe
+
+}  // namespace net
+
+#endif  // NET_NQE_WEIGHTED_OBSERVATION_H_
\ No newline at end of file
diff --git a/net/quic/bidirectional_stream_quic_impl.cc b/net/quic/bidirectional_stream_quic_impl.cc
index 1813a66a..b85997b 100644
--- a/net/quic/bidirectional_stream_quic_impl.cc
+++ b/net/quic/bidirectional_stream_quic_impl.cc
@@ -97,7 +97,7 @@
   return ERR_IO_PENDING;
 }
 
-void BidirectionalStreamQuicImpl::SendData(IOBuffer* data,
+void BidirectionalStreamQuicImpl::SendData(const scoped_refptr<IOBuffer>& data,
                                            int length,
                                            bool end_stream) {
   DCHECK(stream_);
@@ -117,7 +117,7 @@
 }
 
 void BidirectionalStreamQuicImpl::SendvData(
-    const std::vector<IOBuffer*>& buffers,
+    const std::vector<scoped_refptr<IOBuffer>>& buffers,
     const std::vector<int>& lengths,
     bool end_stream) {
   DCHECK(stream_);
diff --git a/net/quic/bidirectional_stream_quic_impl.h b/net/quic/bidirectional_stream_quic_impl.h
index 2570b902..e3ff775 100644
--- a/net/quic/bidirectional_stream_quic_impl.h
+++ b/net/quic/bidirectional_stream_quic_impl.h
@@ -43,8 +43,10 @@
              BidirectionalStreamImpl::Delegate* delegate,
              std::unique_ptr<base::Timer> timer) override;
   int ReadData(IOBuffer* buffer, int buffer_len) override;
-  void SendData(IOBuffer* data, int length, bool end_stream) override;
-  void SendvData(const std::vector<IOBuffer*>& buffers,
+  void SendData(const scoped_refptr<IOBuffer>& data,
+                int length,
+                bool end_stream) override;
+  void SendvData(const std::vector<scoped_refptr<IOBuffer>>& buffers,
                  const std::vector<int>& lengths,
                  bool end_stream) override;
   void Cancel() override;
diff --git a/net/quic/bidirectional_stream_quic_impl_unittest.cc b/net/quic/bidirectional_stream_quic_impl_unittest.cc
index d8e98e7..825af4b39 100644
--- a/net/quic/bidirectional_stream_quic_impl_unittest.cc
+++ b/net/quic/bidirectional_stream_quic_impl_unittest.cc
@@ -134,13 +134,15 @@
                        nullptr);
   }
 
-  void SendData(IOBuffer* data, int length, bool end_of_stream) {
+  void SendData(const scoped_refptr<IOBuffer>& data,
+                int length,
+                bool end_of_stream) {
     not_expect_callback_ = true;
     stream_job_->SendData(data, length, end_of_stream);
     not_expect_callback_ = false;
   }
 
-  void SendvData(const std::vector<IOBuffer*>& data,
+  void SendvData(const std::vector<scoped_refptr<IOBuffer>>& data,
                  const std::vector<int>& lengths,
                  bool end_of_stream) {
     not_expect_callback_ = true;
@@ -711,9 +713,8 @@
   scoped_refptr<StringIOBuffer> buf1(new StringIOBuffer(kBody1));
   scoped_refptr<StringIOBuffer> buf2(new StringIOBuffer(kBody2));
 
-  std::vector<IOBuffer*> buffers = {buf1.get(), buf2.get()};
   std::vector<int> lengths = {buf1->size(), buf2->size()};
-  delegate->SendvData(buffers, lengths, !kFin);
+  delegate->SendvData({buf1, buf2}, lengths, !kFin);
   delegate->WaitUntilNextCallback();  // OnDataSent
 
   // Server acks the request.
@@ -744,7 +745,7 @@
   scoped_refptr<StringIOBuffer> buf4(new StringIOBuffer(kBody4));
   scoped_refptr<StringIOBuffer> buf5(new StringIOBuffer(kBody5));
 
-  delegate->SendvData({buf3.get(), buf4.get(), buf5.get()},
+  delegate->SendvData({buf3, buf4, buf5},
                       {buf3->size(), buf4->size(), buf5->size()}, kFin);
   delegate->WaitUntilNextCallback();  // OnDataSent
 
@@ -801,7 +802,7 @@
   // Send a DATA frame.
   scoped_refptr<StringIOBuffer> buf(new StringIOBuffer(kUploadData));
 
-  delegate->SendData(buf.get(), buf->size(), true);
+  delegate->SendData(buf, buf->size(), true);
   delegate->WaitUntilNextCallback();  // OnDataSent
 
   // Server acks the request.
@@ -891,7 +892,7 @@
   // Client sends a data packet.
   scoped_refptr<StringIOBuffer> buf(new StringIOBuffer(kUploadData));
 
-  delegate->SendData(buf.get(), buf->size(), false);
+  delegate->SendData(buf, buf->size(), false);
   delegate->WaitUntilNextCallback();  // OnDataSent
 
   TestCompletionCallback cb;
@@ -907,7 +908,7 @@
   EXPECT_EQ(std::string(kResponseBody), delegate->data_received());
 
   // Client sends a data packet.
-  delegate->SendData(buf.get(), buf->size(), true);
+  delegate->SendData(buf, buf->size(), true);
   delegate->WaitUntilNextCallback();  // OnDataSent
 
   TestCompletionCallback cb2;
@@ -1066,7 +1067,7 @@
   // Send a DATA frame.
   scoped_refptr<StringIOBuffer> buf(new StringIOBuffer(kUploadData));
 
-  delegate->SendData(buf.get(), buf->size(), false);
+  delegate->SendData(buf, buf->size(), false);
   delegate->WaitUntilNextCallback();  // OnDataSent
 
   delegate->CancelStream();
diff --git a/net/quic/quic_chromium_client_stream.cc b/net/quic/quic_chromium_client_stream.cc
index 1aa8e53..0f21d51 100644
--- a/net/quic/quic_chromium_client_stream.cc
+++ b/net/quic/quic_chromium_client_stream.cc
@@ -140,7 +140,7 @@
 }
 
 int QuicChromiumClientStream::WritevStreamData(
-    const std::vector<IOBuffer*>& buffers,
+    const std::vector<scoped_refptr<IOBuffer>>& buffers,
     const std::vector<int>& lengths,
     bool fin,
     const CompletionCallback& callback) {
diff --git a/net/quic/quic_chromium_client_stream.h b/net/quic/quic_chromium_client_stream.h
index 78884f61..1a66865 100644
--- a/net/quic/quic_chromium_client_stream.h
+++ b/net/quic/quic_chromium_client_stream.h
@@ -82,7 +82,7 @@
                       const CompletionCallback& callback);
   // Same as WriteStreamData except it writes data from a vector of IOBuffers,
   // with the length of each buffer at the corresponding index in |lengths|.
-  int WritevStreamData(const std::vector<IOBuffer*>& buffers,
+  int WritevStreamData(const std::vector<scoped_refptr<IOBuffer>>& buffers,
                        const std::vector<int>& lengths,
                        bool fin,
                        const CompletionCallback& callback);
diff --git a/net/quic/quic_chromium_client_stream_test.cc b/net/quic/quic_chromium_client_stream_test.cc
index bc6d7343..3e56cc7 100644
--- a/net/quic/quic_chromium_client_stream_test.cc
+++ b/net/quic/quic_chromium_client_stream_test.cc
@@ -477,9 +477,9 @@
       .WillOnce(Return(QuicConsumedData(buf1->size(), false)))
       .WillOnce(Return(QuicConsumedData(buf2->size(), true)));
   TestCompletionCallback callback;
-  EXPECT_EQ(OK, stream_->WritevStreamData({buf1.get(), buf2.get()},
-                                          {buf1->size(), buf2->size()}, true,
-                                          callback.callback()));
+  EXPECT_EQ(
+      OK, stream_->WritevStreamData({buf1, buf2}, {buf1->size(), buf2->size()},
+                                    true, callback.callback()));
 }
 
 TEST_P(QuicChromiumClientStreamTest, WritevStreamDataAsync) {
diff --git a/net/quic/quic_network_transaction_unittest.cc b/net/quic/quic_network_transaction_unittest.cc
index 19d528d..19bf8a778 100644
--- a/net/quic/quic_network_transaction_unittest.cc
+++ b/net/quic/quic_network_transaction_unittest.cc
@@ -2170,8 +2170,6 @@
                                      0);
   socket_factory_.AddSocketDataProvider(&quic_data);
 
-  AddHangingNonAlternateProtocolSocketData();
-
   // Second Alternate-protocol job which will race with the TCP job.
   StaticSocketDataProvider quic_data2(quic_reads, arraysize(quic_reads),
                                       nullptr, 0);
@@ -2188,6 +2186,7 @@
   socket_factory_.AddSocketDataProvider(&http_data);
   socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
 
+  AddHangingNonAlternateProtocolSocketData();
   CreateSession();
 
   AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
diff --git a/net/quic/quic_stream_factory.cc b/net/quic/quic_stream_factory.cc
index 1a31440..dc47332 100644
--- a/net/quic/quic_stream_factory.cc
+++ b/net/quic/quic_stream_factory.cc
@@ -1478,6 +1478,13 @@
 #endif
   }
 
+#if defined(OS_WIN)
+  // TODO(rtenneti): Delete the check for TSVIPCli.dll loaded and the histogram.
+  bool tsvipcli_loaded = ::GetModuleHandle(L"TSVIPCli.dll") != NULL;
+  UMA_HISTOGRAM_BOOLEAN("Net.QuicStreamFactory.TSVIPCliIsLoaded",
+                        tsvipcli_loaded);
+#endif
+
   int rv;
   if (migrate_sessions_on_network_change_) {
     // If caller leaves network unspecified, use current default network.
diff --git a/net/quic/quic_stream_factory_test.cc b/net/quic/quic_stream_factory_test.cc
index e8f1017..731a88f 100644
--- a/net/quic/quic_stream_factory_test.cc
+++ b/net/quic/quic_stream_factory_test.cc
@@ -294,7 +294,7 @@
         threshold_timeouts_with_open_streams_(2),
         threshold_public_resets_post_handshake_(2),
         receive_buffer_size_(0),
-        delay_tcp_race_(false),
+        delay_tcp_race_(true),
         close_sessions_on_ip_change_(false),
         disable_quic_on_timeout_with_open_streams_(false),
         idle_connection_timeout_seconds_(kIdleConnectionTimeoutSeconds),
diff --git a/net/spdy/bidirectional_stream_spdy_impl.cc b/net/spdy/bidirectional_stream_spdy_impl.cc
index bbd76bb..42341ee 100644
--- a/net/spdy/bidirectional_stream_spdy_impl.cc
+++ b/net/spdy/bidirectional_stream_spdy_impl.cc
@@ -98,19 +98,19 @@
   return ERR_IO_PENDING;
 }
 
-void BidirectionalStreamSpdyImpl::SendData(IOBuffer* data,
+void BidirectionalStreamSpdyImpl::SendData(const scoped_refptr<IOBuffer>& data,
                                            int length,
                                            bool end_stream) {
   DCHECK(!stream_closed_);
   DCHECK(stream_);
   DCHECK(!disable_auto_flush_);
 
-  stream_->SendData(data, length,
+  stream_->SendData(data.get(), length,
                     end_stream ? NO_MORE_DATA_TO_SEND : MORE_DATA_TO_SEND);
 }
 
 void BidirectionalStreamSpdyImpl::SendvData(
-    const std::vector<IOBuffer*>& buffers,
+    const std::vector<scoped_refptr<IOBuffer>>& buffers,
     const std::vector<int>& lengths,
     bool end_stream) {
   DCHECK(!stream_closed_);
diff --git a/net/spdy/bidirectional_stream_spdy_impl.h b/net/spdy/bidirectional_stream_spdy_impl.h
index 951c6ae..2ddd4f8 100644
--- a/net/spdy/bidirectional_stream_spdy_impl.h
+++ b/net/spdy/bidirectional_stream_spdy_impl.h
@@ -8,8 +8,10 @@
 #include <stdint.h>
 
 #include <memory>
+#include <vector>
 
 #include "base/macros.h"
+#include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "net/http/bidirectional_stream_impl.h"
 #include "net/http/bidirectional_stream_request_info.h"
@@ -44,8 +46,10 @@
              BidirectionalStreamImpl::Delegate* delegate,
              std::unique_ptr<base::Timer> timer) override;
   int ReadData(IOBuffer* buf, int buf_len) override;
-  void SendData(IOBuffer* data, int length, bool end_stream) override;
-  void SendvData(const std::vector<IOBuffer*>& buffers,
+  void SendData(const scoped_refptr<IOBuffer>& data,
+                int length,
+                bool end_stream) override;
+  void SendvData(const std::vector<scoped_refptr<IOBuffer>>& buffers,
                  const std::vector<int>& lengths,
                  bool end_stream) override;
   void Cancel() override;
diff --git a/net/url_request/url_request_context_builder.cc b/net/url_request/url_request_context_builder.cc
index 8e7fcbc..3710daf 100644
--- a/net/url_request/url_request_context_builder.cc
+++ b/net/url_request/url_request_context_builder.cc
@@ -186,7 +186,7 @@
       enable_alternative_service_with_different_host(false),
       enable_quic(false),
       quic_max_server_configs_stored_in_properties(0),
-      quic_delay_tcp_race(false),
+      quic_delay_tcp_race(true),
       quic_max_number_of_lossy_connections(0),
       quic_prefer_aes(false),
       quic_packet_loss_threshold(1.0f),
diff --git a/printing/backend/print_backend.h b/printing/backend/print_backend.h
index 56e3575..5086d2047 100644
--- a/printing/backend/print_backend.h
+++ b/printing/backend/print_backend.h
@@ -21,6 +21,8 @@
 // This is the interface for platform-specific code for a print backend
 namespace printing {
 
+// Note: There are raw values. The |printer_name| and |printer_description|
+// require further interpretation on Mac. See existing callers for examples.
 struct PRINTING_EXPORT PrinterBasicInfo {
   PrinterBasicInfo();
   PrinterBasicInfo(const PrinterBasicInfo& other);
@@ -33,7 +35,7 @@
   std::map<std::string, std::string> options;
 };
 
-typedef std::vector<PrinterBasicInfo> PrinterList;
+using PrinterList = std::vector<PrinterBasicInfo>;
 
 struct PRINTING_EXPORT PrinterSemanticCapsAndDefaults {
   PrinterSemanticCapsAndDefaults();
@@ -89,9 +91,13 @@
   // Enumerates the list of installed local and network printers.
   virtual bool EnumeratePrinters(PrinterList* printer_list) = 0;
 
-  // Get the default printer name. Empty string if no default printer.
+  // Gets the default printer name. Empty string if no default printer.
   virtual std::string GetDefaultPrinterName() = 0;
 
+  // Gets the basic printer info for a specific printer.
+  virtual bool GetPrinterBasicInfo(const std::string& printer_name,
+                                   PrinterBasicInfo* printer_info) = 0;
+
   // Gets the semantic capabilities and defaults for a specific printer.
   // This is usually a lighter implementation than GetPrinterCapsAndDefaults().
   // NOTE: on some old platforms (WinXP without XPS pack)
@@ -112,7 +118,7 @@
   // Returns true if printer_name points to a valid printer.
   virtual bool IsValidPrinter(const std::string& printer_name) = 0;
 
-  // Allocate a print backend. If |print_backend_settings| is NULL, default
+  // Allocates a print backend. If |print_backend_settings| is nullptr, default
   // settings will be used.
   static scoped_refptr<PrintBackend> CreateInstance(
       const base::DictionaryValue* print_backend_settings);
diff --git a/printing/backend/print_backend_chromeos.cc b/printing/backend/print_backend_chromeos.cc
index e0de230..f32bbe1 100644
--- a/printing/backend/print_backend_chromeos.cc
+++ b/printing/backend/print_backend_chromeos.cc
@@ -16,6 +16,8 @@
   // PrintBackend implementation.
   bool EnumeratePrinters(PrinterList* printer_list) override;
   std::string GetDefaultPrinterName() override;
+  bool GetPrinterBasicInfo(const std::string& printer_name,
+                           PrinterBasicInfo* printer_info) override;
   bool GetPrinterSemanticCapsAndDefaults(
       const std::string& printer_name,
       PrinterSemanticCapsAndDefaults* printer_info) override;
@@ -34,6 +36,11 @@
   return true;
 }
 
+bool PrintBackendChromeOS::GetPrinterBasicInfo(const std::string& printer_name,
+                                               PrinterBasicInfo* printer_info) {
+  return false;
+}
+
 bool PrintBackendChromeOS::GetPrinterSemanticCapsAndDefaults(
     const std::string& printer_name,
     PrinterSemanticCapsAndDefaults* printer_info) {
diff --git a/printing/backend/print_backend_cups.cc b/printing/backend/print_backend_cups.cc
index 4cfe18a..0399aa9 100644
--- a/printing/backend/print_backend_cups.cc
+++ b/printing/backend/print_backend_cups.cc
@@ -21,19 +21,66 @@
 
 namespace printing {
 
-static const char kCUPSPrinterInfoOpt[] = "printer-info";
-static const char kCUPSPrinterStateOpt[] = "printer-state";
-static const char kCUPSPrinterTypeOpt[] = "printer-type";
-static const char kCUPSPrinterMakeModelOpt[] = "printer-make-and-model";
+namespace {
+
+const char kCUPSPrinterInfoOpt[] = "printer-info";
+const char kCUPSPrinterStateOpt[] = "printer-state";
+const char kCUPSPrinterTypeOpt[] = "printer-type";
+const char kCUPSPrinterMakeModelOpt[] = "printer-make-and-model";
+
+bool PrinterBasicInfoFromCUPS(const cups_dest_t& printer,
+                              PrinterBasicInfo* printer_info) {
+  // CUPS can have 'printers' that are actually scanners. (not MFC)
+  // At least on Mac. Check for scanners and skip them.
+  const char* type_str =
+      cupsGetOption(kCUPSPrinterTypeOpt, printer.num_options, printer.options);
+  if (type_str) {
+    int type;
+    if (base::StringToInt(type_str, &type) && (type & CUPS_PRINTER_SCANNER))
+      return false;
+  }
+
+  printer_info->printer_name = printer.name;
+  printer_info->is_default = printer.is_default;
+
+  const char* info =
+      cupsGetOption(kCUPSPrinterInfoOpt, printer.num_options, printer.options);
+  if (info)
+    printer_info->printer_description = info;
+
+  const char* state =
+      cupsGetOption(kCUPSPrinterStateOpt, printer.num_options, printer.options);
+  if (state)
+    base::StringToInt(state, &printer_info->printer_status);
+
+  const char* drv_info = cupsGetOption(kCUPSPrinterMakeModelOpt,
+                                       printer.num_options, printer.options);
+  if (drv_info)
+    printer_info->options[kDriverInfoTagName] = *drv_info;
+
+  // Store printer options.
+  for (int opt_index = 0; opt_index < printer.num_options; ++opt_index) {
+    printer_info->options[printer.options[opt_index].name] =
+        printer.options[opt_index].value;
+  }
+  return true;
+}
+
+}  // namespace
 
 class PrintBackendCUPS : public PrintBackend {
  public:
   PrintBackendCUPS(const GURL& print_server_url,
                    http_encryption_t encryption, bool blocking);
 
+ private:
+  ~PrintBackendCUPS() override {}
+
   // PrintBackend implementation.
   bool EnumeratePrinters(PrinterList* printer_list) override;
   std::string GetDefaultPrinterName() override;
+  bool GetPrinterBasicInfo(const std::string& printer_name,
+                           PrinterBasicInfo* printer_info) override;
   bool GetPrinterSemanticCapsAndDefaults(
       const std::string& printer_name,
       PrinterSemanticCapsAndDefaults* printer_info) override;
@@ -42,17 +89,17 @@
   std::string GetPrinterDriverInfo(const std::string& printer_name) override;
   bool IsValidPrinter(const std::string& printer_name) override;
 
- protected:
-  ~PrintBackendCUPS() override {}
-
- private:
-  // Following functions are wrappers around corresponding CUPS functions.
-  // <functions>2()  are called when print server is specified, and plain
-  // version in another case. There is an issue specifing CUPS_HTTP_DEFAULT
-  // in the <functions>2(), it does not work in CUPS prior to 1.4.
+  // The following functions are wrappers around corresponding CUPS functions.
+  // <functions>2() are called when print server is specified, and plain version
+  // in another case. There is an issue specifying CUPS_HTTP_DEFAULT in the
+  // functions>2(), it does not work in CUPS prior to 1.4.
   int GetDests(cups_dest_t** dests);
   base::FilePath GetPPD(const char* name);
 
+  // Wrapper around cupsGetNamedDest(). Returned result should be freed with
+  // cupsFreeDests().
+  cups_dest_t* GetNamedDest(const std::string& printer_name);
+
   GURL print_server_url_;
   http_encryption_t cups_encryption_;
   bool blocking_;
@@ -70,9 +117,9 @@
   DCHECK(printer_list);
   printer_list->clear();
 
-  cups_dest_t* destinations = NULL;
+  cups_dest_t* destinations = nullptr;
   int num_dests = GetDests(&destinations);
-  if ((num_dests == 0) && (cupsLastError() > IPP_OK_EVENTS_COMPLETE)) {
+  if (!num_dests && cupsLastError() > IPP_OK_EVENTS_COMPLETE) {
     VLOG(1) << "CUPS: Error getting printers from CUPS server"
             << ", server: " << print_server_url_
             << ", error: " << static_cast<int>(cupsLastError());
@@ -82,49 +129,14 @@
   for (int printer_index = 0; printer_index < num_dests; ++printer_index) {
     const cups_dest_t& printer = destinations[printer_index];
 
-    // CUPS can have 'printers' that are actually scanners. (not MFC)
-    // At least on Mac. Check for scanners and skip them.
-    const char* type_str = cupsGetOption(kCUPSPrinterTypeOpt,
-        printer.num_options, printer.options);
-    if (type_str != NULL) {
-      int type;
-      if (base::StringToInt(type_str, &type) && (type & CUPS_PRINTER_SCANNER))
-        continue;
-    }
-
     PrinterBasicInfo printer_info;
-    printer_info.printer_name = printer.name;
-    printer_info.is_default = printer.is_default;
-
-    const char* info = cupsGetOption(kCUPSPrinterInfoOpt,
-        printer.num_options, printer.options);
-    if (info != NULL)
-      printer_info.printer_description = info;
-
-    const char* state = cupsGetOption(kCUPSPrinterStateOpt,
-        printer.num_options, printer.options);
-    if (state != NULL)
-      base::StringToInt(state, &printer_info.printer_status);
-
-    const char* drv_info = cupsGetOption(kCUPSPrinterMakeModelOpt,
-                                         printer.num_options,
-                                         printer.options);
-    if (drv_info)
-      printer_info.options[kDriverInfoTagName] = *drv_info;
-
-    // Store printer options.
-    for (int opt_index = 0; opt_index < printer.num_options; ++opt_index) {
-      printer_info.options[printer.options[opt_index].name] =
-          printer.options[opt_index].value;
-    }
-
-    printer_list->push_back(printer_info);
+    if (PrinterBasicInfoFromCUPS(printer, &printer_info))
+      printer_list->push_back(printer_info);
   }
 
   cupsFreeDests(num_dests, destinations);
 
-  VLOG(1) << "CUPS: Enumerated printers"
-          << ", server: " << print_server_url_
+  VLOG(1) << "CUPS: Enumerated printers, server: " << print_server_url_
           << ", # of printers: " << printer_list->size();
   return true;
 }
@@ -133,12 +145,24 @@
   // Not using cupsGetDefault() because it lies about the default printer.
   cups_dest_t* dests;
   int num_dests = GetDests(&dests);
-  cups_dest_t* dest = cupsGetDest(NULL, NULL, num_dests, dests);
+  cups_dest_t* dest = cupsGetDest(nullptr, nullptr, num_dests, dests);
   std::string name = dest ? std::string(dest->name) : std::string();
   cupsFreeDests(num_dests, dests);
   return name;
 }
 
+bool PrintBackendCUPS::GetPrinterBasicInfo(const std::string& printer_name,
+                                           PrinterBasicInfo* printer_info) {
+  cups_dest_t* dest = GetNamedDest(printer_name);
+  if (!dest)
+    return false;
+
+  DCHECK_EQ(printer_name, dest->name);
+  bool ret = PrinterBasicInfoFromCUPS(*dest, printer_info);
+  cupsFreeDests(1, dest);
+  return ret;
+}
+
 bool PrintBackendCUPS::GetPrinterSemanticCapsAndDefaults(
     const std::string& printer_name,
     PrinterSemanticCapsAndDefaults* printer_info) {
@@ -155,8 +179,7 @@
     PrinterCapsAndDefaults* printer_info) {
   DCHECK(printer_info);
 
-  VLOG(1) << "CUPS: Getting caps and defaults"
-          << ", printer name: " << printer_name;
+  VLOG(1) << "CUPS: Getting caps and defaults, printer name: " << printer_name;
 
   base::FilePath ppd_path(GetPPD(printer_name.c_str()));
   // In some cases CUPS failed to get ppd file.
@@ -183,36 +206,28 @@
 
 std::string PrintBackendCUPS::GetPrinterDriverInfo(
     const std::string& printer_name) {
-  cups_dest_t* destinations = NULL;
-  int num_dests = GetDests(&destinations);
   std::string result;
-  for (int printer_index = 0; printer_index < num_dests; ++printer_index) {
-    const cups_dest_t& printer = destinations[printer_index];
-    if (printer_name == printer.name) {
-      const char* info = cupsGetOption(kCUPSPrinterMakeModelOpt,
-                                       printer.num_options,
-                                       printer.options);
-      if (info)
-        result = *info;
-    }
-  }
 
-  cupsFreeDests(num_dests, destinations);
+  cups_dest_t* dest = GetNamedDest(printer_name);
+  if (!dest)
+    return result;
+
+  DCHECK_EQ(printer_name, dest->name);
+  const char* info =
+      cupsGetOption(kCUPSPrinterMakeModelOpt, dest->num_options, dest->options);
+  if (info)
+    result = *info;
+  cupsFreeDests(1, dest);
   return result;
 }
 
 bool PrintBackendCUPS::IsValidPrinter(const std::string& printer_name) {
-  // This is not very efficient way to get specific printer info. CUPS 1.4
-  // supports cupsGetNamedDest() function. However, CUPS 1.4 is not available
-  // everywhere (for example, it supported from Mac OS 10.6 only).
-  PrinterList printer_list;
-  EnumeratePrinters(&printer_list);
+  cups_dest_t* dest = GetNamedDest(printer_name);
+  if (!dest)
+    return false;
 
-  PrinterList::iterator it;
-  for (it = printer_list.begin(); it != printer_list.end(); ++it)
-    if (it->printer_name == printer_name)
-      return true;
-  return false;
+  cupsFreeDests(1, dest);
+  return true;
 }
 
 scoped_refptr<PrintBackend> PrintBackend::CreateInstance(
@@ -256,7 +271,7 @@
   CR_DEFINE_STATIC_LOCAL(base::Lock, ppd_lock, ());
   base::AutoLock ppd_autolock(ppd_lock);
   base::FilePath ppd_path;
-  const char* ppd_file_path = NULL;
+  const char* ppd_file_path = nullptr;
   if (print_server_url_.is_empty()) {  // Use default (local) print server.
     ppd_file_path = cupsGetPPD(name);
     if (ppd_file_path)
@@ -288,8 +303,7 @@
       ipp_status_t error_code = cupsLastError();
       int http_error = httpError(http.http());
       if (error_code > IPP_OK_EVENTS_COMPLETE || http_error != 0) {
-        LOG(ERROR) << "Error downloading PPD file"
-                   << ", name: " << name
+        LOG(ERROR) << "Error downloading PPD file, name: " << name
                    << ", CUPS error: " << static_cast<int>(error_code)
                    << ", HTTP error: " << http_error;
         base::DeleteFile(ppd_path, false);
@@ -300,4 +314,14 @@
   return ppd_path;
 }
 
+cups_dest_t* PrintBackendCUPS::GetNamedDest(const std::string& printer_name) {
+  // Use default (local) print server.
+  if (print_server_url_.is_empty())
+    return cupsGetNamedDest(CUPS_HTTP_DEFAULT, printer_name.c_str(), nullptr);
+
+  HttpConnectionCUPS http(print_server_url_, cups_encryption_);
+  http.SetBlocking(blocking_);
+  return cupsGetNamedDest(http.http(), printer_name.c_str(), nullptr);
+}
+
 }  // namespace printing
diff --git a/printing/backend/print_backend_dummy.cc b/printing/backend/print_backend_dummy.cc
index 43ede892..e4cde2d 100644
--- a/printing/backend/print_backend_dummy.cc
+++ b/printing/backend/print_backend_dummy.cc
@@ -27,6 +27,11 @@
     return std::string();
   }
 
+  bool GetPrinterBasicInfo(const std::string& printer_name,
+                           PrinterBasicInfo* printer_info) override {
+    return false;
+  }
+
   bool GetPrinterSemanticCapsAndDefaults(
       const std::string& printer_name,
       PrinterSemanticCapsAndDefaults* printer_info) override {
diff --git a/printing/backend/print_backend_win.cc b/printing/backend/print_backend_win.cc
index b2e7e2b..b248a8a2 100644
--- a/printing/backend/print_backend_win.cc
+++ b/printing/backend/print_backend_win.cc
@@ -162,6 +162,8 @@
   // PrintBackend implementation.
   bool EnumeratePrinters(PrinterList* printer_list) override;
   std::string GetDefaultPrinterName() override;
+  bool GetPrinterBasicInfo(const std::string& printer_name,
+                           PrinterBasicInfo* printer_info) override;
   bool GetPrinterSemanticCapsAndDefaults(
       const std::string& printer_name,
       PrinterSemanticCapsAndDefaults* printer_info) override;
@@ -181,17 +183,17 @@
   DWORD bytes_needed = 0;
   DWORD count_returned = 0;
   const DWORD kLevel = 4;
-  BOOL ret = EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS, NULL,
-                          kLevel, NULL, 0, &bytes_needed, &count_returned);
+  EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, nullptr, kLevel,
+               nullptr, 0, &bytes_needed, &count_returned);
   if (!bytes_needed)
     return false;
   std::unique_ptr<BYTE[]> printer_info_buffer(new BYTE[bytes_needed]);
-  ret = EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS, NULL, kLevel,
-                     printer_info_buffer.get(), bytes_needed, &bytes_needed,
-                     &count_returned);
-  DCHECK(ret);
-  if (!ret)
+  if (!EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, nullptr,
+                    kLevel, printer_info_buffer.get(), bytes_needed,
+                    &bytes_needed, &count_returned)) {
+    NOTREACHED();
     return false;
+  }
 
   std::string default_printer = GetDefaultPrinterName();
   PRINTER_INFO_4* printer_info =
@@ -211,9 +213,24 @@
 std::string PrintBackendWin::GetDefaultPrinterName() {
   DWORD size = MAX_PATH;
   TCHAR default_printer_name[MAX_PATH];
-  if (!::GetDefaultPrinter(default_printer_name, &size))
-    return std::string();
-  return base::WideToUTF8(default_printer_name);
+  std::string ret;
+  if (::GetDefaultPrinter(default_printer_name, &size))
+    ret = base::WideToUTF8(default_printer_name);
+  return ret;
+}
+
+bool PrintBackendWin::GetPrinterBasicInfo(const std::string& printer_name,
+                                          PrinterBasicInfo* printer_info) {
+  ScopedPrinterHandle printer_handle;
+  if (!printer_handle.OpenPrinter(base::UTF8ToWide(printer_name).c_str()))
+    return false;
+
+  if (!InitBasicPrinterInfo(printer_handle.Get(), printer_info))
+    return false;
+
+  std::string default_printer = GetDefaultPrinterName();
+  printer_info->is_default = (printer_info->printer_name == default_printer);
+  return true;
 }
 
 bool PrintBackendWin::GetPrinterSemanticCapsAndDefaults(
diff --git a/remoting/host/linux/certificate_watcher.cc b/remoting/host/linux/certificate_watcher.cc
index 4340667..1f5c661 100644
--- a/remoting/host/linux/certificate_watcher.cc
+++ b/remoting/host/linux/certificate_watcher.cc
@@ -6,28 +6,172 @@
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/files/file_util.h"
+#include "base/hash.h"
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/path_service.h"
+#include "base/threading/thread_checker.h"
 #include "base/threading/thread_task_runner_handle.h"
 
 namespace remoting {
 
-// Delay time to restart the host when a change of certificate is detected.
-// This is to avoid repeating restarts when continuous writes to the database
-// occur.
-const int kRestartDelayInSecond = 2;
+namespace {
+
+// Delay before re-reading the cert DB when a change is detected.
+const int kReadDelayInSeconds = 2;
 
 // Full Path: $HOME/.pki/nssdb
 const char kCertDirectoryPath[] = ".pki/nssdb";
 
+const char* const kCertFiles[] = {"cert9.db", "key4.db", "pkcs11.txt"};
+
+}  // namespace
+
+// This class lives on the IO thread, watches the certificate database files,
+// and notifies the caller_task_runner thread of any updates.
+class CertDbContentWatcher {
+ public:
+  CertDbContentWatcher(
+      base::WeakPtr<CertificateWatcher> watcher,
+      scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
+      base::FilePath cert_watch_path,
+      base::TimeDelta read_delay);
+  ~CertDbContentWatcher();
+
+  void StartWatching();
+
+ private:
+  base::ThreadChecker thread_checker_;
+
+  // size_t is the return type of base::HashInts() which is used to accumulate
+  // a hash-code while iterating over the database files.
+  typedef size_t HashValue;
+
+  // Called by the FileWatcher when it detects any changes.
+  void OnCertDirectoryChanged(const base::FilePath& path, bool error);
+
+  // Called by |read_timer_| to trigger re-reading the DB content.
+  void OnTimer();
+
+  // Reads the certificate database files and returns a hash of their contents.
+  HashValue ComputeHash();
+
+  base::WeakPtr<CertificateWatcher> watcher_;
+
+  // The TaskRunner to be notified of any changes.
+  scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner_;
+
+  // The file watcher to watch changes inside the certificate folder.
+  std::unique_ptr<base::FilePathWatcher> file_watcher_;
+
+  // Path of the certificate files/directories.
+  base::FilePath cert_watch_path_;
+
+  // Timer to delay reading the DB files after a change notification from the
+  // FileWatcher. This is done to avoid triggering multiple notifications when
+  // the DB is written to. It also avoids a false notification in case the NSS
+  // DB content is quickly changed and reverted.
+  std::unique_ptr<base::DelayTimer> read_timer_;
+
+  // The time to wait before re-reading the DB files after a change is
+  // detected.
+  base::TimeDelta delay_;
+
+  // The hash code of the current certificate database contents. When the
+  // FileWatcher detects changes, the code is re-computed and compared with
+  // this stored value.
+  HashValue current_hash_;
+
+  DISALLOW_COPY_AND_ASSIGN(CertDbContentWatcher);
+};
+
+CertDbContentWatcher::CertDbContentWatcher(
+    base::WeakPtr<CertificateWatcher> watcher,
+    scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
+    base::FilePath cert_watch_path,
+    base::TimeDelta read_delay)
+    : watcher_(watcher),
+      caller_task_runner_(caller_task_runner),
+      cert_watch_path_(cert_watch_path),
+      delay_(read_delay) {
+  thread_checker_.DetachFromThread();
+}
+
+CertDbContentWatcher::~CertDbContentWatcher() {}
+
+void CertDbContentWatcher::StartWatching() {
+  DCHECK(!cert_watch_path_.empty());
+  DCHECK(thread_checker_.CalledOnValidThread());
+
+  file_watcher_.reset(new base::FilePathWatcher());
+
+  // Initialize hash value.
+  current_hash_ = ComputeHash();
+
+  // base::Unretained() is safe since this class owns the FileWatcher.
+  file_watcher_->Watch(cert_watch_path_, true,
+                       base::Bind(&CertDbContentWatcher::OnCertDirectoryChanged,
+                                  base::Unretained(this)));
+
+  read_timer_.reset(new base::DelayTimer(FROM_HERE, delay_, this,
+                                         &CertDbContentWatcher::OnTimer));
+}
+
+void CertDbContentWatcher::OnCertDirectoryChanged(const base::FilePath& path,
+                                                  bool error) {
+  DCHECK(path == cert_watch_path_);
+  DCHECK(thread_checker_.CalledOnValidThread());
+
+  if (error) {
+    LOG(FATAL) << "Error occurred while watching for changes of file: "
+               << cert_watch_path_.MaybeAsASCII();
+  }
+
+  read_timer_->Reset();
+}
+
+void CertDbContentWatcher::OnTimer() {
+  DCHECK(thread_checker_.CalledOnValidThread());
+
+  HashValue new_hash = ComputeHash();
+  if (new_hash != current_hash_) {
+    current_hash_ = new_hash;
+    caller_task_runner_->PostTask(
+        FROM_HERE, base::Bind(&CertificateWatcher::DatabaseChanged, watcher_));
+  } else {
+    VLOG(1) << "Directory changed but contents are the same.";
+  }
+}
+
+CertDbContentWatcher::HashValue CertDbContentWatcher::ComputeHash() {
+  DCHECK(thread_checker_.CalledOnValidThread());
+
+  HashValue result = 0;
+
+  for (const char* file : kCertFiles) {
+    base::FilePath path = cert_watch_path_.AppendASCII(file);
+    std::string content;
+    HashValue file_hash = 0;
+
+    // It's possible the file might not exist. Compute the overall hash in a
+    // consistent way for the set of files that do exist. If a new file comes
+    // into existence, the resulting hash-code should change.
+    if (base::ReadFileToString(path, &content)) {
+      file_hash = base::Hash(content);
+    }
+    result = base::HashInts(result, file_hash);
+  }
+  return result;
+}
+
 CertificateWatcher::CertificateWatcher(
     const base::Closure& restart_action,
     scoped_refptr<base::SingleThreadTaskRunner> io_task_runner)
     : restart_action_(restart_action),
       caller_task_runner_(base::ThreadTaskRunnerHandle::Get()),
       io_task_runner_(io_task_runner),
-      delay_(base::TimeDelta::FromSeconds(kRestartDelayInSecond)),
+      delay_(base::TimeDelta::FromSeconds(kReadDelayInSeconds)),
       weak_factory_(this) {
   if (!base::PathService::Get(base::DIR_HOME, &cert_watch_path_)) {
     LOG(FATAL) << "Failed to get path of the home directory.";
@@ -44,7 +188,7 @@
   if (monitor_) {
     monitor_->RemoveStatusObserver(this);
   }
-  io_task_runner_->DeleteSoon(FROM_HERE, file_watcher_.release());
+  io_task_runner_->DeleteSoon(FROM_HERE, content_watcher_.release());
 
   VLOG(1) << "Stopped watching certificate changes.";
 }
@@ -53,15 +197,13 @@
   DCHECK(caller_task_runner_->BelongsToCurrentThread());
   DCHECK(!cert_watch_path_.empty());
 
-  file_watcher_.reset(new base::FilePathWatcher());
+  content_watcher_.reset(new CertDbContentWatcher(weak_factory_.GetWeakPtr(),
+                                                  caller_task_runner_,
+                                                  cert_watch_path_, delay_));
+
   io_task_runner_->PostTask(
-      FROM_HERE,
-      base::Bind(base::IgnoreResult(&base::FilePathWatcher::Watch),
-                 base::Unretained(file_watcher_.get()), cert_watch_path_, true,
-                 base::Bind(&CertificateWatcher::OnCertDirectoryChanged,
-                            caller_task_runner_, weak_factory_.GetWeakPtr())));
-  restart_timer_.reset(new base::DelayTimer(FROM_HERE, delay_, this,
-                                            &CertificateWatcher::OnTimer));
+      FROM_HERE, base::Bind(&CertDbContentWatcher::StartWatching,
+                            base::Unretained(content_watcher_.get())));
 
   VLOG(1) << "Started watching certificate changes.";
 }
@@ -103,34 +245,10 @@
 }
 
 bool CertificateWatcher::is_started() const {
-  return file_watcher_ != nullptr;
+  return content_watcher_ != nullptr;
 }
 
-// static
-void CertificateWatcher::OnCertDirectoryChanged(
-    scoped_refptr<base::SingleThreadTaskRunner> network_task_runner,
-    base::WeakPtr<CertificateWatcher> watcher_,
-    const base::FilePath& path,
-    bool error) {
-  network_task_runner->PostTask(
-      FROM_HERE,
-      base::Bind(&CertificateWatcher::DirectoryChanged, watcher_, path, error));
-}
-
-void CertificateWatcher::DirectoryChanged(const base::FilePath& path,
-                                          bool error) {
-  DCHECK(caller_task_runner_->BelongsToCurrentThread());
-  DCHECK(path == cert_watch_path_);
-
-  if (error) {
-    LOG(FATAL) << "Error occurs when watching changes of file "
-               << cert_watch_path_.MaybeAsASCII();
-  }
-
-  restart_timer_->Reset();
-}
-
-void CertificateWatcher::OnTimer() {
+void CertificateWatcher::DatabaseChanged() {
   DCHECK(caller_task_runner_->BelongsToCurrentThread());
 
   if (inhibit_mode_) {
diff --git a/remoting/host/linux/certificate_watcher.h b/remoting/host/linux/certificate_watcher.h
index 5dee61d..65938e0 100644
--- a/remoting/host/linux/certificate_watcher.h
+++ b/remoting/host/linux/certificate_watcher.h
@@ -17,6 +17,8 @@
 
 namespace remoting {
 
+class CertDbContentWatcher;
+
 // This class watches the cert database and notifies the host to restart when
 // a change of the database is detected. The runner script will restart the host
 // when the host is killed then the new host will capture any new changes of the
@@ -56,21 +58,14 @@
   void SetWatchPathForTests(const base::FilePath& watch_path);
 
  private:
+  friend class CertDbContentWatcher;
+
   // Returns true if the watcher has started.
   bool is_started() const;
 
-  // Callback passed to |file_watcher_|. Runs in IO thread.
-  static void OnCertDirectoryChanged(
-      scoped_refptr<base::SingleThreadTaskRunner> network_task_runner,
-      base::WeakPtr<CertificateWatcher> watcher_, const base::FilePath& path,
-      bool error);
-
-  // Runs in the caller's thread.
-  void DirectoryChanged(const base::FilePath& path, bool error);
-
-  // Called by |restart_timer_| when it's time to reset the host.
-  // It will defer restart if |inhibit_restart_scheduled_| flag is set to true.
-  void OnTimer();
+  // Runs in the caller's thread. It will defer restarting the host if
+  // |inhibit_restart_scheduled_| flag is set to true.
+  void DatabaseChanged();
 
   // Reference to the monitor
   base::WeakPtr<HostStatusMonitor> monitor_;
@@ -91,15 +86,13 @@
   // Path of the certificate files/directories.
   base::FilePath cert_watch_path_;
 
-  // The file watcher to watch changes inside the certificate folder.
-  std::unique_ptr<base::FilePathWatcher> file_watcher_;
+  // The watcher implementation that watches the files on the IO thread.
+  std::unique_ptr<CertDbContentWatcher> content_watcher_;
 
-  // The time to wait to restart when it is scheduled.
+  // The time to wait before re-reading the DB files after a change is
+  // detected.
   base::TimeDelta delay_;
 
-  // Timer to delay the restart action.
-  std::unique_ptr<base::DelayTimer> restart_timer_;
-
   base::WeakPtrFactory<CertificateWatcher> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(CertificateWatcher);
diff --git a/remoting/host/linux/certificate_watcher_unittest.cc b/remoting/host/linux/certificate_watcher_unittest.cc
index 97c3b2ae..62c9821 100644
--- a/remoting/host/linux/certificate_watcher_unittest.cc
+++ b/remoting/host/linux/certificate_watcher_unittest.cc
@@ -16,21 +16,23 @@
 
 namespace remoting {
 
-const char kWatchFileName[] = "testfile.txt";
+const char kCertFileName[] = "cert9.db";
+const char kKeyFileName[] = "key4.db";
+const char kPKCSFileName[] = "pkcs11.txt";
+const char kOtherFileName[] = "testfile.txt";
 
 const int kMessageLoopWaitMsecs = 150;
 
 class CertificateWatcherTest : public testing::Test {
  public:
-  CertificateWatcherTest()
-      : task_runner_(message_loop_.task_runner()),
-        watch_path_(CreateAndGetUniqueTempDir().AppendASCII(kWatchFileName)) {
+  CertificateWatcherTest() : task_runner_(message_loop_.task_runner()) {
+    EXPECT_TRUE(temp_dir_.CreateUniqueTempDir());
     watcher_.reset(new CertificateWatcher(
         base::Bind(&CertificateWatcherTest::OnRestart,
         base::Unretained(this)),
         task_runner_));
     watcher_->SetDelayForTests(base::TimeDelta::FromSeconds(0));
-    watcher_->SetWatchPathForTests(watch_path_);
+    watcher_->SetWatchPathForTests(temp_dir_.path());
   }
 
   ~CertificateWatcherTest() override {
@@ -74,23 +76,28 @@
                    base::Unretained(watcher_.get()), ""));
   }
 
-  void TouchFile() {
-    task_runner_->PostTask(
-              FROM_HERE, base::Bind(&CertificateWatcherTest::TouchFileTask,
-                                    base::Unretained(this)));
+  void TouchFile(const char* filename) {
+    task_runner_->PostTask(FROM_HERE,
+                           base::Bind(&CertificateWatcherTest::TouchFileTask,
+                                      base::Unretained(this), filename));
   }
 
-  void TouchFileTask() {
+  void TouchFileTask(const char* filename) {
     std::string testWriteString = std::to_string(rand());
+    base::FilePath path = temp_dir_.path().AppendASCII(filename);
 
-    base::WriteFile(watch_path_, testWriteString.c_str(),
-                    testWriteString.length());
+    if (base::PathExists(path)) {
+      EXPECT_TRUE(base::AppendToFile(path, testWriteString.c_str(),
+                                     testWriteString.length()));
+    } else {
+      EXPECT_TRUE(base::WriteFile(path, testWriteString.c_str(),
+                                  testWriteString.length()));
+    }
   }
 
   base::MessageLoopForIO message_loop_;
   scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
   base::ScopedTempDir temp_dir_;
-  base::FilePath watch_path_;
   std::unique_ptr<CertificateWatcher> watcher_;
   int restart_count_ = 0;
   base::TimeDelta loop_wait_ =
@@ -98,11 +105,6 @@
   base::Closure quit_loop_closure_;
 
  private:
-  const base::FilePath& CreateAndGetUniqueTempDir() {
-    EXPECT_TRUE(temp_dir_.CreateUniqueTempDir());
-    return temp_dir_.path();
-  }
-
   void OnRestart() {
     restart_count_++;
     quit_loop_closure_.Run();
@@ -113,7 +115,17 @@
   EXPECT_EQ(0, restart_count_);
   Start();
   EXPECT_EQ(0, restart_count_);
-  TouchFile();
+  TouchFile(kCertFileName);
+  RunLoop();
+  EXPECT_EQ(1, restart_count_);
+}
+
+TEST_F(CertificateWatcherTest, OneTouchAppend) {
+  EXPECT_EQ(0, restart_count_);
+  TouchFileTask(kKeyFileName);
+  Start();
+  EXPECT_EQ(0, restart_count_);
+  TouchFile(kKeyFileName);  // Appends to existing file.
   RunLoop();
   EXPECT_EQ(1, restart_count_);
 }
@@ -123,7 +135,7 @@
   EXPECT_EQ(0, restart_count_);
   Connect();
   EXPECT_EQ(0, restart_count_);
-  TouchFile();
+  TouchFile(kPKCSFileName);
   RunAndWait();
   EXPECT_EQ(0, restart_count_);
   Disconnect();
@@ -139,9 +151,20 @@
   Disconnect();
   RunAndWait();
   EXPECT_EQ(0, restart_count_);
-  TouchFile();
+  TouchFile(kCertFileName);
   RunLoop();
   EXPECT_EQ(1, restart_count_);
 }
 
+TEST_F(CertificateWatcherTest, TouchOtherFile) {
+  // The watcher should not trigger if changes are made that don't affect the
+  // NSS DB contents.
+  EXPECT_EQ(0, restart_count_);
+  Start();
+  EXPECT_EQ(0, restart_count_);
+  TouchFile(kOtherFileName);
+  RunAndWait();
+  EXPECT_EQ(0, restart_count_);
+}
+
 } // namespace remoting
diff --git a/remoting/host/security_key/gnubby_auth_handler_win.cc b/remoting/host/security_key/gnubby_auth_handler_win.cc
index 49ce705..fa7a0a0 100644
--- a/remoting/host/security_key/gnubby_auth_handler_win.cc
+++ b/remoting/host/security_key/gnubby_auth_handler_win.cc
@@ -10,15 +10,19 @@
 
 #include "base/bind.h"
 #include "base/logging.h"
+#include "base/strings/stringprintf.h"
+#include "base/strings/utf_string_conversions.h"
 #include "base/threading/thread_checker.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
+#include "base/win/win_util.h"
 #include "ipc/ipc_channel.h"
 #include "ipc/ipc_listener.h"
 #include "ipc/ipc_message.h"
 #include "ipc/ipc_message_macros.h"
 #include "remoting/base/logging.h"
 #include "remoting/host/chromoting_messages.h"
+#include "remoting/host/ipc_util.h"
 #include "remoting/host/security_key/remote_security_key_ipc_constants.h"
 #include "remoting/host/security_key/remote_security_key_ipc_server.h"
 
@@ -180,8 +184,21 @@
 void GnubbyAuthHandlerWin::StartIpcServerChannel() {
   DCHECK(thread_checker_.CalledOnValidThread());
 
-  ipc_server_channel_ = IPC::Channel::CreateNamedServer(
-      IPC::ChannelHandle(remoting::GetRemoteSecurityKeyIpcChannelName()), this);
+  // Create a named pipe owned by the current user (the LocalService account
+  // (SID: S-1-5-19) when running in the network process) which is available to
+  // all authenticated users.
+  // presubmit: allow wstring
+  std::wstring user_sid;
+  CHECK(base::win::GetUserSidString(&user_sid));
+  std::string user_sid_utf8 = base::WideToUTF8(user_sid);
+  std::string security_descriptor = base::StringPrintf(
+      "O:%sG:%sD:(A;;GA;;;AU)", user_sid_utf8.c_str(), user_sid_utf8.c_str());
+
+  base::win::ScopedHandle pipe;
+  CHECK(CreateIpcChannel(remoting::GetRemoteSecurityKeyIpcChannelName(),
+                         security_descriptor, &pipe));
+  ipc_server_channel_ =
+      IPC::Channel::CreateNamedServer(IPC::ChannelHandle(pipe.Get()), this);
   CHECK(ipc_server_channel_->Connect());
 }
 
diff --git a/remoting/host/security_key/remote_security_key_ipc_server_impl.cc b/remoting/host/security_key/remote_security_key_ipc_server_impl.cc
index ffbbdc6..a2d75f0 100644
--- a/remoting/host/security_key/remote_security_key_ipc_server_impl.cc
+++ b/remoting/host/security_key/remote_security_key_ipc_server_impl.cc
@@ -17,6 +17,13 @@
 #include "remoting/base/logging.h"
 #include "remoting/host/chromoting_messages.h"
 
+#if defined(OS_WIN)
+#include "base/strings/stringprintf.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/win/win_util.h"
+#include "remoting/host/ipc_util.h"
+#endif  // defined(OS_WIN)
+
 namespace {
 
 // Returns the command code (the first byte of the data) if it exists, or -1 if
@@ -52,13 +59,35 @@
   DCHECK(!ipc_channel_);
   security_key_request_timeout_ = request_timeout;
 
+#if defined(OS_WIN)
+  // Create a named pipe owned by the current user (the LocalService account
+  // (SID: S-1-5-19) when running in the network process) which is available to
+  // all authenticated users.
+  // presubmit: allow wstring
+  std::wstring user_sid;
+  if (!base::win::GetUserSidString(&user_sid)) {
+    return false;
+  }
+  std::string user_sid_utf8 = base::WideToUTF8(user_sid);
+  std::string security_descriptor = base::StringPrintf(
+      "O:%sG:%sD:(A;;GA;;;AU)", user_sid_utf8.c_str(), user_sid_utf8.c_str());
+
+  base::win::ScopedHandle pipe;
+  if (!CreateIpcChannel(channel_name, security_descriptor, &pipe)) {
+    return false;
+  }
+
+  ipc_channel_ =
+      IPC::Channel::CreateNamedServer(IPC::ChannelHandle(pipe.Get()), this);
+#else  // defined(OS_WIN)
   ipc_channel_ =
       IPC::Channel::CreateNamedServer(IPC::ChannelHandle(channel_name), this);
+#endif  // !defined(OS_WIN)
+
   if (!ipc_channel_->Connect()) {
     ipc_channel_.reset();
     return false;
   }
-
   // It is safe to use base::Unretained here as |timer_| will be stopped and
   // this task will be removed when this instance is being destroyed.  All
   // methods must execute on the same thread (due to |thread_Checker_| so
@@ -74,7 +103,7 @@
 
   // Since we have received a response, we update the timer and wait
   // for a subsequent request.
-  timer_.Start(FROM_HERE, initial_connect_timeout_,
+  timer_.Start(FROM_HERE, security_key_request_timeout_,
                base::Bind(&RemoteSecurityKeyIpcServerImpl::OnChannelError,
                           base::Unretained(this)));
 
diff --git a/remoting/host/security_key/remote_security_key_ipc_server_unittest.cc b/remoting/host/security_key/remote_security_key_ipc_server_unittest.cc
index 222335f..d18706f 100644
--- a/remoting/host/security_key/remote_security_key_ipc_server_unittest.cc
+++ b/remoting/host/security_key/remote_security_key_ipc_server_unittest.cc
@@ -332,10 +332,10 @@
   // Create a channel, connect to it via IPC, issue a request, and send
   // a response, but do not close the channel after that.  The connection
   // should be terminated after the initial timeout period has elapsed.
+  base::TimeDelta request_timeout(base::TimeDelta::FromMilliseconds(500));
   std::string channel_name(GetUniqueTestChannelName());
   ASSERT_TRUE(remote_security_key_ipc_server_->CreateChannel(
-      channel_name,
-      /*request_timeout=*/base::TimeDelta::FromMilliseconds(500)));
+      channel_name, request_timeout));
 
   // Create a fake client and connect to the IPC server channel.
   FakeRemoteSecurityKeyIpcClient fake_ipc_client(
@@ -359,7 +359,7 @@
   WaitForOperationComplete();
   base::TimeDelta elapsed_time = base::Time::NowFromSystemTime() - start_time;
 
-  ASSERT_NEAR(elapsed_time.InMilliseconds(), kInitialConnectTimeoutMs,
+  ASSERT_NEAR(elapsed_time.InMilliseconds(), request_timeout.InMilliseconds(),
               kConnectionTimeoutErrorDeltaMs);
 }
 
diff --git a/services/catalog/public/interfaces/OWNERS b/services/catalog/public/interfaces/OWNERS
new file mode 100644
index 0000000..9e621796
--- /dev/null
+++ b/services/catalog/public/interfaces/OWNERS
@@ -0,0 +1,13 @@
+# Changes to Mojo interfaces require a security review to avoid
+# introducing new sandbox escapes.
+per-file *.mojom=set noparent
+per-file *.mojom=dcheng@chromium.org
+per-file *.mojom=inferno@chromium.org
+per-file *.mojom=jln@chromium.org
+per-file *.mojom=jschuh@chromium.org
+per-file *.mojom=kenrb@chromium.org
+per-file *.mojom=mkwst@chromium.org
+per-file *.mojom=nasko@chromium.org
+per-file *.mojom=palmer@chromium.org
+per-file *.mojom=tsepez@chromium.org
+per-file *.mojom=wfh@chromium.org
diff --git a/services/shell/public/interfaces/OWNERS b/services/shell/public/interfaces/OWNERS
new file mode 100644
index 0000000..9e621796
--- /dev/null
+++ b/services/shell/public/interfaces/OWNERS
@@ -0,0 +1,13 @@
+# Changes to Mojo interfaces require a security review to avoid
+# introducing new sandbox escapes.
+per-file *.mojom=set noparent
+per-file *.mojom=dcheng@chromium.org
+per-file *.mojom=inferno@chromium.org
+per-file *.mojom=jln@chromium.org
+per-file *.mojom=jschuh@chromium.org
+per-file *.mojom=kenrb@chromium.org
+per-file *.mojom=mkwst@chromium.org
+per-file *.mojom=nasko@chromium.org
+per-file *.mojom=palmer@chromium.org
+per-file *.mojom=tsepez@chromium.org
+per-file *.mojom=wfh@chromium.org
diff --git a/services/tracing/public/interfaces/OWNERS b/services/tracing/public/interfaces/OWNERS
new file mode 100644
index 0000000..9e621796
--- /dev/null
+++ b/services/tracing/public/interfaces/OWNERS
@@ -0,0 +1,13 @@
+# Changes to Mojo interfaces require a security review to avoid
+# introducing new sandbox escapes.
+per-file *.mojom=set noparent
+per-file *.mojom=dcheng@chromium.org
+per-file *.mojom=inferno@chromium.org
+per-file *.mojom=jln@chromium.org
+per-file *.mojom=jschuh@chromium.org
+per-file *.mojom=kenrb@chromium.org
+per-file *.mojom=mkwst@chromium.org
+per-file *.mojom=nasko@chromium.org
+per-file *.mojom=palmer@chromium.org
+per-file *.mojom=tsepez@chromium.org
+per-file *.mojom=wfh@chromium.org
diff --git a/services/user/public/interfaces/OWNERS b/services/user/public/interfaces/OWNERS
new file mode 100644
index 0000000..9e621796
--- /dev/null
+++ b/services/user/public/interfaces/OWNERS
@@ -0,0 +1,13 @@
+# Changes to Mojo interfaces require a security review to avoid
+# introducing new sandbox escapes.
+per-file *.mojom=set noparent
+per-file *.mojom=dcheng@chromium.org
+per-file *.mojom=inferno@chromium.org
+per-file *.mojom=jln@chromium.org
+per-file *.mojom=jschuh@chromium.org
+per-file *.mojom=kenrb@chromium.org
+per-file *.mojom=mkwst@chromium.org
+per-file *.mojom=nasko@chromium.org
+per-file *.mojom=palmer@chromium.org
+per-file *.mojom=tsepez@chromium.org
+per-file *.mojom=wfh@chromium.org
diff --git a/styleguide/c++/c++11.html b/styleguide/c++/c++11.html
index 8dd13d7a..7999007f 100644
--- a/styleguide/c++/c++11.html
+++ b/styleguide/c++/c++11.html
@@ -260,6 +260,14 @@
 </tr>
 
 <tr>
+<td>Trailing Return Types</td>
+<td><code>auto <i>function declaration</i> -> <i>return_type</i></code></td>
+<td>Allows trailing function return value syntax</td>
+<td><a href="http://en.cppreference.com/w/cpp/language/function">Declaring functions</a></td>
+<td>Use only where it considerably improves readability. <a href="https://groups.google.com/a/chromium.org/forum/#!topic/chromium-dev/OQyYSfH9m2M">Discussion thread</a>. <a href="https://groups.google.com/a/chromium.org/forum/#!topic/cxx/Lkp0nubVd0Q">Another discussion thread.</a></td>
+</tr>
+
+<tr>
 <td>Uniform Initialization Syntax</td>
 <td><code><i>type</i> <i>name</i> {[<i>value</i> ..., <i>value</i>]};</code></td>
 <td>Allows any object of primitive, aggregate or class type to be initialized using brace syntax</td>
@@ -870,14 +878,6 @@
 </tr>
 
 <tr>
-<td>Trailing Return Types</td>
-<td><code>auto <i>function declaration</i> -> <i>return_type</i></code></td>
-<td>Allows trailing function return value syntax</td>
-<td><a href="http://en.cppreference.com/w/cpp/language/function">Declaring functions</a></td>
-<td><a href="https://groups.google.com/a/chromium.org/forum/#!topic/chromium-dev/OQyYSfH9m2M">Discussion thread</a></td>
-</tr>
-
-<tr>
 <td>Type-Generic Math Functions</td>
 <td>Functions within <code>&lt;ctgmath&gt;</code></td>
 <td>Provides a means to call real or complex functions based on the type of arguments</td>
diff --git a/sync/android/java/src/org/chromium/sync/signin/ChromeSigninController.java b/sync/android/java/src/org/chromium/sync/signin/ChromeSigninController.java
index b4bff3e..26a5067 100644
--- a/sync/android/java/src/org/chromium/sync/signin/ChromeSigninController.java
+++ b/sync/android/java/src/org/chromium/sync/signin/ChromeSigninController.java
@@ -8,7 +8,6 @@
 import android.content.Context;
 import android.preference.PreferenceManager;
 
-import org.chromium.base.VisibleForTesting;
 import org.chromium.sync.AndroidSyncSettings;
 
 /**
@@ -18,7 +17,7 @@
 
     public static final String TAG = "ChromeSigninController";
 
-    @VisibleForTesting
+    // Used by ChromeBackupAgent and for testing.
     public static final String SIGNED_IN_ACCOUNT_KEY = "google.services.username";
 
     private static final Object LOCK = new Object();
diff --git a/sync/api/fake_model_type_change_processor.cc b/sync/api/fake_model_type_change_processor.cc
index eebef792..bb477520 100644
--- a/sync/api/fake_model_type_change_processor.cc
+++ b/sync/api/fake_model_type_change_processor.cc
@@ -36,9 +36,11 @@
     MetadataChangeList* metadata_change_list) {}
 
 void FakeModelTypeChangeProcessor::OnMetadataLoaded(
+    syncer::SyncError error,
     std::unique_ptr<MetadataBatch> batch) {}
 
 void FakeModelTypeChangeProcessor::OnSyncStarting(
+    syncer::DataTypeErrorHandler* error_handler,
     const StartCallback& callback) {
   if (!callback.is_null()) {
     callback.Run(syncer::SyncError(), nullptr);
diff --git a/sync/api/fake_model_type_change_processor.h b/sync/api/fake_model_type_change_processor.h
index bea466b7..4d31f4d2 100644
--- a/sync/api/fake_model_type_change_processor.h
+++ b/sync/api/fake_model_type_change_processor.h
@@ -31,8 +31,10 @@
            MetadataChangeList* metadata_change_list) override;
   void Delete(const std::string& client_tag,
               MetadataChangeList* metadata_change_list) override;
-  void OnMetadataLoaded(std::unique_ptr<MetadataBatch> batch) override;
-  void OnSyncStarting(const StartCallback& callback) override;
+  void OnMetadataLoaded(syncer::SyncError error,
+                        std::unique_ptr<MetadataBatch> batch) override;
+  void OnSyncStarting(syncer::DataTypeErrorHandler* error_handler,
+                      const StartCallback& callback) override;
   void DisableSync() override;
 };
 
diff --git a/sync/api/model_type_change_processor.h b/sync/api/model_type_change_processor.h
index 40c1c85..e9347bd 100644
--- a/sync/api/model_type_change_processor.h
+++ b/sync/api/model_type_change_processor.h
@@ -13,6 +13,7 @@
 #include "sync/internal_api/public/activation_context.h"
 
 namespace syncer {
+class DataTypeErrorHandler;
 class SyncError;
 }  // namespace syncer
 
@@ -46,13 +47,17 @@
 
   // Accept the initial sync metadata loaded by the service. This should be
   // called as soon as the metadata is available to the service.
-  virtual void OnMetadataLoaded(std::unique_ptr<MetadataBatch> batch) = 0;
+  virtual void OnMetadataLoaded(syncer::SyncError error,
+                                std::unique_ptr<MetadataBatch> batch) = 0;
 
-  // Called by the DataTypeController to gather additional information needed
-  // before a CommitQueue object can be created for this model type. Once the
-  // metadata has been loaded, the info is collected and given to |callback|.
-  // Once called, this can only be called again if sync is disconnected.
-  virtual void OnSyncStarting(const StartCallback& callback) = 0;
+  // Indicates that sync wants to connect a sync worker to this processor. Once
+  // the processor has metadata from the service, it will pass the info needed
+  // for the worker into |callback|. |error_handler| is how the processor will
+  // inform sync of any unrecoverable errors after calling |callback|, and it is
+  // guaranteed to outlive the processor. StartCallback takes a SyncError and an
+  // ActivationContext; the context should be nullptr iff the error is set.
+  virtual void OnSyncStarting(syncer::DataTypeErrorHandler* error_handler,
+                              const StartCallback& callback) = 0;
 
   // Indicates that sync is being disabled permanently for this data type. All
   // metadata should be erased from storage.
diff --git a/sync/api/model_type_service.cc b/sync/api/model_type_service.cc
index 6104b4c..1e1ea1c 100644
--- a/sync/api/model_type_service.cc
+++ b/sync/api/model_type_service.cc
@@ -5,6 +5,7 @@
 #include "sync/api/model_type_service.h"
 
 #include "sync/api/model_type_change_processor.h"
+#include "sync/internal_api/public/data_type_error_handler.h"
 
 namespace syncer_v2 {
 
@@ -27,9 +28,10 @@
 }
 
 void ModelTypeService::OnSyncStarting(
+    syncer::DataTypeErrorHandler* error_handler,
     const ModelTypeChangeProcessor::StartCallback& start_callback) {
   CreateChangeProcessor();
-  change_processor_->OnSyncStarting(start_callback);
+  change_processor_->OnSyncStarting(error_handler, start_callback);
 }
 
 void ModelTypeService::DisableSync() {
diff --git a/sync/api/model_type_service.h b/sync/api/model_type_service.h
index 728743ca7..a80c84d 100644
--- a/sync/api/model_type_service.h
+++ b/sync/api/model_type_service.h
@@ -18,6 +18,10 @@
 #include "sync/base/sync_export.h"
 #include "sync/internal_api/public/activation_context.h"
 
+namespace syncer {
+class DataTypeErrorHandler;
+}  // namespace syncer
+
 namespace syncer_v2 {
 
 class DataBatch;
@@ -93,9 +97,10 @@
       const EntityData& remote_data) const;
 
   // Called by the DataTypeController to gather additional information needed
-  // before this model type can be connected to a sync worker. Once the
+  // before the processor can be connected to a sync worker. Once the
   // metadata has been loaded, the info is collected and given to |callback|.
-  void OnSyncStarting(const ModelTypeChangeProcessor::StartCallback& callback);
+  void OnSyncStarting(syncer::DataTypeErrorHandler* error_handler,
+                      const ModelTypeChangeProcessor::StartCallback& callback);
 
   // Indicates that we no longer want to do any sync-related things for this
   // data type. Severs all ties to the sync thread, deletes all local sync
diff --git a/sync/api/model_type_service_unittest.cc b/sync/api/model_type_service_unittest.cc
index a594a8d..4c42831 100644
--- a/sync/api/model_type_service_unittest.cc
+++ b/sync/api/model_type_service_unittest.cc
@@ -8,6 +8,7 @@
 #include "base/memory/ptr_util.h"
 #include "sync/api/fake_model_type_change_processor.h"
 #include "sync/api/fake_model_type_service.h"
+#include "sync/internal_api/public/test/data_type_error_handler_mock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace syncer_v2 {
@@ -68,8 +69,9 @@
   ~ModelTypeServiceTest() override {}
 
   void OnSyncStarting() {
-    service_.OnSyncStarting(base::Bind(
-        &ModelTypeServiceTest::OnProcessorStarted, base::Unretained(this)));
+    service_.OnSyncStarting(
+        &error_handler_, base::Bind(&ModelTypeServiceTest::OnProcessorStarted,
+                                    base::Unretained(this)));
   }
 
   bool start_callback_called() const { return start_callback_called_; }
@@ -83,6 +85,7 @@
   }
 
   bool start_callback_called_;
+  syncer::DataTypeErrorHandlerMock error_handler_;
   MockModelTypeService service_;
 };
 
diff --git a/sync/internal_api/model_type_connector_proxy_unittest.cc b/sync/internal_api/model_type_connector_proxy_unittest.cc
index 4295ebf..718cd2f 100644
--- a/sync/internal_api/model_type_connector_proxy_unittest.cc
+++ b/sync/internal_api/model_type_connector_proxy_unittest.cc
@@ -18,6 +18,7 @@
 #include "sync/internal_api/public/base/model_type.h"
 #include "sync/internal_api/public/model_type_connector.h"
 #include "sync/internal_api/public/shared_model_type_processor.h"
+#include "sync/internal_api/public/test/data_type_error_handler_mock.h"
 #include "sync/sessions/model_type_registry.h"
 #include "sync/test/engine/mock_nudge_handler.h"
 #include "sync/test/engine/test_directory_setter_upper.h"
@@ -52,6 +53,7 @@
 
   void OnSyncStarting(SharedModelTypeProcessor* processor) {
     processor->OnSyncStarting(
+        &error_handler_,
         base::Bind(&ModelTypeConnectorProxyTest::OnReadyToConnect,
                    base::Unretained(this)));
   }
@@ -64,7 +66,8 @@
   std::unique_ptr<SharedModelTypeProcessor> CreateModelTypeProcessor() {
     std::unique_ptr<SharedModelTypeProcessor> processor =
         base::WrapUnique(new SharedModelTypeProcessor(syncer::THEMES, this));
-    processor->OnMetadataLoaded(base::WrapUnique(new MetadataBatch()));
+    processor->OnMetadataLoaded(syncer::SyncError(),
+                                base::WrapUnique(new MetadataBatch()));
     return processor;
   }
 
@@ -77,6 +80,7 @@
   syncer::TestDirectorySetterUpper dir_maker_;
   syncer::MockNudgeHandler nudge_handler_;
   std::unique_ptr<syncer::ModelTypeRegistry> registry_;
+  syncer::DataTypeErrorHandlerMock error_handler_;
 
   std::unique_ptr<ModelTypeConnectorProxy> connector_proxy_;
 };
diff --git a/sync/internal_api/public/shared_model_type_processor.h b/sync/internal_api/public/shared_model_type_processor.h
index 7e3dc20f..8655d4a 100644
--- a/sync/internal_api/public/shared_model_type_processor.h
+++ b/sync/internal_api/public/shared_model_type_processor.h
@@ -20,6 +20,7 @@
 #include "sync/api/sync_error.h"
 #include "sync/base/sync_export.h"
 #include "sync/internal_api/public/base/model_type.h"
+#include "sync/internal_api/public/data_type_error_handler.h"
 #include "sync/internal_api/public/model_type_processor.h"
 #include "sync/internal_api/public/non_blocking_sync_common.h"
 #include "sync/protocol/data_type_state.pb.h"
@@ -57,8 +58,10 @@
            MetadataChangeList* metadata_change_list) override;
   void Delete(const std::string& client_tag,
               MetadataChangeList* metadata_change_list) override;
-  void OnMetadataLoaded(std::unique_ptr<MetadataBatch> batch) override;
-  void OnSyncStarting(const StartCallback& callback) override;
+  void OnMetadataLoaded(syncer::SyncError error,
+                        std::unique_ptr<MetadataBatch> batch) override;
+  void OnSyncStarting(syncer::DataTypeErrorHandler* error_handler,
+                      const StartCallback& callback) override;
   void DisableSync() override;
 
   // ModelTypeProcessor implementation.
@@ -135,6 +138,10 @@
   // Stores the start callback in between OnSyncStarting() and ReadyToConnect().
   StartCallback start_callback_;
 
+  // A cache for any error that may occur during startup and should be passed
+  // into the |start_callback_|.
+  syncer::SyncError start_error_;
+
   // Indicates whether the metadata has finished loading.
   bool is_metadata_loaded_;
 
@@ -156,6 +163,10 @@
   // become invalid.
   ModelTypeService* const service_;
 
+  // The object used for informing sync of errors; will be non-null after
+  // OnSyncStarting has been called. This pointer is not owned.
+  syncer::DataTypeErrorHandler* error_handler_;
+
   // WeakPtrFactory for this processor which will be sent to sync thread.
   base::WeakPtrFactory<SharedModelTypeProcessor> weak_ptr_factory_;
 };
diff --git a/sync/internal_api/public/test/data_type_error_handler_mock.h b/sync/internal_api/public/test/data_type_error_handler_mock.h
index eb755a8..83ffbdb0 100644
--- a/sync/internal_api/public/test/data_type_error_handler_mock.h
+++ b/sync/internal_api/public/test/data_type_error_handler_mock.h
@@ -9,19 +9,28 @@
 
 #include "sync/internal_api/public/base/model_type.h"
 #include "sync/internal_api/public/data_type_error_handler.h"
-#include "testing/gmock/include/gmock/gmock.h"
 
 namespace syncer {
 
+// A mock DataTypeErrorHandler for testing. Set the expected error type with
+// ExpectError and OnSingleDataTypeUnrecoverableError will pass. If the error is
+// not called this object's destructor will DCHECK.
 class DataTypeErrorHandlerMock : public DataTypeErrorHandler {
  public:
   DataTypeErrorHandlerMock();
-  virtual ~DataTypeErrorHandlerMock();
-  MOCK_METHOD1(OnSingleDataTypeUnrecoverableError, void(const SyncError&));
-  MOCK_METHOD3(CreateAndUploadError,
-               SyncError(const tracked_objects::Location&,
-                         const std::string&,
-                         ModelType));
+  ~DataTypeErrorHandlerMock() override;
+
+  void OnSingleDataTypeUnrecoverableError(const SyncError& error) override;
+  SyncError CreateAndUploadError(const tracked_objects::Location& location,
+                                 const std::string& message,
+                                 ModelType type) override;
+
+  // Set the |error_type| to expect.
+  void ExpectError(SyncError::ErrorType error_type);
+
+ private:
+  // The error type to expect.
+  SyncError::ErrorType expected_error_type_ = SyncError::UNSET;
 };
 
 }  // namespace syncer
diff --git a/sync/internal_api/shared_model_type_processor.cc b/sync/internal_api/shared_model_type_processor.cc
index f4c2d5f..b2f34d0190 100644
--- a/sync/internal_api/shared_model_type_processor.cc
+++ b/sync/internal_api/shared_model_type_processor.cc
@@ -82,6 +82,7 @@
       is_metadata_loaded_(false),
       is_initial_pending_data_loaded_(false),
       service_(service),
+      error_handler_(nullptr),
       weak_ptr_factory_(this) {
   DCHECK(service);
 }
@@ -97,26 +98,37 @@
 }
 
 void SharedModelTypeProcessor::OnSyncStarting(
+    syncer::DataTypeErrorHandler* error_handler,
     const StartCallback& start_callback) {
   DCHECK(CalledOnValidThread());
   DCHECK(start_callback_.is_null());
   DCHECK(!IsConnected());
+  DCHECK(error_handler);
   DVLOG(1) << "Sync is starting for " << ModelTypeToString(type_);
 
+  error_handler_ = error_handler;
   start_callback_ = start_callback;
   ConnectIfReady();
 }
 
 void SharedModelTypeProcessor::OnMetadataLoaded(
+    syncer::SyncError error,
     std::unique_ptr<MetadataBatch> batch) {
   DCHECK(CalledOnValidThread());
   DCHECK(entities_.empty());
   DCHECK(!is_metadata_loaded_);
   DCHECK(!IsConnected());
 
+  is_metadata_loaded_ = true;
   // Flip this flag here to cover all cases where we don't need to load data.
   is_initial_pending_data_loaded_ = true;
 
+  if (error.IsSet()) {
+    start_error_ = error;
+    ConnectIfReady();
+    return;
+  }
+
   if (batch->GetDataTypeState().initial_sync_done()) {
     EntityMetadataMap metadata_map(batch->TakeAllMetadata());
     std::vector<std::string> entities_to_commit;
@@ -143,7 +155,6 @@
         GetSpecificsFieldNumberFromModelType(type_));
   }
 
-  is_metadata_loaded_ = true;
   ConnectIfReady();
 }
 
@@ -154,14 +165,17 @@
     return;
   }
 
-  std::unique_ptr<ActivationContext> activation_context =
-      base::WrapUnique(new ActivationContext);
-  activation_context->data_type_state = data_type_state_;
-  activation_context->type_processor =
-      base::WrapUnique(new ModelTypeProcessorProxy(
-          weak_ptr_factory_.GetWeakPtr(), base::ThreadTaskRunnerHandle::Get()));
+  std::unique_ptr<ActivationContext> activation_context;
 
-  start_callback_.Run(syncer::SyncError(), std::move(activation_context));
+  if (!start_error_.IsSet()) {
+    activation_context = base::WrapUnique(new ActivationContext);
+    activation_context->data_type_state = data_type_state_;
+    activation_context->type_processor = base::WrapUnique(
+        new ModelTypeProcessorProxy(weak_ptr_factory_.GetWeakPtr(),
+                                    base::ThreadTaskRunnerHandle::Get()));
+  }
+
+  start_callback_.Run(start_error_, std::move(activation_context));
   start_callback_.Reset();
 }
 
@@ -326,8 +340,11 @@
     }
   }
 
-  // TODO(stanisc): crbug.com/570085: Error handling.
-  service_->ApplySyncChanges(std::move(change_list), EntityChangeList());
+  syncer::SyncError error =
+      service_->ApplySyncChanges(std::move(change_list), EntityChangeList());
+  if (error.IsSet()) {
+    error_handler_->OnSingleDataTypeUnrecoverableError(error);
+  }
 }
 
 void SharedModelTypeProcessor::OnUpdateReceived(
@@ -379,11 +396,15 @@
   }
 
   // Inform the service of the new or updated data.
-  // TODO(stanisc): crbug.com/570085: Error handling.
-  service_->ApplySyncChanges(std::move(metadata_changes), entity_changes);
+  syncer::SyncError error =
+      service_->ApplySyncChanges(std::move(metadata_changes), entity_changes);
 
-  // There may be new reasons to commit by the time this function is done.
-  FlushPendingCommitRequests();
+  if (error.IsSet()) {
+    error_handler_->OnSingleDataTypeUnrecoverableError(error);
+  } else {
+    // There may be new reasons to commit by the time this function is done.
+    FlushPendingCommitRequests();
+  }
 }
 
 ProcessorEntityTracker* SharedModelTypeProcessor::ProcessUpdate(
@@ -567,18 +588,28 @@
   }
 
   // Let the service handle associating and merging the data.
-  // TODO(stanisc): crbug.com/570085: Error handling.
-  service_->MergeSyncData(std::move(metadata_changes), data_map);
+  syncer::SyncError error =
+      service_->MergeSyncData(std::move(metadata_changes), data_map);
 
-  // We may have new reasons to commit by the time this function is done.
-  FlushPendingCommitRequests();
+  if (error.IsSet()) {
+    error_handler_->OnSingleDataTypeUnrecoverableError(error);
+  } else {
+    // We may have new reasons to commit by the time this function is done.
+    FlushPendingCommitRequests();
+  }
 }
 
 void SharedModelTypeProcessor::OnInitialPendingDataLoaded(
     syncer::SyncError error,
     std::unique_ptr<DataBatch> data_batch) {
   DCHECK(!is_initial_pending_data_loaded_);
-  ConsumeDataBatch(std::move(data_batch));
+
+  if (error.IsSet()) {
+    start_error_ = error;
+  } else {
+    ConsumeDataBatch(std::move(data_batch));
+  }
+
   is_initial_pending_data_loaded_ = true;
   ConnectIfReady();
 }
@@ -587,6 +618,12 @@
     syncer::SyncError error,
     std::unique_ptr<DataBatch> data_batch) {
   DCHECK(is_initial_pending_data_loaded_);
+
+  if (error.IsSet()) {
+    error_handler_->OnSingleDataTypeUnrecoverableError(error);
+    return;
+  }
+
   ConsumeDataBatch(std::move(data_batch));
   FlushPendingCommitRequests();
 }
diff --git a/sync/internal_api/shared_model_type_processor_unittest.cc b/sync/internal_api/shared_model_type_processor_unittest.cc
index 15060ec..cda505a1 100644
--- a/sync/internal_api/shared_model_type_processor_unittest.cc
+++ b/sync/internal_api/shared_model_type_processor_unittest.cc
@@ -22,6 +22,7 @@
 #include "sync/internal_api/public/data_batch_impl.h"
 #include "sync/internal_api/public/non_blocking_sync_common.h"
 #include "sync/internal_api/public/simple_metadata_change_list.h"
+#include "sync/internal_api/public/test/data_type_error_handler_mock.h"
 #include "sync/protocol/data_type_state.pb.h"
 #include "sync/protocol/sync.pb.h"
 #include "sync/syncable/syncable_util.h"
@@ -75,6 +76,11 @@
   return new_data;
 }
 
+syncer::SyncError CreateSyncError(syncer::SyncError::ErrorType error_type) {
+  return syncer::SyncError(FROM_HERE, error_type, "TestError",
+                           syncer::PREFERENCES);
+}
+
 // A basic in-memory storage mechanism for data and metadata. This makes it
 // easier to test more complex behaviors involving when entities are written,
 // committed, etc. Having a separate class helps keep the main one cleaner.
@@ -188,9 +194,7 @@
       : FakeModelTypeService(
             base::Bind(&SharedModelTypeProcessor::CreateAsChangeProcessor)) {}
 
-  ~SharedModelTypeProcessorTest() override {
-    DCHECK(data_callback_.is_null());
-  }
+  ~SharedModelTypeProcessorTest() override { CheckPostConditions(); }
 
   void InitializeToMetadataLoaded() {
     CreateChangeProcessor();
@@ -210,7 +214,8 @@
   }
 
   void OnMetadataLoaded() {
-    type_processor()->OnMetadataLoaded(db_.CreateMetadataBatch());
+    type_processor()->OnMetadataLoaded(syncer::SyncError(),
+                                       db_.CreateMetadataBatch());
   }
 
   void OnPendingCommitDataLoaded() {
@@ -221,6 +226,7 @@
 
   void OnSyncStarting() {
     type_processor()->OnSyncStarting(
+        &error_handler_,
         base::Bind(&SharedModelTypeProcessorTest::OnReadyToConnect,
                    base::Unretained(this)));
   }
@@ -269,7 +275,7 @@
     clear_change_processor();
     db_.Reset();
     worker_ = nullptr;
-    DCHECK(data_callback_.is_null());
+    CheckPostConditions();
   }
 
   // Wipes existing DB and simulates a pending update of a server-known item.
@@ -328,6 +334,19 @@
     conflict_resolution_.reset(new ConflictResolution(std::move(resolution)));
   }
 
+  // Sets the error that the next fallible call to the service will generate.
+  void SetServiceError(syncer::SyncError::ErrorType error_type) {
+    DCHECK(!service_error_.IsSet());
+    service_error_ = CreateSyncError(error_type);
+  }
+
+  // Sets the error type that OnReadyToConnect (our StartCallback) expects to
+  // receive.
+  void ExpectStartError(syncer::SyncError::ErrorType error_type) {
+    DCHECK(expected_start_error_ == syncer::SyncError::UNSET);
+    expected_start_error_ = error_type;
+  }
+
   const SimpleStore& db() const { return db_; }
 
   MockModelTypeWorker* worker() { return worker_; }
@@ -336,9 +355,25 @@
     return static_cast<SharedModelTypeProcessor*>(change_processor());
   }
 
+  syncer::DataTypeErrorHandlerMock* error_handler() { return &error_handler_; }
+
  private:
+  void CheckPostConditions() {
+    DCHECK(data_callback_.is_null());
+    DCHECK(!service_error_.IsSet());
+    DCHECK_EQ(syncer::SyncError::UNSET, expected_start_error_);
+  }
+
   void OnReadyToConnect(syncer::SyncError error,
                         std::unique_ptr<ActivationContext> context) {
+    if (expected_start_error_ != syncer::SyncError::UNSET) {
+      EXPECT_TRUE(error.IsSet());
+      EXPECT_EQ(expected_start_error_, error.error_type());
+      EXPECT_EQ(nullptr, context);
+      expected_start_error_ = syncer::SyncError::UNSET;
+      return;
+    }
+
     std::unique_ptr<MockModelTypeWorker> worker(
         new MockModelTypeWorker(context->data_type_state, type_processor()));
     // Keep an unsafe pointer to the commit queue the processor will use.
@@ -363,6 +398,11 @@
   syncer::SyncError MergeSyncData(
       std::unique_ptr<MetadataChangeList> metadata_changes,
       EntityDataMap data_map) override {
+    if (service_error_.IsSet()) {
+      syncer::SyncError error = service_error_;
+      service_error_ = syncer::SyncError();
+      return error;
+    }
     // Commit any local entities that aren't being overwritten by the server.
     const auto& local_data = db_.GetAllData();
     for (auto it = local_data.begin(); it != local_data.end(); it++) {
@@ -382,6 +422,11 @@
   syncer::SyncError ApplySyncChanges(
       std::unique_ptr<MetadataChangeList> metadata_changes,
       EntityChangeList entity_changes) override {
+    if (service_error_.IsSet()) {
+      syncer::SyncError error = service_error_;
+      service_error_ = syncer::SyncError();
+      return error;
+    }
     for (const EntityChange& change : entity_changes) {
       switch (change.type()) {
         case EntityChange::ACTION_ADD:
@@ -435,6 +480,11 @@
   }
 
   void GetData(ClientTagList tags, DataCallback callback) override {
+    if (service_error_.IsSet()) {
+      data_callback_ = base::Bind(callback, service_error_, nullptr);
+      service_error_ = syncer::SyncError();
+      return;
+    }
     std::unique_ptr<DataBatchImpl> batch(new DataBatchImpl());
     for (const std::string& tag : tags) {
       DCHECK(db_.HasData(tag)) << "No data for " << tag;
@@ -465,6 +515,15 @@
 
   // Contains all of the data and metadata state for these tests.
   SimpleStore db_;
+
+  // The processor's error handler.
+  syncer::DataTypeErrorHandlerMock error_handler_;
+
+  // The error to produce on the next service call.
+  syncer::SyncError service_error_;
+
+  // The error to expect in OnReadyToConnect().
+  syncer::SyncError::ErrorType expected_start_error_ = syncer::SyncError::UNSET;
 };
 
 // Test that an initial sync handles local and remote items properly.
@@ -495,6 +554,42 @@
   worker()->ExpectPendingCommits({kTag1});
 }
 
+// Test that an error during the merge is propagated to the error handler.
+TEST_F(SharedModelTypeProcessorTest, InitialSyncError) {
+  CreateChangeProcessor();
+  OnMetadataLoaded();
+  OnSyncStarting();
+
+  SetServiceError(syncer::SyncError::DATATYPE_ERROR);
+  error_handler()->ExpectError(syncer::SyncError::DATATYPE_ERROR);
+  OnInitialSyncDone();
+}
+
+// Test that errors before it's called are passed to |start_callback| correctly.
+TEST_F(SharedModelTypeProcessorTest, StartErrors) {
+  CreateChangeProcessor();
+  type_processor()->OnMetadataLoaded(
+      CreateSyncError(syncer::SyncError::DATATYPE_ERROR), nullptr);
+  ExpectStartError(syncer::SyncError::DATATYPE_ERROR);
+  OnSyncStarting();
+
+  // Test OnSyncStarting happening first.
+  ResetState();
+  CreateChangeProcessor();
+  OnSyncStarting();
+  ExpectStartError(syncer::SyncError::DATATYPE_ERROR);
+  type_processor()->OnMetadataLoaded(
+      CreateSyncError(syncer::SyncError::DATATYPE_ERROR), nullptr);
+
+  // Test an error loading pending data.
+  ResetStateWriteItem(kTag1, kValue1);
+  SetServiceError(syncer::SyncError::DATATYPE_ERROR);
+  InitializeToMetadataLoaded();
+  OnPendingCommitDataLoaded();
+  ExpectStartError(syncer::SyncError::DATATYPE_ERROR);
+  OnSyncStarting();
+}
+
 // This test covers race conditions during loading pending data. All cases
 // start with no processor and one acked (committed to the server) item with a
 // pending commit. There are three different events that can occur in any order
@@ -741,6 +836,24 @@
   EXPECT_TRUE(metadata.has_creation_time());
   EXPECT_TRUE(metadata.has_modification_time());
   EXPECT_TRUE(metadata.has_specifics_hash());
+
+  worker()->AckOnePendingCommit();
+  EXPECT_EQ(1U, db().MetadataCount());
+  const sync_pb::EntityMetadata acked_metadata = db().GetMetadata(kTag1);
+  EXPECT_TRUE(acked_metadata.has_server_id());
+  EXPECT_EQ(1, acked_metadata.sequence_number());
+  EXPECT_EQ(1, acked_metadata.acked_sequence_number());
+  EXPECT_EQ(1, acked_metadata.server_version());
+}
+
+// Test that an error applying metadata changes from a commit response is
+// propagated to the error handler.
+TEST_F(SharedModelTypeProcessorTest, ErrorApplyingAck) {
+  InitializeToReadyState();
+  WriteItem(kTag1, kValue1);
+  SetServiceError(syncer::SyncError::DATATYPE_ERROR);
+  error_handler()->ExpectError(syncer::SyncError::DATATYPE_ERROR);
+  worker()->AckOnePendingCommit();
 }
 
 // The purpose of this test case is to test setting |client_tag_hash| and |id|
@@ -900,6 +1013,15 @@
   EXPECT_TRUE(metadata.has_specifics_hash());
 }
 
+// Test that an error applying changes from a server update is
+// propagated to the error handler.
+TEST_F(SharedModelTypeProcessorTest, ErrorApplyingUpdate) {
+  InitializeToReadyState();
+  SetServiceError(syncer::SyncError::DATATYPE_ERROR);
+  error_handler()->ExpectError(syncer::SyncError::DATATYPE_ERROR);
+  worker()->UpdateFromServer(kTag1, kValue1);
+}
+
 // Thoroughly tests the data generated by a server item creation.
 TEST_F(SharedModelTypeProcessorTest, ServerUpdateItem) {
   InitializeToReadyState();
@@ -1229,6 +1351,17 @@
   worker()->ExpectNthPendingCommit(2, kTag1, kValue1);
 }
 
+// Test that an error loading pending commit data for re-encryption is
+// propagated to the error handler.
+TEST_F(SharedModelTypeProcessorTest, ReEncryptErrorLoadingData) {
+  InitializeToReadyState();
+  WriteItemAndAck(kTag1, kValue1);
+  SetServiceError(syncer::SyncError::DATATYPE_ERROR);
+  worker()->UpdateWithEncryptionKey("k1");
+  error_handler()->ExpectError(syncer::SyncError::DATATYPE_ERROR);
+  OnPendingCommitDataLoaded();
+}
+
 // Test receipt of updates with new and old keys.
 TEST_F(SharedModelTypeProcessorTest, ReEncryptUpdatesWithNewKey) {
   InitializeToReadyState();
diff --git a/sync/internal_api/test/data_type_error_handler_mock.cc b/sync/internal_api/test/data_type_error_handler_mock.cc
index 3af73ce..22f5c29 100644
--- a/sync/internal_api/test/data_type_error_handler_mock.cc
+++ b/sync/internal_api/test/data_type_error_handler_mock.cc
@@ -8,6 +8,28 @@
 
 DataTypeErrorHandlerMock::DataTypeErrorHandlerMock() {}
 
-DataTypeErrorHandlerMock::~DataTypeErrorHandlerMock() {}
+DataTypeErrorHandlerMock::~DataTypeErrorHandlerMock() {
+  DCHECK_EQ(SyncError::UNSET, expected_error_type_);
+}
+
+void DataTypeErrorHandlerMock::OnSingleDataTypeUnrecoverableError(
+    const SyncError& error) {
+  DCHECK_NE(SyncError::UNSET, expected_error_type_);
+  DCHECK(error.IsSet());
+  DCHECK_EQ(expected_error_type_, error.error_type());
+  expected_error_type_ = SyncError::UNSET;
+}
+
+SyncError DataTypeErrorHandlerMock::CreateAndUploadError(
+    const tracked_objects::Location& location,
+    const std::string& message,
+    ModelType type) {
+  return SyncError(location, SyncError::DATATYPE_ERROR, message, type);
+}
+
+void DataTypeErrorHandlerMock::ExpectError(SyncError::ErrorType error_type) {
+  DCHECK_EQ(SyncError::UNSET, expected_error_type_);
+  expected_error_type_ = error_type;
+}
 
 }  // namespace syncer
diff --git a/testing/android/appurify_support/java/src/org/chromium/test/support/RobotiumBundleGenerator.java b/testing/android/appurify_support/java/src/org/chromium/test/support/RobotiumBundleGenerator.java
index e006954..d102692 100644
--- a/testing/android/appurify_support/java/src/org/chromium/test/support/RobotiumBundleGenerator.java
+++ b/testing/android/appurify_support/java/src/org/chromium/test/support/RobotiumBundleGenerator.java
@@ -18,6 +18,11 @@
     private static final String TAG = "RobotiumBundleGenerator";
 
     public Bundle generate(Map<String, ResultsBundleGenerator.TestResult> rawResults) {
+        Bundle resultsBundle = new Bundle();
+        if (rawResults.isEmpty()) {
+            return resultsBundle;
+        }
+
         int testsPassed = 0;
         int testsFailed = 0;
         int testsErrored = 0;
@@ -53,7 +58,6 @@
             resultBuilder.append("\nOK (" + Integer.toString(testsPassed) + " tests)");
         }
 
-        Bundle resultsBundle = new Bundle();
         resultsBundle.putString(Instrumentation.REPORT_KEY_STREAMRESULT,
                 resultBuilder.toString());
         return resultsBundle;
diff --git a/testing/android/native_test/java/src/org/chromium/native_test/NativeTestActivity.java b/testing/android/native_test/java/src/org/chromium/native_test/NativeTestActivity.java
index 00d5c78..1e1cb11 100644
--- a/testing/android/native_test/java/src/org/chromium/native_test/NativeTestActivity.java
+++ b/testing/android/native_test/java/src/org/chromium/native_test/NativeTestActivity.java
@@ -49,6 +49,25 @@
     private boolean mStdoutFifo = false;
     private String mStdoutFilePath;
 
+    private static class ReportingUncaughtExceptionHandler
+            implements Thread.UncaughtExceptionHandler {
+
+        private TestStatusReporter mReporter;
+        private Thread.UncaughtExceptionHandler mWrappedHandler;
+
+        public ReportingUncaughtExceptionHandler(TestStatusReporter reporter,
+                Thread.UncaughtExceptionHandler wrappedHandler) {
+            mReporter = reporter;
+            mWrappedHandler = wrappedHandler;
+        }
+
+        @Override
+        public void uncaughtException(Thread thread, Throwable ex) {
+            mReporter.uncaughtException(Process.myPid(), ex);
+            if (mWrappedHandler != null) mWrappedHandler.uncaughtException(thread, ex);
+        }
+    }
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         ChromiumMultiDexInstaller.install(this);
@@ -58,6 +77,10 @@
 
         parseArgumentsFromIntent(getIntent());
         mReporter = new TestStatusReporter(this);
+        mReporter.testRunStarted(Process.myPid());
+        Thread.setDefaultUncaughtExceptionHandler(
+                new ReportingUncaughtExceptionHandler(mReporter,
+                        Thread.getDefaultUncaughtExceptionHandler()));
     }
 
     private void parseArgumentsFromIntent(Intent intent) {
@@ -135,7 +158,6 @@
     }
 
     private void runTests() {
-        mReporter.testRunStarted(Process.myPid());
         nativeRunTests(mCommandLineFlags.toString(), mCommandLineFilePath, mStdoutFilePath,
                 mStdoutFifo, getApplicationContext());
         finish();
diff --git a/testing/android/native_test/java/src/org/chromium/native_test/NativeTestInstrumentationTestRunner.java b/testing/android/native_test/java/src/org/chromium/native_test/NativeTestInstrumentationTestRunner.java
index a744313..f834d33 100644
--- a/testing/android/native_test/java/src/org/chromium/native_test/NativeTestInstrumentationTestRunner.java
+++ b/testing/android/native_test/java/src/org/chromium/native_test/NativeTestInstrumentationTestRunner.java
@@ -168,6 +168,14 @@
                 }
                 mHandler.post(new ShardEnder(pid));
             }
+
+            @Override
+            public void uncaughtException(int pid, String stackTrace) {
+                mLogBundle.putString(Instrumentation.REPORT_KEY_STREAMRESULT,
+                        String.format("Uncaught exception in test process (pid: %d)%n%s%n",
+                                pid, stackTrace));
+                sendStatus(0, mLogBundle);
+            }
         });
 
         mHandler.post(new ShardStarter());
diff --git a/testing/android/reporter/java/src/org/chromium/test/reporter/TestStatusReceiver.java b/testing/android/reporter/java/src/org/chromium/test/reporter/TestStatusReceiver.java
index f0a0d7e..e18efa8 100644
--- a/testing/android/reporter/java/src/org/chromium/test/reporter/TestStatusReceiver.java
+++ b/testing/android/reporter/java/src/org/chromium/test/reporter/TestStatusReceiver.java
@@ -37,6 +37,7 @@
         filter.addAction(TestStatusReporter.ACTION_TEST_STARTED);
         filter.addAction(TestStatusReporter.ACTION_TEST_RUN_STARTED);
         filter.addAction(TestStatusReporter.ACTION_TEST_RUN_FINISHED);
+        filter.addAction(TestStatusReporter.ACTION_UNCAUGHT_EXCEPTION);
         try {
             filter.addDataType(TestStatusReporter.DATA_TYPE_HEARTBEAT);
             filter.addDataType(TestStatusReporter.DATA_TYPE_RESULT);
@@ -70,6 +71,7 @@
     public interface TestRunCallback {
         void testRunStarted(int pid);
         void testRunFinished(int pid);
+        void uncaughtException(int pid, String stackTrace);
     }
 
     /** Register a callback for when a test has failed. */
@@ -145,6 +147,11 @@
                     c.testRunFinished(pid);
                 }
                 break;
+            case TestStatusReporter.ACTION_UNCAUGHT_EXCEPTION:
+                for (TestRunCallback c: mTestRunCallbacks) {
+                    c.uncaughtException(pid, stackTrace);
+                }
+                break;
             default:
                 Log.e(TAG, "Unrecognized intent received: %s", intent.toString());
                 break;
diff --git a/testing/android/reporter/java/src/org/chromium/test/reporter/TestStatusReporter.java b/testing/android/reporter/java/src/org/chromium/test/reporter/TestStatusReporter.java
index 1d887008..31da20e 100644
--- a/testing/android/reporter/java/src/org/chromium/test/reporter/TestStatusReporter.java
+++ b/testing/android/reporter/java/src/org/chromium/test/reporter/TestStatusReporter.java
@@ -6,6 +6,7 @@
 
 import android.content.Context;
 import android.content.Intent;
+import android.util.Log;
 
 import org.chromium.base.ThreadUtils;
 
@@ -28,6 +29,8 @@
             "org.chromium.test.reporter.TestStatusReporter.TEST_RUN_STARTED";
     public static final String ACTION_TEST_RUN_FINISHED =
             "org.chromium.test.reporter.TestStatusReporter.TEST_RUN_FINISHED";
+    public static final String ACTION_UNCAUGHT_EXCEPTION =
+            "org.chromium.test.reporter.TestStatusReporter.UNCAUGHT_EXCEPTION";
     public static final String DATA_TYPE_HEARTBEAT = "org.chromium.test.reporter/heartbeat";
     public static final String DATA_TYPE_RESULT = "org.chromium.test.reporter/result";
     public static final String EXTRA_PID =
@@ -107,6 +110,14 @@
         mContext.sendBroadcast(i);
     }
 
+    public void uncaughtException(int pid, Throwable ex) {
+        Intent i = new Intent(ACTION_UNCAUGHT_EXCEPTION);
+        i.setType(DATA_TYPE_RESULT);
+        i.putExtra(EXTRA_PID, pid);
+        i.putExtra(EXTRA_STACK_TRACE, Log.getStackTraceString(ex));
+        mContext.sendBroadcast(i);
+    }
+
     public void stopHeartbeat() {
         mKeepBeating.set(false);
     }
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index e78b2cb9..b3771da 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -8077,6 +8077,389 @@
       }
     ]
   },
+  "LTO Linux": {
+    "gtest_tests": [
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "accessibility_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "angle_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "app_list_presenter_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "app_list_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "app_shell_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "aura_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "base_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "blimp_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "blink_heap_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "blink_platform_unittests"
+      },
+      {
+        "args": [
+          "--gtest_filter=-SaveType/SavePageMultiFrameBrowserTest.ObjectElements/0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "shards": 10
+        },
+        "test": "browser_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "cacheinvalidation_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "cast_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "cc_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "chromedriver_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "components_browsertests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "components_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "compositor_unittests"
+      },
+      {
+        "args": [
+          "--gtest_filter=-WebRtcBrowserTest.CanForwardRemoteStream"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "content_browsertests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "content_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "crypto_unittests"
+      },
+      {
+        "test": "dbus_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "device_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "display_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "events_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "extensions_browsertests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "extensions_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "gcm_unit_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "gfx_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "gin_unittests"
+      },
+      {
+        "test": "gl_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "gn_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "google_apis_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "gpu_ipc_service_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "gpu_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "interactive_ui_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "ipc_mojo_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "ipc_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "jingle_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "media_blink_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "media_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "midi_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "mojo_common_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "mojo_public_bindings_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "mojo_public_system_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "mojo_system_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "nacl_loader_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "net_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "ppapi_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "printing_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "remoting_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "sandbox_linux_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "skia_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "sql_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "sync_unit_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "ui_base_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "ui_touch_selection_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "unit_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "url_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "views_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "webkit_unit_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "wm_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "wtf_unittests"
+      }
+    ]
+  },
   "Linux ARM": {
     "gtest_tests": [
       {
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json
index ea08ccbb..7d17cf3 100644
--- a/testing/buildbot/chromium.linux.json
+++ b/testing/buildbot/chromium.linux.json
@@ -529,6 +529,9 @@
         "test": "cacheinvalidation_unittests"
       },
       {
+        "test": "cast_alsa_cma_backend_unittests"
+      },
+      {
         "test": "cast_base_unittests"
       },
       {
@@ -1586,7 +1589,379 @@
     ]
   },
   "Linux Tests (dbg)(1)(32)": {
-    "gtest_tests": [],
-    "scripts": []
+    "gtest_tests": [
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "accessibility_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "app_list_presenter_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "app_list_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "app_shell_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "aura_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "base_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "battor_agent_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "blimp_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "shards": 10
+        },
+        "test": "browser_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "cacheinvalidation_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "cast_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "cc_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "chrome_app_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "chromedriver_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "components_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "compositor_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "content_browsertests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "content_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "crypto_unittests"
+      },
+      {
+        "test": "dbus_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "device_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "display_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "events_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "extensions_browsertests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "extensions_unittests"
+      },
+      {
+        "test": "filesystem_service_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "gcm_unit_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "gfx_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "gn_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "google_apis_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "gpu_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "shards": 3
+        },
+        "test": "interactive_ui_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "ipc_mojo_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "ipc_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "jingle_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "leveldb_service_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "media_blink_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "media_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "midi_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "mojo_common_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "mojo_public_bindings_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "mojo_public_system_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "mojo_system_unittests"
+      },
+      {
+        "test": "mus_gpu_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "mus_ws_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "nacl_loader_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "net_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "ppapi_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "printing_unittests"
+      },
+      {
+        "args": [
+          "--test-launcher-print-test-stdio=always"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "sandbox_linux_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "skia_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "sql_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "sync_integration_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "sync_unit_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "ui_base_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "ui_touch_selection_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "unit_tests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "url_unittests"
+      },
+      {
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "wm_unittests"
+      }
+    ],
+    "isolated_scripts": [
+      {
+        "isolate_name": "telemetry_gpu_unittests",
+        "name": "telemetry_gpu_unittests",
+        "override_compile_targets": [
+          "telemetry_gpu_unittests_run"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        }
+      },
+      {
+        "isolate_name": "telemetry_unittests",
+        "name": "telemetry_unittests",
+        "override_compile_targets": [
+          "telemetry_unittests_run"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        }
+      }
+    ]
   }
 }
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl
index 202ffa2..cba96bc 100644
--- a/testing/buildbot/gn_isolate_map.pyl
+++ b/testing/buildbot/gn_isolate_map.pyl
@@ -163,6 +163,10 @@
       "--test-launcher-bot-mode",
     ],
   },
+  "cast_alsa_cma_backend_unittests": {
+    "label": "//chromecast/media/cma/backend/alsa:cast_alsa_cma_backend_unittests",
+    "type": "unknown",
+  },
   "cast_base_unittests": {
     "label": "//cast:cast_base_unittests",
     "type": "unknown",
diff --git a/testing/generate_isolate.py b/testing/generate_isolate.py
index 1944e735..2a03c22 100755
--- a/testing/generate_isolate.py
+++ b/testing/generate_isolate.py
@@ -19,8 +19,9 @@
 )
 
 _ANDROID_BLACKLIST = (
+    r'.*\.crx',  # Chrome extension zip files.
     r'.*\.so',  # Libraries packed into .apk.
-    r'.*\.mojom.js',  # Some test_support targets include python deps.
+    r'.*\.mojom\.js',  # Some test_support targets include python deps.
     r'.*Mojo.*manifest\.json',  # Some source_set()s pull these in.
     r'.*jni_generator_tests',  # Exists just to test the compile, not to be run.
 )
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index f0924ba5..a62db5a 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -3,14 +3,6 @@
 # failure. Expected outputs will be adjusted for the better once Oilpan
 # has been well and truly enabled always.
 
-# With Oilpan, the parent pointer in the CSSRule hierarchy is
-# strong. This is the intended behavior.
-crbug.com/345630 fast/dom/StyleSheet/gc-parent-rule.html [ Failure ]
-crbug.com/345630 fast/dom/StyleSheet/gc-parent-stylesheet.html [ Failure ]
-crbug.com/345655 fast/dom/StyleSheet/detached-parent-rule-without-wrapper.html [ Failure ]
-crbug.com/345655 fast/dom/StyleSheet/detached-stylesheet-without-wrapper.html [ Failure ]
-crbug.com/370906 fast/dom/StyleSheet/gc-declaration-parent-rule.html [ Failure ]
-
 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/596940 inspector-protocol/runtime/runtime-execution-contexts-events.html [ Pass Timeout ]
diff --git a/third_party/WebKit/LayoutTests/custom-elements/spec/define-element.html b/third_party/WebKit/LayoutTests/custom-elements/spec/define-element.html
index c88a110..f678ca2 100644
--- a/third_party/WebKit/LayoutTests/custom-elements/spec/define-element.html
+++ b/third_party/WebKit/LayoutTests/custom-elements/spec/define-element.html
@@ -16,7 +16,13 @@
 test_with_window((w) => {
   assert_throws(TypeError.prototype, () => {
     w.customElements.define('a-a', 42);
-  }, 'defining a non-constructor should throw a TypeError');
+  }, 'defining a number "constructor" should throw a TypeError');
+  assert_throws(TypeError.prototype, () => {
+    w.customElements.define('a-a', () => {});
+  }, 'defining an arrow function "constructor" should throw a TypeError');
+  assert_throws(TypeError.prototype, () => {
+    w.customElements.define('a-a', { m() {} }.m);
+  }, 'defining a concise method "constructor" should throw a TypeError');
 }, 'A "constructor" that is not a constructor');
 
 test_with_window((w) => {
@@ -78,10 +84,8 @@
 
 test_with_window((w) => {
   assert_throws(TypeError.prototype, () => {
-    let not_a_constructor = new Object();
+    let not_a_constructor = () => {};
     let invalid_name = 'annotation-xml';
-    // TODO(dominicc): When V8 supports IsConstructor, replace this with a
-    // function.
     w.customElements.define(invalid_name, not_a_constructor);
   }, 'Defining an element with an invalid name and invalid constructor ' +
      'should throw a TypeError for the constructor and not a SyntaxError');
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/flex-and-content-sized-resolution-columns-expected.txt b/third_party/WebKit/LayoutTests/fast/css-grid-layout/flex-and-content-sized-resolution-columns-expected.txt
index aea55e2..da74fea 100644
--- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/flex-and-content-sized-resolution-columns-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/flex-and-content-sized-resolution-columns-expected.txt
@@ -2,7 +2,7 @@
 PASS window.getComputedStyle(gridFixedAndMinContentAndFlexMultipleOverlap, '').getPropertyValue('grid-template-columns') is "20px 10px 70px"
 PASS window.getComputedStyle(gridMinMaxFixedFlexAndMaxContentAndAuto, '').getPropertyValue('grid-template-columns') is "60px 20px 20px"
 PASS window.getComputedStyle(gridMinMaxFixedFlexAndMaxContentAndAutoNoFlexSpanningItems, '').getPropertyValue('grid-template-columns') is "100px 0px 0px"
-PASS window.getComputedStyle(gridMinMaxFlexFixedAndMinContentAndFixed, '').getPropertyValue('grid-template-columns') is "35px 5px 25px"
+PASS window.getComputedStyle(gridMinMaxAutoFixedAndMinContentAndFixed, '').getPropertyValue('grid-template-columns') is "35px 20px 25px"
 PASS window.getComputedStyle(gridMinContentAndMinMaxFixedMinContentAndFlex, '').getPropertyValue('grid-template-columns') is "20px 20px 60px"
 PASS window.getComputedStyle(gridMaxContentAndMinMaxFixedMaxContentAndFlex, '').getPropertyValue('grid-template-columns') is "70px 20px 10px"
 PASS successfullyParsed is true
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/flex-and-content-sized-resolution-columns.html b/third_party/WebKit/LayoutTests/fast/css-grid-layout/flex-and-content-sized-resolution-columns.html
index 0f10478..113a142 100644
--- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/flex-and-content-sized-resolution-columns.html
+++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/flex-and-content-sized-resolution-columns.html
@@ -15,8 +15,8 @@
      grid-template-columns: minmax(20px, 1fr) max-content auto;
 }
 
-.gridMinMaxFlexFixedAndMinContentAndFixed {
-     grid-template-columns: minmax(0.5fr, 35px) min-content 25px;
+.gridMinMaxAutoFixedAndMinContentAndFixed {
+     grid-template-columns: minmax(auto, 35px) min-content 25px;
 }
 
 .gridMinContentAndMinMaxFixedMinContentAndFlex {
@@ -63,7 +63,7 @@
 </div>
 
 <div style="position: relative; width: 100px;">
-    <div id="gridMinMaxFlexFixedAndMinContentAndFixed" class="grid gridMinMaxFlexFixedAndMinContentAndFixed">
+    <div id="gridMinMaxAutoFixedAndMinContentAndFixed" class="grid gridMinMaxAutoFixedAndMinContentAndFixed">
 	<div style="grid-column: 1 / span 2;">XXXX XXXX</div>
 	<div style="grid-column: 2 / span 2; grid-row: 2;">XXX XXX</div>
 	<div style="grid-column: 1 / -1; grid-row: 3;">XXXXX XXXXX</div>
@@ -100,7 +100,7 @@
 checkColumns("gridFixedAndMinContentAndFlexMultipleOverlap", "20px 10px 70px");
 checkColumns("gridMinMaxFixedFlexAndMaxContentAndAuto", "60px 20px 20px");
 checkColumns("gridMinMaxFixedFlexAndMaxContentAndAutoNoFlexSpanningItems", "100px 0px 0px");
-checkColumns("gridMinMaxFlexFixedAndMinContentAndFixed", "35px 5px 25px");
+checkColumns("gridMinMaxAutoFixedAndMinContentAndFixed", "35px 20px 25px");
 checkColumns("gridMinContentAndMinMaxFixedMinContentAndFlex", "20px 20px 60px");
 checkColumns("gridMaxContentAndMinMaxFixedMaxContentAndFlex", "70px 20px 10px");
 
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/flex-content-resolution-columns-expected.txt b/third_party/WebKit/LayoutTests/fast/css-grid-layout/flex-content-resolution-columns-expected.txt
index f0f9d2a..d60e5633 100644
--- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/flex-content-resolution-columns-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/flex-content-resolution-columns-expected.txt
@@ -1,8 +1,7 @@
 Test that resolving auto tracks on grid items works properly.
 
-PASS
-PASS
-PASS
+XXX
+XXXXX
 PASS
 PASS
 PASS
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/flex-content-resolution-columns.html b/third_party/WebKit/LayoutTests/fast/css-grid-layout/flex-content-resolution-columns.html
index ab7fda8b..33f4f3a 100644
--- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/flex-content-resolution-columns.html
+++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/flex-content-resolution-columns.html
@@ -2,12 +2,8 @@
 <html>
 <link href="resources/grid.css" rel="stylesheet">
 <style>
-.gridMinFlexContent {
-    grid-template-columns: minmax(1fr, 50px);
-    grid-template-rows: 50px;
-}
-.gridZeroFlexContent {
-    grid-template-columns: minmax(1fr, 0px);
+.gridFlexContent {
+    grid-template-columns: 1fr 1fr;
     grid-template-rows: 50px;
 }
 .gridMaxFlexContent {
@@ -53,28 +49,10 @@
 
 <p>Test that resolving auto tracks on grid items works properly.</p>
 
-<div style="width: 0px">
-    <div class="grid gridMinFlexContent">
-        <div class="sizedToGridArea firstRowFirstColumn" data-expected-width="0" data-expected-height="50"></div>
-    </div>
-</div>
-
-<div style="width: 100px">
-    <div class="grid gridZeroFlexContent">
-        <div class="sizedToGridArea firstRowFirstColumn" data-expected-width="0" data-expected-height="50"></div>
-    </div>
-</div>
-
-<!-- Allow the extra logical space distribution to occur. -->
-<div style="width: 40px; height: 10px">
-    <div class="grid gridMinFlexContent">
-        <div class="sizedToGridArea firstRowFirstColumn" data-expected-width="40" data-expected-height="50"></div>
-    </div>
-</div>
-
-<div style="width: 100px; height: 10px;">
-    <div class="grid gridMinFlexContent">
-        <div class="sizedToGridArea firstRowFirstColumn" data-expected-width="50" data-expected-height="50"></div>
+<div class="constrainedContainer" style="position: relative">
+    <div class="grid gridFlexContent">
+        <div class="sizedToGridArea firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="30" data-expected-height="50">XXX</div>
+        <div class="sizedToGridArea firstRowSecondColumn" data-offset-x="30" data-offset-y="0" data-expected-width="50" data-expected-height="50">XXXXX</div>
     </div>
 </div>
 
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/flex-content-resolution-rows-expected.txt b/third_party/WebKit/LayoutTests/fast/css-grid-layout/flex-content-resolution-rows-expected.txt
index 9f7a785d..35c5cea 100644
--- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/flex-content-resolution-rows-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/flex-content-resolution-rows-expected.txt
@@ -1,10 +1,13 @@
 Test that resolving auto tracks on grid items works properly.
 
-PASS
-PASS
-PASS
-PASS
-PASS
+X
+X
+X
+X
+X
+X
+X
+X
 PASS
 PASS
 PASS
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/flex-content-resolution-rows.html b/third_party/WebKit/LayoutTests/fast/css-grid-layout/flex-content-resolution-rows.html
index 2a16081..bf7f73b 100644
--- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/flex-content-resolution-rows.html
+++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/flex-content-resolution-rows.html
@@ -2,13 +2,9 @@
 <html>
 <link href="resources/grid.css" rel="stylesheet">
 <style>
-.gridMinFlexContent {
+.gridFlexContent {
     grid-template-columns: 50px;
-    grid-template-rows: minmax(1fr, 50px);
-}
-.gridZeroFlexContent {
-    grid-template-columns: 50px;
-    grid-template-rows: minmax(1fr, 0px);
+    grid-template-rows: 1fr 1fr;
 }
 .gridMaxFlexContent {
     grid-template-columns: 50px;
@@ -49,44 +45,12 @@
 
 <p>Test that resolving auto tracks on grid items works properly.</p>
 
-<div style="height: 0px">
-    <div class="grid gridMinFlexContent" style="height: 100%">
-        <div class="sizedToGridArea firstRowFirstColumn" data-expected-width="50" data-expected-height="0"></div>
-    </div>
-</div>
 
-<div style="height: 0px">
-    <div class="grid gridZeroFlexContent">
-        <div class="sizedToGridArea firstRowFirstColumn" data-expected-width="50" data-expected-height="0"></div>
-    </div>
+<div class="grid gridFlexContent constrainedContainer" style="position: relative;">
+    <div class="sizedToGridArea firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="50" data-expected-height="30">X<br>X<br>X</div>
+    <div class="sizedToGridArea secondRowFirstColumn" data-offset-x="0" data-offset-y="30" data-expected-width="50" data-expected-height="50">X<br>X<br>X<br>X<br>X</div>
 </div>
 
-<div style="height: 0px">
-    <div class="grid gridMinFlexContent">
-        <div class="sizedToGridArea firstRowFirstColumn" data-expected-width="50" data-expected-height="50"></div>
-    </div>
-</div>
-
-<!-- Allow the extra logical space distribution to occur. -->
-<div style="width: 10px; height: 40px">
-    <div class="grid gridMinFlexContent" style="height: 100%">
-        <div class="sizedToGridArea firstRowFirstColumn" data-expected-width="50" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="width: 10px; height: 40px">
-    <div class="grid gridMinFlexContent">
-        <div class="sizedToGridArea firstRowFirstColumn" data-expected-width="50" data-expected-height="50"></div>
-    </div>
-</div>
-
-<div style="width: 10px; height: 100px;">
-    <div class="grid gridMinFlexContent">
-        <div class="sizedToGridArea firstRowFirstColumn" data-expected-width="50" data-expected-height="50"></div>
-    </div>
-</div>
-
-
 <div class="constrainedContainer">
     <div class="grid gridMaxFlexContent">
         <div class="sizedToGridArea firstRowFirstColumn" data-expected-width="50" data-expected-height="30"></div>
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-expected.txt b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-expected.txt
index b68ead25..2fd115b8 100644
--- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-expected.txt
@@ -127,9 +127,9 @@
 PASS getComputedStyle(element, '').getPropertyValue('grid-template-rows') is "0px"
 PASS element.style.gridTemplateRows is "0fr"
 PASS getComputedStyle(element, '').getPropertyValue('grid-template-columns') is "0px"
-PASS element.style.gridTemplateColumns is "minmax(0fr, 0fr)"
+PASS element.style.gridTemplateColumns is "minmax(auto, 0fr)"
 PASS getComputedStyle(element, '').getPropertyValue('grid-template-rows') is "0px"
-PASS element.style.gridTemplateRows is "minmax(0fr, 0fr)"
+PASS element.style.gridTemplateRows is "minmax(auto, 0fr)"
 
 Test getting and setting grid-template-columns and grid-template-rows to calc() values through JS
 PASS getComputedStyle(element, '').getPropertyValue('grid-template-columns') is "150px"
@@ -176,6 +176,10 @@
 PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-rows') is "none"
 PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-columns') is "none"
 PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-rows') is "none"
+PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-columns') is "none"
+PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-rows') is "none"
+PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-columns') is "none"
+PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-rows') is "none"
 
 Test setting grid-template-columns and grid-template-rows back to 'none' through JS
 PASS getComputedStyle(element, '').getPropertyValue('grid-template-columns') is "18px"
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-gutters-and-flex-content-expected.txt b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-gutters-and-flex-content-expected.txt
index 57a61a1..5c6b4df 100644
--- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-gutters-and-flex-content-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-gutters-and-flex-content-expected.txt
@@ -7,11 +7,6 @@
 PASS
 PASS
 PASS
-XXXX XXXX
-XXX XXX
-XXXXX XXXXX
-XX XX XX XX
-PASS
 XXXXX
 XXX XXX XXX
 XXXX XXXX
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-gutters-and-flex-content.html b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-gutters-and-flex-content.html
index 361f9abc..b83f6ea6 100644
--- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-gutters-and-flex-content.html
+++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-gutters-and-flex-content.html
@@ -13,7 +13,6 @@
 .gridRowsTwoMaxFlexContent { grid-template: minmax(10px, 1fr) minmax(10px, 2fr) / 50px; }
 .gridRowsTwoDoubleMaxFlexContent { grid-template: minmax(10px, 0.5fr) minmax(10px, 2fr) / 50px; }
 
-.gridMinMaxFlexFixedAndMinContentAndFixed { grid-template-columns: minmax(0.5fr, 35px) min-content 25px; }
 .gridMinContentAndMinMaxFixedMinContentAndFlex { grid-template-columns: min-content minmax(20px, min-content) 2fr; }
 .gridMaxContentAndMinMaxFixedMaxContentAndFlex { grid-template-columns: max-content minmax(20px, max-content) 1fr; }
 
@@ -76,15 +75,6 @@
 <!-- Check that gutters do not interfere with flex content resolution with content sized tracks -->
 
 <div style="position: relative; width: 100px;">
-    <div class="grid gridMinMaxFlexFixedAndMinContentAndFixed gridRowColumnGaps" data-expected-width="100" data-expected-height="199">
-	<div style="grid-column: 1 / span 2;" data-expected-width="54" data-expected-height="20">XXXX XXXX</div>
-	<div style="grid-column: 2 / span 2; grid-row: 2;" data-expected-width="44" data-expected-height="20">XXX XXX</div>
-	<div style="grid-column: 1 / -1; grid-row: 3;" data-expected-width="98" data-expected-height="20">XXXXX XXXXX</div>
-	<div style="grid-column: 2 / span 2; grid-row: 4;" data-expected-width="44" data-expected-height="40">XX XX XX XX</div>
-    </div>
-</div>
-
-<div style="position: relative; width: 100px;">
     <div class="grid gridMinContentAndMinMaxFixedMinContentAndFlex gridRowColumnGaps" data-expected-width="100" data-expected-height="149">
 	<div style="grid-column: 2 / span 2;" data-expected-width="80">XXXXX</div>
 	<div style="grid-column: 1 / -1; grid-row: 2;" data-expected-width="100">XXX XXX XXX</div>
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-preferred-logical-widths.html b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-preferred-logical-widths.html
index 931f2c4..759731e 100644
--- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-preferred-logical-widths.html
+++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-preferred-logical-widths.html
@@ -35,7 +35,7 @@
 }
 
 .gridFixedFraction {
-    grid-template-columns: minmax(10px, 1fr) minmax(2fr, 20px);
+    grid-template-columns: minmax(10px, 1fr) minmax(20px, 2fr);
     grid-template-rows: 10px;
 }
 
@@ -103,7 +103,7 @@
     <div class="firstRowSecondColumn">XX XX XX</div>
 </div>
 
-<div class="grid gridFixedFraction min-content" data-expected-height="10" data-expected-width="10"></div>
+<div class="grid gridFixedFraction min-content" data-expected-height="10" data-expected-width="30"></div>
 </div>
 
 <div class="grid gridFixedFraction max-content" data-expected-height="10" data-expected-width="30"></div>
@@ -213,7 +213,7 @@
 
 <div class="min-content grid gridFixedFraction minWidth70" data-expected-height="10" data-expected-width="70"></div>
 
-<div class="min-content grid gridFixedFraction maxWidth20" data-expected-height="10" data-expected-width="10"></div>
+<div class="min-content grid gridFixedFraction maxWidth20" data-expected-height="10" data-expected-width="20"></div>
 
 </body>
 </html>
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/non-grid-columns-rows-get-set-expected.txt b/third_party/WebKit/LayoutTests/fast/css-grid-layout/non-grid-columns-rows-get-set-expected.txt
index 83533059..af54a01 100644
--- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/non-grid-columns-rows-get-set-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/non-grid-columns-rows-get-set-expected.txt
@@ -115,9 +115,9 @@
 PASS getComputedStyle(element, '').getPropertyValue('grid-template-rows') is "0px"
 PASS element.style.gridTemplateRows is "0fr"
 PASS getComputedStyle(element, '').getPropertyValue('grid-template-columns') is "0px"
-PASS element.style.gridTemplateColumns is "minmax(0fr, 0fr)"
+PASS element.style.gridTemplateColumns is "minmax(auto, 0fr)"
 PASS getComputedStyle(element, '').getPropertyValue('grid-template-rows') is "0px"
-PASS element.style.gridTemplateRows is "minmax(0fr, 0fr)"
+PASS element.style.gridTemplateRows is "minmax(auto, 0fr)"
 
 Test setting grid-template-columns and grid-template-rows to bad values through JS
 PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-columns') is "none"
@@ -140,6 +140,10 @@
 PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-rows') is "none"
 PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-columns') is "none"
 PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-rows') is "none"
+PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-columns') is "none"
+PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-rows') is "none"
+PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-columns') is "none"
+PASS window.getComputedStyle(element, '').getPropertyValue('grid-template-rows') is "none"
 
 Test setting grid-template-columns and grid-template-rows back to 'none' through JS
 PASS getComputedStyle(element, '').getPropertyValue('grid-template-columns') is "18px"
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/resources/grid-columns-rows-get-set.js b/third_party/WebKit/LayoutTests/fast/css-grid-layout/resources/grid-columns-rows-get-set.js
index 6f024335..3087cc8e 100644
--- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/resources/grid-columns-rows-get-set.js
+++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/resources/grid-columns-rows-get-set.js
@@ -64,7 +64,7 @@
 testGridDefinitionsSetJSValues("+3fr", "+4fr", "800px", "600px", "3fr", "4fr");
 // Flex factor values can be zero.
 testGridDefinitionsSetJSValues("0fr", ".0fr", "0px", "0px", "0fr", "0fr");
-testGridDefinitionsSetJSValues("minmax(0fr, 0fr)", "minmax(.0fr, .0fr)", "0px", "0px", "minmax(0fr, 0fr)", "minmax(0fr, 0fr)");
+testGridDefinitionsSetJSValues("minmax(auto, 0fr)", "minmax(auto, .0fr)", "0px", "0px", "minmax(auto, 0fr)", "minmax(auto, 0fr)");
 
 debug("");
 debug("Test getting and setting grid-template-columns and grid-template-rows to calc() values through JS");
@@ -95,6 +95,9 @@
 testGridDefinitionsSetBadJSValues("minmax(min-content, calc())", "calc(10%(");
 // Forward slash not allowed if not part of a shorthand
 testGridDefinitionsSetBadJSValues("10px /", "15px /");
+// Flexible lengths are invalid on the min slot of minmax().
+testGridDefinitionsSetBadJSValues("minmax(0fr, 100px)", "minmax(.0fr, 200px)");
+testGridDefinitionsSetBadJSValues("minmax(1fr, 100px)", "minmax(2.5fr, 200px)");
 
 debug("");
 debug("Test setting grid-template-columns and grid-template-rows back to 'none' through JS");
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/resources/non-grid-columns-rows-get-set.js b/third_party/WebKit/LayoutTests/fast/css-grid-layout/resources/non-grid-columns-rows-get-set.js
index db4dbb9..26f2dbc 100644
--- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/resources/non-grid-columns-rows-get-set.js
+++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/resources/non-grid-columns-rows-get-set.js
@@ -58,7 +58,7 @@
 testNonGridDefinitionsSetJSValues("minmax(auto, 8vh)", "minmax(10vw, auto)", "minmax(auto, 48px)", "minmax(80px, auto)");
 // Flex factor values can be zero.
 testGridDefinitionsSetJSValues("0fr", ".0fr", "0px", "0px", "0fr", "0fr");
-testGridDefinitionsSetJSValues("minmax(0fr, 0fr)", "minmax(.0fr, .0fr)", "0px", "0px", "minmax(0fr, 0fr)", "minmax(0fr, 0fr)");
+testGridDefinitionsSetJSValues("minmax(auto, 0fr)", "minmax(auto, .0fr)", "0px", "0px", "minmax(auto, 0fr)", "minmax(auto, 0fr)");
 
 debug("");
 debug("Test setting grid-template-columns and grid-template-rows to bad values through JS");
@@ -77,6 +77,9 @@
 // Negative values are not allowed.
 testGridDefinitionsSetBadJSValues("-1px", "-6em");
 testGridDefinitionsSetBadJSValues("minmax(-1%, 32%)", "minmax(2vw, -6em)");
+// Flexible lengths are invalid on the min slot of minmax().
+testGridDefinitionsSetBadJSValues("minmax(0fr, 100px)", "minmax(.0fr, 200px)");
+testGridDefinitionsSetBadJSValues("minmax(1fr, 100px)", "minmax(2.5fr, 200px)");
 
 debug("");
 debug("Test setting grid-template-columns and grid-template-rows back to 'none' through JS");
diff --git a/third_party/WebKit/LayoutTests/fast/dom/StyleSheet/detached-parent-rule-without-wrapper-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/StyleSheet/detached-parent-rule-without-wrapper-expected.txt
index 972e79d..cd81043e 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/StyleSheet/detached-parent-rule-without-wrapper-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/dom/StyleSheet/detached-parent-rule-without-wrapper-expected.txt
@@ -1,12 +1,12 @@
 CONSOLE WARNING: 'getMatchedCSSRules()' is deprecated. For more help, check https://code.google.com/p/chromium/issues/detail?id=437569#c2
-Test that CSS stylesheets lacking wrappers are pruned from detached CSSOM subtrees. This is surprising behavior, but it's a very rare situation, and the behavior actually matches what both WebKit and Gecko do for DOM nodes in detached subtrees.
+Test that detached CSSOM subtrees keeps a reference to CSS stylesheets lacking wrappers.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
 PASS getMatchedCSSRules(document.getElementById("test")).length is 1
 Removing <style>...
-PASS rule.parentRule is null
+PASS rule.parentRule is not null
 PASS getMatchedCSSRules(document.getElementById("test")) is null
 PASS successfullyParsed is true
 
diff --git a/third_party/WebKit/LayoutTests/fast/dom/StyleSheet/detached-parent-rule-without-wrapper.html b/third_party/WebKit/LayoutTests/fast/dom/StyleSheet/detached-parent-rule-without-wrapper.html
index 54a900fc..a4eb7fd5 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/StyleSheet/detached-parent-rule-without-wrapper.html
+++ b/third_party/WebKit/LayoutTests/fast/dom/StyleSheet/detached-parent-rule-without-wrapper.html
@@ -8,15 +8,13 @@
 <body>
 <div id="test"></div>
 <script>
-description("Test that CSS stylesheets lacking wrappers are pruned from detached CSSOM subtrees. " + 
-"This is surprising behavior, but it's a very rare situation, and the behavior actually matches " +
-"what both WebKit and Gecko do for DOM nodes in detached subtrees.");
+description("Test that detached CSSOM subtrees keeps a reference to CSS stylesheets lacking wrappers.");
 
 shouldBe('getMatchedCSSRules(document.getElementById("test")).length', '1');
 rule = getMatchedCSSRules(document.getElementById("test")).item(0);
 debug("Removing &lt;style>...");
 document.head.removeChild(document.getElementsByTagName("style")[0]);
-shouldBe("rule.parentRule", "null");
+shouldNotBe("rule.parentRule", "null");
 shouldBe('getMatchedCSSRules(document.getElementById("test"))', 'null');
 </script>
 </body>
diff --git a/third_party/WebKit/LayoutTests/fast/dom/StyleSheet/detached-stylesheet-without-wrapper-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/StyleSheet/detached-stylesheet-without-wrapper-expected.txt
index 82bf915..94f37fe 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/StyleSheet/detached-stylesheet-without-wrapper-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/dom/StyleSheet/detached-stylesheet-without-wrapper-expected.txt
@@ -1,10 +1,10 @@
 CONSOLE WARNING: 'getMatchedCSSRules()' is deprecated. For more help, check https://code.google.com/p/chromium/issues/detail?id=437569#c2
-Test that CSS stylesheets lacking wrappers are pruned from detached CSSOM subtrees. This is surprising behavior, but it's a very rare situation, and the behavior actually matches what both WebKit and Gecko do for DOM nodes in detached subtrees.
+Test that detached CSSOM subtrees keeps a reference to CSS stylesheets lacking wrappers.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-PASS rule.parentStyleSheet is null
+PASS rule.parentStyleSheet is not null
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/fast/dom/StyleSheet/detached-stylesheet-without-wrapper.html b/third_party/WebKit/LayoutTests/fast/dom/StyleSheet/detached-stylesheet-without-wrapper.html
index 6cef409..b23c829 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/StyleSheet/detached-stylesheet-without-wrapper.html
+++ b/third_party/WebKit/LayoutTests/fast/dom/StyleSheet/detached-stylesheet-without-wrapper.html
@@ -10,13 +10,11 @@
 <body>
 <span id="test-element"></div>
 <script>
-description("Test that CSS stylesheets lacking wrappers are pruned from detached CSSOM subtrees. " + 
-"This is surprising behavior, but it's a very rare situation, and the behavior actually matches " +
-"what both WebKit and Gecko do for DOM nodes in detached subtrees.");
+description("Test that detached CSSOM subtrees keeps a reference to CSS stylesheets lacking wrappers.");
 
 var rule = getMatchedCSSRules(document.getElementById("test-element")).item(0);
 document.documentElement.removeChild(document.head);
-shouldBe("rule.parentStyleSheet", "null");
+shouldNotBe("rule.parentStyleSheet", "null");
 </script>
 </body>
 </html>
diff --git a/third_party/WebKit/LayoutTests/fast/dom/StyleSheet/gc-declaration-parent-rule-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/StyleSheet/gc-declaration-parent-rule-expected.txt
index 0125dd0..90bd866 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/StyleSheet/gc-declaration-parent-rule-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/dom/StyleSheet/gc-declaration-parent-rule-expected.txt
@@ -3,7 +3,7 @@
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-FAIL style.parentRule.foo should be bar. Threw exception TypeError: Cannot read property 'foo' of null
+PASS style.parentRule.foo is "bar"
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/fast/dom/StyleSheet/gc-parent-rule-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/StyleSheet/gc-parent-rule-expected.txt
index e3282ef..28aebd9fae 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/StyleSheet/gc-parent-rule-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/dom/StyleSheet/gc-parent-rule-expected.txt
@@ -5,7 +5,7 @@
 
 PASS style.sheet is an instance of CSSStyleSheet
 PASS style.sheet is null
-FAIL rule.parentRule.foo should be bar. Threw exception TypeError: Cannot read property 'foo' of null
+PASS rule.parentRule.foo is "bar"
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/fast/dom/StyleSheet/gc-parent-stylesheet-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/StyleSheet/gc-parent-stylesheet-expected.txt
index 643b49e..a983fa28 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/StyleSheet/gc-parent-stylesheet-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/dom/StyleSheet/gc-parent-stylesheet-expected.txt
@@ -5,7 +5,7 @@
 
 PASS style.sheet is an instance of CSSStyleSheet
 PASS style.sheet is null
-FAIL rule.parentStyleSheet.foo should be 0. Threw exception TypeError: Cannot read property 'foo' of null
+PASS rule.parentStyleSheet.foo is "0"
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/fast/dom/gc-9-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/gc-9-expected.txt
index c9c6ef6..4aea873 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/gc-9-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/dom/gc-9-expected.txt
@@ -81,7 +81,7 @@
 PASS: document.getElementsByTagName('table')[0].tBodies[0].rows.myCustomProperty should be 1 and is.
 PASS: document.body.children.myCustomProperty should be 1 and is.
 PASS: document.getElementsByTagName('map')[0].areas.myCustomProperty should be 1 and is.
-FAIL: document.body.style.myCustomProperty should be 1 but instead is undefined.
+PASS: document.body.style.myCustomProperty should be 1 and is.
 PASS: document.styleSheets.myCustomProperty should be 1 and is.
 PASS: document.styleSheets[0].myCustomProperty should be 1 and is.
 PASS: document.styleSheets[0].cssRules.myCustomProperty should be 1 and is.
diff --git a/third_party/WebKit/LayoutTests/fast/encoding/unlabelled-non-ascii-utf8-expected.html b/third_party/WebKit/LayoutTests/fast/encoding/unlabelled-non-ascii-utf8-expected.html
deleted file mode 100644
index 511c0fbc..0000000
--- a/third_party/WebKit/LayoutTests/fast/encoding/unlabelled-non-ascii-utf8-expected.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<title>Unlabelled UTF-8</title>
-<meta charset="utf-8">
-</head>
-<body>
-    <p>UTF-8 page without a proper label. UTF-8 encoding detector
-    should come into action to detect the right encoding, hence
-    all the non-ASCII chars should be rendered as expected without
-    being garbled.</p>
-    <pre>
-        För var vers, jag gör,
-        Lovar du en kyss mig giva;
-        Arket fullt jag borde skriva,
-        Mindre har jag skrivit för.
-        Men man måste hålla måtta,
-        Jag med vers, med kyssar du.
-        Låt mig räkna: Där är sju!
-        En därtill det gör mig åtta.
-
-        Numro åtta är fatal,
-        Greklands sångmör voro nio,
-        Och en svensk därtill gör tio. —
-        Elva var apostelns tal,
-        Ty jag räknar icke Judas,
-        Honom, som i vänners lag
-        Kysste falskt; det gör ej jag,
-        Helst när vackra läppar bjudas.
-
-        Huru står min räkning här?
-        Aderton; det är dock något.
-        Nitton — rimmet gör besvär,
-        Därföre jag fyller tjoget.
-        Strofen är ej full som jag,
-        In i hamnen vill jag styra,
-        Därföre till godo tag
-        Denna gång med tjugofyra.
-
-        'Kyssarna' ('The kisses'), Esaias Tegnér, 1782-1846
-
-        int main(void)
-        {
-          return 0;
-        }
-    </pre>
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/fast/encoding/unlabelled-non-ascii-utf8.html b/third_party/WebKit/LayoutTests/fast/encoding/unlabelled-non-ascii-utf8.html
deleted file mode 100644
index aeddfef..0000000
--- a/third_party/WebKit/LayoutTests/fast/encoding/unlabelled-non-ascii-utf8.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<title>Unlabelled UTF-8</title>
-</head>
-<body>
-    <p>UTF-8 page without a proper label. UTF-8 encoding detector
-    should come into action to detect the right encoding, hence
-    all the non-ASCII chars should be rendered as expected without
-    being garbled.</p>
-    <pre>
-        För var vers, jag gör,
-        Lovar du en kyss mig giva;
-        Arket fullt jag borde skriva,
-        Mindre har jag skrivit för.
-        Men man måste hålla måtta,
-        Jag med vers, med kyssar du.
-        Låt mig räkna: Där är sju!
-        En därtill det gör mig åtta.
-
-        Numro åtta är fatal,
-        Greklands sångmör voro nio,
-        Och en svensk därtill gör tio. —
-        Elva var apostelns tal,
-        Ty jag räknar icke Judas,
-        Honom, som i vänners lag
-        Kysste falskt; det gör ej jag,
-        Helst när vackra läppar bjudas.
-
-        Huru står min räkning här?
-        Aderton; det är dock något.
-        Nitton — rimmet gör besvär,
-        Därföre jag fyller tjoget.
-        Strofen är ej full som jag,
-        In i hamnen vill jag styra,
-        Därföre till godo tag
-        Denna gång med tjugofyra.
-
-        'Kyssarna' ('The kisses'), Esaias Tegnér, 1782-1846
-
-        int main(void)
-        {
-          return 0;
-        }
-    </pre>
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/fast/events/intercept-postmessage-expected.txt b/third_party/WebKit/LayoutTests/fast/events/intercept-postmessage-expected.txt
deleted file mode 100644
index 82863d9..0000000
--- a/third_party/WebKit/LayoutTests/fast/events/intercept-postmessage-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-intercepted postMessage
-intercepted postMessage
-RECV1
-
diff --git a/third_party/WebKit/LayoutTests/fast/events/intercept-postmessage.html b/third_party/WebKit/LayoutTests/fast/events/intercept-postmessage.html
deleted file mode 100644
index 6b3b000..0000000
--- a/third_party/WebKit/LayoutTests/fast/events/intercept-postmessage.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <body><pre id="console"></pre></body>
-  <script>
-    function write(str) {
-      pre = document.getElementById('console');
-      text = document.createTextNode(str + '\n');
-      pre.appendChild(text);
-    }
-
-    function recvMsg1(e) {
-      write("RECV1");
-      window.removeEventListener("message", recvMsg1, false);
-
-      if (window.testRunner)
-        testRunner.interceptPostMessage = true;
-
-      window.addEventListener("message", recvMsg2, false);
-      window.postMessage("Message 2", "*");
-
-      // Ensure that we're intercepting postMessages before the origin check
-      window.postMessage("Message 3", "http://example.org");
-
-      if (window.testRunner) {
-        // We need to call setTimeout here because we intercept the next event.
-        window.setTimeout(function() { testRunner.notifyDone(); });
-      }
-    }
-
-    function recvMsg2(e) {
-      write("RECV2");
-    }
-
-    window.addEventListener("message", recvMsg1, false);
-
-    if (window.testRunner) {
-      window.testRunner.dumpAsText();
-      window.testRunner.waitUntilDone();
-    }
-
-    window.postMessage("Message 1", "*");
-  </script>
-</html>
-
diff --git a/third_party/WebKit/LayoutTests/fast/events/pointerevents/mouse-pointer-event-properties-expected.txt b/third_party/WebKit/LayoutTests/fast/events/pointerevents/mouse-pointer-event-properties-expected.txt
index b9955e4..44c8c66 100644
--- a/third_party/WebKit/LayoutTests/fast/events/pointerevents/mouse-pointer-event-properties-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/events/pointerevents/mouse-pointer-event-properties-expected.txt
@@ -1,16 +1,16 @@
-CONSOLE ERROR: line 67: Uncaught TypeError: Cannot read property 'type' of undefined
-CONSOLE ERROR: line 67: Uncaught TypeError: Cannot read property 'type' of undefined
-CONSOLE ERROR: line 67: Uncaught TypeError: Cannot read property 'type' of undefined
-CONSOLE ERROR: line 67: Uncaught TypeError: Cannot read property 'type' of undefined
-CONSOLE ERROR: line 67: Uncaught TypeError: Cannot read property 'type' of undefined
-CONSOLE ERROR: line 67: Uncaught TypeError: Cannot read property 'type' of undefined
-CONSOLE ERROR: line 67: Uncaught TypeError: Cannot read property 'type' of undefined
-CONSOLE ERROR: line 67: Uncaught TypeError: Cannot read property 'type' of undefined
-CONSOLE ERROR: line 67: Uncaught TypeError: Cannot read property 'type' of undefined
-CONSOLE ERROR: line 67: Uncaught TypeError: Cannot read property 'type' of undefined
-CONSOLE ERROR: line 67: Uncaught TypeError: Cannot read property 'type' of undefined
-CONSOLE ERROR: line 67: Uncaught TypeError: Cannot read property 'type' of undefined
-CONSOLE ERROR: line 67: Uncaught TypeError: Cannot read property 'type' of undefined
+CONSOLE ERROR: line 70: Uncaught TypeError: Cannot read property 'type' of undefined
+CONSOLE ERROR: line 70: Uncaught TypeError: Cannot read property 'type' of undefined
+CONSOLE ERROR: line 70: Uncaught TypeError: Cannot read property 'type' of undefined
+CONSOLE ERROR: line 70: Uncaught TypeError: Cannot read property 'type' of undefined
+CONSOLE ERROR: line 70: Uncaught TypeError: Cannot read property 'type' of undefined
+CONSOLE ERROR: line 70: Uncaught TypeError: Cannot read property 'type' of undefined
+CONSOLE ERROR: line 70: Uncaught TypeError: Cannot read property 'type' of undefined
+CONSOLE ERROR: line 70: Uncaught TypeError: Cannot read property 'type' of undefined
+CONSOLE ERROR: line 70: Uncaught TypeError: Cannot read property 'type' of undefined
+CONSOLE ERROR: line 70: Uncaught TypeError: Cannot read property 'type' of undefined
+CONSOLE ERROR: line 70: Uncaught TypeError: Cannot read property 'type' of undefined
+CONSOLE ERROR: line 70: Uncaught TypeError: Cannot read property 'type' of undefined
+CONSOLE ERROR: line 70: Uncaught TypeError: Cannot read property 'type' of undefined
 Verifies that pointer event parameters are correct when fired for mouse events.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/events/pointerevents/mouse-pointer-event-properties.html b/third_party/WebKit/LayoutTests/fast/events/pointerevents/mouse-pointer-event-properties.html
index 3cff0b4..31d4e3c7 100644
--- a/third_party/WebKit/LayoutTests/fast/events/pointerevents/mouse-pointer-event-properties.html
+++ b/third_party/WebKit/LayoutTests/fast/events/pointerevents/mouse-pointer-event-properties.html
@@ -15,6 +15,7 @@
 <div id="console"></div>
 
 <script>
+window.name = "mainWindow";
 description("Verifies that pointer event parameters are correct when fired for mouse events.");
 
 var testEventList = ["mouseenter", "mouseleave", "mouseover", "mouseout", "mouseup", "mousedown", "mousemove",
@@ -41,6 +42,8 @@
     "button",
     "buttons",
     "pressure",
+    "width",
+    "height",
 ];
 
 function init() {
@@ -80,6 +83,8 @@
             var expectedValue = eval("event." + attribute);
             if (attribute == "button" && event.type != "mousedown" && event.type != "mouseup")
               expectedValue = -1;
+            if (attribute == "width" || attribute == "height")
+              expectedValue = 1;
             if (attribute == "pressure") {
               if (event.buttons == 0)
                 expectedValue = 0.0;
@@ -88,6 +93,7 @@
             }
             shouldBeEqualToNumber("lastPointerEvents[0]." + attribute, expectedValue);
           });
+          shouldBeEqualToString("lastPointerEvents[0].view.name", "mainWindow");
 
         } else {
 
diff --git a/third_party/WebKit/LayoutTests/fast/events/pointerevents/touch-pointer-event-properties.html b/third_party/WebKit/LayoutTests/fast/events/pointerevents/touch-pointer-event-properties.html
index 9ebfd50..61f92f8 100644
--- a/third_party/WebKit/LayoutTests/fast/events/pointerevents/touch-pointer-event-properties.html
+++ b/third_party/WebKit/LayoutTests/fast/events/pointerevents/touch-pointer-event-properties.html
@@ -4,6 +4,7 @@
 <h1>Test that pointer properties propagates from touches to PointerEvents</h1>
 <div id="target0" style="height: 100px;"></div>
 <script>
+window.name = "mainWindow";
 async_test(function() {
   if (!window.eventSender) {
     this.done();
@@ -24,6 +25,7 @@
       var pp = POINTER_PROPERTIES[event.pointerId-1];
       for (var i in pp)
         assert_equals(event[i], pp[i], "" + i);
+      assert_equals(event.view.name, "mainWindow");
     }, "Pointer event properties for pointer " + event.pointerId + " on " + event.type);
   }
   on_event(target0, "pointerdown", this.step_func(checkPointerEvent));
diff --git a/third_party/WebKit/LayoutTests/fast/repaint/resources/text-based-repaint.js b/third_party/WebKit/LayoutTests/fast/repaint/resources/text-based-repaint.js
index a24d0de..bec96ab 100644
--- a/third_party/WebKit/LayoutTests/fast/repaint/resources/text-based-repaint.js
+++ b/third_party/WebKit/LayoutTests/fast/repaint/resources/text-based-repaint.js
@@ -15,12 +15,6 @@
         return;
     }
 
-    // TODO(enne): this is a workaround for multiple svg onload events.
-    // See: http://crbug.com/372946
-    if (window.hasRunRepaintTest)
-        return;
-    window.hasRunRepaintTest = true;
-
     if (window.enablePixelTesting)
         testRunner.dumpAsTextWithPixelResults();
     else
diff --git a/third_party/WebKit/LayoutTests/fast/text/hyphens/hyphens-auto-mock-expected.html b/third_party/WebKit/LayoutTests/fast/text/hyphens/hyphens-auto-mock-expected.html
new file mode 100644
index 0000000..fb98853
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/text/hyphens/hyphens-auto-mock-expected.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<style>
+div {
+  border: thin solid black;
+  display: inline-block;
+  font-family: 'Courier New';
+  vertical-align: top;
+  min-width: 11ch;
+}
+
+span {
+  border: thin solid black;
+  display: block;
+}
+
+img {
+  width: 1em;
+  height: 1em;
+  background-color: blue;
+}
+</style>
+<script>
+if (window.internals)
+  internals.setMockHyphenation('en-us');
+</script>
+<div lang="en-us">
+  <div>
+    <span style="width: 2ch;">hyphenation</span>
+    <span style="width: 3.1ch;">hyphenation</span>
+    <span style="width: 4ch;">hyphenation</span>
+    <span style="width: 5.1ch;">hyphenation</span>
+    <span style="width: 6ch;">hyphenation</span>
+    <span style="width: 7.1ch;">hyphenation</span>
+    <span style="width: 8ch;">hyphenation</span>
+    <span style="width: 9ch;">hyphenation</span>
+    <span style="width: 10ch;">hyphenation</span>
+    <span style="width: 11ch;">hyphenation</span>
+  </div>
+  <div>
+    <span style="width: 2ch;">hyphenation<img></span>
+    <span style="width: 3.1ch;">hy-<br>phenation<img></span>
+    <span style="width: 4ch;">hy-<br>phenation<img></span>
+    <span style="width: 5.1ch;">hy-<br>phen-<br>ation<img></span>
+    <span style="width: 6ch;">hy-<br>phen-<br>ation<img></span>
+    <span style="width: 7.1ch;">hyphen-<br>ation<img></span>
+    <span style="width: 8ch;">hyphen-<br>ation<img></span>
+    <span style="width: 9ch;">hyphen-<br>ation<img></span>
+    <span style="width: 10ch;">hyphen-<br>ation<img></span>
+    <span style="width: 11ch;">hyphenation<img></span>
+  </div>
+  <div>
+    <span style="width: 2ch;">hyphenation test</span>
+    <span style="width: 3.1ch;">hy-<br>phenation test</span>
+    <span style="width: 4ch;">hy-<br>phenation test</span>
+    <span style="width: 5.1ch;">hy-<br>phen-<br>ation test</span>
+    <span style="width: 6ch;">hy-<br>phen-<br>ation test</span>
+    <span style="width: 7.1ch;">hyphen-<br>ation test</span>
+    <span style="width: 8ch;">hyphen-<br>ation test</span>
+    <span style="width: 9ch;">hyphen-<br>ation test</span>
+    <span style="width: 10ch;">hyphen-<br>ation test</span>
+    <span style="width: 11ch;">hyphenation test</span>
+  </div>
+  <div>
+    <span style="width: 2ch;">a hyphenation test</span>
+    <span style="width: 3.1ch;">a hy-<br>phenation test</span>
+    <span style="width: 4ch;">a hy-<br>phenation test</span>
+    <span style="width: 5.1ch;">a hy-<br>phen-<br>ation test</span>
+    <span style="width: 6ch;">a hy-<br>phen-<br>ation test</span>
+    <span style="width: 7.1ch;">a hy-<br>phen-<br>ation test</span>
+  </div>
+  <div>
+    <span style="width: 8ch;">a hy-<br>phen-<br>ation test</span>
+    <span style="width: 9.1ch;">a hyphen-<br>ation test</span>
+    <span style="width: 10ch;">a hyphen-<br>ation test</span>
+    <span style="width: 11ch;">a hyphen-<br>ation test</span>
+    <span style="width: 12ch;">a hyphen-<br>ation test</span>
+    <span style="width: 13.1ch;">a hyphenation test</span>
+  </div>
+</div>
diff --git a/third_party/WebKit/LayoutTests/fast/text/hyphens/hyphens-auto-mock.html b/third_party/WebKit/LayoutTests/fast/text/hyphens/hyphens-auto-mock.html
new file mode 100644
index 0000000..be7e4d7a
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/text/hyphens/hyphens-auto-mock.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html>
+<style>
+div {
+  border: thin solid black;
+  display: inline-block;
+  font-family: 'Courier New';
+  -webkit-hyphens: auto;
+  hyphens: auto;
+  vertical-align: top;
+  min-width: 11ch;
+}
+
+span {
+  border: thin solid black;
+  display: block;
+}
+
+img {
+  width: 1em;
+  height: 1em;
+  background-color: blue;
+}
+</style>
+<script>
+if (window.internals)
+  internals.setMockHyphenation('en-us');
+</script>
+<div lang="en-us">
+  <div>
+    <span style="width: 2ch;">hyphenation</span>
+    <span style="width: 3.1ch;">hyphenation</span>
+    <span style="width: 4ch;">hyphenation</span>
+    <span style="width: 5.1ch;">hyphenation</span>
+    <span style="width: 6ch;">hyphenation</span>
+    <span style="width: 7.1ch;">hyphenation</span>
+    <span style="width: 8ch;">hyphenation</span>
+    <span style="width: 9ch;">hyphenation</span>
+    <span style="width: 10ch;">hyphenation</span>
+    <span style="width: 11ch;">hyphenation</span>
+  </div>
+  <div>
+    <span style="width: 2ch;">hyphenation<img></span>
+    <span style="width: 3.1ch;">hyphenation<img></span>
+    <span style="width: 4ch;">hyphenation<img></span>
+    <span style="width: 5.1ch;">hyphenation<img></span>
+    <span style="width: 6ch;">hyphenation<img></span>
+    <span style="width: 7.1ch;">hyphenation<img></span>
+    <span style="width: 8ch;">hyphenation<img></span>
+    <span style="width: 9ch;">hyphenation<img></span>
+    <span style="width: 10ch;">hyphenation<img></span>
+    <span style="width: 11ch;">hyphenation<img></span>
+  </div>
+  <div>
+    <span style="width: 2ch;">hyphenation test</span>
+    <span style="width: 3.1ch;">hyphenation test</span>
+    <span style="width: 4ch;">hyphenation test</span>
+    <span style="width: 5.1ch;">hyphenation test</span>
+    <span style="width: 6ch;">hyphenation test</span>
+    <span style="width: 7.1ch;">hyphenation test</span>
+    <span style="width: 8ch;">hyphenation test</span>
+    <span style="width: 9ch;">hyphenation test</span>
+    <span style="width: 10ch;">hyphenation test</span>
+    <span style="width: 11ch;">hyphenation test</span>
+  </div>
+  <div>
+    <span style="width: 2ch;">a hyphenation test</span>
+    <span style="width: 3.1ch;">a hyphenation test</span>
+    <span style="width: 4ch;">a hyphenation test</span>
+    <span style="width: 5.1ch;">a hyphenation test</span>
+    <span style="width: 6ch;">a hyphenation test</span>
+    <span style="width: 7.1ch;">a hyphenation test</span>
+  </div>
+  <div>
+    <span style="width: 8ch;">a hyphenation test</span>
+    <span style="width: 9.1ch;">a hyphenation test</span>
+    <span style="width: 10ch;">a hyphenation test</span>
+    <span style="width: 11ch;">a hyphenation test</span>
+    <span style="width: 12ch;">a hyphenation test</span>
+    <span style="width: 13.1ch;">a hyphenation test</span>
+  </div>
+</div>
diff --git a/third_party/WebKit/LayoutTests/fast/text/hyphens/hyphens-locale-expected.html b/third_party/WebKit/LayoutTests/fast/text/hyphens/hyphens-locale-expected.html
new file mode 100644
index 0000000..3ba5174
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/text/hyphens/hyphens-locale-expected.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<style>
+div {
+  font-family: 'Courier New';
+}
+
+span {
+  border: thin solid black;
+  display: block;
+  width: 8ch;
+}
+</style>
+<div lang="en-us">
+  <span>a hy-<br>phen-<br>ation a</span>
+</div>
+<div lang="ja-jp">
+  <span>a hyphenation a</span>
+</div>
diff --git a/third_party/WebKit/LayoutTests/fast/text/hyphens/hyphens-locale.html b/third_party/WebKit/LayoutTests/fast/text/hyphens/hyphens-locale.html
new file mode 100644
index 0000000..8ad04423
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/text/hyphens/hyphens-locale.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<style>
+div {
+  font-family: 'Courier New';
+  -webkit-hyphens: auto;
+  hyphens: auto;
+}
+
+span {
+  border: thin solid black;
+  display: block;
+  width: 8ch;
+}
+</style>
+<script>
+if (window.internals)
+  internals.setMockHyphenation('en-us');
+</script>
+<div lang="en-us">
+  <span>a hyphenation a</span>
+</div>
+<div lang="ja-jp">
+  <span>a hyphenation a</span>
+</div>
diff --git a/third_party/WebKit/LayoutTests/fast/text/hyphens/hyphens-none-expected.html b/third_party/WebKit/LayoutTests/fast/text/hyphens/hyphens-none-expected.html
new file mode 100644
index 0000000..89abf20
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/text/hyphens/hyphens-none-expected.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<style>
+div {
+  font-family: 'Courier New';
+}
+
+span {
+  border: thin solid black;
+  display: block;
+  width: 5ch;
+}
+</style>
+<div lang="en-us">
+  <div>
+    <span>hy-<br>phen-<br>ation</span>
+  </div>
+  <div>
+    <span>hyphenation</span>
+  </div>
+</div>
diff --git a/third_party/WebKit/LayoutTests/fast/text/hyphens/hyphens-none.html b/third_party/WebKit/LayoutTests/fast/text/hyphens/hyphens-none.html
new file mode 100644
index 0000000..914fc9c8
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/text/hyphens/hyphens-none.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<style>
+div {
+  font-family: 'Courier New';
+}
+
+.no-hyphens {
+  -webkit-hyphens: none;
+  hyphens: none;
+}
+
+span {
+  border: thin solid black;
+  display: block;
+  width: 5ch;
+}
+</style>
+<div lang="en-us">
+  <div>
+    <span>hy&shy;phen&shy;ation</span>
+  </div>
+  <div class="no-hyphens">
+    <span>hy&shy;phen&shy;ation</span>
+  </div>
+</div>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/response-stream-construction.js b/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/response-stream-construction.js
index 40b4da7..86d51ba 100644
--- a/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/response-stream-construction.js
+++ b/third_party/WebKit/LayoutTests/http/tests/fetch/script-tests/response-stream-construction.js
@@ -11,8 +11,7 @@
     var stream = new ReadableStream({start: c => controller = c});
 
     var response = new Response(stream);
-    // TODO(yhirano): This should be assert_equals.
-    assert_not_equals(response.body, stream);
+    assert_equals(response.body, stream);
   }, 'Response constructed with a stream');
 
 promise_test(() => {
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/service-workers/service-workers-test.js b/third_party/WebKit/LayoutTests/http/tests/inspector/service-workers/service-workers-test.js
index 5adbb5e..4d236ae3 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/service-workers/service-workers-test.js
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/service-workers/service-workers-test.js
@@ -37,7 +37,7 @@
 InspectorTest.dumpServiceWorkersView = function()
 {
     var swView = WebInspector.panels.resources.visibleView;
-    return swView._reportView._sectionList.childTextNodes().map(function(node) { return node.textContent.replace(/Last modified.*/, "Last modified").replace(/#\d+/, "#N"); }).join("\n");
+    return swView._reportView._sectionList.childTextNodes().map(function(node) { return node.textContent.replace(/Received.*/, "Received").replace(/#\d+/, "#N"); }).join("\n");
 }
 
 InspectorTest.deleteServiceWorkerRegistration = function(scope)
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/service-workers/service-workers-view-expected.txt b/third_party/WebKit/LayoutTests/http/tests/inspector/service-workers/service-workers-view-expected.txt
index 944865a1..ca5624be3 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/service-workers/service-workers-view-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/service-workers/service-workers-view-expected.txt
@@ -8,7 +8,7 @@
 Unregister
 Source
 service-worker-empty.js
-Last modified
+Received
 Status
 #N activated and is running
 stop
@@ -24,7 +24,7 @@
 Unregister
 Source
 service-worker-empty.js
-Last modified
+Received
 Status
 #N activated and is running
 stop
@@ -39,7 +39,7 @@
 Unregister
 Source
 service-worker-empty.js
-Last modified
+Received
 Status
 #N activated and is running
 stop
@@ -55,7 +55,7 @@
 Unregister
 Source
 service-worker-empty.js
-Last modified
+Received
 Status
 Clients
 Errors
@@ -68,7 +68,7 @@
 Unregister
 Source
 service-worker-empty.js
-Last modified
+Received
 Status
 #N activated and is running
 stop
diff --git a/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/semantics/interfaces-expected.txt b/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/semantics/interfaces-expected.txt
index 8806f78..f3b1bb9 100644
--- a/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/semantics/interfaces-expected.txt
+++ b/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/semantics/interfaces-expected.txt
@@ -293,7 +293,6 @@
 PASS Interfaces for WBR 
 PASS Interfaces for xmp 
 PASS Interfaces for XMP 
-FAIL Interfaces for å-bar assert_equals: Element å-bar should have HTMLUnknownElement as its primary interface. expected "[object HTMLUnknownElement]" but got "[object HTMLElement]"
-FAIL Interfaces for Å-BAR assert_equals: Element Å-BAR should have HTMLUnknownElement as its primary interface. expected "[object HTMLUnknownElement]" but got "[object HTMLElement]"
+FAIL Interfaces for Ã¥-bar Failed to execute 'createElementNS' on 'Document': The qualified name provided ('Ã¥-bar') contains the invalid character '¥'.
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/spv2/resources/paint-invalidation-test.js b/third_party/WebKit/LayoutTests/paint/invalidation/spv2/resources/paint-invalidation-test.js
index a2d5f7c..7e616ff 100644
--- a/third_party/WebKit/LayoutTests/paint/invalidation/spv2/resources/paint-invalidation-test.js
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/spv2/resources/paint-invalidation-test.js
@@ -15,12 +15,6 @@
         return;
     }
 
-    // TODO(enne): this is a workaround for multiple svg onload events.
-    // See: http://crbug.com/372946
-    if (window.hasRunPaintInvalidationTest)
-        return;
-    window.hasRunPaintInvalidationTest = true;
-
     testRunner.layoutAndPaintAsyncThen(function()
     {
         window.internals.startTrackingPaintInvalidationObjects();
diff --git a/third_party/WebKit/LayoutTests/platform/android/imported/web-platform-tests/html/semantics/interfaces-expected.txt b/third_party/WebKit/LayoutTests/platform/android/imported/web-platform-tests/html/semantics/interfaces-expected.txt
new file mode 100644
index 0000000..8806f78
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/android/imported/web-platform-tests/html/semantics/interfaces-expected.txt
@@ -0,0 +1,299 @@
+CONSOLE WARNING: The <keygen> element is deprecated and will be removed in M54, around October 2016. See https://www.chromestatus.com/features/5716060992962560 for more details.
+This is a testharness.js-based test.
+PASS Interfaces for a 
+PASS Interfaces for A 
+PASS Interfaces for abbr 
+PASS Interfaces for ABBR 
+PASS Interfaces for acronym 
+PASS Interfaces for ACRONYM 
+PASS Interfaces for address 
+PASS Interfaces for ADDRESS 
+FAIL Interfaces for applet assert_equals: Element applet should have HTMLAppletElement as its primary interface. expected "[object HTMLAppletElement]" but got "[object HTMLUnknownElement]"
+FAIL Interfaces for APPLET assert_equals: Element APPLET should have HTMLAppletElement as its primary interface. expected "[object HTMLAppletElement]" but got "[object HTMLUnknownElement]"
+PASS Interfaces for area 
+PASS Interfaces for AREA 
+PASS Interfaces for article 
+PASS Interfaces for ARTICLE 
+PASS Interfaces for aside 
+PASS Interfaces for ASIDE 
+PASS Interfaces for audio 
+PASS Interfaces for AUDIO 
+PASS Interfaces for b 
+PASS Interfaces for B 
+PASS Interfaces for base 
+PASS Interfaces for BASE 
+PASS Interfaces for basefont 
+PASS Interfaces for BASEFONT 
+PASS Interfaces for bdi 
+PASS Interfaces for BDI 
+PASS Interfaces for bdo 
+PASS Interfaces for BDO 
+PASS Interfaces for bgsound 
+PASS Interfaces for BGSOUND 
+PASS Interfaces for big 
+PASS Interfaces for BIG 
+PASS Interfaces for blink 
+PASS Interfaces for BLINK 
+PASS Interfaces for blockquote 
+PASS Interfaces for BLOCKQUOTE 
+PASS Interfaces for body 
+PASS Interfaces for BODY 
+PASS Interfaces for br 
+PASS Interfaces for BR 
+PASS Interfaces for button 
+PASS Interfaces for BUTTON 
+PASS Interfaces for canvas 
+PASS Interfaces for CANVAS 
+PASS Interfaces for caption 
+PASS Interfaces for CAPTION 
+PASS Interfaces for center 
+PASS Interfaces for CENTER 
+PASS Interfaces for cite 
+PASS Interfaces for CITE 
+PASS Interfaces for code 
+PASS Interfaces for CODE 
+PASS Interfaces for col 
+PASS Interfaces for COL 
+PASS Interfaces for colgroup 
+PASS Interfaces for COLGROUP 
+FAIL Interfaces for command assert_equals: Element command should have HTMLUnknownElement as its primary interface. expected "[object HTMLUnknownElement]" but got "[object HTMLElement]"
+FAIL Interfaces for COMMAND assert_equals: Element COMMAND should have HTMLUnknownElement as its primary interface. expected "[object HTMLUnknownElement]" but got "[object HTMLElement]"
+FAIL Interfaces for data assert_equals: Element data should have HTMLDataElement as its primary interface. expected "[object HTMLDataElement]" but got "[object HTMLUnknownElement]"
+FAIL Interfaces for DATA assert_equals: Element DATA should have HTMLDataElement as its primary interface. expected "[object HTMLDataElement]" but got "[object HTMLUnknownElement]"
+PASS Interfaces for datalist 
+PASS Interfaces for DATALIST 
+PASS Interfaces for dd 
+PASS Interfaces for DD 
+PASS Interfaces for del 
+PASS Interfaces for DEL 
+PASS Interfaces for details 
+PASS Interfaces for DETAILS 
+PASS Interfaces for dfn 
+PASS Interfaces for DFN 
+PASS Interfaces for dialog 
+PASS Interfaces for DIALOG 
+PASS Interfaces for dir 
+PASS Interfaces for DIR 
+PASS Interfaces for directory 
+PASS Interfaces for DIRECTORY 
+PASS Interfaces for div 
+PASS Interfaces for DIV 
+PASS Interfaces for dl 
+PASS Interfaces for DL 
+PASS Interfaces for dt 
+PASS Interfaces for DT 
+PASS Interfaces for em 
+PASS Interfaces for EM 
+PASS Interfaces for embed 
+PASS Interfaces for EMBED 
+PASS Interfaces for fieldset 
+PASS Interfaces for FIELDSET 
+PASS Interfaces for figcaption 
+PASS Interfaces for FIGCAPTION 
+PASS Interfaces for figure 
+PASS Interfaces for FIGURE 
+PASS Interfaces for font 
+PASS Interfaces for FONT 
+FAIL Interfaces for foo-BAR assert_equals: Element foo-BAR should have HTMLUnknownElement as its primary interface. expected "[object HTMLUnknownElement]" but got "[object HTMLElement]"
+PASS Interfaces for foo-bar 
+PASS Interfaces for FOO-BAR 
+PASS Interfaces for foo 
+PASS Interfaces for FOO 
+PASS Interfaces for footer 
+PASS Interfaces for FOOTER 
+PASS Interfaces for form 
+PASS Interfaces for FORM 
+PASS Interfaces for frame 
+PASS Interfaces for FRAME 
+PASS Interfaces for frameset 
+PASS Interfaces for FRAMESET 
+PASS Interfaces for h1 
+PASS Interfaces for H1 
+PASS Interfaces for h2 
+PASS Interfaces for H2 
+PASS Interfaces for h3 
+PASS Interfaces for H3 
+PASS Interfaces for h4 
+PASS Interfaces for H4 
+PASS Interfaces for h5 
+PASS Interfaces for H5 
+PASS Interfaces for h6 
+PASS Interfaces for H6 
+PASS Interfaces for head 
+PASS Interfaces for HEAD 
+PASS Interfaces for header 
+PASS Interfaces for HEADER 
+PASS Interfaces for hgroup 
+PASS Interfaces for HGROUP 
+PASS Interfaces for hr 
+PASS Interfaces for HR 
+PASS Interfaces for html 
+PASS Interfaces for HTML 
+PASS Interfaces for i 
+PASS Interfaces for I 
+PASS Interfaces for iframe 
+PASS Interfaces for IFRAME 
+PASS Interfaces for image 
+PASS Interfaces for IMAGE 
+PASS Interfaces for img 
+PASS Interfaces for IMG 
+PASS Interfaces for input 
+PASS Interfaces for INPUT 
+PASS Interfaces for ins 
+PASS Interfaces for INS 
+PASS Interfaces for isindex 
+PASS Interfaces for ISINDEX 
+PASS Interfaces for kbd 
+PASS Interfaces for KBD 
+PASS Interfaces for keygen 
+PASS Interfaces for KEYGEN 
+PASS Interfaces for label 
+PASS Interfaces for LABEL 
+PASS Interfaces for legend 
+PASS Interfaces for LEGEND 
+PASS Interfaces for li 
+PASS Interfaces for LI 
+PASS Interfaces for link 
+PASS Interfaces for LINK 
+PASS Interfaces for listing 
+PASS Interfaces for LISTING 
+PASS Interfaces for main 
+PASS Interfaces for MAIN 
+PASS Interfaces for map 
+PASS Interfaces for MAP 
+PASS Interfaces for mark 
+PASS Interfaces for MARK 
+PASS Interfaces for marquee 
+PASS Interfaces for MARQUEE 
+PASS Interfaces for menu 
+PASS Interfaces for MENU 
+PASS Interfaces for menuitem 
+PASS Interfaces for MENUITEM 
+PASS Interfaces for meta 
+PASS Interfaces for META 
+PASS Interfaces for meter 
+PASS Interfaces for METER 
+PASS Interfaces for mod 
+PASS Interfaces for MOD 
+PASS Interfaces for multicol 
+PASS Interfaces for MULTICOL 
+PASS Interfaces for nav 
+PASS Interfaces for NAV 
+PASS Interfaces for nextid 
+PASS Interfaces for NEXTID 
+PASS Interfaces for nobr 
+PASS Interfaces for NOBR 
+PASS Interfaces for noembed 
+PASS Interfaces for NOEMBED 
+PASS Interfaces for noframes 
+PASS Interfaces for NOFRAMES 
+PASS Interfaces for noscript 
+PASS Interfaces for NOSCRIPT 
+PASS Interfaces for object 
+PASS Interfaces for OBJECT 
+PASS Interfaces for ol 
+PASS Interfaces for OL 
+PASS Interfaces for optgroup 
+PASS Interfaces for OPTGROUP 
+PASS Interfaces for option 
+PASS Interfaces for OPTION 
+PASS Interfaces for output 
+PASS Interfaces for OUTPUT 
+PASS Interfaces for p 
+PASS Interfaces for P 
+PASS Interfaces for param 
+PASS Interfaces for PARAM 
+PASS Interfaces for picture 
+PASS Interfaces for PICTURE 
+PASS Interfaces for plaintext 
+PASS Interfaces for PLAINTEXT 
+PASS Interfaces for pre 
+PASS Interfaces for PRE 
+PASS Interfaces for progress 
+PASS Interfaces for PROGRESS 
+PASS Interfaces for q 
+PASS Interfaces for Q 
+PASS Interfaces for quasit 
+PASS Interfaces for QUASIT 
+PASS Interfaces for rb 
+PASS Interfaces for RB 
+PASS Interfaces for rp 
+PASS Interfaces for RP 
+PASS Interfaces for rt 
+PASS Interfaces for RT 
+PASS Interfaces for rtc 
+PASS Interfaces for RTC 
+PASS Interfaces for ruby 
+PASS Interfaces for RUBY 
+PASS Interfaces for s 
+PASS Interfaces for S 
+PASS Interfaces for samp 
+PASS Interfaces for SAMP 
+PASS Interfaces for script 
+PASS Interfaces for SCRIPT 
+PASS Interfaces for section 
+PASS Interfaces for SECTION 
+PASS Interfaces for select 
+PASS Interfaces for SELECT 
+PASS Interfaces for slot 
+PASS Interfaces for SLOT 
+PASS Interfaces for small 
+PASS Interfaces for SMALL 
+PASS Interfaces for source 
+PASS Interfaces for SOURCE 
+PASS Interfaces for spacer 
+PASS Interfaces for SPACER 
+PASS Interfaces for span 
+PASS Interfaces for SPAN 
+PASS Interfaces for strike 
+PASS Interfaces for STRIKE 
+PASS Interfaces for strong 
+PASS Interfaces for STRONG 
+PASS Interfaces for style 
+PASS Interfaces for STYLE 
+PASS Interfaces for sub 
+PASS Interfaces for SUB 
+PASS Interfaces for summary 
+PASS Interfaces for SUMMARY 
+PASS Interfaces for sup 
+PASS Interfaces for SUP 
+PASS Interfaces for table 
+PASS Interfaces for TABLE 
+PASS Interfaces for tbody 
+PASS Interfaces for TBODY 
+PASS Interfaces for td 
+PASS Interfaces for TD 
+PASS Interfaces for textarea 
+PASS Interfaces for TEXTAREA 
+PASS Interfaces for tfoot 
+PASS Interfaces for TFOOT 
+PASS Interfaces for th 
+PASS Interfaces for TH 
+PASS Interfaces for thead 
+PASS Interfaces for THEAD 
+FAIL Interfaces for time assert_equals: Element time should have HTMLTimeElement as its primary interface. expected "[object HTMLTimeElement]" but got "[object HTMLUnknownElement]"
+FAIL Interfaces for TIME assert_equals: Element TIME should have HTMLTimeElement as its primary interface. expected "[object HTMLTimeElement]" but got "[object HTMLUnknownElement]"
+PASS Interfaces for title 
+PASS Interfaces for TITLE 
+PASS Interfaces for tr 
+PASS Interfaces for TR 
+PASS Interfaces for track 
+PASS Interfaces for TRACK 
+PASS Interfaces for tt 
+PASS Interfaces for TT 
+PASS Interfaces for u 
+PASS Interfaces for U 
+PASS Interfaces for ul 
+PASS Interfaces for UL 
+PASS Interfaces for var 
+PASS Interfaces for VAR 
+PASS Interfaces for video 
+PASS Interfaces for VIDEO 
+PASS Interfaces for wbr 
+PASS Interfaces for WBR 
+PASS Interfaces for xmp 
+PASS Interfaces for XMP 
+FAIL Interfaces for å-bar assert_equals: Element å-bar should have HTMLUnknownElement as its primary interface. expected "[object HTMLUnknownElement]" but got "[object HTMLElement]"
+FAIL Interfaces for Å-BAR assert_equals: Element Å-BAR should have HTMLUnknownElement as its primary interface. expected "[object HTMLUnknownElement]" but got "[object HTMLElement]"
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/oilpan/fast/dom/StyleSheet/detached-parent-rule-without-wrapper-expected.txt b/third_party/WebKit/LayoutTests/platform/oilpan/fast/dom/StyleSheet/detached-parent-rule-without-wrapper-expected.txt
deleted file mode 100644
index 6131bb1..0000000
--- a/third_party/WebKit/LayoutTests/platform/oilpan/fast/dom/StyleSheet/detached-parent-rule-without-wrapper-expected.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-Test that CSS stylesheets lacking wrappers are pruned from detached CSSOM subtrees. This is surprising behavior, but it's a very rare situation, and the behavior actually matches what both WebKit and Gecko do for DOM nodes in detached subtrees.
-
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-
-PASS getMatchedCSSRules(document.getElementById("test")).length is 1
-Removing <style>...
-FAIL rule.parentRule should be null. Was [object CSSMediaRule].
-PASS getMatchedCSSRules(document.getElementById("test")) is null
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
diff --git a/third_party/WebKit/LayoutTests/platform/oilpan/fast/dom/StyleSheet/gc-parent-rule-expected.txt b/third_party/WebKit/LayoutTests/platform/oilpan/fast/dom/StyleSheet/gc-parent-rule-expected.txt
deleted file mode 100644
index 817c121b..0000000
--- a/third_party/WebKit/LayoutTests/platform/oilpan/fast/dom/StyleSheet/gc-parent-rule-expected.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-CONSOLE WARNING: 'DOMImplementation.createCSSStyleSheet()' is deprecated.
-Test that CSS rules don't lose custom properties on GC when only reachable through child rules.
-
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-
-FAIL rule.parentRule.foo should be bar (of type string). Was undefined (of type undefined).
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
diff --git a/third_party/WebKit/LayoutTests/virtual/pointerevent/fast/events/pointerevents/mouse-pointer-event-properties-expected.txt b/third_party/WebKit/LayoutTests/virtual/pointerevent/fast/events/pointerevents/mouse-pointer-event-properties-expected.txt
index 90d2a00..3a62de1 100644
--- a/third_party/WebKit/LayoutTests/virtual/pointerevent/fast/events/pointerevents/mouse-pointer-event-properties-expected.txt
+++ b/third_party/WebKit/LayoutTests/virtual/pointerevent/fast/events/pointerevents/mouse-pointer-event-properties-expected.txt
@@ -31,6 +31,9 @@
 PASS lastPointerEvents[0].button is -1
 PASS lastPointerEvents[0].buttons is 0
 PASS lastPointerEvents[0].pressure is 0
+PASS lastPointerEvents[0].width is 1
+PASS lastPointerEvents[0].height is 1
+PASS lastPointerEvents[0].view.name is "mainWindow"
 Received mouseenter
 PASS lastPointerEvents.length is 1
 PASS lastPointerEvents[0].type is "pointerenter"
@@ -56,6 +59,9 @@
 PASS lastPointerEvents[0].button is -1
 PASS lastPointerEvents[0].buttons is 0
 PASS lastPointerEvents[0].pressure is 0
+PASS lastPointerEvents[0].width is 1
+PASS lastPointerEvents[0].height is 1
+PASS lastPointerEvents[0].view.name is "mainWindow"
 Received pointermove
 Received mousemove
 PASS lastPointerEvents.length is 1
@@ -82,6 +88,9 @@
 PASS lastPointerEvents[0].button is -1
 PASS lastPointerEvents[0].buttons is 0
 PASS lastPointerEvents[0].pressure is 0
+PASS lastPointerEvents[0].width is 1
+PASS lastPointerEvents[0].height is 1
+PASS lastPointerEvents[0].view.name is "mainWindow"
 
 --- move within target ---
 Received pointermove
@@ -110,6 +119,9 @@
 PASS lastPointerEvents[0].button is -1
 PASS lastPointerEvents[0].buttons is 0
 PASS lastPointerEvents[0].pressure is 0
+PASS lastPointerEvents[0].width is 1
+PASS lastPointerEvents[0].height is 1
+PASS lastPointerEvents[0].view.name is "mainWindow"
 Received pointermove
 Received mousemove
 PASS lastPointerEvents.length is 1
@@ -136,6 +148,9 @@
 PASS lastPointerEvents[0].button is -1
 PASS lastPointerEvents[0].buttons is 0
 PASS lastPointerEvents[0].pressure is 0
+PASS lastPointerEvents[0].width is 1
+PASS lastPointerEvents[0].height is 1
+PASS lastPointerEvents[0].view.name is "mainWindow"
 
 --- click each button ---
 Received pointerdown
@@ -164,6 +179,9 @@
 PASS lastPointerEvents[0].button is 0
 PASS lastPointerEvents[0].buttons is 1
 PASS lastPointerEvents[0].pressure is 0.5
+PASS lastPointerEvents[0].width is 1
+PASS lastPointerEvents[0].height is 1
+PASS lastPointerEvents[0].view.name is "mainWindow"
 Received pointerup
 Received mouseup
 PASS lastPointerEvents.length is 1
@@ -190,6 +208,9 @@
 PASS lastPointerEvents[0].button is 0
 PASS lastPointerEvents[0].buttons is 0
 PASS lastPointerEvents[0].pressure is 0
+PASS lastPointerEvents[0].width is 1
+PASS lastPointerEvents[0].height is 1
+PASS lastPointerEvents[0].view.name is "mainWindow"
 Received pointerdown
 Received mousedown
 PASS lastPointerEvents.length is 1
@@ -216,6 +237,9 @@
 PASS lastPointerEvents[0].button is 1
 PASS lastPointerEvents[0].buttons is 4
 PASS lastPointerEvents[0].pressure is 0.5
+PASS lastPointerEvents[0].width is 1
+PASS lastPointerEvents[0].height is 1
+PASS lastPointerEvents[0].view.name is "mainWindow"
 Received pointerup
 Received mouseup
 PASS lastPointerEvents.length is 1
@@ -242,6 +266,9 @@
 PASS lastPointerEvents[0].button is 1
 PASS lastPointerEvents[0].buttons is 0
 PASS lastPointerEvents[0].pressure is 0
+PASS lastPointerEvents[0].width is 1
+PASS lastPointerEvents[0].height is 1
+PASS lastPointerEvents[0].view.name is "mainWindow"
 Received pointerdown
 Received mousedown
 PASS lastPointerEvents.length is 1
@@ -268,6 +295,9 @@
 PASS lastPointerEvents[0].button is 2
 PASS lastPointerEvents[0].buttons is 2
 PASS lastPointerEvents[0].pressure is 0.5
+PASS lastPointerEvents[0].width is 1
+PASS lastPointerEvents[0].height is 1
+PASS lastPointerEvents[0].view.name is "mainWindow"
 Received pointerup
 Received mouseup
 PASS lastPointerEvents.length is 1
@@ -294,6 +324,9 @@
 PASS lastPointerEvents[0].button is 2
 PASS lastPointerEvents[0].buttons is 0
 PASS lastPointerEvents[0].pressure is 0
+PASS lastPointerEvents[0].width is 1
+PASS lastPointerEvents[0].height is 1
+PASS lastPointerEvents[0].view.name is "mainWindow"
 
 --- click with each modifier ---
 Received pointerdown
@@ -605,6 +638,9 @@
 PASS lastPointerEvents[0].button is -1
 PASS lastPointerEvents[0].buttons is 0
 PASS lastPointerEvents[0].pressure is 0
+PASS lastPointerEvents[0].width is 1
+PASS lastPointerEvents[0].height is 1
+PASS lastPointerEvents[0].view.name is "mainWindow"
 Received mouseleave
 PASS lastPointerEvents.length is 1
 PASS lastPointerEvents[0].type is "pointerleave"
@@ -630,6 +666,9 @@
 PASS lastPointerEvents[0].button is -1
 PASS lastPointerEvents[0].buttons is 0
 PASS lastPointerEvents[0].pressure is 0
+PASS lastPointerEvents[0].width is 1
+PASS lastPointerEvents[0].height is 1
+PASS lastPointerEvents[0].view.name is "mainWindow"
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/virtual/pointerevent/fast/events/pointerevents/pointer-event-properties-in-iframe-expected.txt b/third_party/WebKit/LayoutTests/virtual/pointerevent/fast/events/pointerevents/pointer-event-properties-in-iframe-expected.txt
index 9eeb66f..6851555 100644
--- a/third_party/WebKit/LayoutTests/virtual/pointerevent/fast/events/pointerevents/pointer-event-properties-in-iframe-expected.txt
+++ b/third_party/WebKit/LayoutTests/virtual/pointerevent/fast/events/pointerevents/pointer-event-properties-in-iframe-expected.txt
@@ -12,18 +12,21 @@
 pointermove of mouse is recieved:
 clientX = 150
 clientY = 100
+view.name = innerFrame
 mousemove is recieved:
 clientX = 150
 clientY = 100
 pointerdown of mouse is recieved:
 clientX = 150
 clientY = 100
+view.name = innerFrame
 mousedown is recieved:
 clientX = 150
 clientY = 100
 pointerup of mouse is recieved:
 clientX = 150
 clientY = 100
+view.name = innerFrame
 mouseup is recieved:
 clientX = 150
 clientY = 100
@@ -31,18 +34,21 @@
 pointerdown of touch is recieved:
 clientX = 150
 clientY = 100
+view.name = innerFrame
 touchstart is recieved:
 clientX = 150
 clientY = 100
 pointermove of touch is recieved:
 clientX = 150
 clientY = 100
+view.name = innerFrame
 touchmove is recieved:
 clientX = 150
 clientY = 100
 pointerup of touch is recieved:
 clientX = 150
 clientY = 100
+view.name = innerFrame
 touchend is recieved:
 clientX = 150
 clientY = 100
@@ -52,18 +58,21 @@
 pointermove of mouse is recieved:
 clientX = 150
 clientY = 100
+view.name = innerFrame
 mousemove is recieved:
 clientX = 150
 clientY = 100
 pointerdown of mouse is recieved:
 clientX = 150
 clientY = 100
+view.name = innerFrame
 mousedown is recieved:
 clientX = 150
 clientY = 100
 pointerup of mouse is recieved:
 clientX = 150
 clientY = 100
+view.name = innerFrame
 mouseup is recieved:
 clientX = 150
 clientY = 100
@@ -71,18 +80,21 @@
 pointerdown of touch is recieved:
 clientX = 150
 clientY = 100
+view.name = innerFrame
 touchstart is recieved:
 clientX = 150
 clientY = 100
 pointermove of touch is recieved:
 clientX = 150
 clientY = 100
+view.name = innerFrame
 touchmove is recieved:
 clientX = 150
 clientY = 100
 pointerup of touch is recieved:
 clientX = 150
 clientY = 100
+view.name = innerFrame
 touchend is recieved:
 clientX = 150
 clientY = 100
@@ -92,18 +104,21 @@
 pointermove of mouse is recieved:
 clientX = 50
 clientY = 0
+view.name = innerFrame
 mousemove is recieved:
 clientX = 50
 clientY = 0
 pointerdown of mouse is recieved:
 clientX = 50
 clientY = 0
+view.name = innerFrame
 mousedown is recieved:
 clientX = 50
 clientY = 0
 pointerup of mouse is recieved:
 clientX = 50
 clientY = 0
+view.name = innerFrame
 mouseup is recieved:
 clientX = 50
 clientY = 0
@@ -111,18 +126,21 @@
 pointerdown of touch is recieved:
 clientX = 50
 clientY = 0
+view.name = innerFrame
 touchstart is recieved:
 clientX = 50
 clientY = 0
 pointermove of touch is recieved:
 clientX = 50
 clientY = 0
+view.name = innerFrame
 touchmove is recieved:
 clientX = 50
 clientY = 0
 pointerup of touch is recieved:
 clientX = 50
 clientY = 0
+view.name = innerFrame
 touchend is recieved:
 clientX = 50
 clientY = 0
diff --git a/third_party/WebKit/LayoutTests/virtual/pointerevent/fast/events/pointerevents/pointer-event-properties-in-iframe.html b/third_party/WebKit/LayoutTests/virtual/pointerevent/fast/events/pointerevents/pointer-event-properties-in-iframe.html
index bcd68dd21..b76bc32 100644
--- a/third_party/WebKit/LayoutTests/virtual/pointerevent/fast/events/pointerevents/pointer-event-properties-in-iframe.html
+++ b/third_party/WebKit/LayoutTests/virtual/pointerevent/fast/events/pointerevents/pointer-event-properties-in-iframe.html
@@ -14,6 +14,7 @@
 <iframe id='target' srcdoc="
   <body style='height:500px; width: 500px; padding: 0; margin: 0;'>
     <script>
+      window.name = 'innerFrame';
       var testEventList = ['pointerup', 'pointerdown', 'pointermove',
                            'touchstart', 'touchmove', 'touchend',
                            'mouseup', 'mousedown', 'mousemove'];
@@ -29,6 +30,7 @@
 <div id='console'></div>
 
 <script>
+window.name = 'outerFrame';
 
 var attributes = [
     'clientX',
@@ -79,6 +81,7 @@
       attributes.forEach(function(att) {
         debug(att + " = " + event[att]);
       });
+      debug("view.name = " + event.view.name);
     } else if (event.type.startsWith('touch')) {
       debug(event.type + " is recieved:");
       attributes.forEach(function(att) {
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 6630023..59500d5 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
@@ -164,7 +164,16 @@
 interface AudioListener
     attribute @@toStringTag
     getter dopplerFactor
+    getter forwardX
+    getter forwardY
+    getter forwardZ
+    getter positionX
+    getter positionY
+    getter positionZ
     getter speedOfSound
+    getter upX
+    getter upY
+    getter upZ
     method constructor
     method setOrientation
     method setPosition
@@ -188,6 +197,8 @@
 interface AudioParam
     attribute @@toStringTag
     getter defaultValue
+    getter maxValue
+    getter minValue
     getter value
     method cancelScheduledValues
     method constructor
diff --git a/third_party/WebKit/LayoutTests/webaudio/audiolistener-automation-basic-expected.txt b/third_party/WebKit/LayoutTests/webaudio/audiolistener-automation-basic-expected.txt
new file mode 100644
index 0000000..9a2e023
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/webaudio/audiolistener-automation-basic-expected.txt
@@ -0,0 +1,6 @@
+CONSOLE ERROR: line 9: Uncaught ReferenceError: description is not defined
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x8
+  LayoutBlockFlow {HTML} at (0,0) size 800x8
+    LayoutBlockFlow {BODY} at (8,8) size 784x0
diff --git a/third_party/WebKit/LayoutTests/webaudio/audiolistener-automation-position-expected.txt b/third_party/WebKit/LayoutTests/webaudio/audiolistener-automation-position-expected.txt
new file mode 100644
index 0000000..f9f0a53
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/webaudio/audiolistener-automation-position-expected.txt
@@ -0,0 +1,21 @@
+Test Automation of AudioListener Position.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS Distance model: "linear", rolloff: 1: left channel equals [6.123234262925839e-17,0.7070180177688599,0.7068585157394409,0.706699013710022,0.706539511680603,0.7063800096511841,0.7062205672264099,0.706061065196991,0.705901563167572,0.7057421207427979,0.7055826187133789,0.70542311668396,0.7052636742591858,0.7051041722297668,0.7049446105957031,0.704785168170929,...] with an element-wise tolerance of 0.
+PASS Distance model: "linear", rolloff: 1: right channel equals [3,2.7067670822143555,2.7061564922332764,2.7055459022521973,2.704935073852539,2.70432448387146,2.703713893890381,2.7031033039093018,2.7024929523468018,2.7018823623657227,2.7012717723846436,2.7006611824035645,2.7000505924224854,2.6994400024414062,2.698829174041748,2.698218584060669,...] with an element-wise tolerance of 0.
+PASS Moving AudioListener with distance model: "linear", rolloff: 1:  passed.
+
+PASS Distance model: "exponential", rolloff: 1.5: left channel equals [6.123234262925839e-17,0.20877854526042938,0.07381436228752136,0.040179457515478134,0.026097318157553673,0.018673719838261604,0.01420558150857687,0.011272982694208622,0.00922679528594017,0.007732539437711239,0.006602156907320023,0.00572264613583684,0.005022431258112192,0.004454211797565222,0.003985601011663675,0.0035937593784183264,...] with an element-wise tolerance of 0.
+PASS Distance model: "exponential", rolloff: 1.5: right channel equals [3,0.7992934584617615,0.28259292244911194,0.153824120759964,0.09991168230772018,0.07149098068475723,0.05438503623008728,0.04315779730677605,0.03532411530613899,0.029603464528918266,0.025275876745581627,0.02190873585641384,0.01922801323235035,0.017052624374628067,0.01525858324021101,0.013758446089923382,...] with an element-wise tolerance of 0.
+PASS Moving AudioListener with distance model: "exponential", rolloff: 1.5:  passed.
+
+PASS Distance model: "inverse", rolloff: 1: left channel equals [6.123234262925839e-17,0.313534677028656,0.156767338514328,0.1045115664601326,0.078383669257164,0.06270693242549896,0.052255779504776,0.04479067027568817,0.039191834628582,0.03483719006180763,0.03135346621274948,0.02850315533578396,0.026127889752388,0.024118050932884216,0.022395333275198936,0.02090231329202652,...] with an element-wise tolerance of 0.
+PASS Distance model: "inverse", rolloff: 1: right channel equals [3,1.2003446817398071,0.6001723408699036,0.4001149535179138,0.3000861704349518,0.2400689274072647,0.20005744695663452,0.17147782444953918,0.1500430852174759,0.13337163627147675,0.12003446370363235,0.10912225395441055,0.10002872347831726,0.09233420342206955,0.085738904774189,0.08002298325300217,...] with an element-wise tolerance of 0.
+PASS Moving AudioListener with distance model: "inverse", rolloff: 1:  passed.
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/third_party/WebKit/LayoutTests/webaudio/audiolistener-automation-position.html b/third_party/WebKit/LayoutTests/webaudio/audiolistener-automation-position.html
new file mode 100644
index 0000000..f8c22e0c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/webaudio/audiolistener-automation-position.html
@@ -0,0 +1,204 @@
+<!doctype html>
+<html>
+  <head>
+    <script src="../resources/js-test.js"></script>
+    <script src="resources/compatibility.js"></script>
+    <script src="resources/audio-testing.js"></script>
+    <title>Test Automation of AudioListener</title>
+  </head>
+
+  <body>
+    <script>
+      description("Test Automation of AudioListener Position.");
+      window.jsTestIsAsync = true;
+
+      var sampleRate = 48000;
+      // These tests are quite slow, so don't run for many frames.  1024 frames should be enough to
+      // demonstrate that automations are working.
+      var renderFrames = 1024;
+      var renderDuration = renderFrames / sampleRate;
+
+      // End time of the automation.  Fairly arbitrary, but must be less than the render duration so
+      // that we can verify that the automation did end at the correct time and value.
+      var endTime = 0.75 * renderDuration;
+
+      var audit = Audit.createTaskRunner();
+
+      // Starting position for the panner
+      var defaultStartPosition = {
+        x: 0,
+        y: 0,
+        z: 0
+      };
+
+      // Ending position for the panner
+      var pannerEndPosition = {
+        x: 1000,
+        y: 1000,
+        z: 1000
+      };
+
+      // Ending position for the listener.  It MUST be the the negative of the pannerEndPosition!
+      var listenerEndPosition = {
+        x: -pannerEndPosition.x,
+        y: -pannerEndPosition.y,
+        z: -pannerEndPosition.z
+      };
+
+
+      // Test the linear, inverse, and exponential distance models when the AudioListener is moving
+      // instead of the panner.  We take advantage that motion is relative and create a reference by
+      // moving the panner in one direction.  The resulting output is the expected result.  Then we
+      // redo the test, but this time move the listener in the opposite direction.  The output of
+      // this test is compared against the panner result.  They should be the same.
+
+      audit.defineTask("linear", function (done) {
+        runTest({
+          startPosition: defaultStartPosition,
+          endPosition: pannerEndPosition,
+          distanceModel: {
+            model: "linear",
+            rolloff: 1
+          }
+        }).then(done);
+      });
+
+      audit.defineTask("exponential", function (done) {
+        runTest({
+          startPosition: defaultStartPosition,
+          endPosition: pannerEndPosition,
+          distanceModel: {
+            model: "exponential",
+            rolloff: 1.5
+          }
+        }).then(done);
+      });
+
+      audit.defineTask("inverse", function (done) {
+        runTest({
+          startPosition: defaultStartPosition,
+          endPosition: pannerEndPosition,
+          distanceModel: {
+            model: "inverse",
+            rolloff: 1
+          }
+        }).then(done);
+      });
+
+      audit.defineTask("finish", function (done) {
+        finishJSTest();
+        done();
+      });
+
+      audit.runTasks();
+        
+      function createGraph() {
+        var context = new OfflineAudioContext(2, renderFrames, sampleRate);
+        // Stereo source for the panner.
+        var source = context.createBufferSource();
+        source.buffer = createConstantBuffer(context, renderFrames, [1, 2]);
+
+        var panner = context.createPanner();
+        panner.panningModel = "equalpower";
+
+        source.connect(panner);
+        panner.connect(context.destination);
+
+        return {
+          context: context,
+          source: source,
+          panner: panner
+        };
+      }
+
+      // Run a listener test with the given options.
+      function runTest(options) {
+        var refResult;
+
+        return runPannerTest(options).then(function (renderedBuffer) {
+          refResult = renderedBuffer;
+        }).then(function () {
+          // Move the listener in the opposite direction.
+          options.endPosition = listenerEndPosition;
+          return runListenerTest(options).then(function (renderedBuffer) {
+            compareResults(renderedBuffer, refResult, options);
+          });
+        });
+      }
+
+      function runPannerTest(options) {
+        var graph = createGraph();
+
+        return runTestCore(graph, options, graph.panner);
+      }
+
+
+      function runListenerTest(options) {
+        var graph = createGraph();
+
+        return runTestCore(graph, options, graph.context.listener);
+      }
+
+      function runTestCore(graph, options, audioOjbect) {
+        var {context, source, panner} = graph;
+
+        // Initialize the panner with known values.
+        panner.distanceModel = options.distanceModel.model;
+        panner.rolloffFactor = options.distanceModel.rolloff;
+        panner.panningModel = "equalpower";
+        
+        // Automate the location.  audioObject must be either a PannerNode or the context's
+        // AudioListener.
+        
+        audioOjbect.positionX.setValueAtTime(options.startPosition.x, 0);
+        audioOjbect.positionY.setValueAtTime(options.startPosition.y, 0);
+        audioOjbect.positionZ.setValueAtTime(options.startPosition.z, 0);
+
+        audioOjbect.positionX.linearRampToValueAtTime(options.endPosition.x, endTime);
+        audioOjbect.positionY.linearRampToValueAtTime(options.endPosition.y, endTime);
+        audioOjbect.positionZ.linearRampToValueAtTime(options.endPosition.z, endTime);
+
+        // Start the source, render the graph, and return the resulting promise from rendering.
+        source.start();
+
+        return context.startRendering().then(function (resultBuffer) {
+          return resultBuffer;
+        });
+      }
+
+      function compareResults(actualResult, expectedResult, options) {
+        // Compare the output with the reference output from moving the source in the opposite
+        // direction.
+
+        var success = true;
+
+        var expectedLeft = expectedResult.getChannelData(0);
+        var expectedRight = expectedResult.getChannelData(1);
+
+        var actualLeft = actualResult.getChannelData(0);
+        var actualRight = actualResult.getChannelData(1);
+
+        var prefix = 'Distance model: "' + options.distanceModel.model + '"';
+        prefix += ', rolloff: ' + options.distanceModel.rolloff;
+        success = Should(prefix + ": left channel", actualLeft, {
+            verbose: true
+          })
+          .beCloseToArray(expectedLeft, 0) && success;
+        success = Should(prefix + ": right channel", actualRight, {
+            verbose: true
+          })
+          .beCloseToArray(expectedRight, 0) && success;
+
+        var message = 'Moving AudioListener with distance model: "';
+        message += options.distanceModel.model + '", rolloff: ';
+        message += options.distanceModel.rolloff + ": ";
+        if (success)
+          testPassed(message + " passed.\n");
+        else
+          testFailed(message + " failed.\n");
+
+        return success;
+      }
+    </script>
+  </body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/webaudio/audioparam-nominal-range-expected.txt b/third_party/WebKit/LayoutTests/webaudio/audioparam-nominal-range-expected.txt
new file mode 100644
index 0000000..37757a7
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/webaudio/audioparam-nominal-range-expected.txt
@@ -0,0 +1,288 @@
+CONSOLE WARNING: Delay.delayTime.value -1 outside nominal range [0, 1.5]; value will be clamped.
+CONSOLE WARNING: Delay.delayTime.value 4 outside nominal range [0, 1.5]; value will be clamped.
+CONSOLE WARNING: StereoPanner.pan.value -3 outside nominal range [-1, 1]; value will be clamped.
+CONSOLE WARNING: StereoPanner.pan.value 3 outside nominal range [-1, 1]; value will be clamped.
+CONSOLE WARNING: DynamicsCompressor.threshold.value -201 outside nominal range [-100, 0]; value will be clamped.
+CONSOLE WARNING: DynamicsCompressor.threshold.value 1 outside nominal range [-100, 0]; value will be clamped.
+CONSOLE WARNING: DynamicsCompressor.knee.value -1 outside nominal range [0, 40]; value will be clamped.
+CONSOLE WARNING: DynamicsCompressor.knee.value 81 outside nominal range [0, 40]; value will be clamped.
+CONSOLE WARNING: DynamicsCompressor.ratio.value 41 outside nominal range [1, 20]; value will be clamped.
+CONSOLE WARNING: DynamicsCompressor.attack.value -1 outside nominal range [0, 1]; value will be clamped.
+CONSOLE WARNING: DynamicsCompressor.attack.value 3 outside nominal range [0, 1]; value will be clamped.
+CONSOLE WARNING: DynamicsCompressor.release.value -1 outside nominal range [0, 1]; value will be clamped.
+CONSOLE WARNING: DynamicsCompressor.release.value 3 outside nominal range [0, 1]; value will be clamped.
+CONSOLE WARNING: BiquadFilter.frequency.value -1 outside nominal range [0, 24000]; value will be clamped.
+CONSOLE WARNING: BiquadFilter.frequency.value 48001 outside nominal range [0, 24000]; value will be clamped.
+CONSOLE WARNING: Oscillator.frequency.value -1 outside nominal range [0, 24000]; value will be clamped.
+CONSOLE WARNING: Oscillator.frequency.value 48001 outside nominal range [0, 24000]; value will be clamped.
+CONSOLE WARNING: 'AudioListener.dopplerFactor' is deprecated and will be removed in M55, around November 2016. It has no effect as the Web Audio doppler effects have already been removed internally. See https://www.chromestatus.com/features/5238926818148352 for more details.
+CONSOLE WARNING: 'AudioListener.speedOfSound' is deprecated and will be removed in M55, around November 2016. It has no effect as the Web Audio doppler effects have already been removed internally. See https://www.chromestatus.com/features/5238926818148352 for more details.
+CONSOLE WARNING: Delay.delayTime.setValueAtTime value -1 outside nominal range [0, 1]; value will be clamped.
+CONSOLE WARNING: Delay.delayTime.linearRampToValueAtTime value 2 outside nominal range [0, 1]; value will be clamped.
+CONSOLE WARNING: Delay.delayTime.exponentialRampToValue value 3 outside nominal range [0, 1]; value will be clamped.
+CONSOLE WARNING: Delay.delayTime.setTargetAtTime value -1 outside nominal range [0, 1]; value will be clamped.
+CONSOLE WARNING: Delay.delayTime.setValueCurveAtTime value 1.5 outside nominal range [0, 1]; value will be clamped.
+Test AudioParam Nominal Range Values.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS GainNode.gain.minValue is equal to -3.4028234663852886e+38.
+PASS GainNode.gain.maxValue is equal to 3.4028234663852886e+38.
+PASS GainNode.gain.minValue = Math.PI is not equal to 3.141592653589793.
+PASS GainNode.gain.minValue is read-only.
+PASS GainNode.gain.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS GainNode.gain.maxValue is read-only.
+PASS Nominal ranges for AudioParam(s) of GainNode are correct.
+
+PASS DelayNode.delayTime.minValue is equal to 0.
+PASS DelayNode.delayTime.maxValue is equal to 1.5.
+PASS DelayNode.delayTime.minValue = Math.PI is not equal to 3.141592653589793.
+PASS DelayNode.delayTime.minValue is read-only.
+PASS DelayNode.delayTime.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS DelayNode.delayTime.maxValue is read-only.
+PASS Set DelayNode.delayTime.value = -1 is equal to 0.
+PASS Set DelayNode.delayTime.value = 4 is equal to 1.5.
+PASS DelayNode.delayTime was correctly clipped to lie within the nominal range.
+PASS Nominal ranges for AudioParam(s) of DelayNode are correct.
+
+PASS AudioBufferSourceNode.playbackRate.minValue is equal to -3.4028234663852886e+38.
+PASS AudioBufferSourceNode.playbackRate.maxValue is equal to 3.4028234663852886e+38.
+PASS AudioBufferSourceNode.playbackRate.minValue = Math.PI is not equal to 3.141592653589793.
+PASS AudioBufferSourceNode.playbackRate.minValue is read-only.
+PASS AudioBufferSourceNode.playbackRate.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS AudioBufferSourceNode.playbackRate.maxValue is read-only.
+PASS AudioBufferSourceNode.detune.minValue is equal to -3.4028234663852886e+38.
+PASS AudioBufferSourceNode.detune.maxValue is equal to 3.4028234663852886e+38.
+PASS AudioBufferSourceNode.detune.minValue = Math.PI is not equal to 3.141592653589793.
+PASS AudioBufferSourceNode.detune.minValue is read-only.
+PASS AudioBufferSourceNode.detune.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS AudioBufferSourceNode.detune.maxValue is read-only.
+PASS Nominal ranges for AudioParam(s) of AudioBufferSourceNode are correct.
+
+PASS StereoPannerNode.pan.minValue is equal to -1.
+PASS StereoPannerNode.pan.maxValue is equal to 1.
+PASS StereoPannerNode.pan.minValue = Math.PI is not equal to 3.141592653589793.
+PASS StereoPannerNode.pan.minValue is read-only.
+PASS StereoPannerNode.pan.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS StereoPannerNode.pan.maxValue is read-only.
+PASS Set StereoPannerNode.pan.value = -3 is equal to -1.
+PASS Set StereoPannerNode.pan.value = 3 is equal to 1.
+PASS StereoPannerNode.pan was correctly clipped to lie within the nominal range.
+PASS Nominal ranges for AudioParam(s) of StereoPannerNode are correct.
+
+PASS DynamicsCompressorNode.threshold.minValue is equal to -100.
+PASS DynamicsCompressorNode.threshold.maxValue is equal to 0.
+PASS DynamicsCompressorNode.threshold.minValue = Math.PI is not equal to 3.141592653589793.
+PASS DynamicsCompressorNode.threshold.minValue is read-only.
+PASS DynamicsCompressorNode.threshold.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS DynamicsCompressorNode.threshold.maxValue is read-only.
+PASS Set DynamicsCompressorNode.threshold.value = -201 is equal to -100.
+PASS Set DynamicsCompressorNode.threshold.value = 1 is equal to 0.
+PASS DynamicsCompressorNode.threshold was correctly clipped to lie within the nominal range.
+PASS DynamicsCompressorNode.knee.minValue is equal to 0.
+PASS DynamicsCompressorNode.knee.maxValue is equal to 40.
+PASS DynamicsCompressorNode.knee.minValue = Math.PI is not equal to 3.141592653589793.
+PASS DynamicsCompressorNode.knee.minValue is read-only.
+PASS DynamicsCompressorNode.knee.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS DynamicsCompressorNode.knee.maxValue is read-only.
+PASS Set DynamicsCompressorNode.knee.value = -1 is equal to 0.
+PASS Set DynamicsCompressorNode.knee.value = 81 is equal to 40.
+PASS DynamicsCompressorNode.knee was correctly clipped to lie within the nominal range.
+PASS DynamicsCompressorNode.ratio.minValue is equal to 1.
+PASS DynamicsCompressorNode.ratio.maxValue is equal to 20.
+PASS DynamicsCompressorNode.ratio.minValue = Math.PI is not equal to 3.141592653589793.
+PASS DynamicsCompressorNode.ratio.minValue is read-only.
+PASS DynamicsCompressorNode.ratio.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS DynamicsCompressorNode.ratio.maxValue is read-only.
+PASS Set DynamicsCompressorNode.ratio.value = 1 is equal to 1.
+PASS Set DynamicsCompressorNode.ratio.value = 41 is equal to 20.
+PASS DynamicsCompressorNode.ratio was correctly clipped to lie within the nominal range.
+PASS DynamicsCompressorNode.attack.minValue is equal to 0.
+PASS DynamicsCompressorNode.attack.maxValue is equal to 1.
+PASS DynamicsCompressorNode.attack.minValue = Math.PI is not equal to 3.141592653589793.
+PASS DynamicsCompressorNode.attack.minValue is read-only.
+PASS DynamicsCompressorNode.attack.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS DynamicsCompressorNode.attack.maxValue is read-only.
+PASS Set DynamicsCompressorNode.attack.value = -1 is equal to 0.
+PASS Set DynamicsCompressorNode.attack.value = 3 is equal to 1.
+PASS DynamicsCompressorNode.attack was correctly clipped to lie within the nominal range.
+PASS DynamicsCompressorNode.release.minValue is equal to 0.
+PASS DynamicsCompressorNode.release.maxValue is equal to 1.
+PASS DynamicsCompressorNode.release.minValue = Math.PI is not equal to 3.141592653589793.
+PASS DynamicsCompressorNode.release.minValue is read-only.
+PASS DynamicsCompressorNode.release.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS DynamicsCompressorNode.release.maxValue is read-only.
+PASS Set DynamicsCompressorNode.release.value = -1 is equal to 0.
+PASS Set DynamicsCompressorNode.release.value = 3 is equal to 1.
+PASS DynamicsCompressorNode.release was correctly clipped to lie within the nominal range.
+PASS Nominal ranges for AudioParam(s) of DynamicsCompressorNode are correct.
+
+PASS BiquadFilterNode.frequency.minValue is equal to 0.
+PASS BiquadFilterNode.frequency.maxValue is equal to 24000.
+PASS BiquadFilterNode.frequency.minValue = Math.PI is not equal to 3.141592653589793.
+PASS BiquadFilterNode.frequency.minValue is read-only.
+PASS BiquadFilterNode.frequency.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS BiquadFilterNode.frequency.maxValue is read-only.
+PASS Set BiquadFilterNode.frequency.value = -1 is equal to 0.
+PASS Set BiquadFilterNode.frequency.value = 48001 is equal to 24000.
+PASS BiquadFilterNode.frequency was correctly clipped to lie within the nominal range.
+PASS BiquadFilterNode.detune.minValue is equal to -3.4028234663852886e+38.
+PASS BiquadFilterNode.detune.maxValue is equal to 3.4028234663852886e+38.
+PASS BiquadFilterNode.detune.minValue = Math.PI is not equal to 3.141592653589793.
+PASS BiquadFilterNode.detune.minValue is read-only.
+PASS BiquadFilterNode.detune.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS BiquadFilterNode.detune.maxValue is read-only.
+PASS BiquadFilterNode.Q.minValue is equal to -3.4028234663852886e+38.
+PASS BiquadFilterNode.Q.maxValue is equal to 3.4028234663852886e+38.
+PASS BiquadFilterNode.Q.minValue = Math.PI is not equal to 3.141592653589793.
+PASS BiquadFilterNode.Q.minValue is read-only.
+PASS BiquadFilterNode.Q.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS BiquadFilterNode.Q.maxValue is read-only.
+PASS BiquadFilterNode.gain.minValue is equal to -3.4028234663852886e+38.
+PASS BiquadFilterNode.gain.maxValue is equal to 3.4028234663852886e+38.
+PASS BiquadFilterNode.gain.minValue = Math.PI is not equal to 3.141592653589793.
+PASS BiquadFilterNode.gain.minValue is read-only.
+PASS BiquadFilterNode.gain.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS BiquadFilterNode.gain.maxValue is read-only.
+PASS Nominal ranges for AudioParam(s) of BiquadFilterNode are correct.
+
+PASS OscillatorNode.frequency.minValue is equal to 0.
+PASS OscillatorNode.frequency.maxValue is equal to 24000.
+PASS OscillatorNode.frequency.minValue = Math.PI is not equal to 3.141592653589793.
+PASS OscillatorNode.frequency.minValue is read-only.
+PASS OscillatorNode.frequency.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS OscillatorNode.frequency.maxValue is read-only.
+PASS Set OscillatorNode.frequency.value = -1 is equal to 0.
+PASS Set OscillatorNode.frequency.value = 48001 is equal to 24000.
+PASS OscillatorNode.frequency was correctly clipped to lie within the nominal range.
+PASS OscillatorNode.detune.minValue is equal to -3.4028234663852886e+38.
+PASS OscillatorNode.detune.maxValue is equal to 3.4028234663852886e+38.
+PASS OscillatorNode.detune.minValue = Math.PI is not equal to 3.141592653589793.
+PASS OscillatorNode.detune.minValue is read-only.
+PASS OscillatorNode.detune.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS OscillatorNode.detune.maxValue is read-only.
+PASS Nominal ranges for AudioParam(s) of OscillatorNode are correct.
+
+PASS PannerNode.positionX.minValue is equal to -3.4028234663852886e+38.
+PASS PannerNode.positionX.maxValue is equal to 3.4028234663852886e+38.
+PASS PannerNode.positionX.minValue = Math.PI is not equal to 3.141592653589793.
+PASS PannerNode.positionX.minValue is read-only.
+PASS PannerNode.positionX.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS PannerNode.positionX.maxValue is read-only.
+PASS PannerNode.positionY.minValue is equal to -3.4028234663852886e+38.
+PASS PannerNode.positionY.maxValue is equal to 3.4028234663852886e+38.
+PASS PannerNode.positionY.minValue = Math.PI is not equal to 3.141592653589793.
+PASS PannerNode.positionY.minValue is read-only.
+PASS PannerNode.positionY.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS PannerNode.positionY.maxValue is read-only.
+PASS PannerNode.positionZ.minValue is equal to -3.4028234663852886e+38.
+PASS PannerNode.positionZ.maxValue is equal to 3.4028234663852886e+38.
+PASS PannerNode.positionZ.minValue = Math.PI is not equal to 3.141592653589793.
+PASS PannerNode.positionZ.minValue is read-only.
+PASS PannerNode.positionZ.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS PannerNode.positionZ.maxValue is read-only.
+PASS PannerNode.orientationX.minValue is equal to -3.4028234663852886e+38.
+PASS PannerNode.orientationX.maxValue is equal to 3.4028234663852886e+38.
+PASS PannerNode.orientationX.minValue = Math.PI is not equal to 3.141592653589793.
+PASS PannerNode.orientationX.minValue is read-only.
+PASS PannerNode.orientationX.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS PannerNode.orientationX.maxValue is read-only.
+PASS PannerNode.orientationY.minValue is equal to -3.4028234663852886e+38.
+PASS PannerNode.orientationY.maxValue is equal to 3.4028234663852886e+38.
+PASS PannerNode.orientationY.minValue = Math.PI is not equal to 3.141592653589793.
+PASS PannerNode.orientationY.minValue is read-only.
+PASS PannerNode.orientationY.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS PannerNode.orientationY.maxValue is read-only.
+PASS PannerNode.orientationZ.minValue is equal to -3.4028234663852886e+38.
+PASS PannerNode.orientationZ.maxValue is equal to 3.4028234663852886e+38.
+PASS PannerNode.orientationZ.minValue = Math.PI is not equal to 3.141592653589793.
+PASS PannerNode.orientationZ.minValue is read-only.
+PASS PannerNode.orientationZ.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS PannerNode.orientationZ.maxValue is read-only.
+PASS Nominal ranges for AudioParam(s) of PannerNode are correct.
+
+PASS AudioBuffer has no AudioParams as expected.
+
+PASS IIRFilterNode has no AudioParams as expected.
+
+PASS WaveShaperNode has no AudioParams as expected.
+
+PASS ConvolverNode has no AudioParams as expected.
+
+PASS AnalyserNode has no AudioParams as expected.
+
+PASS ScriptProcessorNode has no AudioParams as expected.
+
+PASS PeriodicWave has no AudioParams as expected.
+
+PASS ChannelSplitterNode has no AudioParams as expected.
+
+PASS ChannelMergerNode has no AudioParams as expected.
+
+PASS MediaElementAudioSourceNode has no AudioParams as expected.
+
+PASS MediaStreamAudioDestinationNode has no AudioParams as expected.
+
+PASS AudioListener.positionX.minValue is equal to -3.4028234663852886e+38.
+PASS AudioListener.positionX.maxValue is equal to 3.4028234663852886e+38.
+PASS AudioListener.positionX.minValue = Math.PI is not equal to 3.141592653589793.
+PASS AudioListener.positionX.minValue is read-only.
+PASS AudioListener.positionX.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS AudioListener.positionX.maxValue is read-only.
+PASS AudioListener.positionY.minValue is equal to -3.4028234663852886e+38.
+PASS AudioListener.positionY.maxValue is equal to 3.4028234663852886e+38.
+PASS AudioListener.positionY.minValue = Math.PI is not equal to 3.141592653589793.
+PASS AudioListener.positionY.minValue is read-only.
+PASS AudioListener.positionY.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS AudioListener.positionY.maxValue is read-only.
+PASS AudioListener.positionZ.minValue is equal to -3.4028234663852886e+38.
+PASS AudioListener.positionZ.maxValue is equal to 3.4028234663852886e+38.
+PASS AudioListener.positionZ.minValue = Math.PI is not equal to 3.141592653589793.
+PASS AudioListener.positionZ.minValue is read-only.
+PASS AudioListener.positionZ.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS AudioListener.positionZ.maxValue is read-only.
+PASS AudioListener.forwardX.minValue is equal to -3.4028234663852886e+38.
+PASS AudioListener.forwardX.maxValue is equal to 3.4028234663852886e+38.
+PASS AudioListener.forwardX.minValue = Math.PI is not equal to 3.141592653589793.
+PASS AudioListener.forwardX.minValue is read-only.
+PASS AudioListener.forwardX.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS AudioListener.forwardX.maxValue is read-only.
+PASS AudioListener.forwardY.minValue is equal to -3.4028234663852886e+38.
+PASS AudioListener.forwardY.maxValue is equal to 3.4028234663852886e+38.
+PASS AudioListener.forwardY.minValue = Math.PI is not equal to 3.141592653589793.
+PASS AudioListener.forwardY.minValue is read-only.
+PASS AudioListener.forwardY.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS AudioListener.forwardY.maxValue is read-only.
+PASS AudioListener.forwardZ.minValue is equal to -3.4028234663852886e+38.
+PASS AudioListener.forwardZ.maxValue is equal to 3.4028234663852886e+38.
+PASS AudioListener.forwardZ.minValue = Math.PI is not equal to 3.141592653589793.
+PASS AudioListener.forwardZ.minValue is read-only.
+PASS AudioListener.forwardZ.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS AudioListener.forwardZ.maxValue is read-only.
+PASS AudioListener.upX.minValue is equal to -3.4028234663852886e+38.
+PASS AudioListener.upX.maxValue is equal to 3.4028234663852886e+38.
+PASS AudioListener.upX.minValue = Math.PI is not equal to 3.141592653589793.
+PASS AudioListener.upX.minValue is read-only.
+PASS AudioListener.upX.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS AudioListener.upX.maxValue is read-only.
+PASS AudioListener.upY.minValue is equal to -3.4028234663852886e+38.
+PASS AudioListener.upY.maxValue is equal to 3.4028234663852886e+38.
+PASS AudioListener.upY.minValue = Math.PI is not equal to 3.141592653589793.
+PASS AudioListener.upY.minValue is read-only.
+PASS AudioListener.upY.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS AudioListener.upY.maxValue is read-only.
+PASS AudioListener.upZ.minValue is equal to -3.4028234663852886e+38.
+PASS AudioListener.upZ.maxValue is equal to 3.4028234663852886e+38.
+PASS AudioListener.upZ.minValue = Math.PI is not equal to 3.141592653589793.
+PASS AudioListener.upZ.minValue is read-only.
+PASS AudioListener.upZ.maxValue = Math.PI is not equal to 3.141592653589793.
+PASS AudioListener.upZ.maxValue is read-only.
+PASS Nominal ranges for AudioParam(s) of AudioListener are correct.
+
+PASS All nodes were tested.
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/third_party/WebKit/LayoutTests/webaudio/audioparam-nominal-range.html b/third_party/WebKit/LayoutTests/webaudio/audioparam-nominal-range.html
new file mode 100644
index 0000000..03a822c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/webaudio/audioparam-nominal-range.html
@@ -0,0 +1,465 @@
+<!doctype html>
+<html>
+  <head>
+    <script src="../resources/js-test.js"></script>
+    <script src="resources/compatibility.js"></script>
+    <script src="resources/audio-testing.js"></script>
+    <title>Test AudioParam Nominal Range Values</title>
+  </head>
+
+  <body>
+    <script>
+      description("Test AudioParam Nominal Range Values.");
+      window.jsTestIsAsync = true;
+
+      // Some arbitrary sample rate for the offline context. 
+      var sampleRate = 48000;
+
+      // The actual offline context
+      var context;
+
+      // The set of all methods that we've tested for verifying that we tested all of the necessary
+      // objects.
+      var testedMethods = new Set();
+
+      // The most positive single float value (the value just before infinity).  Be careful when
+      // changing this value!  Javascript only uses double floats, so the value here should be the
+      // max single-float value, converted directly to a double-float value.  This also depends on
+      // Javascript reading this value and producing the desired double-float value correctly.
+      var mostPositiveFloat = 3.4028234663852886e38;
+
+      var audit = Audit.createTaskRunner();
+
+      // Array describing the tests that should be run.
+      var testConfigs = [{
+        // The name of the method to create the particular node to be tested.
+        creator: "createGain",
+
+        // Any args to pass to the creator function.
+        args: [],
+
+        // The min/max limits for each AudioParam of the node.  This is a dictionary whose keys are
+        // the names of each AudioParam in the node.  Don't define this if the node doesn't have any
+        // AudioParam attributes.
+        limits: {
+          gain: {
+            // The expected min and max values for this AudioParam.
+            minValue: -mostPositiveFloat,
+            maxValue: mostPositiveFloat
+          }
+        }
+      }, {
+        creator: "createDelay",
+        // Just specify a non-default value for the maximum delay so we can make sure the limits are
+        // set correctly.
+        args: [1.5],
+        limits: {
+          delayTime: {
+            minValue: 0,
+            maxValue: 1.5
+          }
+        }
+      }, {
+        creator: "createBufferSource",
+        args: [],
+        limits: {
+          playbackRate: {
+            minValue: -mostPositiveFloat,
+            maxValue: mostPositiveFloat
+          },
+          detune: {
+            minValue: -mostPositiveFloat,
+            maxValue: mostPositiveFloat
+          }
+        }
+      }, {
+        creator: "createStereoPanner",
+        args: [],
+        limits: {
+          pan: {
+            minValue: -1,
+            maxValue: 1
+          }
+        }
+      }, {
+        creator: "createDynamicsCompressor",
+        args: [],
+        // Do not set limits for reduction;  it's currently an AudioParam but should be a float.
+        // So let the test fail for reduction.  When reduction is changed, this test will then
+        // correctly pass.
+        limits: {
+          threshold: {
+            minValue: -100,
+            maxValue: 0
+          },
+          knee: {
+            minValue: 0,
+            maxValue: 40
+          },
+          ratio: {
+            minValue: 1,
+            maxValue: 20
+          },
+          attack: {
+            minValue: 0,
+            maxValue: 1
+          },
+          release: {
+            minValue: 0,
+            maxValue: 1
+          }
+        }
+      },
+      {
+        creator: "createBiquadFilter",
+        args: [],
+        limits: {
+          gain: {
+            minValue: -mostPositiveFloat,
+            maxValue: mostPositiveFloat
+          },
+          Q: {
+            minValue: -mostPositiveFloat,
+            maxValue: mostPositiveFloat
+          },
+          frequency: {
+            minValue: 0,
+            maxValue: sampleRate / 2
+          },
+          detune: {
+            minValue: -mostPositiveFloat,
+            maxValue: mostPositiveFloat
+          }
+        }
+      }, {
+        creator: "createOscillator",
+        args: [],
+        limits: {
+          frequency: {
+            minValue: 0,
+            maxValue: sampleRate / 2
+          },
+          detune: {
+            minValue: -mostPositiveFloat,
+            maxValue: mostPositiveFloat
+          }
+        }
+      }, {
+        creator: "createPanner",
+        args: [],
+        limits : {
+          positionX: {
+            minValue: -mostPositiveFloat,
+            maxValue: mostPositiveFloat,
+          },
+          positionY: {
+            minValue: -mostPositiveFloat,
+            maxValue: mostPositiveFloat,
+          },
+          positionZ: {
+            minValue: -mostPositiveFloat,
+            maxValue: mostPositiveFloat,
+          },
+          orientationX: {
+            minValue: -mostPositiveFloat,
+            maxValue: mostPositiveFloat,
+          },
+          orientationY: {
+            minValue: -mostPositiveFloat,
+            maxValue: mostPositiveFloat,
+          },
+          orientationZ: {
+            minValue: -mostPositiveFloat,
+            maxValue: mostPositiveFloat,
+          }
+        },
+      },
+      // These nodes don't have AudioParams, but we want to test them anyway.  Any arguments for the
+      // constructor are pretty much arbitrary; they just need to be valid.
+      {
+        creator: "createBuffer",
+        args: [1, 1, sampleRate],
+      }, {
+        creator: "createIIRFilter",
+        args: [[1,2],[3,4]]
+      }, {
+        creator: "createWaveShaper",
+        args: [],
+      }, {
+        creator: "createConvolver",
+        args: [],
+      }, {
+        creator: "createAnalyser",
+        args: [],
+      }, {
+        creator: "createScriptProcessor",
+        args: [0],
+      }, {
+        creator: "createPeriodicWave",
+        args: [Float32Array.from([0, 0]), Float32Array.from([1, 0])], 
+      }, {
+        creator: "createChannelSplitter",
+        args: [],
+      }, {
+        creator: "createChannelMerger",
+        args: [],
+      }, {
+        creator: "createMediaElementSource",
+        args: [new Audio()]
+      },{
+        creator: "createMediaStreamDestination",
+        args: []
+      }
+      // Can't currently test MediaStreamSource
+      ];
+
+      // Create the context so we can use it in the following test.
+      audit.defineTask("initialize", function (done) {
+        // Just any context so that we can create the nodes.
+        context = new OfflineAudioContext(1, 1, sampleRate);
+        done();
+      });
+
+      // Create a task for each entry in testConfigs
+      for (var test in testConfigs) {
+        var config = testConfigs[test]
+        audit.defineTask(config.creator, (function (c) {
+          return function (done) {
+            var node = context[c.creator](...c.args);
+            testLimits(c.creator, node, c.limits);
+            done();
+          };
+        })(config));
+      }
+
+      // Test the AudioListener params that were added for the automated Panner
+      audit.defineTask("AudioListener", function (done) {
+        testLimits("", context.listener, {
+          positionX: {
+            minValue: -mostPositiveFloat,
+            maxValue: mostPositiveFloat,
+          },
+          positionY: {
+            minValue: -mostPositiveFloat,
+            maxValue: mostPositiveFloat,
+          },
+          positionZ: {
+            minValue: -mostPositiveFloat,
+            maxValue: mostPositiveFloat,
+          },
+          forwardX: {
+            minValue: -mostPositiveFloat,
+            maxValue: mostPositiveFloat,
+          },
+          forwardY: {
+            minValue: -mostPositiveFloat,
+            maxValue: mostPositiveFloat,
+          },
+          forwardZ: {
+            minValue: -mostPositiveFloat,
+            maxValue: mostPositiveFloat,
+          },
+          upX: {
+            minValue: -mostPositiveFloat,
+            maxValue: mostPositiveFloat,
+          },
+          upY: {
+            minValue: -mostPositiveFloat,
+            maxValue: mostPositiveFloat,
+          },
+          upZ: {
+            minValue: -mostPositiveFloat,
+            maxValue: mostPositiveFloat,
+          }
+        });
+        done();
+      });
+
+      // Verify that we have tested all the create methods available on the context.
+      audit.defineTask("verifyTests", function (done) {
+        var allNodes = new Set();
+        // Create the set of all "create" methods from the context.
+        for (var method in context) {
+          if (typeof context[method] === "function" && method.substring(0, 6) === "create") {
+            allNodes.add(method);
+          }
+        }
+
+        // Compute the difference between the set of all create methods on the context and the set
+        // of tests that we've run.
+        var diff = new Set([...allNodes].filter(x => !testedMethods.has(x)));
+
+        // Can't currently test a MediaStreamSourceNode, so remove it from the diff set.
+        diff.delete("createMediaStreamSource");
+
+        // It's a test failure if we didn't test all of the create methods in the context (except
+        // createMediaStreamSource, of course).
+        if (diff.size) {
+          var output = [];
+          for (let item of diff)
+            output.push(" " + item.substring(6));
+          testFailed("These nodes were not tested:" + output + "\n");
+        } else {
+          testPassed("All nodes were tested.\n");
+        }
+      
+        done();
+      });
+
+      // Simple test of a few automation methods to verify we get warnings.
+      audit.defineTask("automation", function (done) {
+        // Just use a DelayNode for testing because the audio param has finite limits.
+        var d = context.createDelay();
+
+        // The console output should have the warnings that we're interested in.
+        d.delayTime.setValueAtTime(-1, 0);
+        d.delayTime.linearRampToValueAtTime(2, 1);
+        d.delayTime.exponentialRampToValueAtTime(3, 2);
+        d.delayTime.setTargetAtTime(-1, 3, .1);
+        d.delayTime.setValueCurveAtTime(Float32Array.from([.1, .2, 1.5, -1]), 4, .1);
+        done();
+      });
+
+      // All done!
+      audit.defineTask("finish", function (done) {
+        finishJSTest();
+        done();
+      });
+
+      audit.runTasks();
+
+      // Is |object| an AudioParam?  We determine this by checking the constructor name.
+      function isAudioParam(object) {
+        return object && object.constructor.name === "AudioParam";
+      }
+
+      // Does |limitOptions| exist and does it have valid values for the expected min and max
+      // values?
+      function hasValidLimits(limitOptions) {
+        return limitOptions && (typeof limitOptions.minValue === "number") && (typeof limitOptions.maxValue === "number");
+      }
+
+      // Check the min and max values for the AudioParam attribute named |paramName| for the |node|.
+      // The expected limits is given by the dictionary |limits|.  If some test fails, add the name
+      // of the failed 
+      function validateAudioParamLimits(node, paramName, limits) {
+        var nodeName = node.constructor.name;
+        var parameter = node[paramName];
+        var prefix = nodeName + "." + paramName;
+
+        var success = true;
+        if (hasValidLimits(limits[paramName])) {
+          // Verify that the min and max values for the parameter are correct.
+          var isCorrect = Should(prefix + ".minValue", parameter.minValue)
+            .beEqualTo(limits[paramName].minValue);
+          isCorrect = Should(prefix + ".maxValue", parameter.maxValue)
+            .beEqualTo(limits[paramName].maxValue) && isCorrect;
+
+          // Verify that the min and max attributes are read-only
+          parameter.minValue = Math.PI;
+          var isReadOnly;
+          isReadOnly = Should(prefix + ".minValue = Math.PI", parameter.minValue)
+            .notBeEqualTo(Math.PI);
+          if (isReadOnly)
+            testPassed(prefix + ".minValue is read-only.");
+          else
+            testFailed(prefix + ".minValue should be read-only but was changed.");
+          isCorrect = isReadOnly && isCorrect;
+
+          parameter.maxValue = Math.PI;
+          isReadOnly = Should(prefix + ".maxValue = Math.PI", parameter.maxValue)
+            .notBeEqualTo(Math.PI);
+          if (isReadOnly)
+            testPassed(prefix + ".maxValue is read-only.");
+          else
+            testFailed(prefix + ".maxValue should be read-only but was changed.");
+          isCorrect = isReadOnly && isCorrect;
+
+          // Now try to set the parameter outside the nominal range.
+          var newValue = 2 * limits[paramName].minValue - 1;
+
+          var isClipped = true;
+          var clippingTested = false;
+          // If the new value is beyond float the largest single-precision float, skip the test
+          // because Chrome throws an error.
+          if (newValue >= -mostPositiveFloat) {
+            parameter.value = newValue;
+            clippingTested = true;
+            isClipped = Should("Set " + prefix + ".value = " + newValue, parameter.value)
+              .beEqualTo(parameter.minValue) && isClipped;
+          }
+
+          newValue = 2 * limits[paramName].maxValue + 1;
+
+          if (newValue <= mostPositiveFloat) {
+            parameter.value = newValue;
+            clippingTested = true;
+            isClipped = Should("Set " + prefix + ".value = " + newValue, parameter.value)
+              .beEqualTo(parameter.maxValue) && isClipped;
+
+          }
+
+          if (clippingTested) {
+            if (isClipped)
+              testPassed(prefix + " was correctly clipped to lie within the nominal range.")
+            else
+              testPassed(prefix + " was not correctly clipped to lie within the nominal range.")
+          }
+
+          isCorrect = isCorrect && isClipped;
+
+          success = isCorrect && success;
+        } else {
+          // Test config didn't specify valid limits.  Fail this test!
+          testFailed("Limits for " + nodeName + "." + paramName + " were not correctly defined.");
+          success = false;
+        }
+
+        return success;
+      }
+
+      // Test all of the AudioParams for |node| using the expected values in |limits|.
+      // |creatorName| is the name of the method to create the node, and is used to keep trakc of
+      // which tests we've run.
+      function testLimits(creatorName, node, limits) {
+        var nodeName = node.constructor.name;
+        testedMethods.add(creatorName);
+
+        var success = true;
+
+        // List of all of the AudioParams that were tested.
+        var audioParams = [];
+
+        // List of AudioParams that failed the test.
+        var incorrectParams = [];
+
+        // Look through all of the keys for the node and extract just the AudioParams
+        Object.keys(node.__proto__).forEach(function (paramName) {
+          if (isAudioParam(node[paramName])) {
+            audioParams.push(paramName);
+            var isValid = validateAudioParamLimits(node, paramName, limits, incorrectParams);
+            if (!isValid)
+              incorrectParams.push(paramName);
+      
+            success =  isValid && success;
+          }
+        });
+
+        // Print an appropriate message depending on whether there were AudioParams defined or not.
+        if (audioParams.length) {
+          var message = "Nominal ranges for AudioParam(s) of " + node.constructor.name;
+          if (success)
+            testPassed(message + " are correct.\n");
+          else
+            testFailed(message + " are incorrect for: " + incorrectParams + ".\n");
+          return success;
+        } else {
+          if (limits)
+            testFailed(nodeName + " has no AudioParams but test expected " + limits + ".\n");
+          else
+            testPassed(nodeName + " has no AudioParams as expected.\n");
+        }
+      }
+    </script>
+  </body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/webaudio/biquad-automation-expected.txt b/third_party/WebKit/LayoutTests/webaudio/biquad-automation-expected.txt
index 57a2ae7..626288c 100644
--- a/third_party/WebKit/LayoutTests/webaudio/biquad-automation-expected.txt
+++ b/third_party/WebKit/LayoutTests/webaudio/biquad-automation-expected.txt
@@ -1,3 +1,5 @@
+CONSOLE WARNING: BiquadFilter.frequency.linearRampToValueAtTime value 8360 outside nominal range [0, 8000]; value will be clamped.
+CONSOLE WARNING: BiquadFilter.frequency.setValueAtTime value 10000 outside nominal range [0, 8000]; value will be clamped.
 Test Automation of Biquad Filters
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/webaudio/osc-custom-sweep-snr-expected.txt b/third_party/WebKit/LayoutTests/webaudio/osc-custom-sweep-snr-expected.txt
index 1e1733783..92c8ac1 100644
--- a/third_party/WebKit/LayoutTests/webaudio/osc-custom-sweep-snr-expected.txt
+++ b/third_party/WebKit/LayoutTests/webaudio/osc-custom-sweep-snr-expected.txt
@@ -1,3 +1,4 @@
+CONSOLE WARNING: Oscillator.frequency.exponentialRampToValue value 24050 outside nominal range [0, 22050]; value will be clamped.
 Test Custom Oscillator with Exponential Sweep
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/webaudio/osc-sawtooth-sweep-snr-expected.txt b/third_party/WebKit/LayoutTests/webaudio/osc-sawtooth-sweep-snr-expected.txt
index 790524a..53708baf 100644
--- a/third_party/WebKit/LayoutTests/webaudio/osc-sawtooth-sweep-snr-expected.txt
+++ b/third_party/WebKit/LayoutTests/webaudio/osc-sawtooth-sweep-snr-expected.txt
@@ -1,3 +1,4 @@
+CONSOLE WARNING: Oscillator.frequency.exponentialRampToValue value 24050 outside nominal range [0, 22050]; value will be clamped.
 Test Sawtooth Oscillator with Exponential Sweep
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/webaudio/osc-sine-sweep-snr-expected.txt b/third_party/WebKit/LayoutTests/webaudio/osc-sine-sweep-snr-expected.txt
index 8c376e8..237e7ea 100644
--- a/third_party/WebKit/LayoutTests/webaudio/osc-sine-sweep-snr-expected.txt
+++ b/third_party/WebKit/LayoutTests/webaudio/osc-sine-sweep-snr-expected.txt
@@ -1,3 +1,4 @@
+CONSOLE WARNING: Oscillator.frequency.exponentialRampToValue value 24050 outside nominal range [0, 22050]; value will be clamped.
 Test Sine Oscillator with Exponential Sweep
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/webaudio/osc-square-sweep-snr-expected.txt b/third_party/WebKit/LayoutTests/webaudio/osc-square-sweep-snr-expected.txt
index 1383e7f..cb5bf4e 100644
--- a/third_party/WebKit/LayoutTests/webaudio/osc-square-sweep-snr-expected.txt
+++ b/third_party/WebKit/LayoutTests/webaudio/osc-square-sweep-snr-expected.txt
@@ -1,3 +1,4 @@
+CONSOLE WARNING: Oscillator.frequency.exponentialRampToValue value 24050 outside nominal range [0, 22050]; value will be clamped.
 Test Square Oscillator with Exponential Sweep
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/webaudio/osc-triangle-sweep-snr-expected.txt b/third_party/WebKit/LayoutTests/webaudio/osc-triangle-sweep-snr-expected.txt
index 0e1ceb2..7c3726f 100644
--- a/third_party/WebKit/LayoutTests/webaudio/osc-triangle-sweep-snr-expected.txt
+++ b/third_party/WebKit/LayoutTests/webaudio/osc-triangle-sweep-snr-expected.txt
@@ -1,3 +1,4 @@
+CONSOLE WARNING: Oscillator.frequency.exponentialRampToValue value 24050 outside nominal range [0, 22050]; value will be clamped.
 Test Triangle Oscillator with Exponential Sweep
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/webaudio/panner-automation-basic-expected.txt b/third_party/WebKit/LayoutTests/webaudio/panner-automation-basic-expected.txt
new file mode 100644
index 0000000..fe9b2d7
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/webaudio/panner-automation-basic-expected.txt
@@ -0,0 +1,137 @@
+Test Basic PannerNode with Automation Position Properties.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS Stereo panner.positionX.value frame [0, 128) channel 0 contains only the constant 6.123234262925839e-17.
+PASS Stereo panner.positionX.value frame [0, 128) channel 1 contains only the constant 3.
+PASS Stereo panner.positionX.value frame [128, 256) channel 0 contains only the constant 6.123233968888981e-21.
+PASS Stereo panner.positionX.value frame [128, 256) channel 0 contains only the constant 0.00029999998514540493.
+PASS Output at frame 128 channel 0 is not equal to 6.123234262925839e-17.
+PASS Output at frame 128 channel 1 is not equal to 3.
+PASS Directly setting Stereo panner.positionX.value worked.
+
+PASS Mono panner.positionX.value frame [0, 128) channel 0 contains only the constant 6.123234262925839e-17.
+PASS Mono panner.positionX.value frame [0, 128) channel 1 contains only the constant 1.
+PASS Mono panner.positionX.value frame [128, 256) channel 0 contains only the constant 6.123233968888981e-21.
+PASS Mono panner.positionX.value frame [128, 256) channel 0 contains only the constant 0.00009999999747378752.
+PASS Output at frame 128 channel 0 is not equal to 6.123234262925839e-17.
+PASS Output at frame 128 channel 1 is not equal to 1.
+PASS Directly setting Mono panner.positionX.value worked.
+
+PASS Stereo panner.positionY.value frame [0, 128) channel 0 contains only the constant 6.123234262925839e-17.
+PASS Stereo panner.positionY.value frame [0, 128) channel 1 contains only the constant 3.
+PASS Stereo panner.positionY.value frame [128, 256) channel 0 contains only the constant 6.123233968888981e-21.
+PASS Stereo panner.positionY.value frame [128, 256) channel 0 contains only the constant 0.00029999998514540493.
+PASS Output at frame 128 channel 0 is not equal to 6.123234262925839e-17.
+PASS Output at frame 128 channel 1 is not equal to 3.
+PASS Directly setting Stereo panner.positionY.value worked.
+
+PASS Mono panner.positionY.value frame [0, 128) channel 0 contains only the constant 6.123234262925839e-17.
+PASS Mono panner.positionY.value frame [0, 128) channel 1 contains only the constant 1.
+PASS Mono panner.positionY.value frame [128, 256) channel 0 contains only the constant 6.123233968888981e-21.
+PASS Mono panner.positionY.value frame [128, 256) channel 0 contains only the constant 0.00009999999747378752.
+PASS Output at frame 128 channel 0 is not equal to 6.123234262925839e-17.
+PASS Output at frame 128 channel 1 is not equal to 1.
+PASS Directly setting Mono panner.positionY.value worked.
+
+PASS Stereo panner.positionZ.value frame [0, 128) channel 0 contains only the constant 1.
+PASS Stereo panner.positionZ.value frame [0, 128) channel 1 contains only the constant 2.
+PASS Stereo panner.positionZ.value frame [128, 256) channel 0 contains only the constant 0.00009999999747378752.
+PASS Stereo panner.positionZ.value frame [128, 256) channel 0 contains only the constant 0.00019999999494757503.
+PASS Output at frame 128 channel 0 is not equal to 1.
+PASS Output at frame 128 channel 1 is not equal to 2.
+PASS Directly setting Stereo panner.positionZ.value worked.
+
+PASS Mono panner.positionZ.value frame [0, 128) channel 0 contains only the constant 0.7071067690849304.
+PASS Mono panner.positionZ.value frame [0, 128) channel 1 contains only the constant 0.7071067690849304.
+PASS Mono panner.positionZ.value frame [128, 256) channel 0 contains only the constant 0.00007071067375363782.
+PASS Mono panner.positionZ.value frame [128, 256) channel 0 contains only the constant 0.00007071067375363782.
+PASS Output at frame 128 channel 0 is not equal to 0.7071067690849304.
+PASS Output at frame 128 channel 1 is not equal to 0.7071067690849304.
+PASS Directly setting Mono panner.positionZ.value worked.
+
+PASS Stereo listener.positionX.value frame [0, 128) channel 0 contains only the constant 1.
+PASS Stereo listener.positionX.value frame [0, 128) channel 1 contains only the constant 2.
+PASS Stereo listener.positionX.value frame [128, 256) channel 0 contains only the constant 0.00030002999119460583.
+PASS Stereo listener.positionX.value frame [128, 256) channel 0 contains only the constant 0.
+PASS Output at frame 128 channel 0 is not equal to 1.
+PASS Output at frame 128 channel 1 is not equal to 2.
+PASS Directly setting Stereo listener.positionX.value worked.
+
+PASS Mono listener.positionX.value frame [0, 128) channel 0 contains only the constant 0.7071067690849304.
+PASS Mono listener.positionX.value frame [0, 128) channel 1 contains only the constant 0.7071067690849304.
+PASS Mono listener.positionX.value frame [128, 256) channel 0 contains only the constant 0.00010001000191550702.
+PASS Mono listener.positionX.value frame [128, 256) channel 0 contains only the constant 0.
+PASS Output at frame 128 channel 0 is not equal to 0.7071067690849304.
+PASS Output at frame 128 channel 1 is not equal to 0.7071067690849304.
+PASS Directly setting Mono listener.positionX.value worked.
+
+PASS Stereo listener.positionY.value frame [0, 128) channel 0 contains only the constant 0.40824827551841736.
+PASS Stereo listener.positionY.value frame [0, 128) channel 1 contains only the constant 1.5629488229751587.
+PASS Stereo listener.positionY.value frame [128, 256) channel 0 contains only the constant 0.0000707106664776802.
+PASS Stereo listener.positionY.value frame [128, 256) channel 0 contains only the constant 0.00027071067597717047.
+PASS Output at frame 128 channel 0 is not equal to 0.40824827551841736.
+PASS Output at frame 128 channel 1 is not equal to 1.5629488229751587.
+PASS Directly setting Stereo listener.positionY.value worked.
+
+PASS Mono listener.positionY.value frame [0, 128) channel 0 contains only the constant 0.22094237804412842.
+PASS Mono listener.positionY.value frame [0, 128) channel 1 contains only the constant 0.5334020853042603.
+PASS Mono listener.positionY.value frame [128, 256) channel 0 contains only the constant 0.00003826833926723339.
+PASS Mono listener.positionY.value frame [128, 256) channel 0 contains only the constant 0.00009238795610144734.
+PASS Output at frame 128 channel 0 is not equal to 0.22094237804412842.
+PASS Output at frame 128 channel 1 is not equal to 0.5334020853042603.
+PASS Directly setting Mono listener.positionY.value worked.
+
+PASS Stereo listener.positionZ.value frame [0, 128) channel 0 contains only the constant 6.123234262925839e-17.
+PASS Stereo listener.positionZ.value frame [0, 128) channel 1 contains only the constant 3.
+PASS Stereo listener.positionZ.value frame [128, 256) channel 0 contains only the constant 0.00010001000191550702.
+PASS Stereo listener.positionZ.value frame [128, 256) channel 0 contains only the constant 0.00020003000099677593.
+PASS Output at frame 128 channel 0 is not equal to 6.123234262925839e-17.
+PASS Output at frame 128 channel 1 is not equal to 3.
+PASS Directly setting Stereo listener.positionZ.value worked.
+
+PASS Mono listener.positionZ.value frame [0, 128) channel 0 contains only the constant 6.123234262925839e-17.
+PASS Mono listener.positionZ.value frame [0, 128) channel 1 contains only the constant 1.
+PASS Mono listener.positionZ.value frame [128, 256) channel 0 contains only the constant 0.00007071421714499593.
+PASS Mono listener.positionZ.value frame [128, 256) channel 0 contains only the constant 0.0000707212820998393.
+PASS Output at frame 128 channel 0 is not equal to 6.123234262925839e-17.
+PASS Output at frame 128 channel 1 is not equal to 1.
+PASS Directly setting Mono listener.positionZ.value worked.
+
+PASS setPosition.value frame [0, 128) channel 0 contains only the constant 0.40824827551841736.
+PASS setPosition.value frame [0, 128) channel 1 contains only the constant 1.5629488229751587.
+PASS setPosition.value frame [128, 256) channel 0 contains only the constant 0.000124290119856596.
+PASS setPosition.value frame [128, 256) channel 0 contains only the constant 0.0002424988488201052.
+PASS Output at frame 128 channel 0 is not equal to 0.40824827551841736.
+PASS Output at frame 128 channel 1 is not equal to 1.5629488229751587.
+PASS Directly setting setPosition.value worked.
+
+PASS panner.orientation{XYZ}.value frame [0, 128) channel 0 contains only the constant 0.5005000233650208.
+PASS panner.orientation{XYZ}.value frame [0, 128) channel 1 contains only the constant 1.0010000467300415.
+PASS panner.orientation{XYZ}.value frame [128, 256) channel 0 contains only the constant 0.07899462431669235.
+PASS panner.orientation{XYZ}.value frame [128, 256) channel 0 contains only the constant 0.1579892486333847.
+PASS Output at frame 128 channel 0 is not equal to 0.5005000233650208.
+PASS Output at frame 128 channel 1 is not equal to 1.0010000467300415.
+PASS Directly setting panner.orientation{XYZ}.value worked.
+
+PASS listener.forward{XYZ}.value frame [0, 128) channel 0 contains only the constant 0.5005000233650208.
+PASS listener.forward{XYZ}.value frame [0, 128) channel 1 contains only the constant 1.0010000467300415.
+PASS listener.forward{XYZ}.value frame [128, 256) channel 0 contains only the constant 0.5133963823318481.
+PASS listener.forward{XYZ}.value frame [128, 256) channel 0 contains only the constant 1.0009169578552246.
+PASS Output at frame 128 channel 0 is not equal to 0.5005000233650208.
+PASS Output at frame 128 channel 1 is not equal to 1.0010000467300415.
+PASS Directly setting listener.forward{XYZ}.value worked.
+
+PASS listener.up{XYZ}.value frame [0, 128) channel 0 contains only the constant 0.12537498772144318.
+PASS listener.up{XYZ}.value frame [0, 128) channel 1 contains only the constant 0.47998905181884766.
+PASS listener.up{XYZ}.value frame [128, 256) channel 0 contains only the constant 0.1447705775499344.
+PASS listener.up{XYZ}.value frame [128, 256) channel 0 contains only the constant 0.4569823145866394.
+PASS Output at frame 128 channel 0 is not equal to 0.12537498772144318.
+PASS Output at frame 128 channel 1 is not equal to 0.47998905181884766.
+PASS Directly setting listener.up{XYZ}.value worked.
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/third_party/WebKit/LayoutTests/webaudio/panner-automation-basic.html b/third_party/WebKit/LayoutTests/webaudio/panner-automation-basic.html
new file mode 100644
index 0000000..8e7ed16
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/webaudio/panner-automation-basic.html
@@ -0,0 +1,255 @@
+<!doctype html>
+<html>
+  <head>
+    <script src="../resources/js-test.js"></script>
+    <script src="resources/compatibility.js"></script>
+    <script src="resources/audio-testing.js"></script>
+    <script src="resources/panner-formulas.js"></script>
+    <title>Test Basic PannerNode with Automation Position Properties</title>
+  </head>
+
+  <body>
+    <script>
+      description("Test Basic PannerNode with Automation Position Properties.");
+      window.jsTestIsAsync = true;
+
+      var sampleRate = 48000;
+
+      // These tests are quite slow, so don't run for many frames.  256 frames should be enough to
+      // demonstrate that automations are working.
+      var renderFrames = 256;
+      var renderDuration = renderFrames / sampleRate;
+
+      var audit = Audit.createTaskRunner();
+
+      // Array of tests for setting the panner positions.  These tests basically verify that the
+      // position setters for the panner and listener are working correctly.
+      var testConfig = [{
+        setter: "positionX",
+      }, {
+        setter: "positionY",
+      }, {
+        setter: "positionZ",
+      }];
+
+      // Create tests for the panner position setters.  Both mono and steroe sources are tested.
+      for (var k = 0; k < testConfig.length; ++k) {
+        var config = testConfig[k];
+        // Function to create the test to define the test.
+        var tester = function (config, channelCount) {
+          return function (done) {
+            var nodes = createGraph(channelCount);
+            var {context, source, panner} = nodes;
+
+            var message = channelCount == 1 ? "Mono" : "Stereo";
+            message += " panner." + config.setter;
+
+            testPositionSetter({
+              nodes: nodes,
+              pannerSetter: panner[config.setter],
+              message: message
+            }).then(done);
+          }
+        }
+
+        audit.defineTask("Stereo panner." + config.setter, tester(config, 2));
+        audit.defineTask("Mono panner."  + config.setter, tester(config, 1));
+      }
+          
+      // Create tests for the listener position setters.  Both mono and steroe sources are tested.
+      for (var k = 0; k < testConfig.length; ++k) {
+        var config = testConfig[k];
+        // Function to create the test to define the test.
+        var tester = function (config, channelCount) {
+          return function (done) {
+            var nodes = createGraph(channelCount);
+            var {context, source, panner} = nodes;
+
+            var message = channelCount == 1 ? "Mono" : "Stereo";
+            message += " listener." + config.setter;
+
+            // Some relatively arbitrary (non-default) position for the source location.
+            panner.setPosition(1,0,1);
+
+            testPositionSetter({
+              nodes: nodes,
+              pannerSetter: context.listener[config.setter],
+              message: message
+            }).then(done);
+          }
+        }
+
+        audit.defineTask("Stereo listener." + config.setter, tester(config, 2));
+        audit.defineTask("Mono listener."  + config.setter, tester(config, 1));
+      }
+
+      // Test setPosition method.
+      audit.defineTask("setPosition", function (done) {
+        var {context, panner, source} = createGraph(2);
+
+        // Initialize source position (values don't really matter).
+        panner.setPosition(1,1,1);
+
+        // After some (unimportant) time, move the panner to a (any) new location.
+        var suspendFrame = 128;
+        context.suspend(suspendFrame / sampleRate).then(function () {
+          panner.setPosition(-100, 2000, 8000);
+        }).then(context.resume.bind(context));
+
+        context.startRendering().then(function (resultBuffer) {
+          verifyPannerOutputChanged(resultBuffer, {message: "setPosition", suspendFrame: suspendFrame});
+        }).then(done);
+      });
+
+      audit.defineTask("orientation setter", function (done) {
+        var {context, panner, source} = createGraph(2);
+
+        // For orientation to matter, we need to make the source directional, and also move away
+        // from the listener (because the default location is 0,0,0).
+        panner.setPosition(0,0,1);
+        panner.coneInnerAngle = 0;
+        panner.coneOuterAngle = 360;
+        panner.coneOuterGain = .001;
+
+        // After some (unimportant) time, change the panner orientation to a new orientation.  The
+        // only constraint is that the orientation changes from before.
+        var suspendFrame = 128;
+        context.suspend(suspendFrame / sampleRate).then(function () {
+          panner.orientationX.value = -100;
+          panner.orientationY.value = 2000;
+          panner.orientationZ.value = 8000;
+        }).then(context.resume.bind(context));
+
+        context.startRendering().then(function (resultBuffer) {
+          verifyPannerOutputChanged(resultBuffer, {message: "panner.orientation{XYZ}", suspendFrame: suspendFrame});
+        }).then(done);
+      });
+
+      audit.defineTask("forward setter", function (done) {
+        var {context, panner, source} = createGraph(2);
+
+        // For orientation to matter, we need to make the source directional, and also move away
+        // from the listener (because the default location is 0,0,0).
+        panner.setPosition(0,0,1);
+        panner.coneInnerAngle = 0;
+        panner.coneOuterAngle = 360;
+        panner.coneOuterGain = .001;
+
+        // After some (unimportant) time, change the panner orientation to a new orientation.  The
+        // only constraint is that the orientation changes from before.
+        var suspendFrame = 128;
+        context.suspend(suspendFrame / sampleRate).then(function () {
+          context.listener.forwardX.value = -100;
+          context.listener.forwardY.value = 2000;
+          context.listener.forwardZ.value = 8000;
+        }).then(context.resume.bind(context));
+
+        context.startRendering().then(function (resultBuffer) {
+          verifyPannerOutputChanged(resultBuffer, {message: "listener.forward{XYZ}", suspendFrame: suspendFrame});
+        }).then(done);
+      });
+
+      audit.defineTask("up setter", function (done) {
+        var {context, panner, source} = createGraph(2);
+
+        // For orientation to matter, we need to make the source directional, and also move away
+        // from the listener (because the default location is 0,0,0).
+        panner.setPosition(0,0,1);
+        panner.coneInnerAngle = 0;
+        panner.coneOuterAngle = 360;
+        panner.coneOuterGain = .001;
+        panner.setPosition(1,0,1);
+
+        // After some (unimportant) time, change the panner orientation to a new orientation.  The
+        // only constraint is that the orientation changes from before.
+        var suspendFrame = 128;
+        context.suspend(suspendFrame / sampleRate).then(function () {
+          context.listener.upX.value = 100;
+          context.listener.upY.value = 100;
+          context.listener.upZ.value = 100;;
+        }).then(context.resume.bind(context));
+
+        context.startRendering().then(function (resultBuffer) {
+          verifyPannerOutputChanged(resultBuffer, {message: "listener.up{XYZ}", suspendFrame: suspendFrame});
+        }).then(done);
+      });
+
+      audit.defineTask("finish", function (done) {
+        finishJSTest();
+        done();
+      });
+
+      audit.runTasks();
+
+      function createGraph(channelCount) {
+        var context = new OfflineAudioContext(2, renderFrames, sampleRate);
+        var panner = context.createPanner();
+        var source = context.createBufferSource();
+        source.buffer = createConstantBuffer(context, 1, channelCount == 1 ? 1 : [1, 2]);
+        source.loop = true;
+
+        source.connect(panner);
+        panner.connect(context.destination);
+
+        source.start();
+        return {
+          context: context,
+          source: source,
+          panner: panner
+        };
+      }
+
+      function testPositionSetter(options) {
+        var {nodes, pannerSetter, message} = options;
+
+        var {context, source, panner} = nodes;
+
+        // Set panner x position. (Value doesn't matter);
+        pannerSetter.value = 1;
+
+        // Wait a bit and set a new position.  (Actual time and position doesn't matter).
+        var suspendFrame = 128;
+        context.suspend(suspendFrame / sampleRate).then(function () {
+          pannerSetter.value = 10000;
+        }).then(context.resume.bind(context));
+
+        return context.startRendering().then(function (resultBuffer) {
+          verifyPannerOutputChanged(resultBuffer, {message: message, suspendFrame: suspendFrame});
+        });
+      }
+
+      function verifyPannerOutputChanged(resultBuffer, options) {
+        var {message, suspendFrame} = options;
+          // Verify that the first part of output is constant. (Doesn't matter what.)
+          var success = true;
+          var data0 = resultBuffer.getChannelData(0);
+          var data1 = resultBuffer.getChannelData(1);
+
+          var middle = "[0, " + suspendFrame + ") ";
+          success = Should(message + ".value frame " + middle + "channel 0", data0.slice(0, suspendFrame))
+            .beConstantValueOf(data0[0]) && success;
+          success = Should(message + ".value frame " + middle + "channel 1", data1.slice(0, suspendFrame))
+            .beConstantValueOf(data1[0]) && success;
+
+          // The rest after suspendTime should be constant and different from the first part.
+          middle = "[" + suspendFrame + ", " + renderFrames + ") ";
+          success = Should(message + ".value frame " + middle + "channel 0",
+             data0.slice(suspendFrame))
+            .beConstantValueOf(data0[suspendFrame]) && success;
+          success = Should(message + ".value frame " + middle + "channel 0",
+             data1.slice(suspendFrame))
+            .beConstantValueOf(data1[suspendFrame]) && success;
+          success = Should("Output at frame " + suspendFrame + " channel 0", data0[suspendFrame])
+            .notBeEqualTo(data0[0]) && success;
+          success = Should("Output at frame " + suspendFrame + " channel 1", data1[suspendFrame])
+            .notBeEqualTo(data1[0]) && success;
+
+          var prefix = "Directly setting " + message + ".value";
+          if (success)
+            testPassed(prefix + " worked.\n");
+          else
+            testFailed(prefix + " failed.\n");
+      }
+    </script>
+  </body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/webaudio/panner-automation-equalpower-stereo-expected.txt b/third_party/WebKit/LayoutTests/webaudio/panner-automation-equalpower-stereo-expected.txt
new file mode 100644
index 0000000..5987c72
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/webaudio/panner-automation-equalpower-stereo-expected.txt
@@ -0,0 +1,13 @@
+Test equal-power panner model of AudioPannerNode with stereo source.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS Number of impulses matches the number of panner nodes.
+PASS All impulses at expected offsets.
+PASS Left channel gain values are correct.
+PASS Right channel gain values are correct.
+PASS EqualPower panner test passed
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/third_party/WebKit/LayoutTests/webaudio/panner-automation-equalpower-stereo.html b/third_party/WebKit/LayoutTests/webaudio/panner-automation-equalpower-stereo.html
new file mode 100644
index 0000000..42e6e285
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/webaudio/panner-automation-equalpower-stereo.html
@@ -0,0 +1,47 @@
+<!doctype html>
+<html>
+  <head>
+    <script src="resources/compatibility.js"></script>
+    <script src="resources/audio-testing.js"></script>
+    <script src="../resources/js-test.js"></script>
+    <script src="resources/panner-model-testing.js"></script>
+  </head>
+
+  <body>
+    <div id="description"></div>
+    <div id="console"></div>
+
+    <script>
+      description("Test equal-power panner model of AudioPannerNode with stereo source.");
+
+      // To test the panner, we create a number of panner nodes
+      // equally spaced on a semicircle at unit distance.  The
+      // semicircle covers the azimuth range from -90 to 90 deg,
+      // covering full left to full right.  Each source is an impulse
+      // turning at a different time and we check that the rendered
+      // impulse has the expected gain.
+      function runTest() {
+          if (window.testRunner) {
+              testRunner.dumpAsText();
+              testRunner.waitUntilDone();
+          }
+
+          window.jsTestIsAsync = true;
+
+          // Create offline audio context.
+          context = new OfflineAudioContext(2, sampleRate * renderLengthSeconds, sampleRate);
+
+          createTestAndRun(context, nodesToCreate, 2, function (panner, x, y, z) {
+            panner.positionX.value = x;
+            panner.positionY.value = y;
+            panner.positionZ.value = z;
+          });
+      }
+
+      runTest();
+      successfullyParsed = true;
+
+    </script>
+
+  </body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/webaudio/panner-automation-position-expected.txt b/third_party/WebKit/LayoutTests/webaudio/panner-automation-position-expected.txt
new file mode 100644
index 0000000..971fbdb
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/webaudio/panner-automation-position-expected.txt
@@ -0,0 +1,25 @@
+Test Automation of PannerNode Positions.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS 1-channel [0, 0, 1] -> [0, 0, 10000]: distanceModel: inverse, rolloff: 1, left channel equals [0.7071067690849304,0.013321999460458755,0.0067243436351418495,0.00449715182185173,0.0033782348036766052,0.002705172635614872,0.0022557489573955536,0.0019343806197866797,0.0016931620193645358,0.0015054333489388227,0.0013551785377785563,0.0012321951799094677,0.0011296762386336923,0.00104290631134063,0.0009685150580480695,0.0009040298755280674,...] with an element-wise tolerance of 0.
+PASS 1-channel [0, 0, 1] -> [0, 0, 10000]: distanceModel: inverse, rolloff: 1, right channel equals [0.7071067690849304,0.013321999460458755,0.0067243436351418495,0.00449715182185173,0.0033782348036766052,0.002705172635614872,0.0022557489573955536,0.0019343806197866797,0.0016931620193645358,0.0015054333489388227,0.0013551785377785563,0.0012321951799094677,0.0011296762386336923,0.00104290631134063,0.0009685150580480695,0.0009040298755280674,...] with an element-wise tolerance of 0.
+PASS 2-channel [0, 0, 1] -> [0, 0, 10000]: distanceModel: inverse, rolloff: 1, left channel equals [1,0.018840152770280838,0.009509658440947533,0.006359932944178581,0.0047775455750525,0.003825691994279623,0.003190110670402646,0.0027356273494660854,0.0023944927379488945,0.0021290043368935585,0.0019165119156241417,0.0017425871919840574,0.0015976035501807928,0.0014748922549188137,0.0013696871465072036,0.001278491341508925,...] with an element-wise tolerance of 0.
+PASS 2-channel [0, 0, 1] -> [0, 0, 10000]: distanceModel: inverse, rolloff: 1, right channel equals [2,0.037680305540561676,0.019019316881895065,0.012719865888357162,0.009555091150105,0.007651383988559246,0.006380221340805292,0.005471254698932171,0.004788985475897789,0.004258008673787117,0.0038330238312482834,0.003485174383968115,0.0031952071003615856,0.0029497845098376274,0.002739374293014407,0.00255698268301785,...] with an element-wise tolerance of 0.
+PASS 1-channel [0, 0, 1] -> [20000, 30000, 10000]: distanceModel: inverse, rolloff: 1, left channel equals [0.7071067690849304,0.001196307479403913,0.0005938085960224271,0.0003949022793676704,0.0002958123222924769,0.00023647479247301817,0.00019696500385180116,0.00016876752488315105,0.00014763248327653855,0.0001312017993768677,0.00011806215479737148,0.00010731472139013931,0.00009836074605118483,0.00009078587027033791,0.00008429430454270914,0.00007866910891607404,...] with an element-wise tolerance of {absoluteThreshold: 0, relativeThreshold: 4.8124e-7}.
+PASS 1-channel [0, 0, 1] -> [20000, 30000, 10000]: distanceModel: inverse, rolloff: 1, right channel equals [0.7071067690849304,0.00498276436701417,0.002494250191375613,0.0016634686617180705,0.0012478390708565712,0.0009983853669837117,0.0008320511551573873,0.0007132254540920258,0.0006240977090783417,0.000554771046154201,0.0004993066540919244,0.00045392452739179134,0.00041610468178987503,0.00038410225533880293,0.000356670847395435,0.000332896423060447,...] with an element-wise tolerance of {absoluteThreshold: 0, relativeThreshold: 4.8124e-7}.
+PASS 2-channel [0, 0, 1] -> [20000, 30000, 10000]: distanceModel: inverse, rolloff: 1, left channel equals [1,0.002326501300558448,0.0011553276563063264,0.0007684475276619196,0.000575670157559216,0.0004602163680829108,0.0003833358350675553,0.0003284646081738174,0.00028733513318002224,0.00025535948225297034,0.0002297879836987704,0.00020887165737804025,0.00019144543330185115,0.00017670303350314498,0.00016406884242314845,0.00015312072355300188,...] with an element-wise tolerance of {absoluteThreshold: 0, relativeThreshold: 4.3267e-7}.
+PASS 2-channel [0, 0, 1] -> [20000, 30000, 10000]: distanceModel: inverse, rolloff: 1, right channel equals [2,0.014814520254731178,0.007416830863803625,0.004946674220263958,0.003710799152031541,0.002969020279124379,0.002474395092576742,0.0021210394334048033,0.001855994458310306,0.0016498314216732979,0.0014848907012492418,0.00134993193205446,0.0012374616926535964,0.001142291002906859,0.0010607137810438871,0.0009900116128847003,...] with an element-wise tolerance of {absoluteThreshold: 0, relativeThreshold: 4.3267e-7}.
+PASS 1-channel [0, 0, 1] -> [20000, 30000, 10000]: distanceModel: exponential, rolloff: 1.5, left channel equals [0.7071067690849304,0.00008563726441934705,0.000030067832994973287,0.000016328625861206092,0.000010593314073048532,0.000007574611117888708,0.000005759487976320088,0.0000045689607759413775,0.0000037386932945082663,0.0000031326046610047342,0.0000026742441150418017,0.0000023176937702373834,0.0000020338857211754657,0.0000018036150777334115,0.0000016137381635417114,0.0000014549860907209222,...] with an element-wise tolerance of {absoluteThreshold: 0, relativeThreshold: 5.0783e-7}.
+PASS 1-channel [0, 0, 1] -> [20000, 30000, 10000]: distanceModel: exponential, rolloff: 1.5, right channel equals [0.7071067690849304,0.00035668950295075774,0.00012629777484107763,0.00006878197018522769,0.000044686275941785425,0.000031979649065760896,0.00002433015288261231,0.00001930880534928292,0.000015804853319423273,0.000013245842637843452,0.000011309872206766158,0.00000980348249868257,0.00000860413729242282,0.00000763084153732052,0.0000068281406129244715,0.000006156923518574331,...] with an element-wise tolerance of {absoluteThreshold: 0, relativeThreshold: 5.0783e-7}.
+PASS 2-channel [0, 0, 1] -> [20000, 30000, 10000]: distanceModel: exponential, rolloff: 1.5, left channel equals [1,0.00016654180944897234,0.00005850067100254819,0.00003177416874677874,0.00002061528357444331,0.000014741360246262047,0.000011209189324290492,0.000008892362529877573,0.000007276568794623017,0.000006097022378526162,0.000005204963144933572,0.000004511035513132811,0.000003958673914894462,0.000003510504939185921,0.0000031409495022671763,0.0000028319695957179647,...] with an element-wise tolerance of {absoluteThreshold: 0, relativeThreshold: 5.218e-7}.
+PASS 2-channel [0, 0, 1] -> [20000, 30000, 10000]: distanceModel: exponential, rolloff: 1.5, right channel equals [2,0.0010604923591017723,0.0003755554498638958,0.0002045376895694062,0.00013288715854287148,0.00009510177915217355,0.00007235421799123287,0.00005742186840507202,0.00004700180943473242,0.00003939175803679973,0.00003363448922755197,0.00002915470213338267,0.000025588007702026516,0.000022693546270602383,0.0000203064064407954,0.000018310278392164037,...] with an element-wise tolerance of {absoluteThreshold: 0, relativeThreshold: 5.218e-7}.
+PASS 1-channel [0, 0, 1] -> [20000, 30000, 10000]: distanceModel: linear, rolloff: 1, left channel equals [0.7071067690849304,0.22892199456691742,0.22258761525154114,0.21748939156532288,0.21270129084587097,0.2080373466014862,0.2034355252981186,0.19886919856071472,0.19432516396045685,0.1897958517074585,0.18527695536613464,0.18076558411121368,0.1762598603963852,0.17175845801830292,0.1672605574131012,0.16276535391807556,...] with an element-wise tolerance of {absoluteThreshold: 0, relativeThreshold: 0.0000065324}.
+PASS 1-channel [0, 0, 1] -> [20000, 30000, 10000]: distanceModel: linear, rolloff: 1, right channel equals [0.7071067690849304,0.9534875750541687,0.9349632859230042,0.9161425232887268,0.8972479104995728,0.8783238530158997,0.8593849539756775,0.840437650680542,0.8214850425720215,0.8025290369987488,0.7835704684257507,0.7646101713180542,0.7456485629081726,0.7266858816146851,0.7077224254608154,0.6887583136558533,...] with an element-wise tolerance of {absoluteThreshold: 0, relativeThreshold: 0.0000065324}.
+PASS 2-channel [0, 0, 1] -> [20000, 30000, 10000]: distanceModel: linear, rolloff: 1, left channel equals [1,0.4451926648616791,0.4330716133117676,0.4232165515422821,0.41393065452575684,0.40487271547317505,0.39592882990837097,0.38705015182495117,0.37821245193481445,0.369401752948761,0.3606102168560028,0.35183247923851013,0.34306514263153076,0.3343057632446289,0.3255528211593628,0.31680476665496826,...] with an element-wise tolerance of {absoluteThreshold: 0, relativeThreshold: 0.0000065756}.
+PASS 2-channel [0, 0, 1] -> [20000, 30000, 10000]: distanceModel: linear, rolloff: 1, right channel equals [2,2.834864377975464,2.780179977416992,2.7243428230285645,2.6682181358337402,2.611978530883789,2.5556817054748535,2.499351978302002,2.4430017471313477,2.3866379261016846,2.3302643299102783,2.2738840579986572,2.217498540878296,2.16110897064209,2.1047163009643555,2.048321008682251,...] with an element-wise tolerance of {absoluteThreshold: 0, relativeThreshold: 0.0000065756}.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/third_party/WebKit/LayoutTests/webaudio/panner-automation-position.html b/third_party/WebKit/LayoutTests/webaudio/panner-automation-position.html
new file mode 100644
index 0000000..34e3b21
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/webaudio/panner-automation-position.html
@@ -0,0 +1,266 @@
+<!doctype html>
+<html>
+  <head>
+    <script src="../resources/js-test.js"></script>
+    <script src="resources/compatibility.js"></script>
+    <script src="resources/audio-testing.js"></script>
+    <script src="resources/panner-formulas.js"></script>
+    <title>Test Automation of PannerNode Positions</title>
+  </head>
+
+  <body>
+    <script>
+      description("Test Automation of PannerNode Positions.");
+      window.jsTestIsAsync = true;
+
+      var sampleRate = 48000;
+      // These tests are quite slow, so don't run for many frames.  256 frames should be enough to
+      // demonstrate that automations are working.
+      var renderFrames = 256;
+      var renderDuration = renderFrames / sampleRate;
+
+      var context;
+      var panner;
+
+      var audit = Audit.createTaskRunner();
+
+      // Set of tests for the panner node with automations applied to the position of the source.
+      var testConfigs = [{
+        // Distance model parameters for the panner
+        distanceModel: {
+          model: "inverse",
+          rolloff: 1
+        },
+        // Initial location of the source
+        startPosition: [0, 0, 1],
+        // Final position of the source.  For this test, we only want to move on the z axis which
+        // doesn't change the azimuth angle.
+        endPosition: [0, 0, 10000],
+      }, {
+        distanceModel: {
+          model: "inverse",
+          rolloff: 1
+        },
+        startPosition: [0, 0, 1],
+        // An essentially random end position, but it should be such that azimuth angle changes as
+        // we move from the start to the end.
+        endPosition: [20000, 30000, 10000],
+        errorThreshold: [{
+          // Error threshold for 1-channel case
+          relativeThreshold: 4.8124e-7
+        }, {
+          // Error threshold for 2-channel case
+          relativeThreshold: 4.3267e-7
+        }],
+      }, {
+        distanceModel: {
+          model: "exponential",
+          rolloff: 1.5
+        },
+        startPosition: [0, 0, 1],
+        endPosition: [20000, 30000, 10000],
+        errorThreshold: [{
+          relativeThreshold: 5.0783e-7
+        }, {
+          relativeThreshold: 5.2180e-7
+        }]
+      }, {
+        distanceModel: {
+          model: "linear",
+          rolloff: 1
+        },
+        startPosition: [0, 0, 1],
+        endPosition: [20000, 30000, 10000],
+        errorThreshold: [{
+          relativeThreshold: 6.5324e-6
+        }, {
+          relativeThreshold: 6.5756e-6
+        }]
+      }];
+
+      for (var k = 0; k < testConfigs.length; ++k) {
+        var config = testConfigs[k];
+        var tester = function (c, channelCount) {
+          return function (done) {
+            runTest(c, channelCount).then(done);
+          }
+        };
+
+        var baseTestName = config.distanceModel.model + " rolloff: " + config.distanceModel.rolloff;
+
+        // Define tasks for both 1-channel and 2-channel
+        audit.defineTask(k + ": 1-channel " + baseTestName, tester(config, 1));
+        audit.defineTask(k + ": 2-channel " + baseTestName, tester(config, 2));
+      }
+
+      audit.defineTask("finish", function (done) {
+        finishJSTest();
+        done();
+      });
+
+      audit.runTasks();
+
+      function runTest(options, channelCount) {
+        // Output has 5 channels: channels 0 and 1 are for the stereo output of the panner node.
+        // Channels 2-5 are the for automation of the x,y,z coordinate so that we have actual
+        // coordinates used for the panner automation.
+        context = new OfflineAudioContext(5, renderFrames, sampleRate);
+
+        // Stereo source for the panner.
+        var source = context.createBufferSource();
+        source.buffer = createConstantBuffer(context, renderFrames, channelCount == 1 ? 1 : [1, 2]);
+
+        panner = context.createPanner();
+        panner.distanceModel = options.distanceModel.model;
+        panner.rolloffFactor = options.distanceModel.rolloff;
+        panner.panningModel = "equalpower";
+
+        // Source and gain node for the z-coordinate calculation.
+        var dist = context.createBufferSource();
+        dist.buffer = createConstantBuffer(context, 1, 1);
+        dist.loop = true;
+        var gainX = context.createGain();
+        var gainY = context.createGain();
+        var gainZ = context.createGain();
+        dist.connect(gainX);
+        dist.connect(gainY);
+        dist.connect(gainZ);
+
+        // Set the gain automation to match the z-coordinate automation of the panner.
+
+        // End the automation some time before the end of the rendering so we can verify that
+        // automation has the correct end time and value.
+        var endAutomationTime = 0.75 * renderDuration;
+
+        gainX.gain.setValueAtTime(options.startPosition[0], 0);
+        gainX.gain.linearRampToValueAtTime(options.endPosition[0], endAutomationTime);
+        gainY.gain.setValueAtTime(options.startPosition[1], 0);
+        gainY.gain.linearRampToValueAtTime(options.endPosition[1], endAutomationTime);
+        gainZ.gain.setValueAtTime(options.startPosition[2], 0);
+        gainZ.gain.linearRampToValueAtTime(options.endPosition[2], endAutomationTime);
+
+        dist.start();
+
+        // Splitter and merger to map the panner output and the z-coordinate automation to the
+        // correct channels in the destination.
+        var splitter = context.createChannelSplitter(2);
+        var merger = context.createChannelMerger(5);
+
+        source.connect(panner);
+        // Split the output of the panner to separate channels
+        panner.connect(splitter);
+
+        // Merge the panner outputs and the z-coordinate output to the correct destination channels.
+        splitter.connect(merger, 0, 0);
+        splitter.connect(merger, 1, 1);
+        gainX.connect(merger, 0, 2);
+        gainY.connect(merger, 0, 3);
+        gainZ.connect(merger, 0, 4);
+
+        merger.connect(context.destination);
+
+        // Initialize starting point of the panner.
+        panner.positionX.setValueAtTime(options.startPosition[0], 0);
+        panner.positionY.setValueAtTime(options.startPosition[1], 0);
+        panner.positionZ.setValueAtTime(options.startPosition[2], 0);
+
+        // Automate z coordinate to move away from the listener
+        panner.positionX.linearRampToValueAtTime(options.endPosition[0], 0.75 * renderDuration);
+        panner.positionY.linearRampToValueAtTime(options.endPosition[1], 0.75 * renderDuration);
+        panner.positionZ.linearRampToValueAtTime(options.endPosition[2], 0.75 * renderDuration);
+
+        source.start();
+
+        // Go!
+        return context.startRendering()
+          .then(function (renderedBuffer) {
+            // Get the panner outputs
+            var data0 = renderedBuffer.getChannelData(0);
+            var data1 = renderedBuffer.getChannelData(1);
+            var xcoord = renderedBuffer.getChannelData(2);
+            var ycoord = renderedBuffer.getChannelData(3);
+            var zcoord = renderedBuffer.getChannelData(4);
+
+            // We're doing a linear ramp on the Z axis with the equalpower panner, so the equalpower
+            // panning gain remains constant.  We only need to model the distance effect.
+
+            // Compute the distance gain
+            var distanceGain = new Float32Array(xcoord.length);;
+
+            if (panner.distanceModel === "inverse") {
+              for (var k = 0; k < distanceGain.length; ++k) {
+                distanceGain[k] = inverseDistance(panner, xcoord[k], ycoord[k], zcoord[k])
+              }
+            } else if (panner.distanceModel === "linear") {
+              for (var k = 0; k < distanceGain.length; ++k) {
+                distanceGain[k] = linearDistance(panner, xcoord[k], ycoord[k], zcoord[k])
+              }
+            } else if (panner.distanceModel === "exponential") {
+              for (var k = 0; k < distanceGain.length; ++k) {
+                distanceGain[k] = exponentialDistance(panner, xcoord[k], ycoord[k], zcoord[k])
+              }
+            }
+
+            // Compute the expected result.  Since we're on the z-axis, the left and right channels
+            // pass through the equalpower panner unchanged.  Only need to apply the distance gain.
+            var buffer0 = source.buffer.getChannelData(0);
+            var buffer1 = channelCount == 2 ? source.buffer.getChannelData(1) : buffer0;
+
+            var azimuth = new Float32Array(buffer0.length);
+      
+            for (var k = 0; k < data0.length; ++k) {
+              azimuth[k] = calculateAzimuth([
+                xcoord[k],
+                ycoord[k],
+                zcoord[k]
+              ], [
+                context.listener.positionX.value,
+                context.listener.positionY.value,
+                context.listener.positionZ.value
+              ], [
+                context.listener.forwardX.value,
+                context.listener.forwardY.value,
+                context.listener.forwardZ.value
+              ], [
+                context.listener.upX.value,
+                context.listener.upY.value,
+                context.listener.upZ.value
+              ]);
+            }
+
+           var expected = applyPanner(azimuth, buffer0, buffer1, channelCount);
+           var expected0 = expected.left;
+           var expected1 = expected.right;
+          
+           for (var k = 0; k < expected0.length; ++k) {
+              expected0[k] *= distanceGain[k];
+              expected1[k] *= distanceGain[k];
+            }
+
+            var info = options.distanceModel.model + ", rolloff: " + options.distanceModel.rolloff;
+            var prefix = channelCount + "-channel "
+              + "[" + options.startPosition[0] + ", "
+              + options.startPosition[1] + ", "
+              + options.startPosition[2] + "] -> ["
+              + options.endPosition[0] + ", "
+              + options.endPosition[1] + ", "
+              + options.endPosition[2] + "]: ";
+
+            var errorThreshold = 0;
+
+            if (options.errorThreshold)
+               errorThreshold = options.errorThreshold[channelCount - 1]
+
+            Should(prefix + "distanceModel: " + info + ", left channel", data0, {
+                verbose: true
+              })
+              .beCloseToArray(expected0, errorThreshold);
+            Should(prefix + "distanceModel: " + info + ", right channel", data1, {
+                verbose: true
+              })
+              .beCloseToArray(expected1, errorThreshold);
+          });
+      }
+    </script>
+  </body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/webaudio/panner-equalpower-stereo.html b/third_party/WebKit/LayoutTests/webaudio/panner-equalpower-stereo.html
index 79af7c6..ed76004 100644
--- a/third_party/WebKit/LayoutTests/webaudio/panner-equalpower-stereo.html
+++ b/third_party/WebKit/LayoutTests/webaudio/panner-equalpower-stereo.html
@@ -31,7 +31,9 @@
           // Create offline audio context.
           context = new OfflineAudioContext(2, sampleRate * renderLengthSeconds, sampleRate);
 
-          createTestAndRun(context, nodesToCreate, 2);
+          createTestAndRun(context, nodesToCreate, 2, function (panner, x, y, z) {
+            panner.setPosition(x, y, z);
+          });
       }
 
       runTest();
diff --git a/third_party/WebKit/LayoutTests/webaudio/panner-equalpower.html b/third_party/WebKit/LayoutTests/webaudio/panner-equalpower.html
index dfddb83..2ce02a9e 100644
--- a/third_party/WebKit/LayoutTests/webaudio/panner-equalpower.html
+++ b/third_party/WebKit/LayoutTests/webaudio/panner-equalpower.html
@@ -31,7 +31,9 @@
           // Create offline audio context.
           context = new OfflineAudioContext(2, sampleRate * renderLengthSeconds, sampleRate);
 
-          createTestAndRun(context, nodesToCreate, 1);
+          createTestAndRun(context, nodesToCreate, 1, function (panner, x, y, z) {
+            panner.setPosition(x, y, z);
+          });
       }
 
       runTest();
diff --git a/third_party/WebKit/LayoutTests/webaudio/pannernode-basic-expected.txt b/third_party/WebKit/LayoutTests/webaudio/pannernode-basic-expected.txt
index d8350b3d..5523206 100644
--- a/third_party/WebKit/LayoutTests/webaudio/pannernode-basic-expected.txt
+++ b/third_party/WebKit/LayoutTests/webaudio/pannernode-basic-expected.txt
@@ -1,32 +1,66 @@
+CONSOLE WARNING: The provided value 'invalid' is not a valid enum value of type PanningModelType.
 CONSOLE WARNING: The provided value '1' is not a valid enum value of type PanningModelType.
-CONSOLE WARNING: The provided value '1' is not a valid enum value of type DistanceModelType.
+CONSOLE WARNING: The provided value 'invalid' is not a valid enum value of type DistanceModelType.
 Basic tests for PannerNode.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
-PASS PannerNode has one input.
-PASS PannerNode has one output.
-PASS refDistance default value is 1.
-PASS refDistance value is set to 270.52.
-PASS maxDistance default value is 10000.
-PASS maxDistance value is set to 100.55.
-PASS rolloffFactor default value is 1.
-PASS rolloffFactor value is set to 0.83.
-PASS coneInnerAngle default value is 360.
-PASS coneInnerAngle value is set to 240.45.
-PASS coneOuterAngle default value is 360.
-PASS coneOuterAngle value is set to 166.66.
-PASS coneOuterGain default value is 0.
-PASS coneOuterGain value is set to 0.35.
-PASS PannerNode defaults to 'equalpower' panningModel.
-PASS PannerNode defaults to 'inverse' distanceModel.
-PASS panningModel: 'equalpower' is settable.
-PASS panningModel: 'HRTF' is settable.
-PASS panningModel correctly not set to 1.
-PASS distanceModel: 'linear' is settable.
-PASS distanceModel: 'inverse' is settable.
-PASS distanceModel: 'exponential' is settable.
-PASS distanceModel correctly not set to 1.
+
+PASS panner.numberOfInputs is equal to 1.
+PASS panner.numberOfOutputs is equal to 1.
+PASS panner.refDistance is equal to 1.
+PASS panner.refDistance = 270.5 is equal to 270.5.
+PASS panner.maxDistance is equal to 10000.
+PASS panner.maxDistance = 100.5 is equal to 100.5.
+PASS panner.rolloffFactor is equal to 1.
+PASS panner.rolloffFactor = 0.75 is equal to 0.75.
+PASS panner.coneInnerAngle is equal to 360.
+PASS panner.coneInnerAngle = 240.5 is equal to 240.5.
+PASS panner.coneOuterAngle is equal to 360.
+PASS panner.coneOuterAngle = 166.5 is equal to 166.5.
+PASS panner.coneOuterGain is equal to 0.
+PASS panner.coneOuterGain = 0.25 is equal to 0.25.
+PASS panner.panningModel is equal to "equalpower".
+PASS panner.distanceModel is equal to "inverse".
+PASS panner.positionX is equal to 0.
+PASS panner.positionY is equal to 0.
+PASS panner.positionZ is equal to 0.
+PASS panner.orientationX is equal to 1.
+PASS panner.orientationY is equal to 0.
+PASS panner.orientationZ is equal to 0.
+PASS Basic Panner attribute tests.
+
+PASS listener.positionX is equal to 0.
+PASS listener.positionY is equal to 0.
+PASS listener.positionZ is equal to 0.
+PASS listener.forwardX is equal to 0.
+PASS listener.forwardY is equal to 0.
+PASS listener.forwardZ is equal to -1.
+PASS listener.upX is equal to 0.
+PASS listener.upY is equal to 1.
+PASS listener.upZ is equal to 0.
+PASS Basic AudioListener attribute tests.
+
+PASS panner.panningModel = "equalpower" did not throw an exception.
+PASS panner.panningModel = "equalpower" is equal to "equalpower".
+PASS panner.panningModel = "HRTF" did not throw an exception.
+PASS panner.panningModel = "HRTF" is equal to "HRTF".
+PASS panner.panningModel = "invalid" did not throw an exception.
+PASS panner.panningModel is equal to "HRTF".
+PASS panner.panningModel = 1 did not throw an exception.
+PASS panner.panningModel is equal to "HRTF".
+PASS Basic Panner panning models tests.
+
+PASS panner.distanceModel = "linear" did not throw an exception.
+PASS panner.distanceModel = "linear" is equal to "linear".
+PASS panner.distanceModel = "inverse" did not throw an exception.
+PASS panner.distanceModel = "inverse" is equal to "inverse".
+PASS panner.distanceModel = "exponential" did not throw an exception.
+PASS panner.distanceModel = "exponential" is equal to "exponential".
+PASS panner.distanceModel = "invalid" did not throw an exception.
+PASS panner.distanceModel is equal to "exponential".
+PASS Basic Panner distance models tests.
+
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/webaudio/pannernode-basic.html b/third_party/WebKit/LayoutTests/webaudio/pannernode-basic.html
index 41e021b..ba42150 100644
--- a/third_party/WebKit/LayoutTests/webaudio/pannernode-basic.html
+++ b/third_party/WebKit/LayoutTests/webaudio/pannernode-basic.html
@@ -1,184 +1,196 @@
 <!DOCTYPE html>
 <html>
-<head>
-<script src="../resources/js-test.js"></script>
-<script src="resources/compatibility.js"></script>
-<script src="resources/audio-testing.js"></script>
-</head>
 
-<body>
-<div id="description"></div>
-<div id="console"></div>
+  <head>
+    <script src="../resources/js-test.js"></script>
+    <script src="resources/compatibility.js"></script>
+    <script src="resources/audio-testing.js"></script>
+  </head>
 
-<script>
-description("Basic tests for PannerNode.");
+  <body>
+    <script>
+      description("Basic tests for PannerNode.");
+      window.jsTestIsAsync = true;
 
-var context = 0;
+      var context;
+      var panner;
+      var audit = Audit.createTaskRunner();
 
-function runTest() {
-    if (window.testRunner) {
-        testRunner.dumpAsText();
-        testRunner.waitUntilDone();
-    }
+      audit.defineTask("initialize", function (done) {
+        context = new AudioContext();
+        panner = context.createPanner();
+        done();
+      });
 
-    window.jsTestIsAsync = true;
+      audit.defineTask("basic", function (done) {
+        var success = true;
 
-    context = new AudioContext();
-    var panner = context.createPanner();
+        success = Should("panner.numberOfInputs", panner.numberOfInputs)
+          .beEqualTo(1) && success;
+        success = Should("panner.numberOfOutputs", panner.numberOfOutputs)
+          .beEqualTo(1) && success;
+        success = Should("panner.refDistance", panner.refDistance)
+          .beEqualTo(1) && success;
+        panner.refDistance = 270.5;
+        success = Should("panner.refDistance = 270.5", panner.refDistance)
+          .beEqualTo(270.5) && success;
+        success = Should("panner.maxDistance", panner.maxDistance)
+          .beEqualTo(10000) && success;
+        panner.maxDistance = 100.5;
+        success = Should("panner.maxDistance = 100.5", panner.maxDistance)
+          .beEqualTo(100.5) && success;
+        success = Should("panner.rolloffFactor", panner.rolloffFactor)
+          .beEqualTo(1) && success;
+        panner.rolloffFactor = 0.75;
+        success = Should("panner.rolloffFactor = 0.75", panner.rolloffFactor)
+          .beEqualTo(0.75) && success;
+        success = Should("panner.coneInnerAngle", panner.coneInnerAngle)
+          .beEqualTo(360) && success;
+        panner.coneInnerAngle = 240.5;
+        success = Should("panner.coneInnerAngle = 240.5", panner.coneInnerAngle)
+          .beEqualTo(240.5) && success;
+        success = Should("panner.coneOuterAngle", panner.coneOuterAngle)
+          .beEqualTo(360) && success;
+        panner.coneOuterAngle = 166.5;
+        success = Should("panner.coneOuterAngle = 166.5", panner.coneOuterAngle)
+          .beEqualTo(166.5) && success;
+        success = Should("panner.coneOuterGain", panner.coneOuterGain)
+          .beEqualTo(0) && success;
+        panner.coneOuterGain = 0.25;
+        success = Should("panner.coneOuterGain = 0.25", panner.coneOuterGain)
+          .beEqualTo(0.25) && success;
+        success = Should("panner.panningModel", panner.panningModel)
+          .beEqualTo("equalpower") && success;
+        success = Should("panner.distanceModel", panner.distanceModel)
+          .beEqualTo("inverse") && success;
 
-    if (panner.numberOfInputs === 1)
-        testPassed("PannerNode has one input.");
-    else
-        testFailed("PannerNode should have one input.");
+        success = Should("panner.positionX", panner.positionX.value)
+          .beEqualTo(0) && success;
+        success = Should("panner.positionY", panner.positionY.value)
+          .beEqualTo(0) && success;
+        success = Should("panner.positionZ", panner.positionZ.value)
+          .beEqualTo(0) && success;
+        success = Should("panner.orientationX", panner.orientationX.value)
+          .beEqualTo(1) && success;
+        success = Should("panner.orientationY", panner.orientationY.value)
+          .beEqualTo(0) && success;
+        success = Should("panner.orientationZ", panner.orientationZ.value)
+          .beEqualTo(0) && success;
 
-    if (panner.numberOfOutputs === 1)
-        testPassed("PannerNode has one output.");
-    else
-        testFailed("PannerNode should have one output.");
+        if (success)
+          testPassed("Basic Panner attribute tests.\n");
+        else
+          testFailed("Basic Panner attribute tests.\n");
 
-    if (panner.refDistance === 1)
-        testPassed("refDistance default value is 1.");
-    else
-        testFailed("refDistance default value should be 1.");
+        done();
+      });
 
-    panner.refDistance = 270.52
-    if (panner.refDistance === 270.52)
-        testPassed("refDistance value is set to 270.52.");
-    else
-        testFailed("refDistance value should be set to 270.52.");
+      audit.defineTask("listener", function (done) {
+        var success = true;
 
-    if (panner.maxDistance === 10000)
-        testPassed("maxDistance default value is 10000.");
-    else
-        testFailed("maxDistance default value should be 10000.");
+        success = Should("listener.positionX", context.listener.positionX.value)
+          .beEqualTo(0) && success;
+        success = Should("listener.positionY", context.listener.positionY.value)
+          .beEqualTo(0) && success;
+        success = Should("listener.positionZ", context.listener.positionZ.value)
+          .beEqualTo(0) && success;
+        success = Should("listener.forwardX", context.listener.forwardX.value)
+          .beEqualTo(0) && success;
+        success = Should("listener.forwardY", context.listener.forwardY.value)
+          .beEqualTo(0) && success;
+        success = Should("listener.forwardZ", context.listener.forwardZ.value)
+          .beEqualTo(-1) && success;
+        success = Should("listener.upX", context.listener.upX.value)
+          .beEqualTo(0) && success;
+        success = Should("listener.upY", context.listener.upY.value)
+          .beEqualTo(1) && success;
+        success = Should("listener.upZ", context.listener.upZ.value)
+          .beEqualTo(0) && success;
 
-    panner.maxDistance = 100.55
-    if (panner.maxDistance === 100.55)
-        testPassed("maxDistance value is set to 100.55.");
-    else
-        testFailed("maxDistance value should be set to 100.55.");
+        if (success)
+          testPassed("Basic AudioListener attribute tests.\n");
+        else
+          testFailed("Basic AudioListener attribute tests.\n");
+        done();
+      });
 
-    if (panner.rolloffFactor === 1)
-        testPassed("rolloffFactor default value is 1.");
-    else
-        testFailed("rolloffFactor default value should be 1.");
+      audit.defineTask("panning models", function (done) {
+        // Check that the .panningModel attribute can be set to all legal values.
+        var panningModels = ["equalpower", "HRTF"];
 
-    panner.rolloffFactor = 0.83
-    if (panner.rolloffFactor === 0.83)
-        testPassed("rolloffFactor value is set to 0.83.");
-    else
-        testFailed("rolloffFactor value should be set to 0.83.");
+        var success = true;
+        for (var i = 0; i < panningModels.length; ++i) {
+          success = Should('panner.panningModel = "' + panningModels[i] + '"', function () {
+            panner.panningModel = panningModels[i];
+          }).notThrow() && success;
 
-    if (panner.coneInnerAngle === 360)
-        testPassed("coneInnerAngle default value is 360.");
-    else
-        testFailed("coneInnerAngle default value should be 360.");
-
-    panner.coneInnerAngle = 240.45
-    if (panner.coneInnerAngle === 240.45)
-        testPassed("coneInnerAngle value is set to 240.45.");
-    else
-        testFailed("coneInnerAngle value should be set to 240.45.");
-
-    if (panner.coneOuterAngle === 360)
-        testPassed("coneOuterAngle default value is 360.");
-    else
-        testFailed("coneOuterAngle default value should be 360.");
-
-    panner.coneOuterAngle = 166.66
-    if (panner.coneOuterAngle === 166.66)
-        testPassed("coneOuterAngle value is set to 166.66.");
-    else
-        testFailed("coneOuterAngle value should be set to 166.66.");
-
-    if (panner.coneOuterGain === 0)
-        testPassed("coneOuterGain default value is 0.");
-    else
-        testFailed("coneOuterGain default value should be 0.");
-
-    panner.coneOuterGain = 0.35
-    if (panner.coneOuterGain === 0.35)
-        testPassed("coneOuterGain value is set to 0.35.");
-    else
-        testFailed("coneOuterGain value should be set to 0.35.");
-
-    if (panner.panningModel === "equalpower")
-        testPassed("PannerNode defaults to 'equalpower' panningModel.");
-    else
-        testFailed("PannerNode should default to 'equalpower' panningModel.");
-
-    if (panner.distanceModel === "inverse")
-        testPassed("PannerNode defaults to 'inverse' distanceModel.");
-    else
-        testFailed("PannerNode should default to 'inverse' distanceModel.");
-
-    // Check that the .panningModel attribute can be set to all legal values.
-    var panningModels = [{value: "equalpower", integerValue: panner.EQUALPOWER},
-                         {value: "HRTF", integerValue: panner.HRTF},
-                        ];
-
-    for (var i = 0; i < panningModels.length; ++i) {
-        try {
-            panner.panningModel = panningModels[i].value;
-            if (panner.panningModel === panningModels[i].value) {
-                var message = "panningModel: '" + panningModels[i].value + "' is settable.";
-                testPassed(message);
-            } else {
-                var message = "panningModel: '" + panningModels[i].value + "' was not correctly set.";
-                testFailed(message);
-            }
-        } catch(e) {
-            var message = "Setting panningModel to '" + panningModels[i].value + "' should not throw exception.";
-            testFailed(message);
+          success = Should('panner.panningModel = "' + panningModels[i] + '"', panner.panningModel)
+            .beEqualTo(panningModels[i]) && success;
         }
-    }
 
-    // Check that numerical values are no longer supported.
-    panner.panningModel = "HRTF";
-    panner.panningModel = 1;
-    if (panner.panningModel == 1) {
-        testFailed("panningModel incorrectly set to " + panner.panningModel + ".");
-    } else {
-        testPassed("panningModel correctly not set to 1.");
-    }
+        success = Should('panner.panningModel = "invalid"', function () {
+          panner.panningModel = "invalid";
+        }).notThrow() && success;
 
-    // Check that the .distanceModel attribute can be set to all legal values.
-    var distanceModels = [{value: "linear"},
-                          {value: "inverse"},
-                          {value: "exponential"}
-                        ];
+        success = Should("panner.panningModel", panner.panningModel)
+          .beEqualTo("HRTF") && success;
 
-    for (var i = 0; i < distanceModels.length; ++i) {
-        try {
-            panner.distanceModel = distanceModels[i].value;
-            if (panner.distanceModel === distanceModels[i].value) {
-                var message = "distanceModel: '" + distanceModels[i].value + "' is settable.";
-                testPassed(message);
-            } else {
-                var message = "distanceModel: '" + distanceModels[i].value + "' was not correctly set.";
-                testFailed(message);
-            }
-        } catch(e) {
-            var message = "Setting distanceModel to '" + distanceModels[i].value + "' should not throw exception.";
-            testFailed(message);
+        // Check that numerical values are no longer supported.  We shouldn't throw and the value
+        // shouldn't be changed.
+        panner.panningModel = "HRTF";
+        success = Should('panner.panningModel = 1', function () {
+          panner.panningModel = 1;
+        }).notThrow() && success;
+
+        success = Should('panner.panningModel', panner.panningModel)
+          .beEqualTo("HRTF") && success;
+
+        if (success)
+          testPassed("Basic Panner panning models tests.\n");
+        else
+          testFailed("Basic Panner panning models tests.\n");
+        done();
+      });
+
+      audit.defineTask("distance models", function (done) {
+        // Check that the .panningModel attribute can be set to all legal values.
+        var distanceModels = ["linear", "inverse", "exponential"];
+
+        var success = true;
+        for (var i = 0; i < distanceModels.length; ++i) {
+          success = Should('panner.distanceModel = "' + distanceModels[i] + '"',
+            function () {
+              panner.distanceModel = distanceModels[i];
+            }).notThrow() && success;
+
+          success = Should('panner.distanceModel = "' + distanceModels[i] + '"', panner
+              .distanceModel)
+            .beEqualTo(distanceModels[i]) && success;
         }
-    }
 
-    // Check that numerical values are no longer supported.
-    panner.distanceModel = "inverse";
-    panner.distanceModel = 1;
-    if (panner.distanceModel == 1) {
-        testFailed("distanceModel incorrectly set to " + panner.distanceModel + ".");
-    } else {
-        testPassed("distanceModel correctly not set to 1.");
-    }
+        success = Should('panner.distanceModel = "invalid"', function () {
+          panner.distanceModel = "invalid";
+        }).notThrow() && success;
 
-    finishJSTest();
-}
+        success = Should("panner.distanceModel", panner.distanceModel)
+          .beEqualTo("exponential") && success;
 
-runTest();
+        if (success)
+          testPassed("Basic Panner distance models tests.\n");
+        else
+          testFailed("Basic Panner distance models tests.\n");
+        done();
+      });
 
-</script>
+      audit.defineTask("finish", function (done) {
+        finishJSTest();
+        done();
+      });
 
-</body>
-</html>
+
+      audit.runTasks();
+    </script>
+
+  </body>
+
+</html>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/webaudio/periodicwave-contexts-expected.txt b/third_party/WebKit/LayoutTests/webaudio/periodicwave-contexts-expected.txt
index bc17686e..e5e24c1 100644
--- a/third_party/WebKit/LayoutTests/webaudio/periodicwave-contexts-expected.txt
+++ b/third_party/WebKit/LayoutTests/webaudio/periodicwave-contexts-expected.txt
@@ -1,3 +1,4 @@
+CONSOLE WARNING: Oscillator.frequency.exponentialRampToValue value 24050 outside nominal range [0, 22050]; value will be clamped.
 Test Builtin Oscillator PeriodicWave Tables
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/webaudio/resources/panner-formulas.js b/third_party/WebKit/LayoutTests/webaudio/resources/panner-formulas.js
new file mode 100644
index 0000000..688bbd1
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/webaudio/resources/panner-formulas.js
@@ -0,0 +1,177 @@
+// For the record, these distance formulas were taken from the OpenAL
+// spec
+// (http://connect.creativelabs.com/openal/Documentation/OpenAL%201.1%20Specification.pdf),
+// not the code.  The Web Audio spec follows the OpenAL formulas.
+
+function linearDistance(panner, x, y, z) {
+    var distance = Math.sqrt(x * x + y * y + z * z);
+    distance = Math.min(distance, panner.maxDistance);
+    var rolloff = panner.rolloffFactor;
+    var gain = (1 - rolloff * (distance - panner.refDistance) / (panner.maxDistance - panner.refDistance));
+
+    return gain;
+}
+
+function inverseDistance(panner, x, y, z) {
+    var distance = Math.sqrt(x * x + y * y + z * z);
+    distance = Math.min(distance, panner.maxDistance);
+    var rolloff = panner.rolloffFactor;
+    var gain = panner.refDistance / (panner.refDistance + rolloff * (distance - panner.refDistance));
+
+    return gain;
+}
+
+function exponentialDistance(panner, x, y, z) {
+    var distance = Math.sqrt(x * x + y * y + z * z);
+    distance = Math.min(distance, panner.maxDistance);
+    var rolloff = panner.rolloffFactor;
+    var gain = Math.pow(distance / panner.refDistance, -rolloff);
+
+    return gain;
+}
+
+// Simple implementations of 3D vectors implemented as a 3-element array.
+
+// x - y
+function vec3Sub(x, y) {
+    var z = new Float32Array(3);
+    z[0] = x[0] - y[0];
+    z[1] = x[1] - y[1];
+    z[2] = x[2] - y[2];
+
+    return z;
+}
+
+// x/|x|
+function vec3Normalize(x) {
+    var mag = Math.hypot(...x);
+    return x.map(function (c) { return c / mag; });
+}
+
+// x == 0?
+function vec3IsZero(x) {
+    return x[0] === 0 && x[1] === 0 && x[2] === 0;
+}
+
+// Vector cross product
+function vec3Cross(u, v) {
+    var cross = new Float32Array(3);
+    cross[0] = u[1] * v[2] - u[2] * v[1];
+    cross[1] = u[2] * v[0] - u[0] * v[2];
+    cross[2] = u[0] * v[1] - u[1] * v[0];
+    return cross;
+}
+
+// Dot product
+function vec3Dot(x, y) {
+    return x[0] * y[0] + x[1] * y[1] + x[2] * y[2];
+}
+
+// a*x, for scalar a
+function vec3Scale(a, x) {
+    return x.map(function (c) { return a * c; });
+}
+
+function calculateAzimuth(source, listener, listenerForward, listenerUp) {
+    var sourceListener = vec3Sub(source, listener);
+
+    if (vec3IsZero(sourceListener))
+        return 0;
+
+    sourceListener = vec3Normalize(sourceListener);
+
+    var listenerRight = vec3Normalize(vec3Cross(listenerForward, listenerUp));
+    var listenerForwardNorm = vec3Normalize(listenerForward);
+
+    var up = vec3Cross(listenerRight, listenerForwardNorm);
+    var upProjection = vec3Dot(sourceListener, up);
+
+    var projectedSource = vec3Normalize(vec3Sub(sourceListener, vec3Scale(upProjection, up)));
+
+    var azimuth = 180 / Math.PI * Math.acos(vec3Dot(projectedSource, listenerRight));
+
+    // Source in front or behind the listener
+    var frontBack = vec3Dot(projectedSource, listenerForwardNorm);
+    if (frontBack < 0)
+        azimuth = 360 - azimuth;
+
+    // Make azimuth relative to "front" and not "right" listener vector.
+    if (azimuth >= 0 && azimuth <= 270)
+        azimuth = 90 - azimuth;
+    else
+        azimuth = 450 - azimuth;
+
+    // We don't need elevation, so we're skipping that computation.
+    return azimuth;
+}
+
+// Map our position angle to the azimuth angle (in degrees).
+//
+// An angle of 0 corresponds to an azimuth of 90 deg; pi, to -90 deg.
+function angleToAzimuth(angle) {
+    return 90 - angle * 180 / Math.PI;
+}
+
+// The gain caused by the EQUALPOWER panning model
+function equalPowerGain(azimuth, numberOfChannels) {
+    var halfPi = Math.PI / 2;
+
+    if (azimuth < -90)
+        azimuth = -180 - azimuth;
+    else
+        azimuth = 180 - azimuth;
+
+    if (numberOfChannels == 1) {
+        var panPosition = (azimuth + 90) / 180;
+
+        var gainL = Math.cos(halfPi * panPosition);
+        var gainR = Math.sin(halfPi * panPosition);
+
+        return { left : gainL, right : gainR };
+    } else {
+        if (azimuth <= 0) {
+            var panPosition = (azimuth + 90) / 90;
+
+            var gainL = Math.cos(halfPi * panPosition);
+            var gainR = Math.sin(halfPi * panPosition);
+
+            return { left : gainL, right : gainR };
+        } else {
+            var panPosition = azimuth / 90;
+
+            var gainL = Math.cos(halfPi * panPosition);
+            var gainR = Math.sin(halfPi * panPosition);
+
+            return { left : gainL, right : gainR };
+        }
+    }
+}
+
+function applyPanner(azimuth, srcL, srcR, numberOfChannels) {
+    var length = srcL.length;
+    var outL = new Float32Array(length);
+    var outR = new Float32Array(length);
+
+    if (numberOfChannels == 1) {
+        for (var k = 0; k < length; ++k) {
+            var gains = equalPowerGain(azimuth[k], numberOfChannels);
+
+            outL[k] = srcL[k] * gains.left;
+            outR[k] = srcR[k] * gains.right;
+        }
+    } else {
+        for (var k = 0; k < length; ++k) {
+            var gains = equalPowerGain(azimuth[k], numberOfChannels);
+
+            if (azimuth[k] <= 0) {
+                outL[k] = srcL[k] + srcR[k] * gains.left;
+                outR[k] = srcR[k] * gains.right;
+            } else {
+                outL[k] = srcL[k] * gains.left;
+                outR[k] = srcR[k] + srcL[k] * gains.right;
+            }
+        }
+    }
+
+    return { left: outL, right: outR };
+}
diff --git a/third_party/WebKit/LayoutTests/webaudio/resources/panner-model-testing.js b/third_party/WebKit/LayoutTests/webaudio/resources/panner-model-testing.js
index f96857f..16ef23e 100644
--- a/third_party/WebKit/LayoutTests/webaudio/resources/panner-model-testing.js
+++ b/third_party/WebKit/LayoutTests/webaudio/resources/panner-model-testing.js
@@ -26,7 +26,7 @@
 var renderedLeft;
 var renderedRight;
 
-function createGraph(context, nodeCount) {
+function createGraph(context, nodeCount, positionSetter) {
     bufferSource = new Array(nodeCount);
     panner = new Array(nodeCount);
     position = new Array(nodeCount);
@@ -51,7 +51,7 @@
 
         var angle = angleStep * k;
         position[k] = {angle : angle, x : Math.cos(angle), z : Math.sin(angle)};
-        panner[k].setPosition(position[k].x, 0, position[k].z);
+        positionSetter(panner[k], position[k].x, 0, position[k].z);
 
         bufferSource[k].connect(panner[k]);
         panner[k].connect(context.destination);
@@ -62,10 +62,10 @@
     }
 }
 
-function createTestAndRun(context, nodeCount, numberOfSourceChannels) {
+function createTestAndRun(context, nodeCount, numberOfSourceChannels, positionSetter) {
     numberOfChannels = numberOfSourceChannels;
 
-    createGraph(context, nodeCount);
+    createGraph(context, nodeCount, positionSetter);
 
     context.oncomplete = checkResult;
     context.startRendering();
diff --git a/third_party/WebKit/LayoutTests/webaudio/resources/stereopanner-testing.js b/third_party/WebKit/LayoutTests/webaudio/resources/stereopanner-testing.js
index e7f71c3..60d947b 100644
--- a/third_party/WebKit/LayoutTests/webaudio/resources/stereopanner-testing.js
+++ b/third_party/WebKit/LayoutTests/webaudio/resources/stereopanner-testing.js
@@ -88,6 +88,9 @@
     this.maxErrorIndexL = 0;
     this.maxErrorIndexR = 0;
 
+    // The maximum value to use for panner pan value. The value will range from -panLimit to
+    // +panLimit.
+    this.panLimit = 1.0625;
   }
 
 
@@ -105,7 +108,7 @@
 
     // Moves the pan value for each panner by pan step unit from -2 to 2.
     // This is to check if the internal panning value is clipped properly.
-    var panStep = 4 / (gNodesToCreate - 1);
+    var panStep = (2 * this.panLimit) / (gNodesToCreate - 1);
 
     if (this.numberOfInputChannels === 1) {
       impulse = createImpulseBuffer(this.context, impulseLength);
@@ -119,7 +122,7 @@
       sources[i].connect(panners[i]);
       panners[i].connect(this.context.destination);
       sources[i].buffer = impulse;
-      panners[i].pan.value = this.panPositions[i] = panStep * i - 2;
+      panners[i].pan.value = this.panPositions[i] = panStep * i - this.panLimit;
 
       // Store the onset time position of impulse.
       this.onsets[i] = gTimeStep * i;
diff --git a/third_party/WebKit/LayoutTests/webaudio/stereopannernode-panning-expected.txt b/third_party/WebKit/LayoutTests/webaudio/stereopannernode-panning-expected.txt
index 7568ccbb..59a561ee 100644
--- a/third_party/WebKit/LayoutTests/webaudio/stereopannernode-panning-expected.txt
+++ b/third_party/WebKit/LayoutTests/webaudio/stereopannernode-panning-expected.txt
@@ -1,3 +1,15 @@
+CONSOLE WARNING: StereoPanner.pan.value -1.0625 outside nominal range [-1, 1]; value will be clamped.
+CONSOLE WARNING: StereoPanner.pan.value -1.04104 outside nominal range [-1, 1]; value will be clamped.
+CONSOLE WARNING: StereoPanner.pan.value -1.01957 outside nominal range [-1, 1]; value will be clamped.
+CONSOLE WARNING: StereoPanner.pan.value 1.01957 outside nominal range [-1, 1]; value will be clamped.
+CONSOLE WARNING: StereoPanner.pan.value 1.04104 outside nominal range [-1, 1]; value will be clamped.
+CONSOLE WARNING: StereoPanner.pan.value 1.0625 outside nominal range [-1, 1]; value will be clamped.
+CONSOLE WARNING: StereoPanner.pan.value -1.0625 outside nominal range [-1, 1]; value will be clamped.
+CONSOLE WARNING: StereoPanner.pan.value -1.04104 outside nominal range [-1, 1]; value will be clamped.
+CONSOLE WARNING: StereoPanner.pan.value -1.01957 outside nominal range [-1, 1]; value will be clamped.
+CONSOLE WARNING: StereoPanner.pan.value 1.01957 outside nominal range [-1, 1]; value will be clamped.
+CONSOLE WARNING: StereoPanner.pan.value 1.04104 outside nominal range [-1, 1]; value will be clamped.
+CONSOLE WARNING: StereoPanner.pan.value 1.0625 outside nominal range [-1, 1]; value will be clamped.
 Test panning model of StereoPannerNode.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
index a894185..bd2256b 100644
--- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -204,7 +204,16 @@
 interface AudioListener
     attribute @@toStringTag
     getter dopplerFactor
+    getter forwardX
+    getter forwardY
+    getter forwardZ
+    getter positionX
+    getter positionY
+    getter positionZ
     getter speedOfSound
+    getter upX
+    getter upY
+    getter upZ
     method constructor
     method setOrientation
     method setPosition
@@ -228,6 +237,8 @@
 interface AudioParam
     attribute @@toStringTag
     getter defaultValue
+    getter maxValue
+    getter minValue
     getter value
     method cancelScheduledValues
     method constructor
diff --git a/third_party/WebKit/Source/bindings/IDLUnionTypes.md b/third_party/WebKit/Source/bindings/IDLUnionTypes.md
new file mode 100644
index 0000000..244a828
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/IDLUnionTypes.md
@@ -0,0 +1,69 @@
+# How to use Blink IDL Union Types
+
+Using [IDL union types](https://heycam.github.io/webidl/#idl-union) in
+Blink is a bit tricky. Here are some tips to use union types
+correctly.
+
+## Generated classes
+
+For each union type, the code generator creates a C++ class which is
+used like an "impl" class of a normal interface type. The name of a
+generated class is a
+[type name](https://heycam.github.io/webidl/#dfn-type-name) of the
+union type. For example, the code generator will create
+`StringOrFloat` class for `(DOMString or float)`.
+
+## Paths for generated classes
+
+The code generator puts generated classes into separate files. You need
+to include generated header files when you use union types in
+core/modules.
+
+The file name for a generated class is basically the same as its class
+name, but we use some aliases to avoid too-long file names
+(See http://crbug.com/611437 why we need to avoid long file names).
+Currently we use following alias(es).
+
+```
+CanvasRenderingContext2DOrWebGLRenderingContextOrWebGL2RenderingContextOrImageBitmapRenderingContext -> RenderingContext
+```
+
+The paths for generated classes depend on the places union types are
+used. If a union type is used only by IDL files under modules/, the
+include path is `bindings/modules/v8/FooOrBar.h`. Otherwise, the
+include path is `bindings/core/v8/FooOrBar.h`. For example, given
+following definitions:
+
+```webidl
+// core/fileapi/FileReader.idl
+readonly attribute (DOMString or ArrayBuffer)? result;
+
+// dom/CommonDefinitions.idl
+typedef (ArrayBuffer or ArrayBufferView) BufferSource;
+
+// modules/encoding/TextDecoder.idl
+DOMString decode(optional BufferSource input, optional TextDecodeOptions options);
+
+// modules/fetch/Request.idl
+typedef (Request or USVString) RequestInfo;
+```
+
+The include paths will be:
+- bindings/core/v8/StringOrArrayBuffer.h
+- bindings/core/v8/ArrayBufferOrArrayBufferView.h
+- bindings/modules/v8/RequestOrUSVString.h
+
+Note that `ArrayBufferOrArrayBufferView` is located under core/ even
+it is used by `Request.idl` which is located under modules/.
+
+**Special NOTE**: If you are going to use a union type under core/ and
+the union type is currently used only under modules/, you will need
+to update the include path for the union type under modules/.
+
+## Updating GN/GYP files
+TODO(bashi): Mitigate the pain of updating GN/GYP files.
+
+Due to the requirements of GN/GYP, we need to put generated file names
+in gni/gypi files. Please update
+`bindings/core/v8/generated.{gni,gypi}` and/or
+`bindings/modules/v8/generated.{gni,gypi}` accordingly.
diff --git a/third_party/WebKit/Source/bindings/core/v8/DOMWrapperWorld.cpp b/third_party/WebKit/Source/bindings/core/v8/DOMWrapperWorld.cpp
index caf91073..293a277 100644
--- a/third_party/WebKit/Source/bindings/core/v8/DOMWrapperWorld.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/DOMWrapperWorld.cpp
@@ -160,7 +160,8 @@
 void DOMWrapperWorld::setWrapperReferencesInAllWorlds(const v8::Persistent<v8::Object>& parent, ScriptWrappable* scriptWrappable, v8::Isolate* isolate)
 {
     // Marking for the main world
-    scriptWrappable->setReference(parent, isolate);
+    if (scriptWrappable->containsWrapper())
+        scriptWrappable->setReference(parent, isolate);
     if (!isMainThread())
         return;
     WorldMap& isolatedWorlds = isolatedWorldMap();
diff --git a/third_party/WebKit/Source/bindings/core/v8/Microtask.cpp b/third_party/WebKit/Source/bindings/core/v8/Microtask.cpp
index e4bebee..48376d0 100644
--- a/third_party/WebKit/Source/bindings/core/v8/Microtask.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/Microtask.cpp
@@ -45,19 +45,14 @@
 
 static void microtaskFunctionCallback(void* data)
 {
-    OwnPtr<WebTaskRunner::Task> task = adoptPtr(static_cast<WebTaskRunner::Task*>(data));
-    task->run();
-}
-
-void Microtask::enqueueMicrotask(std::unique_ptr<WebTaskRunner::Task> callback)
-{
-    v8::Isolate* isolate = v8::Isolate::GetCurrent();
-    isolate->EnqueueMicrotask(&microtaskFunctionCallback, callback.release());
+    std::unique_ptr<SameThreadClosure> task = wrapUnique(static_cast<SameThreadClosure*>(data));
+    (*task)();
 }
 
 void Microtask::enqueueMicrotask(std::unique_ptr<SameThreadClosure> callback)
 {
-    enqueueMicrotask(wrapUnique(new SameThreadTask(std::move(callback))));
+    v8::Isolate* isolate = v8::Isolate::GetCurrent();
+    isolate->EnqueueMicrotask(&microtaskFunctionCallback, static_cast<void*>(callback.release()));
 }
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/bindings/core/v8/Microtask.h b/third_party/WebKit/Source/bindings/core/v8/Microtask.h
index 8634a90..2a686dc 100644
--- a/third_party/WebKit/Source/bindings/core/v8/Microtask.h
+++ b/third_party/WebKit/Source/bindings/core/v8/Microtask.h
@@ -67,7 +67,6 @@
     // TODO(jochen): Make all microtasks pass in the ScriptState they want to be
     // executed in. Until then, all microtasks have to keep track of their
     // ScriptState themselves.
-    static void enqueueMicrotask(std::unique_ptr<WebTaskRunner::Task>);
     static void enqueueMicrotask(std::unique_ptr<SameThreadClosure>);
 };
 
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8V0CustomElementLifecycleCallbacks.cpp b/third_party/WebKit/Source/bindings/core/v8/V8V0CustomElementLifecycleCallbacks.cpp
index 1e30a7d..c5f51b2 100644
--- a/third_party/WebKit/Source/bindings/core/v8/V8V0CustomElementLifecycleCallbacks.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/V8V0CustomElementLifecycleCallbacks.cpp
@@ -147,7 +147,7 @@
     if (!m_scriptState->contextIsValid())
         return;
 
-    element->setCustomElementState(Element::Upgraded);
+    element->setV0CustomElementState(Element::V0Upgraded);
 
     ScriptState::Scope scope(m_scriptState.get());
     v8::Isolate* isolate = m_scriptState->isolate();
diff --git a/third_party/WebKit/Source/bindings/core/v8/custom/V8CSSStyleRuleCustom.cpp b/third_party/WebKit/Source/bindings/core/v8/custom/V8CSSStyleRuleCustom.cpp
new file mode 100644
index 0000000..f212770
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/core/v8/custom/V8CSSStyleRuleCustom.cpp
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2007-2011 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 "bindings/core/v8/V8CSSStyleRule.h"
+
+#include "core/css/CSSRule.h"
+#include "core/css/CSSStyleSheet.h"
+#include "core/css/CSSValue.h"
+
+using namespace WTF;
+
+namespace blink {
+
+void V8CSSStyleRule::visitDOMWrapper(v8::Isolate* isolate, ScriptWrappable* scriptWrappable, const v8::Persistent<v8::Object>& wrapper)
+{
+    CSSStyleRule* impl = scriptWrappable->toImpl<CSSStyleRule>();
+    v8::Local<v8::Object> context = v8::Local<v8::Object>::New(isolate, wrapper);
+    v8::Context::Scope scope(context->CreationContext());
+    CSSRule* parentRule = impl->parentRule();
+    if (parentRule) {
+        if (DOMDataStore::containsWrapper(parentRule, isolate))
+            DOMDataStore::setWrapperReference(wrapper, parentRule, isolate);
+    }
+    CSSStyleSheet* parentStyleSheet = impl->parentStyleSheet();
+    if (parentStyleSheet) {
+        if (DOMDataStore::containsWrapper(parentStyleSheet, isolate))
+            DOMDataStore::setWrapperReference(wrapper, parentStyleSheet, isolate);
+    }
+}
+
+} // 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 ebb456b..3f2037b 100644
--- a/third_party/WebKit/Source/bindings/core/v8/custom/custom.gypi
+++ b/third_party/WebKit/Source/bindings/core/v8/custom/custom.gypi
@@ -6,6 +6,7 @@
     'variables': {
         'bindings_core_v8_custom_files': [
             'V8CSSStyleDeclarationCustom.cpp',
+            'V8CSSStyleRuleCustom.cpp',
             'V8CustomEventCustom.cpp',
             'V8CustomXPathNSResolver.cpp',
             'V8CustomXPathNSResolver.h',
diff --git a/third_party/WebKit/Source/bindings/core/v8/generated.gni b/third_party/WebKit/Source/bindings/core/v8/generated.gni
index 30b30211..289fd7e 100644
--- a/third_party/WebKit/Source/bindings/core/v8/generated.gni
+++ b/third_party/WebKit/Source/bindings/core/v8/generated.gni
@@ -34,7 +34,62 @@
   ]
 }
 
+# TODO(bashi): It would be better to have a way to update this list automatically.
 bindings_core_generated_union_type_files = [
-  "$bindings_core_v8_output_dir/UnionTypesCore.cpp",
-  "$bindings_core_v8_output_dir/UnionTypesCore.h",
+  "$bindings_core_v8_output_dir/AddEventListenerOptionsOrBoolean.cpp",
+  "$bindings_core_v8_output_dir/AddEventListenerOptionsOrBoolean.h",
+  "$bindings_core_v8_output_dir/ArrayBufferOrArrayBufferView.cpp",
+  "$bindings_core_v8_output_dir/ArrayBufferOrArrayBufferView.h",
+  "$bindings_core_v8_output_dir/ArrayBufferOrArrayBufferViewOrBlobOrDocumentOrStringOrFormData.cpp",
+  "$bindings_core_v8_output_dir/ArrayBufferOrArrayBufferViewOrBlobOrDocumentOrStringOrFormData.h",
+  "$bindings_core_v8_output_dir/ArrayBufferOrArrayBufferViewOrBlobOrUSVString.cpp",
+  "$bindings_core_v8_output_dir/ArrayBufferOrArrayBufferViewOrBlobOrUSVString.h",
+  "$bindings_core_v8_output_dir/DoubleOrAutoKeyword.cpp",
+  "$bindings_core_v8_output_dir/DoubleOrAutoKeyword.h",
+  "$bindings_core_v8_output_dir/DoubleOrDoubleArray.cpp",
+  "$bindings_core_v8_output_dir/DoubleOrDoubleArray.h",
+  "$bindings_core_v8_output_dir/DoubleOrInternalEnum.cpp",
+  "$bindings_core_v8_output_dir/DoubleOrInternalEnum.h",
+  "$bindings_core_v8_output_dir/DoubleOrString.cpp",
+  "$bindings_core_v8_output_dir/DoubleOrString.h",
+  "$bindings_core_v8_output_dir/DoubleOrStringOrStringArray.cpp",
+  "$bindings_core_v8_output_dir/DoubleOrStringOrStringArray.h",
+  "$bindings_core_v8_output_dir/DoubleOrStringOrStringSequence.cpp",
+  "$bindings_core_v8_output_dir/DoubleOrStringOrStringSequence.h",
+  "$bindings_core_v8_output_dir/EffectModelOrDictionarySequenceOrDictionary.cpp",
+  "$bindings_core_v8_output_dir/EffectModelOrDictionarySequenceOrDictionary.h",
+  "$bindings_core_v8_output_dir/EventListenerOptionsOrBoolean.cpp",
+  "$bindings_core_v8_output_dir/EventListenerOptionsOrBoolean.h",
+  "$bindings_core_v8_output_dir/FileOrUSVString.cpp",
+  "$bindings_core_v8_output_dir/FileOrUSVString.h",
+  "$bindings_core_v8_output_dir/HTMLElementOrLong.cpp",
+  "$bindings_core_v8_output_dir/HTMLElementOrLong.h",
+  "$bindings_core_v8_output_dir/HTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrImageBitmap.cpp",
+  "$bindings_core_v8_output_dir/HTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrImageBitmap.h",
+  "$bindings_core_v8_output_dir/HTMLOptionElementOrHTMLOptGroupElement.cpp",
+  "$bindings_core_v8_output_dir/HTMLOptionElementOrHTMLOptGroupElement.h",
+  "$bindings_core_v8_output_dir/HTMLScriptElementOrSVGScriptElement.cpp",
+  "$bindings_core_v8_output_dir/HTMLScriptElementOrSVGScriptElement.h",
+  "$bindings_core_v8_output_dir/NodeListOrElement.cpp",
+  "$bindings_core_v8_output_dir/NodeListOrElement.h",
+  "$bindings_core_v8_output_dir/NodeOrString.cpp",
+  "$bindings_core_v8_output_dir/NodeOrString.h",
+  "$bindings_core_v8_output_dir/RadioNodeListOrElement.cpp",
+  "$bindings_core_v8_output_dir/RadioNodeListOrElement.h",
+  "$bindings_core_v8_output_dir/StringOrArrayBuffer.cpp",
+  "$bindings_core_v8_output_dir/StringOrArrayBuffer.h",
+  "$bindings_core_v8_output_dir/StringOrArrayBufferOrArrayBufferView.cpp",
+  "$bindings_core_v8_output_dir/StringOrArrayBufferOrArrayBufferView.h",
+  "$bindings_core_v8_output_dir/StringOrFloat.cpp",
+  "$bindings_core_v8_output_dir/StringOrFloat.h",
+  "$bindings_core_v8_output_dir/StyleValueOrStyleValueSequence.cpp",
+  "$bindings_core_v8_output_dir/StyleValueOrStyleValueSequence.h",
+  "$bindings_core_v8_output_dir/StyleValueOrStyleValueSequenceOrString.cpp",
+  "$bindings_core_v8_output_dir/StyleValueOrStyleValueSequenceOrString.h",
+  "$bindings_core_v8_output_dir/USVStringOrURLSearchParams.cpp",
+  "$bindings_core_v8_output_dir/USVStringOrURLSearchParams.h",
+  "$bindings_core_v8_output_dir/UnrestrictedDoubleOrString.cpp",
+  "$bindings_core_v8_output_dir/UnrestrictedDoubleOrString.h",
+  "$bindings_core_v8_output_dir/VideoTrackOrAudioTrackOrTextTrack.cpp",
+  "$bindings_core_v8_output_dir/VideoTrackOrAudioTrackOrTextTrack.h",
 ]
diff --git a/third_party/WebKit/Source/bindings/core/v8/generated.gypi b/third_party/WebKit/Source/bindings/core/v8/generated.gypi
index 47444cf2..196042e 100644
--- a/third_party/WebKit/Source/bindings/core/v8/generated.gypi
+++ b/third_party/WebKit/Source/bindings/core/v8/generated.gypi
@@ -6,8 +6,62 @@
   'variables': {
     'bindings_core_v8_output_dir': '<(SHARED_INTERMEDIATE_DIR)/blink/bindings/core/v8',
     'bindings_core_v8_generated_union_type_files': [
-      '<(bindings_core_v8_output_dir)/UnionTypesCore.cpp',
-      '<(bindings_core_v8_output_dir)/UnionTypesCore.h',
+      '<(bindings_core_v8_output_dir)/AddEventListenerOptionsOrBoolean.cpp',
+      '<(bindings_core_v8_output_dir)/AddEventListenerOptionsOrBoolean.h',
+      '<(bindings_core_v8_output_dir)/ArrayBufferOrArrayBufferView.cpp',
+      '<(bindings_core_v8_output_dir)/ArrayBufferOrArrayBufferView.h',
+      '<(bindings_core_v8_output_dir)/ArrayBufferOrArrayBufferViewOrBlobOrDocumentOrStringOrFormData.cpp',
+      '<(bindings_core_v8_output_dir)/ArrayBufferOrArrayBufferViewOrBlobOrDocumentOrStringOrFormData.h',
+      '<(bindings_core_v8_output_dir)/ArrayBufferOrArrayBufferViewOrBlobOrUSVString.cpp',
+      '<(bindings_core_v8_output_dir)/ArrayBufferOrArrayBufferViewOrBlobOrUSVString.h',
+      '<(bindings_core_v8_output_dir)/DoubleOrAutoKeyword.cpp',
+      '<(bindings_core_v8_output_dir)/DoubleOrAutoKeyword.h',
+      '<(bindings_core_v8_output_dir)/DoubleOrDoubleArray.cpp',
+      '<(bindings_core_v8_output_dir)/DoubleOrDoubleArray.h',
+      '<(bindings_core_v8_output_dir)/DoubleOrInternalEnum.cpp',
+      '<(bindings_core_v8_output_dir)/DoubleOrInternalEnum.h',
+      '<(bindings_core_v8_output_dir)/DoubleOrString.cpp',
+      '<(bindings_core_v8_output_dir)/DoubleOrString.h',
+      '<(bindings_core_v8_output_dir)/DoubleOrStringOrStringArray.cpp',
+      '<(bindings_core_v8_output_dir)/DoubleOrStringOrStringArray.h',
+      '<(bindings_core_v8_output_dir)/DoubleOrStringOrStringSequence.cpp',
+      '<(bindings_core_v8_output_dir)/DoubleOrStringOrStringSequence.h',
+      '<(bindings_core_v8_output_dir)/EffectModelOrDictionarySequenceOrDictionary.cpp',
+      '<(bindings_core_v8_output_dir)/EffectModelOrDictionarySequenceOrDictionary.h',
+      '<(bindings_core_v8_output_dir)/EventListenerOptionsOrBoolean.cpp',
+      '<(bindings_core_v8_output_dir)/EventListenerOptionsOrBoolean.h',
+      '<(bindings_core_v8_output_dir)/FileOrUSVString.cpp',
+      '<(bindings_core_v8_output_dir)/FileOrUSVString.h',
+      '<(bindings_core_v8_output_dir)/HTMLElementOrLong.cpp',
+      '<(bindings_core_v8_output_dir)/HTMLElementOrLong.h',
+      '<(bindings_core_v8_output_dir)/HTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrImageBitmap.cpp',
+      '<(bindings_core_v8_output_dir)/HTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrImageBitmap.h',
+      '<(bindings_core_v8_output_dir)/HTMLOptionElementOrHTMLOptGroupElement.cpp',
+      '<(bindings_core_v8_output_dir)/HTMLOptionElementOrHTMLOptGroupElement.h',
+      '<(bindings_core_v8_output_dir)/HTMLScriptElementOrSVGScriptElement.cpp',
+      '<(bindings_core_v8_output_dir)/HTMLScriptElementOrSVGScriptElement.h',
+      '<(bindings_core_v8_output_dir)/NodeListOrElement.cpp',
+      '<(bindings_core_v8_output_dir)/NodeListOrElement.h',
+      '<(bindings_core_v8_output_dir)/NodeOrString.cpp',
+      '<(bindings_core_v8_output_dir)/NodeOrString.h',
+      '<(bindings_core_v8_output_dir)/RadioNodeListOrElement.cpp',
+      '<(bindings_core_v8_output_dir)/RadioNodeListOrElement.h',
+      '<(bindings_core_v8_output_dir)/StringOrArrayBuffer.cpp',
+      '<(bindings_core_v8_output_dir)/StringOrArrayBuffer.h',
+      '<(bindings_core_v8_output_dir)/StringOrArrayBufferOrArrayBufferView.cpp',
+      '<(bindings_core_v8_output_dir)/StringOrArrayBufferOrArrayBufferView.h',
+      '<(bindings_core_v8_output_dir)/StringOrFloat.cpp',
+      '<(bindings_core_v8_output_dir)/StringOrFloat.h',
+      '<(bindings_core_v8_output_dir)/StyleValueOrStyleValueSequence.cpp',
+      '<(bindings_core_v8_output_dir)/StyleValueOrStyleValueSequence.h',
+      '<(bindings_core_v8_output_dir)/StyleValueOrStyleValueSequenceOrString.cpp',
+      '<(bindings_core_v8_output_dir)/StyleValueOrStyleValueSequenceOrString.h',
+      '<(bindings_core_v8_output_dir)/USVStringOrURLSearchParams.cpp',
+      '<(bindings_core_v8_output_dir)/USVStringOrURLSearchParams.h',
+      '<(bindings_core_v8_output_dir)/UnrestrictedDoubleOrString.cpp',
+      '<(bindings_core_v8_output_dir)/UnrestrictedDoubleOrString.h',
+      '<(bindings_core_v8_output_dir)/VideoTrackOrAudioTrackOrTextTrack.cpp',
+      '<(bindings_core_v8_output_dir)/VideoTrackOrAudioTrackOrTextTrack.h',
     ],
 
     'conditions': [
diff --git a/third_party/WebKit/Source/bindings/modules/v8/V8BindingForModulesTest.cpp b/third_party/WebKit/Source/bindings/modules/v8/V8BindingForModulesTest.cpp
index 25d91f5a..8a650d56 100644
--- a/third_party/WebKit/Source/bindings/modules/v8/V8BindingForModulesTest.cpp
+++ b/third_party/WebKit/Source/bindings/modules/v8/V8BindingForModulesTest.cpp
@@ -25,6 +25,7 @@
 
 #include "bindings/modules/v8/V8BindingForModules.h"
 
+#include "bindings/core/v8/ToV8.h"
 #include "bindings/core/v8/V8Binding.h"
 #include "bindings/core/v8/V8BindingForTesting.h"
 #include "bindings/core/v8/V8PerIsolateData.h"
diff --git a/third_party/WebKit/Source/bindings/modules/v8/generated.gni b/third_party/WebKit/Source/bindings/modules/v8/generated.gni
index 4c6b667..e8a0f03c 100644
--- a/third_party/WebKit/Source/bindings/modules/v8/generated.gni
+++ b/third_party/WebKit/Source/bindings/modules/v8/generated.gni
@@ -40,7 +40,44 @@
 bindings_modules_generated_init_partial_interfaces_file =
     "$bindings_modules_v8_output_dir/initPartialInterfacesInModules.cpp"
 
+# TODO(bashi): It would be better to have a way to update this list automatically.
 bindings_modules_generated_union_type_files = [
-  "$bindings_modules_v8_output_dir/UnionTypesModules.cpp",
-  "$bindings_modules_v8_output_dir/UnionTypesModules.h",
+  "$bindings_modules_v8_output_dir/ArrayBufferOrArrayBufferViewOrDictionary.cpp",
+  "$bindings_modules_v8_output_dir/ArrayBufferOrArrayBufferViewOrDictionary.h",
+  "$bindings_modules_v8_output_dir/ArrayBufferOrArrayBufferViewOrUSVString.cpp",
+  "$bindings_modules_v8_output_dir/ArrayBufferOrArrayBufferViewOrUSVString.h",
+  "$bindings_modules_v8_output_dir/ArrayBufferViewOrBlobOrStringOrFormData.cpp",
+  "$bindings_modules_v8_output_dir/ArrayBufferViewOrBlobOrStringOrFormData.h",
+  "$bindings_modules_v8_output_dir/BooleanOrMediaTrackConstraints.cpp",
+  "$bindings_modules_v8_output_dir/BooleanOrMediaTrackConstraints.h",
+  "$bindings_modules_v8_output_dir/ClientOrServiceWorkerOrMessagePort.cpp",
+  "$bindings_modules_v8_output_dir/ClientOrServiceWorkerOrMessagePort.h",
+  "$bindings_modules_v8_output_dir/DictionaryOrString.cpp",
+  "$bindings_modules_v8_output_dir/DictionaryOrString.h",
+  "$bindings_modules_v8_output_dir/FormDataOrURLSearchParams.cpp",
+  "$bindings_modules_v8_output_dir/FormDataOrURLSearchParams.h",
+  "$bindings_modules_v8_output_dir/HTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrImageBitmap.cpp",
+  "$bindings_modules_v8_output_dir/HTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrImageBitmap.h",
+  "$bindings_modules_v8_output_dir/OffscreenCanvasRenderingContext2DOrWebGLRenderingContextOrWebGL2RenderingContext.cpp",
+  "$bindings_modules_v8_output_dir/OffscreenCanvasRenderingContext2DOrWebGLRenderingContextOrWebGL2RenderingContext.h",
+  "$bindings_modules_v8_output_dir/RTCIceCandidateInitOrRTCIceCandidate.cpp",
+  "$bindings_modules_v8_output_dir/RTCIceCandidateInitOrRTCIceCandidate.h",
+  "$bindings_modules_v8_output_dir/RenderingContext.cpp",
+  "$bindings_modules_v8_output_dir/RenderingContext.h",
+  "$bindings_modules_v8_output_dir/RequestOrUSVString.cpp",
+  "$bindings_modules_v8_output_dir/RequestOrUSVString.h",
+  "$bindings_modules_v8_output_dir/ServiceWorkerOrMessagePort.cpp",
+  "$bindings_modules_v8_output_dir/ServiceWorkerOrMessagePort.h",
+  "$bindings_modules_v8_output_dir/StringOrArrayBufferOrNFCMessage.cpp",
+  "$bindings_modules_v8_output_dir/StringOrArrayBufferOrNFCMessage.h",
+  "$bindings_modules_v8_output_dir/StringOrCanvasGradientOrCanvasPattern.cpp",
+  "$bindings_modules_v8_output_dir/StringOrCanvasGradientOrCanvasPattern.h",
+  "$bindings_modules_v8_output_dir/StringOrStringSequence.cpp",
+  "$bindings_modules_v8_output_dir/StringOrStringSequence.h",
+  "$bindings_modules_v8_output_dir/StringOrStringSequenceOrDOMStringList.cpp",
+  "$bindings_modules_v8_output_dir/StringOrStringSequenceOrDOMStringList.h",
+  "$bindings_modules_v8_output_dir/StringOrUnsignedLong.cpp",
+  "$bindings_modules_v8_output_dir/StringOrUnsignedLong.h",
+  "$bindings_modules_v8_output_dir/UnsignedLongOrUnsignedLongSequence.cpp",
+  "$bindings_modules_v8_output_dir/UnsignedLongOrUnsignedLongSequence.h",
 ]
diff --git a/third_party/WebKit/Source/bindings/modules/v8/generated.gypi b/third_party/WebKit/Source/bindings/modules/v8/generated.gypi
index c3256bf..d78ce7d 100644
--- a/third_party/WebKit/Source/bindings/modules/v8/generated.gypi
+++ b/third_party/WebKit/Source/bindings/modules/v8/generated.gypi
@@ -6,8 +6,44 @@
   'variables': {
     'bindings_modules_v8_output_dir': '<(SHARED_INTERMEDIATE_DIR)/blink/bindings/modules/v8',
     'bindings_modules_v8_generated_union_type_files': [
-        '<(bindings_modules_v8_output_dir)/UnionTypesModules.cpp',
-        '<(bindings_modules_v8_output_dir)/UnionTypesModules.h',
+      '<(bindings_modules_v8_output_dir)/ArrayBufferOrArrayBufferViewOrDictionary.cpp',
+      '<(bindings_modules_v8_output_dir)/ArrayBufferOrArrayBufferViewOrDictionary.h',
+      '<(bindings_modules_v8_output_dir)/ArrayBufferOrArrayBufferViewOrUSVString.cpp',
+      '<(bindings_modules_v8_output_dir)/ArrayBufferOrArrayBufferViewOrUSVString.h',
+      '<(bindings_modules_v8_output_dir)/ArrayBufferViewOrBlobOrStringOrFormData.cpp',
+      '<(bindings_modules_v8_output_dir)/ArrayBufferViewOrBlobOrStringOrFormData.h',
+      '<(bindings_modules_v8_output_dir)/BooleanOrMediaTrackConstraints.cpp',
+      '<(bindings_modules_v8_output_dir)/BooleanOrMediaTrackConstraints.h',
+      '<(bindings_modules_v8_output_dir)/ClientOrServiceWorkerOrMessagePort.cpp',
+      '<(bindings_modules_v8_output_dir)/ClientOrServiceWorkerOrMessagePort.h',
+      '<(bindings_modules_v8_output_dir)/DictionaryOrString.cpp',
+      '<(bindings_modules_v8_output_dir)/DictionaryOrString.h',
+      '<(bindings_modules_v8_output_dir)/FormDataOrURLSearchParams.cpp',
+      '<(bindings_modules_v8_output_dir)/FormDataOrURLSearchParams.h',
+      '<(bindings_modules_v8_output_dir)/HTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrImageBitmap.cpp',
+      '<(bindings_modules_v8_output_dir)/HTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrImageBitmap.h',
+      '<(bindings_modules_v8_output_dir)/OffscreenCanvasRenderingContext2DOrWebGLRenderingContextOrWebGL2RenderingContext.cpp',
+      '<(bindings_modules_v8_output_dir)/OffscreenCanvasRenderingContext2DOrWebGLRenderingContextOrWebGL2RenderingContext.h',
+      '<(bindings_modules_v8_output_dir)/RTCIceCandidateInitOrRTCIceCandidate.cpp',
+      '<(bindings_modules_v8_output_dir)/RTCIceCandidateInitOrRTCIceCandidate.h',
+      '<(bindings_modules_v8_output_dir)/RenderingContext.cpp',
+      '<(bindings_modules_v8_output_dir)/RenderingContext.h',
+      '<(bindings_modules_v8_output_dir)/RequestOrUSVString.cpp',
+      '<(bindings_modules_v8_output_dir)/RequestOrUSVString.h',
+      '<(bindings_modules_v8_output_dir)/ServiceWorkerOrMessagePort.cpp',
+      '<(bindings_modules_v8_output_dir)/ServiceWorkerOrMessagePort.h',
+      '<(bindings_modules_v8_output_dir)/StringOrArrayBufferOrNFCMessage.cpp',
+      '<(bindings_modules_v8_output_dir)/StringOrArrayBufferOrNFCMessage.h',
+      '<(bindings_modules_v8_output_dir)/StringOrCanvasGradientOrCanvasPattern.cpp',
+      '<(bindings_modules_v8_output_dir)/StringOrCanvasGradientOrCanvasPattern.h',
+      '<(bindings_modules_v8_output_dir)/StringOrStringSequence.cpp',
+      '<(bindings_modules_v8_output_dir)/StringOrStringSequence.h',
+      '<(bindings_modules_v8_output_dir)/StringOrStringSequenceOrDOMStringList.cpp',
+      '<(bindings_modules_v8_output_dir)/StringOrStringSequenceOrDOMStringList.h',
+      '<(bindings_modules_v8_output_dir)/StringOrUnsignedLong.cpp',
+      '<(bindings_modules_v8_output_dir)/StringOrUnsignedLong.h',
+      '<(bindings_modules_v8_output_dir)/UnsignedLongOrUnsignedLongSequence.cpp',
+      '<(bindings_modules_v8_output_dir)/UnsignedLongOrUnsignedLongSequence.h',
     ],
 
     'conditions': [
diff --git a/third_party/WebKit/Source/bindings/scripts/code_generator_v8.py b/third_party/WebKit/Source/bindings/scripts/code_generator_v8.py
index 5f89b68..abffa96 100644
--- a/third_party/WebKit/Source/bindings/scripts/code_generator_v8.py
+++ b/third_party/WebKit/Source/bindings/scripts/code_generator_v8.py
@@ -80,7 +80,7 @@
 import v8_types
 import v8_union
 from v8_utilities import capitalize, cpp_name, v8_class_name
-from utilities import KNOWN_COMPONENTS, idl_filename_to_component, is_valid_component_dependency, is_testing_target
+from utilities import KNOWN_COMPONENTS, idl_filename_to_component, is_valid_component_dependency, is_testing_target, shorten_union_name
 
 
 def normalize_and_sort_includes(include_paths):
@@ -129,15 +129,20 @@
     return definitions.interfaces or definitions.dictionaries
 
 
-def depends_on_union_types(idl_type):
-    """Returns true when a given idl_type depends on union containers
-    directly.
+def depending_union_type(idl_type):
+    """Returns the union type name if the given idl_type depends on a
+    union type.
     """
-    if idl_type.is_union_type:
-        return True
-    if idl_type.is_array_or_sequence_type:
-        return idl_type.element_type.is_union_type
-    return False
+    def find_base_type(current_type):
+        if current_type.is_array_or_sequence_type:
+            return find_base_type(current_type.element_type)
+        if current_type.is_nullable:
+            return find_base_type(current_type.inner_type)
+        return current_type
+    base_type = find_base_type(idl_type)
+    if base_type.is_union_type:
+        return base_type
+    return None
 
 
 class TypedefResolver(Visitor):
@@ -149,16 +154,14 @@
         self.typedefs = {}
         for name, typedef in self.info_provider.typedefs.iteritems():
             self.typedefs[name] = typedef.idl_type
-        self.additional_includes = set()
+        self.additional_header_includes = set()
         definitions.accept(self)
         self._update_dependencies_include_paths(definition_name)
 
     def _update_dependencies_include_paths(self, definition_name):
         interface_info = self.info_provider.interfaces_info[definition_name]
-        dependencies_include_paths = interface_info['dependencies_include_paths']
-        for include_path in self.additional_includes:
-            if include_path not in dependencies_include_paths:
-                dependencies_include_paths.append(include_path)
+        interface_info['additional_header_includes'] = set(
+            self.additional_header_includes)
 
     def _resolve_typedefs(self, typed_object):
         """Resolve typedefs to actual types in the object."""
@@ -170,9 +173,12 @@
             if not idl_type:
                 continue
             resolved_idl_type = idl_type.resolve_typedefs(self.typedefs)
-            if depends_on_union_types(resolved_idl_type):
-                self.additional_includes.add(
-                    self.info_provider.include_path_for_union_types)
+            # TODO(bashi): Dependency resolution shouldn't happen here.
+            # Move this into includes_for_type() families.
+            union_type = depending_union_type(resolved_idl_type)
+            if union_type:
+                self.additional_header_includes.add(
+                    self.info_provider.include_path_for_union_types(union_type))
             # Need to re-assign the attribute, not just mutate idl_type, since
             # type(idl_type) may change.
             setattr(typed_object, attribute_name, resolved_idl_type)
@@ -265,7 +271,8 @@
             template_context['header_includes'].add('core/dom/DOMTypedArray.h')
         elif interface_info['include_path']:
             template_context['header_includes'].add(interface_info['include_path'])
-
+        template_context['header_includes'].update(
+            interface_info.get('additional_header_includes', []))
         header_template = self.jinja_env.get_template(header_template_filename)
         cpp_template = self.jinja_env.get_template(cpp_template_filename)
         header_text, cpp_text = render_template(
@@ -323,16 +330,11 @@
         template_context = v8_dictionary.dictionary_impl_context(
             dictionary, interfaces_info)
         include_paths = interface_info.get('dependencies_include_paths')
-        # Add union containers header file to header_includes rather than
-        # cpp file so that union containers can be used in dictionary headers.
-        union_container_headers = [header for header in include_paths
-                                   if header.find('UnionTypes') > 0]
-        include_paths = [header for header in include_paths
-                         if header not in union_container_headers]
-        template_context['header_includes'].update(union_container_headers)
         if not is_testing_target(interface_info.get('full_path')):
             template_context['exported'] = self.info_provider.specifier_for_export
             template_context['header_includes'].add(self.info_provider.include_path_for_export)
+        template_context['header_includes'].update(
+            interface_info.get('additional_header_includes', []))
         header_text, cpp_text = render_template(
             include_paths, header_template, cpp_template, template_context)
         header_path, cpp_path = self.output_paths(
@@ -356,45 +358,54 @@
         self.target_component = target_component
         set_global_type_info(info_provider)
 
-    def generate_code(self):
-        union_types = self.info_provider.union_types
-        if not union_types:
-            return ()
-        header_template = self.jinja_env.get_template('union.h')
-        cpp_template = self.jinja_env.get_template('union.cpp')
-        template_context = v8_union.union_context(
-            union_types, self.info_provider.interfaces_info)
-        template_context['code_generator'] = module_pyname
-        capitalized_component = self.target_component.capitalize()
-        template_context['exported'] = self.info_provider.specifier_for_export
-        template_context['header_filename'] = 'bindings/%s/v8/UnionTypes%s.h' % (
-            self.target_component, capitalized_component)
-        template_context['macro_guard'] = 'UnionType%s_h' % capitalized_component
-        additional_header_includes = [self.info_provider.include_path_for_export]
-
-        # Add UnionTypesCore.h as a dependency when we generate modules union types
-        # because we only generate union type containers which are used by both
-        # core and modules in UnionTypesCore.h.
-        # FIXME: This is an ad hoc workaround and we need a general way to
-        # handle core <-> modules dependency.
-        if self.target_component == 'modules':
-            additional_header_includes.append(
-                'bindings/core/v8/UnionTypesCore.h')
-
+    def _generate_container_code(self, union_type):
+        header_template = self.jinja_env.get_template('union_container.h')
+        cpp_template = self.jinja_env.get_template('union_container.cpp')
+        template_context = v8_union.container_context(
+            union_type, self.info_provider.interfaces_info)
+        template_context['header_includes'].append(
+            self.info_provider.include_path_for_export)
         template_context['header_includes'] = normalize_and_sort_includes(
-            template_context['header_includes'] + additional_header_includes)
-
+            template_context['header_includes'])
+        template_context['code_generator'] = module_pyname
+        template_context['exported'] = self.info_provider.specifier_for_export
+        name = shorten_union_name(union_type)
+        template_context['this_include_header_name'] = name
         header_text = header_template.render(template_context)
         cpp_text = cpp_template.render(template_context)
-        header_path = posixpath.join(self.output_dir,
-                                     'UnionTypes%s.h' % capitalized_component)
-        cpp_path = posixpath.join(self.output_dir,
-                                  'UnionTypes%s.cpp' % capitalized_component)
+        header_path = posixpath.join(self.output_dir, '%s.h' % name)
+        cpp_path = posixpath.join(self.output_dir, '%s.cpp' % name)
         return (
             (header_path, header_text),
             (cpp_path, cpp_text),
         )
 
+    def _get_union_types_for_containers(self):
+        union_types = self.info_provider.union_types
+        if not union_types:
+            return None
+        # For container classes we strip nullable wrappers. For example,
+        # both (A or B)? and (A? or B) will become AOrB. This should be OK
+        # because container classes can handle null and it seems that
+        # distinguishing (A or B)? and (A? or B) doesn't make sense.
+        container_cpp_types = set()
+        union_types_for_containers = set()
+        for union_type in union_types:
+            cpp_type = union_type.cpp_type
+            if cpp_type not in container_cpp_types:
+                union_types_for_containers.add(union_type)
+                container_cpp_types.add(cpp_type)
+        return union_types_for_containers
+
+    def generate_code(self):
+        union_types = self._get_union_types_for_containers()
+        if not union_types:
+            return ()
+        outputs = set()
+        for union_type in union_types:
+            outputs.update(self._generate_container_code(union_type))
+        return outputs
+
 
 def initialize_jinja_env(cache_dir):
     jinja_env = jinja2.Environment(
diff --git a/third_party/WebKit/Source/bindings/scripts/compute_interfaces_info_individual.py b/third_party/WebKit/Source/bindings/scripts/compute_interfaces_info_individual.py
index 26af9fe7d..971290d8 100755
--- a/third_party/WebKit/Source/bindings/scripts/compute_interfaces_info_individual.py
+++ b/third_party/WebKit/Source/bindings/scripts/compute_interfaces_info_individual.py
@@ -50,7 +50,7 @@
 from idl_compiler import idl_filename_to_interface_name
 from idl_definitions import Visitor
 from idl_reader import IdlReader
-from utilities import get_file_contents, read_file_to_list, idl_filename_to_interface_name, idl_filename_to_component, write_pickle_file, get_interface_extended_attributes_from_idl, is_callback_interface_from_idl, merge_dict_recursively
+from utilities import get_file_contents, read_file_to_list, idl_filename_to_interface_name, idl_filename_to_component, write_pickle_file, get_interface_extended_attributes_from_idl, is_callback_interface_from_idl, merge_dict_recursively, shorten_union_name
 
 module_path = os.path.dirname(__file__)
 source_path = os.path.normpath(os.path.join(module_path, os.pardir, os.pardir))
@@ -266,9 +266,10 @@
             partial_include_paths = []
             if this_include_path:
                 partial_include_paths.append(this_include_path)
-            if this_union_types:
+            for union_type in this_union_types:
+                name = shorten_union_name(union_type)
                 partial_include_paths.append(
-                    'bindings/%s/v8/UnionTypes%s.h' % (component, component.capitalize()))
+                    'bindings/%s/v8/%s.h' % (component, name))
             self.add_paths_to_partials_dict(definition.name, full_path, partial_include_paths)
             # Collects C++ header paths which should be included from generated
             # .cpp files.  The resulting structure is as follows.
@@ -295,7 +296,7 @@
         interface_info.update({
             'extended_attributes': extended_attributes,
             'full_path': full_path,
-            'has_union_types': bool(this_union_types),
+            'union_types': this_union_types,
             'implemented_as': implemented_as,
             'implemented_by_interfaces': left_interfaces,
             'implements_interfaces': right_interfaces,
diff --git a/third_party/WebKit/Source/bindings/scripts/compute_interfaces_info_overall.py b/third_party/WebKit/Source/bindings/scripts/compute_interfaces_info_overall.py
index 3e42702..ed5c9df2 100755
--- a/third_party/WebKit/Source/bindings/scripts/compute_interfaces_info_overall.py
+++ b/third_party/WebKit/Source/bindings/scripts/compute_interfaces_info_overall.py
@@ -86,7 +86,7 @@
 import optparse
 import sys
 
-from utilities import idl_filename_to_component, read_pickle_files, write_pickle_file, merge_dict_recursively
+from utilities import idl_filename_to_component, read_pickle_files, write_pickle_file, merge_dict_recursively, shorten_union_name
 
 INHERITED_EXTENDED_ATTRIBUTES = set([
     'ActiveScriptWrappable',
@@ -287,9 +287,10 @@
             else:
                 dependencies_other_component_include_paths.append(include_path)
 
-        if interface_info['has_union_types']:
+        for union_type in interface_info.get('union_types', []):
+            name = shorten_union_name(union_type)
             dependencies_include_paths.append(
-                'bindings/%s/v8/UnionTypes%s.h' % (component, component.capitalize()))
+                'bindings/%s/v8/%s.h' % (component, name))
 
         interface_info.update({
             'dependencies_full_paths': dependencies_full_paths,
@@ -303,7 +304,7 @@
     # Clean up temporary private information
     for interface_info in interfaces_info.itervalues():
         del interface_info['extended_attributes']
-        del interface_info['has_union_types']
+        del interface_info['union_types']
         del interface_info['is_legacy_treat_as_partial_interface']
 
     # Compute global_type_info to interfaces_info so that idl_compiler does
diff --git a/third_party/WebKit/Source/bindings/scripts/utilities.py b/third_party/WebKit/Source/bindings/scripts/utilities.py
index 2370887..92e8085 100644
--- a/third_party/WebKit/Source/bindings/scripts/utilities.py
+++ b/third_party/WebKit/Source/bindings/scripts/utilities.py
@@ -88,7 +88,7 @@
         return set()
 
     @property
-    def include_path_for_union_types(self):
+    def include_path_for_union_types(self, union_type):
         return None
 
 
@@ -118,9 +118,9 @@
     def union_types(self):
         return self._component_info['union_types']
 
-    @property
-    def include_path_for_union_types(self):
-        return 'bindings/core/v8/UnionTypesCore.h'
+    def include_path_for_union_types(self, union_type):
+        name = shorten_union_name(union_type)
+        return 'bindings/core/v8/%s.h' % name
 
     @property
     def specifier_for_export(self):
@@ -165,9 +165,13 @@
         # generating multiple container generation.
         return self._component_info_modules['union_types'] - self._component_info_core['union_types']
 
-    @property
-    def include_path_for_union_types(self):
-        return 'bindings/modules/v8/UnionTypesModules.h'
+    def include_path_for_union_types(self, union_type):
+        core_union_type_names = [core_union_type.name for core_union_type
+                                 in self._component_info_core['union_types']]
+        name = shorten_union_name(union_type)
+        if union_type.name in core_union_type_names:
+            return 'bindings/core/v8/%s.h' % name
+        return 'bindings/modules/v8/%s.h' % name
 
     @property
     def specifier_for_export(self):
@@ -384,3 +388,20 @@
         arguments.append({'exposed': exposed, 'runtime_enabled': runtime_enabled})
 
     return arguments
+
+
+# Workaround for http://crbug.com/611437
+# TODO(bashi): Remove this hack once we resolve too-long generated file names.
+def shorten_union_name(union_type):
+    aliases = {
+        'CanvasRenderingContext2DOrWebGLRenderingContextOrWebGL2RenderingContextOrImageBitmapRenderingContext': 'RenderingContext',
+    }
+
+    idl_type = union_type
+    if union_type.is_nullable:
+        idl_type = union_type.inner_type
+    name = idl_type.cpp_type or idl_type.name
+    alias = aliases.get(name)
+    if alias:
+        return alias
+    return name
diff --git a/third_party/WebKit/Source/bindings/scripts/v8_attributes.py b/third_party/WebKit/Source/bindings/scripts/v8_attributes.py
index de3c2c7..9bffba9 100644
--- a/third_party/WebKit/Source/bindings/scripts/v8_attributes.py
+++ b/third_party/WebKit/Source/bindings/scripts/v8_attributes.py
@@ -135,6 +135,7 @@
         'is_read_only': attribute.is_read_only,
         'is_reflect': is_reflect,
         'is_replaceable': 'Replaceable' in attribute.extended_attributes,
+        'is_same_object': 'SameObject' in attribute.extended_attributes,
         'is_static': attribute.is_static,
         'is_url': 'URL' in extended_attributes,
         'is_unforgeable': is_unforgeable(interface, attribute),
diff --git a/third_party/WebKit/Source/bindings/scripts/v8_union.py b/third_party/WebKit/Source/bindings/scripts/v8_union.py
index fa22cdb..b7b6ece 100644
--- a/third_party/WebKit/Source/bindings/scripts/v8_union.py
+++ b/third_party/WebKit/Source/bindings/scripts/v8_union.py
@@ -2,9 +2,14 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import v8_types
 import v8_utilities
 
 
+UNION_CPP_INCLUDES = frozenset([
+    'bindings/core/v8/ToV8.h',
+])
+
 UNION_H_INCLUDES = frozenset([
     'bindings/core/v8/Dictionary.h',
     'bindings/core/v8/ExceptionState.h',
@@ -28,37 +33,12 @@
 header_includes = set()
 
 
-def union_context(union_types, interfaces_info):
+def container_context(union_type, interfaces_info):
     cpp_includes.clear()
     header_forward_decls.clear()
     header_includes.clear()
+    cpp_includes.update(UNION_CPP_INCLUDES)
     header_includes.update(UNION_H_INCLUDES)
-
-    # For container classes we strip nullable wrappers. For example,
-    # both (A or B)? and (A? or B) will become AOrB. This should be OK
-    # because container classes can handle null and it seems that
-    # distinguishing (A or B)? and (A? or B) doesn't make sense.
-    container_cpp_types = set()
-    union_types_for_containers = set()
-    for union_type in union_types:
-        cpp_type = union_type.cpp_type
-        if cpp_type not in container_cpp_types:
-            union_types_for_containers.add(union_type)
-            container_cpp_types.add(cpp_type)
-
-    union_types_for_containers = sorted(union_types_for_containers,
-                                        key=lambda union_type: union_type.cpp_type)
-
-    return {
-        'containers': [container_context(union_type, interfaces_info)
-                       for union_type in union_types_for_containers],
-        'cpp_includes': sorted(cpp_includes - UNION_CPP_INCLUDES_BLACKLIST),
-        'header_forward_decls': sorted(header_forward_decls),
-        'header_includes': sorted(header_includes),
-    }
-
-
-def container_context(union_type, interfaces_info):
     members = []
 
     # These variables refer to member contexts if the given union type has
@@ -114,13 +94,17 @@
     if dictionary_type and nullable_members == 1:
         raise Exception('%s has a dictionary and a nullable member' % union_type.name)
 
+    cpp_class = union_type.cpp_type
     return {
         'array_buffer_type': array_buffer_type,
         'array_buffer_view_type': array_buffer_view_type,
         'array_or_sequence_type': array_or_sequence_type,
         'boolean_type': boolean_type,
-        'cpp_class': union_type.cpp_type,
+        'cpp_class': cpp_class,
+        'cpp_includes': sorted(cpp_includes - UNION_CPP_INCLUDES_BLACKLIST),
         'dictionary_type': dictionary_type,
+        'header_includes': sorted(header_includes),
+        'header_forward_decls': sorted(header_forward_decls),
         'includes_nullable_type': union_type.includes_nullable_type,
         'interface_types': interface_types,
         'members': members,
@@ -128,6 +112,7 @@
         'object_type': object_type,
         'string_type': string_type,
         'type_string': str(union_type),
+        'v8_class': v8_types.v8_type(cpp_class),
     }
 
 
@@ -135,15 +120,7 @@
     if interface_info:
         cpp_includes.update(interface_info.get(
             'dependencies_include_paths', []))
-        # TODO(bashi): Workaround for http://crbug.com/524424
-        # Avoid using forward declaration for IDL dictionaries so that they
-        # aren't imcomplete types in UnionTypes.h. This enables an IDL
-        # dictionary to have a union type which has an IDL dictionary. e.g.
-        #   dictionary DictA { (boolean or DictB) member; }
-        # Note that this doesn't cover all cases. We still can't use an IDL
-        # dictionary in a union type when the dictionary contains a union type.
-        # e.g.
-        #   void foo((DOMString or DictA) arg);  // won't compile
+        # We need complete types for IDL dictionaries in union containers.
         if member.is_dictionary:
             header_includes.update(member.includes_for_type())
         else:
diff --git a/third_party/WebKit/Source/bindings/templates/attributes.cpp b/third_party/WebKit/Source/bindings/templates/attributes.cpp
index c5214d3..5a5ce96 100644
--- a/third_party/WebKit/Source/bindings/templates/attributes.cpp
+++ b/third_party/WebKit/Source/bindings/templates/attributes.cpp
@@ -27,9 +27,21 @@
     v8::Local<v8::Object> holder = info.Holder();
     {% endif %}
     {# impl #}
+    {% if not attribute.is_static %}
+    {{cpp_class}}* impl = {{v8_class}}::toImpl(holder);
+    {% endif %}
+    {% if attribute.is_same_object %}
+    v8::Local<v8::String> propertyName = v8AtomicString(info.GetIsolate(), "sameobject_{{attribute.name}}");
+    {
+        v8::Local<v8::Value> v8Value = V8HiddenValue::getHiddenValue(ScriptState::current(info.GetIsolate()), holder, propertyName);
+        if (!v8Value.IsEmpty()) {
+            v8SetReturnValue(info, v8Value);
+            return;
+        }
+    }
+    {% endif %}
     {% if attribute.cached_attribute_validation_method %}
     v8::Local<v8::String> propertyName = v8AtomicString(info.GetIsolate(), "{{attribute.name}}");
-    {{cpp_class}}* impl = {{v8_class}}::toImpl(holder);
     if (!impl->{{attribute.cached_attribute_validation_method}}()) {
         v8::Local<v8::Value> v8Value = V8HiddenValue::getHiddenValue(ScriptState::current(info.GetIsolate()), holder, propertyName);
         if (!v8Value.IsEmpty() && !v8Value->IsUndefined()) {
@@ -37,8 +49,6 @@
             return;
         }
     }
-    {% elif not attribute.is_static %}
-    {{cpp_class}}* impl = {{v8_class}}::toImpl(holder);
     {% endif %}
     {% if interface_name == 'Window' and attribute.idl_type == 'EventHandler' %}
     if (!impl->document())
@@ -123,6 +133,9 @@
     {% endif %}
     {{attribute.v8_set_return_value}};
     {% endif %}
+    {% if attribute.is_same_object %}
+    V8HiddenValue::setHiddenValue(ScriptState::current(info.GetIsolate()), holder, propertyName, info.GetReturnValue().Get());
+    {% endif %}
 }
 {% endmacro %}
 
diff --git a/third_party/WebKit/Source/bindings/templates/templates.gni b/third_party/WebKit/Source/bindings/templates/templates.gni
index 7a20c64..5d316fd 100644
--- a/third_party/WebKit/Source/bindings/templates/templates.gni
+++ b/third_party/WebKit/Source/bindings/templates/templates.gni
@@ -20,7 +20,7 @@
                                                 "methods.cpp",
                                                 "partial_interface.cpp",
                                                 "partial_interface.h",
-                                                "union.cpp",
-                                                "union.h",
+                                                "union_container.cpp",
+                                                "union_container.h",
                                               ],
                                               "abspath")
diff --git a/third_party/WebKit/Source/bindings/templates/templates.gypi b/third_party/WebKit/Source/bindings/templates/templates.gypi
index e1fd7ad8..8e5e28d 100644
--- a/third_party/WebKit/Source/bindings/templates/templates.gypi
+++ b/third_party/WebKit/Source/bindings/templates/templates.gypi
@@ -21,8 +21,8 @@
       'methods.cpp',
       'partial_interface.cpp',
       'partial_interface.h',
-      'union.cpp',
-      'union.h',
+      'union_container.cpp',
+      'union_container.h',
     ],
   },
 }
diff --git a/third_party/WebKit/Source/bindings/templates/union.cpp b/third_party/WebKit/Source/bindings/templates/union.cpp
deleted file mode 100644
index 534ceaa..0000000
--- a/third_party/WebKit/Source/bindings/templates/union.cpp
+++ /dev/null
@@ -1,203 +0,0 @@
-{% from 'utilities.cpp' import declare_enum_validation_variable %}
-{% include 'copyright_block.txt' %}
-#include "{{header_filename}}"
-
-{% from 'utilities.cpp' import v8_value_to_local_cpp_value %}
-{% macro assign_and_return_if_hasinstance(member) %}
-if (V8{{member.type_name}}::hasInstance(v8Value, isolate)) {
-    {{member.cpp_local_type}} cppValue = V8{{member.type_name}}::toImpl(v8::Local<v8::Object>::Cast(v8Value));
-    impl.set{{member.type_name}}(cppValue);
-    return;
-}
-{% endmacro %}
-{% for filename in cpp_includes %}
-#include "{{filename}}"
-{% endfor %}
-
-namespace blink {
-
-{% for container in containers %}
-{{container.cpp_class}}::{{container.cpp_class}}()
-    : m_type(SpecificTypeNone)
-{
-}
-
-{% for member in container.members %}
-{{member.rvalue_cpp_type}} {{container.cpp_class}}::getAs{{member.type_name}}() const
-{
-    ASSERT(is{{member.type_name}}());
-    return m_{{member.cpp_name}};
-}
-
-void {{container.cpp_class}}::set{{member.type_name}}({{member.rvalue_cpp_type}} value)
-{
-    ASSERT(isNull());
-    {% if member.enum_values %}
-    NonThrowableExceptionState exceptionState;
-    {{declare_enum_validation_variable(member.enum_values) | indent}}
-    if (!isValidEnum(value, validValues, WTF_ARRAY_LENGTH(validValues), "{{member.type_name}}", exceptionState)) {
-        ASSERT_NOT_REACHED();
-        return;
-    }
-    {% endif %}
-    m_{{member.cpp_name}} = value;
-    m_type = {{member.specific_type_enum}};
-}
-
-{{container.cpp_class}} {{container.cpp_class}}::from{{member.type_name}}({{member.rvalue_cpp_type}} value)
-{
-    {{container.cpp_class}} container;
-    container.set{{member.type_name}}(value);
-    return container;
-}
-
-{% endfor %}
-{{container.cpp_class}}::{{container.cpp_class}}(const {{container.cpp_class}}&) = default;
-{{container.cpp_class}}::~{{container.cpp_class}}() = default;
-{{container.cpp_class}}& {{container.cpp_class}}::operator=(const {{container.cpp_class}}&) = default;
-
-DEFINE_TRACE({{container.cpp_class}})
-{
-    {% for member in container.members if member.is_traceable %}
-    visitor->trace(m_{{member.cpp_name}});
-    {% endfor %}
-}
-
-void V8{{container.cpp_class}}::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, {{container.cpp_class}}& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
-{
-    if (v8Value.IsEmpty())
-        return;
-
-    {# The numbers in the following comments refer to the steps described in
-       http://heycam.github.io/webidl/#es-union #}
-    {# 1. null or undefined #}
-    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
-        return;
-
-    {# 3. Platform objects (interfaces) #}
-    {% for interface in container.interface_types %}
-    {{assign_and_return_if_hasinstance(interface) | indent}}
-
-    {% endfor %}
-    {# 8. ArrayBuffer #}
-    {% if container.array_buffer_type %}
-    {{assign_and_return_if_hasinstance(container.array_buffer_type) | indent}}
-
-    {% endif %}
-    {# 9., 10. ArrayBufferView #}
-    {# FIXME: Individual typed arrays (e.g. Uint8Array) aren't supported yet. #}
-    {% if container.array_buffer_view_type %}
-    {{assign_and_return_if_hasinstance(container.array_buffer_view_type) | indent}}
-
-    {% endif %}
-    {% if container.dictionary_type %}
-    {# 12. Dictionaries #}
-    {# FIXME: This should also check "object but not Date or RegExp". Add checks
-       when we implement conversions for Date and RegExp. #}
-    if (isUndefinedOrNull(v8Value) || v8Value->IsObject()) {
-        {{v8_value_to_local_cpp_value(container.dictionary_type) | indent(8)}}
-        impl.set{{container.dictionary_type.type_name}}(cppValue);
-        return;
-    }
-
-    {% endif %}
-    {% if container.array_or_sequence_type %}
-    {# 13.1, 13.2. Arrays and Sequences #}
-    {# FIXME: This should also check "object but not Date or RegExp". Add checks
-       when we implement conversions for Date and RegExp. #}
-    {# FIXME: Should check for sequences too, not just Array instances. #}
-    if (v8Value->IsArray()) {
-        {{v8_value_to_local_cpp_value(container.array_or_sequence_type) | indent(8)}}
-        impl.set{{container.array_or_sequence_type.type_name}}(cppValue);
-        return;
-    }
-
-    {% endif %}
-    {# TODO(bashi): Support 13.3 Callback interface when we need it #}
-    {# 13.4. Objects #}
-    {% if container.object_type %}
-    if (isUndefinedOrNull(v8Value) || v8Value->IsObject()) {
-        {{v8_value_to_local_cpp_value(container.object_type) | indent(8)}}
-        impl.set{{container.object_type.type_name}}(cppValue);
-        return;
-    }
-
-    {% endif %}
-    {# FIXME: In some cases, we can omit boolean and numeric type checks because
-       we have fallback conversions. (step 17 and 18) #}
-    {% if container.boolean_type %}
-    {# 14. Boolean #}
-    if (v8Value->IsBoolean()) {
-        impl.setBoolean(v8Value.As<v8::Boolean>()->Value());
-        return;
-    }
-
-    {% endif %}
-    {% if container.numeric_type %}
-    {# 15. Number #}
-    if (v8Value->IsNumber()) {
-        {{v8_value_to_local_cpp_value(container.numeric_type) | indent(8)}}
-        impl.set{{container.numeric_type.type_name}}(cppValue);
-        return;
-    }
-
-    {% endif %}
-    {% if container.string_type %}
-    {# 16. String #}
-    {
-        {{v8_value_to_local_cpp_value(container.string_type) | indent(8)}}
-        {% if container.string_type.enum_values %}
-        {{declare_enum_validation_variable(container.string_type.enum_values) | indent(8)}}
-        if (!isValidEnum(cppValue, validValues, WTF_ARRAY_LENGTH(validValues), "{{container.string_type.type_name}}", exceptionState))
-            return;
-        {% endif %}
-        impl.set{{container.string_type.type_name}}(cppValue);
-        return;
-    }
-
-    {# 17. Number (fallback) #}
-    {% elif container.numeric_type %}
-    {
-        {{v8_value_to_local_cpp_value(container.numeric_type) | indent(8)}}
-        impl.set{{container.numeric_type.type_name}}(cppValue);
-        return;
-    }
-
-    {# 18. Boolean (fallback) #}
-    {% elif container.boolean_type %}
-    {
-        impl.setBoolean(v8Value->BooleanValue());
-        return;
-    }
-
-    {% else %}
-    {# 19. TypeError #}
-    exceptionState.throwTypeError("The provided value is not of type '{{container.type_string}}'");
-    {% endif %}
-}
-
-v8::Local<v8::Value> toV8(const {{container.cpp_class}}& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
-{
-    switch (impl.m_type) {
-    case {{container.cpp_class}}::SpecificTypeNone:
-        {# FIXME: We might want to return undefined in some cases #}
-        return v8::Null(isolate);
-    {% for member in container.members %}
-    case {{container.cpp_class}}::{{member.specific_type_enum}}:
-        return {{member.cpp_value_to_v8_value}};
-    {% endfor %}
-    default:
-        ASSERT_NOT_REACHED();
-    }
-    return v8::Local<v8::Value>();
-}
-
-{{container.cpp_class}} NativeValueTraits<{{container.cpp_class}}>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
-{
-    {{container.cpp_class}} impl;
-    V8{{container.cpp_class}}::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
-    return impl;
-}
-
-{% endfor %}
-} // namespace blink
diff --git a/third_party/WebKit/Source/bindings/templates/union.h b/third_party/WebKit/Source/bindings/templates/union.h
deleted file mode 100644
index 7de43bb..0000000
--- a/third_party/WebKit/Source/bindings/templates/union.h
+++ /dev/null
@@ -1,79 +0,0 @@
-{% include 'copyright_block.txt' %}
-#ifndef {{macro_guard}}
-#define {{macro_guard}}
-
-{% for filename in header_includes %}
-#include "{{filename}}"
-{% endfor %}
-
-namespace blink {
-
-{% for decl in header_forward_decls %}
-class {{decl}};
-{% endfor %}
-
-{% for container in containers %}
-class {{exported}}{{container.cpp_class}} final {
-    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
-public:
-    {{container.cpp_class}}();
-    bool isNull() const { return m_type == SpecificTypeNone; }
-
-    {% for member in container.members %}
-    bool is{{member.type_name}}() const { return m_type == {{member.specific_type_enum}}; }
-    {{member.rvalue_cpp_type}} getAs{{member.type_name}}() const;
-    void set{{member.type_name}}({{member.rvalue_cpp_type}});
-    static {{container.cpp_class}} from{{member.type_name}}({{member.rvalue_cpp_type}});
-
-    {% endfor %}
-    {{container.cpp_class}}(const {{container.cpp_class}}&);
-    ~{{container.cpp_class}}();
-    {{container.cpp_class}}& operator=(const {{container.cpp_class}}&);
-    DECLARE_TRACE();
-
-private:
-    enum SpecificTypes {
-        SpecificTypeNone,
-        {% for member in container.members %}
-        {{member.specific_type_enum}},
-        {% endfor %}
-    };
-    SpecificTypes m_type;
-
-    {% for member in container.members %}
-    {{member.cpp_type}} m_{{member.cpp_name}};
-    {% endfor %}
-
-    friend {{exported}}v8::Local<v8::Value> toV8(const {{container.cpp_class}}&, v8::Local<v8::Object>, v8::Isolate*);
-};
-
-class V8{{container.cpp_class}} final {
-public:
-    {{exported}}static void toImpl(v8::Isolate*, v8::Local<v8::Value>, {{container.cpp_class}}&, UnionTypeConversionMode, ExceptionState&);
-};
-
-{{exported}}v8::Local<v8::Value> toV8(const {{container.cpp_class}}&, v8::Local<v8::Object>, v8::Isolate*);
-
-template <class CallbackInfo>
-inline void v8SetReturnValue(const CallbackInfo& callbackInfo, {{container.cpp_class}}& impl)
-{
-    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
-}
-
-template <>
-struct NativeValueTraits<{{container.cpp_class}}> {
-    {{exported}}static {{container.cpp_class}} nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
-};
-
-{% endfor %}
-} // namespace blink
-
-// We need to set canInitializeWithMemset=true because HeapVector supports
-// items that can initialize with memset or have a vtable. It is safe to
-// set canInitializeWithMemset=true for a union type object in practice.
-// See https://codereview.chromium.org/1118993002/#msg5 for more details.
-{% for container in containers %}
-WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::{{container.cpp_class}});
-{% endfor %}
-
-#endif // {{macro_guard}}
diff --git a/third_party/WebKit/Source/bindings/templates/union_container.cpp b/third_party/WebKit/Source/bindings/templates/union_container.cpp
new file mode 100644
index 0000000..8ad45d0c
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/templates/union_container.cpp
@@ -0,0 +1,201 @@
+{% from 'utilities.cpp' import declare_enum_validation_variable %}
+{% include 'copyright_block.txt' %}
+#include "{{this_include_header_name}}.h"
+
+{% from 'utilities.cpp' import v8_value_to_local_cpp_value %}
+{% macro assign_and_return_if_hasinstance(member) %}
+if (V8{{member.type_name}}::hasInstance(v8Value, isolate)) {
+    {{member.cpp_local_type}} cppValue = V8{{member.type_name}}::toImpl(v8::Local<v8::Object>::Cast(v8Value));
+    impl.set{{member.type_name}}(cppValue);
+    return;
+}
+{% endmacro %}
+{% for filename in cpp_includes %}
+#include "{{filename}}"
+{% endfor %}
+
+namespace blink {
+
+{{cpp_class}}::{{cpp_class}}()
+    : m_type(SpecificTypeNone)
+{
+}
+
+{% for member in members %}
+{{member.rvalue_cpp_type}} {{cpp_class}}::getAs{{member.type_name}}() const
+{
+    ASSERT(is{{member.type_name}}());
+    return m_{{member.cpp_name}};
+}
+
+void {{cpp_class}}::set{{member.type_name}}({{member.rvalue_cpp_type}} value)
+{
+    ASSERT(isNull());
+    {% if member.enum_values %}
+    NonThrowableExceptionState exceptionState;
+    {{declare_enum_validation_variable(member.enum_values) | indent}}
+    if (!isValidEnum(value, validValues, WTF_ARRAY_LENGTH(validValues), "{{member.type_name}}", exceptionState)) {
+        ASSERT_NOT_REACHED();
+        return;
+    }
+    {% endif %}
+    m_{{member.cpp_name}} = value;
+    m_type = {{member.specific_type_enum}};
+}
+
+{{cpp_class}} {{cpp_class}}::from{{member.type_name}}({{member.rvalue_cpp_type}} value)
+{
+    {{cpp_class}} container;
+    container.set{{member.type_name}}(value);
+    return container;
+}
+
+{% endfor %}
+{{cpp_class}}::{{cpp_class}}(const {{cpp_class}}&) = default;
+{{cpp_class}}::~{{cpp_class}}() = default;
+{{cpp_class}}& {{cpp_class}}::operator=(const {{cpp_class}}&) = default;
+
+DEFINE_TRACE({{cpp_class}})
+{
+    {% for member in members if member.is_traceable %}
+    visitor->trace(m_{{member.cpp_name}});
+    {% endfor %}
+}
+
+void {{v8_class}}::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, {{cpp_class}}& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
+{
+    if (v8Value.IsEmpty())
+        return;
+
+    {# The numbers in the following comments refer to the steps described in
+       http://heycam.github.io/webidl/#es-union #}
+    {# 1. null or undefined #}
+    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
+        return;
+
+    {# 3. Platform objects (interfaces) #}
+    {% for interface in interface_types %}
+    {{assign_and_return_if_hasinstance(interface) | indent}}
+
+    {% endfor %}
+    {# 8. ArrayBuffer #}
+    {% if array_buffer_type %}
+    {{assign_and_return_if_hasinstance(array_buffer_type) | indent}}
+
+    {% endif %}
+    {# 9., 10. ArrayBufferView #}
+    {# FIXME: Individual typed arrays (e.g. Uint8Array) aren't supported yet. #}
+    {% if array_buffer_view_type %}
+    {{assign_and_return_if_hasinstance(array_buffer_view_type) | indent}}
+
+    {% endif %}
+    {% if dictionary_type %}
+    {# 12. Dictionaries #}
+    {# FIXME: This should also check "object but not Date or RegExp". Add checks
+       when we implement conversions for Date and RegExp. #}
+    if (isUndefinedOrNull(v8Value) || v8Value->IsObject()) {
+        {{v8_value_to_local_cpp_value(dictionary_type) | indent(8)}}
+        impl.set{{dictionary_type.type_name}}(cppValue);
+        return;
+    }
+
+    {% endif %}
+    {% if array_or_sequence_type %}
+    {# 13.1, 13.2. Arrays and Sequences #}
+    {# FIXME: This should also check "object but not Date or RegExp". Add checks
+       when we implement conversions for Date and RegExp. #}
+    {# FIXME: Should check for sequences too, not just Array instances. #}
+    if (v8Value->IsArray()) {
+        {{v8_value_to_local_cpp_value(array_or_sequence_type) | indent(8)}}
+        impl.set{{array_or_sequence_type.type_name}}(cppValue);
+        return;
+    }
+
+    {% endif %}
+    {# TODO(bashi): Support 13.3 Callback interface when we need it #}
+    {# 13.4. Objects #}
+    {% if object_type %}
+    if (isUndefinedOrNull(v8Value) || v8Value->IsObject()) {
+        {{v8_value_to_local_cpp_value(object_type) | indent(8)}}
+        impl.set{{object_type.type_name}}(cppValue);
+        return;
+    }
+
+    {% endif %}
+    {# FIXME: In some cases, we can omit boolean and numeric type checks because
+       we have fallback conversions. (step 17 and 18) #}
+    {% if boolean_type %}
+    {# 14. Boolean #}
+    if (v8Value->IsBoolean()) {
+        impl.setBoolean(v8Value.As<v8::Boolean>()->Value());
+        return;
+    }
+
+    {% endif %}
+    {% if numeric_type %}
+    {# 15. Number #}
+    if (v8Value->IsNumber()) {
+        {{v8_value_to_local_cpp_value(numeric_type) | indent(8)}}
+        impl.set{{numeric_type.type_name}}(cppValue);
+        return;
+    }
+
+    {% endif %}
+    {% if string_type %}
+    {# 16. String #}
+    {
+        {{v8_value_to_local_cpp_value(string_type) | indent(8)}}
+        {% if string_type.enum_values %}
+        {{declare_enum_validation_variable(string_type.enum_values) | indent(8)}}
+        if (!isValidEnum(cppValue, validValues, WTF_ARRAY_LENGTH(validValues), "{{string_type.type_name}}", exceptionState))
+            return;
+        {% endif %}
+        impl.set{{string_type.type_name}}(cppValue);
+        return;
+    }
+
+    {# 17. Number (fallback) #}
+    {% elif numeric_type %}
+    {
+        {{v8_value_to_local_cpp_value(numeric_type) | indent(8)}}
+        impl.set{{numeric_type.type_name}}(cppValue);
+        return;
+    }
+
+    {# 18. Boolean (fallback) #}
+    {% elif boolean_type %}
+    {
+        impl.setBoolean(v8Value->BooleanValue());
+        return;
+    }
+
+    {% else %}
+    {# 19. TypeError #}
+    exceptionState.throwTypeError("The provided value is not of type '{{type_string}}'");
+    {% endif %}
+}
+
+v8::Local<v8::Value> toV8(const {{cpp_class}}& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
+{
+    switch (impl.m_type) {
+    case {{cpp_class}}::SpecificTypeNone:
+        {# FIXME: We might want to return undefined in some cases #}
+        return v8::Null(isolate);
+    {% for member in members %}
+    case {{cpp_class}}::{{member.specific_type_enum}}:
+        return {{member.cpp_value_to_v8_value}};
+    {% endfor %}
+    default:
+        ASSERT_NOT_REACHED();
+    }
+    return v8::Local<v8::Value>();
+}
+
+{{cpp_class}} NativeValueTraits<{{cpp_class}}>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
+{
+    {{cpp_class}} impl;
+    {{v8_class}}::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
+    return impl;
+}
+
+} // namespace blink
diff --git a/third_party/WebKit/Source/bindings/templates/union_container.h b/third_party/WebKit/Source/bindings/templates/union_container.h
new file mode 100644
index 0000000..773c7ca7
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/templates/union_container.h
@@ -0,0 +1,75 @@
+{% include 'copyright_block.txt' %}
+#ifndef {{cpp_class}}_h
+#define {{cpp_class}}_h
+
+{% for filename in header_includes %}
+#include "{{filename}}"
+{% endfor %}
+
+namespace blink {
+
+{% for decl in header_forward_decls %}
+class {{decl}};
+{% endfor %}
+
+class {{exported}}{{cpp_class}} final {
+    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
+public:
+    {{cpp_class}}();
+    bool isNull() const { return m_type == SpecificTypeNone; }
+
+    {% for member in members %}
+    bool is{{member.type_name}}() const { return m_type == {{member.specific_type_enum}}; }
+    {{member.rvalue_cpp_type}} getAs{{member.type_name}}() const;
+    void set{{member.type_name}}({{member.rvalue_cpp_type}});
+    static {{cpp_class}} from{{member.type_name}}({{member.rvalue_cpp_type}});
+
+    {% endfor %}
+    {{cpp_class}}(const {{cpp_class}}&);
+    ~{{cpp_class}}();
+    {{cpp_class}}& operator=(const {{cpp_class}}&);
+    DECLARE_TRACE();
+
+private:
+    enum SpecificTypes {
+        SpecificTypeNone,
+        {% for member in members %}
+        {{member.specific_type_enum}},
+        {% endfor %}
+    };
+    SpecificTypes m_type;
+
+    {% for member in members %}
+    {{member.cpp_type}} m_{{member.cpp_name}};
+    {% endfor %}
+
+    friend {{exported}}v8::Local<v8::Value> toV8(const {{cpp_class}}&, v8::Local<v8::Object>, v8::Isolate*);
+};
+
+class {{v8_class}} final {
+public:
+    {{exported}}static void toImpl(v8::Isolate*, v8::Local<v8::Value>, {{cpp_class}}&, UnionTypeConversionMode, ExceptionState&);
+};
+
+{{exported}}v8::Local<v8::Value> toV8(const {{cpp_class}}&, v8::Local<v8::Object>, v8::Isolate*);
+
+template <class CallbackInfo>
+inline void v8SetReturnValue(const CallbackInfo& callbackInfo, {{cpp_class}}& impl)
+{
+    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
+}
+
+template <>
+struct NativeValueTraits<{{cpp_class}}> {
+    {{exported}}static {{cpp_class}} nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
+};
+
+} // namespace blink
+
+// We need to set canInitializeWithMemset=true because HeapVector supports
+// items that can initialize with memset or have a vtable. It is safe to
+// set canInitializeWithMemset=true for a union type object in practice.
+// See https://codereview.chromium.org/1118993002/#msg5 for more details.
+WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::{{cpp_class}});
+
+#endif // {{cpp_class}}_h
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/ArrayBufferOrArrayBufferViewOrDictionary.cpp b/third_party/WebKit/Source/bindings/tests/results/core/ArrayBufferOrArrayBufferViewOrDictionary.cpp
new file mode 100644
index 0000000..3d246c4
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/tests/results/core/ArrayBufferOrArrayBufferViewOrDictionary.cpp
@@ -0,0 +1,147 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
+
+#include "ArrayBufferOrArrayBufferViewOrDictionary.h"
+
+#include "bindings/core/v8/Dictionary.h"
+#include "bindings/core/v8/ToV8.h"
+#include "bindings/core/v8/V8ArrayBuffer.h"
+#include "bindings/core/v8/V8ArrayBufferView.h"
+#include "core/dom/FlexibleArrayBufferView.h"
+
+namespace blink {
+
+ArrayBufferOrArrayBufferViewOrDictionary::ArrayBufferOrArrayBufferViewOrDictionary()
+    : m_type(SpecificTypeNone)
+{
+}
+
+TestArrayBuffer* ArrayBufferOrArrayBufferViewOrDictionary::getAsArrayBuffer() const
+{
+    ASSERT(isArrayBuffer());
+    return m_arrayBuffer;
+}
+
+void ArrayBufferOrArrayBufferViewOrDictionary::setArrayBuffer(TestArrayBuffer* value)
+{
+    ASSERT(isNull());
+    m_arrayBuffer = value;
+    m_type = SpecificTypeArrayBuffer;
+}
+
+ArrayBufferOrArrayBufferViewOrDictionary ArrayBufferOrArrayBufferViewOrDictionary::fromArrayBuffer(TestArrayBuffer* value)
+{
+    ArrayBufferOrArrayBufferViewOrDictionary container;
+    container.setArrayBuffer(value);
+    return container;
+}
+
+TestArrayBufferView* ArrayBufferOrArrayBufferViewOrDictionary::getAsArrayBufferView() const
+{
+    ASSERT(isArrayBufferView());
+    return m_arrayBufferView;
+}
+
+void ArrayBufferOrArrayBufferViewOrDictionary::setArrayBufferView(TestArrayBufferView* value)
+{
+    ASSERT(isNull());
+    m_arrayBufferView = value;
+    m_type = SpecificTypeArrayBufferView;
+}
+
+ArrayBufferOrArrayBufferViewOrDictionary ArrayBufferOrArrayBufferViewOrDictionary::fromArrayBufferView(TestArrayBufferView* value)
+{
+    ArrayBufferOrArrayBufferViewOrDictionary container;
+    container.setArrayBufferView(value);
+    return container;
+}
+
+Dictionary ArrayBufferOrArrayBufferViewOrDictionary::getAsDictionary() const
+{
+    ASSERT(isDictionary());
+    return m_dictionary;
+}
+
+void ArrayBufferOrArrayBufferViewOrDictionary::setDictionary(Dictionary value)
+{
+    ASSERT(isNull());
+    m_dictionary = value;
+    m_type = SpecificTypeDictionary;
+}
+
+ArrayBufferOrArrayBufferViewOrDictionary ArrayBufferOrArrayBufferViewOrDictionary::fromDictionary(Dictionary value)
+{
+    ArrayBufferOrArrayBufferViewOrDictionary container;
+    container.setDictionary(value);
+    return container;
+}
+
+ArrayBufferOrArrayBufferViewOrDictionary::ArrayBufferOrArrayBufferViewOrDictionary(const ArrayBufferOrArrayBufferViewOrDictionary&) = default;
+ArrayBufferOrArrayBufferViewOrDictionary::~ArrayBufferOrArrayBufferViewOrDictionary() = default;
+ArrayBufferOrArrayBufferViewOrDictionary& ArrayBufferOrArrayBufferViewOrDictionary::operator=(const ArrayBufferOrArrayBufferViewOrDictionary&) = default;
+
+DEFINE_TRACE(ArrayBufferOrArrayBufferViewOrDictionary)
+{
+    visitor->trace(m_arrayBuffer);
+    visitor->trace(m_arrayBufferView);
+}
+
+void V8ArrayBufferOrArrayBufferViewOrDictionary::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, ArrayBufferOrArrayBufferViewOrDictionary& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
+{
+    if (v8Value.IsEmpty())
+        return;
+
+    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
+        return;
+
+    if (V8ArrayBuffer::hasInstance(v8Value, isolate)) {
+        TestArrayBuffer* cppValue = V8ArrayBuffer::toImpl(v8::Local<v8::Object>::Cast(v8Value));
+        impl.setArrayBuffer(cppValue);
+        return;
+    }
+
+    if (V8ArrayBufferView::hasInstance(v8Value, isolate)) {
+        TestArrayBufferView* cppValue = V8ArrayBufferView::toImpl(v8::Local<v8::Object>::Cast(v8Value));
+        impl.setArrayBufferView(cppValue);
+        return;
+    }
+
+    if (isUndefinedOrNull(v8Value) || v8Value->IsObject()) {
+        Dictionary cppValue = Dictionary(v8Value, isolate, exceptionState);
+        if (exceptionState.hadException())
+            return;
+        impl.setDictionary(cppValue);
+        return;
+    }
+
+    exceptionState.throwTypeError("The provided value is not of type '(ArrayBuffer or ArrayBufferView or Dictionary)'");
+}
+
+v8::Local<v8::Value> toV8(const ArrayBufferOrArrayBufferViewOrDictionary& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
+{
+    switch (impl.m_type) {
+    case ArrayBufferOrArrayBufferViewOrDictionary::SpecificTypeNone:
+        return v8::Null(isolate);
+    case ArrayBufferOrArrayBufferViewOrDictionary::SpecificTypeArrayBuffer:
+        return toV8(impl.getAsArrayBuffer(), creationContext, isolate);
+    case ArrayBufferOrArrayBufferViewOrDictionary::SpecificTypeArrayBufferView:
+        return toV8(impl.getAsArrayBufferView(), creationContext, isolate);
+    case ArrayBufferOrArrayBufferViewOrDictionary::SpecificTypeDictionary:
+        return impl.getAsDictionary().v8Value();
+    default:
+        ASSERT_NOT_REACHED();
+    }
+    return v8::Local<v8::Value>();
+}
+
+ArrayBufferOrArrayBufferViewOrDictionary NativeValueTraits<ArrayBufferOrArrayBufferViewOrDictionary>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
+{
+    ArrayBufferOrArrayBufferViewOrDictionary impl;
+    V8ArrayBufferOrArrayBufferViewOrDictionary::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
+    return impl;
+}
+
+} // namespace blink
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/ArrayBufferOrArrayBufferViewOrDictionary.h b/third_party/WebKit/Source/bindings/tests/results/core/ArrayBufferOrArrayBufferViewOrDictionary.h
new file mode 100644
index 0000000..a0d90108
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/tests/results/core/ArrayBufferOrArrayBufferViewOrDictionary.h
@@ -0,0 +1,89 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
+
+#ifndef ArrayBufferOrArrayBufferViewOrDictionary_h
+#define ArrayBufferOrArrayBufferViewOrDictionary_h
+
+#include "bindings/core/v8/Dictionary.h"
+#include "bindings/core/v8/ExceptionState.h"
+#include "bindings/core/v8/V8Binding.h"
+#include "core/CoreExport.h"
+#include "platform/heap/Handle.h"
+
+namespace blink {
+
+class TestArrayBuffer;
+class TestArrayBufferView;
+
+class CORE_EXPORT ArrayBufferOrArrayBufferViewOrDictionary final {
+    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
+public:
+    ArrayBufferOrArrayBufferViewOrDictionary();
+    bool isNull() const { return m_type == SpecificTypeNone; }
+
+    bool isArrayBuffer() const { return m_type == SpecificTypeArrayBuffer; }
+    TestArrayBuffer* getAsArrayBuffer() const;
+    void setArrayBuffer(TestArrayBuffer*);
+    static ArrayBufferOrArrayBufferViewOrDictionary fromArrayBuffer(TestArrayBuffer*);
+
+    bool isArrayBufferView() const { return m_type == SpecificTypeArrayBufferView; }
+    TestArrayBufferView* getAsArrayBufferView() const;
+    void setArrayBufferView(TestArrayBufferView*);
+    static ArrayBufferOrArrayBufferViewOrDictionary fromArrayBufferView(TestArrayBufferView*);
+
+    bool isDictionary() const { return m_type == SpecificTypeDictionary; }
+    Dictionary getAsDictionary() const;
+    void setDictionary(Dictionary);
+    static ArrayBufferOrArrayBufferViewOrDictionary fromDictionary(Dictionary);
+
+    ArrayBufferOrArrayBufferViewOrDictionary(const ArrayBufferOrArrayBufferViewOrDictionary&);
+    ~ArrayBufferOrArrayBufferViewOrDictionary();
+    ArrayBufferOrArrayBufferViewOrDictionary& operator=(const ArrayBufferOrArrayBufferViewOrDictionary&);
+    DECLARE_TRACE();
+
+private:
+    enum SpecificTypes {
+        SpecificTypeNone,
+        SpecificTypeArrayBuffer,
+        SpecificTypeArrayBufferView,
+        SpecificTypeDictionary,
+    };
+    SpecificTypes m_type;
+
+    Member<TestArrayBuffer> m_arrayBuffer;
+    Member<TestArrayBufferView> m_arrayBufferView;
+    Dictionary m_dictionary;
+
+    friend CORE_EXPORT v8::Local<v8::Value> toV8(const ArrayBufferOrArrayBufferViewOrDictionary&, v8::Local<v8::Object>, v8::Isolate*);
+};
+
+class V8ArrayBufferOrArrayBufferViewOrDictionary final {
+public:
+    CORE_EXPORT static void toImpl(v8::Isolate*, v8::Local<v8::Value>, ArrayBufferOrArrayBufferViewOrDictionary&, UnionTypeConversionMode, ExceptionState&);
+};
+
+CORE_EXPORT v8::Local<v8::Value> toV8(const ArrayBufferOrArrayBufferViewOrDictionary&, v8::Local<v8::Object>, v8::Isolate*);
+
+template <class CallbackInfo>
+inline void v8SetReturnValue(const CallbackInfo& callbackInfo, ArrayBufferOrArrayBufferViewOrDictionary& impl)
+{
+    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
+}
+
+template <>
+struct NativeValueTraits<ArrayBufferOrArrayBufferViewOrDictionary> {
+    CORE_EXPORT static ArrayBufferOrArrayBufferViewOrDictionary nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
+};
+
+} // namespace blink
+
+// We need to set canInitializeWithMemset=true because HeapVector supports
+// items that can initialize with memset or have a vtable. It is safe to
+// set canInitializeWithMemset=true for a union type object in practice.
+// See https://codereview.chromium.org/1118993002/#msg5 for more details.
+WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::ArrayBufferOrArrayBufferViewOrDictionary);
+
+#endif // ArrayBufferOrArrayBufferViewOrDictionary_h
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/BooleanOrStringOrUnrestrictedDouble.cpp b/third_party/WebKit/Source/bindings/tests/results/core/BooleanOrStringOrUnrestrictedDouble.cpp
new file mode 100644
index 0000000..c760904
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/tests/results/core/BooleanOrStringOrUnrestrictedDouble.cpp
@@ -0,0 +1,141 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
+
+#include "BooleanOrStringOrUnrestrictedDouble.h"
+
+#include "bindings/core/v8/ToV8.h"
+
+namespace blink {
+
+BooleanOrStringOrUnrestrictedDouble::BooleanOrStringOrUnrestrictedDouble()
+    : m_type(SpecificTypeNone)
+{
+}
+
+bool BooleanOrStringOrUnrestrictedDouble::getAsBoolean() const
+{
+    ASSERT(isBoolean());
+    return m_boolean;
+}
+
+void BooleanOrStringOrUnrestrictedDouble::setBoolean(bool value)
+{
+    ASSERT(isNull());
+    m_boolean = value;
+    m_type = SpecificTypeBoolean;
+}
+
+BooleanOrStringOrUnrestrictedDouble BooleanOrStringOrUnrestrictedDouble::fromBoolean(bool value)
+{
+    BooleanOrStringOrUnrestrictedDouble container;
+    container.setBoolean(value);
+    return container;
+}
+
+String BooleanOrStringOrUnrestrictedDouble::getAsString() const
+{
+    ASSERT(isString());
+    return m_string;
+}
+
+void BooleanOrStringOrUnrestrictedDouble::setString(String value)
+{
+    ASSERT(isNull());
+    m_string = value;
+    m_type = SpecificTypeString;
+}
+
+BooleanOrStringOrUnrestrictedDouble BooleanOrStringOrUnrestrictedDouble::fromString(String value)
+{
+    BooleanOrStringOrUnrestrictedDouble container;
+    container.setString(value);
+    return container;
+}
+
+double BooleanOrStringOrUnrestrictedDouble::getAsUnrestrictedDouble() const
+{
+    ASSERT(isUnrestrictedDouble());
+    return m_unrestrictedDouble;
+}
+
+void BooleanOrStringOrUnrestrictedDouble::setUnrestrictedDouble(double value)
+{
+    ASSERT(isNull());
+    m_unrestrictedDouble = value;
+    m_type = SpecificTypeUnrestrictedDouble;
+}
+
+BooleanOrStringOrUnrestrictedDouble BooleanOrStringOrUnrestrictedDouble::fromUnrestrictedDouble(double value)
+{
+    BooleanOrStringOrUnrestrictedDouble container;
+    container.setUnrestrictedDouble(value);
+    return container;
+}
+
+BooleanOrStringOrUnrestrictedDouble::BooleanOrStringOrUnrestrictedDouble(const BooleanOrStringOrUnrestrictedDouble&) = default;
+BooleanOrStringOrUnrestrictedDouble::~BooleanOrStringOrUnrestrictedDouble() = default;
+BooleanOrStringOrUnrestrictedDouble& BooleanOrStringOrUnrestrictedDouble::operator=(const BooleanOrStringOrUnrestrictedDouble&) = default;
+
+DEFINE_TRACE(BooleanOrStringOrUnrestrictedDouble)
+{
+}
+
+void V8BooleanOrStringOrUnrestrictedDouble::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, BooleanOrStringOrUnrestrictedDouble& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
+{
+    if (v8Value.IsEmpty())
+        return;
+
+    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
+        return;
+
+    if (v8Value->IsBoolean()) {
+        impl.setBoolean(v8Value.As<v8::Boolean>()->Value());
+        return;
+    }
+
+    if (v8Value->IsNumber()) {
+        double cppValue = toDouble(isolate, v8Value, exceptionState);
+        if (exceptionState.hadException())
+            return;
+        impl.setUnrestrictedDouble(cppValue);
+        return;
+    }
+
+    {
+        V8StringResource<> cppValue = v8Value;
+        if (!cppValue.prepare(exceptionState))
+            return;
+        impl.setString(cppValue);
+        return;
+    }
+
+}
+
+v8::Local<v8::Value> toV8(const BooleanOrStringOrUnrestrictedDouble& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
+{
+    switch (impl.m_type) {
+    case BooleanOrStringOrUnrestrictedDouble::SpecificTypeNone:
+        return v8::Null(isolate);
+    case BooleanOrStringOrUnrestrictedDouble::SpecificTypeBoolean:
+        return v8Boolean(impl.getAsBoolean(), isolate);
+    case BooleanOrStringOrUnrestrictedDouble::SpecificTypeString:
+        return v8String(isolate, impl.getAsString());
+    case BooleanOrStringOrUnrestrictedDouble::SpecificTypeUnrestrictedDouble:
+        return v8::Number::New(isolate, impl.getAsUnrestrictedDouble());
+    default:
+        ASSERT_NOT_REACHED();
+    }
+    return v8::Local<v8::Value>();
+}
+
+BooleanOrStringOrUnrestrictedDouble NativeValueTraits<BooleanOrStringOrUnrestrictedDouble>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
+{
+    BooleanOrStringOrUnrestrictedDouble impl;
+    V8BooleanOrStringOrUnrestrictedDouble::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
+    return impl;
+}
+
+} // namespace blink
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/BooleanOrStringOrUnrestrictedDouble.h b/third_party/WebKit/Source/bindings/tests/results/core/BooleanOrStringOrUnrestrictedDouble.h
new file mode 100644
index 0000000..554827e
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/tests/results/core/BooleanOrStringOrUnrestrictedDouble.h
@@ -0,0 +1,87 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
+
+#ifndef BooleanOrStringOrUnrestrictedDouble_h
+#define BooleanOrStringOrUnrestrictedDouble_h
+
+#include "bindings/core/v8/Dictionary.h"
+#include "bindings/core/v8/ExceptionState.h"
+#include "bindings/core/v8/V8Binding.h"
+#include "core/CoreExport.h"
+#include "platform/heap/Handle.h"
+
+namespace blink {
+
+
+class CORE_EXPORT BooleanOrStringOrUnrestrictedDouble final {
+    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
+public:
+    BooleanOrStringOrUnrestrictedDouble();
+    bool isNull() const { return m_type == SpecificTypeNone; }
+
+    bool isBoolean() const { return m_type == SpecificTypeBoolean; }
+    bool getAsBoolean() const;
+    void setBoolean(bool);
+    static BooleanOrStringOrUnrestrictedDouble fromBoolean(bool);
+
+    bool isString() const { return m_type == SpecificTypeString; }
+    String getAsString() const;
+    void setString(String);
+    static BooleanOrStringOrUnrestrictedDouble fromString(String);
+
+    bool isUnrestrictedDouble() const { return m_type == SpecificTypeUnrestrictedDouble; }
+    double getAsUnrestrictedDouble() const;
+    void setUnrestrictedDouble(double);
+    static BooleanOrStringOrUnrestrictedDouble fromUnrestrictedDouble(double);
+
+    BooleanOrStringOrUnrestrictedDouble(const BooleanOrStringOrUnrestrictedDouble&);
+    ~BooleanOrStringOrUnrestrictedDouble();
+    BooleanOrStringOrUnrestrictedDouble& operator=(const BooleanOrStringOrUnrestrictedDouble&);
+    DECLARE_TRACE();
+
+private:
+    enum SpecificTypes {
+        SpecificTypeNone,
+        SpecificTypeBoolean,
+        SpecificTypeString,
+        SpecificTypeUnrestrictedDouble,
+    };
+    SpecificTypes m_type;
+
+    bool m_boolean;
+    String m_string;
+    double m_unrestrictedDouble;
+
+    friend CORE_EXPORT v8::Local<v8::Value> toV8(const BooleanOrStringOrUnrestrictedDouble&, v8::Local<v8::Object>, v8::Isolate*);
+};
+
+class V8BooleanOrStringOrUnrestrictedDouble final {
+public:
+    CORE_EXPORT static void toImpl(v8::Isolate*, v8::Local<v8::Value>, BooleanOrStringOrUnrestrictedDouble&, UnionTypeConversionMode, ExceptionState&);
+};
+
+CORE_EXPORT v8::Local<v8::Value> toV8(const BooleanOrStringOrUnrestrictedDouble&, v8::Local<v8::Object>, v8::Isolate*);
+
+template <class CallbackInfo>
+inline void v8SetReturnValue(const CallbackInfo& callbackInfo, BooleanOrStringOrUnrestrictedDouble& impl)
+{
+    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
+}
+
+template <>
+struct NativeValueTraits<BooleanOrStringOrUnrestrictedDouble> {
+    CORE_EXPORT static BooleanOrStringOrUnrestrictedDouble nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
+};
+
+} // namespace blink
+
+// We need to set canInitializeWithMemset=true because HeapVector supports
+// items that can initialize with memset or have a vtable. It is safe to
+// set canInitializeWithMemset=true for a union type object in practice.
+// See https://codereview.chromium.org/1118993002/#msg5 for more details.
+WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::BooleanOrStringOrUnrestrictedDouble);
+
+#endif // BooleanOrStringOrUnrestrictedDouble_h
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/DoubleOrString.cpp b/third_party/WebKit/Source/bindings/tests/results/core/DoubleOrString.cpp
new file mode 100644
index 0000000..ef48b5b
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/tests/results/core/DoubleOrString.cpp
@@ -0,0 +1,114 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
+
+#include "DoubleOrString.h"
+
+#include "bindings/core/v8/ToV8.h"
+
+namespace blink {
+
+DoubleOrString::DoubleOrString()
+    : m_type(SpecificTypeNone)
+{
+}
+
+double DoubleOrString::getAsDouble() const
+{
+    ASSERT(isDouble());
+    return m_double;
+}
+
+void DoubleOrString::setDouble(double value)
+{
+    ASSERT(isNull());
+    m_double = value;
+    m_type = SpecificTypeDouble;
+}
+
+DoubleOrString DoubleOrString::fromDouble(double value)
+{
+    DoubleOrString container;
+    container.setDouble(value);
+    return container;
+}
+
+String DoubleOrString::getAsString() const
+{
+    ASSERT(isString());
+    return m_string;
+}
+
+void DoubleOrString::setString(String value)
+{
+    ASSERT(isNull());
+    m_string = value;
+    m_type = SpecificTypeString;
+}
+
+DoubleOrString DoubleOrString::fromString(String value)
+{
+    DoubleOrString container;
+    container.setString(value);
+    return container;
+}
+
+DoubleOrString::DoubleOrString(const DoubleOrString&) = default;
+DoubleOrString::~DoubleOrString() = default;
+DoubleOrString& DoubleOrString::operator=(const DoubleOrString&) = default;
+
+DEFINE_TRACE(DoubleOrString)
+{
+}
+
+void V8DoubleOrString::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, DoubleOrString& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
+{
+    if (v8Value.IsEmpty())
+        return;
+
+    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
+        return;
+
+    if (v8Value->IsNumber()) {
+        double cppValue = toRestrictedDouble(isolate, v8Value, exceptionState);
+        if (exceptionState.hadException())
+            return;
+        impl.setDouble(cppValue);
+        return;
+    }
+
+    {
+        V8StringResource<> cppValue = v8Value;
+        if (!cppValue.prepare(exceptionState))
+            return;
+        impl.setString(cppValue);
+        return;
+    }
+
+}
+
+v8::Local<v8::Value> toV8(const DoubleOrString& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
+{
+    switch (impl.m_type) {
+    case DoubleOrString::SpecificTypeNone:
+        return v8::Null(isolate);
+    case DoubleOrString::SpecificTypeDouble:
+        return v8::Number::New(isolate, impl.getAsDouble());
+    case DoubleOrString::SpecificTypeString:
+        return v8String(isolate, impl.getAsString());
+    default:
+        ASSERT_NOT_REACHED();
+    }
+    return v8::Local<v8::Value>();
+}
+
+DoubleOrString NativeValueTraits<DoubleOrString>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
+{
+    DoubleOrString impl;
+    V8DoubleOrString::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
+    return impl;
+}
+
+} // namespace blink
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/DoubleOrString.h b/third_party/WebKit/Source/bindings/tests/results/core/DoubleOrString.h
new file mode 100644
index 0000000..5412c36f
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/tests/results/core/DoubleOrString.h
@@ -0,0 +1,80 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
+
+#ifndef DoubleOrString_h
+#define DoubleOrString_h
+
+#include "bindings/core/v8/Dictionary.h"
+#include "bindings/core/v8/ExceptionState.h"
+#include "bindings/core/v8/V8Binding.h"
+#include "core/CoreExport.h"
+#include "platform/heap/Handle.h"
+
+namespace blink {
+
+
+class CORE_EXPORT DoubleOrString final {
+    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
+public:
+    DoubleOrString();
+    bool isNull() const { return m_type == SpecificTypeNone; }
+
+    bool isDouble() const { return m_type == SpecificTypeDouble; }
+    double getAsDouble() const;
+    void setDouble(double);
+    static DoubleOrString fromDouble(double);
+
+    bool isString() const { return m_type == SpecificTypeString; }
+    String getAsString() const;
+    void setString(String);
+    static DoubleOrString fromString(String);
+
+    DoubleOrString(const DoubleOrString&);
+    ~DoubleOrString();
+    DoubleOrString& operator=(const DoubleOrString&);
+    DECLARE_TRACE();
+
+private:
+    enum SpecificTypes {
+        SpecificTypeNone,
+        SpecificTypeDouble,
+        SpecificTypeString,
+    };
+    SpecificTypes m_type;
+
+    double m_double;
+    String m_string;
+
+    friend CORE_EXPORT v8::Local<v8::Value> toV8(const DoubleOrString&, v8::Local<v8::Object>, v8::Isolate*);
+};
+
+class V8DoubleOrString final {
+public:
+    CORE_EXPORT static void toImpl(v8::Isolate*, v8::Local<v8::Value>, DoubleOrString&, UnionTypeConversionMode, ExceptionState&);
+};
+
+CORE_EXPORT v8::Local<v8::Value> toV8(const DoubleOrString&, v8::Local<v8::Object>, v8::Isolate*);
+
+template <class CallbackInfo>
+inline void v8SetReturnValue(const CallbackInfo& callbackInfo, DoubleOrString& impl)
+{
+    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
+}
+
+template <>
+struct NativeValueTraits<DoubleOrString> {
+    CORE_EXPORT static DoubleOrString nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
+};
+
+} // namespace blink
+
+// We need to set canInitializeWithMemset=true because HeapVector supports
+// items that can initialize with memset or have a vtable. It is safe to
+// set canInitializeWithMemset=true for a union type object in practice.
+// See https://codereview.chromium.org/1118993002/#msg5 for more details.
+WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::DoubleOrString);
+
+#endif // DoubleOrString_h
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/LongOrTestDictionary.cpp b/third_party/WebKit/Source/bindings/tests/results/core/LongOrTestDictionary.cpp
new file mode 100644
index 0000000..164ef81
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/tests/results/core/LongOrTestDictionary.cpp
@@ -0,0 +1,126 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
+
+#include "LongOrTestDictionary.h"
+
+#include "bindings/core/v8/DoubleOrString.h"
+#include "bindings/core/v8/TestInterface2OrUint8Array.h"
+#include "bindings/core/v8/ToV8.h"
+
+namespace blink {
+
+LongOrTestDictionary::LongOrTestDictionary()
+    : m_type(SpecificTypeNone)
+{
+}
+
+int LongOrTestDictionary::getAsLong() const
+{
+    ASSERT(isLong());
+    return m_long;
+}
+
+void LongOrTestDictionary::setLong(int value)
+{
+    ASSERT(isNull());
+    m_long = value;
+    m_type = SpecificTypeLong;
+}
+
+LongOrTestDictionary LongOrTestDictionary::fromLong(int value)
+{
+    LongOrTestDictionary container;
+    container.setLong(value);
+    return container;
+}
+
+TestDictionary LongOrTestDictionary::getAsTestDictionary() const
+{
+    ASSERT(isTestDictionary());
+    return m_testDictionary;
+}
+
+void LongOrTestDictionary::setTestDictionary(TestDictionary value)
+{
+    ASSERT(isNull());
+    m_testDictionary = value;
+    m_type = SpecificTypeTestDictionary;
+}
+
+LongOrTestDictionary LongOrTestDictionary::fromTestDictionary(TestDictionary value)
+{
+    LongOrTestDictionary container;
+    container.setTestDictionary(value);
+    return container;
+}
+
+LongOrTestDictionary::LongOrTestDictionary(const LongOrTestDictionary&) = default;
+LongOrTestDictionary::~LongOrTestDictionary() = default;
+LongOrTestDictionary& LongOrTestDictionary::operator=(const LongOrTestDictionary&) = default;
+
+DEFINE_TRACE(LongOrTestDictionary)
+{
+    visitor->trace(m_testDictionary);
+}
+
+void V8LongOrTestDictionary::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, LongOrTestDictionary& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
+{
+    if (v8Value.IsEmpty())
+        return;
+
+    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
+        return;
+
+    if (isUndefinedOrNull(v8Value) || v8Value->IsObject()) {
+        TestDictionary cppValue;
+        V8TestDictionary::toImpl(isolate, v8Value, cppValue, exceptionState);
+        if (exceptionState.hadException())
+            return;
+        impl.setTestDictionary(cppValue);
+        return;
+    }
+
+    if (v8Value->IsNumber()) {
+        int cppValue = toInt32(isolate, v8Value, NormalConversion, exceptionState);
+        if (exceptionState.hadException())
+            return;
+        impl.setLong(cppValue);
+        return;
+    }
+
+    {
+        int cppValue = toInt32(isolate, v8Value, NormalConversion, exceptionState);
+        if (exceptionState.hadException())
+            return;
+        impl.setLong(cppValue);
+        return;
+    }
+
+}
+
+v8::Local<v8::Value> toV8(const LongOrTestDictionary& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
+{
+    switch (impl.m_type) {
+    case LongOrTestDictionary::SpecificTypeNone:
+        return v8::Null(isolate);
+    case LongOrTestDictionary::SpecificTypeLong:
+        return v8::Integer::New(isolate, impl.getAsLong());
+    case LongOrTestDictionary::SpecificTypeTestDictionary:
+        return toV8(impl.getAsTestDictionary(), creationContext, isolate);
+    default:
+        ASSERT_NOT_REACHED();
+    }
+    return v8::Local<v8::Value>();
+}
+
+LongOrTestDictionary NativeValueTraits<LongOrTestDictionary>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
+{
+    LongOrTestDictionary impl;
+    V8LongOrTestDictionary::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
+    return impl;
+}
+
+} // namespace blink
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/LongOrTestDictionary.h b/third_party/WebKit/Source/bindings/tests/results/core/LongOrTestDictionary.h
new file mode 100644
index 0000000..a359371c
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/tests/results/core/LongOrTestDictionary.h
@@ -0,0 +1,81 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
+
+#ifndef LongOrTestDictionary_h
+#define LongOrTestDictionary_h
+
+#include "bindings/core/v8/Dictionary.h"
+#include "bindings/core/v8/ExceptionState.h"
+#include "bindings/core/v8/V8Binding.h"
+#include "bindings/core/v8/V8TestDictionary.h"
+#include "core/CoreExport.h"
+#include "platform/heap/Handle.h"
+
+namespace blink {
+
+
+class CORE_EXPORT LongOrTestDictionary final {
+    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
+public:
+    LongOrTestDictionary();
+    bool isNull() const { return m_type == SpecificTypeNone; }
+
+    bool isLong() const { return m_type == SpecificTypeLong; }
+    int getAsLong() const;
+    void setLong(int);
+    static LongOrTestDictionary fromLong(int);
+
+    bool isTestDictionary() const { return m_type == SpecificTypeTestDictionary; }
+    TestDictionary getAsTestDictionary() const;
+    void setTestDictionary(TestDictionary);
+    static LongOrTestDictionary fromTestDictionary(TestDictionary);
+
+    LongOrTestDictionary(const LongOrTestDictionary&);
+    ~LongOrTestDictionary();
+    LongOrTestDictionary& operator=(const LongOrTestDictionary&);
+    DECLARE_TRACE();
+
+private:
+    enum SpecificTypes {
+        SpecificTypeNone,
+        SpecificTypeLong,
+        SpecificTypeTestDictionary,
+    };
+    SpecificTypes m_type;
+
+    int m_long;
+    TestDictionary m_testDictionary;
+
+    friend CORE_EXPORT v8::Local<v8::Value> toV8(const LongOrTestDictionary&, v8::Local<v8::Object>, v8::Isolate*);
+};
+
+class V8LongOrTestDictionary final {
+public:
+    CORE_EXPORT static void toImpl(v8::Isolate*, v8::Local<v8::Value>, LongOrTestDictionary&, UnionTypeConversionMode, ExceptionState&);
+};
+
+CORE_EXPORT v8::Local<v8::Value> toV8(const LongOrTestDictionary&, v8::Local<v8::Object>, v8::Isolate*);
+
+template <class CallbackInfo>
+inline void v8SetReturnValue(const CallbackInfo& callbackInfo, LongOrTestDictionary& impl)
+{
+    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
+}
+
+template <>
+struct NativeValueTraits<LongOrTestDictionary> {
+    CORE_EXPORT static LongOrTestDictionary nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
+};
+
+} // namespace blink
+
+// We need to set canInitializeWithMemset=true because HeapVector supports
+// items that can initialize with memset or have a vtable. It is safe to
+// set canInitializeWithMemset=true for a union type object in practice.
+// See https://codereview.chromium.org/1118993002/#msg5 for more details.
+WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::LongOrTestDictionary);
+
+#endif // LongOrTestDictionary_h
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/NodeOrNodeList.cpp b/third_party/WebKit/Source/bindings/tests/results/core/NodeOrNodeList.cpp
new file mode 100644
index 0000000..4706beb7
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/tests/results/core/NodeOrNodeList.cpp
@@ -0,0 +1,119 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
+
+#include "NodeOrNodeList.h"
+
+#include "bindings/core/v8/ToV8.h"
+#include "bindings/core/v8/V8Node.h"
+#include "bindings/core/v8/V8NodeList.h"
+#include "core/dom/NameNodeList.h"
+#include "core/dom/NodeList.h"
+#include "core/dom/StaticNodeList.h"
+#include "core/html/LabelsNodeList.h"
+
+namespace blink {
+
+NodeOrNodeList::NodeOrNodeList()
+    : m_type(SpecificTypeNone)
+{
+}
+
+Node* NodeOrNodeList::getAsNode() const
+{
+    ASSERT(isNode());
+    return m_node;
+}
+
+void NodeOrNodeList::setNode(Node* value)
+{
+    ASSERT(isNull());
+    m_node = value;
+    m_type = SpecificTypeNode;
+}
+
+NodeOrNodeList NodeOrNodeList::fromNode(Node* value)
+{
+    NodeOrNodeList container;
+    container.setNode(value);
+    return container;
+}
+
+NodeList* NodeOrNodeList::getAsNodeList() const
+{
+    ASSERT(isNodeList());
+    return m_nodeList;
+}
+
+void NodeOrNodeList::setNodeList(NodeList* value)
+{
+    ASSERT(isNull());
+    m_nodeList = value;
+    m_type = SpecificTypeNodeList;
+}
+
+NodeOrNodeList NodeOrNodeList::fromNodeList(NodeList* value)
+{
+    NodeOrNodeList container;
+    container.setNodeList(value);
+    return container;
+}
+
+NodeOrNodeList::NodeOrNodeList(const NodeOrNodeList&) = default;
+NodeOrNodeList::~NodeOrNodeList() = default;
+NodeOrNodeList& NodeOrNodeList::operator=(const NodeOrNodeList&) = default;
+
+DEFINE_TRACE(NodeOrNodeList)
+{
+    visitor->trace(m_node);
+    visitor->trace(m_nodeList);
+}
+
+void V8NodeOrNodeList::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, NodeOrNodeList& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
+{
+    if (v8Value.IsEmpty())
+        return;
+
+    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
+        return;
+
+    if (V8Node::hasInstance(v8Value, isolate)) {
+        Node* cppValue = V8Node::toImpl(v8::Local<v8::Object>::Cast(v8Value));
+        impl.setNode(cppValue);
+        return;
+    }
+
+    if (V8NodeList::hasInstance(v8Value, isolate)) {
+        NodeList* cppValue = V8NodeList::toImpl(v8::Local<v8::Object>::Cast(v8Value));
+        impl.setNodeList(cppValue);
+        return;
+    }
+
+    exceptionState.throwTypeError("The provided value is not of type '(Node or NodeList)'");
+}
+
+v8::Local<v8::Value> toV8(const NodeOrNodeList& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
+{
+    switch (impl.m_type) {
+    case NodeOrNodeList::SpecificTypeNone:
+        return v8::Null(isolate);
+    case NodeOrNodeList::SpecificTypeNode:
+        return toV8(impl.getAsNode(), creationContext, isolate);
+    case NodeOrNodeList::SpecificTypeNodeList:
+        return toV8(impl.getAsNodeList(), creationContext, isolate);
+    default:
+        ASSERT_NOT_REACHED();
+    }
+    return v8::Local<v8::Value>();
+}
+
+NodeOrNodeList NativeValueTraits<NodeOrNodeList>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
+{
+    NodeOrNodeList impl;
+    V8NodeOrNodeList::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
+    return impl;
+}
+
+} // namespace blink
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/NodeOrNodeList.h b/third_party/WebKit/Source/bindings/tests/results/core/NodeOrNodeList.h
new file mode 100644
index 0000000..2dbfbed
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/tests/results/core/NodeOrNodeList.h
@@ -0,0 +1,82 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
+
+#ifndef NodeOrNodeList_h
+#define NodeOrNodeList_h
+
+#include "bindings/core/v8/Dictionary.h"
+#include "bindings/core/v8/ExceptionState.h"
+#include "bindings/core/v8/V8Binding.h"
+#include "core/CoreExport.h"
+#include "platform/heap/Handle.h"
+
+namespace blink {
+
+class Node;
+class NodeList;
+
+class CORE_EXPORT NodeOrNodeList final {
+    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
+public:
+    NodeOrNodeList();
+    bool isNull() const { return m_type == SpecificTypeNone; }
+
+    bool isNode() const { return m_type == SpecificTypeNode; }
+    Node* getAsNode() const;
+    void setNode(Node*);
+    static NodeOrNodeList fromNode(Node*);
+
+    bool isNodeList() const { return m_type == SpecificTypeNodeList; }
+    NodeList* getAsNodeList() const;
+    void setNodeList(NodeList*);
+    static NodeOrNodeList fromNodeList(NodeList*);
+
+    NodeOrNodeList(const NodeOrNodeList&);
+    ~NodeOrNodeList();
+    NodeOrNodeList& operator=(const NodeOrNodeList&);
+    DECLARE_TRACE();
+
+private:
+    enum SpecificTypes {
+        SpecificTypeNone,
+        SpecificTypeNode,
+        SpecificTypeNodeList,
+    };
+    SpecificTypes m_type;
+
+    Member<Node> m_node;
+    Member<NodeList> m_nodeList;
+
+    friend CORE_EXPORT v8::Local<v8::Value> toV8(const NodeOrNodeList&, v8::Local<v8::Object>, v8::Isolate*);
+};
+
+class V8NodeOrNodeList final {
+public:
+    CORE_EXPORT static void toImpl(v8::Isolate*, v8::Local<v8::Value>, NodeOrNodeList&, UnionTypeConversionMode, ExceptionState&);
+};
+
+CORE_EXPORT v8::Local<v8::Value> toV8(const NodeOrNodeList&, v8::Local<v8::Object>, v8::Isolate*);
+
+template <class CallbackInfo>
+inline void v8SetReturnValue(const CallbackInfo& callbackInfo, NodeOrNodeList& impl)
+{
+    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
+}
+
+template <>
+struct NativeValueTraits<NodeOrNodeList> {
+    CORE_EXPORT static NodeOrNodeList nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
+};
+
+} // namespace blink
+
+// We need to set canInitializeWithMemset=true because HeapVector supports
+// items that can initialize with memset or have a vtable. It is safe to
+// set canInitializeWithMemset=true for a union type object in practice.
+// See https://codereview.chromium.org/1118993002/#msg5 for more details.
+WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::NodeOrNodeList);
+
+#endif // NodeOrNodeList_h
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/StringOrArrayBufferOrArrayBufferView.cpp b/third_party/WebKit/Source/bindings/tests/results/core/StringOrArrayBufferOrArrayBufferView.cpp
new file mode 100644
index 0000000..0d7d6fb
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/tests/results/core/StringOrArrayBufferOrArrayBufferView.cpp
@@ -0,0 +1,145 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
+
+#include "StringOrArrayBufferOrArrayBufferView.h"
+
+#include "bindings/core/v8/ToV8.h"
+#include "bindings/core/v8/V8ArrayBuffer.h"
+#include "bindings/core/v8/V8ArrayBufferView.h"
+#include "core/dom/FlexibleArrayBufferView.h"
+
+namespace blink {
+
+StringOrArrayBufferOrArrayBufferView::StringOrArrayBufferOrArrayBufferView()
+    : m_type(SpecificTypeNone)
+{
+}
+
+String StringOrArrayBufferOrArrayBufferView::getAsString() const
+{
+    ASSERT(isString());
+    return m_string;
+}
+
+void StringOrArrayBufferOrArrayBufferView::setString(String value)
+{
+    ASSERT(isNull());
+    m_string = value;
+    m_type = SpecificTypeString;
+}
+
+StringOrArrayBufferOrArrayBufferView StringOrArrayBufferOrArrayBufferView::fromString(String value)
+{
+    StringOrArrayBufferOrArrayBufferView container;
+    container.setString(value);
+    return container;
+}
+
+TestArrayBuffer* StringOrArrayBufferOrArrayBufferView::getAsArrayBuffer() const
+{
+    ASSERT(isArrayBuffer());
+    return m_arrayBuffer;
+}
+
+void StringOrArrayBufferOrArrayBufferView::setArrayBuffer(TestArrayBuffer* value)
+{
+    ASSERT(isNull());
+    m_arrayBuffer = value;
+    m_type = SpecificTypeArrayBuffer;
+}
+
+StringOrArrayBufferOrArrayBufferView StringOrArrayBufferOrArrayBufferView::fromArrayBuffer(TestArrayBuffer* value)
+{
+    StringOrArrayBufferOrArrayBufferView container;
+    container.setArrayBuffer(value);
+    return container;
+}
+
+TestArrayBufferView* StringOrArrayBufferOrArrayBufferView::getAsArrayBufferView() const
+{
+    ASSERT(isArrayBufferView());
+    return m_arrayBufferView;
+}
+
+void StringOrArrayBufferOrArrayBufferView::setArrayBufferView(TestArrayBufferView* value)
+{
+    ASSERT(isNull());
+    m_arrayBufferView = value;
+    m_type = SpecificTypeArrayBufferView;
+}
+
+StringOrArrayBufferOrArrayBufferView StringOrArrayBufferOrArrayBufferView::fromArrayBufferView(TestArrayBufferView* value)
+{
+    StringOrArrayBufferOrArrayBufferView container;
+    container.setArrayBufferView(value);
+    return container;
+}
+
+StringOrArrayBufferOrArrayBufferView::StringOrArrayBufferOrArrayBufferView(const StringOrArrayBufferOrArrayBufferView&) = default;
+StringOrArrayBufferOrArrayBufferView::~StringOrArrayBufferOrArrayBufferView() = default;
+StringOrArrayBufferOrArrayBufferView& StringOrArrayBufferOrArrayBufferView::operator=(const StringOrArrayBufferOrArrayBufferView&) = default;
+
+DEFINE_TRACE(StringOrArrayBufferOrArrayBufferView)
+{
+    visitor->trace(m_arrayBuffer);
+    visitor->trace(m_arrayBufferView);
+}
+
+void V8StringOrArrayBufferOrArrayBufferView::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, StringOrArrayBufferOrArrayBufferView& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
+{
+    if (v8Value.IsEmpty())
+        return;
+
+    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
+        return;
+
+    if (V8ArrayBuffer::hasInstance(v8Value, isolate)) {
+        TestArrayBuffer* cppValue = V8ArrayBuffer::toImpl(v8::Local<v8::Object>::Cast(v8Value));
+        impl.setArrayBuffer(cppValue);
+        return;
+    }
+
+    if (V8ArrayBufferView::hasInstance(v8Value, isolate)) {
+        TestArrayBufferView* cppValue = V8ArrayBufferView::toImpl(v8::Local<v8::Object>::Cast(v8Value));
+        impl.setArrayBufferView(cppValue);
+        return;
+    }
+
+    {
+        V8StringResource<> cppValue = v8Value;
+        if (!cppValue.prepare(exceptionState))
+            return;
+        impl.setString(cppValue);
+        return;
+    }
+
+}
+
+v8::Local<v8::Value> toV8(const StringOrArrayBufferOrArrayBufferView& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
+{
+    switch (impl.m_type) {
+    case StringOrArrayBufferOrArrayBufferView::SpecificTypeNone:
+        return v8::Null(isolate);
+    case StringOrArrayBufferOrArrayBufferView::SpecificTypeString:
+        return v8String(isolate, impl.getAsString());
+    case StringOrArrayBufferOrArrayBufferView::SpecificTypeArrayBuffer:
+        return toV8(impl.getAsArrayBuffer(), creationContext, isolate);
+    case StringOrArrayBufferOrArrayBufferView::SpecificTypeArrayBufferView:
+        return toV8(impl.getAsArrayBufferView(), creationContext, isolate);
+    default:
+        ASSERT_NOT_REACHED();
+    }
+    return v8::Local<v8::Value>();
+}
+
+StringOrArrayBufferOrArrayBufferView NativeValueTraits<StringOrArrayBufferOrArrayBufferView>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
+{
+    StringOrArrayBufferOrArrayBufferView impl;
+    V8StringOrArrayBufferOrArrayBufferView::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
+    return impl;
+}
+
+} // namespace blink
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/StringOrArrayBufferOrArrayBufferView.h b/third_party/WebKit/Source/bindings/tests/results/core/StringOrArrayBufferOrArrayBufferView.h
new file mode 100644
index 0000000..a217bf8
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/tests/results/core/StringOrArrayBufferOrArrayBufferView.h
@@ -0,0 +1,89 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
+
+#ifndef StringOrArrayBufferOrArrayBufferView_h
+#define StringOrArrayBufferOrArrayBufferView_h
+
+#include "bindings/core/v8/Dictionary.h"
+#include "bindings/core/v8/ExceptionState.h"
+#include "bindings/core/v8/V8Binding.h"
+#include "core/CoreExport.h"
+#include "platform/heap/Handle.h"
+
+namespace blink {
+
+class TestArrayBuffer;
+class TestArrayBufferView;
+
+class CORE_EXPORT StringOrArrayBufferOrArrayBufferView final {
+    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
+public:
+    StringOrArrayBufferOrArrayBufferView();
+    bool isNull() const { return m_type == SpecificTypeNone; }
+
+    bool isString() const { return m_type == SpecificTypeString; }
+    String getAsString() const;
+    void setString(String);
+    static StringOrArrayBufferOrArrayBufferView fromString(String);
+
+    bool isArrayBuffer() const { return m_type == SpecificTypeArrayBuffer; }
+    TestArrayBuffer* getAsArrayBuffer() const;
+    void setArrayBuffer(TestArrayBuffer*);
+    static StringOrArrayBufferOrArrayBufferView fromArrayBuffer(TestArrayBuffer*);
+
+    bool isArrayBufferView() const { return m_type == SpecificTypeArrayBufferView; }
+    TestArrayBufferView* getAsArrayBufferView() const;
+    void setArrayBufferView(TestArrayBufferView*);
+    static StringOrArrayBufferOrArrayBufferView fromArrayBufferView(TestArrayBufferView*);
+
+    StringOrArrayBufferOrArrayBufferView(const StringOrArrayBufferOrArrayBufferView&);
+    ~StringOrArrayBufferOrArrayBufferView();
+    StringOrArrayBufferOrArrayBufferView& operator=(const StringOrArrayBufferOrArrayBufferView&);
+    DECLARE_TRACE();
+
+private:
+    enum SpecificTypes {
+        SpecificTypeNone,
+        SpecificTypeString,
+        SpecificTypeArrayBuffer,
+        SpecificTypeArrayBufferView,
+    };
+    SpecificTypes m_type;
+
+    String m_string;
+    Member<TestArrayBuffer> m_arrayBuffer;
+    Member<TestArrayBufferView> m_arrayBufferView;
+
+    friend CORE_EXPORT v8::Local<v8::Value> toV8(const StringOrArrayBufferOrArrayBufferView&, v8::Local<v8::Object>, v8::Isolate*);
+};
+
+class V8StringOrArrayBufferOrArrayBufferView final {
+public:
+    CORE_EXPORT static void toImpl(v8::Isolate*, v8::Local<v8::Value>, StringOrArrayBufferOrArrayBufferView&, UnionTypeConversionMode, ExceptionState&);
+};
+
+CORE_EXPORT v8::Local<v8::Value> toV8(const StringOrArrayBufferOrArrayBufferView&, v8::Local<v8::Object>, v8::Isolate*);
+
+template <class CallbackInfo>
+inline void v8SetReturnValue(const CallbackInfo& callbackInfo, StringOrArrayBufferOrArrayBufferView& impl)
+{
+    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
+}
+
+template <>
+struct NativeValueTraits<StringOrArrayBufferOrArrayBufferView> {
+    CORE_EXPORT static StringOrArrayBufferOrArrayBufferView nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
+};
+
+} // namespace blink
+
+// We need to set canInitializeWithMemset=true because HeapVector supports
+// items that can initialize with memset or have a vtable. It is safe to
+// set canInitializeWithMemset=true for a union type object in practice.
+// See https://codereview.chromium.org/1118993002/#msg5 for more details.
+WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::StringOrArrayBufferOrArrayBufferView);
+
+#endif // StringOrArrayBufferOrArrayBufferView_h
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/StringOrDouble.cpp b/third_party/WebKit/Source/bindings/tests/results/core/StringOrDouble.cpp
new file mode 100644
index 0000000..f18d89f
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/tests/results/core/StringOrDouble.cpp
@@ -0,0 +1,114 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
+
+#include "StringOrDouble.h"
+
+#include "bindings/core/v8/ToV8.h"
+
+namespace blink {
+
+StringOrDouble::StringOrDouble()
+    : m_type(SpecificTypeNone)
+{
+}
+
+String StringOrDouble::getAsString() const
+{
+    ASSERT(isString());
+    return m_string;
+}
+
+void StringOrDouble::setString(String value)
+{
+    ASSERT(isNull());
+    m_string = value;
+    m_type = SpecificTypeString;
+}
+
+StringOrDouble StringOrDouble::fromString(String value)
+{
+    StringOrDouble container;
+    container.setString(value);
+    return container;
+}
+
+double StringOrDouble::getAsDouble() const
+{
+    ASSERT(isDouble());
+    return m_double;
+}
+
+void StringOrDouble::setDouble(double value)
+{
+    ASSERT(isNull());
+    m_double = value;
+    m_type = SpecificTypeDouble;
+}
+
+StringOrDouble StringOrDouble::fromDouble(double value)
+{
+    StringOrDouble container;
+    container.setDouble(value);
+    return container;
+}
+
+StringOrDouble::StringOrDouble(const StringOrDouble&) = default;
+StringOrDouble::~StringOrDouble() = default;
+StringOrDouble& StringOrDouble::operator=(const StringOrDouble&) = default;
+
+DEFINE_TRACE(StringOrDouble)
+{
+}
+
+void V8StringOrDouble::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, StringOrDouble& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
+{
+    if (v8Value.IsEmpty())
+        return;
+
+    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
+        return;
+
+    if (v8Value->IsNumber()) {
+        double cppValue = toRestrictedDouble(isolate, v8Value, exceptionState);
+        if (exceptionState.hadException())
+            return;
+        impl.setDouble(cppValue);
+        return;
+    }
+
+    {
+        V8StringResource<> cppValue = v8Value;
+        if (!cppValue.prepare(exceptionState))
+            return;
+        impl.setString(cppValue);
+        return;
+    }
+
+}
+
+v8::Local<v8::Value> toV8(const StringOrDouble& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
+{
+    switch (impl.m_type) {
+    case StringOrDouble::SpecificTypeNone:
+        return v8::Null(isolate);
+    case StringOrDouble::SpecificTypeString:
+        return v8String(isolate, impl.getAsString());
+    case StringOrDouble::SpecificTypeDouble:
+        return v8::Number::New(isolate, impl.getAsDouble());
+    default:
+        ASSERT_NOT_REACHED();
+    }
+    return v8::Local<v8::Value>();
+}
+
+StringOrDouble NativeValueTraits<StringOrDouble>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
+{
+    StringOrDouble impl;
+    V8StringOrDouble::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
+    return impl;
+}
+
+} // namespace blink
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/StringOrDouble.h b/third_party/WebKit/Source/bindings/tests/results/core/StringOrDouble.h
new file mode 100644
index 0000000..130ab13
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/tests/results/core/StringOrDouble.h
@@ -0,0 +1,80 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
+
+#ifndef StringOrDouble_h
+#define StringOrDouble_h
+
+#include "bindings/core/v8/Dictionary.h"
+#include "bindings/core/v8/ExceptionState.h"
+#include "bindings/core/v8/V8Binding.h"
+#include "core/CoreExport.h"
+#include "platform/heap/Handle.h"
+
+namespace blink {
+
+
+class CORE_EXPORT StringOrDouble final {
+    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
+public:
+    StringOrDouble();
+    bool isNull() const { return m_type == SpecificTypeNone; }
+
+    bool isString() const { return m_type == SpecificTypeString; }
+    String getAsString() const;
+    void setString(String);
+    static StringOrDouble fromString(String);
+
+    bool isDouble() const { return m_type == SpecificTypeDouble; }
+    double getAsDouble() const;
+    void setDouble(double);
+    static StringOrDouble fromDouble(double);
+
+    StringOrDouble(const StringOrDouble&);
+    ~StringOrDouble();
+    StringOrDouble& operator=(const StringOrDouble&);
+    DECLARE_TRACE();
+
+private:
+    enum SpecificTypes {
+        SpecificTypeNone,
+        SpecificTypeString,
+        SpecificTypeDouble,
+    };
+    SpecificTypes m_type;
+
+    String m_string;
+    double m_double;
+
+    friend CORE_EXPORT v8::Local<v8::Value> toV8(const StringOrDouble&, v8::Local<v8::Object>, v8::Isolate*);
+};
+
+class V8StringOrDouble final {
+public:
+    CORE_EXPORT static void toImpl(v8::Isolate*, v8::Local<v8::Value>, StringOrDouble&, UnionTypeConversionMode, ExceptionState&);
+};
+
+CORE_EXPORT v8::Local<v8::Value> toV8(const StringOrDouble&, v8::Local<v8::Object>, v8::Isolate*);
+
+template <class CallbackInfo>
+inline void v8SetReturnValue(const CallbackInfo& callbackInfo, StringOrDouble& impl)
+{
+    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
+}
+
+template <>
+struct NativeValueTraits<StringOrDouble> {
+    CORE_EXPORT static StringOrDouble nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
+};
+
+} // namespace blink
+
+// We need to set canInitializeWithMemset=true because HeapVector supports
+// items that can initialize with memset or have a vtable. It is safe to
+// set canInitializeWithMemset=true for a union type object in practice.
+// See https://codereview.chromium.org/1118993002/#msg5 for more details.
+WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::StringOrDouble);
+
+#endif // StringOrDouble_h
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/StringOrStringSequence.cpp b/third_party/WebKit/Source/bindings/tests/results/core/StringOrStringSequence.cpp
new file mode 100644
index 0000000..45ac157
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/tests/results/core/StringOrStringSequence.cpp
@@ -0,0 +1,114 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
+
+#include "StringOrStringSequence.h"
+
+#include "bindings/core/v8/ToV8.h"
+
+namespace blink {
+
+StringOrStringSequence::StringOrStringSequence()
+    : m_type(SpecificTypeNone)
+{
+}
+
+String StringOrStringSequence::getAsString() const
+{
+    ASSERT(isString());
+    return m_string;
+}
+
+void StringOrStringSequence::setString(String value)
+{
+    ASSERT(isNull());
+    m_string = value;
+    m_type = SpecificTypeString;
+}
+
+StringOrStringSequence StringOrStringSequence::fromString(String value)
+{
+    StringOrStringSequence container;
+    container.setString(value);
+    return container;
+}
+
+const Vector<String>& StringOrStringSequence::getAsStringSequence() const
+{
+    ASSERT(isStringSequence());
+    return m_stringSequence;
+}
+
+void StringOrStringSequence::setStringSequence(const Vector<String>& value)
+{
+    ASSERT(isNull());
+    m_stringSequence = value;
+    m_type = SpecificTypeStringSequence;
+}
+
+StringOrStringSequence StringOrStringSequence::fromStringSequence(const Vector<String>& value)
+{
+    StringOrStringSequence container;
+    container.setStringSequence(value);
+    return container;
+}
+
+StringOrStringSequence::StringOrStringSequence(const StringOrStringSequence&) = default;
+StringOrStringSequence::~StringOrStringSequence() = default;
+StringOrStringSequence& StringOrStringSequence::operator=(const StringOrStringSequence&) = default;
+
+DEFINE_TRACE(StringOrStringSequence)
+{
+}
+
+void V8StringOrStringSequence::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, StringOrStringSequence& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
+{
+    if (v8Value.IsEmpty())
+        return;
+
+    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
+        return;
+
+    if (v8Value->IsArray()) {
+        Vector<String> cppValue = toImplArray<Vector<String>>(v8Value, 0, isolate, exceptionState);
+        if (exceptionState.hadException())
+            return;
+        impl.setStringSequence(cppValue);
+        return;
+    }
+
+    {
+        V8StringResource<> cppValue = v8Value;
+        if (!cppValue.prepare(exceptionState))
+            return;
+        impl.setString(cppValue);
+        return;
+    }
+
+}
+
+v8::Local<v8::Value> toV8(const StringOrStringSequence& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
+{
+    switch (impl.m_type) {
+    case StringOrStringSequence::SpecificTypeNone:
+        return v8::Null(isolate);
+    case StringOrStringSequence::SpecificTypeString:
+        return v8String(isolate, impl.getAsString());
+    case StringOrStringSequence::SpecificTypeStringSequence:
+        return toV8(impl.getAsStringSequence(), creationContext, isolate);
+    default:
+        ASSERT_NOT_REACHED();
+    }
+    return v8::Local<v8::Value>();
+}
+
+StringOrStringSequence NativeValueTraits<StringOrStringSequence>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
+{
+    StringOrStringSequence impl;
+    V8StringOrStringSequence::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
+    return impl;
+}
+
+} // namespace blink
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/StringOrStringSequence.h b/third_party/WebKit/Source/bindings/tests/results/core/StringOrStringSequence.h
new file mode 100644
index 0000000..f9a7298
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/tests/results/core/StringOrStringSequence.h
@@ -0,0 +1,80 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
+
+#ifndef StringOrStringSequence_h
+#define StringOrStringSequence_h
+
+#include "bindings/core/v8/Dictionary.h"
+#include "bindings/core/v8/ExceptionState.h"
+#include "bindings/core/v8/V8Binding.h"
+#include "core/CoreExport.h"
+#include "platform/heap/Handle.h"
+
+namespace blink {
+
+
+class CORE_EXPORT StringOrStringSequence final {
+    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
+public:
+    StringOrStringSequence();
+    bool isNull() const { return m_type == SpecificTypeNone; }
+
+    bool isString() const { return m_type == SpecificTypeString; }
+    String getAsString() const;
+    void setString(String);
+    static StringOrStringSequence fromString(String);
+
+    bool isStringSequence() const { return m_type == SpecificTypeStringSequence; }
+    const Vector<String>& getAsStringSequence() const;
+    void setStringSequence(const Vector<String>&);
+    static StringOrStringSequence fromStringSequence(const Vector<String>&);
+
+    StringOrStringSequence(const StringOrStringSequence&);
+    ~StringOrStringSequence();
+    StringOrStringSequence& operator=(const StringOrStringSequence&);
+    DECLARE_TRACE();
+
+private:
+    enum SpecificTypes {
+        SpecificTypeNone,
+        SpecificTypeString,
+        SpecificTypeStringSequence,
+    };
+    SpecificTypes m_type;
+
+    String m_string;
+    Vector<String> m_stringSequence;
+
+    friend CORE_EXPORT v8::Local<v8::Value> toV8(const StringOrStringSequence&, v8::Local<v8::Object>, v8::Isolate*);
+};
+
+class V8StringOrStringSequence final {
+public:
+    CORE_EXPORT static void toImpl(v8::Isolate*, v8::Local<v8::Value>, StringOrStringSequence&, UnionTypeConversionMode, ExceptionState&);
+};
+
+CORE_EXPORT v8::Local<v8::Value> toV8(const StringOrStringSequence&, v8::Local<v8::Object>, v8::Isolate*);
+
+template <class CallbackInfo>
+inline void v8SetReturnValue(const CallbackInfo& callbackInfo, StringOrStringSequence& impl)
+{
+    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
+}
+
+template <>
+struct NativeValueTraits<StringOrStringSequence> {
+    CORE_EXPORT static StringOrStringSequence nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
+};
+
+} // namespace blink
+
+// We need to set canInitializeWithMemset=true because HeapVector supports
+// items that can initialize with memset or have a vtable. It is safe to
+// set canInitializeWithMemset=true for a union type object in practice.
+// See https://codereview.chromium.org/1118993002/#msg5 for more details.
+WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::StringOrStringSequence);
+
+#endif // StringOrStringSequence_h
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/TestDictionary.cpp b/third_party/WebKit/Source/bindings/tests/results/core/TestDictionary.cpp
index 5c24116bf..0b8aa9c5 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/TestDictionary.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/TestDictionary.cpp
@@ -6,6 +6,8 @@
 
 #include "TestDictionary.h"
 
+#include "bindings/core/v8/DoubleOrString.h"
+#include "bindings/core/v8/TestInterface2OrUint8Array.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/TestDictionary.h b/third_party/WebKit/Source/bindings/tests/results/core/TestDictionary.h
index b6d3b1c1..c3684a39d 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/TestDictionary.h
+++ b/third_party/WebKit/Source/bindings/tests/results/core/TestDictionary.h
@@ -8,9 +8,10 @@
 #define TestDictionary_h
 
 #include "bindings/core/v8/Dictionary.h"
+#include "bindings/core/v8/DoubleOrString.h"
 #include "bindings/core/v8/Nullable.h"
 #include "bindings/core/v8/ScriptValue.h"
-#include "bindings/core/v8/UnionTypesCore.h"
+#include "bindings/core/v8/TestInterface2OrUint8Array.h"
 #include "bindings/tests/idls/core/TestInterface2.h"
 #include "bindings/tests/idls/core/TestInterfaceGarbageCollected.h"
 #include "bindings/tests/idls/core/TestInterfaceImplementation.h"
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/TestDictionaryDerivedImplementedAs.h b/third_party/WebKit/Source/bindings/tests/results/core/TestDictionaryDerivedImplementedAs.h
index 104d6ae9..cf407b30 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/TestDictionaryDerivedImplementedAs.h
+++ b/third_party/WebKit/Source/bindings/tests/results/core/TestDictionaryDerivedImplementedAs.h
@@ -8,7 +8,7 @@
 #define TestDictionaryDerivedImplementedAs_h
 
 #include "bindings/core/v8/Nullable.h"
-#include "bindings/core/v8/UnionTypesCore.h"
+#include "bindings/core/v8/StringOrDouble.h"
 #include "bindings/tests/idls/core/TestDictionary.h"
 #include "core/CoreExport.h"
 #include "platform/heap/Handle.h"
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/TestEnumOrDouble.cpp b/third_party/WebKit/Source/bindings/tests/results/core/TestEnumOrDouble.cpp
new file mode 100644
index 0000000..71948d7
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/tests/results/core/TestEnumOrDouble.cpp
@@ -0,0 +1,133 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
+
+#include "TestEnumOrDouble.h"
+
+#include "bindings/core/v8/ToV8.h"
+
+namespace blink {
+
+TestEnumOrDouble::TestEnumOrDouble()
+    : m_type(SpecificTypeNone)
+{
+}
+
+String TestEnumOrDouble::getAsTestEnum() const
+{
+    ASSERT(isTestEnum());
+    return m_testEnum;
+}
+
+void TestEnumOrDouble::setTestEnum(String value)
+{
+    ASSERT(isNull());
+    NonThrowableExceptionState exceptionState;
+    const char* validValues[] = {
+        "",
+        "EnumValue1",
+        "EnumValue2",
+        "EnumValue3",
+    };
+    if (!isValidEnum(value, validValues, WTF_ARRAY_LENGTH(validValues), "TestEnum", exceptionState)) {
+        ASSERT_NOT_REACHED();
+        return;
+    }
+    m_testEnum = value;
+    m_type = SpecificTypeTestEnum;
+}
+
+TestEnumOrDouble TestEnumOrDouble::fromTestEnum(String value)
+{
+    TestEnumOrDouble container;
+    container.setTestEnum(value);
+    return container;
+}
+
+double TestEnumOrDouble::getAsDouble() const
+{
+    ASSERT(isDouble());
+    return m_double;
+}
+
+void TestEnumOrDouble::setDouble(double value)
+{
+    ASSERT(isNull());
+    m_double = value;
+    m_type = SpecificTypeDouble;
+}
+
+TestEnumOrDouble TestEnumOrDouble::fromDouble(double value)
+{
+    TestEnumOrDouble container;
+    container.setDouble(value);
+    return container;
+}
+
+TestEnumOrDouble::TestEnumOrDouble(const TestEnumOrDouble&) = default;
+TestEnumOrDouble::~TestEnumOrDouble() = default;
+TestEnumOrDouble& TestEnumOrDouble::operator=(const TestEnumOrDouble&) = default;
+
+DEFINE_TRACE(TestEnumOrDouble)
+{
+}
+
+void V8TestEnumOrDouble::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, TestEnumOrDouble& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
+{
+    if (v8Value.IsEmpty())
+        return;
+
+    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
+        return;
+
+    if (v8Value->IsNumber()) {
+        double cppValue = toRestrictedDouble(isolate, v8Value, exceptionState);
+        if (exceptionState.hadException())
+            return;
+        impl.setDouble(cppValue);
+        return;
+    }
+
+    {
+        V8StringResource<> cppValue = v8Value;
+        if (!cppValue.prepare(exceptionState))
+            return;
+        const char* validValues[] = {
+            "",
+            "EnumValue1",
+            "EnumValue2",
+            "EnumValue3",
+        };
+        if (!isValidEnum(cppValue, validValues, WTF_ARRAY_LENGTH(validValues), "TestEnum", exceptionState))
+            return;
+        impl.setTestEnum(cppValue);
+        return;
+    }
+
+}
+
+v8::Local<v8::Value> toV8(const TestEnumOrDouble& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
+{
+    switch (impl.m_type) {
+    case TestEnumOrDouble::SpecificTypeNone:
+        return v8::Null(isolate);
+    case TestEnumOrDouble::SpecificTypeTestEnum:
+        return v8String(isolate, impl.getAsTestEnum());
+    case TestEnumOrDouble::SpecificTypeDouble:
+        return v8::Number::New(isolate, impl.getAsDouble());
+    default:
+        ASSERT_NOT_REACHED();
+    }
+    return v8::Local<v8::Value>();
+}
+
+TestEnumOrDouble NativeValueTraits<TestEnumOrDouble>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
+{
+    TestEnumOrDouble impl;
+    V8TestEnumOrDouble::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
+    return impl;
+}
+
+} // namespace blink
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/TestEnumOrDouble.h b/third_party/WebKit/Source/bindings/tests/results/core/TestEnumOrDouble.h
new file mode 100644
index 0000000..0f2133e
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/tests/results/core/TestEnumOrDouble.h
@@ -0,0 +1,80 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
+
+#ifndef TestEnumOrDouble_h
+#define TestEnumOrDouble_h
+
+#include "bindings/core/v8/Dictionary.h"
+#include "bindings/core/v8/ExceptionState.h"
+#include "bindings/core/v8/V8Binding.h"
+#include "core/CoreExport.h"
+#include "platform/heap/Handle.h"
+
+namespace blink {
+
+
+class CORE_EXPORT TestEnumOrDouble final {
+    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
+public:
+    TestEnumOrDouble();
+    bool isNull() const { return m_type == SpecificTypeNone; }
+
+    bool isTestEnum() const { return m_type == SpecificTypeTestEnum; }
+    String getAsTestEnum() const;
+    void setTestEnum(String);
+    static TestEnumOrDouble fromTestEnum(String);
+
+    bool isDouble() const { return m_type == SpecificTypeDouble; }
+    double getAsDouble() const;
+    void setDouble(double);
+    static TestEnumOrDouble fromDouble(double);
+
+    TestEnumOrDouble(const TestEnumOrDouble&);
+    ~TestEnumOrDouble();
+    TestEnumOrDouble& operator=(const TestEnumOrDouble&);
+    DECLARE_TRACE();
+
+private:
+    enum SpecificTypes {
+        SpecificTypeNone,
+        SpecificTypeTestEnum,
+        SpecificTypeDouble,
+    };
+    SpecificTypes m_type;
+
+    String m_testEnum;
+    double m_double;
+
+    friend CORE_EXPORT v8::Local<v8::Value> toV8(const TestEnumOrDouble&, v8::Local<v8::Object>, v8::Isolate*);
+};
+
+class V8TestEnumOrDouble final {
+public:
+    CORE_EXPORT static void toImpl(v8::Isolate*, v8::Local<v8::Value>, TestEnumOrDouble&, UnionTypeConversionMode, ExceptionState&);
+};
+
+CORE_EXPORT v8::Local<v8::Value> toV8(const TestEnumOrDouble&, v8::Local<v8::Object>, v8::Isolate*);
+
+template <class CallbackInfo>
+inline void v8SetReturnValue(const CallbackInfo& callbackInfo, TestEnumOrDouble& impl)
+{
+    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
+}
+
+template <>
+struct NativeValueTraits<TestEnumOrDouble> {
+    CORE_EXPORT static TestEnumOrDouble nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
+};
+
+} // namespace blink
+
+// We need to set canInitializeWithMemset=true because HeapVector supports
+// items that can initialize with memset or have a vtable. It is safe to
+// set canInitializeWithMemset=true for a union type object in practice.
+// See https://codereview.chromium.org/1118993002/#msg5 for more details.
+WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::TestEnumOrDouble);
+
+#endif // TestEnumOrDouble_h
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/TestInterface2OrUint8Array.cpp b/third_party/WebKit/Source/bindings/tests/results/core/TestInterface2OrUint8Array.cpp
new file mode 100644
index 0000000..28a70c8
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/tests/results/core/TestInterface2OrUint8Array.cpp
@@ -0,0 +1,117 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
+
+#include "TestInterface2OrUint8Array.h"
+
+#include "bindings/core/v8/ToV8.h"
+#include "bindings/core/v8/V8ArrayBufferView.h"
+#include "bindings/core/v8/V8TestInterface2.h"
+#include "bindings/core/v8/V8Uint8Array.h"
+#include "core/dom/FlexibleArrayBufferView.h"
+
+namespace blink {
+
+TestInterface2OrUint8Array::TestInterface2OrUint8Array()
+    : m_type(SpecificTypeNone)
+{
+}
+
+TestInterface2* TestInterface2OrUint8Array::getAsTestInterface2() const
+{
+    ASSERT(isTestInterface2());
+    return m_testInterface2;
+}
+
+void TestInterface2OrUint8Array::setTestInterface2(TestInterface2* value)
+{
+    ASSERT(isNull());
+    m_testInterface2 = value;
+    m_type = SpecificTypeTestInterface2;
+}
+
+TestInterface2OrUint8Array TestInterface2OrUint8Array::fromTestInterface2(TestInterface2* value)
+{
+    TestInterface2OrUint8Array container;
+    container.setTestInterface2(value);
+    return container;
+}
+
+DOMUint8Array* TestInterface2OrUint8Array::getAsUint8Array() const
+{
+    ASSERT(isUint8Array());
+    return m_uint8Array;
+}
+
+void TestInterface2OrUint8Array::setUint8Array(DOMUint8Array* value)
+{
+    ASSERT(isNull());
+    m_uint8Array = value;
+    m_type = SpecificTypeUint8Array;
+}
+
+TestInterface2OrUint8Array TestInterface2OrUint8Array::fromUint8Array(DOMUint8Array* value)
+{
+    TestInterface2OrUint8Array container;
+    container.setUint8Array(value);
+    return container;
+}
+
+TestInterface2OrUint8Array::TestInterface2OrUint8Array(const TestInterface2OrUint8Array&) = default;
+TestInterface2OrUint8Array::~TestInterface2OrUint8Array() = default;
+TestInterface2OrUint8Array& TestInterface2OrUint8Array::operator=(const TestInterface2OrUint8Array&) = default;
+
+DEFINE_TRACE(TestInterface2OrUint8Array)
+{
+    visitor->trace(m_testInterface2);
+    visitor->trace(m_uint8Array);
+}
+
+void V8TestInterface2OrUint8Array::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, TestInterface2OrUint8Array& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
+{
+    if (v8Value.IsEmpty())
+        return;
+
+    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
+        return;
+
+    if (V8TestInterface2::hasInstance(v8Value, isolate)) {
+        TestInterface2* cppValue = V8TestInterface2::toImpl(v8::Local<v8::Object>::Cast(v8Value));
+        impl.setTestInterface2(cppValue);
+        return;
+    }
+
+    if (V8Uint8Array::hasInstance(v8Value, isolate)) {
+        DOMUint8Array* cppValue = V8Uint8Array::toImpl(v8::Local<v8::Object>::Cast(v8Value));
+        impl.setUint8Array(cppValue);
+        return;
+    }
+
+    exceptionState.throwTypeError("The provided value is not of type '(TestInterface2 or Uint8Array)'");
+}
+
+v8::Local<v8::Value> toV8(const TestInterface2OrUint8Array& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
+{
+    switch (impl.m_type) {
+    case TestInterface2OrUint8Array::SpecificTypeNone:
+        return v8::Null(isolate);
+    case TestInterface2OrUint8Array::SpecificTypeTestInterface2:
+        return toV8(impl.getAsTestInterface2(), creationContext, isolate);
+    case TestInterface2OrUint8Array::SpecificTypeUint8Array:
+        return toV8(impl.getAsUint8Array(), creationContext, isolate);
+    default:
+        ASSERT_NOT_REACHED();
+    }
+    return v8::Local<v8::Value>();
+}
+
+TestInterface2OrUint8Array NativeValueTraits<TestInterface2OrUint8Array>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
+{
+    TestInterface2OrUint8Array impl;
+    V8TestInterface2OrUint8Array::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
+    return impl;
+}
+
+} // namespace blink
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/TestInterface2OrUint8Array.h b/third_party/WebKit/Source/bindings/tests/results/core/TestInterface2OrUint8Array.h
new file mode 100644
index 0000000..b4f8d1de
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/tests/results/core/TestInterface2OrUint8Array.h
@@ -0,0 +1,82 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
+
+#ifndef TestInterface2OrUint8Array_h
+#define TestInterface2OrUint8Array_h
+
+#include "bindings/core/v8/Dictionary.h"
+#include "bindings/core/v8/ExceptionState.h"
+#include "bindings/core/v8/V8Binding.h"
+#include "core/CoreExport.h"
+#include "platform/heap/Handle.h"
+
+namespace blink {
+
+class DOMUint8Array;
+class TestInterface2;
+
+class CORE_EXPORT TestInterface2OrUint8Array final {
+    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
+public:
+    TestInterface2OrUint8Array();
+    bool isNull() const { return m_type == SpecificTypeNone; }
+
+    bool isTestInterface2() const { return m_type == SpecificTypeTestInterface2; }
+    TestInterface2* getAsTestInterface2() const;
+    void setTestInterface2(TestInterface2*);
+    static TestInterface2OrUint8Array fromTestInterface2(TestInterface2*);
+
+    bool isUint8Array() const { return m_type == SpecificTypeUint8Array; }
+    DOMUint8Array* getAsUint8Array() const;
+    void setUint8Array(DOMUint8Array*);
+    static TestInterface2OrUint8Array fromUint8Array(DOMUint8Array*);
+
+    TestInterface2OrUint8Array(const TestInterface2OrUint8Array&);
+    ~TestInterface2OrUint8Array();
+    TestInterface2OrUint8Array& operator=(const TestInterface2OrUint8Array&);
+    DECLARE_TRACE();
+
+private:
+    enum SpecificTypes {
+        SpecificTypeNone,
+        SpecificTypeTestInterface2,
+        SpecificTypeUint8Array,
+    };
+    SpecificTypes m_type;
+
+    Member<TestInterface2> m_testInterface2;
+    Member<DOMUint8Array> m_uint8Array;
+
+    friend CORE_EXPORT v8::Local<v8::Value> toV8(const TestInterface2OrUint8Array&, v8::Local<v8::Object>, v8::Isolate*);
+};
+
+class V8TestInterface2OrUint8Array final {
+public:
+    CORE_EXPORT static void toImpl(v8::Isolate*, v8::Local<v8::Value>, TestInterface2OrUint8Array&, UnionTypeConversionMode, ExceptionState&);
+};
+
+CORE_EXPORT v8::Local<v8::Value> toV8(const TestInterface2OrUint8Array&, v8::Local<v8::Object>, v8::Isolate*);
+
+template <class CallbackInfo>
+inline void v8SetReturnValue(const CallbackInfo& callbackInfo, TestInterface2OrUint8Array& impl)
+{
+    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
+}
+
+template <>
+struct NativeValueTraits<TestInterface2OrUint8Array> {
+    CORE_EXPORT static TestInterface2OrUint8Array nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
+};
+
+} // namespace blink
+
+// We need to set canInitializeWithMemset=true because HeapVector supports
+// items that can initialize with memset or have a vtable. It is safe to
+// set canInitializeWithMemset=true for a union type object in practice.
+// See https://codereview.chromium.org/1118993002/#msg5 for more details.
+WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::TestInterface2OrUint8Array);
+
+#endif // TestInterface2OrUint8Array_h
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/TestInterfaceGarbageCollectedOrString.cpp b/third_party/WebKit/Source/bindings/tests/results/core/TestInterfaceGarbageCollectedOrString.cpp
new file mode 100644
index 0000000..cacb428b
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/tests/results/core/TestInterfaceGarbageCollectedOrString.cpp
@@ -0,0 +1,114 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
+
+#include "TestInterfaceGarbageCollectedOrString.h"
+
+#include "bindings/core/v8/ToV8.h"
+#include "bindings/core/v8/V8TestInterfaceGarbageCollected.h"
+
+namespace blink {
+
+TestInterfaceGarbageCollectedOrString::TestInterfaceGarbageCollectedOrString()
+    : m_type(SpecificTypeNone)
+{
+}
+
+TestInterfaceGarbageCollected* TestInterfaceGarbageCollectedOrString::getAsTestInterfaceGarbageCollected() const
+{
+    ASSERT(isTestInterfaceGarbageCollected());
+    return m_testInterfaceGarbageCollected;
+}
+
+void TestInterfaceGarbageCollectedOrString::setTestInterfaceGarbageCollected(TestInterfaceGarbageCollected* value)
+{
+    ASSERT(isNull());
+    m_testInterfaceGarbageCollected = value;
+    m_type = SpecificTypeTestInterfaceGarbageCollected;
+}
+
+TestInterfaceGarbageCollectedOrString TestInterfaceGarbageCollectedOrString::fromTestInterfaceGarbageCollected(TestInterfaceGarbageCollected* value)
+{
+    TestInterfaceGarbageCollectedOrString container;
+    container.setTestInterfaceGarbageCollected(value);
+    return container;
+}
+
+String TestInterfaceGarbageCollectedOrString::getAsString() const
+{
+    ASSERT(isString());
+    return m_string;
+}
+
+void TestInterfaceGarbageCollectedOrString::setString(String value)
+{
+    ASSERT(isNull());
+    m_string = value;
+    m_type = SpecificTypeString;
+}
+
+TestInterfaceGarbageCollectedOrString TestInterfaceGarbageCollectedOrString::fromString(String value)
+{
+    TestInterfaceGarbageCollectedOrString container;
+    container.setString(value);
+    return container;
+}
+
+TestInterfaceGarbageCollectedOrString::TestInterfaceGarbageCollectedOrString(const TestInterfaceGarbageCollectedOrString&) = default;
+TestInterfaceGarbageCollectedOrString::~TestInterfaceGarbageCollectedOrString() = default;
+TestInterfaceGarbageCollectedOrString& TestInterfaceGarbageCollectedOrString::operator=(const TestInterfaceGarbageCollectedOrString&) = default;
+
+DEFINE_TRACE(TestInterfaceGarbageCollectedOrString)
+{
+    visitor->trace(m_testInterfaceGarbageCollected);
+}
+
+void V8TestInterfaceGarbageCollectedOrString::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, TestInterfaceGarbageCollectedOrString& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
+{
+    if (v8Value.IsEmpty())
+        return;
+
+    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
+        return;
+
+    if (V8TestInterfaceGarbageCollected::hasInstance(v8Value, isolate)) {
+        TestInterfaceGarbageCollected* cppValue = V8TestInterfaceGarbageCollected::toImpl(v8::Local<v8::Object>::Cast(v8Value));
+        impl.setTestInterfaceGarbageCollected(cppValue);
+        return;
+    }
+
+    {
+        V8StringResource<> cppValue = v8Value;
+        if (!cppValue.prepare(exceptionState))
+            return;
+        impl.setString(cppValue);
+        return;
+    }
+
+}
+
+v8::Local<v8::Value> toV8(const TestInterfaceGarbageCollectedOrString& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
+{
+    switch (impl.m_type) {
+    case TestInterfaceGarbageCollectedOrString::SpecificTypeNone:
+        return v8::Null(isolate);
+    case TestInterfaceGarbageCollectedOrString::SpecificTypeTestInterfaceGarbageCollected:
+        return toV8(impl.getAsTestInterfaceGarbageCollected(), creationContext, isolate);
+    case TestInterfaceGarbageCollectedOrString::SpecificTypeString:
+        return v8String(isolate, impl.getAsString());
+    default:
+        ASSERT_NOT_REACHED();
+    }
+    return v8::Local<v8::Value>();
+}
+
+TestInterfaceGarbageCollectedOrString NativeValueTraits<TestInterfaceGarbageCollectedOrString>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
+{
+    TestInterfaceGarbageCollectedOrString impl;
+    V8TestInterfaceGarbageCollectedOrString::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
+    return impl;
+}
+
+} // namespace blink
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/TestInterfaceGarbageCollectedOrString.h b/third_party/WebKit/Source/bindings/tests/results/core/TestInterfaceGarbageCollectedOrString.h
new file mode 100644
index 0000000..b08bf20
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/tests/results/core/TestInterfaceGarbageCollectedOrString.h
@@ -0,0 +1,81 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
+
+#ifndef TestInterfaceGarbageCollectedOrString_h
+#define TestInterfaceGarbageCollectedOrString_h
+
+#include "bindings/core/v8/Dictionary.h"
+#include "bindings/core/v8/ExceptionState.h"
+#include "bindings/core/v8/V8Binding.h"
+#include "core/CoreExport.h"
+#include "platform/heap/Handle.h"
+
+namespace blink {
+
+class TestInterfaceGarbageCollected;
+
+class CORE_EXPORT TestInterfaceGarbageCollectedOrString final {
+    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
+public:
+    TestInterfaceGarbageCollectedOrString();
+    bool isNull() const { return m_type == SpecificTypeNone; }
+
+    bool isTestInterfaceGarbageCollected() const { return m_type == SpecificTypeTestInterfaceGarbageCollected; }
+    TestInterfaceGarbageCollected* getAsTestInterfaceGarbageCollected() const;
+    void setTestInterfaceGarbageCollected(TestInterfaceGarbageCollected*);
+    static TestInterfaceGarbageCollectedOrString fromTestInterfaceGarbageCollected(TestInterfaceGarbageCollected*);
+
+    bool isString() const { return m_type == SpecificTypeString; }
+    String getAsString() const;
+    void setString(String);
+    static TestInterfaceGarbageCollectedOrString fromString(String);
+
+    TestInterfaceGarbageCollectedOrString(const TestInterfaceGarbageCollectedOrString&);
+    ~TestInterfaceGarbageCollectedOrString();
+    TestInterfaceGarbageCollectedOrString& operator=(const TestInterfaceGarbageCollectedOrString&);
+    DECLARE_TRACE();
+
+private:
+    enum SpecificTypes {
+        SpecificTypeNone,
+        SpecificTypeTestInterfaceGarbageCollected,
+        SpecificTypeString,
+    };
+    SpecificTypes m_type;
+
+    Member<TestInterfaceGarbageCollected> m_testInterfaceGarbageCollected;
+    String m_string;
+
+    friend CORE_EXPORT v8::Local<v8::Value> toV8(const TestInterfaceGarbageCollectedOrString&, v8::Local<v8::Object>, v8::Isolate*);
+};
+
+class V8TestInterfaceGarbageCollectedOrString final {
+public:
+    CORE_EXPORT static void toImpl(v8::Isolate*, v8::Local<v8::Value>, TestInterfaceGarbageCollectedOrString&, UnionTypeConversionMode, ExceptionState&);
+};
+
+CORE_EXPORT v8::Local<v8::Value> toV8(const TestInterfaceGarbageCollectedOrString&, v8::Local<v8::Object>, v8::Isolate*);
+
+template <class CallbackInfo>
+inline void v8SetReturnValue(const CallbackInfo& callbackInfo, TestInterfaceGarbageCollectedOrString& impl)
+{
+    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
+}
+
+template <>
+struct NativeValueTraits<TestInterfaceGarbageCollectedOrString> {
+    CORE_EXPORT static TestInterfaceGarbageCollectedOrString nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
+};
+
+} // namespace blink
+
+// We need to set canInitializeWithMemset=true because HeapVector supports
+// items that can initialize with memset or have a vtable. It is safe to
+// set canInitializeWithMemset=true for a union type object in practice.
+// See https://codereview.chromium.org/1118993002/#msg5 for more details.
+WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::TestInterfaceGarbageCollectedOrString);
+
+#endif // TestInterfaceGarbageCollectedOrString_h
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/TestInterfaceOrLong.cpp b/third_party/WebKit/Source/bindings/tests/results/core/TestInterfaceOrLong.cpp
new file mode 100644
index 0000000..314c28a8
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/tests/results/core/TestInterfaceOrLong.cpp
@@ -0,0 +1,126 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
+
+#include "TestInterfaceOrLong.h"
+
+#include "bindings/core/v8/ToV8.h"
+#include "bindings/core/v8/V8TestInterface.h"
+#include "bindings/tests/idls/core/TestImplements2.h"
+#include "bindings/tests/idls/core/TestImplements3Implementation.h"
+#include "bindings/tests/idls/core/TestPartialInterface.h"
+#include "bindings/tests/idls/core/TestPartialInterfaceImplementation.h"
+
+namespace blink {
+
+TestInterfaceOrLong::TestInterfaceOrLong()
+    : m_type(SpecificTypeNone)
+{
+}
+
+TestInterfaceImplementation* TestInterfaceOrLong::getAsTestInterface() const
+{
+    ASSERT(isTestInterface());
+    return m_testInterface;
+}
+
+void TestInterfaceOrLong::setTestInterface(TestInterfaceImplementation* value)
+{
+    ASSERT(isNull());
+    m_testInterface = value;
+    m_type = SpecificTypeTestInterface;
+}
+
+TestInterfaceOrLong TestInterfaceOrLong::fromTestInterface(TestInterfaceImplementation* value)
+{
+    TestInterfaceOrLong container;
+    container.setTestInterface(value);
+    return container;
+}
+
+int TestInterfaceOrLong::getAsLong() const
+{
+    ASSERT(isLong());
+    return m_long;
+}
+
+void TestInterfaceOrLong::setLong(int value)
+{
+    ASSERT(isNull());
+    m_long = value;
+    m_type = SpecificTypeLong;
+}
+
+TestInterfaceOrLong TestInterfaceOrLong::fromLong(int value)
+{
+    TestInterfaceOrLong container;
+    container.setLong(value);
+    return container;
+}
+
+TestInterfaceOrLong::TestInterfaceOrLong(const TestInterfaceOrLong&) = default;
+TestInterfaceOrLong::~TestInterfaceOrLong() = default;
+TestInterfaceOrLong& TestInterfaceOrLong::operator=(const TestInterfaceOrLong&) = default;
+
+DEFINE_TRACE(TestInterfaceOrLong)
+{
+    visitor->trace(m_testInterface);
+}
+
+void V8TestInterfaceOrLong::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, TestInterfaceOrLong& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
+{
+    if (v8Value.IsEmpty())
+        return;
+
+    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
+        return;
+
+    if (V8TestInterface::hasInstance(v8Value, isolate)) {
+        TestInterfaceImplementation* cppValue = V8TestInterface::toImpl(v8::Local<v8::Object>::Cast(v8Value));
+        impl.setTestInterface(cppValue);
+        return;
+    }
+
+    if (v8Value->IsNumber()) {
+        int cppValue = toInt32(isolate, v8Value, NormalConversion, exceptionState);
+        if (exceptionState.hadException())
+            return;
+        impl.setLong(cppValue);
+        return;
+    }
+
+    {
+        int cppValue = toInt32(isolate, v8Value, NormalConversion, exceptionState);
+        if (exceptionState.hadException())
+            return;
+        impl.setLong(cppValue);
+        return;
+    }
+
+}
+
+v8::Local<v8::Value> toV8(const TestInterfaceOrLong& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
+{
+    switch (impl.m_type) {
+    case TestInterfaceOrLong::SpecificTypeNone:
+        return v8::Null(isolate);
+    case TestInterfaceOrLong::SpecificTypeTestInterface:
+        return toV8(impl.getAsTestInterface(), creationContext, isolate);
+    case TestInterfaceOrLong::SpecificTypeLong:
+        return v8::Integer::New(isolate, impl.getAsLong());
+    default:
+        ASSERT_NOT_REACHED();
+    }
+    return v8::Local<v8::Value>();
+}
+
+TestInterfaceOrLong NativeValueTraits<TestInterfaceOrLong>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
+{
+    TestInterfaceOrLong impl;
+    V8TestInterfaceOrLong::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
+    return impl;
+}
+
+} // namespace blink
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/TestInterfaceOrLong.h b/third_party/WebKit/Source/bindings/tests/results/core/TestInterfaceOrLong.h
new file mode 100644
index 0000000..94118e9
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/tests/results/core/TestInterfaceOrLong.h
@@ -0,0 +1,81 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
+
+#ifndef TestInterfaceOrLong_h
+#define TestInterfaceOrLong_h
+
+#include "bindings/core/v8/Dictionary.h"
+#include "bindings/core/v8/ExceptionState.h"
+#include "bindings/core/v8/V8Binding.h"
+#include "core/CoreExport.h"
+#include "platform/heap/Handle.h"
+
+namespace blink {
+
+class TestInterfaceImplementation;
+
+class CORE_EXPORT TestInterfaceOrLong final {
+    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
+public:
+    TestInterfaceOrLong();
+    bool isNull() const { return m_type == SpecificTypeNone; }
+
+    bool isTestInterface() const { return m_type == SpecificTypeTestInterface; }
+    TestInterfaceImplementation* getAsTestInterface() const;
+    void setTestInterface(TestInterfaceImplementation*);
+    static TestInterfaceOrLong fromTestInterface(TestInterfaceImplementation*);
+
+    bool isLong() const { return m_type == SpecificTypeLong; }
+    int getAsLong() const;
+    void setLong(int);
+    static TestInterfaceOrLong fromLong(int);
+
+    TestInterfaceOrLong(const TestInterfaceOrLong&);
+    ~TestInterfaceOrLong();
+    TestInterfaceOrLong& operator=(const TestInterfaceOrLong&);
+    DECLARE_TRACE();
+
+private:
+    enum SpecificTypes {
+        SpecificTypeNone,
+        SpecificTypeTestInterface,
+        SpecificTypeLong,
+    };
+    SpecificTypes m_type;
+
+    Member<TestInterfaceImplementation> m_testInterface;
+    int m_long;
+
+    friend CORE_EXPORT v8::Local<v8::Value> toV8(const TestInterfaceOrLong&, v8::Local<v8::Object>, v8::Isolate*);
+};
+
+class V8TestInterfaceOrLong final {
+public:
+    CORE_EXPORT static void toImpl(v8::Isolate*, v8::Local<v8::Value>, TestInterfaceOrLong&, UnionTypeConversionMode, ExceptionState&);
+};
+
+CORE_EXPORT v8::Local<v8::Value> toV8(const TestInterfaceOrLong&, v8::Local<v8::Object>, v8::Isolate*);
+
+template <class CallbackInfo>
+inline void v8SetReturnValue(const CallbackInfo& callbackInfo, TestInterfaceOrLong& impl)
+{
+    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
+}
+
+template <>
+struct NativeValueTraits<TestInterfaceOrLong> {
+    CORE_EXPORT static TestInterfaceOrLong nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
+};
+
+} // namespace blink
+
+// We need to set canInitializeWithMemset=true because HeapVector supports
+// items that can initialize with memset or have a vtable. It is safe to
+// set canInitializeWithMemset=true for a union type object in practice.
+// See https://codereview.chromium.org/1118993002/#msg5 for more details.
+WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::TestInterfaceOrLong);
+
+#endif // TestInterfaceOrLong_h
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/TestInterfaceOrTestInterfaceEmpty.cpp b/third_party/WebKit/Source/bindings/tests/results/core/TestInterfaceOrTestInterfaceEmpty.cpp
new file mode 100644
index 0000000..3aa49d422
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/tests/results/core/TestInterfaceOrTestInterfaceEmpty.cpp
@@ -0,0 +1,119 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
+
+#include "TestInterfaceOrTestInterfaceEmpty.h"
+
+#include "bindings/core/v8/ToV8.h"
+#include "bindings/core/v8/V8TestInterface.h"
+#include "bindings/core/v8/V8TestInterfaceEmpty.h"
+#include "bindings/tests/idls/core/TestImplements2.h"
+#include "bindings/tests/idls/core/TestImplements3Implementation.h"
+#include "bindings/tests/idls/core/TestPartialInterface.h"
+#include "bindings/tests/idls/core/TestPartialInterfaceImplementation.h"
+
+namespace blink {
+
+TestInterfaceOrTestInterfaceEmpty::TestInterfaceOrTestInterfaceEmpty()
+    : m_type(SpecificTypeNone)
+{
+}
+
+TestInterfaceImplementation* TestInterfaceOrTestInterfaceEmpty::getAsTestInterface() const
+{
+    ASSERT(isTestInterface());
+    return m_testInterface;
+}
+
+void TestInterfaceOrTestInterfaceEmpty::setTestInterface(TestInterfaceImplementation* value)
+{
+    ASSERT(isNull());
+    m_testInterface = value;
+    m_type = SpecificTypeTestInterface;
+}
+
+TestInterfaceOrTestInterfaceEmpty TestInterfaceOrTestInterfaceEmpty::fromTestInterface(TestInterfaceImplementation* value)
+{
+    TestInterfaceOrTestInterfaceEmpty container;
+    container.setTestInterface(value);
+    return container;
+}
+
+TestInterfaceEmpty* TestInterfaceOrTestInterfaceEmpty::getAsTestInterfaceEmpty() const
+{
+    ASSERT(isTestInterfaceEmpty());
+    return m_testInterfaceEmpty;
+}
+
+void TestInterfaceOrTestInterfaceEmpty::setTestInterfaceEmpty(TestInterfaceEmpty* value)
+{
+    ASSERT(isNull());
+    m_testInterfaceEmpty = value;
+    m_type = SpecificTypeTestInterfaceEmpty;
+}
+
+TestInterfaceOrTestInterfaceEmpty TestInterfaceOrTestInterfaceEmpty::fromTestInterfaceEmpty(TestInterfaceEmpty* value)
+{
+    TestInterfaceOrTestInterfaceEmpty container;
+    container.setTestInterfaceEmpty(value);
+    return container;
+}
+
+TestInterfaceOrTestInterfaceEmpty::TestInterfaceOrTestInterfaceEmpty(const TestInterfaceOrTestInterfaceEmpty&) = default;
+TestInterfaceOrTestInterfaceEmpty::~TestInterfaceOrTestInterfaceEmpty() = default;
+TestInterfaceOrTestInterfaceEmpty& TestInterfaceOrTestInterfaceEmpty::operator=(const TestInterfaceOrTestInterfaceEmpty&) = default;
+
+DEFINE_TRACE(TestInterfaceOrTestInterfaceEmpty)
+{
+    visitor->trace(m_testInterface);
+    visitor->trace(m_testInterfaceEmpty);
+}
+
+void V8TestInterfaceOrTestInterfaceEmpty::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, TestInterfaceOrTestInterfaceEmpty& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
+{
+    if (v8Value.IsEmpty())
+        return;
+
+    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
+        return;
+
+    if (V8TestInterface::hasInstance(v8Value, isolate)) {
+        TestInterfaceImplementation* cppValue = V8TestInterface::toImpl(v8::Local<v8::Object>::Cast(v8Value));
+        impl.setTestInterface(cppValue);
+        return;
+    }
+
+    if (V8TestInterfaceEmpty::hasInstance(v8Value, isolate)) {
+        TestInterfaceEmpty* cppValue = V8TestInterfaceEmpty::toImpl(v8::Local<v8::Object>::Cast(v8Value));
+        impl.setTestInterfaceEmpty(cppValue);
+        return;
+    }
+
+    exceptionState.throwTypeError("The provided value is not of type '(TestInterface or TestInterfaceEmpty)'");
+}
+
+v8::Local<v8::Value> toV8(const TestInterfaceOrTestInterfaceEmpty& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
+{
+    switch (impl.m_type) {
+    case TestInterfaceOrTestInterfaceEmpty::SpecificTypeNone:
+        return v8::Null(isolate);
+    case TestInterfaceOrTestInterfaceEmpty::SpecificTypeTestInterface:
+        return toV8(impl.getAsTestInterface(), creationContext, isolate);
+    case TestInterfaceOrTestInterfaceEmpty::SpecificTypeTestInterfaceEmpty:
+        return toV8(impl.getAsTestInterfaceEmpty(), creationContext, isolate);
+    default:
+        ASSERT_NOT_REACHED();
+    }
+    return v8::Local<v8::Value>();
+}
+
+TestInterfaceOrTestInterfaceEmpty NativeValueTraits<TestInterfaceOrTestInterfaceEmpty>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
+{
+    TestInterfaceOrTestInterfaceEmpty impl;
+    V8TestInterfaceOrTestInterfaceEmpty::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
+    return impl;
+}
+
+} // namespace blink
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/TestInterfaceOrTestInterfaceEmpty.h b/third_party/WebKit/Source/bindings/tests/results/core/TestInterfaceOrTestInterfaceEmpty.h
new file mode 100644
index 0000000..becff96
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/tests/results/core/TestInterfaceOrTestInterfaceEmpty.h
@@ -0,0 +1,82 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
+
+#ifndef TestInterfaceOrTestInterfaceEmpty_h
+#define TestInterfaceOrTestInterfaceEmpty_h
+
+#include "bindings/core/v8/Dictionary.h"
+#include "bindings/core/v8/ExceptionState.h"
+#include "bindings/core/v8/V8Binding.h"
+#include "core/CoreExport.h"
+#include "platform/heap/Handle.h"
+
+namespace blink {
+
+class TestInterfaceEmpty;
+class TestInterfaceImplementation;
+
+class CORE_EXPORT TestInterfaceOrTestInterfaceEmpty final {
+    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
+public:
+    TestInterfaceOrTestInterfaceEmpty();
+    bool isNull() const { return m_type == SpecificTypeNone; }
+
+    bool isTestInterface() const { return m_type == SpecificTypeTestInterface; }
+    TestInterfaceImplementation* getAsTestInterface() const;
+    void setTestInterface(TestInterfaceImplementation*);
+    static TestInterfaceOrTestInterfaceEmpty fromTestInterface(TestInterfaceImplementation*);
+
+    bool isTestInterfaceEmpty() const { return m_type == SpecificTypeTestInterfaceEmpty; }
+    TestInterfaceEmpty* getAsTestInterfaceEmpty() const;
+    void setTestInterfaceEmpty(TestInterfaceEmpty*);
+    static TestInterfaceOrTestInterfaceEmpty fromTestInterfaceEmpty(TestInterfaceEmpty*);
+
+    TestInterfaceOrTestInterfaceEmpty(const TestInterfaceOrTestInterfaceEmpty&);
+    ~TestInterfaceOrTestInterfaceEmpty();
+    TestInterfaceOrTestInterfaceEmpty& operator=(const TestInterfaceOrTestInterfaceEmpty&);
+    DECLARE_TRACE();
+
+private:
+    enum SpecificTypes {
+        SpecificTypeNone,
+        SpecificTypeTestInterface,
+        SpecificTypeTestInterfaceEmpty,
+    };
+    SpecificTypes m_type;
+
+    Member<TestInterfaceImplementation> m_testInterface;
+    Member<TestInterfaceEmpty> m_testInterfaceEmpty;
+
+    friend CORE_EXPORT v8::Local<v8::Value> toV8(const TestInterfaceOrTestInterfaceEmpty&, v8::Local<v8::Object>, v8::Isolate*);
+};
+
+class V8TestInterfaceOrTestInterfaceEmpty final {
+public:
+    CORE_EXPORT static void toImpl(v8::Isolate*, v8::Local<v8::Value>, TestInterfaceOrTestInterfaceEmpty&, UnionTypeConversionMode, ExceptionState&);
+};
+
+CORE_EXPORT v8::Local<v8::Value> toV8(const TestInterfaceOrTestInterfaceEmpty&, v8::Local<v8::Object>, v8::Isolate*);
+
+template <class CallbackInfo>
+inline void v8SetReturnValue(const CallbackInfo& callbackInfo, TestInterfaceOrTestInterfaceEmpty& impl)
+{
+    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
+}
+
+template <>
+struct NativeValueTraits<TestInterfaceOrTestInterfaceEmpty> {
+    CORE_EXPORT static TestInterfaceOrTestInterfaceEmpty nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
+};
+
+} // namespace blink
+
+// We need to set canInitializeWithMemset=true because HeapVector supports
+// items that can initialize with memset or have a vtable. It is safe to
+// set canInitializeWithMemset=true for a union type object in practice.
+// See https://codereview.chromium.org/1118993002/#msg5 for more details.
+WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::TestInterfaceOrTestInterfaceEmpty);
+
+#endif // TestInterfaceOrTestInterfaceEmpty_h
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/UnionTypesCore.cpp b/third_party/WebKit/Source/bindings/tests/results/core/UnionTypesCore.cpp
deleted file mode 100644
index 9401c45..0000000
--- a/third_party/WebKit/Source/bindings/tests/results/core/UnionTypesCore.cpp
+++ /dev/null
@@ -1,1562 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
-
-#include "bindings/core/v8/UnionTypesCore.h"
-
-#include "bindings/core/v8/Dictionary.h"
-#include "bindings/core/v8/UnionTypesCore.h"
-#include "bindings/core/v8/V8ArrayBuffer.h"
-#include "bindings/core/v8/V8ArrayBufferView.h"
-#include "bindings/core/v8/V8Node.h"
-#include "bindings/core/v8/V8NodeList.h"
-#include "bindings/core/v8/V8TestInterface.h"
-#include "bindings/core/v8/V8TestInterface2.h"
-#include "bindings/core/v8/V8TestInterfaceEmpty.h"
-#include "bindings/core/v8/V8TestInterfaceGarbageCollected.h"
-#include "bindings/core/v8/V8Uint8Array.h"
-#include "bindings/tests/idls/core/TestImplements2.h"
-#include "bindings/tests/idls/core/TestImplements3Implementation.h"
-#include "bindings/tests/idls/core/TestPartialInterface.h"
-#include "bindings/tests/idls/core/TestPartialInterfaceImplementation.h"
-#include "core/dom/FlexibleArrayBufferView.h"
-#include "core/dom/NameNodeList.h"
-#include "core/dom/NodeList.h"
-#include "core/dom/StaticNodeList.h"
-#include "core/html/LabelsNodeList.h"
-
-namespace blink {
-
-ArrayBufferOrArrayBufferViewOrDictionary::ArrayBufferOrArrayBufferViewOrDictionary()
-    : m_type(SpecificTypeNone)
-{
-}
-
-TestArrayBuffer* ArrayBufferOrArrayBufferViewOrDictionary::getAsArrayBuffer() const
-{
-    ASSERT(isArrayBuffer());
-    return m_arrayBuffer;
-}
-
-void ArrayBufferOrArrayBufferViewOrDictionary::setArrayBuffer(TestArrayBuffer* value)
-{
-    ASSERT(isNull());
-    m_arrayBuffer = value;
-    m_type = SpecificTypeArrayBuffer;
-}
-
-ArrayBufferOrArrayBufferViewOrDictionary ArrayBufferOrArrayBufferViewOrDictionary::fromArrayBuffer(TestArrayBuffer* value)
-{
-    ArrayBufferOrArrayBufferViewOrDictionary container;
-    container.setArrayBuffer(value);
-    return container;
-}
-
-TestArrayBufferView* ArrayBufferOrArrayBufferViewOrDictionary::getAsArrayBufferView() const
-{
-    ASSERT(isArrayBufferView());
-    return m_arrayBufferView;
-}
-
-void ArrayBufferOrArrayBufferViewOrDictionary::setArrayBufferView(TestArrayBufferView* value)
-{
-    ASSERT(isNull());
-    m_arrayBufferView = value;
-    m_type = SpecificTypeArrayBufferView;
-}
-
-ArrayBufferOrArrayBufferViewOrDictionary ArrayBufferOrArrayBufferViewOrDictionary::fromArrayBufferView(TestArrayBufferView* value)
-{
-    ArrayBufferOrArrayBufferViewOrDictionary container;
-    container.setArrayBufferView(value);
-    return container;
-}
-
-Dictionary ArrayBufferOrArrayBufferViewOrDictionary::getAsDictionary() const
-{
-    ASSERT(isDictionary());
-    return m_dictionary;
-}
-
-void ArrayBufferOrArrayBufferViewOrDictionary::setDictionary(Dictionary value)
-{
-    ASSERT(isNull());
-    m_dictionary = value;
-    m_type = SpecificTypeDictionary;
-}
-
-ArrayBufferOrArrayBufferViewOrDictionary ArrayBufferOrArrayBufferViewOrDictionary::fromDictionary(Dictionary value)
-{
-    ArrayBufferOrArrayBufferViewOrDictionary container;
-    container.setDictionary(value);
-    return container;
-}
-
-ArrayBufferOrArrayBufferViewOrDictionary::ArrayBufferOrArrayBufferViewOrDictionary(const ArrayBufferOrArrayBufferViewOrDictionary&) = default;
-ArrayBufferOrArrayBufferViewOrDictionary::~ArrayBufferOrArrayBufferViewOrDictionary() = default;
-ArrayBufferOrArrayBufferViewOrDictionary& ArrayBufferOrArrayBufferViewOrDictionary::operator=(const ArrayBufferOrArrayBufferViewOrDictionary&) = default;
-
-DEFINE_TRACE(ArrayBufferOrArrayBufferViewOrDictionary)
-{
-    visitor->trace(m_arrayBuffer);
-    visitor->trace(m_arrayBufferView);
-}
-
-void V8ArrayBufferOrArrayBufferViewOrDictionary::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, ArrayBufferOrArrayBufferViewOrDictionary& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
-{
-    if (v8Value.IsEmpty())
-        return;
-
-    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
-        return;
-
-    if (V8ArrayBuffer::hasInstance(v8Value, isolate)) {
-        TestArrayBuffer* cppValue = V8ArrayBuffer::toImpl(v8::Local<v8::Object>::Cast(v8Value));
-        impl.setArrayBuffer(cppValue);
-        return;
-    }
-
-    if (V8ArrayBufferView::hasInstance(v8Value, isolate)) {
-        TestArrayBufferView* cppValue = V8ArrayBufferView::toImpl(v8::Local<v8::Object>::Cast(v8Value));
-        impl.setArrayBufferView(cppValue);
-        return;
-    }
-
-    if (isUndefinedOrNull(v8Value) || v8Value->IsObject()) {
-        Dictionary cppValue = Dictionary(v8Value, isolate, exceptionState);
-        if (exceptionState.hadException())
-            return;
-        impl.setDictionary(cppValue);
-        return;
-    }
-
-    exceptionState.throwTypeError("The provided value is not of type '(ArrayBuffer or ArrayBufferView or Dictionary)'");
-}
-
-v8::Local<v8::Value> toV8(const ArrayBufferOrArrayBufferViewOrDictionary& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
-{
-    switch (impl.m_type) {
-    case ArrayBufferOrArrayBufferViewOrDictionary::SpecificTypeNone:
-        return v8::Null(isolate);
-    case ArrayBufferOrArrayBufferViewOrDictionary::SpecificTypeArrayBuffer:
-        return toV8(impl.getAsArrayBuffer(), creationContext, isolate);
-    case ArrayBufferOrArrayBufferViewOrDictionary::SpecificTypeArrayBufferView:
-        return toV8(impl.getAsArrayBufferView(), creationContext, isolate);
-    case ArrayBufferOrArrayBufferViewOrDictionary::SpecificTypeDictionary:
-        return impl.getAsDictionary().v8Value();
-    default:
-        ASSERT_NOT_REACHED();
-    }
-    return v8::Local<v8::Value>();
-}
-
-ArrayBufferOrArrayBufferViewOrDictionary NativeValueTraits<ArrayBufferOrArrayBufferViewOrDictionary>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
-{
-    ArrayBufferOrArrayBufferViewOrDictionary impl;
-    V8ArrayBufferOrArrayBufferViewOrDictionary::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
-    return impl;
-}
-
-BooleanOrStringOrUnrestrictedDouble::BooleanOrStringOrUnrestrictedDouble()
-    : m_type(SpecificTypeNone)
-{
-}
-
-bool BooleanOrStringOrUnrestrictedDouble::getAsBoolean() const
-{
-    ASSERT(isBoolean());
-    return m_boolean;
-}
-
-void BooleanOrStringOrUnrestrictedDouble::setBoolean(bool value)
-{
-    ASSERT(isNull());
-    m_boolean = value;
-    m_type = SpecificTypeBoolean;
-}
-
-BooleanOrStringOrUnrestrictedDouble BooleanOrStringOrUnrestrictedDouble::fromBoolean(bool value)
-{
-    BooleanOrStringOrUnrestrictedDouble container;
-    container.setBoolean(value);
-    return container;
-}
-
-String BooleanOrStringOrUnrestrictedDouble::getAsString() const
-{
-    ASSERT(isString());
-    return m_string;
-}
-
-void BooleanOrStringOrUnrestrictedDouble::setString(String value)
-{
-    ASSERT(isNull());
-    m_string = value;
-    m_type = SpecificTypeString;
-}
-
-BooleanOrStringOrUnrestrictedDouble BooleanOrStringOrUnrestrictedDouble::fromString(String value)
-{
-    BooleanOrStringOrUnrestrictedDouble container;
-    container.setString(value);
-    return container;
-}
-
-double BooleanOrStringOrUnrestrictedDouble::getAsUnrestrictedDouble() const
-{
-    ASSERT(isUnrestrictedDouble());
-    return m_unrestrictedDouble;
-}
-
-void BooleanOrStringOrUnrestrictedDouble::setUnrestrictedDouble(double value)
-{
-    ASSERT(isNull());
-    m_unrestrictedDouble = value;
-    m_type = SpecificTypeUnrestrictedDouble;
-}
-
-BooleanOrStringOrUnrestrictedDouble BooleanOrStringOrUnrestrictedDouble::fromUnrestrictedDouble(double value)
-{
-    BooleanOrStringOrUnrestrictedDouble container;
-    container.setUnrestrictedDouble(value);
-    return container;
-}
-
-BooleanOrStringOrUnrestrictedDouble::BooleanOrStringOrUnrestrictedDouble(const BooleanOrStringOrUnrestrictedDouble&) = default;
-BooleanOrStringOrUnrestrictedDouble::~BooleanOrStringOrUnrestrictedDouble() = default;
-BooleanOrStringOrUnrestrictedDouble& BooleanOrStringOrUnrestrictedDouble::operator=(const BooleanOrStringOrUnrestrictedDouble&) = default;
-
-DEFINE_TRACE(BooleanOrStringOrUnrestrictedDouble)
-{
-}
-
-void V8BooleanOrStringOrUnrestrictedDouble::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, BooleanOrStringOrUnrestrictedDouble& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
-{
-    if (v8Value.IsEmpty())
-        return;
-
-    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
-        return;
-
-    if (v8Value->IsBoolean()) {
-        impl.setBoolean(v8Value.As<v8::Boolean>()->Value());
-        return;
-    }
-
-    if (v8Value->IsNumber()) {
-        double cppValue = toDouble(isolate, v8Value, exceptionState);
-        if (exceptionState.hadException())
-            return;
-        impl.setUnrestrictedDouble(cppValue);
-        return;
-    }
-
-    {
-        V8StringResource<> cppValue = v8Value;
-        if (!cppValue.prepare(exceptionState))
-            return;
-        impl.setString(cppValue);
-        return;
-    }
-
-}
-
-v8::Local<v8::Value> toV8(const BooleanOrStringOrUnrestrictedDouble& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
-{
-    switch (impl.m_type) {
-    case BooleanOrStringOrUnrestrictedDouble::SpecificTypeNone:
-        return v8::Null(isolate);
-    case BooleanOrStringOrUnrestrictedDouble::SpecificTypeBoolean:
-        return v8Boolean(impl.getAsBoolean(), isolate);
-    case BooleanOrStringOrUnrestrictedDouble::SpecificTypeString:
-        return v8String(isolate, impl.getAsString());
-    case BooleanOrStringOrUnrestrictedDouble::SpecificTypeUnrestrictedDouble:
-        return v8::Number::New(isolate, impl.getAsUnrestrictedDouble());
-    default:
-        ASSERT_NOT_REACHED();
-    }
-    return v8::Local<v8::Value>();
-}
-
-BooleanOrStringOrUnrestrictedDouble NativeValueTraits<BooleanOrStringOrUnrestrictedDouble>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
-{
-    BooleanOrStringOrUnrestrictedDouble impl;
-    V8BooleanOrStringOrUnrestrictedDouble::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
-    return impl;
-}
-
-DoubleOrString::DoubleOrString()
-    : m_type(SpecificTypeNone)
-{
-}
-
-double DoubleOrString::getAsDouble() const
-{
-    ASSERT(isDouble());
-    return m_double;
-}
-
-void DoubleOrString::setDouble(double value)
-{
-    ASSERT(isNull());
-    m_double = value;
-    m_type = SpecificTypeDouble;
-}
-
-DoubleOrString DoubleOrString::fromDouble(double value)
-{
-    DoubleOrString container;
-    container.setDouble(value);
-    return container;
-}
-
-String DoubleOrString::getAsString() const
-{
-    ASSERT(isString());
-    return m_string;
-}
-
-void DoubleOrString::setString(String value)
-{
-    ASSERT(isNull());
-    m_string = value;
-    m_type = SpecificTypeString;
-}
-
-DoubleOrString DoubleOrString::fromString(String value)
-{
-    DoubleOrString container;
-    container.setString(value);
-    return container;
-}
-
-DoubleOrString::DoubleOrString(const DoubleOrString&) = default;
-DoubleOrString::~DoubleOrString() = default;
-DoubleOrString& DoubleOrString::operator=(const DoubleOrString&) = default;
-
-DEFINE_TRACE(DoubleOrString)
-{
-}
-
-void V8DoubleOrString::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, DoubleOrString& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
-{
-    if (v8Value.IsEmpty())
-        return;
-
-    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
-        return;
-
-    if (v8Value->IsNumber()) {
-        double cppValue = toRestrictedDouble(isolate, v8Value, exceptionState);
-        if (exceptionState.hadException())
-            return;
-        impl.setDouble(cppValue);
-        return;
-    }
-
-    {
-        V8StringResource<> cppValue = v8Value;
-        if (!cppValue.prepare(exceptionState))
-            return;
-        impl.setString(cppValue);
-        return;
-    }
-
-}
-
-v8::Local<v8::Value> toV8(const DoubleOrString& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
-{
-    switch (impl.m_type) {
-    case DoubleOrString::SpecificTypeNone:
-        return v8::Null(isolate);
-    case DoubleOrString::SpecificTypeDouble:
-        return v8::Number::New(isolate, impl.getAsDouble());
-    case DoubleOrString::SpecificTypeString:
-        return v8String(isolate, impl.getAsString());
-    default:
-        ASSERT_NOT_REACHED();
-    }
-    return v8::Local<v8::Value>();
-}
-
-DoubleOrString NativeValueTraits<DoubleOrString>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
-{
-    DoubleOrString impl;
-    V8DoubleOrString::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
-    return impl;
-}
-
-LongOrTestDictionary::LongOrTestDictionary()
-    : m_type(SpecificTypeNone)
-{
-}
-
-int LongOrTestDictionary::getAsLong() const
-{
-    ASSERT(isLong());
-    return m_long;
-}
-
-void LongOrTestDictionary::setLong(int value)
-{
-    ASSERT(isNull());
-    m_long = value;
-    m_type = SpecificTypeLong;
-}
-
-LongOrTestDictionary LongOrTestDictionary::fromLong(int value)
-{
-    LongOrTestDictionary container;
-    container.setLong(value);
-    return container;
-}
-
-TestDictionary LongOrTestDictionary::getAsTestDictionary() const
-{
-    ASSERT(isTestDictionary());
-    return m_testDictionary;
-}
-
-void LongOrTestDictionary::setTestDictionary(TestDictionary value)
-{
-    ASSERT(isNull());
-    m_testDictionary = value;
-    m_type = SpecificTypeTestDictionary;
-}
-
-LongOrTestDictionary LongOrTestDictionary::fromTestDictionary(TestDictionary value)
-{
-    LongOrTestDictionary container;
-    container.setTestDictionary(value);
-    return container;
-}
-
-LongOrTestDictionary::LongOrTestDictionary(const LongOrTestDictionary&) = default;
-LongOrTestDictionary::~LongOrTestDictionary() = default;
-LongOrTestDictionary& LongOrTestDictionary::operator=(const LongOrTestDictionary&) = default;
-
-DEFINE_TRACE(LongOrTestDictionary)
-{
-    visitor->trace(m_testDictionary);
-}
-
-void V8LongOrTestDictionary::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, LongOrTestDictionary& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
-{
-    if (v8Value.IsEmpty())
-        return;
-
-    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
-        return;
-
-    if (isUndefinedOrNull(v8Value) || v8Value->IsObject()) {
-        TestDictionary cppValue;
-        V8TestDictionary::toImpl(isolate, v8Value, cppValue, exceptionState);
-        if (exceptionState.hadException())
-            return;
-        impl.setTestDictionary(cppValue);
-        return;
-    }
-
-    if (v8Value->IsNumber()) {
-        int cppValue = toInt32(isolate, v8Value, NormalConversion, exceptionState);
-        if (exceptionState.hadException())
-            return;
-        impl.setLong(cppValue);
-        return;
-    }
-
-    {
-        int cppValue = toInt32(isolate, v8Value, NormalConversion, exceptionState);
-        if (exceptionState.hadException())
-            return;
-        impl.setLong(cppValue);
-        return;
-    }
-
-}
-
-v8::Local<v8::Value> toV8(const LongOrTestDictionary& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
-{
-    switch (impl.m_type) {
-    case LongOrTestDictionary::SpecificTypeNone:
-        return v8::Null(isolate);
-    case LongOrTestDictionary::SpecificTypeLong:
-        return v8::Integer::New(isolate, impl.getAsLong());
-    case LongOrTestDictionary::SpecificTypeTestDictionary:
-        return toV8(impl.getAsTestDictionary(), creationContext, isolate);
-    default:
-        ASSERT_NOT_REACHED();
-    }
-    return v8::Local<v8::Value>();
-}
-
-LongOrTestDictionary NativeValueTraits<LongOrTestDictionary>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
-{
-    LongOrTestDictionary impl;
-    V8LongOrTestDictionary::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
-    return impl;
-}
-
-NodeOrNodeList::NodeOrNodeList()
-    : m_type(SpecificTypeNone)
-{
-}
-
-Node* NodeOrNodeList::getAsNode() const
-{
-    ASSERT(isNode());
-    return m_node;
-}
-
-void NodeOrNodeList::setNode(Node* value)
-{
-    ASSERT(isNull());
-    m_node = value;
-    m_type = SpecificTypeNode;
-}
-
-NodeOrNodeList NodeOrNodeList::fromNode(Node* value)
-{
-    NodeOrNodeList container;
-    container.setNode(value);
-    return container;
-}
-
-NodeList* NodeOrNodeList::getAsNodeList() const
-{
-    ASSERT(isNodeList());
-    return m_nodeList;
-}
-
-void NodeOrNodeList::setNodeList(NodeList* value)
-{
-    ASSERT(isNull());
-    m_nodeList = value;
-    m_type = SpecificTypeNodeList;
-}
-
-NodeOrNodeList NodeOrNodeList::fromNodeList(NodeList* value)
-{
-    NodeOrNodeList container;
-    container.setNodeList(value);
-    return container;
-}
-
-NodeOrNodeList::NodeOrNodeList(const NodeOrNodeList&) = default;
-NodeOrNodeList::~NodeOrNodeList() = default;
-NodeOrNodeList& NodeOrNodeList::operator=(const NodeOrNodeList&) = default;
-
-DEFINE_TRACE(NodeOrNodeList)
-{
-    visitor->trace(m_node);
-    visitor->trace(m_nodeList);
-}
-
-void V8NodeOrNodeList::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, NodeOrNodeList& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
-{
-    if (v8Value.IsEmpty())
-        return;
-
-    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
-        return;
-
-    if (V8Node::hasInstance(v8Value, isolate)) {
-        Node* cppValue = V8Node::toImpl(v8::Local<v8::Object>::Cast(v8Value));
-        impl.setNode(cppValue);
-        return;
-    }
-
-    if (V8NodeList::hasInstance(v8Value, isolate)) {
-        NodeList* cppValue = V8NodeList::toImpl(v8::Local<v8::Object>::Cast(v8Value));
-        impl.setNodeList(cppValue);
-        return;
-    }
-
-    exceptionState.throwTypeError("The provided value is not of type '(Node or NodeList)'");
-}
-
-v8::Local<v8::Value> toV8(const NodeOrNodeList& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
-{
-    switch (impl.m_type) {
-    case NodeOrNodeList::SpecificTypeNone:
-        return v8::Null(isolate);
-    case NodeOrNodeList::SpecificTypeNode:
-        return toV8(impl.getAsNode(), creationContext, isolate);
-    case NodeOrNodeList::SpecificTypeNodeList:
-        return toV8(impl.getAsNodeList(), creationContext, isolate);
-    default:
-        ASSERT_NOT_REACHED();
-    }
-    return v8::Local<v8::Value>();
-}
-
-NodeOrNodeList NativeValueTraits<NodeOrNodeList>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
-{
-    NodeOrNodeList impl;
-    V8NodeOrNodeList::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
-    return impl;
-}
-
-StringOrArrayBufferOrArrayBufferView::StringOrArrayBufferOrArrayBufferView()
-    : m_type(SpecificTypeNone)
-{
-}
-
-String StringOrArrayBufferOrArrayBufferView::getAsString() const
-{
-    ASSERT(isString());
-    return m_string;
-}
-
-void StringOrArrayBufferOrArrayBufferView::setString(String value)
-{
-    ASSERT(isNull());
-    m_string = value;
-    m_type = SpecificTypeString;
-}
-
-StringOrArrayBufferOrArrayBufferView StringOrArrayBufferOrArrayBufferView::fromString(String value)
-{
-    StringOrArrayBufferOrArrayBufferView container;
-    container.setString(value);
-    return container;
-}
-
-TestArrayBuffer* StringOrArrayBufferOrArrayBufferView::getAsArrayBuffer() const
-{
-    ASSERT(isArrayBuffer());
-    return m_arrayBuffer;
-}
-
-void StringOrArrayBufferOrArrayBufferView::setArrayBuffer(TestArrayBuffer* value)
-{
-    ASSERT(isNull());
-    m_arrayBuffer = value;
-    m_type = SpecificTypeArrayBuffer;
-}
-
-StringOrArrayBufferOrArrayBufferView StringOrArrayBufferOrArrayBufferView::fromArrayBuffer(TestArrayBuffer* value)
-{
-    StringOrArrayBufferOrArrayBufferView container;
-    container.setArrayBuffer(value);
-    return container;
-}
-
-TestArrayBufferView* StringOrArrayBufferOrArrayBufferView::getAsArrayBufferView() const
-{
-    ASSERT(isArrayBufferView());
-    return m_arrayBufferView;
-}
-
-void StringOrArrayBufferOrArrayBufferView::setArrayBufferView(TestArrayBufferView* value)
-{
-    ASSERT(isNull());
-    m_arrayBufferView = value;
-    m_type = SpecificTypeArrayBufferView;
-}
-
-StringOrArrayBufferOrArrayBufferView StringOrArrayBufferOrArrayBufferView::fromArrayBufferView(TestArrayBufferView* value)
-{
-    StringOrArrayBufferOrArrayBufferView container;
-    container.setArrayBufferView(value);
-    return container;
-}
-
-StringOrArrayBufferOrArrayBufferView::StringOrArrayBufferOrArrayBufferView(const StringOrArrayBufferOrArrayBufferView&) = default;
-StringOrArrayBufferOrArrayBufferView::~StringOrArrayBufferOrArrayBufferView() = default;
-StringOrArrayBufferOrArrayBufferView& StringOrArrayBufferOrArrayBufferView::operator=(const StringOrArrayBufferOrArrayBufferView&) = default;
-
-DEFINE_TRACE(StringOrArrayBufferOrArrayBufferView)
-{
-    visitor->trace(m_arrayBuffer);
-    visitor->trace(m_arrayBufferView);
-}
-
-void V8StringOrArrayBufferOrArrayBufferView::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, StringOrArrayBufferOrArrayBufferView& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
-{
-    if (v8Value.IsEmpty())
-        return;
-
-    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
-        return;
-
-    if (V8ArrayBuffer::hasInstance(v8Value, isolate)) {
-        TestArrayBuffer* cppValue = V8ArrayBuffer::toImpl(v8::Local<v8::Object>::Cast(v8Value));
-        impl.setArrayBuffer(cppValue);
-        return;
-    }
-
-    if (V8ArrayBufferView::hasInstance(v8Value, isolate)) {
-        TestArrayBufferView* cppValue = V8ArrayBufferView::toImpl(v8::Local<v8::Object>::Cast(v8Value));
-        impl.setArrayBufferView(cppValue);
-        return;
-    }
-
-    {
-        V8StringResource<> cppValue = v8Value;
-        if (!cppValue.prepare(exceptionState))
-            return;
-        impl.setString(cppValue);
-        return;
-    }
-
-}
-
-v8::Local<v8::Value> toV8(const StringOrArrayBufferOrArrayBufferView& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
-{
-    switch (impl.m_type) {
-    case StringOrArrayBufferOrArrayBufferView::SpecificTypeNone:
-        return v8::Null(isolate);
-    case StringOrArrayBufferOrArrayBufferView::SpecificTypeString:
-        return v8String(isolate, impl.getAsString());
-    case StringOrArrayBufferOrArrayBufferView::SpecificTypeArrayBuffer:
-        return toV8(impl.getAsArrayBuffer(), creationContext, isolate);
-    case StringOrArrayBufferOrArrayBufferView::SpecificTypeArrayBufferView:
-        return toV8(impl.getAsArrayBufferView(), creationContext, isolate);
-    default:
-        ASSERT_NOT_REACHED();
-    }
-    return v8::Local<v8::Value>();
-}
-
-StringOrArrayBufferOrArrayBufferView NativeValueTraits<StringOrArrayBufferOrArrayBufferView>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
-{
-    StringOrArrayBufferOrArrayBufferView impl;
-    V8StringOrArrayBufferOrArrayBufferView::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
-    return impl;
-}
-
-StringOrDouble::StringOrDouble()
-    : m_type(SpecificTypeNone)
-{
-}
-
-String StringOrDouble::getAsString() const
-{
-    ASSERT(isString());
-    return m_string;
-}
-
-void StringOrDouble::setString(String value)
-{
-    ASSERT(isNull());
-    m_string = value;
-    m_type = SpecificTypeString;
-}
-
-StringOrDouble StringOrDouble::fromString(String value)
-{
-    StringOrDouble container;
-    container.setString(value);
-    return container;
-}
-
-double StringOrDouble::getAsDouble() const
-{
-    ASSERT(isDouble());
-    return m_double;
-}
-
-void StringOrDouble::setDouble(double value)
-{
-    ASSERT(isNull());
-    m_double = value;
-    m_type = SpecificTypeDouble;
-}
-
-StringOrDouble StringOrDouble::fromDouble(double value)
-{
-    StringOrDouble container;
-    container.setDouble(value);
-    return container;
-}
-
-StringOrDouble::StringOrDouble(const StringOrDouble&) = default;
-StringOrDouble::~StringOrDouble() = default;
-StringOrDouble& StringOrDouble::operator=(const StringOrDouble&) = default;
-
-DEFINE_TRACE(StringOrDouble)
-{
-}
-
-void V8StringOrDouble::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, StringOrDouble& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
-{
-    if (v8Value.IsEmpty())
-        return;
-
-    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
-        return;
-
-    if (v8Value->IsNumber()) {
-        double cppValue = toRestrictedDouble(isolate, v8Value, exceptionState);
-        if (exceptionState.hadException())
-            return;
-        impl.setDouble(cppValue);
-        return;
-    }
-
-    {
-        V8StringResource<> cppValue = v8Value;
-        if (!cppValue.prepare(exceptionState))
-            return;
-        impl.setString(cppValue);
-        return;
-    }
-
-}
-
-v8::Local<v8::Value> toV8(const StringOrDouble& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
-{
-    switch (impl.m_type) {
-    case StringOrDouble::SpecificTypeNone:
-        return v8::Null(isolate);
-    case StringOrDouble::SpecificTypeString:
-        return v8String(isolate, impl.getAsString());
-    case StringOrDouble::SpecificTypeDouble:
-        return v8::Number::New(isolate, impl.getAsDouble());
-    default:
-        ASSERT_NOT_REACHED();
-    }
-    return v8::Local<v8::Value>();
-}
-
-StringOrDouble NativeValueTraits<StringOrDouble>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
-{
-    StringOrDouble impl;
-    V8StringOrDouble::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
-    return impl;
-}
-
-StringOrStringSequence::StringOrStringSequence()
-    : m_type(SpecificTypeNone)
-{
-}
-
-String StringOrStringSequence::getAsString() const
-{
-    ASSERT(isString());
-    return m_string;
-}
-
-void StringOrStringSequence::setString(String value)
-{
-    ASSERT(isNull());
-    m_string = value;
-    m_type = SpecificTypeString;
-}
-
-StringOrStringSequence StringOrStringSequence::fromString(String value)
-{
-    StringOrStringSequence container;
-    container.setString(value);
-    return container;
-}
-
-const Vector<String>& StringOrStringSequence::getAsStringSequence() const
-{
-    ASSERT(isStringSequence());
-    return m_stringSequence;
-}
-
-void StringOrStringSequence::setStringSequence(const Vector<String>& value)
-{
-    ASSERT(isNull());
-    m_stringSequence = value;
-    m_type = SpecificTypeStringSequence;
-}
-
-StringOrStringSequence StringOrStringSequence::fromStringSequence(const Vector<String>& value)
-{
-    StringOrStringSequence container;
-    container.setStringSequence(value);
-    return container;
-}
-
-StringOrStringSequence::StringOrStringSequence(const StringOrStringSequence&) = default;
-StringOrStringSequence::~StringOrStringSequence() = default;
-StringOrStringSequence& StringOrStringSequence::operator=(const StringOrStringSequence&) = default;
-
-DEFINE_TRACE(StringOrStringSequence)
-{
-}
-
-void V8StringOrStringSequence::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, StringOrStringSequence& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
-{
-    if (v8Value.IsEmpty())
-        return;
-
-    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
-        return;
-
-    if (v8Value->IsArray()) {
-        Vector<String> cppValue = toImplArray<Vector<String>>(v8Value, 0, isolate, exceptionState);
-        if (exceptionState.hadException())
-            return;
-        impl.setStringSequence(cppValue);
-        return;
-    }
-
-    {
-        V8StringResource<> cppValue = v8Value;
-        if (!cppValue.prepare(exceptionState))
-            return;
-        impl.setString(cppValue);
-        return;
-    }
-
-}
-
-v8::Local<v8::Value> toV8(const StringOrStringSequence& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
-{
-    switch (impl.m_type) {
-    case StringOrStringSequence::SpecificTypeNone:
-        return v8::Null(isolate);
-    case StringOrStringSequence::SpecificTypeString:
-        return v8String(isolate, impl.getAsString());
-    case StringOrStringSequence::SpecificTypeStringSequence:
-        return toV8(impl.getAsStringSequence(), creationContext, isolate);
-    default:
-        ASSERT_NOT_REACHED();
-    }
-    return v8::Local<v8::Value>();
-}
-
-StringOrStringSequence NativeValueTraits<StringOrStringSequence>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
-{
-    StringOrStringSequence impl;
-    V8StringOrStringSequence::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
-    return impl;
-}
-
-TestEnumOrDouble::TestEnumOrDouble()
-    : m_type(SpecificTypeNone)
-{
-}
-
-String TestEnumOrDouble::getAsTestEnum() const
-{
-    ASSERT(isTestEnum());
-    return m_testEnum;
-}
-
-void TestEnumOrDouble::setTestEnum(String value)
-{
-    ASSERT(isNull());
-    NonThrowableExceptionState exceptionState;
-    const char* validValues[] = {
-        "",
-        "EnumValue1",
-        "EnumValue2",
-        "EnumValue3",
-    };
-    if (!isValidEnum(value, validValues, WTF_ARRAY_LENGTH(validValues), "TestEnum", exceptionState)) {
-        ASSERT_NOT_REACHED();
-        return;
-    }
-    m_testEnum = value;
-    m_type = SpecificTypeTestEnum;
-}
-
-TestEnumOrDouble TestEnumOrDouble::fromTestEnum(String value)
-{
-    TestEnumOrDouble container;
-    container.setTestEnum(value);
-    return container;
-}
-
-double TestEnumOrDouble::getAsDouble() const
-{
-    ASSERT(isDouble());
-    return m_double;
-}
-
-void TestEnumOrDouble::setDouble(double value)
-{
-    ASSERT(isNull());
-    m_double = value;
-    m_type = SpecificTypeDouble;
-}
-
-TestEnumOrDouble TestEnumOrDouble::fromDouble(double value)
-{
-    TestEnumOrDouble container;
-    container.setDouble(value);
-    return container;
-}
-
-TestEnumOrDouble::TestEnumOrDouble(const TestEnumOrDouble&) = default;
-TestEnumOrDouble::~TestEnumOrDouble() = default;
-TestEnumOrDouble& TestEnumOrDouble::operator=(const TestEnumOrDouble&) = default;
-
-DEFINE_TRACE(TestEnumOrDouble)
-{
-}
-
-void V8TestEnumOrDouble::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, TestEnumOrDouble& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
-{
-    if (v8Value.IsEmpty())
-        return;
-
-    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
-        return;
-
-    if (v8Value->IsNumber()) {
-        double cppValue = toRestrictedDouble(isolate, v8Value, exceptionState);
-        if (exceptionState.hadException())
-            return;
-        impl.setDouble(cppValue);
-        return;
-    }
-
-    {
-        V8StringResource<> cppValue = v8Value;
-        if (!cppValue.prepare(exceptionState))
-            return;
-        const char* validValues[] = {
-            "",
-            "EnumValue1",
-            "EnumValue2",
-            "EnumValue3",
-        };
-        if (!isValidEnum(cppValue, validValues, WTF_ARRAY_LENGTH(validValues), "TestEnum", exceptionState))
-            return;
-        impl.setTestEnum(cppValue);
-        return;
-    }
-
-}
-
-v8::Local<v8::Value> toV8(const TestEnumOrDouble& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
-{
-    switch (impl.m_type) {
-    case TestEnumOrDouble::SpecificTypeNone:
-        return v8::Null(isolate);
-    case TestEnumOrDouble::SpecificTypeTestEnum:
-        return v8String(isolate, impl.getAsTestEnum());
-    case TestEnumOrDouble::SpecificTypeDouble:
-        return v8::Number::New(isolate, impl.getAsDouble());
-    default:
-        ASSERT_NOT_REACHED();
-    }
-    return v8::Local<v8::Value>();
-}
-
-TestEnumOrDouble NativeValueTraits<TestEnumOrDouble>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
-{
-    TestEnumOrDouble impl;
-    V8TestEnumOrDouble::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
-    return impl;
-}
-
-TestInterface2OrUint8Array::TestInterface2OrUint8Array()
-    : m_type(SpecificTypeNone)
-{
-}
-
-TestInterface2* TestInterface2OrUint8Array::getAsTestInterface2() const
-{
-    ASSERT(isTestInterface2());
-    return m_testInterface2;
-}
-
-void TestInterface2OrUint8Array::setTestInterface2(TestInterface2* value)
-{
-    ASSERT(isNull());
-    m_testInterface2 = value;
-    m_type = SpecificTypeTestInterface2;
-}
-
-TestInterface2OrUint8Array TestInterface2OrUint8Array::fromTestInterface2(TestInterface2* value)
-{
-    TestInterface2OrUint8Array container;
-    container.setTestInterface2(value);
-    return container;
-}
-
-DOMUint8Array* TestInterface2OrUint8Array::getAsUint8Array() const
-{
-    ASSERT(isUint8Array());
-    return m_uint8Array;
-}
-
-void TestInterface2OrUint8Array::setUint8Array(DOMUint8Array* value)
-{
-    ASSERT(isNull());
-    m_uint8Array = value;
-    m_type = SpecificTypeUint8Array;
-}
-
-TestInterface2OrUint8Array TestInterface2OrUint8Array::fromUint8Array(DOMUint8Array* value)
-{
-    TestInterface2OrUint8Array container;
-    container.setUint8Array(value);
-    return container;
-}
-
-TestInterface2OrUint8Array::TestInterface2OrUint8Array(const TestInterface2OrUint8Array&) = default;
-TestInterface2OrUint8Array::~TestInterface2OrUint8Array() = default;
-TestInterface2OrUint8Array& TestInterface2OrUint8Array::operator=(const TestInterface2OrUint8Array&) = default;
-
-DEFINE_TRACE(TestInterface2OrUint8Array)
-{
-    visitor->trace(m_testInterface2);
-    visitor->trace(m_uint8Array);
-}
-
-void V8TestInterface2OrUint8Array::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, TestInterface2OrUint8Array& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
-{
-    if (v8Value.IsEmpty())
-        return;
-
-    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
-        return;
-
-    if (V8TestInterface2::hasInstance(v8Value, isolate)) {
-        TestInterface2* cppValue = V8TestInterface2::toImpl(v8::Local<v8::Object>::Cast(v8Value));
-        impl.setTestInterface2(cppValue);
-        return;
-    }
-
-    if (V8Uint8Array::hasInstance(v8Value, isolate)) {
-        DOMUint8Array* cppValue = V8Uint8Array::toImpl(v8::Local<v8::Object>::Cast(v8Value));
-        impl.setUint8Array(cppValue);
-        return;
-    }
-
-    exceptionState.throwTypeError("The provided value is not of type '(TestInterface2 or Uint8Array)'");
-}
-
-v8::Local<v8::Value> toV8(const TestInterface2OrUint8Array& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
-{
-    switch (impl.m_type) {
-    case TestInterface2OrUint8Array::SpecificTypeNone:
-        return v8::Null(isolate);
-    case TestInterface2OrUint8Array::SpecificTypeTestInterface2:
-        return toV8(impl.getAsTestInterface2(), creationContext, isolate);
-    case TestInterface2OrUint8Array::SpecificTypeUint8Array:
-        return toV8(impl.getAsUint8Array(), creationContext, isolate);
-    default:
-        ASSERT_NOT_REACHED();
-    }
-    return v8::Local<v8::Value>();
-}
-
-TestInterface2OrUint8Array NativeValueTraits<TestInterface2OrUint8Array>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
-{
-    TestInterface2OrUint8Array impl;
-    V8TestInterface2OrUint8Array::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
-    return impl;
-}
-
-TestInterfaceGarbageCollectedOrString::TestInterfaceGarbageCollectedOrString()
-    : m_type(SpecificTypeNone)
-{
-}
-
-TestInterfaceGarbageCollected* TestInterfaceGarbageCollectedOrString::getAsTestInterfaceGarbageCollected() const
-{
-    ASSERT(isTestInterfaceGarbageCollected());
-    return m_testInterfaceGarbageCollected;
-}
-
-void TestInterfaceGarbageCollectedOrString::setTestInterfaceGarbageCollected(TestInterfaceGarbageCollected* value)
-{
-    ASSERT(isNull());
-    m_testInterfaceGarbageCollected = value;
-    m_type = SpecificTypeTestInterfaceGarbageCollected;
-}
-
-TestInterfaceGarbageCollectedOrString TestInterfaceGarbageCollectedOrString::fromTestInterfaceGarbageCollected(TestInterfaceGarbageCollected* value)
-{
-    TestInterfaceGarbageCollectedOrString container;
-    container.setTestInterfaceGarbageCollected(value);
-    return container;
-}
-
-String TestInterfaceGarbageCollectedOrString::getAsString() const
-{
-    ASSERT(isString());
-    return m_string;
-}
-
-void TestInterfaceGarbageCollectedOrString::setString(String value)
-{
-    ASSERT(isNull());
-    m_string = value;
-    m_type = SpecificTypeString;
-}
-
-TestInterfaceGarbageCollectedOrString TestInterfaceGarbageCollectedOrString::fromString(String value)
-{
-    TestInterfaceGarbageCollectedOrString container;
-    container.setString(value);
-    return container;
-}
-
-TestInterfaceGarbageCollectedOrString::TestInterfaceGarbageCollectedOrString(const TestInterfaceGarbageCollectedOrString&) = default;
-TestInterfaceGarbageCollectedOrString::~TestInterfaceGarbageCollectedOrString() = default;
-TestInterfaceGarbageCollectedOrString& TestInterfaceGarbageCollectedOrString::operator=(const TestInterfaceGarbageCollectedOrString&) = default;
-
-DEFINE_TRACE(TestInterfaceGarbageCollectedOrString)
-{
-    visitor->trace(m_testInterfaceGarbageCollected);
-}
-
-void V8TestInterfaceGarbageCollectedOrString::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, TestInterfaceGarbageCollectedOrString& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
-{
-    if (v8Value.IsEmpty())
-        return;
-
-    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
-        return;
-
-    if (V8TestInterfaceGarbageCollected::hasInstance(v8Value, isolate)) {
-        TestInterfaceGarbageCollected* cppValue = V8TestInterfaceGarbageCollected::toImpl(v8::Local<v8::Object>::Cast(v8Value));
-        impl.setTestInterfaceGarbageCollected(cppValue);
-        return;
-    }
-
-    {
-        V8StringResource<> cppValue = v8Value;
-        if (!cppValue.prepare(exceptionState))
-            return;
-        impl.setString(cppValue);
-        return;
-    }
-
-}
-
-v8::Local<v8::Value> toV8(const TestInterfaceGarbageCollectedOrString& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
-{
-    switch (impl.m_type) {
-    case TestInterfaceGarbageCollectedOrString::SpecificTypeNone:
-        return v8::Null(isolate);
-    case TestInterfaceGarbageCollectedOrString::SpecificTypeTestInterfaceGarbageCollected:
-        return toV8(impl.getAsTestInterfaceGarbageCollected(), creationContext, isolate);
-    case TestInterfaceGarbageCollectedOrString::SpecificTypeString:
-        return v8String(isolate, impl.getAsString());
-    default:
-        ASSERT_NOT_REACHED();
-    }
-    return v8::Local<v8::Value>();
-}
-
-TestInterfaceGarbageCollectedOrString NativeValueTraits<TestInterfaceGarbageCollectedOrString>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
-{
-    TestInterfaceGarbageCollectedOrString impl;
-    V8TestInterfaceGarbageCollectedOrString::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
-    return impl;
-}
-
-TestInterfaceOrLong::TestInterfaceOrLong()
-    : m_type(SpecificTypeNone)
-{
-}
-
-TestInterfaceImplementation* TestInterfaceOrLong::getAsTestInterface() const
-{
-    ASSERT(isTestInterface());
-    return m_testInterface;
-}
-
-void TestInterfaceOrLong::setTestInterface(TestInterfaceImplementation* value)
-{
-    ASSERT(isNull());
-    m_testInterface = value;
-    m_type = SpecificTypeTestInterface;
-}
-
-TestInterfaceOrLong TestInterfaceOrLong::fromTestInterface(TestInterfaceImplementation* value)
-{
-    TestInterfaceOrLong container;
-    container.setTestInterface(value);
-    return container;
-}
-
-int TestInterfaceOrLong::getAsLong() const
-{
-    ASSERT(isLong());
-    return m_long;
-}
-
-void TestInterfaceOrLong::setLong(int value)
-{
-    ASSERT(isNull());
-    m_long = value;
-    m_type = SpecificTypeLong;
-}
-
-TestInterfaceOrLong TestInterfaceOrLong::fromLong(int value)
-{
-    TestInterfaceOrLong container;
-    container.setLong(value);
-    return container;
-}
-
-TestInterfaceOrLong::TestInterfaceOrLong(const TestInterfaceOrLong&) = default;
-TestInterfaceOrLong::~TestInterfaceOrLong() = default;
-TestInterfaceOrLong& TestInterfaceOrLong::operator=(const TestInterfaceOrLong&) = default;
-
-DEFINE_TRACE(TestInterfaceOrLong)
-{
-    visitor->trace(m_testInterface);
-}
-
-void V8TestInterfaceOrLong::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, TestInterfaceOrLong& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
-{
-    if (v8Value.IsEmpty())
-        return;
-
-    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
-        return;
-
-    if (V8TestInterface::hasInstance(v8Value, isolate)) {
-        TestInterfaceImplementation* cppValue = V8TestInterface::toImpl(v8::Local<v8::Object>::Cast(v8Value));
-        impl.setTestInterface(cppValue);
-        return;
-    }
-
-    if (v8Value->IsNumber()) {
-        int cppValue = toInt32(isolate, v8Value, NormalConversion, exceptionState);
-        if (exceptionState.hadException())
-            return;
-        impl.setLong(cppValue);
-        return;
-    }
-
-    {
-        int cppValue = toInt32(isolate, v8Value, NormalConversion, exceptionState);
-        if (exceptionState.hadException())
-            return;
-        impl.setLong(cppValue);
-        return;
-    }
-
-}
-
-v8::Local<v8::Value> toV8(const TestInterfaceOrLong& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
-{
-    switch (impl.m_type) {
-    case TestInterfaceOrLong::SpecificTypeNone:
-        return v8::Null(isolate);
-    case TestInterfaceOrLong::SpecificTypeTestInterface:
-        return toV8(impl.getAsTestInterface(), creationContext, isolate);
-    case TestInterfaceOrLong::SpecificTypeLong:
-        return v8::Integer::New(isolate, impl.getAsLong());
-    default:
-        ASSERT_NOT_REACHED();
-    }
-    return v8::Local<v8::Value>();
-}
-
-TestInterfaceOrLong NativeValueTraits<TestInterfaceOrLong>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
-{
-    TestInterfaceOrLong impl;
-    V8TestInterfaceOrLong::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
-    return impl;
-}
-
-TestInterfaceOrTestInterfaceEmpty::TestInterfaceOrTestInterfaceEmpty()
-    : m_type(SpecificTypeNone)
-{
-}
-
-TestInterfaceImplementation* TestInterfaceOrTestInterfaceEmpty::getAsTestInterface() const
-{
-    ASSERT(isTestInterface());
-    return m_testInterface;
-}
-
-void TestInterfaceOrTestInterfaceEmpty::setTestInterface(TestInterfaceImplementation* value)
-{
-    ASSERT(isNull());
-    m_testInterface = value;
-    m_type = SpecificTypeTestInterface;
-}
-
-TestInterfaceOrTestInterfaceEmpty TestInterfaceOrTestInterfaceEmpty::fromTestInterface(TestInterfaceImplementation* value)
-{
-    TestInterfaceOrTestInterfaceEmpty container;
-    container.setTestInterface(value);
-    return container;
-}
-
-TestInterfaceEmpty* TestInterfaceOrTestInterfaceEmpty::getAsTestInterfaceEmpty() const
-{
-    ASSERT(isTestInterfaceEmpty());
-    return m_testInterfaceEmpty;
-}
-
-void TestInterfaceOrTestInterfaceEmpty::setTestInterfaceEmpty(TestInterfaceEmpty* value)
-{
-    ASSERT(isNull());
-    m_testInterfaceEmpty = value;
-    m_type = SpecificTypeTestInterfaceEmpty;
-}
-
-TestInterfaceOrTestInterfaceEmpty TestInterfaceOrTestInterfaceEmpty::fromTestInterfaceEmpty(TestInterfaceEmpty* value)
-{
-    TestInterfaceOrTestInterfaceEmpty container;
-    container.setTestInterfaceEmpty(value);
-    return container;
-}
-
-TestInterfaceOrTestInterfaceEmpty::TestInterfaceOrTestInterfaceEmpty(const TestInterfaceOrTestInterfaceEmpty&) = default;
-TestInterfaceOrTestInterfaceEmpty::~TestInterfaceOrTestInterfaceEmpty() = default;
-TestInterfaceOrTestInterfaceEmpty& TestInterfaceOrTestInterfaceEmpty::operator=(const TestInterfaceOrTestInterfaceEmpty&) = default;
-
-DEFINE_TRACE(TestInterfaceOrTestInterfaceEmpty)
-{
-    visitor->trace(m_testInterface);
-    visitor->trace(m_testInterfaceEmpty);
-}
-
-void V8TestInterfaceOrTestInterfaceEmpty::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, TestInterfaceOrTestInterfaceEmpty& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
-{
-    if (v8Value.IsEmpty())
-        return;
-
-    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
-        return;
-
-    if (V8TestInterface::hasInstance(v8Value, isolate)) {
-        TestInterfaceImplementation* cppValue = V8TestInterface::toImpl(v8::Local<v8::Object>::Cast(v8Value));
-        impl.setTestInterface(cppValue);
-        return;
-    }
-
-    if (V8TestInterfaceEmpty::hasInstance(v8Value, isolate)) {
-        TestInterfaceEmpty* cppValue = V8TestInterfaceEmpty::toImpl(v8::Local<v8::Object>::Cast(v8Value));
-        impl.setTestInterfaceEmpty(cppValue);
-        return;
-    }
-
-    exceptionState.throwTypeError("The provided value is not of type '(TestInterface or TestInterfaceEmpty)'");
-}
-
-v8::Local<v8::Value> toV8(const TestInterfaceOrTestInterfaceEmpty& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
-{
-    switch (impl.m_type) {
-    case TestInterfaceOrTestInterfaceEmpty::SpecificTypeNone:
-        return v8::Null(isolate);
-    case TestInterfaceOrTestInterfaceEmpty::SpecificTypeTestInterface:
-        return toV8(impl.getAsTestInterface(), creationContext, isolate);
-    case TestInterfaceOrTestInterfaceEmpty::SpecificTypeTestInterfaceEmpty:
-        return toV8(impl.getAsTestInterfaceEmpty(), creationContext, isolate);
-    default:
-        ASSERT_NOT_REACHED();
-    }
-    return v8::Local<v8::Value>();
-}
-
-TestInterfaceOrTestInterfaceEmpty NativeValueTraits<TestInterfaceOrTestInterfaceEmpty>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
-{
-    TestInterfaceOrTestInterfaceEmpty impl;
-    V8TestInterfaceOrTestInterfaceEmpty::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
-    return impl;
-}
-
-UnrestrictedDoubleOrString::UnrestrictedDoubleOrString()
-    : m_type(SpecificTypeNone)
-{
-}
-
-double UnrestrictedDoubleOrString::getAsUnrestrictedDouble() const
-{
-    ASSERT(isUnrestrictedDouble());
-    return m_unrestrictedDouble;
-}
-
-void UnrestrictedDoubleOrString::setUnrestrictedDouble(double value)
-{
-    ASSERT(isNull());
-    m_unrestrictedDouble = value;
-    m_type = SpecificTypeUnrestrictedDouble;
-}
-
-UnrestrictedDoubleOrString UnrestrictedDoubleOrString::fromUnrestrictedDouble(double value)
-{
-    UnrestrictedDoubleOrString container;
-    container.setUnrestrictedDouble(value);
-    return container;
-}
-
-String UnrestrictedDoubleOrString::getAsString() const
-{
-    ASSERT(isString());
-    return m_string;
-}
-
-void UnrestrictedDoubleOrString::setString(String value)
-{
-    ASSERT(isNull());
-    m_string = value;
-    m_type = SpecificTypeString;
-}
-
-UnrestrictedDoubleOrString UnrestrictedDoubleOrString::fromString(String value)
-{
-    UnrestrictedDoubleOrString container;
-    container.setString(value);
-    return container;
-}
-
-UnrestrictedDoubleOrString::UnrestrictedDoubleOrString(const UnrestrictedDoubleOrString&) = default;
-UnrestrictedDoubleOrString::~UnrestrictedDoubleOrString() = default;
-UnrestrictedDoubleOrString& UnrestrictedDoubleOrString::operator=(const UnrestrictedDoubleOrString&) = default;
-
-DEFINE_TRACE(UnrestrictedDoubleOrString)
-{
-}
-
-void V8UnrestrictedDoubleOrString::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, UnrestrictedDoubleOrString& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
-{
-    if (v8Value.IsEmpty())
-        return;
-
-    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
-        return;
-
-    if (v8Value->IsNumber()) {
-        double cppValue = toDouble(isolate, v8Value, exceptionState);
-        if (exceptionState.hadException())
-            return;
-        impl.setUnrestrictedDouble(cppValue);
-        return;
-    }
-
-    {
-        V8StringResource<> cppValue = v8Value;
-        if (!cppValue.prepare(exceptionState))
-            return;
-        impl.setString(cppValue);
-        return;
-    }
-
-}
-
-v8::Local<v8::Value> toV8(const UnrestrictedDoubleOrString& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
-{
-    switch (impl.m_type) {
-    case UnrestrictedDoubleOrString::SpecificTypeNone:
-        return v8::Null(isolate);
-    case UnrestrictedDoubleOrString::SpecificTypeUnrestrictedDouble:
-        return v8::Number::New(isolate, impl.getAsUnrestrictedDouble());
-    case UnrestrictedDoubleOrString::SpecificTypeString:
-        return v8String(isolate, impl.getAsString());
-    default:
-        ASSERT_NOT_REACHED();
-    }
-    return v8::Local<v8::Value>();
-}
-
-UnrestrictedDoubleOrString NativeValueTraits<UnrestrictedDoubleOrString>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
-{
-    UnrestrictedDoubleOrString impl;
-    V8UnrestrictedDoubleOrString::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
-    return impl;
-}
-
-} // namespace blink
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/UnionTypesCore.h b/third_party/WebKit/Source/bindings/tests/results/core/UnionTypesCore.h
deleted file mode 100644
index dc08b7b..0000000
--- a/third_party/WebKit/Source/bindings/tests/results/core/UnionTypesCore.h
+++ /dev/null
@@ -1,813 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
-
-#ifndef UnionTypeCore_h
-#define UnionTypeCore_h
-
-#include "bindings/core/v8/Dictionary.h"
-#include "bindings/core/v8/ExceptionState.h"
-#include "bindings/core/v8/V8Binding.h"
-#include "bindings/core/v8/V8TestDictionary.h"
-#include "core/CoreExport.h"
-#include "platform/heap/Handle.h"
-
-namespace blink {
-
-class DOMUint8Array;
-class Node;
-class NodeList;
-class TestArrayBuffer;
-class TestArrayBufferView;
-class TestInterface2;
-class TestInterfaceEmpty;
-class TestInterfaceGarbageCollected;
-class TestInterfaceImplementation;
-
-class CORE_EXPORT ArrayBufferOrArrayBufferViewOrDictionary final {
-    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
-public:
-    ArrayBufferOrArrayBufferViewOrDictionary();
-    bool isNull() const { return m_type == SpecificTypeNone; }
-
-    bool isArrayBuffer() const { return m_type == SpecificTypeArrayBuffer; }
-    TestArrayBuffer* getAsArrayBuffer() const;
-    void setArrayBuffer(TestArrayBuffer*);
-    static ArrayBufferOrArrayBufferViewOrDictionary fromArrayBuffer(TestArrayBuffer*);
-
-    bool isArrayBufferView() const { return m_type == SpecificTypeArrayBufferView; }
-    TestArrayBufferView* getAsArrayBufferView() const;
-    void setArrayBufferView(TestArrayBufferView*);
-    static ArrayBufferOrArrayBufferViewOrDictionary fromArrayBufferView(TestArrayBufferView*);
-
-    bool isDictionary() const { return m_type == SpecificTypeDictionary; }
-    Dictionary getAsDictionary() const;
-    void setDictionary(Dictionary);
-    static ArrayBufferOrArrayBufferViewOrDictionary fromDictionary(Dictionary);
-
-    ArrayBufferOrArrayBufferViewOrDictionary(const ArrayBufferOrArrayBufferViewOrDictionary&);
-    ~ArrayBufferOrArrayBufferViewOrDictionary();
-    ArrayBufferOrArrayBufferViewOrDictionary& operator=(const ArrayBufferOrArrayBufferViewOrDictionary&);
-    DECLARE_TRACE();
-
-private:
-    enum SpecificTypes {
-        SpecificTypeNone,
-        SpecificTypeArrayBuffer,
-        SpecificTypeArrayBufferView,
-        SpecificTypeDictionary,
-    };
-    SpecificTypes m_type;
-
-    Member<TestArrayBuffer> m_arrayBuffer;
-    Member<TestArrayBufferView> m_arrayBufferView;
-    Dictionary m_dictionary;
-
-    friend CORE_EXPORT v8::Local<v8::Value> toV8(const ArrayBufferOrArrayBufferViewOrDictionary&, v8::Local<v8::Object>, v8::Isolate*);
-};
-
-class V8ArrayBufferOrArrayBufferViewOrDictionary final {
-public:
-    CORE_EXPORT static void toImpl(v8::Isolate*, v8::Local<v8::Value>, ArrayBufferOrArrayBufferViewOrDictionary&, UnionTypeConversionMode, ExceptionState&);
-};
-
-CORE_EXPORT v8::Local<v8::Value> toV8(const ArrayBufferOrArrayBufferViewOrDictionary&, v8::Local<v8::Object>, v8::Isolate*);
-
-template <class CallbackInfo>
-inline void v8SetReturnValue(const CallbackInfo& callbackInfo, ArrayBufferOrArrayBufferViewOrDictionary& impl)
-{
-    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
-}
-
-template <>
-struct NativeValueTraits<ArrayBufferOrArrayBufferViewOrDictionary> {
-    CORE_EXPORT static ArrayBufferOrArrayBufferViewOrDictionary nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
-};
-
-class CORE_EXPORT BooleanOrStringOrUnrestrictedDouble final {
-    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
-public:
-    BooleanOrStringOrUnrestrictedDouble();
-    bool isNull() const { return m_type == SpecificTypeNone; }
-
-    bool isBoolean() const { return m_type == SpecificTypeBoolean; }
-    bool getAsBoolean() const;
-    void setBoolean(bool);
-    static BooleanOrStringOrUnrestrictedDouble fromBoolean(bool);
-
-    bool isString() const { return m_type == SpecificTypeString; }
-    String getAsString() const;
-    void setString(String);
-    static BooleanOrStringOrUnrestrictedDouble fromString(String);
-
-    bool isUnrestrictedDouble() const { return m_type == SpecificTypeUnrestrictedDouble; }
-    double getAsUnrestrictedDouble() const;
-    void setUnrestrictedDouble(double);
-    static BooleanOrStringOrUnrestrictedDouble fromUnrestrictedDouble(double);
-
-    BooleanOrStringOrUnrestrictedDouble(const BooleanOrStringOrUnrestrictedDouble&);
-    ~BooleanOrStringOrUnrestrictedDouble();
-    BooleanOrStringOrUnrestrictedDouble& operator=(const BooleanOrStringOrUnrestrictedDouble&);
-    DECLARE_TRACE();
-
-private:
-    enum SpecificTypes {
-        SpecificTypeNone,
-        SpecificTypeBoolean,
-        SpecificTypeString,
-        SpecificTypeUnrestrictedDouble,
-    };
-    SpecificTypes m_type;
-
-    bool m_boolean;
-    String m_string;
-    double m_unrestrictedDouble;
-
-    friend CORE_EXPORT v8::Local<v8::Value> toV8(const BooleanOrStringOrUnrestrictedDouble&, v8::Local<v8::Object>, v8::Isolate*);
-};
-
-class V8BooleanOrStringOrUnrestrictedDouble final {
-public:
-    CORE_EXPORT static void toImpl(v8::Isolate*, v8::Local<v8::Value>, BooleanOrStringOrUnrestrictedDouble&, UnionTypeConversionMode, ExceptionState&);
-};
-
-CORE_EXPORT v8::Local<v8::Value> toV8(const BooleanOrStringOrUnrestrictedDouble&, v8::Local<v8::Object>, v8::Isolate*);
-
-template <class CallbackInfo>
-inline void v8SetReturnValue(const CallbackInfo& callbackInfo, BooleanOrStringOrUnrestrictedDouble& impl)
-{
-    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
-}
-
-template <>
-struct NativeValueTraits<BooleanOrStringOrUnrestrictedDouble> {
-    CORE_EXPORT static BooleanOrStringOrUnrestrictedDouble nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
-};
-
-class CORE_EXPORT DoubleOrString final {
-    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
-public:
-    DoubleOrString();
-    bool isNull() const { return m_type == SpecificTypeNone; }
-
-    bool isDouble() const { return m_type == SpecificTypeDouble; }
-    double getAsDouble() const;
-    void setDouble(double);
-    static DoubleOrString fromDouble(double);
-
-    bool isString() const { return m_type == SpecificTypeString; }
-    String getAsString() const;
-    void setString(String);
-    static DoubleOrString fromString(String);
-
-    DoubleOrString(const DoubleOrString&);
-    ~DoubleOrString();
-    DoubleOrString& operator=(const DoubleOrString&);
-    DECLARE_TRACE();
-
-private:
-    enum SpecificTypes {
-        SpecificTypeNone,
-        SpecificTypeDouble,
-        SpecificTypeString,
-    };
-    SpecificTypes m_type;
-
-    double m_double;
-    String m_string;
-
-    friend CORE_EXPORT v8::Local<v8::Value> toV8(const DoubleOrString&, v8::Local<v8::Object>, v8::Isolate*);
-};
-
-class V8DoubleOrString final {
-public:
-    CORE_EXPORT static void toImpl(v8::Isolate*, v8::Local<v8::Value>, DoubleOrString&, UnionTypeConversionMode, ExceptionState&);
-};
-
-CORE_EXPORT v8::Local<v8::Value> toV8(const DoubleOrString&, v8::Local<v8::Object>, v8::Isolate*);
-
-template <class CallbackInfo>
-inline void v8SetReturnValue(const CallbackInfo& callbackInfo, DoubleOrString& impl)
-{
-    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
-}
-
-template <>
-struct NativeValueTraits<DoubleOrString> {
-    CORE_EXPORT static DoubleOrString nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
-};
-
-class CORE_EXPORT LongOrTestDictionary final {
-    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
-public:
-    LongOrTestDictionary();
-    bool isNull() const { return m_type == SpecificTypeNone; }
-
-    bool isLong() const { return m_type == SpecificTypeLong; }
-    int getAsLong() const;
-    void setLong(int);
-    static LongOrTestDictionary fromLong(int);
-
-    bool isTestDictionary() const { return m_type == SpecificTypeTestDictionary; }
-    TestDictionary getAsTestDictionary() const;
-    void setTestDictionary(TestDictionary);
-    static LongOrTestDictionary fromTestDictionary(TestDictionary);
-
-    LongOrTestDictionary(const LongOrTestDictionary&);
-    ~LongOrTestDictionary();
-    LongOrTestDictionary& operator=(const LongOrTestDictionary&);
-    DECLARE_TRACE();
-
-private:
-    enum SpecificTypes {
-        SpecificTypeNone,
-        SpecificTypeLong,
-        SpecificTypeTestDictionary,
-    };
-    SpecificTypes m_type;
-
-    int m_long;
-    TestDictionary m_testDictionary;
-
-    friend CORE_EXPORT v8::Local<v8::Value> toV8(const LongOrTestDictionary&, v8::Local<v8::Object>, v8::Isolate*);
-};
-
-class V8LongOrTestDictionary final {
-public:
-    CORE_EXPORT static void toImpl(v8::Isolate*, v8::Local<v8::Value>, LongOrTestDictionary&, UnionTypeConversionMode, ExceptionState&);
-};
-
-CORE_EXPORT v8::Local<v8::Value> toV8(const LongOrTestDictionary&, v8::Local<v8::Object>, v8::Isolate*);
-
-template <class CallbackInfo>
-inline void v8SetReturnValue(const CallbackInfo& callbackInfo, LongOrTestDictionary& impl)
-{
-    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
-}
-
-template <>
-struct NativeValueTraits<LongOrTestDictionary> {
-    CORE_EXPORT static LongOrTestDictionary nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
-};
-
-class CORE_EXPORT NodeOrNodeList final {
-    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
-public:
-    NodeOrNodeList();
-    bool isNull() const { return m_type == SpecificTypeNone; }
-
-    bool isNode() const { return m_type == SpecificTypeNode; }
-    Node* getAsNode() const;
-    void setNode(Node*);
-    static NodeOrNodeList fromNode(Node*);
-
-    bool isNodeList() const { return m_type == SpecificTypeNodeList; }
-    NodeList* getAsNodeList() const;
-    void setNodeList(NodeList*);
-    static NodeOrNodeList fromNodeList(NodeList*);
-
-    NodeOrNodeList(const NodeOrNodeList&);
-    ~NodeOrNodeList();
-    NodeOrNodeList& operator=(const NodeOrNodeList&);
-    DECLARE_TRACE();
-
-private:
-    enum SpecificTypes {
-        SpecificTypeNone,
-        SpecificTypeNode,
-        SpecificTypeNodeList,
-    };
-    SpecificTypes m_type;
-
-    Member<Node> m_node;
-    Member<NodeList> m_nodeList;
-
-    friend CORE_EXPORT v8::Local<v8::Value> toV8(const NodeOrNodeList&, v8::Local<v8::Object>, v8::Isolate*);
-};
-
-class V8NodeOrNodeList final {
-public:
-    CORE_EXPORT static void toImpl(v8::Isolate*, v8::Local<v8::Value>, NodeOrNodeList&, UnionTypeConversionMode, ExceptionState&);
-};
-
-CORE_EXPORT v8::Local<v8::Value> toV8(const NodeOrNodeList&, v8::Local<v8::Object>, v8::Isolate*);
-
-template <class CallbackInfo>
-inline void v8SetReturnValue(const CallbackInfo& callbackInfo, NodeOrNodeList& impl)
-{
-    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
-}
-
-template <>
-struct NativeValueTraits<NodeOrNodeList> {
-    CORE_EXPORT static NodeOrNodeList nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
-};
-
-class CORE_EXPORT StringOrArrayBufferOrArrayBufferView final {
-    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
-public:
-    StringOrArrayBufferOrArrayBufferView();
-    bool isNull() const { return m_type == SpecificTypeNone; }
-
-    bool isString() const { return m_type == SpecificTypeString; }
-    String getAsString() const;
-    void setString(String);
-    static StringOrArrayBufferOrArrayBufferView fromString(String);
-
-    bool isArrayBuffer() const { return m_type == SpecificTypeArrayBuffer; }
-    TestArrayBuffer* getAsArrayBuffer() const;
-    void setArrayBuffer(TestArrayBuffer*);
-    static StringOrArrayBufferOrArrayBufferView fromArrayBuffer(TestArrayBuffer*);
-
-    bool isArrayBufferView() const { return m_type == SpecificTypeArrayBufferView; }
-    TestArrayBufferView* getAsArrayBufferView() const;
-    void setArrayBufferView(TestArrayBufferView*);
-    static StringOrArrayBufferOrArrayBufferView fromArrayBufferView(TestArrayBufferView*);
-
-    StringOrArrayBufferOrArrayBufferView(const StringOrArrayBufferOrArrayBufferView&);
-    ~StringOrArrayBufferOrArrayBufferView();
-    StringOrArrayBufferOrArrayBufferView& operator=(const StringOrArrayBufferOrArrayBufferView&);
-    DECLARE_TRACE();
-
-private:
-    enum SpecificTypes {
-        SpecificTypeNone,
-        SpecificTypeString,
-        SpecificTypeArrayBuffer,
-        SpecificTypeArrayBufferView,
-    };
-    SpecificTypes m_type;
-
-    String m_string;
-    Member<TestArrayBuffer> m_arrayBuffer;
-    Member<TestArrayBufferView> m_arrayBufferView;
-
-    friend CORE_EXPORT v8::Local<v8::Value> toV8(const StringOrArrayBufferOrArrayBufferView&, v8::Local<v8::Object>, v8::Isolate*);
-};
-
-class V8StringOrArrayBufferOrArrayBufferView final {
-public:
-    CORE_EXPORT static void toImpl(v8::Isolate*, v8::Local<v8::Value>, StringOrArrayBufferOrArrayBufferView&, UnionTypeConversionMode, ExceptionState&);
-};
-
-CORE_EXPORT v8::Local<v8::Value> toV8(const StringOrArrayBufferOrArrayBufferView&, v8::Local<v8::Object>, v8::Isolate*);
-
-template <class CallbackInfo>
-inline void v8SetReturnValue(const CallbackInfo& callbackInfo, StringOrArrayBufferOrArrayBufferView& impl)
-{
-    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
-}
-
-template <>
-struct NativeValueTraits<StringOrArrayBufferOrArrayBufferView> {
-    CORE_EXPORT static StringOrArrayBufferOrArrayBufferView nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
-};
-
-class CORE_EXPORT StringOrDouble final {
-    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
-public:
-    StringOrDouble();
-    bool isNull() const { return m_type == SpecificTypeNone; }
-
-    bool isString() const { return m_type == SpecificTypeString; }
-    String getAsString() const;
-    void setString(String);
-    static StringOrDouble fromString(String);
-
-    bool isDouble() const { return m_type == SpecificTypeDouble; }
-    double getAsDouble() const;
-    void setDouble(double);
-    static StringOrDouble fromDouble(double);
-
-    StringOrDouble(const StringOrDouble&);
-    ~StringOrDouble();
-    StringOrDouble& operator=(const StringOrDouble&);
-    DECLARE_TRACE();
-
-private:
-    enum SpecificTypes {
-        SpecificTypeNone,
-        SpecificTypeString,
-        SpecificTypeDouble,
-    };
-    SpecificTypes m_type;
-
-    String m_string;
-    double m_double;
-
-    friend CORE_EXPORT v8::Local<v8::Value> toV8(const StringOrDouble&, v8::Local<v8::Object>, v8::Isolate*);
-};
-
-class V8StringOrDouble final {
-public:
-    CORE_EXPORT static void toImpl(v8::Isolate*, v8::Local<v8::Value>, StringOrDouble&, UnionTypeConversionMode, ExceptionState&);
-};
-
-CORE_EXPORT v8::Local<v8::Value> toV8(const StringOrDouble&, v8::Local<v8::Object>, v8::Isolate*);
-
-template <class CallbackInfo>
-inline void v8SetReturnValue(const CallbackInfo& callbackInfo, StringOrDouble& impl)
-{
-    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
-}
-
-template <>
-struct NativeValueTraits<StringOrDouble> {
-    CORE_EXPORT static StringOrDouble nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
-};
-
-class CORE_EXPORT StringOrStringSequence final {
-    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
-public:
-    StringOrStringSequence();
-    bool isNull() const { return m_type == SpecificTypeNone; }
-
-    bool isString() const { return m_type == SpecificTypeString; }
-    String getAsString() const;
-    void setString(String);
-    static StringOrStringSequence fromString(String);
-
-    bool isStringSequence() const { return m_type == SpecificTypeStringSequence; }
-    const Vector<String>& getAsStringSequence() const;
-    void setStringSequence(const Vector<String>&);
-    static StringOrStringSequence fromStringSequence(const Vector<String>&);
-
-    StringOrStringSequence(const StringOrStringSequence&);
-    ~StringOrStringSequence();
-    StringOrStringSequence& operator=(const StringOrStringSequence&);
-    DECLARE_TRACE();
-
-private:
-    enum SpecificTypes {
-        SpecificTypeNone,
-        SpecificTypeString,
-        SpecificTypeStringSequence,
-    };
-    SpecificTypes m_type;
-
-    String m_string;
-    Vector<String> m_stringSequence;
-
-    friend CORE_EXPORT v8::Local<v8::Value> toV8(const StringOrStringSequence&, v8::Local<v8::Object>, v8::Isolate*);
-};
-
-class V8StringOrStringSequence final {
-public:
-    CORE_EXPORT static void toImpl(v8::Isolate*, v8::Local<v8::Value>, StringOrStringSequence&, UnionTypeConversionMode, ExceptionState&);
-};
-
-CORE_EXPORT v8::Local<v8::Value> toV8(const StringOrStringSequence&, v8::Local<v8::Object>, v8::Isolate*);
-
-template <class CallbackInfo>
-inline void v8SetReturnValue(const CallbackInfo& callbackInfo, StringOrStringSequence& impl)
-{
-    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
-}
-
-template <>
-struct NativeValueTraits<StringOrStringSequence> {
-    CORE_EXPORT static StringOrStringSequence nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
-};
-
-class CORE_EXPORT TestEnumOrDouble final {
-    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
-public:
-    TestEnumOrDouble();
-    bool isNull() const { return m_type == SpecificTypeNone; }
-
-    bool isTestEnum() const { return m_type == SpecificTypeTestEnum; }
-    String getAsTestEnum() const;
-    void setTestEnum(String);
-    static TestEnumOrDouble fromTestEnum(String);
-
-    bool isDouble() const { return m_type == SpecificTypeDouble; }
-    double getAsDouble() const;
-    void setDouble(double);
-    static TestEnumOrDouble fromDouble(double);
-
-    TestEnumOrDouble(const TestEnumOrDouble&);
-    ~TestEnumOrDouble();
-    TestEnumOrDouble& operator=(const TestEnumOrDouble&);
-    DECLARE_TRACE();
-
-private:
-    enum SpecificTypes {
-        SpecificTypeNone,
-        SpecificTypeTestEnum,
-        SpecificTypeDouble,
-    };
-    SpecificTypes m_type;
-
-    String m_testEnum;
-    double m_double;
-
-    friend CORE_EXPORT v8::Local<v8::Value> toV8(const TestEnumOrDouble&, v8::Local<v8::Object>, v8::Isolate*);
-};
-
-class V8TestEnumOrDouble final {
-public:
-    CORE_EXPORT static void toImpl(v8::Isolate*, v8::Local<v8::Value>, TestEnumOrDouble&, UnionTypeConversionMode, ExceptionState&);
-};
-
-CORE_EXPORT v8::Local<v8::Value> toV8(const TestEnumOrDouble&, v8::Local<v8::Object>, v8::Isolate*);
-
-template <class CallbackInfo>
-inline void v8SetReturnValue(const CallbackInfo& callbackInfo, TestEnumOrDouble& impl)
-{
-    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
-}
-
-template <>
-struct NativeValueTraits<TestEnumOrDouble> {
-    CORE_EXPORT static TestEnumOrDouble nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
-};
-
-class CORE_EXPORT TestInterface2OrUint8Array final {
-    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
-public:
-    TestInterface2OrUint8Array();
-    bool isNull() const { return m_type == SpecificTypeNone; }
-
-    bool isTestInterface2() const { return m_type == SpecificTypeTestInterface2; }
-    TestInterface2* getAsTestInterface2() const;
-    void setTestInterface2(TestInterface2*);
-    static TestInterface2OrUint8Array fromTestInterface2(TestInterface2*);
-
-    bool isUint8Array() const { return m_type == SpecificTypeUint8Array; }
-    DOMUint8Array* getAsUint8Array() const;
-    void setUint8Array(DOMUint8Array*);
-    static TestInterface2OrUint8Array fromUint8Array(DOMUint8Array*);
-
-    TestInterface2OrUint8Array(const TestInterface2OrUint8Array&);
-    ~TestInterface2OrUint8Array();
-    TestInterface2OrUint8Array& operator=(const TestInterface2OrUint8Array&);
-    DECLARE_TRACE();
-
-private:
-    enum SpecificTypes {
-        SpecificTypeNone,
-        SpecificTypeTestInterface2,
-        SpecificTypeUint8Array,
-    };
-    SpecificTypes m_type;
-
-    Member<TestInterface2> m_testInterface2;
-    Member<DOMUint8Array> m_uint8Array;
-
-    friend CORE_EXPORT v8::Local<v8::Value> toV8(const TestInterface2OrUint8Array&, v8::Local<v8::Object>, v8::Isolate*);
-};
-
-class V8TestInterface2OrUint8Array final {
-public:
-    CORE_EXPORT static void toImpl(v8::Isolate*, v8::Local<v8::Value>, TestInterface2OrUint8Array&, UnionTypeConversionMode, ExceptionState&);
-};
-
-CORE_EXPORT v8::Local<v8::Value> toV8(const TestInterface2OrUint8Array&, v8::Local<v8::Object>, v8::Isolate*);
-
-template <class CallbackInfo>
-inline void v8SetReturnValue(const CallbackInfo& callbackInfo, TestInterface2OrUint8Array& impl)
-{
-    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
-}
-
-template <>
-struct NativeValueTraits<TestInterface2OrUint8Array> {
-    CORE_EXPORT static TestInterface2OrUint8Array nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
-};
-
-class CORE_EXPORT TestInterfaceGarbageCollectedOrString final {
-    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
-public:
-    TestInterfaceGarbageCollectedOrString();
-    bool isNull() const { return m_type == SpecificTypeNone; }
-
-    bool isTestInterfaceGarbageCollected() const { return m_type == SpecificTypeTestInterfaceGarbageCollected; }
-    TestInterfaceGarbageCollected* getAsTestInterfaceGarbageCollected() const;
-    void setTestInterfaceGarbageCollected(TestInterfaceGarbageCollected*);
-    static TestInterfaceGarbageCollectedOrString fromTestInterfaceGarbageCollected(TestInterfaceGarbageCollected*);
-
-    bool isString() const { return m_type == SpecificTypeString; }
-    String getAsString() const;
-    void setString(String);
-    static TestInterfaceGarbageCollectedOrString fromString(String);
-
-    TestInterfaceGarbageCollectedOrString(const TestInterfaceGarbageCollectedOrString&);
-    ~TestInterfaceGarbageCollectedOrString();
-    TestInterfaceGarbageCollectedOrString& operator=(const TestInterfaceGarbageCollectedOrString&);
-    DECLARE_TRACE();
-
-private:
-    enum SpecificTypes {
-        SpecificTypeNone,
-        SpecificTypeTestInterfaceGarbageCollected,
-        SpecificTypeString,
-    };
-    SpecificTypes m_type;
-
-    Member<TestInterfaceGarbageCollected> m_testInterfaceGarbageCollected;
-    String m_string;
-
-    friend CORE_EXPORT v8::Local<v8::Value> toV8(const TestInterfaceGarbageCollectedOrString&, v8::Local<v8::Object>, v8::Isolate*);
-};
-
-class V8TestInterfaceGarbageCollectedOrString final {
-public:
-    CORE_EXPORT static void toImpl(v8::Isolate*, v8::Local<v8::Value>, TestInterfaceGarbageCollectedOrString&, UnionTypeConversionMode, ExceptionState&);
-};
-
-CORE_EXPORT v8::Local<v8::Value> toV8(const TestInterfaceGarbageCollectedOrString&, v8::Local<v8::Object>, v8::Isolate*);
-
-template <class CallbackInfo>
-inline void v8SetReturnValue(const CallbackInfo& callbackInfo, TestInterfaceGarbageCollectedOrString& impl)
-{
-    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
-}
-
-template <>
-struct NativeValueTraits<TestInterfaceGarbageCollectedOrString> {
-    CORE_EXPORT static TestInterfaceGarbageCollectedOrString nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
-};
-
-class CORE_EXPORT TestInterfaceOrLong final {
-    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
-public:
-    TestInterfaceOrLong();
-    bool isNull() const { return m_type == SpecificTypeNone; }
-
-    bool isTestInterface() const { return m_type == SpecificTypeTestInterface; }
-    TestInterfaceImplementation* getAsTestInterface() const;
-    void setTestInterface(TestInterfaceImplementation*);
-    static TestInterfaceOrLong fromTestInterface(TestInterfaceImplementation*);
-
-    bool isLong() const { return m_type == SpecificTypeLong; }
-    int getAsLong() const;
-    void setLong(int);
-    static TestInterfaceOrLong fromLong(int);
-
-    TestInterfaceOrLong(const TestInterfaceOrLong&);
-    ~TestInterfaceOrLong();
-    TestInterfaceOrLong& operator=(const TestInterfaceOrLong&);
-    DECLARE_TRACE();
-
-private:
-    enum SpecificTypes {
-        SpecificTypeNone,
-        SpecificTypeTestInterface,
-        SpecificTypeLong,
-    };
-    SpecificTypes m_type;
-
-    Member<TestInterfaceImplementation> m_testInterface;
-    int m_long;
-
-    friend CORE_EXPORT v8::Local<v8::Value> toV8(const TestInterfaceOrLong&, v8::Local<v8::Object>, v8::Isolate*);
-};
-
-class V8TestInterfaceOrLong final {
-public:
-    CORE_EXPORT static void toImpl(v8::Isolate*, v8::Local<v8::Value>, TestInterfaceOrLong&, UnionTypeConversionMode, ExceptionState&);
-};
-
-CORE_EXPORT v8::Local<v8::Value> toV8(const TestInterfaceOrLong&, v8::Local<v8::Object>, v8::Isolate*);
-
-template <class CallbackInfo>
-inline void v8SetReturnValue(const CallbackInfo& callbackInfo, TestInterfaceOrLong& impl)
-{
-    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
-}
-
-template <>
-struct NativeValueTraits<TestInterfaceOrLong> {
-    CORE_EXPORT static TestInterfaceOrLong nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
-};
-
-class CORE_EXPORT TestInterfaceOrTestInterfaceEmpty final {
-    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
-public:
-    TestInterfaceOrTestInterfaceEmpty();
-    bool isNull() const { return m_type == SpecificTypeNone; }
-
-    bool isTestInterface() const { return m_type == SpecificTypeTestInterface; }
-    TestInterfaceImplementation* getAsTestInterface() const;
-    void setTestInterface(TestInterfaceImplementation*);
-    static TestInterfaceOrTestInterfaceEmpty fromTestInterface(TestInterfaceImplementation*);
-
-    bool isTestInterfaceEmpty() const { return m_type == SpecificTypeTestInterfaceEmpty; }
-    TestInterfaceEmpty* getAsTestInterfaceEmpty() const;
-    void setTestInterfaceEmpty(TestInterfaceEmpty*);
-    static TestInterfaceOrTestInterfaceEmpty fromTestInterfaceEmpty(TestInterfaceEmpty*);
-
-    TestInterfaceOrTestInterfaceEmpty(const TestInterfaceOrTestInterfaceEmpty&);
-    ~TestInterfaceOrTestInterfaceEmpty();
-    TestInterfaceOrTestInterfaceEmpty& operator=(const TestInterfaceOrTestInterfaceEmpty&);
-    DECLARE_TRACE();
-
-private:
-    enum SpecificTypes {
-        SpecificTypeNone,
-        SpecificTypeTestInterface,
-        SpecificTypeTestInterfaceEmpty,
-    };
-    SpecificTypes m_type;
-
-    Member<TestInterfaceImplementation> m_testInterface;
-    Member<TestInterfaceEmpty> m_testInterfaceEmpty;
-
-    friend CORE_EXPORT v8::Local<v8::Value> toV8(const TestInterfaceOrTestInterfaceEmpty&, v8::Local<v8::Object>, v8::Isolate*);
-};
-
-class V8TestInterfaceOrTestInterfaceEmpty final {
-public:
-    CORE_EXPORT static void toImpl(v8::Isolate*, v8::Local<v8::Value>, TestInterfaceOrTestInterfaceEmpty&, UnionTypeConversionMode, ExceptionState&);
-};
-
-CORE_EXPORT v8::Local<v8::Value> toV8(const TestInterfaceOrTestInterfaceEmpty&, v8::Local<v8::Object>, v8::Isolate*);
-
-template <class CallbackInfo>
-inline void v8SetReturnValue(const CallbackInfo& callbackInfo, TestInterfaceOrTestInterfaceEmpty& impl)
-{
-    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
-}
-
-template <>
-struct NativeValueTraits<TestInterfaceOrTestInterfaceEmpty> {
-    CORE_EXPORT static TestInterfaceOrTestInterfaceEmpty nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
-};
-
-class CORE_EXPORT UnrestrictedDoubleOrString final {
-    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
-public:
-    UnrestrictedDoubleOrString();
-    bool isNull() const { return m_type == SpecificTypeNone; }
-
-    bool isUnrestrictedDouble() const { return m_type == SpecificTypeUnrestrictedDouble; }
-    double getAsUnrestrictedDouble() const;
-    void setUnrestrictedDouble(double);
-    static UnrestrictedDoubleOrString fromUnrestrictedDouble(double);
-
-    bool isString() const { return m_type == SpecificTypeString; }
-    String getAsString() const;
-    void setString(String);
-    static UnrestrictedDoubleOrString fromString(String);
-
-    UnrestrictedDoubleOrString(const UnrestrictedDoubleOrString&);
-    ~UnrestrictedDoubleOrString();
-    UnrestrictedDoubleOrString& operator=(const UnrestrictedDoubleOrString&);
-    DECLARE_TRACE();
-
-private:
-    enum SpecificTypes {
-        SpecificTypeNone,
-        SpecificTypeUnrestrictedDouble,
-        SpecificTypeString,
-    };
-    SpecificTypes m_type;
-
-    double m_unrestrictedDouble;
-    String m_string;
-
-    friend CORE_EXPORT v8::Local<v8::Value> toV8(const UnrestrictedDoubleOrString&, v8::Local<v8::Object>, v8::Isolate*);
-};
-
-class V8UnrestrictedDoubleOrString final {
-public:
-    CORE_EXPORT static void toImpl(v8::Isolate*, v8::Local<v8::Value>, UnrestrictedDoubleOrString&, UnionTypeConversionMode, ExceptionState&);
-};
-
-CORE_EXPORT v8::Local<v8::Value> toV8(const UnrestrictedDoubleOrString&, v8::Local<v8::Object>, v8::Isolate*);
-
-template <class CallbackInfo>
-inline void v8SetReturnValue(const CallbackInfo& callbackInfo, UnrestrictedDoubleOrString& impl)
-{
-    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
-}
-
-template <>
-struct NativeValueTraits<UnrestrictedDoubleOrString> {
-    CORE_EXPORT static UnrestrictedDoubleOrString nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
-};
-
-} // namespace blink
-
-// We need to set canInitializeWithMemset=true because HeapVector supports
-// items that can initialize with memset or have a vtable. It is safe to
-// set canInitializeWithMemset=true for a union type object in practice.
-// See https://codereview.chromium.org/1118993002/#msg5 for more details.
-WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::ArrayBufferOrArrayBufferViewOrDictionary);
-WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::BooleanOrStringOrUnrestrictedDouble);
-WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::DoubleOrString);
-WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::LongOrTestDictionary);
-WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::NodeOrNodeList);
-WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::StringOrArrayBufferOrArrayBufferView);
-WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::StringOrDouble);
-WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::StringOrStringSequence);
-WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::TestEnumOrDouble);
-WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::TestInterface2OrUint8Array);
-WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::TestInterfaceGarbageCollectedOrString);
-WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::TestInterfaceOrLong);
-WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::TestInterfaceOrTestInterfaceEmpty);
-WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::UnrestrictedDoubleOrString);
-
-#endif // UnionTypeCore_h
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/UnrestrictedDoubleOrString.cpp b/third_party/WebKit/Source/bindings/tests/results/core/UnrestrictedDoubleOrString.cpp
new file mode 100644
index 0000000..fa4a24d
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/tests/results/core/UnrestrictedDoubleOrString.cpp
@@ -0,0 +1,114 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
+
+#include "UnrestrictedDoubleOrString.h"
+
+#include "bindings/core/v8/ToV8.h"
+
+namespace blink {
+
+UnrestrictedDoubleOrString::UnrestrictedDoubleOrString()
+    : m_type(SpecificTypeNone)
+{
+}
+
+double UnrestrictedDoubleOrString::getAsUnrestrictedDouble() const
+{
+    ASSERT(isUnrestrictedDouble());
+    return m_unrestrictedDouble;
+}
+
+void UnrestrictedDoubleOrString::setUnrestrictedDouble(double value)
+{
+    ASSERT(isNull());
+    m_unrestrictedDouble = value;
+    m_type = SpecificTypeUnrestrictedDouble;
+}
+
+UnrestrictedDoubleOrString UnrestrictedDoubleOrString::fromUnrestrictedDouble(double value)
+{
+    UnrestrictedDoubleOrString container;
+    container.setUnrestrictedDouble(value);
+    return container;
+}
+
+String UnrestrictedDoubleOrString::getAsString() const
+{
+    ASSERT(isString());
+    return m_string;
+}
+
+void UnrestrictedDoubleOrString::setString(String value)
+{
+    ASSERT(isNull());
+    m_string = value;
+    m_type = SpecificTypeString;
+}
+
+UnrestrictedDoubleOrString UnrestrictedDoubleOrString::fromString(String value)
+{
+    UnrestrictedDoubleOrString container;
+    container.setString(value);
+    return container;
+}
+
+UnrestrictedDoubleOrString::UnrestrictedDoubleOrString(const UnrestrictedDoubleOrString&) = default;
+UnrestrictedDoubleOrString::~UnrestrictedDoubleOrString() = default;
+UnrestrictedDoubleOrString& UnrestrictedDoubleOrString::operator=(const UnrestrictedDoubleOrString&) = default;
+
+DEFINE_TRACE(UnrestrictedDoubleOrString)
+{
+}
+
+void V8UnrestrictedDoubleOrString::toImpl(v8::Isolate* isolate, v8::Local<v8::Value> v8Value, UnrestrictedDoubleOrString& impl, UnionTypeConversionMode conversionMode, ExceptionState& exceptionState)
+{
+    if (v8Value.IsEmpty())
+        return;
+
+    if (conversionMode == UnionTypeConversionMode::Nullable && isUndefinedOrNull(v8Value))
+        return;
+
+    if (v8Value->IsNumber()) {
+        double cppValue = toDouble(isolate, v8Value, exceptionState);
+        if (exceptionState.hadException())
+            return;
+        impl.setUnrestrictedDouble(cppValue);
+        return;
+    }
+
+    {
+        V8StringResource<> cppValue = v8Value;
+        if (!cppValue.prepare(exceptionState))
+            return;
+        impl.setString(cppValue);
+        return;
+    }
+
+}
+
+v8::Local<v8::Value> toV8(const UnrestrictedDoubleOrString& impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
+{
+    switch (impl.m_type) {
+    case UnrestrictedDoubleOrString::SpecificTypeNone:
+        return v8::Null(isolate);
+    case UnrestrictedDoubleOrString::SpecificTypeUnrestrictedDouble:
+        return v8::Number::New(isolate, impl.getAsUnrestrictedDouble());
+    case UnrestrictedDoubleOrString::SpecificTypeString:
+        return v8String(isolate, impl.getAsString());
+    default:
+        ASSERT_NOT_REACHED();
+    }
+    return v8::Local<v8::Value>();
+}
+
+UnrestrictedDoubleOrString NativeValueTraits<UnrestrictedDoubleOrString>::nativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exceptionState)
+{
+    UnrestrictedDoubleOrString impl;
+    V8UnrestrictedDoubleOrString::toImpl(isolate, value, impl, UnionTypeConversionMode::NotNullable, exceptionState);
+    return impl;
+}
+
+} // namespace blink
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/UnrestrictedDoubleOrString.h b/third_party/WebKit/Source/bindings/tests/results/core/UnrestrictedDoubleOrString.h
new file mode 100644
index 0000000..d12b9b0
--- /dev/null
+++ b/third_party/WebKit/Source/bindings/tests/results/core/UnrestrictedDoubleOrString.h
@@ -0,0 +1,80 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
+
+#ifndef UnrestrictedDoubleOrString_h
+#define UnrestrictedDoubleOrString_h
+
+#include "bindings/core/v8/Dictionary.h"
+#include "bindings/core/v8/ExceptionState.h"
+#include "bindings/core/v8/V8Binding.h"
+#include "core/CoreExport.h"
+#include "platform/heap/Handle.h"
+
+namespace blink {
+
+
+class CORE_EXPORT UnrestrictedDoubleOrString final {
+    DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
+public:
+    UnrestrictedDoubleOrString();
+    bool isNull() const { return m_type == SpecificTypeNone; }
+
+    bool isUnrestrictedDouble() const { return m_type == SpecificTypeUnrestrictedDouble; }
+    double getAsUnrestrictedDouble() const;
+    void setUnrestrictedDouble(double);
+    static UnrestrictedDoubleOrString fromUnrestrictedDouble(double);
+
+    bool isString() const { return m_type == SpecificTypeString; }
+    String getAsString() const;
+    void setString(String);
+    static UnrestrictedDoubleOrString fromString(String);
+
+    UnrestrictedDoubleOrString(const UnrestrictedDoubleOrString&);
+    ~UnrestrictedDoubleOrString();
+    UnrestrictedDoubleOrString& operator=(const UnrestrictedDoubleOrString&);
+    DECLARE_TRACE();
+
+private:
+    enum SpecificTypes {
+        SpecificTypeNone,
+        SpecificTypeUnrestrictedDouble,
+        SpecificTypeString,
+    };
+    SpecificTypes m_type;
+
+    double m_unrestrictedDouble;
+    String m_string;
+
+    friend CORE_EXPORT v8::Local<v8::Value> toV8(const UnrestrictedDoubleOrString&, v8::Local<v8::Object>, v8::Isolate*);
+};
+
+class V8UnrestrictedDoubleOrString final {
+public:
+    CORE_EXPORT static void toImpl(v8::Isolate*, v8::Local<v8::Value>, UnrestrictedDoubleOrString&, UnionTypeConversionMode, ExceptionState&);
+};
+
+CORE_EXPORT v8::Local<v8::Value> toV8(const UnrestrictedDoubleOrString&, v8::Local<v8::Object>, v8::Isolate*);
+
+template <class CallbackInfo>
+inline void v8SetReturnValue(const CallbackInfo& callbackInfo, UnrestrictedDoubleOrString& impl)
+{
+    v8SetReturnValue(callbackInfo, toV8(impl, callbackInfo.Holder(), callbackInfo.GetIsolate()));
+}
+
+template <>
+struct NativeValueTraits<UnrestrictedDoubleOrString> {
+    CORE_EXPORT static UnrestrictedDoubleOrString nativeValue(v8::Isolate*, v8::Local<v8::Value>, ExceptionState&);
+};
+
+} // namespace blink
+
+// We need to set canInitializeWithMemset=true because HeapVector supports
+// items that can initialize with memset or have a vtable. It is safe to
+// set canInitializeWithMemset=true for a union type object in practice.
+// See https://codereview.chromium.org/1118993002/#msg5 for more details.
+WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::UnrestrictedDoubleOrString);
+
+#endif // UnrestrictedDoubleOrString_h
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestDictionary.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestDictionary.cpp
index ac071a5..94d0bb88 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestDictionary.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestDictionary.cpp
@@ -7,9 +7,10 @@
 #include "V8TestDictionary.h"
 
 #include "bindings/core/v8/Dictionary.h"
+#include "bindings/core/v8/DoubleOrString.h"
 #include "bindings/core/v8/ExceptionState.h"
 #include "bindings/core/v8/ScriptValue.h"
-#include "bindings/core/v8/UnionTypesCore.h"
+#include "bindings/core/v8/TestInterface2OrUint8Array.h"
 #include "bindings/core/v8/V8ArrayBufferView.h"
 #include "bindings/core/v8/V8Element.h"
 #include "bindings/core/v8/V8EventTarget.h"
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestDictionaryDerived.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestDictionaryDerived.cpp
index f0f01030..ac571d8 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestDictionaryDerived.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestDictionaryDerived.cpp
@@ -7,7 +7,6 @@
 #include "V8TestDictionaryDerived.h"
 
 #include "bindings/core/v8/ExceptionState.h"
-#include "bindings/core/v8/UnionTypesCore.h"
 #include "bindings/core/v8/V8TestDictionary.h"
 
 namespace blink {
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.cpp
index 2f8dde0..2f00995 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.cpp
@@ -11,7 +11,6 @@
 #include "bindings/core/v8/ScriptPromise.h"
 #include "bindings/core/v8/ScriptState.h"
 #include "bindings/core/v8/ScriptValue.h"
-#include "bindings/core/v8/UnionTypesCore.h"
 #include "bindings/core/v8/V8AbstractEventListener.h"
 #include "bindings/core/v8/V8DOMConfiguration.h"
 #include "bindings/core/v8/V8EventListenerList.h"
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.h b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.h
index b715297..d43f3979e 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.h
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.h
@@ -8,6 +8,7 @@
 #define V8TestInterface_h
 
 #include "bindings/core/v8/ScriptWrappable.h"
+#include "bindings/core/v8/StringOrDouble.h"
 #include "bindings/core/v8/ToV8.h"
 #include "bindings/core/v8/V8Binding.h"
 #include "bindings/core/v8/V8DOMWrapper.h"
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceConstructor.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceConstructor.cpp
index cfcd8339..8a94ba9 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceConstructor.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceConstructor.cpp
@@ -8,7 +8,7 @@
 
 #include "bindings/core/v8/Dictionary.h"
 #include "bindings/core/v8/ExceptionState.h"
-#include "bindings/core/v8/UnionTypesCore.h"
+#include "bindings/core/v8/LongOrTestDictionary.h"
 #include "bindings/core/v8/V8DOMConfiguration.h"
 #include "bindings/core/v8/V8ObjectConstructor.h"
 #include "bindings/core/v8/V8TestDictionary.h"
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceConstructor.h b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceConstructor.h
index bc65c5063..9f0f31f 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceConstructor.h
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceConstructor.h
@@ -7,6 +7,7 @@
 #ifndef V8TestInterfaceConstructor_h
 #define V8TestInterfaceConstructor_h
 
+#include "bindings/core/v8/LongOrTestDictionary.h"
 #include "bindings/core/v8/ScriptWrappable.h"
 #include "bindings/core/v8/ToV8.h"
 #include "bindings/core/v8/V8Binding.h"
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.cpp
index 6da6085..41de4ff 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.cpp
@@ -6,8 +6,11 @@
 
 #include "V8TestObject.h"
 
+#include "bindings/core/v8/ArrayBufferOrArrayBufferViewOrDictionary.h"
 #include "bindings/core/v8/BindingSecurity.h"
+#include "bindings/core/v8/BooleanOrStringOrUnrestrictedDouble.h"
 #include "bindings/core/v8/Dictionary.h"
+#include "bindings/core/v8/DoubleOrString.h"
 #include "bindings/core/v8/ExceptionState.h"
 #include "bindings/core/v8/PrivateScriptRunner.h"
 #include "bindings/core/v8/ScriptCallStack.h"
@@ -16,8 +19,13 @@
 #include "bindings/core/v8/ScriptValue.h"
 #include "bindings/core/v8/SerializedScriptValue.h"
 #include "bindings/core/v8/SerializedScriptValueFactory.h"
+#include "bindings/core/v8/StringOrArrayBufferOrArrayBufferView.h"
+#include "bindings/core/v8/StringOrStringSequence.h"
+#include "bindings/core/v8/TestEnumOrDouble.h"
+#include "bindings/core/v8/TestInterfaceGarbageCollectedOrString.h"
+#include "bindings/core/v8/TestInterfaceOrLong.h"
 #include "bindings/core/v8/Transferables.h"
-#include "bindings/core/v8/UnionTypesCore.h"
+#include "bindings/core/v8/UnrestrictedDoubleOrString.h"
 #include "bindings/core/v8/V8AbstractEventListener.h"
 #include "bindings/core/v8/V8ArrayBuffer.h"
 #include "bindings/core/v8/V8ArrayBufferView.h"
@@ -2189,8 +2197,8 @@
 static void cachedAttributeAnyAttributeAttributeGetter(const v8::FunctionCallbackInfo<v8::Value>& info)
 {
     v8::Local<v8::Object> holder = info.Holder();
-    v8::Local<v8::String> propertyName = v8AtomicString(info.GetIsolate(), "cachedAttributeAnyAttribute");
     TestObject* impl = V8TestObject::toImpl(holder);
+    v8::Local<v8::String> propertyName = v8AtomicString(info.GetIsolate(), "cachedAttributeAnyAttribute");
     if (!impl->isValueDirty()) {
         v8::Local<v8::Value> v8Value = V8HiddenValue::getHiddenValue(ScriptState::current(info.GetIsolate()), holder, propertyName);
         if (!v8Value.IsEmpty() && !v8Value->IsUndefined()) {
@@ -2227,8 +2235,8 @@
 static void cachedArrayAttributeAttributeGetter(const v8::FunctionCallbackInfo<v8::Value>& info)
 {
     v8::Local<v8::Object> holder = info.Holder();
-    v8::Local<v8::String> propertyName = v8AtomicString(info.GetIsolate(), "cachedArrayAttribute");
     TestObject* impl = V8TestObject::toImpl(holder);
+    v8::Local<v8::String> propertyName = v8AtomicString(info.GetIsolate(), "cachedArrayAttribute");
     if (!impl->isArrayDirty()) {
         v8::Local<v8::Value> v8Value = V8HiddenValue::getHiddenValue(ScriptState::current(info.GetIsolate()), holder, propertyName);
         if (!v8Value.IsEmpty() && !v8Value->IsUndefined()) {
@@ -2268,8 +2276,8 @@
 static void cachedStringOrNoneAttributeAttributeGetter(const v8::FunctionCallbackInfo<v8::Value>& info)
 {
     v8::Local<v8::Object> holder = info.Holder();
-    v8::Local<v8::String> propertyName = v8AtomicString(info.GetIsolate(), "cachedStringOrNoneAttribute");
     TestObject* impl = V8TestObject::toImpl(holder);
+    v8::Local<v8::String> propertyName = v8AtomicString(info.GetIsolate(), "cachedStringOrNoneAttribute");
     if (!impl->isStringDirty()) {
         v8::Local<v8::Value> v8Value = V8HiddenValue::getHiddenValue(ScriptState::current(info.GetIsolate()), holder, propertyName);
         if (!v8Value.IsEmpty() && !v8Value->IsUndefined()) {
@@ -3445,8 +3453,8 @@
 static void cachedAttributeRaisesExceptionGetterAnyAttributeAttributeGetter(const v8::FunctionCallbackInfo<v8::Value>& info)
 {
     v8::Local<v8::Object> holder = info.Holder();
-    v8::Local<v8::String> propertyName = v8AtomicString(info.GetIsolate(), "cachedAttributeRaisesExceptionGetterAnyAttribute");
     TestObject* impl = V8TestObject::toImpl(holder);
+    v8::Local<v8::String> propertyName = v8AtomicString(info.GetIsolate(), "cachedAttributeRaisesExceptionGetterAnyAttribute");
     if (!impl->isValueDirty()) {
         v8::Local<v8::Value> v8Value = V8HiddenValue::getHiddenValue(ScriptState::current(info.GetIsolate()), holder, propertyName);
         if (!v8Value.IsEmpty() && !v8Value->IsUndefined()) {
@@ -4513,7 +4521,16 @@
 {
     v8::Local<v8::Object> holder = info.Holder();
     TestObject* impl = V8TestObject::toImpl(holder);
+    v8::Local<v8::String> propertyName = v8AtomicString(info.GetIsolate(), "sameobject_sameObjectAttribute");
+    {
+        v8::Local<v8::Value> v8Value = V8HiddenValue::getHiddenValue(ScriptState::current(info.GetIsolate()), holder, propertyName);
+        if (!v8Value.IsEmpty()) {
+            v8SetReturnValue(info, v8Value);
+            return;
+        }
+    }
     v8SetReturnValueFast(info, WTF::getPtr(impl->sameObjectAttribute()), impl);
+    V8HiddenValue::setHiddenValue(ScriptState::current(info.GetIsolate()), holder, propertyName, info.GetReturnValue().Get());
 }
 
 static void sameObjectAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info)
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.h b/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.h
index fe8cbc3..96c89ab 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.h
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.h
@@ -7,8 +7,18 @@
 #ifndef V8TestObject_h
 #define V8TestObject_h
 
+#include "bindings/core/v8/ArrayBufferOrArrayBufferViewOrDictionary.h"
+#include "bindings/core/v8/BooleanOrStringOrUnrestrictedDouble.h"
+#include "bindings/core/v8/DoubleOrString.h"
 #include "bindings/core/v8/ScriptWrappable.h"
+#include "bindings/core/v8/StringOrArrayBufferOrArrayBufferView.h"
+#include "bindings/core/v8/StringOrDouble.h"
+#include "bindings/core/v8/StringOrStringSequence.h"
+#include "bindings/core/v8/TestEnumOrDouble.h"
+#include "bindings/core/v8/TestInterfaceGarbageCollectedOrString.h"
+#include "bindings/core/v8/TestInterfaceOrLong.h"
 #include "bindings/core/v8/ToV8.h"
+#include "bindings/core/v8/UnrestrictedDoubleOrString.h"
 #include "bindings/core/v8/V8Binding.h"
 #include "bindings/core/v8/V8DOMWrapper.h"
 #include "bindings/core/v8/WrapperTypeInfo.h"
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestSpecialOperations.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestSpecialOperations.cpp
index 3976fb9..81d0fee 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestSpecialOperations.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestSpecialOperations.cpp
@@ -7,7 +7,7 @@
 #include "V8TestSpecialOperations.h"
 
 #include "bindings/core/v8/ExceptionState.h"
-#include "bindings/core/v8/UnionTypesCore.h"
+#include "bindings/core/v8/NodeOrNodeList.h"
 #include "bindings/core/v8/V8DOMConfiguration.h"
 #include "bindings/core/v8/V8Node.h"
 #include "bindings/core/v8/V8NodeList.h"
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestSpecialOperations.h b/third_party/WebKit/Source/bindings/tests/results/core/V8TestSpecialOperations.h
index 6650048..6b58719 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestSpecialOperations.h
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestSpecialOperations.h
@@ -7,6 +7,7 @@
 #ifndef V8TestSpecialOperations_h
 #define V8TestSpecialOperations_h
 
+#include "bindings/core/v8/NodeOrNodeList.h"
 #include "bindings/core/v8/ScriptWrappable.h"
 #include "bindings/core/v8/ToV8.h"
 #include "bindings/core/v8/V8Binding.h"
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestTypedefs.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestTypedefs.cpp
index 37c9023..e7a4415 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestTypedefs.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestTypedefs.cpp
@@ -7,7 +7,8 @@
 #include "V8TestTypedefs.h"
 
 #include "bindings/core/v8/ExceptionState.h"
-#include "bindings/core/v8/UnionTypesCore.h"
+#include "bindings/core/v8/StringOrDouble.h"
+#include "bindings/core/v8/TestInterfaceOrTestInterfaceEmpty.h"
 #include "bindings/core/v8/V8DOMConfiguration.h"
 #include "bindings/core/v8/V8ObjectConstructor.h"
 #include "bindings/core/v8/V8TestCallbackInterface.h"
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestTypedefs.h b/third_party/WebKit/Source/bindings/tests/results/core/V8TestTypedefs.h
index ec78e53..39c5cd25 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestTypedefs.h
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestTypedefs.h
@@ -8,6 +8,8 @@
 #define V8TestTypedefs_h
 
 #include "bindings/core/v8/ScriptWrappable.h"
+#include "bindings/core/v8/StringOrDouble.h"
+#include "bindings/core/v8/TestInterfaceOrTestInterfaceEmpty.h"
 #include "bindings/core/v8/ToV8.h"
 #include "bindings/core/v8/V8Binding.h"
 #include "bindings/core/v8/V8DOMWrapper.h"
diff --git a/third_party/WebKit/Source/bindings/tests/results/modules/UnionTypesModules.cpp b/third_party/WebKit/Source/bindings/tests/results/modules/BooleanOrString.cpp
similarity index 97%
rename from third_party/WebKit/Source/bindings/tests/results/modules/UnionTypesModules.cpp
rename to third_party/WebKit/Source/bindings/tests/results/modules/BooleanOrString.cpp
index a6f59cc..81b25c4 100644
--- a/third_party/WebKit/Source/bindings/tests/results/modules/UnionTypesModules.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/modules/BooleanOrString.cpp
@@ -4,8 +4,9 @@
 
 // This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
 
-#include "bindings/modules/v8/UnionTypesModules.h"
+#include "BooleanOrString.h"
 
+#include "bindings/core/v8/ToV8.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/bindings/tests/results/modules/UnionTypesModules.h b/third_party/WebKit/Source/bindings/tests/results/modules/BooleanOrString.h
similarity index 94%
rename from third_party/WebKit/Source/bindings/tests/results/modules/UnionTypesModules.h
rename to third_party/WebKit/Source/bindings/tests/results/modules/BooleanOrString.h
index 519ceb52..4076f2e7 100644
--- a/third_party/WebKit/Source/bindings/tests/results/modules/UnionTypesModules.h
+++ b/third_party/WebKit/Source/bindings/tests/results/modules/BooleanOrString.h
@@ -4,12 +4,11 @@
 
 // This file has been auto-generated by code_generator_v8.py. DO NOT MODIFY!
 
-#ifndef UnionTypeModules_h
-#define UnionTypeModules_h
+#ifndef BooleanOrString_h
+#define BooleanOrString_h
 
 #include "bindings/core/v8/Dictionary.h"
 #include "bindings/core/v8/ExceptionState.h"
-#include "bindings/core/v8/UnionTypesCore.h"
 #include "bindings/core/v8/V8Binding.h"
 #include "modules/ModulesExport.h"
 #include "platform/heap/Handle.h"
@@ -78,4 +77,4 @@
 // See https://codereview.chromium.org/1118993002/#msg5 for more details.
 WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::BooleanOrString);
 
-#endif // UnionTypeModules_h
+#endif // BooleanOrString_h
diff --git a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface5.cpp b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface5.cpp
index ddb2c40..ccd4da3 100644
--- a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface5.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface5.cpp
@@ -13,7 +13,8 @@
 #include "bindings/core/v8/V8Iterator.h"
 #include "bindings/core/v8/V8ObjectConstructor.h"
 #include "bindings/core/v8/V8TestInterfaceEmpty.h"
-#include "bindings/modules/v8/UnionTypesModules.h"
+#include "bindings/modules/v8/BooleanOrString.h"
+#include "bindings/modules/v8/DoubleOrString.h"
 #include "bindings/modules/v8/V8TestInterface5.h"
 #include "core/dom/Document.h"
 #include "platform/RuntimeEnabledFeatures.h"
diff --git a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface5.h b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface5.h
index 3baf6cf..5b364ce 100644
--- a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface5.h
+++ b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface5.h
@@ -7,12 +7,14 @@
 #ifndef V8TestInterface5_h
 #define V8TestInterface5_h
 
+#include "bindings/core/v8/DoubleOrString.h"
 #include "bindings/core/v8/ScriptWrappable.h"
 #include "bindings/core/v8/ToV8.h"
 #include "bindings/core/v8/V8Binding.h"
 #include "bindings/core/v8/V8DOMWrapper.h"
 #include "bindings/core/v8/V8TestInterfaceEmpty.h"
 #include "bindings/core/v8/WrapperTypeInfo.h"
+#include "bindings/modules/v8/BooleanOrString.h"
 #include "bindings/tests/idls/modules/TestInterface5Implementation.h"
 #include "modules/ModulesExport.h"
 #include "platform/heap/Handle.h"
diff --git a/third_party/WebKit/Source/core/animation/AnimationEffectTiming.cpp b/third_party/WebKit/Source/core/animation/AnimationEffectTiming.cpp
index 3732579f..f95a7b5 100644
--- a/third_party/WebKit/Source/core/animation/AnimationEffectTiming.cpp
+++ b/third_party/WebKit/Source/core/animation/AnimationEffectTiming.cpp
@@ -5,7 +5,7 @@
 #include "core/animation/AnimationEffectTiming.h"
 
 #include "bindings/core/v8/ExceptionState.h"
-#include "bindings/core/v8/UnionTypesCore.h"
+#include "bindings/core/v8/UnrestrictedDoubleOrString.h"
 #include "core/animation/AnimationEffect.h"
 #include "core/animation/KeyframeEffect.h"
 #include "platform/animation/TimingFunction.h"
diff --git a/third_party/WebKit/Source/core/animation/EffectInput.cpp b/third_party/WebKit/Source/core/animation/EffectInput.cpp
index fe5944dc..1831402 100644
--- a/third_party/WebKit/Source/core/animation/EffectInput.cpp
+++ b/third_party/WebKit/Source/core/animation/EffectInput.cpp
@@ -31,7 +31,7 @@
 #include "core/animation/EffectInput.h"
 
 #include "bindings/core/v8/Dictionary.h"
-#include "bindings/core/v8/UnionTypesCore.h"
+#include "bindings/core/v8/EffectModelOrDictionarySequenceOrDictionary.h"
 #include "core/animation/AnimationInputHelpers.h"
 #include "core/animation/CompositorAnimations.h"
 #include "core/animation/KeyframeEffectModel.h"
diff --git a/third_party/WebKit/Source/core/animation/EffectInputTest.cpp b/third_party/WebKit/Source/core/animation/EffectInputTest.cpp
index 47e313f2..1cbe2d6 100644
--- a/third_party/WebKit/Source/core/animation/EffectInputTest.cpp
+++ b/third_party/WebKit/Source/core/animation/EffectInputTest.cpp
@@ -5,6 +5,7 @@
 #include "core/animation/EffectInput.h"
 
 #include "bindings/core/v8/Dictionary.h"
+#include "bindings/core/v8/EffectModelOrDictionarySequenceOrDictionary.h"
 #include "bindings/core/v8/V8BindingForTesting.h"
 #include "core/animation/AnimationTestHelper.h"
 #include "core/animation/KeyframeEffectModel.h"
diff --git a/third_party/WebKit/Source/core/animation/ElementAnimation.h b/third_party/WebKit/Source/core/animation/ElementAnimation.h
index 1ac4ecc7..a21eb7b5 100644
--- a/third_party/WebKit/Source/core/animation/ElementAnimation.h
+++ b/third_party/WebKit/Source/core/animation/ElementAnimation.h
@@ -31,7 +31,7 @@
 #ifndef ElementAnimation_h
 #define ElementAnimation_h
 
-#include "bindings/core/v8/UnionTypesCore.h"
+#include "bindings/core/v8/EffectModelOrDictionarySequenceOrDictionary.h"
 #include "core/animation/AnimationTimeline.h"
 #include "core/animation/EffectInput.h"
 #include "core/animation/ElementAnimations.h"
diff --git a/third_party/WebKit/Source/core/animation/KeyframeEffectTest.cpp b/third_party/WebKit/Source/core/animation/KeyframeEffectTest.cpp
index d9a50f8..d83c4f8 100644
--- a/third_party/WebKit/Source/core/animation/KeyframeEffectTest.cpp
+++ b/third_party/WebKit/Source/core/animation/KeyframeEffectTest.cpp
@@ -5,7 +5,7 @@
 #include "core/animation/KeyframeEffect.h"
 
 #include "bindings/core/v8/Dictionary.h"
-#include "bindings/core/v8/UnionTypesCore.h"
+#include "bindings/core/v8/EffectModelOrDictionarySequenceOrDictionary.h"
 #include "bindings/core/v8/V8BindingForTesting.h"
 #include "bindings/core/v8/V8KeyframeEffectOptions.h"
 #include "core/animation/AnimationClock.h"
diff --git a/third_party/WebKit/Source/core/core.gypi b/third_party/WebKit/Source/core/core.gypi
index cc487eb..3eb8cbb 100644
--- a/third_party/WebKit/Source/core/core.gypi
+++ b/third_party/WebKit/Source/core/core.gypi
@@ -668,6 +668,8 @@
             'layout/LayoutTextFragment.h',
             'layout/LayoutTable.cpp',
             'layout/LayoutTable.h',
+            'layout/LayoutTableBoxComponent.cpp',
+            'layout/LayoutTableBoxComponent.h',
             'layout/LayoutTableCaption.cpp',
             'layout/LayoutTableCaption.h',
             'layout/LayoutTableCell.cpp',
@@ -3881,6 +3883,8 @@
             'testing/LayerRect.h',
             'testing/LayerRectList.cpp',
             'testing/LayerRectList.h',
+            'testing/MockHyphenation.cpp',
+            'testing/MockHyphenation.h',
             'testing/NullExecutionContext.cpp',
             'testing/NullExecutionContext.h',
             'testing/PrivateScriptTest.cpp',
@@ -3944,6 +3948,7 @@
             'css/RuleSetTest.cpp',
             'css/StyleSheetContentsTest.cpp',
             'css/invalidation/InvalidationSetTest.cpp',
+            'css/parser/CSSParserTokenTest.cpp',
             'css/parser/CSSPropertyParserTest.cpp',
             'css/parser/CSSSelectorParserTest.cpp',
             'css/parser/CSSTokenizerTest.cpp',
@@ -4057,7 +4062,6 @@
             'html/parser/HTMLPreloadScannerTest.cpp',
             'html/parser/HTMLResourcePreloaderTest.cpp',
             'html/parser/HTMLSrcsetParserTest.cpp',
-            'html/parser/TextResourceDecoderTest.cpp',
             'html/shadow/MediaControlsTest.cpp',
             'html/track/vtt/BufferedLineReaderTest.cpp',
             'html/track/vtt/VTTScannerTest.cpp',
diff --git a/third_party/WebKit/Source/core/css/CSSImportRule.cpp b/third_party/WebKit/Source/core/css/CSSImportRule.cpp
index 8ea8e18..a3e448b0 100644
--- a/third_party/WebKit/Source/core/css/CSSImportRule.cpp
+++ b/third_party/WebKit/Source/core/css/CSSImportRule.cpp
@@ -72,6 +72,8 @@
 
 CSSStyleSheet* CSSImportRule::styleSheet() const
 {
+    // TODO(yukishiino): CSSImportRule.styleSheet attribute is not nullable,
+    // thus this function must not return nullptr.
     if (!m_importRule->styleSheet())
         return nullptr;
 
diff --git a/third_party/WebKit/Source/core/css/CSSImportRule.idl b/third_party/WebKit/Source/core/css/CSSImportRule.idl
index e845ca2..08b1144 100644
--- a/third_party/WebKit/Source/core/css/CSSImportRule.idl
+++ b/third_party/WebKit/Source/core/css/CSSImportRule.idl
@@ -24,5 +24,6 @@
     readonly attribute DOMString href;
     // TODO(philipj): media should have [PutForwards=mediaText].
     [SameObject] readonly attribute MediaList media;
-    [SameObject] readonly attribute CSSStyleSheet styleSheet;
+    // TODO(yukishiino): styleSheet attribute must be [SameObject].
+    readonly attribute CSSStyleSheet styleSheet;
 };
diff --git a/third_party/WebKit/Source/core/css/CSSStyleDeclaration.idl b/third_party/WebKit/Source/core/css/CSSStyleDeclaration.idl
index c77fec96..e9cae2b 100644
--- a/third_party/WebKit/Source/core/css/CSSStyleDeclaration.idl
+++ b/third_party/WebKit/Source/core/css/CSSStyleDeclaration.idl
@@ -22,6 +22,7 @@
 
 [
     DependentLifetime,
+    SetWrapperReferenceTo(CSSRule parentRule),
 ] interface CSSStyleDeclaration {
     [RaisesException=Setter] attribute DOMString cssText;
     readonly attribute unsigned long length;
diff --git a/third_party/WebKit/Source/core/css/CSSStyleRule.idl b/third_party/WebKit/Source/core/css/CSSStyleRule.idl
index 52503b8..3429012 100644
--- a/third_party/WebKit/Source/core/css/CSSStyleRule.idl
+++ b/third_party/WebKit/Source/core/css/CSSStyleRule.idl
@@ -20,7 +20,9 @@
 
 // http://dev.w3.org/csswg/cssom/#the-cssstylerule-interface
 
-interface CSSStyleRule : CSSRule {
+[
+    Custom=VisitDOMWrapper,
+] interface CSSStyleRule : CSSRule {
     attribute DOMString selectorText;
     [SameObject, PutForwards=cssText] readonly attribute CSSStyleDeclaration style;
 };
diff --git a/third_party/WebKit/Source/core/css/FontFace.cpp b/third_party/WebKit/Source/core/css/FontFace.cpp
index c0c68fb..81c842b 100644
--- a/third_party/WebKit/Source/core/css/FontFace.cpp
+++ b/third_party/WebKit/Source/core/css/FontFace.cpp
@@ -32,7 +32,7 @@
 
 #include "bindings/core/v8/ExceptionState.h"
 #include "bindings/core/v8/ScriptState.h"
-#include "bindings/core/v8/UnionTypesCore.h"
+#include "bindings/core/v8/StringOrArrayBufferOrArrayBufferView.h"
 #include "core/CSSValueKeywords.h"
 #include "core/css/BinaryDataFontFaceSource.h"
 #include "core/css/CSSFontFace.h"
diff --git a/third_party/WebKit/Source/core/css/SelectorChecker.cpp b/third_party/WebKit/Source/core/css/SelectorChecker.cpp
index 3b684aa5..46fa908c4 100644
--- a/third_party/WebKit/Source/core/css/SelectorChecker.cpp
+++ b/third_party/WebKit/Source/core/css/SelectorChecker.cpp
@@ -909,7 +909,7 @@
             return element == element.document().documentElement();
         return context.scope == &element;
     case CSSSelector::PseudoUnresolved:
-        return element.isUnresolvedCustomElement();
+        return element.isUnresolvedV0CustomElement();
     case CSSSelector::PseudoHost:
     case CSSSelector::PseudoHostContext:
         return checkPseudoHost(context, result);
diff --git a/third_party/WebKit/Source/core/css/cssom/StylePropertyMap.h b/third_party/WebKit/Source/core/css/cssom/StylePropertyMap.h
index 1eb60608..e2dfad6 100644
--- a/third_party/WebKit/Source/core/css/cssom/StylePropertyMap.h
+++ b/third_party/WebKit/Source/core/css/cssom/StylePropertyMap.h
@@ -7,7 +7,8 @@
 
 #include "bindings/core/v8/Iterable.h"
 #include "bindings/core/v8/ScriptWrappable.h"
-#include "bindings/core/v8/UnionTypesCore.h"
+#include "bindings/core/v8/StyleValueOrStyleValueSequence.h"
+#include "bindings/core/v8/StyleValueOrStyleValueSequenceOrString.h"
 #include "core/CSSPropertyNames.h"
 #include "core/CoreExport.h"
 #include "core/css/cssom/StyleValue.h"
diff --git a/third_party/WebKit/Source/core/css/parser/CSSParserToken.cpp b/third_party/WebKit/Source/core/css/parser/CSSParserToken.cpp
index 864a5ea..b84458ac 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSParserToken.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSParserToken.cpp
@@ -147,6 +147,25 @@
     return copy;
 }
 
+bool CSSParserToken::valueDataCharRawEqual(const CSSParserToken& other) const
+{
+    if (m_valueLength != other.m_valueLength)
+        return false;
+
+    if (m_valueDataCharRaw == other.m_valueDataCharRaw && m_valueIs8Bit == other.m_valueIs8Bit)
+        return true;
+
+    if (m_valueIs8Bit) {
+        return other.m_valueIs8Bit ?
+            equal(static_cast<const LChar*>(m_valueDataCharRaw), static_cast<const LChar*>(other.m_valueDataCharRaw), m_valueLength) :
+            equal(static_cast<const LChar*>(m_valueDataCharRaw), static_cast<const UChar*>(other.m_valueDataCharRaw), m_valueLength);
+    } else {
+        return other.m_valueIs8Bit ?
+            equal(static_cast<const UChar*>(m_valueDataCharRaw), static_cast<const LChar*>(other.m_valueDataCharRaw), m_valueLength) :
+            equal(static_cast<const UChar*>(m_valueDataCharRaw), static_cast<const UChar*>(other.m_valueDataCharRaw), m_valueLength);
+    }
+}
+
 bool CSSParserToken::operator==(const CSSParserToken& other) const
 {
     if (m_type != other.m_type)
@@ -162,9 +181,9 @@
     case FunctionToken:
     case StringToken:
     case UrlToken:
-        return m_valueDataCharRaw == other.m_valueDataCharRaw && m_valueLength == other.m_valueLength && m_valueIs8Bit == other.m_valueIs8Bit;
+        return valueDataCharRawEqual(other);
     case DimensionToken:
-        if (m_valueDataCharRaw != other.m_valueDataCharRaw || m_valueLength != other.m_valueLength || m_valueIs8Bit != other.m_valueIs8Bit)
+        if (!valueDataCharRawEqual(other))
             return false;
         // fallthrough
     case NumberToken:
diff --git a/third_party/WebKit/Source/core/css/parser/CSSParserToken.h b/third_party/WebKit/Source/core/css/parser/CSSParserToken.h
index f857b3d..6e57a72 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSParserToken.h
+++ b/third_party/WebKit/Source/core/css/parser/CSSParserToken.h
@@ -83,6 +83,7 @@
     CSSParserToken(HashTokenType, CSSParserString);
 
     bool operator==(const CSSParserToken& other) const;
+    bool operator!=(const CSSParserToken& other) const { return !(*this == other); }
 
     // Converts NumberToken to DimensionToken.
     void convertToDimensionWithUnit(CSSParserString);
@@ -133,6 +134,8 @@
     unsigned m_numericSign : 2; // NumericSign
     unsigned m_unit : 7; // CSSPrimitiveValue::UnitType
 
+    bool valueDataCharRawEqual(const CSSParserToken& other) const;
+
     // m_value... is an unpacked CSSParserString so that we can pack it
     // tightly with the rest of this object for a smaller object size.
     bool m_valueIs8Bit : 1;
diff --git a/third_party/WebKit/Source/core/css/parser/CSSParserTokenTest.cpp b/third_party/WebKit/Source/core/css/parser/CSSParserTokenTest.cpp
new file mode 100644
index 0000000..e9204e1b
--- /dev/null
+++ b/third_party/WebKit/Source/core/css/parser/CSSParserTokenTest.cpp
@@ -0,0 +1,51 @@
+// 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 "core/css/parser/CSSParserToken.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace blink {
+
+static CSSParserString toParserString(const String& string)
+{
+    CSSParserString result;
+    result.init(string);
+    return result;
+}
+
+static CSSParserToken ident(const String& string) { return CSSParserToken(IdentToken, toParserString(string)); }
+static CSSParserToken dimension(double value, const String& unit)
+{
+    CSSParserToken token(NumberToken, value, NumberValueType, NoSign);
+    token.convertToDimensionWithUnit(toParserString(unit));
+    return token;
+}
+
+TEST(CSSParserTokenTest, IdentTokenEquality)
+{
+    String foo8Bit("foo");
+    String bar8Bit("bar");
+    String foo16Bit = String::make16BitFrom8BitSource(foo8Bit.characters8(), foo8Bit.length());
+
+    EXPECT_EQ(ident(foo8Bit), ident(foo16Bit));
+    EXPECT_EQ(ident(foo16Bit), ident(foo8Bit));
+    EXPECT_EQ(ident(foo16Bit), ident(foo16Bit));
+    EXPECT_NE(ident(bar8Bit), ident(foo8Bit));
+    EXPECT_NE(ident(bar8Bit), ident(foo16Bit));
+}
+
+TEST(CSSParserTokenTest, DimensionTokenEquality)
+{
+    String em8Bit("em");
+    String rem8Bit("rem");
+    String em16Bit = String::make16BitFrom8BitSource(em8Bit.characters8(), em8Bit.length());
+
+    EXPECT_EQ(dimension(1, em8Bit), dimension(1, em16Bit));
+    EXPECT_EQ(dimension(1, em8Bit), dimension(1, em8Bit));
+    EXPECT_NE(dimension(1, em8Bit), dimension(1, rem8Bit));
+    EXPECT_NE(dimension(2, em8Bit), dimension(1, em16Bit));
+}
+
+} // namespace blink
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
index 3bd6eb1..6562558b 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
@@ -3374,16 +3374,16 @@
     return true;
 }
 
-enum TrackSizeRestriction { FixedSizeOnly, AllowAll };
+enum TrackSizeRestriction { FixedSizeOnly, InflexibleSizeOnly, AllowAll };
 
 static CSSPrimitiveValue* consumeGridBreadth(CSSParserTokenRange& range, CSSParserMode cssParserMode, TrackSizeRestriction restriction = AllowAll)
 {
-    if (restriction == AllowAll) {
+    if (restriction != FixedSizeOnly) {
         const CSSParserToken& token = range.peek();
         if (identMatches<CSSValueMinContent, CSSValueMaxContent, CSSValueAuto>(token.id()))
             return consumeIdent(range);
         if (token.type() == DimensionToken && token.unitType() == CSSPrimitiveValue::UnitType::Fraction) {
-            if (range.peek().numericValue() < 0)
+            if (restriction == InflexibleSizeOnly || range.peek().numericValue() < 0)
                 return nullptr;
             return cssValuePool().createValue(range.consumeIncludingWhitespace().numericValue(), CSSPrimitiveValue::UnitType::Fraction);
         }
@@ -3401,7 +3401,8 @@
     if (token.functionId() == CSSValueMinmax) {
         CSSParserTokenRange rangeCopy = range;
         CSSParserTokenRange args = consumeFunction(rangeCopy);
-        CSSPrimitiveValue* minTrackBreadth = consumeGridBreadth(args, cssParserMode, restriction);
+        TrackSizeRestriction minTrackBreadthRestriction = restriction == AllowAll ? InflexibleSizeOnly : restriction;
+        CSSPrimitiveValue* minTrackBreadth = consumeGridBreadth(args, cssParserMode, minTrackBreadthRestriction);
         if (!minTrackBreadth || !consumeCommaIncludingWhitespace(args))
             return nullptr;
         CSSPrimitiveValue* maxTrackBreadth = consumeGridBreadth(args, cssParserMode);
diff --git a/third_party/WebKit/Source/core/css/resolver/SharedStyleFinder.cpp b/third_party/WebKit/Source/core/css/resolver/SharedStyleFinder.cpp
index 8ac8429..79fa5b7c 100644
--- a/third_party/WebKit/Source/core/css/resolver/SharedStyleFinder.cpp
+++ b/third_party/WebKit/Source/core/css/resolver/SharedStyleFinder.cpp
@@ -253,7 +253,7 @@
     if (candidate.isLink() && m_context.elementLinkState() != style->insideLink())
         return false;
 
-    if (candidate.isUnresolvedCustomElement() != element().isUnresolvedCustomElement())
+    if (candidate.isUnresolvedV0CustomElement() != element().isUnresolvedV0CustomElement())
         return false;
 
     if (element().parentOrShadowHostElement() != parent) {
diff --git a/third_party/WebKit/Source/core/dom/DOMArrayPiece.cpp b/third_party/WebKit/Source/core/dom/DOMArrayPiece.cpp
index 51dafc03..ceba9517 100644
--- a/third_party/WebKit/Source/core/dom/DOMArrayPiece.cpp
+++ b/third_party/WebKit/Source/core/dom/DOMArrayPiece.cpp
@@ -4,7 +4,7 @@
 
 #include "core/dom/DOMArrayPiece.h"
 
-#include "bindings/core/v8/UnionTypesCore.h"
+#include "bindings/core/v8/ArrayBufferOrArrayBufferView.h"
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/core/dom/Document.cpp b/third_party/WebKit/Source/core/dom/Document.cpp
index ee125c3f..ca2a90e 100644
--- a/third_party/WebKit/Source/core/dom/Document.cpp
+++ b/third_party/WebKit/Source/core/dom/Document.cpp
@@ -31,10 +31,10 @@
 #include "bindings/core/v8/ExceptionMessages.h"
 #include "bindings/core/v8/ExceptionState.h"
 #include "bindings/core/v8/ExceptionStatePlaceholder.h"
+#include "bindings/core/v8/HTMLScriptElementOrSVGScriptElement.h"
 #include "bindings/core/v8/Microtask.h"
 #include "bindings/core/v8/ScriptCallStack.h"
 #include "bindings/core/v8/ScriptController.h"
-#include "bindings/core/v8/UnionTypesCore.h"
 #include "bindings/core/v8/V0CustomElementConstructorBuilder.h"
 #include "bindings/core/v8/V8DOMWrapper.h"
 #include "bindings/core/v8/V8PerIsolateData.h"
diff --git a/third_party/WebKit/Source/core/dom/Element.cpp b/third_party/WebKit/Source/core/dom/Element.cpp
index 931d439..ebcce980 100644
--- a/third_party/WebKit/Source/core/dom/Element.cpp
+++ b/third_party/WebKit/Source/core/dom/Element.cpp
@@ -1421,7 +1421,7 @@
             rareData->intersectionObserverData()->activateValidIntersectionObservers(*this);
     }
 
-    if (isUpgradedCustomElement() && inShadowIncludingDocument())
+    if (isUpgradedV0CustomElement() && inShadowIncludingDocument())
         V0CustomElement::didAttach(this, document());
 
     TreeScope& scope = insertionPoint->treeScope();
@@ -1482,7 +1482,7 @@
         if (hasPendingResources())
             document().accessSVGExtensions().removeElementFromPendingResources(this);
 
-        if (isUpgradedCustomElement())
+        if (isUpgradedV0CustomElement())
             V0CustomElement::didDetach(this, insertionPoint->document());
 
         if (needsStyleInvalidation())
@@ -1931,7 +1931,7 @@
     OriginsUsingFeatures::countMainWorldOnly(scriptState, document(), OriginsUsingFeatures::Feature::ElementAttachShadow);
 
     const AtomicString& tagName = localName();
-    bool tagNameIsSupported = isCustomElement()
+    bool tagNameIsSupported = isV0CustomElement()
         || tagName == HTMLNames::articleTag
         || tagName == HTMLNames::asideTag
         || tagName == HTMLNames::blockquoteTag
@@ -3179,7 +3179,7 @@
 
     if (oldValue != newValue) {
         document().styleEngine().attributeChangedForElement(name, *this);
-        if (isUpgradedCustomElement())
+        if (isUpgradedV0CustomElement())
             V0CustomElement::attributeDidChange(this, name.localName(), oldValue, newValue);
     }
 
diff --git a/third_party/WebKit/Source/core/dom/Element.h b/third_party/WebKit/Source/core/dom/Element.h
index 018eccec..00be118 100644
--- a/third_party/WebKit/Source/core/dom/Element.h
+++ b/third_party/WebKit/Source/core/dom/Element.h
@@ -374,8 +374,8 @@
     void setIsInCanvasSubtree(bool value) { setElementFlag(IsInCanvasSubtree, value); }
     bool isInCanvasSubtree() const { return hasElementFlag(IsInCanvasSubtree); }
 
-    bool isUpgradedCustomElement() { return getCustomElementState() == Upgraded; }
-    bool isUnresolvedCustomElement() { return getCustomElementState() == WaitingForUpgrade; }
+    bool isUpgradedV0CustomElement() { return getV0CustomElementState() == V0Upgraded; }
+    bool isUnresolvedV0CustomElement() { return getV0CustomElementState() == V0WaitingForUpgrade; }
 
     AtomicString computeInheritedLanguage() const;
     Locale& locale() const;
diff --git a/third_party/WebKit/Source/core/dom/Node.cpp b/third_party/WebKit/Source/core/dom/Node.cpp
index 11e0f7a..7018a3bc 100644
--- a/third_party/WebKit/Source/core/dom/Node.cpp
+++ b/third_party/WebKit/Source/core/dom/Node.cpp
@@ -2303,29 +2303,29 @@
     return document().userActionElements().isFocused(this);
 }
 
-void Node::setCustomElementState(CustomElementState newState)
+void Node::setV0CustomElementState(V0CustomElementState newState)
 {
-    CustomElementState oldState = getCustomElementState();
+    V0CustomElementState oldState = getV0CustomElementState();
 
     switch (newState) {
-    case NotCustomElement:
+    case V0NotCustomElement:
         ASSERT_NOT_REACHED(); // Everything starts in this state
         return;
 
-    case WaitingForUpgrade:
-        DCHECK_EQ(NotCustomElement, oldState);
+    case V0WaitingForUpgrade:
+        DCHECK_EQ(V0NotCustomElement, oldState);
         break;
 
-    case Upgraded:
-        DCHECK_EQ(WaitingForUpgrade, oldState);
+    case V0Upgraded:
+        DCHECK_EQ(V0WaitingForUpgrade, oldState);
         break;
     }
 
     DCHECK(isHTMLElement() || isSVGElement());
-    setFlag(CustomElementFlag);
-    setFlag(newState == Upgraded, CustomElementUpgradedFlag);
+    setFlag(V0CustomElementFlag);
+    setFlag(newState == V0Upgraded, V0CustomElementUpgradedFlag);
 
-    if (oldState == NotCustomElement || newState == Upgraded)
+    if (oldState == V0NotCustomElement || newState == V0Upgraded)
         toElement(this)->pseudoStateChanged(CSSSelector::PseudoUnresolved);
 }
 
diff --git a/third_party/WebKit/Source/core/dom/Node.h b/third_party/WebKit/Source/core/dom/Node.h
index fd9fb760..5fb0aff 100644
--- a/third_party/WebKit/Source/core/dom/Node.h
+++ b/third_party/WebKit/Source/core/dom/Node.h
@@ -26,7 +26,7 @@
 #define Node_h
 
 #include "bindings/core/v8/ExceptionStatePlaceholder.h"
-#include "bindings/core/v8/UnionTypesCore.h"
+#include "bindings/core/v8/NodeOrString.h"
 #include "core/CoreExport.h"
 #include "core/dom/MutationObserver.h"
 #include "core/dom/SimulatedClickOptions.h"
@@ -244,19 +244,19 @@
     bool isFirstLetterPseudoElement() const { return getPseudoId() == PseudoIdFirstLetter; }
     virtual PseudoId getPseudoId() const { return PseudoIdNone; }
 
-    bool isCustomElement() const { return getFlag(CustomElementFlag); }
-    enum CustomElementState {
-        NotCustomElement  = 0,
-        WaitingForUpgrade = 1 << 0,
-        Upgraded          = 1 << 1
+    bool isV0CustomElement() const { return getFlag(V0CustomElementFlag); }
+    enum V0CustomElementState {
+        V0NotCustomElement  = 0,
+        V0WaitingForUpgrade = 1 << 0,
+        V0Upgraded          = 1 << 1
     };
-    CustomElementState getCustomElementState() const
+    V0CustomElementState getV0CustomElementState() const
     {
-        return isCustomElement()
-            ? (getFlag(CustomElementUpgradedFlag) ? Upgraded : WaitingForUpgrade)
-            : NotCustomElement;
+        return isV0CustomElement()
+            ? (getFlag(V0CustomElementUpgradedFlag) ? V0Upgraded : V0WaitingForUpgrade)
+            : V0NotCustomElement;
     }
-    void setCustomElementState(CustomElementState newState);
+    void setV0CustomElementState(V0CustomElementState newState);
 
     virtual bool isMediaControlElement() const { return false; }
     virtual bool isMediaControls() const { return false; }
@@ -713,8 +713,8 @@
         ChildNeedsStyleRecalcFlag = 1 << 18,
         StyleChangeMask = 1 << nodeStyleChangeShift | 1 << (nodeStyleChangeShift + 1),
 
-        CustomElementFlag = 1 << 21,
-        CustomElementUpgradedFlag = 1 << 22,
+        V0CustomElementFlag = 1 << 21,
+        V0CustomElementUpgradedFlag = 1 << 22,
 
         HasNameOrIsEditingTextFlag = 1 << 23,
         HasWeakReferencesFlag = 1 << 24,
diff --git a/third_party/WebKit/Source/core/dom/URLSearchParams.h b/third_party/WebKit/Source/core/dom/URLSearchParams.h
index 5b2b4463..688e908c 100644
--- a/third_party/WebKit/Source/core/dom/URLSearchParams.h
+++ b/third_party/WebKit/Source/core/dom/URLSearchParams.h
@@ -7,7 +7,7 @@
 
 #include "bindings/core/v8/Iterable.h"
 #include "bindings/core/v8/ScriptWrappable.h"
-#include "bindings/core/v8/UnionTypesCore.h"
+#include "bindings/core/v8/USVStringOrURLSearchParams.h"
 #include "platform/heap/Handle.h"
 #include "platform/network/EncodedFormData.h"
 #include "wtf/Forward.h"
diff --git a/third_party/WebKit/Source/core/dom/custom/CustomElementsRegistry.cpp b/third_party/WebKit/Source/core/dom/custom/CustomElementsRegistry.cpp
index b9a5c707..6163dce 100644
--- a/third_party/WebKit/Source/core/dom/custom/CustomElementsRegistry.cpp
+++ b/third_party/WebKit/Source/core/dom/custom/CustomElementsRegistry.cpp
@@ -60,16 +60,19 @@
     v8::Isolate* isolate = scriptState->isolate();
     v8::Local<v8::Context> context = scriptState->context();
 
-    // TODO(dominicc): Make this check for constructors and not just
-    // functions when
-    // https://bugs.chromium.org/p/v8/issues/detail?id=4993 is fixed.
     v8::Local<v8::Value> constructorValue = constructorScriptValue.v8Value();
     if (!constructorValue->IsFunction()) {
+        // Not even a function.
         exceptionState.throwTypeError(
             "constructor argument is not a constructor");
         return;
     }
     v8::Local<v8::Object> constructor = constructorValue.As<v8::Object>();
+    if (!constructor->IsConstructor()) {
+        exceptionState.throwTypeError(
+            "constructor argument is not a constructor");
+        return;
+    }
 
     // Raise an exception if the name is not valid.
     if (!CustomElement::isValidName(name)) {
diff --git a/third_party/WebKit/Source/core/dom/custom/V0CustomElement.cpp b/third_party/WebKit/Source/core/dom/custom/V0CustomElement.cpp
index 3f468306..be36cefc 100644
--- a/third_party/WebKit/Source/core/dom/custom/V0CustomElement.cpp
+++ b/third_party/WebKit/Source/core/dom/custom/V0CustomElement.cpp
@@ -104,13 +104,13 @@
 
 void V0CustomElement::define(Element* element, V0CustomElementDefinition* definition)
 {
-    switch (element->getCustomElementState()) {
-    case Element::NotCustomElement:
-    case Element::Upgraded:
+    switch (element->getV0CustomElementState()) {
+    case Element::V0NotCustomElement:
+    case Element::V0Upgraded:
         ASSERT_NOT_REACHED();
         break;
 
-    case Element::WaitingForUpgrade:
+    case Element::V0WaitingForUpgrade:
         element->setCustomElementDefinition(definition);
         V0CustomElementScheduler::scheduleCallback(definition->callbacks(), element, V0CustomElementLifecycleCallbacks::CreatedCallback);
         break;
@@ -119,13 +119,13 @@
 
 void V0CustomElement::attributeDidChange(Element* element, const AtomicString& name, const AtomicString& oldValue, const AtomicString& newValue)
 {
-    DCHECK_EQ(element->getCustomElementState(), Element::Upgraded);
+    DCHECK_EQ(element->getV0CustomElementState(), Element::V0Upgraded);
     V0CustomElementScheduler::scheduleAttributeChangedCallback(element->customElementDefinition()->callbacks(), element, name, oldValue, newValue);
 }
 
 void V0CustomElement::didAttach(Element* element, const Document& document)
 {
-    DCHECK_EQ(element->getCustomElementState(), Element::Upgraded);
+    DCHECK_EQ(element->getV0CustomElementState(), Element::V0Upgraded);
     if (!document.domWindow())
         return;
     V0CustomElementScheduler::scheduleCallback(element->customElementDefinition()->callbacks(), element, V0CustomElementLifecycleCallbacks::AttachedCallback);
@@ -133,7 +133,7 @@
 
 void V0CustomElement::didDetach(Element* element, const Document& document)
 {
-    DCHECK_EQ(element->getCustomElementState(), Element::Upgraded);
+    DCHECK_EQ(element->getV0CustomElementState(), Element::V0Upgraded);
     if (!document.domWindow())
         return;
     V0CustomElementScheduler::scheduleCallback(element->customElementDefinition()->callbacks(), element, V0CustomElementLifecycleCallbacks::DetachedCallback);
@@ -141,13 +141,13 @@
 
 void V0CustomElement::wasDestroyed(Element* element)
 {
-    switch (element->getCustomElementState()) {
-    case Element::NotCustomElement:
+    switch (element->getV0CustomElementState()) {
+    case Element::V0NotCustomElement:
         ASSERT_NOT_REACHED();
         break;
 
-    case Element::WaitingForUpgrade:
-    case Element::Upgraded:
+    case Element::V0WaitingForUpgrade:
+    case Element::V0Upgraded:
         V0CustomElementObserver::notifyElementWasDestroyed(element);
         break;
     }
diff --git a/third_party/WebKit/Source/core/dom/custom/V0CustomElementRegistrationContext.cpp b/third_party/WebKit/Source/core/dom/custom/V0CustomElementRegistrationContext.cpp
index bcdbdd2..771316f7 100644
--- a/third_party/WebKit/Source/core/dom/custom/V0CustomElementRegistrationContext.cpp
+++ b/third_party/WebKit/Source/core/dom/custom/V0CustomElementRegistrationContext.cpp
@@ -81,7 +81,7 @@
         return Element::create(tagName, &document);
     }
 
-    element->setCustomElementState(Element::WaitingForUpgrade);
+    element->setV0CustomElementState(Element::V0WaitingForUpgrade);
     resolveOrScheduleResolution(element, nullAtom);
     return element;
 }
@@ -101,7 +101,7 @@
     DCHECK(!type.isNull());
 
     V0CustomElementDescriptor descriptor(type, element->namespaceURI(), element->localName());
-    DCHECK_EQ(element->getCustomElementState(), Element::WaitingForUpgrade);
+    DCHECK_EQ(element->getV0CustomElementState(), Element::V0WaitingForUpgrade);
 
     V0CustomElementScheduler::resolveOrScheduleResolution(this, element, descriptor);
 }
@@ -112,7 +112,7 @@
     if (definition) {
         V0CustomElement::define(element, definition);
     } else {
-        DCHECK_EQ(element->getCustomElementState(), Element::WaitingForUpgrade);
+        DCHECK_EQ(element->getV0CustomElementState(), Element::V0WaitingForUpgrade);
         m_candidates->add(descriptor, element);
     }
 }
@@ -134,7 +134,7 @@
     if (!context)
         return;
 
-    if (element->isCustomElement()) {
+    if (element->isV0CustomElement()) {
         // This can happen if:
         // 1. The element has a custom tag, which takes precedence over
         //    type extensions.
@@ -149,7 +149,7 @@
     if (!V0CustomElement::isValidName(type))
         return;
 
-    element->setCustomElementState(Element::WaitingForUpgrade);
+    element->setV0CustomElementState(Element::V0WaitingForUpgrade);
     context->didGiveTypeExtension(element, element->document().convertLocalName(type));
 }
 
diff --git a/third_party/WebKit/Source/core/events/EventTarget.h b/third_party/WebKit/Source/core/events/EventTarget.h
index cac244aa..7417aac 100644
--- a/third_party/WebKit/Source/core/events/EventTarget.h
+++ b/third_party/WebKit/Source/core/events/EventTarget.h
@@ -32,8 +32,9 @@
 #ifndef EventTarget_h
 #define EventTarget_h
 
+#include "bindings/core/v8/AddEventListenerOptionsOrBoolean.h"
+#include "bindings/core/v8/EventListenerOptionsOrBoolean.h"
 #include "bindings/core/v8/ScriptWrappable.h"
-#include "bindings/core/v8/UnionTypesCore.h"
 #include "core/CoreExport.h"
 #include "core/EventNames.h"
 #include "core/EventTargetNames.h"
diff --git a/third_party/WebKit/Source/core/events/PointerEventFactory.cpp b/third_party/WebKit/Source/core/events/PointerEventFactory.cpp
index 9eed8a9e..56a5a16 100644
--- a/third_party/WebKit/Source/core/events/PointerEventFactory.cpp
+++ b/third_party/WebKit/Source/core/events/PointerEventFactory.cpp
@@ -92,6 +92,10 @@
     EventTarget* relatedTarget,
     LocalDOMWindow* view)
 {
+    DCHECK(mouseEventName == EventTypeNames::mousemove
+        || mouseEventName == EventTypeNames::mousedown
+        || mouseEventName == EventTypeNames::mouseup);
+
     AtomicString pointerEventName = pointerEventNameForMouseEventName(mouseEventName);
     unsigned buttons = MouseEvent::platformModifiersToButtons(mouseEvent.getModifiers());
     PointerEventInit pointerEventInit;
@@ -119,14 +123,16 @@
     if (pointerEventName == EventTypeNames::pointerdown
         || pointerEventName == EventTypeNames::pointerup) {
         pointerEventInit.setButton(mouseEvent.button());
-    } else {
-        // TODO(crbug.com/587955): We are setting NoButton for transition
-        // pointerevents should be resolved as part of this bug
+    } else { // Only when pointerEventName == EventTypeNames::pointermove
         pointerEventInit.setButton(NoButton);
     }
     pointerEventInit.setPressure(getPointerEventPressure(
         mouseEvent.pointerProperties().force, pointerEventInit.buttons()));
 
+    // Set width/height to 1 because it matches Edge (and supported by the spec).
+    pointerEventInit.setWidth(1);
+    pointerEventInit.setHeight(1);
+
     UIEventWithKeyState::setFromPlatformModifiers(pointerEventInit, mouseEvent.getModifiers());
 
     // Make sure chorded buttons fire pointermove instead of pointerup/down.
@@ -146,7 +152,8 @@
 PointerEvent* PointerEventFactory::create(const AtomicString& type,
     const PlatformTouchPoint& touchPoint, PlatformEvent::Modifiers modifiers,
     const FloatSize& pointRadius,
-    const FloatPoint& clientPoint)
+    const FloatPoint& clientPoint,
+    DOMWindow* view)
 {
     const PlatformTouchPoint::TouchState pointState = touchPoint.state();
 
@@ -175,6 +182,7 @@
     pointerEventInit.setButton(pointerPressedOrReleased ? LeftButton: NoButton);
     pointerEventInit.setPressure(getPointerEventPressure(
         touchPoint.force(), pointerEventInit.buttons()));
+    pointerEventInit.setView(view);
 
     UIEventWithKeyState::setFromPlatformModifiers(pointerEventInit, modifiers);
 
@@ -218,7 +226,7 @@
     return PointerEvent::create(type, pointerEventInit);
 }
 
-PointerEvent* PointerEventFactory::createPointerTransitionEvent(
+PointerEvent* PointerEventFactory::createPointerBoundaryEvent(
     PointerEvent* pointerEvent,
     const AtomicString& type,
     EventTarget* relatedTarget)
@@ -244,6 +252,7 @@
     pointerEventInit.setButton(pointerEvent->button());
     pointerEventInit.setButtons(pointerEvent->buttons());
     pointerEventInit.setPressure(pointerEvent->pressure());
+    pointerEventInit.setView(pointerEvent->view());
 
     setBubblesAndCancelable(pointerEventInit, type);
 
diff --git a/third_party/WebKit/Source/core/events/PointerEventFactory.h b/third_party/WebKit/Source/core/events/PointerEventFactory.h
index 08becb5..feb668e 100644
--- a/third_party/WebKit/Source/core/events/PointerEventFactory.h
+++ b/third_party/WebKit/Source/core/events/PointerEventFactory.h
@@ -37,7 +37,8 @@
     PointerEvent* create(const AtomicString& type,
         const PlatformTouchPoint&, PlatformEvent::Modifiers,
         const FloatSize& pointRadius,
-        const FloatPoint& clientPoint);
+        const FloatPoint& clientPoint,
+        DOMWindow*);
 
     PointerEvent* createPointerCancelEvent(
         const int pointerId, const WebPointerProperties::PointerType);
@@ -47,8 +48,8 @@
         PointerEvent*,
         const AtomicString&);
 
-    // For creating transition events (i.e pointerout/leave/over/enter)
-    PointerEvent* createPointerTransitionEvent(
+    // For creating boundary events (i.e pointerout/leave/over/enter)
+    PointerEvent* createPointerBoundaryEvent(
         PointerEvent*,
         const AtomicString&,
         EventTarget*);
diff --git a/third_party/WebKit/Source/core/events/PointerEventFactoryTest.cpp b/third_party/WebKit/Source/core/events/PointerEventFactoryTest.cpp
index 359f2733..c8c0c945 100644
--- a/third_party/WebKit/Source/core/events/PointerEventFactoryTest.cpp
+++ b/third_party/WebKit/Source/core/events/PointerEventFactoryTest.cpp
@@ -88,7 +88,7 @@
     const AtomicString& type)
 {
     PointerEvent* clonePointerEvent = m_pointerEventFactory.
-        createPointerTransitionEvent(pointerEvent, type, nullptr);
+        createPointerBoundaryEvent(pointerEvent, type, nullptr);
     EXPECT_EQ(clonePointerEvent->pointerType(), pointerEvent->pointerType());
     EXPECT_EQ(clonePointerEvent->pointerId(), pointerEvent->pointerId());
     EXPECT_EQ(clonePointerEvent->isPrimary(), pointerEvent->isPrimary());
@@ -101,7 +101,7 @@
     PlatformTouchPoint::TouchState state)
 {
     PointerEvent* pointerEvent = m_pointerEventFactory.create(
-        EventTypeNames::pointerdown, PointerEventFactoryTest::PlatformTouchPointBuilder(pointerType, rawId, state), PlatformEvent::NoModifiers, FloatSize(), FloatPoint());
+        EventTypeNames::pointerdown, PointerEventFactoryTest::PlatformTouchPointBuilder(pointerType, rawId, state), PlatformEvent::NoModifiers, FloatSize(), FloatPoint(), nullptr);
     EXPECT_EQ(uniqueId, pointerEvent->pointerId());
     EXPECT_EQ(isPrimary, pointerEvent->isPrimary());
     return pointerEvent;
@@ -113,7 +113,7 @@
     PlatformEvent::Modifiers modifiers)
 {
     PointerEvent* pointerEvent = m_pointerEventFactory.create(
-        EventTypeNames::mouseenter, PlatformMouseEventBuilder(pointerType, rawId, modifiers), nullptr, nullptr);
+        EventTypeNames::mousedown, PlatformMouseEventBuilder(pointerType, rawId, modifiers), nullptr, nullptr);
     EXPECT_EQ(uniqueId, pointerEvent->pointerId());
     EXPECT_EQ(isPrimary, pointerEvent->isPrimary());
     return pointerEvent;
diff --git a/third_party/WebKit/Source/core/fetch/FetchContext.cpp b/third_party/WebKit/Source/core/fetch/FetchContext.cpp
index c91f368..1517cb8 100644
--- a/third_party/WebKit/Source/core/fetch/FetchContext.cpp
+++ b/third_party/WebKit/Source/core/fetch/FetchContext.cpp
@@ -65,11 +65,11 @@
 {
 }
 
-void FetchContext::dispatchDidLoadResourceFromMemoryCache(const Resource*, WebURLRequest::FrameType, WebURLRequest::RequestContext)
+void FetchContext::dispatchDidLoadResourceFromMemoryCache(Resource*, WebURLRequest::FrameType, WebURLRequest::RequestContext)
 {
 }
 
-void FetchContext::dispatchDidReceiveResponse(unsigned long, const ResourceResponse&, WebURLRequest::FrameType, WebURLRequest::RequestContext, ResourceLoader*)
+void FetchContext::dispatchDidReceiveResponse(unsigned long, const ResourceResponse&, WebURLRequest::FrameType, WebURLRequest::RequestContext, Resource*)
 {
 }
 
diff --git a/third_party/WebKit/Source/core/fetch/FetchContext.h b/third_party/WebKit/Source/core/fetch/FetchContext.h
index d229de2..784f19f7 100644
--- a/third_party/WebKit/Source/core/fetch/FetchContext.h
+++ b/third_party/WebKit/Source/core/fetch/FetchContext.h
@@ -77,8 +77,8 @@
 
     virtual void dispatchDidChangeResourcePriority(unsigned long identifier, ResourceLoadPriority, int intraPriorityValue);
     virtual void dispatchWillSendRequest(unsigned long identifier, ResourceRequest&, const ResourceResponse& redirectResponse, const FetchInitiatorInfo& = FetchInitiatorInfo());
-    virtual void dispatchDidLoadResourceFromMemoryCache(const Resource*, WebURLRequest::FrameType, WebURLRequest::RequestContext);
-    virtual void dispatchDidReceiveResponse(unsigned long identifier, const ResourceResponse&, WebURLRequest::FrameType, WebURLRequest::RequestContext, ResourceLoader* = 0);
+    virtual void dispatchDidLoadResourceFromMemoryCache(Resource*, WebURLRequest::FrameType, WebURLRequest::RequestContext);
+    virtual void dispatchDidReceiveResponse(unsigned long identifier, const ResourceResponse&, WebURLRequest::FrameType, WebURLRequest::RequestContext, Resource*);
     virtual void dispatchDidReceiveData(unsigned long identifier, const char* data, int dataLength, int encodedDataLength);
     virtual void dispatchDidDownloadData(unsigned long identifier, int dataLength, int encodedDataLength);
     virtual void dispatchDidFinishLoading(unsigned long identifier, double finishTime, int64_t encodedDataLength);
diff --git a/third_party/WebKit/Source/core/fetch/ImageResource.cpp b/third_party/WebKit/Source/core/fetch/ImageResource.cpp
index 3aa08806..81db1364 100644
--- a/third_party/WebKit/Source/core/fetch/ImageResource.cpp
+++ b/third_party/WebKit/Source/core/fetch/ImageResource.cpp
@@ -538,7 +538,7 @@
             setStatus(Cached);
         checkNotify();
         if (m_loader)
-            m_loader->didFinishLoadingOnePart(0, WebURLLoaderClient::kUnknownEncodedDataLength);
+            m_loader->didFinishLoadingFirstPartInMultipart();
     }
 }
 
diff --git a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp
index 1b9ad3d..4e1613a4 100644
--- a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp
+++ b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp
@@ -814,11 +814,6 @@
     }
 }
 
-void ResourceFetcher::didLoadResource(Resource* resource)
-{
-    context().didLoadResource(resource);
-}
-
 int ResourceFetcher::requestCount() const
 {
     return m_loaders ? m_loaders->size() : 0;
@@ -877,12 +872,19 @@
     return m_archive ? m_archive->mainResource() : nullptr;
 }
 
-void ResourceFetcher::didFinishLoading(Resource* resource, double finishTime, int64_t encodedDataLength)
+void ResourceFetcher::didFinishLoading(Resource* resource, double finishTime, int64_t encodedDataLength, DidFinishLoadingReason finishReason)
 {
     TRACE_EVENT_ASYNC_END0("blink.net", "Resource", resource);
-    // The ResourceLoader might be in |m_nonBlockingLoaders| for multipart responses.
-    ASSERT(resource);
-    ASSERT(!(m_loaders && m_loaders->contains(resource->loader())));
+    DCHECK(resource);
+
+    // When loading a multipart resource, make the loader non-block when
+    // finishing loading the first part.
+    if (finishReason == DidFinishFirstPartInMultipart)
+        moveResourceLoaderToNonBlocking(resource->loader());
+    else
+        removeResourceLoader(resource->loader());
+    DCHECK(!m_loaders || !m_loaders->contains(resource->loader()));
+    DCHECK(finishReason == DidFinishFirstPartInMultipart || !m_nonBlockingLoaders || !m_nonBlockingLoaders->contains(resource->loader()));
 
     if (OwnPtr<ResourceTimingInfo> info = m_resourceTimingInfoMap.take(resource)) {
         if (resource->response().isHTTP() && resource->response().httpStatusCode() < 400) {
@@ -894,18 +896,23 @@
         }
     }
     context().dispatchDidFinishLoading(resource->identifier(), finishTime, encodedDataLength);
+    if (finishReason == DidFinishLoading)
+        resource->finish(finishTime);
+    context().didLoadResource(resource);
 }
 
-void ResourceFetcher::didFailLoading(const Resource* resource, const ResourceError& error)
+void ResourceFetcher::didFailLoading(Resource* resource, const ResourceError& error)
 {
     TRACE_EVENT_ASYNC_END0("blink.net", "Resource", resource);
     removeResourceLoader(resource->loader());
     m_resourceTimingInfoMap.take(const_cast<Resource*>(resource));
     bool isInternalRequest = resource->options().initiatorInfo.name == FetchInitiatorTypeNames::internal;
     context().dispatchDidFail(resource->identifier(), error, isInternalRequest);
+    resource->error(error);
+    context().didLoadResource(resource);
 }
 
-void ResourceFetcher::didReceiveResponse(const Resource* resource, const ResourceResponse& response)
+void ResourceFetcher::didReceiveResponse(Resource* resource, const ResourceResponse& response)
 {
     // If the response is fetched via ServiceWorker, the original URL of the response could be different from the URL of the request.
     // We check the URL not to load the resources which are forbidden by the page CSP.
@@ -919,7 +926,7 @@
             return;
         }
     }
-    context().dispatchDidReceiveResponse(resource->identifier(), response, resource->resourceRequest().frameType(), resource->resourceRequest().requestContext(), resource->loader());
+    context().dispatchDidReceiveResponse(resource->identifier(), response, resource->resourceRequest().frameType(), resource->resourceRequest().requestContext(), resource);
 }
 
 void ResourceFetcher::didReceiveData(const Resource* resource, const char* data, int dataLength, int encodedDataLength)
@@ -947,7 +954,7 @@
 
 void ResourceFetcher::willStartLoadingResource(Resource* resource, ResourceLoader* loader, ResourceRequest& request)
 {
-    if (loader->cachedResource()->shouldBlockLoadEvent()) {
+    if (resource->shouldBlockLoadEvent()) {
         if (!m_loaders)
             m_loaders = ResourceLoaderSet::create();
         m_loaders->add(loader);
diff --git a/third_party/WebKit/Source/core/fetch/ResourceFetcher.h b/third_party/WebKit/Source/core/fetch/ResourceFetcher.h
index 627f1fe..79e91e4a 100644
--- a/third_party/WebKit/Source/core/fetch/ResourceFetcher.h
+++ b/third_party/WebKit/Source/core/fetch/ResourceFetcher.h
@@ -103,19 +103,19 @@
     void stopFetching();
     bool isFetching() const;
 
-    void didLoadResource(Resource*);
     bool willFollowRedirect(Resource*, ResourceRequest&, const ResourceResponse&);
-    void didFinishLoading(Resource*, double finishTime, int64_t encodedDataLength);
-    void didFailLoading(const Resource*, const ResourceError&);
-    void didReceiveResponse(const Resource*, const ResourceResponse&);
+    enum DidFinishLoadingReason {
+        DidFinishLoading,
+        DidFinishFirstPartInMultipart
+    };
+    void didFinishLoading(Resource*, double finishTime, int64_t encodedDataLength, DidFinishLoadingReason);
+    void didFailLoading(Resource*, const ResourceError&);
+    void didReceiveResponse(Resource*, const ResourceResponse&);
     void didReceiveData(const Resource*, const char* data, int dataLength, int encodedDataLength);
     void didDownloadData(const Resource*, int dataLength, int encodedDataLength);
     void willStartLoadingResource(Resource*, ResourceLoader*, ResourceRequest&);
     bool defersLoading() const;
 
-    void moveResourceLoaderToNonBlocking(ResourceLoader*);
-    void removeResourceLoader(ResourceLoader*);
-
     enum AccessControlLoggingDecision {
         ShouldLogAccessControlErrors,
         ShouldNotLogAccessControlErrors
@@ -164,6 +164,8 @@
     RevalidationPolicy determineRevalidationPolicy(Resource::Type, const FetchRequest&, Resource* existingResource, bool isStaticData) const;
 
     void moveCachedNonBlockingResourceToBlocking(Resource*, const FetchRequest&);
+    void moveResourceLoaderToNonBlocking(ResourceLoader*);
+    void removeResourceLoader(ResourceLoader*);
 
     void initializeResourceRequest(ResourceRequest&, Resource::Type, FetchRequest::DeferOption);
 
diff --git a/third_party/WebKit/Source/core/fetch/ResourceLoader.cpp b/third_party/WebKit/Source/core/fetch/ResourceLoader.cpp
index 14068bdc1..80393f4 100644
--- a/third_party/WebKit/Source/core/fetch/ResourceLoader.cpp
+++ b/third_party/WebKit/Source/core/fetch/ResourceLoader.cpp
@@ -54,9 +54,7 @@
 
 ResourceLoader::ResourceLoader(ResourceFetcher* fetcher, Resource* resource)
     : m_fetcher(fetcher)
-    , m_notifiedLoadComplete(false)
     , m_resource(resource)
-    , m_state(ConnectionStateNew)
 {
     ASSERT(m_resource);
     ASSERT(m_fetcher);
@@ -64,7 +62,7 @@
 
 ResourceLoader::~ResourceLoader()
 {
-    ASSERT(m_state == ConnectionStateReleased);
+    DCHECK(!m_loader);
 }
 
 DEFINE_TRACE(ResourceLoader)
@@ -73,29 +71,11 @@
     visitor->trace(m_resource);
 }
 
-void ResourceLoader::releaseResources()
-{
-    ASSERT(m_state != ConnectionStateReleased);
-    ASSERT(m_notifiedLoadComplete);
-    m_fetcher->didLoadResource(m_resource.get());
-    ASSERT(m_state != ConnectionStateReleased);
-    m_resource = nullptr;
-    m_state = ConnectionStateReleased;
-    if (m_loader) {
-        m_loader->cancel();
-        m_loader.clear();
-    }
-    m_fetcher.clear();
-}
-
 void ResourceLoader::start(ResourceRequest& request)
 {
     ASSERT(!m_loader);
 
     m_fetcher->willStartLoadingResource(m_resource.get(), this, request);
-    RELEASE_ASSERT(m_state == ConnectionStateNew);
-    m_state = ConnectionStateStarted;
-
     m_loader = adoptPtr(Platform::current()->createURLLoader());
     m_loader->setDefersLoading(m_fetcher->defersLoading());
     ASSERT(m_loader);
@@ -115,68 +95,23 @@
 
 void ResourceLoader::didDownloadData(WebURLLoader*, int length, int encodedDataLength)
 {
-    RELEASE_ASSERT(m_state == ConnectionStateReceivedResponse);
     m_fetcher->didDownloadData(m_resource.get(), length, encodedDataLength);
-    if (m_state == ConnectionStateReleased)
-        return;
     m_resource->didDownloadData(length);
 }
 
-void ResourceLoader::didFinishLoadingOnePart(double finishTime, int64_t encodedDataLength)
-{
-    ASSERT(m_state != ConnectionStateReleased);
-    if (m_state == ConnectionStateFinishedLoading) {
-        m_fetcher->removeResourceLoader(this);
-    } else {
-        // When loading a multipart resource, make the loader non-block when
-        // finishing loading the first part.
-        m_fetcher->moveResourceLoaderToNonBlocking(this);
-
-        m_fetcher->didLoadResource(m_resource.get());
-        if (m_state == ConnectionStateReleased)
-            return;
-    }
-
-    if (m_notifiedLoadComplete)
-        return;
-    m_notifiedLoadComplete = true;
-    m_fetcher->didFinishLoading(m_resource.get(), finishTime, encodedDataLength);
-}
-
 void ResourceLoader::didChangePriority(ResourceLoadPriority loadPriority, int intraPriorityValue)
 {
-    ASSERT(m_state != ConnectionStateReleased);
     if (m_loader)
         m_loader->didChangePriority(static_cast<WebURLRequest::Priority>(loadPriority), intraPriorityValue);
 }
 
 void ResourceLoader::cancel()
 {
-    cancel(ResourceError());
-}
-
-void ResourceLoader::cancel(const ResourceError& error)
-{
-    ASSERT(m_state != ConnectionStateFinishedLoading);
-    ASSERT(m_state != ConnectionStateReleased);
-
-    // If we don't immediately clear m_loader when cancelling, we might get
-    // unexpected reentrancy. m_resource->error() can trigger JS events, which
-    // could start a modal dialog. Normally, a modal dialog would defer loading
-    // and prevent receiving messages for a cancelled ResourceLoader, but
-    // m_fetcher->didFailLoading() severs the connection by which all of a
-    // page's loads are deferred. A response can then arrive, see m_state
-    // is ConnectionStateFinishedLoading, and ASSERT or break in other ways.
-    if (m_loader) {
-        m_loader->cancel();
-        m_loader.clear();
-    }
-    didFail(nullptr, error.isNull() ? ResourceError::cancelledError(m_resource->lastResourceRequest().url()) : error);
+    didFail(nullptr, ResourceError::cancelledError(m_resource->lastResourceRequest().url()));
 }
 
 void ResourceLoader::willFollowRedirect(WebURLLoader*, WebURLRequest& passedNewRequest, const WebURLResponse& passedRedirectResponse)
 {
-    ASSERT(m_state != ConnectionStateReleased);
     ASSERT(!passedNewRequest.isNull());
     ASSERT(!passedRedirectResponse.isNull());
 
@@ -188,14 +123,13 @@
         m_resource->willFollowRedirect(newRequest, redirectResponse);
     } else {
         m_resource->willNotFollowRedirect();
-        if (m_state != ConnectionStateReleased)
-            cancel(ResourceError::cancelledDueToAccessCheckError(newRequest.url()));
+        if (m_loader)
+            didFail(nullptr, ResourceError::cancelledDueToAccessCheckError(newRequest.url()));
     }
 }
 
 void ResourceLoader::didReceiveCachedMetadata(WebURLLoader*, const char* data, int length)
 {
-    RELEASE_ASSERT(m_state == ConnectionStateReceivedResponse || m_state == ConnectionStateReceivingData);
     m_resource->setSerializedCachedMetadata(data, length);
 }
 
@@ -215,19 +149,12 @@
     ASSERT(!response.isNull());
     // |rawHandle|'s ownership is transferred to the callee.
     OwnPtr<WebDataConsumerHandle> handle = adoptPtr(rawHandle);
-
-    bool isValidStateTransition = (m_state == ConnectionStateStarted || m_state == ConnectionStateReceivedResponse);
-    RELEASE_ASSERT(isValidStateTransition);
-    m_state = ConnectionStateReceivedResponse;
-
     const ResourceResponse& resourceResponse = response.toResourceResponse();
 
     if (responseNeedsAccessControlCheck()) {
         if (response.wasFetchedViaServiceWorker()) {
             if (response.wasFallbackRequiredByServiceWorker()) {
-                m_loader->cancel();
                 m_loader.clear();
-                m_state = ConnectionStateStarted;
                 m_loader = adoptPtr(Platform::current()->createURLLoader());
                 ASSERT(m_loader);
                 ResourceRequest request = m_resource->lastResourceRequest();
@@ -241,23 +168,23 @@
                 m_resource->setResponse(resourceResponse);
             if (!m_fetcher->canAccessResource(m_resource.get(), m_resource->options().securityOrigin.get(), response.url(), ResourceFetcher::ShouldLogAccessControlErrors)) {
                 m_fetcher->didReceiveResponse(m_resource.get(), resourceResponse);
-                cancel(ResourceError::cancelledDueToAccessCheckError(KURL(response.url())));
+                didFail(nullptr, ResourceError::cancelledDueToAccessCheckError(KURL(response.url())));
                 return;
             }
         }
     }
 
     m_resource->responseReceived(resourceResponse, std::move(handle));
-    if (m_state == ConnectionStateReleased)
+    if (!m_loader)
         return;
 
     m_fetcher->didReceiveResponse(m_resource.get(), resourceResponse);
-    if (m_state == ConnectionStateReleased)
+    if (!m_loader)
         return;
 
     if (m_resource->response().httpStatusCode() < 400 || m_resource->shouldIgnoreHTTPStatusCodeErrors())
         return;
-    cancel(ResourceError::cancelledError(resourceResponse.url()));
+    didFail(nullptr, ResourceError::cancelledError(resourceResponse.url()));
 }
 
 void ResourceLoader::didReceiveResponse(WebURLLoader* loader, const WebURLResponse& response)
@@ -267,44 +194,26 @@
 
 void ResourceLoader::didReceiveData(WebURLLoader*, const char* data, int length, int encodedDataLength)
 {
-    RELEASE_ASSERT(m_state == ConnectionStateReceivedResponse || m_state == ConnectionStateReceivingData);
-    m_state = ConnectionStateReceivingData;
-
-    // It is possible to receive data on uninitialized resources if it had an error status code, and we are running a nested message
-    // loop. When this occurs, ignoring the data is the correct action.
-    if (m_resource->response().httpStatusCode() >= 400 && !m_resource->shouldIgnoreHTTPStatusCodeErrors())
-        return;
-
-    // FIXME: If we get a resource with more than 2B bytes, this code won't do the right thing.
-    // However, with today's computers and networking speeds, this won't happen in practice.
-    // Could be an issue with a giant local file.
-    m_fetcher->didReceiveData(m_resource.get(), data, length, encodedDataLength);
-    if (m_state == ConnectionStateReleased)
-        return;
     RELEASE_ASSERT(length >= 0);
+    m_fetcher->didReceiveData(m_resource.get(), data, length, encodedDataLength);
     m_resource->appendData(data, length);
 }
 
+void ResourceLoader::didFinishLoadingFirstPartInMultipart()
+{
+    m_fetcher->didFinishLoading(m_resource.get(), 0, WebURLLoaderClient::kUnknownEncodedDataLength, ResourceFetcher::DidFinishFirstPartInMultipart);
+}
+
 void ResourceLoader::didFinishLoading(WebURLLoader*, double finishTime, int64_t encodedDataLength)
 {
-    RELEASE_ASSERT(m_state == ConnectionStateReceivedResponse || m_state == ConnectionStateReceivingData);
-    m_state = ConnectionStateFinishedLoading;
-    didFinishLoadingOnePart(finishTime, encodedDataLength);
-    ASSERT(m_state != ConnectionStateReleased);
-    m_resource->finish(finishTime);
-    releaseResources();
+    m_loader.clear();
+    m_fetcher->didFinishLoading(m_resource.get(), finishTime, encodedDataLength, ResourceFetcher::DidFinishLoading);
 }
 
 void ResourceLoader::didFail(WebURLLoader*, const WebURLError& error)
 {
-    ASSERT(m_state != ConnectionStateFinishedLoading);
-    ASSERT(m_state != ConnectionStateReleased);
-    m_state = ConnectionStateFinishedLoading;
-    m_notifiedLoadComplete = true;
+    m_loader.clear();
     m_fetcher->didFailLoading(m_resource.get(), error);
-    ASSERT(m_state != ConnectionStateReleased);
-    m_resource->error(error);
-    releaseResources();
 }
 
 void ResourceLoader::requestSynchronously(ResourceRequest& request)
@@ -327,18 +236,17 @@
     WebURLError errorOut;
     WebData dataOut;
     m_loader->loadSynchronously(requestIn, responseOut, errorOut, dataOut);
+
+    // A message dispatched while synchronously fetching the resource
+    // can bring about the cancellation of this load.
+    if (!m_loader)
+        return;
     if (errorOut.reason) {
-        if (m_state == ConnectionStateReleased) {
-            // A message dispatched while synchronously fetching the resource
-            // can bring about the cancellation of this load.
-            ASSERT(!m_resource);
-            return;
-        }
         didFail(0, errorOut);
         return;
     }
     didReceiveResponse(0, responseOut);
-    if (m_state == ConnectionStateReleased)
+    if (!m_loader)
         return;
     RefPtr<ResourceLoadInfo> resourceLoadInfo = responseOut.toResourceResponse().resourceLoadInfo();
     int64_t encodedDataLength = resourceLoadInfo ? resourceLoadInfo->encodedDataLength : WebURLLoaderClient::kUnknownEncodedDataLength;
diff --git a/third_party/WebKit/Source/core/fetch/ResourceLoader.h b/third_party/WebKit/Source/core/fetch/ResourceLoader.h
index c618bc9..af405b82 100644
--- a/third_party/WebKit/Source/core/fetch/ResourceLoader.h
+++ b/third_party/WebKit/Source/core/fetch/ResourceLoader.h
@@ -48,32 +48,36 @@
     ~ResourceLoader() override;
     DECLARE_TRACE();
 
-    // Promptly release m_loader.
-    EAGERLY_FINALIZE();
-
     void start(ResourceRequest&);
-
     void cancel();
-    void cancel(const ResourceError&);
-
-    Resource* cachedResource() { return m_resource.get(); }
 
     void setDefersLoading(bool);
 
     void didChangePriority(ResourceLoadPriority, int intraPriorityValue);
 
     // WebURLLoaderClient
+    //
+    // A succesful load will consist of:
+    // 0+  willFollowRedirect()
+    // 0+  didSendData()
+    // 1   didReceiveResponse()
+    // 0-1 didReceiveCachedMetadata()
+    // 0+  didReceiveData() or didDownloadData(), but never both
+    // 1   didFinishLoading()
+    // A failed load is indicated by 1 didFail(), which can occur at any time
+    // before didFinishLoading(), including synchronous inside one of the other
+    // callbacks via ResourceLoader::cancel()
     void willFollowRedirect(WebURLLoader*, WebURLRequest&, const WebURLResponse& redirectResponse) override;
     void didSendData(WebURLLoader*, unsigned long long bytesSent, unsigned long long totalBytesToBeSent) override;
     void didReceiveResponse(WebURLLoader*, const WebURLResponse&) override;
     void didReceiveResponse(WebURLLoader*, const WebURLResponse&, WebDataConsumerHandle*) override;
-    void didReceiveData(WebURLLoader*, const char*, int, int encodedDataLength) override;
     void didReceiveCachedMetadata(WebURLLoader*, const char* data, int length) override;
+    void didReceiveData(WebURLLoader*, const char*, int, int encodedDataLength) override;
+    void didDownloadData(WebURLLoader*, int, int) override;
     void didFinishLoading(WebURLLoader*, double finishTime, int64_t encodedDataLength) override;
     void didFail(WebURLLoader*, const WebURLError&) override;
-    void didDownloadData(WebURLLoader*, int, int) override;
 
-    void didFinishLoadingOnePart(double finishTime, int64_t encodedDataLength);
+    void didFinishLoadingFirstPartInMultipart();
 
 private:
     // Assumes ResourceFetcher and Resource are non-null.
@@ -83,29 +87,9 @@
 
     bool responseNeedsAccessControlCheck() const;
 
-    ResourceRequest& applyOptions(ResourceRequest&) const;
-
-    void releaseResources();
-
     OwnPtr<WebURLLoader> m_loader;
     Member<ResourceFetcher> m_fetcher;
-
-    bool m_notifiedLoadComplete;
-
-    enum ConnectionState {
-        ConnectionStateNew,
-        ConnectionStateStarted,
-        ConnectionStateReceivedResponse,
-        ConnectionStateReceivingData,
-        ConnectionStateFinishedLoading,
-        ConnectionStateReleased
-    };
-
     Member<Resource> m_resource;
-
-    // Used for sanity checking to make sure we don't experience illegal state
-    // transitions.
-    ConnectionState m_state;
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/core/fileapi/Blob.h b/third_party/WebKit/Source/core/fileapi/Blob.h
index 9fac756..c6b9f31 100644
--- a/third_party/WebKit/Source/core/fileapi/Blob.h
+++ b/third_party/WebKit/Source/core/fileapi/Blob.h
@@ -31,8 +31,8 @@
 #ifndef Blob_h
 #define Blob_h
 
+#include "bindings/core/v8/ArrayBufferOrArrayBufferViewOrBlobOrUSVString.h"
 #include "bindings/core/v8/ScriptWrappable.h"
-#include "bindings/core/v8/UnionTypesCore.h"
 #include "core/CoreExport.h"
 #include "core/dom/DOMArrayBuffer.h"
 #include "core/dom/DOMArrayBufferView.h"
diff --git a/third_party/WebKit/Source/core/fileapi/File.h b/third_party/WebKit/Source/core/fileapi/File.h
index c2f1254..a42a2ef4 100644
--- a/third_party/WebKit/Source/core/fileapi/File.h
+++ b/third_party/WebKit/Source/core/fileapi/File.h
@@ -26,7 +26,7 @@
 #ifndef File_h
 #define File_h
 
-#include "bindings/core/v8/UnionTypesCore.h"
+#include "bindings/core/v8/ArrayBufferOrArrayBufferViewOrBlobOrUSVString.h"
 #include "core/CoreExport.h"
 #include "core/fileapi/Blob.h"
 #include "platform/heap/Handle.h"
diff --git a/third_party/WebKit/Source/core/fileapi/FileReader.cpp b/third_party/WebKit/Source/core/fileapi/FileReader.cpp
index 7b15720b..8824f8079 100644
--- a/third_party/WebKit/Source/core/fileapi/FileReader.cpp
+++ b/third_party/WebKit/Source/core/fileapi/FileReader.cpp
@@ -31,7 +31,7 @@
 #include "core/fileapi/FileReader.h"
 
 #include "bindings/core/v8/ExceptionState.h"
-#include "bindings/core/v8/UnionTypesCore.h"
+#include "bindings/core/v8/StringOrArrayBuffer.h"
 #include "core/dom/CrossThreadTask.h"
 #include "core/dom/DOMArrayBuffer.h"
 #include "core/dom/Document.h"
diff --git a/third_party/WebKit/Source/core/frame/DOMWindow.cpp b/third_party/WebKit/Source/core/frame/DOMWindow.cpp
index 341f6c3d..4cb8d34a 100644
--- a/third_party/WebKit/Source/core/frame/DOMWindow.cpp
+++ b/third_party/WebKit/Source/core/frame/DOMWindow.cpp
@@ -15,6 +15,7 @@
 #include "core/frame/FrameConsole.h"
 #include "core/frame/LocalDOMWindow.h"
 #include "core/frame/Location.h"
+#include "core/frame/RemoteDOMWindow.h"
 #include "core/frame/RemoteFrame.h"
 #include "core/frame/Settings.h"
 #include "core/frame/UseCounter.h"
@@ -220,18 +221,8 @@
         UseCounter::count(frame(), UseCounter::PostMessageFromInsecureToSecure);
 
     MessageEvent* event = MessageEvent::create(std::move(channels), message, sourceOrigin, String(), source, sourceSuborigin);
-    // Give the embedder a chance to intercept this postMessage.  If the
-    // target is a remote frame, the message will be forwarded through the
-    // browser process.
-    if (frame()->client()->willCheckAndDispatchMessageEvent(target.get(), event, source->document()->frame()))
-        return;
 
-    // Capture stack trace only when inspector front-end is loaded as it may be time consuming.
-    RefPtr<ScriptCallStack> stackTrace;
-    if (InspectorInstrumentation::consoleAgentEnabled(sourceDocument))
-        stackTrace = ScriptCallStack::capture();
-
-    blink::toLocalDOMWindow(this)->schedulePostMessage(event, target.get(), stackTrace.release());
+    schedulePostMessage(event, std::move(target), sourceDocument);
 }
 
 // FIXME: Once we're throwing exceptions for cross-origin access violations, we will always sanitize the target
diff --git a/third_party/WebKit/Source/core/frame/DOMWindow.h b/third_party/WebKit/Source/core/frame/DOMWindow.h
index 793bb96..2c4206aa 100644
--- a/third_party/WebKit/Source/core/frame/DOMWindow.h
+++ b/third_party/WebKit/Source/core/frame/DOMWindow.h
@@ -32,6 +32,7 @@
 class IdleRequestOptions;
 class Location;
 class LocalDOMWindow;
+class MessageEvent;
 class MediaQueryList;
 class Navigator;
 class Screen;
@@ -217,6 +218,8 @@
 protected:
     DOMWindow();
 
+    virtual void schedulePostMessage(MessageEvent*, PassRefPtr<SecurityOrigin> target, Document* source) = 0;
+
     // Set to true when close() has been called. Needed for
     // |window.closed| determinism; having it return 'true'
     // only after the layout widget's deferred window close
diff --git a/third_party/WebKit/Source/core/frame/FrameClient.h b/third_party/WebKit/Source/core/frame/FrameClient.h
index 31497e1..5a31e14 100644
--- a/third_party/WebKit/Source/core/frame/FrameClient.h
+++ b/third_party/WebKit/Source/core/frame/FrameClient.h
@@ -38,9 +38,6 @@
 
     virtual unsigned backForwardLength() = 0;
 
-    // Returns true if the embedder intercepted the postMessage call
-    virtual bool willCheckAndDispatchMessageEvent(SecurityOrigin* /*target*/, MessageEvent*, LocalFrame* /*sourceFrame*/) const { return false; }
-
     virtual void frameFocused() const = 0;
 
     virtual BlameContext* frameBlameContext() { return nullptr; }
diff --git a/third_party/WebKit/Source/core/frame/ImageBitmapTest.cpp b/third_party/WebKit/Source/core/frame/ImageBitmapTest.cpp
index 704bd387..2e13d67 100644
--- a/third_party/WebKit/Source/core/frame/ImageBitmapTest.cpp
+++ b/third_party/WebKit/Source/core/frame/ImageBitmapTest.cpp
@@ -31,7 +31,6 @@
 #include "core/frame/ImageBitmap.h"
 
 #include "SkPixelRef.h" // FIXME: qualify this skia header file.
-#include "bindings/core/v8/UnionTypesCore.h"
 #include "core/dom/Document.h"
 #include "core/fetch/ImageResource.h"
 #include "core/fetch/MemoryCache.h"
diff --git a/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp b/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
index 391a190..dc23781 100644
--- a/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
+++ b/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
@@ -124,7 +124,7 @@
 class PostMessageTimer final : public GarbageCollectedFinalized<PostMessageTimer>, public SuspendableTimer {
     USING_GARBAGE_COLLECTED_MIXIN(PostMessageTimer);
 public:
-    PostMessageTimer(LocalDOMWindow& window, MessageEvent* event, SecurityOrigin* targetOrigin, PassRefPtr<ScriptCallStack> stackTrace, UserGestureToken* userGestureToken)
+    PostMessageTimer(LocalDOMWindow& window, MessageEvent* event, PassRefPtr<SecurityOrigin> targetOrigin, PassRefPtr<ScriptCallStack> stackTrace, UserGestureToken* userGestureToken)
         : SuspendableTimer(window.document())
         , m_event(event)
         , m_window(&window)
@@ -663,14 +663,19 @@
     return m_navigator.get();
 }
 
-void LocalDOMWindow::schedulePostMessage(MessageEvent* event, SecurityOrigin* target, PassRefPtr<ScriptCallStack> stackTrace)
+void LocalDOMWindow::schedulePostMessage(MessageEvent* event, PassRefPtr<SecurityOrigin> target, Document* source)
 {
     // Allowing unbounded amounts of messages to build up for a suspended context
     // is problematic; consider imposing a limit or other restriction if this
     // surfaces often as a problem (see crbug.com/587012).
 
+    // Capture stack trace only when inspector front-end is loaded as it may be time consuming.
+    RefPtr<ScriptCallStack> stackTrace;
+    if (InspectorInstrumentation::consoleAgentEnabled(source))
+        stackTrace = ScriptCallStack::capture();
+
     // Schedule the message.
-    PostMessageTimer* timer = new PostMessageTimer(*this, event, target, stackTrace, UserGestureIndicator::currentToken());
+    PostMessageTimer* timer = new PostMessageTimer(*this, event, target, stackTrace.release(), UserGestureIndicator::currentToken());
     timer->startOneShot(0, BLINK_FROM_HERE);
     timer->suspendIfNeeded();
     m_postMessageTimers.add(timer);
diff --git a/third_party/WebKit/Source/core/frame/LocalDOMWindow.h b/third_party/WebKit/Source/core/frame/LocalDOMWindow.h
index c2b2f4f..6c12890 100644
--- a/third_party/WebKit/Source/core/frame/LocalDOMWindow.h
+++ b/third_party/WebKit/Source/core/frame/LocalDOMWindow.h
@@ -206,6 +206,9 @@
     void addedEventListener(const AtomicString& eventType, RegisteredEventListener&) override;
     void removedEventListener(const AtomicString& eventType, const RegisteredEventListener&) override;
 
+    // Protected DOMWindow overrides.
+    void schedulePostMessage(MessageEvent*, PassRefPtr<SecurityOrigin> target, Document* source) override;
+
 private:
     class WindowFrameObserver;
 
diff --git a/third_party/WebKit/Source/core/frame/RemoteDOMWindow.cpp b/third_party/WebKit/Source/core/frame/RemoteDOMWindow.cpp
index 9afd5e6b..d3159cd 100644
--- a/third_party/WebKit/Source/core/frame/RemoteDOMWindow.cpp
+++ b/third_party/WebKit/Source/core/frame/RemoteDOMWindow.cpp
@@ -8,6 +8,8 @@
 #include "core/css/CSSRuleList.h"
 #include "core/css/CSSStyleDeclaration.h"
 #include "core/css/MediaQueryList.h"
+#include "core/dom/Document.h"
+#include "core/frame/RemoteFrameClient.h"
 
 namespace blink {
 
@@ -343,4 +345,9 @@
     m_frame = nullptr;
 }
 
+void RemoteDOMWindow::schedulePostMessage(MessageEvent* event, PassRefPtr<SecurityOrigin> target, Document* source)
+{
+    m_frame->client()->forwardPostMessage(event, target, source->frame());
+}
+
 } // namespace blink
diff --git a/third_party/WebKit/Source/core/frame/RemoteDOMWindow.h b/third_party/WebKit/Source/core/frame/RemoteDOMWindow.h
index 8c57d74..d65e44f3 100644
--- a/third_party/WebKit/Source/core/frame/RemoteDOMWindow.h
+++ b/third_party/WebKit/Source/core/frame/RemoteDOMWindow.h
@@ -81,6 +81,10 @@
 
     void frameDetached();
 
+protected:
+    // Protected DOMWindow overrides:
+    void schedulePostMessage(MessageEvent*, PassRefPtr<SecurityOrigin> target, Document* source) override;
+
 private:
     explicit RemoteDOMWindow(RemoteFrame&);
 
diff --git a/third_party/WebKit/Source/core/frame/RemoteFrame.cpp b/third_party/WebKit/Source/core/frame/RemoteFrame.cpp
index 9255891..7635c39 100644
--- a/third_party/WebKit/Source/core/frame/RemoteFrame.cpp
+++ b/third_party/WebKit/Source/core/frame/RemoteFrame.cpp
@@ -72,7 +72,7 @@
     ResourceRequest request(url);
     request.setHTTPReferrer(SecurityPolicy::generateReferrer(originDocument.getReferrerPolicy(), url, originDocument.outgoingReferrer()));
     request.setHasUserGesture(userGestureStatus == UserGestureStatus::Active);
-    remoteFrameClient()->navigate(request, replaceCurrentItem);
+    client()->navigate(request, replaceCurrentItem);
 }
 
 void RemoteFrame::navigate(const FrameLoadRequest& passedRequest)
@@ -83,7 +83,7 @@
 
 void RemoteFrame::reload(FrameLoadType frameLoadType, ClientRedirectPolicy clientRedirectPolicy)
 {
-    remoteFrameClient()->reload(frameLoadType, clientRedirectPolicy);
+    client()->reload(frameLoadType, clientRedirectPolicy);
 }
 
 void RemoteFrame::detach(FrameDetachType type)
@@ -125,18 +125,18 @@
 
 void RemoteFrame::forwardInputEvent(Event* event)
 {
-    remoteFrameClient()->forwardInputEvent(event);
+    client()->forwardInputEvent(event);
 }
 
 void RemoteFrame::frameRectsChanged(const IntRect& frameRect)
 {
-    remoteFrameClient()->frameRectsChanged(frameRect);
+    client()->frameRectsChanged(frameRect);
 }
 
 void RemoteFrame::visibilityChanged(bool visible)
 {
-    if (remoteFrameClient())
-        remoteFrameClient()->visibilityChanged(visible);
+    if (client())
+        client()->visibilityChanged(visible);
 }
 
 void RemoteFrame::setView(RemoteFrameView* view)
@@ -169,9 +169,9 @@
         deprecatedLocalOwner()->setWidget(m_view);
 }
 
-RemoteFrameClient* RemoteFrame::remoteFrameClient() const
+RemoteFrameClient* RemoteFrame::client() const
 {
-    return static_cast<RemoteFrameClient*>(client());
+    return static_cast<RemoteFrameClient*>(Frame::client());
 }
 
 void RemoteFrame::setRemotePlatformLayer(WebLayer* layer)
@@ -188,7 +188,7 @@
 
 void RemoteFrame::advanceFocus(WebFocusType type, LocalFrame* source)
 {
-    remoteFrameClient()->advanceFocus(type, source);
+    client()->advanceFocus(type, source);
 }
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/core/frame/RemoteFrame.h b/third_party/WebKit/Source/core/frame/RemoteFrame.h
index 71005c89..7ecd6c8 100644
--- a/third_party/WebKit/Source/core/frame/RemoteFrame.h
+++ b/third_party/WebKit/Source/core/frame/RemoteFrame.h
@@ -60,14 +60,14 @@
 
     RemoteFrameView* view() const;
 
+    RemoteFrameClient* client() const;
+
 private:
     RemoteFrame(RemoteFrameClient*, FrameHost*, FrameOwner*);
 
     // Internal Frame helper overrides:
     WindowProxyManager* getWindowProxyManager() const override { return m_windowProxyManager.get(); }
 
-    RemoteFrameClient* remoteFrameClient() const;
-
     Member<RemoteFrameView> m_view;
     Member<RemoteSecurityContext> m_securityContext;
     Member<RemoteDOMWindow> m_domWindow;
diff --git a/third_party/WebKit/Source/core/frame/RemoteFrameClient.h b/third_party/WebKit/Source/core/frame/RemoteFrameClient.h
index f56e8a38..4c11f78 100644
--- a/third_party/WebKit/Source/core/frame/RemoteFrameClient.h
+++ b/third_party/WebKit/Source/core/frame/RemoteFrameClient.h
@@ -24,6 +24,9 @@
     virtual void reload(FrameLoadType, ClientRedirectPolicy) = 0;
     virtual unsigned backForwardLength() = 0;
 
+    // Forwards a postMessage for a remote frame.
+    virtual void forwardPostMessage(MessageEvent*, PassRefPtr<SecurityOrigin> target, LocalFrame* sourceFrame) const = 0;
+
     // FIXME: Remove this method once we have input routing in the browser
     // process. See http://crbug.com/339659.
     virtual void forwardInputEvent(Event*) = 0;
diff --git a/third_party/WebKit/Source/core/frame/UseCounter.h b/third_party/WebKit/Source/core/frame/UseCounter.h
index d586504..84c6f9b 100644
--- a/third_party/WebKit/Source/core/frame/UseCounter.h
+++ b/third_party/WebKit/Source/core/frame/UseCounter.h
@@ -1176,6 +1176,11 @@
         CSSValueAppearanceRadio = 1360,
         CSSValueAppearanceSearchField = 1361,
         CSSValueAppearanceTextField = 1362,
+        AudioContextCreatePannerAutomated = 1363,
+        PannerNodeSetPosition = 1364,
+        PannerNodeSetOrientation = 1365,
+        AudioListenerSetPosition = 1366,
+        AudioListenerSetOrientation = 1367,
 
         // 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/FormData.h b/third_party/WebKit/Source/core/html/FormData.h
index 503c5d7..c18cf70 100644
--- a/third_party/WebKit/Source/core/html/FormData.h
+++ b/third_party/WebKit/Source/core/html/FormData.h
@@ -31,9 +31,9 @@
 #ifndef FormData_h
 #define FormData_h
 
+#include "bindings/core/v8/FileOrUSVString.h"
 #include "bindings/core/v8/Iterable.h"
 #include "bindings/core/v8/ScriptState.h"
-#include "bindings/core/v8/UnionTypesCore.h"
 #include "core/CoreExport.h"
 #include "platform/heap/Handle.h"
 #include "platform/network/EncodedFormData.h"
diff --git a/third_party/WebKit/Source/core/html/HTMLAllCollection.cpp b/third_party/WebKit/Source/core/html/HTMLAllCollection.cpp
index 386348d..1da655e9 100644
--- a/third_party/WebKit/Source/core/html/HTMLAllCollection.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLAllCollection.cpp
@@ -25,7 +25,7 @@
 
 #include "core/html/HTMLAllCollection.h"
 
-#include "bindings/core/v8/UnionTypesCore.h"
+#include "bindings/core/v8/NodeListOrElement.h"
 #include "core/dom/Element.h"
 #include "core/dom/StaticNodeList.h"
 
diff --git a/third_party/WebKit/Source/core/html/HTMLCanvasElement.h b/third_party/WebKit/Source/core/html/HTMLCanvasElement.h
index eab7b5f..8c23e4dc 100644
--- a/third_party/WebKit/Source/core/html/HTMLCanvasElement.h
+++ b/third_party/WebKit/Source/core/html/HTMLCanvasElement.h
@@ -29,7 +29,6 @@
 #define HTMLCanvasElement_h
 
 #include "bindings/core/v8/ScriptValue.h"
-#include "bindings/core/v8/UnionTypesCore.h"
 #include "core/CoreExport.h"
 #include "core/dom/ContextLifecycleObserver.h"
 #include "core/dom/DOMTypedArray.h"
diff --git a/third_party/WebKit/Source/core/html/HTMLFormControlsCollection.cpp b/third_party/WebKit/Source/core/html/HTMLFormControlsCollection.cpp
index f42e4fe..8bf636d 100644
--- a/third_party/WebKit/Source/core/html/HTMLFormControlsCollection.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLFormControlsCollection.cpp
@@ -23,7 +23,7 @@
 
 #include "core/html/HTMLFormControlsCollection.h"
 
-#include "bindings/core/v8/UnionTypesCore.h"
+#include "bindings/core/v8/RadioNodeListOrElement.h"
 #include "core/HTMLNames.h"
 #include "core/frame/UseCounter.h"
 #include "core/html/HTMLFieldSetElement.h"
diff --git a/third_party/WebKit/Source/core/html/HTMLFormElement.cpp b/third_party/WebKit/Source/core/html/HTMLFormElement.cpp
index a6442ae..2f3a5d48 100644
--- a/third_party/WebKit/Source/core/html/HTMLFormElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLFormElement.cpp
@@ -24,9 +24,9 @@
 
 #include "core/html/HTMLFormElement.h"
 
+#include "bindings/core/v8/RadioNodeListOrElement.h"
 #include "bindings/core/v8/ScriptController.h"
 #include "bindings/core/v8/ScriptEventListener.h"
-#include "bindings/core/v8/UnionTypesCore.h"
 #include "core/HTMLNames.h"
 #include "core/dom/Attribute.h"
 #include "core/dom/Document.h"
diff --git a/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp b/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp
index b0cc0f25..beaa552 100644
--- a/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp
@@ -3270,12 +3270,7 @@
 {
     if (m_textTracks) {
         for (unsigned i = 0; i < m_textTracks->length(); ++i) {
-            TextTrack* track = m_textTracks->anonymousIndexedGetter(i);
-            if (track->getReadinessState() == TextTrack::FailedToLoad)
-                continue;
-
-            if (track->kind() == TextTrack::captionsKeyword()
-                || track->kind() == TextTrack::subtitlesKeyword())
+            if (m_textTracks->anonymousIndexedGetter(i)->canBeRendered())
                 return true;
         }
     }
@@ -3385,9 +3380,7 @@
     // the user has turned captions on).
     for (unsigned i = 0; i < m_textTracks->length(); ++i) {
         TextTrack* textTrack = m_textTracks->anonymousIndexedGetter(i);
-        String kind = textTrack->kind();
-
-        if (kind == TextTrack::subtitlesKeyword() || kind == TextTrack::captionsKeyword())
+        if (textTrack->isVisualKind())
             textTrack->setHasBeenConfigured(false);
     }
 }
diff --git a/third_party/WebKit/Source/core/html/HTMLOptionsCollection.cpp b/third_party/WebKit/Source/core/html/HTMLOptionsCollection.cpp
index 0fe1979..a48e5e5c 100644
--- a/third_party/WebKit/Source/core/html/HTMLOptionsCollection.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLOptionsCollection.cpp
@@ -23,7 +23,9 @@
 
 #include "bindings/core/v8/ExceptionMessages.h"
 #include "bindings/core/v8/ExceptionState.h"
-#include "bindings/core/v8/UnionTypesCore.h"
+#include "bindings/core/v8/HTMLElementOrLong.h"
+#include "bindings/core/v8/HTMLOptionElementOrHTMLOptGroupElement.h"
+#include "bindings/core/v8/NodeListOrElement.h"
 #include "core/dom/StaticNodeList.h"
 #include "core/html/HTMLOptionElement.h"
 #include "core/html/HTMLSelectElement.h"
diff --git a/third_party/WebKit/Source/core/html/HTMLSelectElement.cpp b/third_party/WebKit/Source/core/html/HTMLSelectElement.cpp
index 6806b538..b3ea9ee 100644
--- a/third_party/WebKit/Source/core/html/HTMLSelectElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLSelectElement.cpp
@@ -30,7 +30,8 @@
 #include "bindings/core/v8/ExceptionMessages.h"
 #include "bindings/core/v8/ExceptionState.h"
 #include "bindings/core/v8/ExceptionStatePlaceholder.h"
-#include "bindings/core/v8/UnionTypesCore.h"
+#include "bindings/core/v8/HTMLElementOrLong.h"
+#include "bindings/core/v8/HTMLOptionElementOrHTMLOptGroupElement.h"
 #include "core/HTMLNames.h"
 #include "core/dom/AXObjectCache.h"
 #include "core/dom/Attribute.h"
diff --git a/third_party/WebKit/Source/core/html/parser/TextResourceDecoder.cpp b/third_party/WebKit/Source/core/html/parser/TextResourceDecoder.cpp
index 370828c4..49897d7c 100644
--- a/third_party/WebKit/Source/core/html/parser/TextResourceDecoder.cpp
+++ b/third_party/WebKit/Source/core/html/parser/TextResourceDecoder.cpp
@@ -28,7 +28,6 @@
 #include "wtf/StringExtras.h"
 #include "wtf/text/TextCodec.h"
 #include "wtf/text/TextEncodingRegistry.h"
-#include "wtf/text/UTF8.h"
 
 using namespace WTF;
 
@@ -350,6 +349,23 @@
     return;
 }
 
+// We use the encoding detector in two cases:
+//   1. Encoding detector is turned ON and no other encoding source is
+//      available (that is, it's DefaultEncoding).
+//   2. Encoding detector is turned ON and the encoding is set to
+//      the encoding of the parent frame, which is also auto-detected.
+//   Note that condition #2 is NOT satisfied unless parent-child frame
+//   relationship is compliant to the same-origin policy. If they're from
+//   different domains, |m_source| would not be set to EncodingFromParentFrame
+//   in the first place.
+bool TextResourceDecoder::shouldAutoDetect() const
+{
+    // Just checking m_hintEncoding suffices here because it's only set
+    // in setHintEncoding when the source is AutoDetectedEncoding.
+    return m_encodingDetectionOption == UseAllAutoDetection
+        && (m_source == DefaultEncoding || (m_source == EncodingFromParentFrame && m_hintEncoding));
+}
+
 String TextResourceDecoder::decode(const char* data, size_t len)
 {
     size_t lengthOfBOM = 0;
@@ -386,7 +402,11 @@
     if (m_contentType == HTMLContent && !m_checkedForMetaCharset)
         checkForMetaCharset(dataForDecode, lengthForDecode);
 
-    detectTextEncoding(data, len);
+    if (shouldAutoDetect()) {
+        WTF::TextEncoding detectedEncoding;
+        if (detectTextEncoding(data, len, m_hintEncoding, &detectedEncoding))
+            setEncoding(detectedEncoding, EncodingFromContentSniffing);
+    }
 
     ASSERT(m_encoding.isValid());
 
@@ -399,53 +419,16 @@
     return result;
 }
 
-// We use the encoding detector in following cases:
-//   1. Encoding detector is turned ON and no other encoding source is
-//      available (that is, it's DefaultEncoding).
-//   2. Encoding detector is turned ON and the encoding is set to
-//      the encoding of the parent frame, which is also auto-detected.
-//   Note that condition #2 is NOT satisfied unless parent-child frame
-//   relationship is compliant to the same-origin policy. If they're from
-//   different domains, |m_source| would not be set to EncodingFromParentFrame
-//   in the first place.
-//   We also check if the text is encoded in UTF-8 in case the encoding has not
-//   been determined by auto encoding detector (optional). Then |m_source| needs
-//   to be set to anything but DefaultEncoding to avoid further detection
-//   attempts.
-void TextResourceDecoder::detectTextEncoding(const char* data, size_t len)
-{
-    if (!shouldDetectEncoding())
-        return;
-
-    if (m_encodingDetectionOption == UseAllAutoDetection) {
-        WTF::TextEncoding detectedEncoding;
-        if (detectTextEncodingUniversal(data, len, m_hintEncoding, &detectedEncoding)) {
-            setEncoding(detectedEncoding, EncodingFromContentSniffing);
-            return;
-        }
-    }
-
-    if (WTF::Unicode::isUTF8andNotASCII(data, len))
-        setEncoding(UTF8Encoding(), EncodingFromContentSniffing);
-    else
-        m_source = EncodingFromContentSniffing;
-}
-
-bool TextResourceDecoder::shouldDetectEncoding() const
-{
-    // Just checking m_hintEncoding suffices here because it's only set
-    // in setHintEncoding when the source is AutoDetectedEncoding.
-    return m_source == DefaultEncoding || (m_source == EncodingFromParentFrame && m_hintEncoding);
-}
-
 String TextResourceDecoder::flush()
 {
     // If we can not identify the encoding even after a document is completely
     // loaded, we need to detect the encoding if other conditions for
     // autodetection is satisfied.
-    if (m_buffer.size()
+    if (m_buffer.size() && shouldAutoDetect()
         && ((!m_checkedForXMLCharset && (m_contentType == HTMLContent || m_contentType == XMLContent)) || (!m_checkedForCSSCharset && (m_contentType == CSSContent)))) {
-        detectTextEncoding(m_buffer.data(), m_buffer.size());
+        WTF::TextEncoding detectedEncoding;
+        if (detectTextEncoding(m_buffer.data(), m_buffer.size(), m_hintEncoding, &detectedEncoding))
+            setEncoding(detectedEncoding, EncodingFromContentSniffing);
     }
 
     if (!m_codec)
diff --git a/third_party/WebKit/Source/core/html/parser/TextResourceDecoder.h b/third_party/WebKit/Source/core/html/parser/TextResourceDecoder.h
index bdfa0d6..82411a7 100644
--- a/third_party/WebKit/Source/core/html/parser/TextResourceDecoder.h
+++ b/third_party/WebKit/Source/core/html/parser/TextResourceDecoder.h
@@ -79,18 +79,16 @@
 
 private:
 
-    // TextResourceDecoder does four kinds of encoding detection:
+    // TextResourceDecoder does three kind of encoding detection:
     // 1. By BOM,
     // 2. By Content if |m_contentType| is not |PlainTextContext|
-    //    (e.g. <meta> tag for HTML),
-    // 3. By isUTF8Encoded() to detect if the document
-    //    is of UTF-8, and
-    // 4. By detectTextEncodingUniversal().
+    //    (e.g. <meta> tag for HTML), and
+    // 3. By detectTextEncoding().
     enum EncodingDetectionOption {
-        // Use 1. + 2. + 4.
+        // Use 1. + 2. + 3.
         UseAllAutoDetection,
 
-        // Use 1. + 2. + 3.
+        // Use 1. + 2.
         UseContentAndBOMBasedDetection,
 
         // Use None of them.
@@ -110,8 +108,7 @@
     bool checkForCSSCharset(const char*, size_t, bool& movedDataToBuffer);
     bool checkForXMLCharset(const char*, size_t, bool& movedDataToBuffer);
     void checkForMetaCharset(const char*, size_t);
-    void detectTextEncoding(const char*, size_t);
-    bool shouldDetectEncoding() const;
+    bool shouldAutoDetect() const;
 
     ContentType m_contentType;
     WTF::TextEncoding m_encoding;
diff --git a/third_party/WebKit/Source/core/html/parser/TextResourceDecoderTest.cpp b/third_party/WebKit/Source/core/html/parser/TextResourceDecoderTest.cpp
deleted file mode 100644
index b2da498..0000000
--- a/third_party/WebKit/Source/core/html/parser/TextResourceDecoderTest.cpp
+++ /dev/null
@@ -1,38 +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 "core/html/parser/TextResourceDecoder.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace blink {
-
-TEST(TextResourceDecoderTest, KeepEncodingConsistent)
-{
-    bool useAutoEncodingDetector = true;
-    OwnPtr<TextResourceDecoder> decoder = TextResourceDecoder::create("text/plain", WTF::TextEncoding(), useAutoEncodingDetector);
-
-    // First |decode()| call initializes the internal text codec with UTF-8
-    // which was inferred by the auto encoding detector.
-    decoder->decode("\xc2\xa7", 2);
-    ASSERT_EQ(UTF8Encoding(), decoder->encoding());
-
-    // Subsequent |decode()| is called with non-UTF-8 text (EUC-KR),
-    // but the codec remains fixed.
-    decoder->decode("\xc4\x22\xc4\x5c", 2);
-    EXPECT_EQ(UTF8Encoding(), decoder->encoding());
-
-    // |TextResourceDecoder| is created not to use auto encoding detector,
-    // which activates the light-weight UTF-8 encoding detector.
-    decoder = TextResourceDecoder::create("text/plain");
-
-    decoder->decode("abcde", 5);
-    ASSERT_EQ(Latin1Encoding(), decoder->encoding());
-
-    // Verify that the encoding(Latin1) used for the first |decode()| remains
-    // fixed even if the subsequent call is given UTF-8 text.
-    decoder->decode("\xc2\xa7", 2);
-    EXPECT_EQ(Latin1Encoding(), decoder->encoding());
-}
-}
diff --git a/third_party/WebKit/Source/core/html/track/AutomaticTrackSelection.cpp b/third_party/WebKit/Source/core/html/track/AutomaticTrackSelection.cpp
index c226541..4026fdb 100644
--- a/third_party/WebKit/Source/core/html/track/AutomaticTrackSelection.cpp
+++ b/third_party/WebKit/Source/core/html/track/AutomaticTrackSelection.cpp
@@ -50,7 +50,7 @@
 
 static int textTrackSelectionScore(const TextTrack& track)
 {
-    if (track.kind() != TextTrack::captionsKeyword() && track.kind() != TextTrack::subtitlesKeyword())
+    if (!track.isVisualKind())
         return 0;
 
     return textTrackLanguageSelectionScore(track);
diff --git a/third_party/WebKit/Source/core/html/track/TextTrack.cpp b/third_party/WebKit/Source/core/html/track/TextTrack.cpp
index 9221e793..7b8f05ab 100644
--- a/third_party/WebKit/Source/core/html/track/TextTrack.cpp
+++ b/third_party/WebKit/Source/core/html/track/TextTrack.cpp
@@ -137,6 +137,11 @@
     invalidateTrackIndex();
 }
 
+bool TextTrack::isVisualKind() const
+{
+    return kind() == subtitlesKeyword() || kind() == captionsKeyword();
+}
+
 void TextTrack::setKind(const AtomicString& newKind)
 {
     AtomicString oldKind = kind();
@@ -144,10 +149,8 @@
 
     // If kind changes from visual to non-visual and mode is 'showing', then force mode to 'hidden'.
     // FIXME: This is not per spec. crbug.com/460923
-    if (oldKind != kind() && mode() == showingKeyword()) {
-        if (kind() != captionsKeyword() && kind() != subtitlesKeyword())
-            setMode(hiddenKeyword());
-    }
+    if (oldKind != kind() && mode() == showingKeyword() && !isVisualKind())
+        setMode(hiddenKeyword());
 }
 
 void TextTrack::setMode(const AtomicString& mode)
@@ -415,25 +418,13 @@
 
 bool TextTrack::isRendered() const
 {
-    if (kind() != captionsKeyword() && kind() != subtitlesKeyword())
-        return false;
-
-    if (m_mode != showingKeyword())
-        return false;
-
-    return true;
+    return m_mode == showingKeyword() && isVisualKind();
 }
 
 bool TextTrack::canBeRendered() const
 {
     // A track can be displayed when it's of kind captions or subtitles and hasn't failed to load.
-    if (kind() != captionsKeyword() && kind() != subtitlesKeyword())
-        return false;
-
-    if (getReadinessState() == FailedToLoad)
-        return false;
-
-    return true;
+    return getReadinessState() != FailedToLoad && isVisualKind();
 }
 
 TextTrackCueList* TextTrack::ensureTextTrackCueList()
diff --git a/third_party/WebKit/Source/core/html/track/TextTrack.h b/third_party/WebKit/Source/core/html/track/TextTrack.h
index fbdae4b..305364cb 100644
--- a/third_party/WebKit/Source/core/html/track/TextTrack.h
+++ b/third_party/WebKit/Source/core/html/track/TextTrack.h
@@ -59,6 +59,7 @@
     TextTrackList* trackList() { return m_trackList; }
 
     void setKind(const AtomicString&) override;
+    bool isVisualKind() const;
 
     static const AtomicString& subtitlesKeyword();
     static const AtomicString& captionsKeyword();
diff --git a/third_party/WebKit/Source/core/html/track/TrackEvent.cpp b/third_party/WebKit/Source/core/html/track/TrackEvent.cpp
index 69160f2..dbf62b0 100644
--- a/third_party/WebKit/Source/core/html/track/TrackEvent.cpp
+++ b/third_party/WebKit/Source/core/html/track/TrackEvent.cpp
@@ -25,7 +25,7 @@
 
 #include "core/html/track/TrackEvent.h"
 
-#include "bindings/core/v8/UnionTypesCore.h"
+#include "bindings/core/v8/VideoTrackOrAudioTrackOrTextTrack.h"
 #include "core/html/track/AudioTrack.h"
 #include "core/html/track/TextTrack.h"
 #include "core/html/track/VideoTrack.h"
diff --git a/third_party/WebKit/Source/core/html/track/vtt/VTTCue.cpp b/third_party/WebKit/Source/core/html/track/vtt/VTTCue.cpp
index 9e010e15..0cc8359 100644
--- a/third_party/WebKit/Source/core/html/track/vtt/VTTCue.cpp
+++ b/third_party/WebKit/Source/core/html/track/vtt/VTTCue.cpp
@@ -29,9 +29,9 @@
 
 #include "core/html/track/vtt/VTTCue.h"
 
+#include "bindings/core/v8/DoubleOrAutoKeyword.h"
 #include "bindings/core/v8/ExceptionMessages.h"
 #include "bindings/core/v8/ExceptionStatePlaceholder.h"
-#include "bindings/core/v8/UnionTypesCore.h"
 #include "core/CSSPropertyNames.h"
 #include "core/CSSValueKeywords.h"
 #include "core/dom/DocumentFragment.h"
diff --git a/third_party/WebKit/Source/core/imagebitmap/ImageBitmapFactories.h b/third_party/WebKit/Source/core/imagebitmap/ImageBitmapFactories.h
index 6c768b4b..80df930 100644
--- a/third_party/WebKit/Source/core/imagebitmap/ImageBitmapFactories.h
+++ b/third_party/WebKit/Source/core/imagebitmap/ImageBitmapFactories.h
@@ -31,10 +31,10 @@
 #ifndef ImageBitmapFactories_h
 #define ImageBitmapFactories_h
 
+#include "bindings/core/v8/HTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrBlobOrImageDataOrImageBitmap.h"
 #include "bindings/core/v8/ScriptPromise.h"
 #include "bindings/core/v8/ScriptPromiseResolver.h"
 #include "bindings/core/v8/ScriptState.h"
-#include "bindings/core/v8/UnionTypesCore.h"
 #include "core/fileapi/FileReaderLoader.h"
 #include "core/fileapi/FileReaderLoaderClient.h"
 #include "core/imagebitmap/ImageBitmapOptions.h"
diff --git a/third_party/WebKit/Source/core/input/EventHandler.cpp b/third_party/WebKit/Source/core/input/EventHandler.cpp
index 891e0ad..97b7710 100644
--- a/third_party/WebKit/Source/core/input/EventHandler.cpp
+++ b/third_party/WebKit/Source/core/input/EventHandler.cpp
@@ -1722,7 +1722,7 @@
     const PlatformMouseEvent& mouseEvent, bool isFrameBoundaryTransition)
 {
     Node* lastNodeUnderMouse = updateMouseEventTargetNode(targetNode, mouseEvent);
-    m_pointerEventManager.sendMouseAndPossiblyPointerNodeTransitionEvents(
+    m_pointerEventManager.sendMouseAndPossiblyPointerBoundaryEvents(
         lastNodeUnderMouse, m_nodeUnderMouse, mouseEvent,
         isFrameBoundaryTransition);
 }
diff --git a/third_party/WebKit/Source/core/input/PointerEventManager.cpp b/third_party/WebKit/Source/core/input/PointerEventManager.cpp
index 4e948617..17c18e0 100644
--- a/third_party/WebKit/Source/core/input/PointerEventManager.cpp
+++ b/third_party/WebKit/Source/core/input/PointerEventManager.cpp
@@ -165,15 +165,17 @@
     return target;
 }
 
-void PointerEventManager::sendMouseAndPossiblyPointerNodeTransitionEvents(
+void PointerEventManager::sendMouseAndPossiblyPointerBoundaryEvents(
     Node* exitedNode,
     Node* enteredNode,
     const PlatformMouseEvent& mouseEvent,
     bool isFrameBoundaryTransition)
 {
-    // Pointer event type does not matter as it will be overridden in the sendNodeTransitionEvents
-    PointerEvent* pointerEvent =
-        m_pointerEventFactory.create(EventTypeNames::mouseout, mouseEvent,
+    // Mouse event type does not matter as this pointerevent will only be used
+    // to create boundary pointer events and its type will be overridden in
+    // |sendBoundaryEvents| function.
+    PointerEvent* dummyPointerEvent =
+        m_pointerEventFactory.create(EventTypeNames::mousedown, mouseEvent,
         nullptr, m_frame->document()->domWindow());
 
     // TODO(crbug/545647): This state should reset with pointercancel too.
@@ -181,17 +183,17 @@
     // stage. So if the event is not frame boundary transition it is only a
     // compatibility mouse event and we do not need to change pointer event
     // behavior regarding preventMouseEvent state in that case.
-    if (isFrameBoundaryTransition && pointerEvent->buttons() == 0
-        && pointerEvent->isPrimary()) {
+    if (isFrameBoundaryTransition && dummyPointerEvent->buttons() == 0
+        && dummyPointerEvent->isPrimary()) {
         m_preventMouseEventForPointerType[toPointerTypeIndex(
             mouseEvent.pointerProperties().pointerType)] = false;
     }
 
-    processCaptureAndPositionOfPointerEvent(pointerEvent, enteredNode,
+    processCaptureAndPositionOfPointerEvent(dummyPointerEvent, enteredNode,
         exitedNode, mouseEvent, true, isFrameBoundaryTransition);
 }
 
-void PointerEventManager::sendNodeTransitionEvents(
+void PointerEventManager::sendBoundaryEvents(
     EventTarget* exitedTarget,
     EventTarget* enteredTarget,
     PointerEvent* pointerEvent,
@@ -212,7 +214,7 @@
     // Dispatch pointerout/mouseout events
     if (isInDocument(exitedTarget)) {
         if (!sendMouseEvent) {
-            dispatchPointerEvent(exitedTarget, m_pointerEventFactory.createPointerTransitionEvent(
+            dispatchPointerEvent(exitedTarget, m_pointerEventFactory.createPointerBoundaryEvent(
                 pointerEvent, EventTypeNames::pointerout, enteredTarget));
         } else {
             dispatchMouseEvent(exitedTarget,
@@ -261,7 +263,7 @@
     for (size_t j = 0; j < exitedAncestorsCommonParentIndex; j++) {
         if (!sendMouseEvent) {
             dispatchPointerEvent(exitedAncestors[j].get(),
-                m_pointerEventFactory.createPointerTransitionEvent(
+                m_pointerEventFactory.createPointerBoundaryEvent(
                     pointerEvent, EventTypeNames::pointerleave, enteredTarget),
                 !exitedNodeHasCapturingAncestor);
         } else {
@@ -275,7 +277,7 @@
     // Dispatch pointerover/mouseover.
     if (isInDocument(enteredTarget)) {
         if (!sendMouseEvent) {
-            dispatchPointerEvent(enteredTarget, m_pointerEventFactory.createPointerTransitionEvent(
+            dispatchPointerEvent(enteredTarget, m_pointerEventFactory.createPointerBoundaryEvent(
                 pointerEvent, EventTypeNames::pointerover, exitedTarget));
         } else {
             dispatchMouseEvent(enteredTarget,
@@ -297,7 +299,7 @@
     for (size_t i = enteredAncestorsCommonParentIndex; i > 0; i--) {
         if (!sendMouseEvent) {
             dispatchPointerEvent(enteredAncestors[i-1].get(),
-                m_pointerEventFactory.createPointerTransitionEvent(
+                m_pointerEventFactory.createPointerBoundaryEvent(
                     pointerEvent, EventTypeNames::pointerenter, exitedTarget),
                 !enteredNodeHasCapturingAncestor);
         } else {
@@ -324,12 +326,12 @@
                 EventTargetAttributes(target, false));
         }
         if (sendEvent)
-            sendNodeTransitionEvents(node.target, target, pointerEvent);
+            sendBoundaryEvents(node.target, target, pointerEvent);
     } else if (target) {
         m_nodeUnderPointer.add(pointerEvent->pointerId(),
             EventTargetAttributes(target, false));
         if (sendEvent)
-            sendNodeTransitionEvents(nullptr, target, pointerEvent);
+            sendBoundaryEvents(nullptr, target, pointerEvent);
     }
 }
 
@@ -429,7 +431,9 @@
                 pointerEventNameForTouchPointState(touchPoint.state()),
                 touchPoint, event.getModifiers(),
                 touchInfo.adjustedRadius,
-                framePoint);
+                framePoint,
+                touchInfo.touchNode ?
+                    touchInfo.touchNode->document().domWindow() : nullptr);
 
             // Consume the touch point if its pointer event is anything but NotHandled
             // (e.g. preventDefault is called in the listener for the pointer event).
@@ -576,7 +580,7 @@
     }
     if (sendMouseEvent && !isCaptureChanged) {
         // lastNodeUnderMouse is needed here because it is still stored in EventHandler.
-        sendNodeTransitionEvents(lastNodeUnderMouse, hitTestTarget,
+        sendBoundaryEvents(lastNodeUnderMouse, hitTestTarget,
             pointerEvent, mouseEvent, true);
     }
 }
@@ -607,10 +611,10 @@
             if (sendMouseEvent) {
                 // Send pointer event transitions as the line after this if
                 // block sends the mouse events
-                sendNodeTransitionEvents(nodeUnderPointerAtt.target, nullptr,
+                sendBoundaryEvents(nodeUnderPointerAtt.target, nullptr,
                     pointerEvent);
             }
-            sendNodeTransitionEvents(nodeUnderPointerAtt.target, nullptr,
+            sendBoundaryEvents(nodeUnderPointerAtt.target, nullptr,
                 pointerEvent, mouseEvent, sendMouseEvent);
         }
         if (pointerCaptureTarget) {
@@ -628,7 +632,7 @@
     }
 
     // Set pointerCaptureTarget from pendingPointerCaptureTarget. This does
-    // affect the behavior of sendNodeTransitionEvents function. So the
+    // affect the behavior of sendBoundaryEvents function. So the
     // ordering of the surrounding blocks of code for sending transition events
     // are important.
     if (pendingPointerCaptureTarget)
@@ -647,9 +651,9 @@
             if (sendMouseEvent) {
                 // Send pointer event transitions as the line after this if
                 // block sends the mouse events
-                sendNodeTransitionEvents(nullptr, hitTestTarget, pointerEvent);
+                sendBoundaryEvents(nullptr, hitTestTarget, pointerEvent);
             }
-            sendNodeTransitionEvents(nullptr, hitTestTarget, pointerEvent,
+            sendBoundaryEvents(nullptr, hitTestTarget, pointerEvent,
                 mouseEvent, sendMouseEvent);
         }
     }
diff --git a/third_party/WebKit/Source/core/input/PointerEventManager.h b/third_party/WebKit/Source/core/input/PointerEventManager.h
index ce6dfa4..13e5588 100644
--- a/third_party/WebKit/Source/core/input/PointerEventManager.h
+++ b/third_party/WebKit/Source/core/input/PointerEventManager.h
@@ -36,7 +36,7 @@
     WebInputEventResult handleTouchEvents(
         const PlatformTouchEvent&);
 
-    // Sends node transition events mouseout/leave/over/enter to the
+    // Sends boundary events mouseout/leave/over/enter to the
     // corresponding targets. This function sends pointerout/leave/over/enter
     // only when isFrameBoundaryTransition is true which indicates the
     // transition is over the document boundary and not only the elements border
@@ -44,10 +44,10 @@
     // then the event is a compatibility event like those created by touch
     // and in that case the corresponding pointer events will be handled by
     // sendTouchPointerEvent for example and there is no need to send pointer
-    // transition events. Note that normal mouse events (e.g. mousemove/down/up)
-    // and their corresponding transition events will be handled altogether by
+    // boundary events. Note that normal mouse events (e.g. mousemove/down/up)
+    // and their corresponding boundary events will be handled altogether by
     // sendMousePointerEvent function.
-    void sendMouseAndPossiblyPointerNodeTransitionEvents(
+    void sendMouseAndPossiblyPointerBoundaryEvents(
         Node* exitedNode,
         Node* enteredNode,
         const PlatformMouseEvent&,
@@ -103,7 +103,7 @@
     // Returns whether the event is consumed or not.
     WebInputEventResult sendTouchPointerEvent(EventTarget*, PointerEvent*);
 
-    void sendNodeTransitionEvents(
+    void sendBoundaryEvents(
         EventTarget* exitedTarget,
         EventTarget* enteredTarget,
         PointerEvent*,
@@ -112,9 +112,11 @@
     void setNodeUnderPointer(PointerEvent*,
         EventTarget*, bool sendEvent = true);
 
-    // Returns whether the pointer capture is changed. In this case this
-    // function will take care of transition events and setNodeUnderPointer
-    // should not send transition events.
+    // Processes the assignment of |m_pointerCaptureTarget| from |m_pendingPointerCaptureTarget|
+    // and sends the got/lostpointercapture events, as per the spec:
+    // https://w3c.github.io/pointerevents/#process-pending-pointer-capture
+    // Returns whether the pointer capture is changed. When pointer capture is changed,
+    // this function will take care of boundary events.
     bool processPendingPointerCapture(
         PointerEvent*,
         EventTarget*,
@@ -122,8 +124,8 @@
         bool sendMouseEvent = false);
 
     // Processes the capture state of a pointer, updates node under
-    // pointer, and sends corresponding transition events for pointer if
-    // setPointerPosition is true. It also sends corresponding transition events
+    // pointer, and sends corresponding boundary events for pointer if
+    // setPointerPosition is true. It also sends corresponding boundary events
     // for mouse if sendMouseEvent is true.
     void processCaptureAndPositionOfPointerEvent(
         PointerEvent*,
diff --git a/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.cpp b/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.cpp
index 69eaa449..ee5311a 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.cpp
+++ b/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.cpp
@@ -168,19 +168,19 @@
     return MainThreadDebugger::instance()->debugger()->isPaused();
 }
 
-void didReceiveResourceResponseButCanceled(LocalFrame* frame, DocumentLoader* loader, unsigned long identifier, const ResourceResponse& r)
+void didReceiveResourceResponseButCanceled(LocalFrame* frame, DocumentLoader* loader, unsigned long identifier, const ResourceResponse& r, Resource* resource)
 {
-    didReceiveResourceResponse(frame, identifier, loader, r, 0);
+    didReceiveResourceResponse(frame, identifier, loader, r, resource);
 }
 
-void canceledAfterReceivedResourceResponse(LocalFrame* frame, DocumentLoader* loader, unsigned long identifier, const ResourceResponse& r)
+void canceledAfterReceivedResourceResponse(LocalFrame* frame, DocumentLoader* loader, unsigned long identifier, const ResourceResponse& r, Resource* resource)
 {
-    didReceiveResourceResponseButCanceled(frame, loader, identifier, r);
+    didReceiveResourceResponseButCanceled(frame, loader, identifier, r, resource);
 }
 
-void continueWithPolicyIgnore(LocalFrame* frame, DocumentLoader* loader, unsigned long identifier, const ResourceResponse& r)
+void continueWithPolicyIgnore(LocalFrame* frame, DocumentLoader* loader, unsigned long identifier, const ResourceResponse& r, Resource* resource)
 {
-    didReceiveResourceResponseButCanceled(frame, loader, identifier, r);
+    didReceiveResourceResponseButCanceled(frame, loader, identifier, r, resource);
 }
 
 void willDestroyResource(Resource* cachedResource)
diff --git a/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.idl b/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.idl
index 4044b235..db18635 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.idl
+++ b/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.idl
@@ -155,7 +155,7 @@
     void markResourceAsCached(LocalFrame*, unsigned long identifier);
 
     [Resource]
-    void didReceiveResourceResponse([Keep] LocalFrame*, unsigned long identifier, DocumentLoader*, const ResourceResponse&, ResourceLoader*);
+    void didReceiveResourceResponse([Keep] LocalFrame*, unsigned long identifier, DocumentLoader*, const ResourceResponse&, Resource*);
 
     [Resource]
     void didReceiveData([Keep] LocalFrame*, unsigned long identifier, const char* data, int dataLength, int encodedDataLength);
@@ -164,7 +164,7 @@
     void didFinishLoading(LocalFrame* frame, unsigned long identifier, double finishTime, int64_t encodedDataLength);
 
     [Resource]
-    void didReceiveCORSRedirectResponse([Keep] LocalFrame*, unsigned long identifier, DocumentLoader*, const ResourceResponse&, ResourceLoader*);
+    void didReceiveCORSRedirectResponse([Keep] LocalFrame*, unsigned long identifier, DocumentLoader*, const ResourceResponse&, Resource*);
 
     [Resource]
     void didFailLoading(LocalFrame* frame, unsigned long identifier, const ResourceError&);
diff --git a/third_party/WebKit/Source/core/inspector/InspectorInstrumentationCustomInl.h b/third_party/WebKit/Source/core/inspector/InspectorInstrumentationCustomInl.h
index 93bb4ed..e95d596 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorInstrumentationCustomInl.h
+++ b/third_party/WebKit/Source/core/inspector/InspectorInstrumentationCustomInl.h
@@ -39,8 +39,8 @@
 
 CORE_EXPORT bool isDebuggerPaused(LocalFrame*);
 CORE_EXPORT bool collectingHTMLParseErrors(Document*);
-CORE_EXPORT void canceledAfterReceivedResourceResponse(LocalFrame*, DocumentLoader*, unsigned long identifier, const ResourceResponse&);
-CORE_EXPORT void continueWithPolicyIgnore(LocalFrame*, DocumentLoader*, unsigned long identifier, const ResourceResponse&);
+CORE_EXPORT void canceledAfterReceivedResourceResponse(LocalFrame*, DocumentLoader*, unsigned long identifier, const ResourceResponse&, Resource*);
+CORE_EXPORT void continueWithPolicyIgnore(LocalFrame*, DocumentLoader*, unsigned long identifier, const ResourceResponse&, Resource*);
 CORE_EXPORT bool consoleAgentEnabled(ExecutionContext*);
 CORE_EXPORT void willDestroyResource(Resource*);
 
diff --git a/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.cpp
index 1cb77744..2c17fd9a 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.cpp
+++ b/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.cpp
@@ -545,17 +545,11 @@
     frontend()->requestServedFromCache(IdentifiersFactory::requestId(identifier));
 }
 
-void InspectorResourceAgent::didReceiveResourceResponse(LocalFrame* frame, unsigned long identifier, DocumentLoader* loader, const ResourceResponse& response, ResourceLoader* resourceLoader)
+void InspectorResourceAgent::didReceiveResourceResponse(LocalFrame* frame, unsigned long identifier, DocumentLoader* loader, const ResourceResponse& response, Resource* cachedResource)
 {
     String requestId = IdentifiersFactory::requestId(identifier);
     bool isNotModified = response.httpStatusCode() == 304;
 
-    Resource* cachedResource = 0;
-    if (resourceLoader && !isNotModified)
-        cachedResource = resourceLoader->cachedResource();
-    if (!cachedResource)
-        cachedResource = InspectorPageAgent::cachedResource(frame, response.url());
-
     bool resourceIsEmpty = true;
     OwnPtr<protocol::Network::Response> resourceResponse = buildObjectForResourceResponse(response, cachedResource, &resourceIsEmpty);
 
@@ -615,10 +609,10 @@
     frontend()->loadingFinished(requestId, monotonicFinishTime, encodedDataLength);
 }
 
-void InspectorResourceAgent::didReceiveCORSRedirectResponse(LocalFrame* frame, unsigned long identifier, DocumentLoader* loader, const ResourceResponse& response, ResourceLoader* resourceLoader)
+void InspectorResourceAgent::didReceiveCORSRedirectResponse(LocalFrame* frame, unsigned long identifier, DocumentLoader* loader, const ResourceResponse& response, Resource* resource)
 {
     // Update the response and finish loading
-    didReceiveResourceResponse(frame, identifier, loader, response, resourceLoader);
+    didReceiveResourceResponse(frame, identifier, loader, response, resource);
     didFinishLoading(identifier, 0, WebURLLoaderClient::kUnknownEncodedDataLength);
 }
 
diff --git a/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.h b/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.h
index fe12d80..d21f433 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.h
+++ b/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.h
@@ -55,7 +55,6 @@
 class KURL;
 class NetworkResourcesData;
 class ResourceError;
-class ResourceLoader;
 class ResourceResponse;
 class ThreadableLoaderClient;
 class XHRReplayData;
@@ -85,10 +84,10 @@
     void didChangeResourcePriority(unsigned long identifier, ResourceLoadPriority);
     void willSendRequest(LocalFrame*, unsigned long identifier, DocumentLoader*, ResourceRequest&, const ResourceResponse& redirectResponse, const FetchInitiatorInfo&);
     void markResourceAsCached(unsigned long identifier);
-    void didReceiveResourceResponse(LocalFrame*, unsigned long identifier, DocumentLoader*, const ResourceResponse&, ResourceLoader*);
+    void didReceiveResourceResponse(LocalFrame*, unsigned long identifier, DocumentLoader*, const ResourceResponse&, Resource*);
     void didReceiveData(LocalFrame*, unsigned long identifier, const char* data, int dataLength, int encodedDataLength);
     void didFinishLoading(unsigned long identifier, double monotonicFinishTime, int64_t encodedDataLength);
-    void didReceiveCORSRedirectResponse(LocalFrame*, unsigned long identifier, DocumentLoader*, const ResourceResponse&, ResourceLoader*);
+    void didReceiveCORSRedirectResponse(LocalFrame*, unsigned long identifier, DocumentLoader*, const ResourceResponse&, Resource*);
     void didFailLoading(unsigned long identifier, const ResourceError&);
     void didCommitLoad(LocalFrame*, DocumentLoader*);
     void scriptImported(unsigned long identifier, const String& sourceString);
diff --git a/third_party/WebKit/Source/core/layout/LayoutBlock.cpp b/third_party/WebKit/Source/core/layout/LayoutBlock.cpp
index 862c3d8..99c2ba7 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBlock.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutBlock.cpp
@@ -151,46 +151,8 @@
 
 void LayoutBlock::willBeDestroyed()
 {
-    // Mark as being destroyed to avoid trouble with merges in removeChild().
-    m_beingDestroyed = true;
-
-    // Make sure to destroy anonymous children first while they are still connected to the rest of the tree, so that they will
-    // properly dirty line boxes that they are removed from. Effects that do :before/:after only on hover could crash otherwise.
-    children()->destroyLeftoverChildren();
-
-    // Destroy our continuation before anything other than anonymous children.
-    // The reason we don't destroy it before anonymous children is that they may
-    // have continuations of their own that are anonymous children of our continuation.
-    LayoutBoxModelObject* continuation = this->continuation();
-    if (continuation) {
-        continuation->destroy();
-        setContinuation(nullptr);
-    }
-
-    if (!documentBeingDestroyed()) {
-        if (firstLineBox()) {
-            // We can't wait for LayoutBox::destroy to clear the selection,
-            // because by then we will have nuked the line boxes.
-            // FIXME: The FrameSelection should be responsible for this when it
-            // is notified of DOM mutations.
-            if (isSelectionBorder())
-                view()->clearSelection();
-
-            // If we are an anonymous block, then our line boxes might have children
-            // that will outlast this block. In the non-anonymous block case those
-            // children will be destroyed by the time we return from this function.
-            if (isAnonymousBlock()) {
-                for (InlineFlowBox* box = firstLineBox(); box; box = box->nextLineBox()) {
-                    while (InlineBox* childBox = box->firstChild())
-                        childBox->remove();
-                }
-            }
-        } else if (parent()) {
-            parent()->dirtyLinesFromChangedChild(this);
-        }
-    }
-
-    m_lineBoxes.deleteLineBoxes();
+    if (!documentBeingDestroyed() && parent())
+        parent()->dirtyLinesFromChangedChild(this);
 
     if (UNLIKELY(gDelayedUpdateScrollInfoSet != 0))
         gDelayedUpdateScrollInfoSet->remove(this);
diff --git a/third_party/WebKit/Source/core/layout/LayoutBlock.h b/third_party/WebKit/Source/core/layout/LayoutBlock.h
index 1d19fc3b..83c9f4ff 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBlock.h
+++ b/third_party/WebKit/Source/core/layout/LayoutBlock.h
@@ -124,8 +124,6 @@
     const LayoutObjectChildList* children() const { return &m_children; }
     LayoutObjectChildList* children() { return &m_children; }
 
-    bool beingDestroyed() const { return m_beingDestroyed; }
-
     // These two functions are overridden for inline-block.
     LayoutUnit lineHeight(bool firstLine, LineDirectionMode, LinePositionMode = PositionOnContainingLine) const final;
     int baselinePosition(FontBaseline, bool firstLine, LineDirectionMode, LinePositionMode = PositionOnContainingLine) const override;
diff --git a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
index 1c5a2d9..905857e 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
@@ -2194,6 +2194,52 @@
     m_floatingObjects = adoptPtr(new FloatingObjects(this, isHorizontalWritingMode()));
 }
 
+void LayoutBlockFlow::willBeDestroyed()
+{
+    // Mark as being destroyed to avoid trouble with merges in removeChild().
+    m_beingDestroyed = true;
+
+    // Make sure to destroy anonymous children first while they are still connected to the rest of the tree, so that they will
+    // properly dirty line boxes that they are removed from. Effects that do :before/:after only on hover could crash otherwise.
+    children()->destroyLeftoverChildren();
+
+    // Destroy our continuation before anything other than anonymous children.
+    // The reason we don't destroy it before anonymous children is that they may
+    // have continuations of their own that are anonymous children of our continuation.
+    LayoutBoxModelObject* continuation = this->continuation();
+    if (continuation) {
+        continuation->destroy();
+        setContinuation(nullptr);
+    }
+
+    if (!documentBeingDestroyed()) {
+        // TODO(mstensho): figure out if we need this. We have no test coverage for it. It looks
+        // like all line boxes have been removed at this point.
+        if (firstLineBox()) {
+            // We can't wait for LayoutBox::destroy to clear the selection,
+            // because by then we will have nuked the line boxes.
+            // FIXME: The FrameSelection should be responsible for this when it
+            // is notified of DOM mutations.
+            if (isSelectionBorder())
+                view()->clearSelection();
+
+            // If we are an anonymous block, then our line boxes might have children
+            // that will outlast this block. In the non-anonymous block case those
+            // children will be destroyed by the time we return from this function.
+            if (isAnonymousBlock()) {
+                for (InlineFlowBox* box = firstLineBox(); box; box = box->nextLineBox()) {
+                    while (InlineBox* childBox = box->firstChild())
+                        childBox->remove();
+                }
+            }
+        }
+    }
+
+    m_lineBoxes.deleteLineBoxes();
+
+    LayoutBlock::willBeDestroyed();
+}
+
 void LayoutBlockFlow::styleWillChange(StyleDifference diff, const ComputedStyle& newStyle)
 {
     const ComputedStyle* oldStyle = style();
@@ -2587,10 +2633,10 @@
             return;
         // If one of the children is being destroyed then it is unsafe to clean up anonymous wrappers as the
         // entire branch may be being destroyed.
-        if (toLayoutBlock(child)->beingDestroyed())
+        if (toLayoutBlockFlow(child)->beingDestroyed())
             return;
         // We can't remove anonymous wrappers if they contain continuations as this means there are block children present.
-        if (toLayoutBlock(child)->continuation())
+        if (toLayoutBlockFlow(child)->continuation())
             return;
         // We are only interested in removing anonymous wrappers if there are inline siblings underneath them.
         if (!child->childrenInline())
diff --git a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.h b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.h
index 05da9f5..73cc865 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.h
+++ b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.h
@@ -91,6 +91,7 @@
     ~LayoutBlockFlow() override;
 
     static LayoutBlockFlow* createAnonymous(Document*);
+    bool beingDestroyed() const { return m_beingDestroyed; }
 
     bool isLayoutBlockFlow() const final { return true; }
 
@@ -308,6 +309,7 @@
 
     void createFloatingObjects();
 
+    void willBeDestroyed() override;
     void styleWillChange(StyleDifference, const ComputedStyle& newStyle) override;
     void styleDidChange(StyleDifference, const ComputedStyle* oldStyle) override;
 
diff --git a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
index 3b90d11e..efda388 100644
--- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
@@ -745,6 +745,11 @@
         }
     }
 
+    // Flex sizes are invalid as a min sizing function. However we still can have a flexible |minTrackBreadth|
+    // if the track had a flex size directly (e.g. "1fr"), the spec says that in this case it implies an automatic minimum.
+    if (minTrackBreadth.isFlex())
+        minTrackBreadth = Length(Auto);
+
     return GridTrackSize(minTrackBreadth, maxTrackBreadth);
 }
 
diff --git a/third_party/WebKit/Source/core/layout/LayoutObject.cpp b/third_party/WebKit/Source/core/layout/LayoutObject.cpp
index 04df4e8..d9fa5977 100644
--- a/third_party/WebKit/Source/core/layout/LayoutObject.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutObject.cpp
@@ -140,7 +140,6 @@
     unsigned m_bitfields2;
     LayoutRect rect; // Stores the previous paint invalidation rect.
     LayoutPoint position; // Stores the previous position from the paint invalidation container.
-    DisplayItemCacheGeneration cacheGeneration;
 };
 
 static_assert(sizeof(LayoutObject) == sizeof(SameSizeAsLayoutObject), "LayoutObject should stay small");
diff --git a/third_party/WebKit/Source/core/layout/LayoutObject.h b/third_party/WebKit/Source/core/layout/LayoutObject.h
index 7e43a2b..58e952b 100644
--- a/third_party/WebKit/Source/core/layout/LayoutObject.h
+++ b/third_party/WebKit/Source/core/layout/LayoutObject.h
@@ -1949,8 +1949,6 @@
     // For slimmingPaintInvalidation, this stores the previous paint offset.
     // TODO(wangxianzhu): Rename this to m_previousPaintOffset when we enable slimmingPaintInvalidation.
     LayoutPoint m_previousPositionFromPaintInvalidationBacking;
-
-    DISPLAY_ITEM_CACHE_STATUS_IMPLEMENTATION
 };
 
 // FIXME: remove this once the layout object lifecycle ASSERTS are no longer hit.
diff --git a/third_party/WebKit/Source/core/layout/LayoutTableBoxComponent.cpp b/third_party/WebKit/Source/core/layout/LayoutTableBoxComponent.cpp
new file mode 100644
index 0000000..3990192
--- /dev/null
+++ b/third_party/WebKit/Source/core/layout/LayoutTableBoxComponent.cpp
@@ -0,0 +1,16 @@
+// 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 "core/layout/LayoutTableBoxComponent.h"
+
+#include "core/style/ComputedStyle.h"
+
+namespace blink {
+
+void LayoutTableBoxComponent::imageChanged(WrappedImagePtr image, const IntRect* rect)
+{
+    setShouldDoFullPaintInvalidation();
+}
+
+} // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/LayoutTableBoxComponent.h b/third_party/WebKit/Source/core/layout/LayoutTableBoxComponent.h
new file mode 100644
index 0000000..39cbca1
--- /dev/null
+++ b/third_party/WebKit/Source/core/layout/LayoutTableBoxComponent.h
@@ -0,0 +1,42 @@
+// 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 LayoutTableBoxComponent_h
+#define LayoutTableBoxComponent_h
+
+#include "core/CoreExport.h"
+#include "core/layout/LayoutBox.h"
+
+namespace blink {
+
+// Common super class for LayoutTableCol, LayoutTableSection and LayoutTableRow.
+class CORE_EXPORT LayoutTableBoxComponent : public LayoutBox {
+protected:
+    explicit LayoutTableBoxComponent(Element* element)
+        : LayoutBox(element)
+    {
+    }
+
+    const LayoutObjectChildList* children() const { return &m_children; }
+    LayoutObjectChildList* children() { return &m_children; }
+
+    LayoutObject* firstChild() const { DCHECK(children() == virtualChildren()); return children()->firstChild(); }
+    LayoutObject* lastChild() const { DCHECK(children() == virtualChildren()); return children()->lastChild(); }
+
+    void imageChanged(WrappedImagePtr, const IntRect* = nullptr) override;
+
+private:
+    // If you have a LayoutTableBoxComponent, use firstChild or lastChild instead.
+    void slowFirstChild() const = delete;
+    void slowLastChild() const = delete;
+
+    LayoutObjectChildList* virtualChildren() override { return children(); }
+    const LayoutObjectChildList* virtualChildren() const override { return children(); }
+
+    LayoutObjectChildList m_children;
+};
+
+} // namespace blink
+
+#endif // LayoutTableBoxComponent_h
diff --git a/third_party/WebKit/Source/core/layout/LayoutTableCell.h b/third_party/WebKit/Source/core/layout/LayoutTableCell.h
index da49efd..023f92db 100644
--- a/third_party/WebKit/Source/core/layout/LayoutTableCell.h
+++ b/third_party/WebKit/Source/core/layout/LayoutTableCell.h
@@ -383,14 +383,12 @@
 
 inline LayoutTableCell* LayoutTableRow::firstCell() const
 {
-    ASSERT(children() == virtualChildren());
-    return toLayoutTableCell(children()->firstChild());
+    return toLayoutTableCell(firstChild());
 }
 
 inline LayoutTableCell* LayoutTableRow::lastCell() const
 {
-    ASSERT(children() == virtualChildren());
-    return toLayoutTableCell(children()->lastChild());
+    return toLayoutTableCell(lastChild());
 }
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/LayoutTableCol.cpp b/third_party/WebKit/Source/core/layout/LayoutTableCol.cpp
index 019ab84..9cfd517 100644
--- a/third_party/WebKit/Source/core/layout/LayoutTableCol.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutTableCol.cpp
@@ -35,7 +35,7 @@
 using namespace HTMLNames;
 
 LayoutTableCol::LayoutTableCol(Element* element)
-    : LayoutBox(element)
+    : LayoutTableBoxComponent(element)
     , m_span(1)
 {
     // init LayoutObject attributes
@@ -45,14 +45,15 @@
 
 void LayoutTableCol::styleDidChange(StyleDifference diff, const ComputedStyle* oldStyle)
 {
-    LayoutBox::styleDidChange(diff, oldStyle);
+    LayoutTableBoxComponent::styleDidChange(diff, oldStyle);
 
-    // If border was changed, notify table.
-    if (parent()) {
-        LayoutTable* table = this->table();
-        if (table && !table->selfNeedsLayout() && !table->normalChildNeedsLayout() && oldStyle && oldStyle->border() != style()->border()) {
+    if (LayoutTable* table = this->table()) {
+        if (!oldStyle)
+            return;
+        if (!table->selfNeedsLayout() && !table->normalChildNeedsLayout() && oldStyle->border() != style()->border()) {
+            // If border was changed, notify table.
             table->invalidateCollapsedBorders();
-        } else if (oldStyle && oldStyle->logicalWidth() != style()->logicalWidth()) {
+        } else if (oldStyle->logicalWidth() != style()->logicalWidth()) {
             // FIXME : setPreferredLogicalWidthsDirty is done for all cells as of now.
             // Need to find a better way so that only the cells which are changed by
             // the col width should have preferred logical widths recomputed.
@@ -85,13 +86,13 @@
 
 void LayoutTableCol::insertedIntoTree()
 {
-    LayoutBox::insertedIntoTree();
+    LayoutTableBoxComponent::insertedIntoTree();
     table()->addColumn(this);
 }
 
 void LayoutTableCol::willBeRemovedFromTree()
 {
-    LayoutBox::willBeRemovedFromTree();
+    LayoutTableBoxComponent::willBeRemovedFromTree();
     table()->removeColumn(this);
 }
 
@@ -125,12 +126,6 @@
     return table->localOverflowRectForPaintInvalidation();
 }
 
-void LayoutTableCol::imageChanged(WrappedImagePtr, const IntRect*)
-{
-    // FIXME: Issue paint invalidation of only the rect the image paints in.
-    setShouldDoFullPaintInvalidation();
-}
-
 void LayoutTableCol::clearPreferredLogicalWidthsDirtyBits()
 {
     clearPreferredLogicalWidthsDirty();
diff --git a/third_party/WebKit/Source/core/layout/LayoutTableCol.h b/third_party/WebKit/Source/core/layout/LayoutTableCol.h
index 8f6a266..66cabbe75 100644
--- a/third_party/WebKit/Source/core/layout/LayoutTableCol.h
+++ b/third_party/WebKit/Source/core/layout/LayoutTableCol.h
@@ -26,7 +26,7 @@
 #ifndef LayoutTableCol_h
 #define LayoutTableCol_h
 
-#include "core/layout/LayoutBox.h"
+#include "core/layout/LayoutTableBoxComponent.h"
 
 namespace blink {
 
@@ -57,19 +57,10 @@
 // Because table columns and column groups are placeholder elements (see
 // previous paragraph), they are never laid out and layout() should not be
 // called on them.
-class LayoutTableCol final : public LayoutBox {
+class LayoutTableCol final : public LayoutTableBoxComponent {
 public:
     explicit LayoutTableCol(Element*);
 
-    LayoutObject* firstChild() const { ASSERT(children() == virtualChildren()); return children()->firstChild(); }
-
-    // If you have a LayoutTableCol, use firstChild or lastChild instead.
-    void slowFirstChild() const = delete;
-    void slowLastChild() const = delete;
-
-    const LayoutObjectChildList* children() const { return &m_children; }
-    LayoutObjectChildList* children() { return &m_children; }
-
     void clearPreferredLogicalWidthsDirtyBits();
 
     // The 'span' attribute in HTML.
@@ -93,9 +84,6 @@
     const char* name() const override { return "LayoutTableCol"; }
 
 private:
-    LayoutObjectChildList* virtualChildren() override { return children(); }
-    const LayoutObjectChildList* virtualChildren() const override { return children(); }
-
     bool isOfType(LayoutObjectType type) const override { return type == LayoutObjectLayoutTableCol || LayoutBox::isOfType(type); }
     void updateFromElement() override;
     void computePreferredLogicalWidths() override { ASSERT_NOT_REACHED(); }
@@ -108,13 +96,11 @@
     PaintLayerType layerTypeRequired() const override { return NoPaintLayer; }
 
     LayoutRect localOverflowRectForPaintInvalidation() const override;
-    void imageChanged(WrappedImagePtr, const IntRect* = nullptr) override;
 
     void styleDidChange(StyleDifference, const ComputedStyle* oldStyle) override;
 
     LayoutTable* table() const;
 
-    LayoutObjectChildList m_children;
     unsigned m_span;
 };
 
diff --git a/third_party/WebKit/Source/core/layout/LayoutTableRow.cpp b/third_party/WebKit/Source/core/layout/LayoutTableRow.cpp
index 1dbe48f..8feedca 100644
--- a/third_party/WebKit/Source/core/layout/LayoutTableRow.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutTableRow.cpp
@@ -39,7 +39,7 @@
 using namespace HTMLNames;
 
 LayoutTableRow::LayoutTableRow(Element* element)
-    : LayoutBox(element)
+    : LayoutTableBoxComponent(element)
     , m_rowIndex(unsetRowIndex)
 {
     // init LayoutObject attributes
@@ -48,7 +48,7 @@
 
 void LayoutTableRow::willBeRemovedFromTree()
 {
-    LayoutBox::willBeRemovedFromTree();
+    LayoutTableBoxComponent::willBeRemovedFromTree();
 
     section()->setNeedsCellRecalc();
 }
@@ -65,7 +65,7 @@
 {
     ASSERT(style()->display() == TABLE_ROW);
 
-    LayoutBox::styleDidChange(diff, oldStyle);
+    LayoutTableBoxComponent::styleDidChange(diff, oldStyle);
     propagateStyleToAnonymousChildren();
 
     if (section() && oldStyle && style()->logicalHeight() != oldStyle->logicalHeight())
@@ -144,7 +144,7 @@
     LayoutTableCell* cell = toLayoutTableCell(child);
 
     ASSERT(!beforeChild || beforeChild->isTableCell());
-    LayoutBox::addChild(cell, beforeChild);
+    LayoutTableBoxComponent::addChild(cell, beforeChild);
 
     // Generated content can result in us having a null section so make sure to null check our parent.
     if (parent())
@@ -216,12 +216,6 @@
     TableRowPainter(*this).paint(paintInfo, paintOffset);
 }
 
-void LayoutTableRow::imageChanged(WrappedImagePtr, const IntRect*)
-{
-    // FIXME: Examine cells and issue paint invalidations of only the rect the image paints in.
-    setShouldDoFullPaintInvalidation();
-}
-
 LayoutTableRow* LayoutTableRow::createAnonymous(Document* document)
 {
     LayoutTableRow* layoutObject = new LayoutTableRow(nullptr);
diff --git a/third_party/WebKit/Source/core/layout/LayoutTableRow.h b/third_party/WebKit/Source/core/layout/LayoutTableRow.h
index 4bbd5609..65bd1e6 100644
--- a/third_party/WebKit/Source/core/layout/LayoutTableRow.h
+++ b/third_party/WebKit/Source/core/layout/LayoutTableRow.h
@@ -51,7 +51,7 @@
 // allow some layout overflow to occur).
 //
 // LayoutTableRow doesn't establish a containing block for the underlying
-// LayoutTableCells. That's why it inherits from LayoutBox and not LayoutBlock.
+// LayoutTableCells. That's why it inherits from LayoutTableBoxComponent and not LayoutBlock.
 // One oddity is that LayoutTableRow doesn't establish a new coordinate system
 // for its children. LayoutTableCells are positioned with respect to the
 // enclosing LayoutTableSection (this object's parent()). This particularity is
@@ -62,7 +62,7 @@
 // LayoutTableRow is also positioned with respect to the enclosing
 // LayoutTableSection. See LayoutTableSection::layoutRows() for the placement
 // logic.
-class CORE_EXPORT LayoutTableRow final : public LayoutBox {
+class CORE_EXPORT LayoutTableRow final : public LayoutTableBoxComponent {
 public:
     explicit LayoutTableRow(Element*);
 
@@ -72,9 +72,6 @@
     LayoutTableRow* previousRow() const;
     LayoutTableRow* nextRow() const;
 
-    const LayoutObjectChildList* children() const { return &m_children; }
-    LayoutObjectChildList* children() { return &m_children; }
-
     LayoutTableSection* section() const { return toLayoutTableSection(parent()); }
     LayoutTable* table() const { return toLayoutTable(parent()->parent()); }
 
@@ -134,10 +131,8 @@
 
 private:
     void addOverflowFromCell(const LayoutTableCell*);
-    LayoutObjectChildList* virtualChildren() override { return children(); }
-    const LayoutObjectChildList* virtualChildren() const override { return children(); }
 
-    bool isOfType(LayoutObjectType type) const override { return type == LayoutObjectTableRow || LayoutBox::isOfType(type); }
+    bool isOfType(LayoutObjectType type) const override { return type == LayoutObjectTableRow || LayoutTableBoxComponent::isOfType(type); }
 
     void willBeRemovedFromTree() override;
 
@@ -157,15 +152,11 @@
 
     void paint(const PaintInfo&, const LayoutPoint&) const override;
 
-    void imageChanged(WrappedImagePtr, const IntRect* = nullptr) override;
-
     void styleDidChange(StyleDifference, const ComputedStyle* oldStyle) override;
 
     void nextSibling() const = delete;
     void previousSibling() const = delete;
 
-    LayoutObjectChildList m_children;
-
     // This field should never be read directly. It should be read through
     // rowIndex() above instead. This is to ensure that we never read this
     // value before it is set.
@@ -186,14 +177,12 @@
 
 inline LayoutTableRow* LayoutTableSection::firstRow() const
 {
-    ASSERT(children() == virtualChildren());
-    return toLayoutTableRow(children()->firstChild());
+    return toLayoutTableRow(firstChild());
 }
 
 inline LayoutTableRow* LayoutTableSection::lastRow() const
 {
-    ASSERT(children() == virtualChildren());
-    return toLayoutTableRow(children()->lastChild());
+    return toLayoutTableRow(lastChild());
 }
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp b/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp
index 1e7cd2de..7ed46e86 100644
--- a/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp
@@ -88,7 +88,7 @@
 }
 
 LayoutTableSection::LayoutTableSection(Element* element)
-    : LayoutBox(element)
+    : LayoutTableBoxComponent(element)
     , m_cCol(0)
     , m_cRow(0)
     , m_outerBorderStart(0)
@@ -109,7 +109,7 @@
 
 void LayoutTableSection::styleDidChange(StyleDifference diff, const ComputedStyle* oldStyle)
 {
-    LayoutBox::styleDidChange(diff, oldStyle);
+    LayoutTableBoxComponent::styleDidChange(diff, oldStyle);
     propagateStyleToAnonymousChildren();
 
     // If border was changed, notify table.
@@ -120,7 +120,7 @@
 
 void LayoutTableSection::willBeRemovedFromTree()
 {
-    LayoutBox::willBeRemovedFromTree();
+    LayoutTableBoxComponent::willBeRemovedFromTree();
 
     // Preventively invalidate our cells as we may be re-inserted into
     // a new table which would require us to rebuild our structure.
@@ -184,7 +184,7 @@
         beforeChild = splitAnonymousBoxesAroundChild(beforeChild);
 
     ASSERT(!beforeChild || beforeChild->isTableRow());
-    LayoutBox::addChild(child, beforeChild);
+    LayoutTableBoxComponent::addChild(child, beforeChild);
 }
 
 void LayoutTableSection::ensureRows(unsigned numRows)
@@ -1448,13 +1448,6 @@
     return CellSpan(startColumn, endColumn);
 }
 
-
-void LayoutTableSection::imageChanged(WrappedImagePtr, const IntRect*)
-{
-    // FIXME: Examine cells and issue paint invalidations of only the rect the image paints in.
-    setShouldDoFullPaintInvalidation();
-}
-
 void LayoutTableSection::recalcCells()
 {
     ASSERT(m_needsCellRecalc);
diff --git a/third_party/WebKit/Source/core/layout/LayoutTableSection.h b/third_party/WebKit/Source/core/layout/LayoutTableSection.h
index 20da259c..3587c441 100644
--- a/third_party/WebKit/Source/core/layout/LayoutTableSection.h
+++ b/third_party/WebKit/Source/core/layout/LayoutTableSection.h
@@ -27,6 +27,7 @@
 
 #include "core/CoreExport.h"
 #include "core/layout/LayoutTable.h"
+#include "core/layout/LayoutTableBoxComponent.h"
 #include "wtf/Vector.h"
 
 namespace blink {
@@ -95,18 +96,15 @@
 // LayoutTableSection is responsible for laying out LayoutTableRows and
 // LayoutTableCells (see layoutRows()). However it is not their containing
 // block, the enclosing LayoutTable (this object's parent()) is. This is why
-// this class inherits from LayoutBox and not LayoutBlock.
-class CORE_EXPORT LayoutTableSection final : public LayoutBox {
+// this class inherits from LayoutTableBoxComponent and not LayoutBlock.
+class CORE_EXPORT LayoutTableSection final : public LayoutTableBoxComponent {
 public:
-    LayoutTableSection(Element*);
+    explicit LayoutTableSection(Element*);
     ~LayoutTableSection() override;
 
     LayoutTableRow* firstRow() const;
     LayoutTableRow* lastRow() const;
 
-    const LayoutObjectChildList* children() const { return &m_children; }
-    LayoutObjectChildList* children() { return &m_children; }
-
     void addChild(LayoutObject* child, LayoutObject* beforeChild = nullptr) override;
 
     int firstLineBoxBaseline() const override;
@@ -308,17 +306,12 @@
     bool nodeAtPoint(HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction) override;
 
 private:
-    LayoutObjectChildList* virtualChildren() override { return children(); }
-    const LayoutObjectChildList* virtualChildren() const override { return children(); }
-
     bool isOfType(LayoutObjectType type) const override { return type == LayoutObjectTableSection || LayoutBox::isOfType(type); }
 
     void willBeRemovedFromTree() override;
 
     void layout() override;
 
-    void imageChanged(WrappedImagePtr, const IntRect* = nullptr) override;
-
     int borderSpacingForRow(unsigned row) const { return m_grid[row].rowLayoutObject ? table()->vBorderSpacing() : 0; }
 
     void ensureRows(unsigned);
@@ -354,8 +347,6 @@
 
     void setLogicalPositionForCell(LayoutTableCell*, unsigned effectiveColumn) const;
 
-    LayoutObjectChildList m_children;
-
     // The representation of the rows and their cells (CellStruct).
     Vector<RowStruct> m_grid;
 
diff --git a/third_party/WebKit/Source/core/layout/line/BreakingContextInlineHeaders.h b/third_party/WebKit/Source/core/layout/line/BreakingContextInlineHeaders.h
index 7b5d2a0..0f1954b 100644
--- a/third_party/WebKit/Source/core/layout/line/BreakingContextInlineHeaders.h
+++ b/third_party/WebKit/Source/core/layout/line/BreakingContextInlineHeaders.h
@@ -40,6 +40,8 @@
 #include "core/layout/line/TrailingObjects.h"
 #include "core/layout/line/WordMeasurement.h"
 #include "core/paint/PaintLayer.h"
+#include "platform/fonts/CharacterRange.h"
+#include "platform/text/Hyphenation.h"
 #include "platform/text/TextBreakIterator.h"
 #include "wtf/Allocator.h"
 #include "wtf/Vector.h"
@@ -99,7 +101,7 @@
     void handleReplaced();
     bool handleText(WordMeasurements&, bool& hyphenated);
     void prepareForNextCharacter(const LineLayoutText&, bool& prohibitBreakInside, bool previousCharacterIsSpace);
-    bool canBreakAtWhitespace(bool breakWords, WordMeasurement&, bool stoppedIgnoringSpaces, bool& hyphenated, float charWidth, float& hyphenWidth, bool betweenWords, bool midWordBreak, bool canBreakMidWord, bool previousCharacterIsSpace, float lastWidthMeasurement, const LineLayoutText&, const Font&, bool applyWordSpacing, float wordSpacing);
+    bool canBreakAtWhitespace(bool breakWords, WordMeasurement&, bool stoppedIgnoringSpaces, float charWidth, bool& hyphenated, bool disableSoftHyphen, float& hyphenWidth, bool betweenWords, bool midWordBreak, bool canBreakMidWord, bool previousCharacterIsSpace, float lastWidthMeasurement, const LineLayoutText&, const Font&, bool applyWordSpacing, float wordSpacing);
     bool trailingSpaceExceedsAvailableWidth(bool canBreakMidWord, const LineLayoutText&, WordMeasurement&, bool applyWordSpacing, bool wordSpacing, const Font&);
     WordMeasurement& calculateWordWidth(WordMeasurements&, LineLayoutText&, unsigned lastSpace, float& lastWidthMeasurement, float wordSpacingForWordMeasurement, const Font&, float wordTrailingSpaceWidth, UChar);
     void stopIgnoringSpaces(unsigned& lastSpace);
@@ -117,6 +119,7 @@
     bool rewindToMidWordBreak(WordMeasurement&, int end, float width);
     bool rewindToFirstMidWordBreak(LineLayoutText, const ComputedStyle&, const Font&, bool breakAll, WordMeasurement&);
     bool rewindToMidWordBreak(LineLayoutText, const ComputedStyle&, const Font&, bool breakAll, WordMeasurement&);
+    bool hyphenate(LineLayoutText, const ComputedStyle&, const Font&, const Hyphenation&, float lastSpaceWordSpacing, WordMeasurement&);
 
     InlineBidiResolver& m_resolver;
 
@@ -560,8 +563,8 @@
     wordMeasurement.endOffset = end;
     wordMeasurement.width = width;
 
-    m_current.moveTo(m_current.getLineLayoutItem(), end);
-    m_lineBreak.moveTo(m_current.getLineLayoutItem(), m_current.offset());
+    m_current.moveTo(m_current.getLineLayoutItem(), end, m_current.nextBreakablePosition());
+    m_lineBreak.moveTo(m_current.getLineLayoutItem(), end, m_current.nextBreakablePosition());
     return true;
 }
 
@@ -622,6 +625,47 @@
     return rewindToMidWordBreak(wordMeasurement, end, rect.width());
 }
 
+ALWAYS_INLINE bool BreakingContext::hyphenate(LineLayoutText text,
+    const ComputedStyle& style, const Font& font,
+    const Hyphenation& hyphenation, float lastSpaceWordSpacing,
+    WordMeasurement& wordMeasurement)
+{
+    const unsigned minimumPrefixLength = 2;
+    const unsigned minimumSuffixLength = 2;
+    unsigned start = wordMeasurement.startOffset;
+    unsigned len = wordMeasurement.endOffset - start;
+    if (len <= minimumSuffixLength)
+        return false;
+
+    float hyphenWidth = text.hyphenWidth(font, textDirectionFromUnicode(m_resolver.position().direction()));
+    float maxPrefixWidth = m_width.availableWidth()
+        - m_width.currentWidth() - hyphenWidth - lastSpaceWordSpacing;
+
+    // If the maximum width available for the prefix before the hyphen is small, then it is very unlikely
+    // that an hyphenation opportunity exists, so do not bother to look for it.
+    // These are heuristic numbers for performance added in http://wkb.ug/45606 .
+    const int minPrefixWidthNumerator = 5;
+    const int minPrefixWidthDenominator = 4;
+    if (maxPrefixWidth <= font.getFontDescription().computedSize() * minPrefixWidthNumerator / minPrefixWidthDenominator)
+        return false;
+
+    TextRun run = constructTextRun(font, text, start, len, style);
+    run.setTabSize(!m_collapseWhiteSpace, style.getTabSize());
+    run.setXPos(m_width.currentWidth());
+    unsigned maxPrefixLength = font.offsetForPosition(run, maxPrefixWidth, false);
+    if (maxPrefixLength < minimumPrefixLength)
+        return false;
+
+    unsigned prefixLength = hyphenation.lastHyphenLocation(
+        text.text().createView(start, len),
+        std::min(maxPrefixLength, len - minimumSuffixLength) + 1);
+    if (!prefixLength || prefixLength < minimumPrefixLength)
+        return false;
+
+    CharacterRange range = font.getCharacterRange(run, 0, prefixLength);
+    return rewindToMidWordBreak(wordMeasurement, start + prefixLength, range.width());
+}
+
 inline bool BreakingContext::handleText(WordMeasurements& wordMeasurements, bool& hyphenated)
 {
     if (!m_current.offset())
@@ -660,6 +704,9 @@
     // See: fast/css3-text/css3-word-break/word-break-all-wrap-with-floats.html
     float widthMeasurementAtLastBreakOpportunity = 0;
 
+    Hyphenation* hyphenation = style.getHyphens() == HyphensAuto
+        ? Hyphenation::get(font.getFontDescription().locale()) : nullptr;
+    bool disableSoftHyphen = style.getHyphens() == HyphensNone;
     float hyphenWidth = 0;
 
     if (layoutText.isSVGInlineText()) {
@@ -705,7 +752,7 @@
             m_width.setTrailingWhitespaceWidth(0);
         }
 
-        if (c == softHyphenCharacter && m_autoWrap && !hyphenWidth) {
+        if (c == softHyphenCharacter && m_autoWrap && !hyphenWidth && !disableSoftHyphen) {
             hyphenWidth = layoutText.hyphenWidth(font, textDirectionFromUnicode(m_resolver.position().direction()));
             m_width.addUncommittedWidth(hyphenWidth);
         }
@@ -726,7 +773,8 @@
 
         // Determine if we are in the whitespace between words.
         int nextBreakablePosition = m_current.nextBreakablePosition();
-        bool betweenWords = c == newlineCharacter || (m_currWS != PRE && !m_atStart && m_layoutTextInfo.m_lineBreakIterator.isBreakable(m_current.offset(), nextBreakablePosition, lineBreakType));
+        bool betweenWords = c == newlineCharacter || (m_currWS != PRE && !m_atStart && m_layoutTextInfo.m_lineBreakIterator.isBreakable(m_current.offset(), nextBreakablePosition, lineBreakType)
+            && (!disableSoftHyphen || m_current.previousInSameNode() != softHyphenCharacter));
         m_current.setNextBreakablePosition(nextBreakablePosition);
 
         // If we're in the middle of a word or at the start of a new one and can't break there, then continue to the next character.
@@ -788,18 +836,31 @@
             m_width.fitBelowFloats(m_lineInfo.isFirstLine());
 
         midWordBreak = false;
-        if (canBreakMidWord && !m_width.fitsOnLine()) {
-            m_width.addUncommittedWidth(-wordMeasurement.width);
-            if (rewindToMidWordBreak(layoutText, style, font, breakAll, wordMeasurement)) {
-                lastWidthMeasurement = wordMeasurement.width + lastSpaceWordSpacing;
-                midWordBreak = true;
+        if (!m_width.fitsOnLine()) {
+            if (canBreakMidWord) {
+                m_width.addUncommittedWidth(-wordMeasurement.width);
+                if (rewindToMidWordBreak(layoutText, style, font, breakAll, wordMeasurement)) {
+                    lastWidthMeasurement = wordMeasurement.width + lastSpaceWordSpacing;
+                    midWordBreak = true;
+                }
+                m_width.addUncommittedWidth(wordMeasurement.width);
+            } else if (hyphenation) {
+                m_width.addUncommittedWidth(-wordMeasurement.width);
+                DCHECK(lastSpace == static_cast<unsigned>(wordMeasurement.startOffset));
+                DCHECK(m_current.offset() == static_cast<unsigned>(wordMeasurement.endOffset));
+                if (hyphenate(layoutText, style, font, *hyphenation, lastSpaceWordSpacing, wordMeasurement)) {
+                    m_width.addUncommittedWidth(wordMeasurement.width);
+                    hyphenated = true;
+                    m_atEnd = true;
+                    return false;
+                }
+                m_width.addUncommittedWidth(wordMeasurement.width);
             }
-            m_width.addUncommittedWidth(wordMeasurement.width);
         }
 
         // If there is a soft-break available at this whitespace position then take it.
         applyWordSpacing = wordSpacing && m_currentCharacterIsSpace;
-        if (canBreakAtWhitespace(breakWords, wordMeasurement, stoppedIgnoringSpaces, hyphenated, charWidth, hyphenWidth, betweenWords, midWordBreak, canBreakMidWord, previousCharacterIsSpace, lastWidthMeasurement, layoutText, font, applyWordSpacing, wordSpacing))
+        if (canBreakAtWhitespace(breakWords, wordMeasurement, stoppedIgnoringSpaces, charWidth, hyphenated, disableSoftHyphen, hyphenWidth, betweenWords, midWordBreak, canBreakMidWord, previousCharacterIsSpace, lastWidthMeasurement, layoutText, font, applyWordSpacing, wordSpacing))
             return false;
 
         // If there is a hard-break available at this whitespace position then take it.
@@ -882,10 +943,23 @@
     if (midWordBreak) {
         m_width.commit();
         m_atEnd = true;
-    } else if (!m_width.fitsOnLine() && !hyphenated
-        && m_lineBreak.previousInSameNode() == softHyphenCharacter) {
-        hyphenated = true;
-        m_atEnd = true;
+    } else if (!m_width.fitsOnLine()) {
+        if (hyphenation && (m_nextObject || m_lineInfo.isEmpty())) {
+            m_width.addUncommittedWidth(-wordMeasurement.width);
+            DCHECK(lastSpace == static_cast<unsigned>(wordMeasurement.startOffset));
+            DCHECK(m_current.offset() == static_cast<unsigned>(wordMeasurement.endOffset));
+            if (hyphenate(layoutText, style, font, *hyphenation, lastSpaceWordSpacing, wordMeasurement)) {
+                hyphenated = true;
+                m_atEnd = true;
+            }
+            m_width.addUncommittedWidth(wordMeasurement.width);
+        }
+        if (!hyphenated
+            && m_lineBreak.previousInSameNode() == softHyphenCharacter
+            && !disableSoftHyphen) {
+            hyphenated = true;
+            m_atEnd = true;
+        }
     }
     return false;
 }
@@ -961,7 +1035,7 @@
     return false;
 }
 
-inline bool BreakingContext::canBreakAtWhitespace(bool breakWords, WordMeasurement& wordMeasurement, bool stoppedIgnoringSpaces, bool& hyphenated, float charWidth, float& hyphenWidth, bool betweenWords, bool midWordBreak, bool canBreakMidWord, bool previousCharacterIsSpace, float lastWidthMeasurement, const LineLayoutText& layoutText, const Font& font, bool applyWordSpacing, float wordSpacing)
+inline bool BreakingContext::canBreakAtWhitespace(bool breakWords, WordMeasurement& wordMeasurement, bool stoppedIgnoringSpaces, float charWidth, bool& hyphenated, bool disableSoftHyphen, float& hyphenWidth, bool betweenWords, bool midWordBreak, bool canBreakMidWord, bool previousCharacterIsSpace, float lastWidthMeasurement, const LineLayoutText& layoutText, const Font& font, bool applyWordSpacing, float wordSpacing)
 {
     if (!m_autoWrap && !breakWords)
         return false;
@@ -978,7 +1052,7 @@
             m_lineInfo.setPreviousLineBrokeCleanly(true);
             wordMeasurement.endOffset = m_lineBreak.offset();
         }
-        if (m_lineBreak.getLineLayoutItem() && m_lineBreak.offset() && m_lineBreak.getLineLayoutItem().isText() && LineLayoutText(m_lineBreak.getLineLayoutItem()).textLength() && LineLayoutText(m_lineBreak.getLineLayoutItem()).characterAt(m_lineBreak.offset() - 1) == softHyphenCharacter)
+        if (m_lineBreak.getLineLayoutItem() && m_lineBreak.offset() && m_lineBreak.getLineLayoutItem().isText() && LineLayoutText(m_lineBreak.getLineLayoutItem()).textLength() && LineLayoutText(m_lineBreak.getLineLayoutItem()).characterAt(m_lineBreak.offset() - 1) == softHyphenCharacter && !disableSoftHyphen)
             hyphenated = true;
         if (m_lineBreak.offset() && m_lineBreak.offset() != (unsigned)wordMeasurement.endOffset && !wordMeasurement.width) {
             if (charWidth) {
diff --git a/third_party/WebKit/Source/core/layout/line/InlineBox.cpp b/third_party/WebKit/Source/core/layout/line/InlineBox.cpp
index f9e3fe6..4da8c45 100644
--- a/third_party/WebKit/Source/core/layout/line/InlineBox.cpp
+++ b/third_party/WebKit/Source/core/layout/line/InlineBox.cpp
@@ -43,7 +43,6 @@
     LayoutPoint b;
     LayoutUnit c;
     uint32_t d : 32;
-    DisplayItemCacheGeneration cacheGeneration;
 #if ENABLE(ASSERT)
     bool f;
 #endif
diff --git a/third_party/WebKit/Source/core/layout/line/InlineBox.h b/third_party/WebKit/Source/core/layout/line/InlineBox.h
index 56bf5edbf..7963a98c 100644
--- a/third_party/WebKit/Source/core/layout/line/InlineBox.h
+++ b/third_party/WebKit/Source/core/layout/line/InlineBox.h
@@ -425,8 +425,6 @@
 private:
     InlineBoxBitfields m_bitfields;
 
-    DISPLAY_ITEM_CACHE_STATUS_IMPLEMENTATION
-
 #if ENABLE(ASSERT)
     bool m_hasBadParent;
 #endif
diff --git a/third_party/WebKit/Source/core/loader/DocumentLoader.cpp b/third_party/WebKit/Source/core/loader/DocumentLoader.cpp
index d393122..0a17529f 100644
--- a/third_party/WebKit/Source/core/loader/DocumentLoader.cpp
+++ b/third_party/WebKit/Source/core/loader/DocumentLoader.cpp
@@ -260,7 +260,7 @@
 
     // TODO(mkwst): Magic numbers bad.
     if (m_mainResource->resourceError().errorCode() == -27)
-        InspectorInstrumentation::canceledAfterReceivedResourceResponse(m_frame, this, mainResourceIdentifier(), resource->response());
+        InspectorInstrumentation::canceledAfterReceivedResourceResponse(m_frame, this, mainResourceIdentifier(), resource->response(), m_mainResource.get());
 
     frameLoader()->loadFailed(this, m_mainResource->resourceError());
     clearMainResourceHandle();
@@ -357,7 +357,7 @@
 
 void DocumentLoader::cancelLoadAfterCSPDenied(const ResourceResponse& response)
 {
-    InspectorInstrumentation::canceledAfterReceivedResourceResponse(m_frame, this, mainResourceIdentifier(), response);
+    InspectorInstrumentation::canceledAfterReceivedResourceResponse(m_frame, this, mainResourceIdentifier(), response, m_mainResource.get());
 
     setWasBlockedAfterCSP();
 
@@ -399,7 +399,7 @@
         m_mainResource->setDataBufferingPolicy(BufferData);
 
     if (!shouldContinueForResponse()) {
-        InspectorInstrumentation::continueWithPolicyIgnore(m_frame, this, m_mainResource->identifier(), m_response);
+        InspectorInstrumentation::continueWithPolicyIgnore(m_frame, this, m_mainResource->identifier(), m_response, m_mainResource.get());
         m_fetcher->stopFetching();
         return;
     }
diff --git a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp
index 0deb8ab..bce49a4 100644
--- a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp
+++ b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp
@@ -93,6 +93,25 @@
     const char* debugName() const override { return "EmptyDataHandle"; }
 };
 
+// No-CORS requests are allowed for all these contexts, and plugin contexts with
+// private permission when we set skipServiceWorker flag in PepperURLLoaderHost.
+bool IsNoCORSAllowedContext(WebURLRequest::RequestContext context, bool skipServiceWorker)
+{
+    switch (context) {
+    case WebURLRequest::RequestContextAudio:
+    case WebURLRequest::RequestContextVideo:
+    case WebURLRequest::RequestContextObject:
+    case WebURLRequest::RequestContextFavicon:
+    case WebURLRequest::RequestContextImage:
+    case WebURLRequest::RequestContextScript:
+        return true;
+    case WebURLRequest::RequestContextPlugin:
+        return skipServiceWorker;
+    default:
+        return false;
+    }
+}
+
 } // namespace
 
 // Max number of CORS redirects handled in DocumentThreadableLoader.
@@ -186,50 +205,48 @@
             page->chromeClient().didObserveNonGetFetchFromScript();
     }
 
+    ResourceRequest newRequest(request);
+    if (m_requestContext != WebURLRequest::RequestContextFetch) {
+        // When the request context is not "fetch",
+        // |crossOriginRequestPolicy| represents the fetch request mode,
+        // and |credentialsRequested| represents the fetch credentials mode.
+        // So we set those flags here so that we can see the correct request
+        // mode and credentials mode in the service worker's fetch event
+        // handler.
+        switch (m_options.crossOriginRequestPolicy) {
+        case DenyCrossOriginRequests:
+            newRequest.setFetchRequestMode(WebURLRequest::FetchRequestModeSameOrigin);
+            break;
+        case UseAccessControl:
+            if (m_options.preflightPolicy == ForcePreflight)
+                newRequest.setFetchRequestMode(WebURLRequest::FetchRequestModeCORSWithForcedPreflight);
+            else
+                newRequest.setFetchRequestMode(WebURLRequest::FetchRequestModeCORS);
+            break;
+        case AllowCrossOriginRequests:
+            SECURITY_CHECK(IsNoCORSAllowedContext(m_requestContext, request.skipServiceWorker()));
+            newRequest.setFetchRequestMode(WebURLRequest::FetchRequestModeNoCORS);
+            break;
+        }
+        if (m_resourceLoaderOptions.allowCredentials == AllowStoredCredentials)
+            newRequest.setFetchCredentialsMode(WebURLRequest::FetchCredentialsModeInclude);
+        else
+            newRequest.setFetchCredentialsMode(WebURLRequest::FetchCredentialsModeSameOrigin);
+    }
+
     // We assume that ServiceWorker is skipped for sync requests and unsupported
     // protocol requests by content/ code.
     if (m_async && !request.skipServiceWorker() && SchemeRegistry::shouldTreatURLSchemeAsAllowingServiceWorkers(request.url().protocol()) && m_document->fetcher()->isControlledByServiceWorker()) {
-        ResourceRequest newRequest(request);
-        const WebURLRequest::RequestContext requestContext(request.requestContext());
-        if (requestContext != WebURLRequest::RequestContextFetch) {
-            // When the request context is not "fetch",
-            // |crossOriginRequestPolicy| represents the fetch request mode,
-            // and |credentialsRequested| represents the fetch credentials mode.
-            // So we set those flags here so that we can see the correct request
-            // mode and credentials mode in the service worker's fetch event
-            // handler.
-            switch (m_options.crossOriginRequestPolicy) {
-            case DenyCrossOriginRequests:
-                newRequest.setFetchRequestMode(WebURLRequest::FetchRequestModeSameOrigin);
-                break;
-            case UseAccessControl:
-                if (m_options.preflightPolicy == ForcePreflight)
-                    newRequest.setFetchRequestMode(WebURLRequest::FetchRequestModeCORSWithForcedPreflight);
-                else
-                    newRequest.setFetchRequestMode(WebURLRequest::FetchRequestModeCORS);
-                break;
-            case AllowCrossOriginRequests:
-                // No-CORS requests are allowed only for those contexts.
-                SECURITY_CHECK(requestContext == WebURLRequest::RequestContextAudio || requestContext == WebURLRequest::RequestContextVideo || requestContext == WebURLRequest::RequestContextObject || requestContext == WebURLRequest::RequestContextFavicon || requestContext == WebURLRequest::RequestContextImage || requestContext == WebURLRequest::RequestContextScript);
-                newRequest.setFetchRequestMode(WebURLRequest::FetchRequestModeNoCORS);
-                break;
-            }
-            if (m_resourceLoaderOptions.allowCredentials == AllowStoredCredentials)
-                newRequest.setFetchCredentialsMode(WebURLRequest::FetchCredentialsModeInclude);
-            else
-                newRequest.setFetchCredentialsMode(WebURLRequest::FetchCredentialsModeSameOrigin);
-        }
         if (newRequest.fetchRequestMode() == WebURLRequest::FetchRequestModeCORS || newRequest.fetchRequestMode() == WebURLRequest::FetchRequestModeCORSWithForcedPreflight) {
             m_fallbackRequestForServiceWorker = ResourceRequest(request);
             m_fallbackRequestForServiceWorker.setSkipServiceWorker(true);
         }
-
         loadRequest(newRequest, m_resourceLoaderOptions);
         // |this| may be dead here.
         return;
     }
 
-    dispatchInitialRequest(request);
+    dispatchInitialRequest(newRequest);
     // |this| may be dead here in async mode.
 }
 
@@ -477,7 +494,7 @@
     } else if (m_options.crossOriginRequestPolicy == UseAccessControl) {
         --m_corsRedirectLimit;
 
-        InspectorInstrumentation::didReceiveCORSRedirectResponse(document().frame(), resource->identifier(), document().frame()->loader().documentLoader(), redirectResponse, 0);
+        InspectorInstrumentation::didReceiveCORSRedirectResponse(document().frame(), resource->identifier(), document().frame()->loader().documentLoader(), redirectResponse, resource);
 
         bool allowRedirect = false;
         String accessControlErrorDescription;
@@ -635,7 +652,7 @@
         return;
     DocumentLoader* loader = frame->loader().documentLoader();
     TRACE_EVENT_INSTANT1("devtools.timeline", "ResourceReceiveResponse", TRACE_EVENT_SCOPE_THREAD, "data", InspectorReceiveResponseEvent::data(identifier, frame, response));
-    InspectorInstrumentation::didReceiveResourceResponse(frame, identifier, loader, response, resource() ? resource()->loader() : 0);
+    InspectorInstrumentation::didReceiveResourceResponse(frame, identifier, loader, response, resource());
     frame->console().reportResourceResponseReceived(loader, identifier, response);
 }
 
diff --git a/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp b/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp
index 398434f..2f288f4 100644
--- a/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp
+++ b/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp
@@ -299,7 +299,7 @@
     InspectorInstrumentation::willSendRequest(frame(), identifier, ensureLoaderForNotifications(), request, redirectResponse, initiatorInfo);
 }
 
-void FrameFetchContext::dispatchDidReceiveResponse(unsigned long identifier, const ResourceResponse& response, WebURLRequest::FrameType frameType, WebURLRequest::RequestContext requestContext, ResourceLoader* resourceLoader)
+void FrameFetchContext::dispatchDidReceiveResponse(unsigned long identifier, const ResourceResponse& response, WebURLRequest::FrameType frameType, WebURLRequest::RequestContext requestContext, Resource* resource)
 {
     LinkLoader::CanLoadResources resourceLoadingPolicy = LinkLoader::LoadResourcesAndPreconnect;
     MixedContentChecker::checkMixedPrivatePublic(frame(), response.remoteIPAddress());
@@ -320,7 +320,7 @@
     frame()->loader().client()->dispatchDidReceiveResponse(m_documentLoader, identifier, response);
     TRACE_EVENT_INSTANT1("devtools.timeline", "ResourceReceiveResponse", TRACE_EVENT_SCOPE_THREAD, "data", InspectorReceiveResponseEvent::data(identifier, frame(), response));
     DocumentLoader* documentLoader = ensureLoaderForNotifications();
-    InspectorInstrumentation::didReceiveResourceResponse(frame(), identifier, documentLoader, response, resourceLoader);
+    InspectorInstrumentation::didReceiveResourceResponse(frame(), identifier, documentLoader, response, resource);
     // It is essential that inspector gets resource response BEFORE console.
     frame()->console().reportResourceResponseReceived(documentLoader, identifier, response);
 }
@@ -359,7 +359,7 @@
         frame()->console().didFailLoading(identifier, error);
 }
 
-void FrameFetchContext::dispatchDidLoadResourceFromMemoryCache(const Resource* resource, WebURLRequest::FrameType frameType, WebURLRequest::RequestContext requestContext)
+void FrameFetchContext::dispatchDidLoadResourceFromMemoryCache(Resource* resource, WebURLRequest::FrameType frameType, WebURLRequest::RequestContext requestContext)
 {
     ResourceRequest request(resource->url());
     unsigned long identifier = createUniqueIdentifier();
@@ -368,7 +368,7 @@
 
     InspectorInstrumentation::markResourceAsCached(frame(), identifier);
     if (!resource->response().isNull())
-        dispatchDidReceiveResponse(identifier, resource->response(), frameType, requestContext);
+        dispatchDidReceiveResponse(identifier, resource->response(), frameType, requestContext, resource);
 
     if (resource->encodedSize() > 0)
         dispatchDidReceiveData(identifier, 0, resource->encodedSize(), 0);
diff --git a/third_party/WebKit/Source/core/loader/FrameFetchContext.h b/third_party/WebKit/Source/core/loader/FrameFetchContext.h
index d5dd9aa..84a29f1 100644
--- a/third_party/WebKit/Source/core/loader/FrameFetchContext.h
+++ b/third_party/WebKit/Source/core/loader/FrameFetchContext.h
@@ -73,8 +73,8 @@
     WebCachePolicy resourceRequestCachePolicy(const ResourceRequest&, Resource::Type, FetchRequest::DeferOption) const override;
     void dispatchDidChangeResourcePriority(unsigned long identifier, ResourceLoadPriority, int intraPriorityValue) override;
     void dispatchWillSendRequest(unsigned long identifier, ResourceRequest&, const ResourceResponse& redirectResponse, const FetchInitiatorInfo& = FetchInitiatorInfo()) override;
-    void dispatchDidLoadResourceFromMemoryCache(const Resource*, WebURLRequest::FrameType, WebURLRequest::RequestContext) override;
-    void dispatchDidReceiveResponse(unsigned long identifier, const ResourceResponse&, WebURLRequest::FrameType, WebURLRequest::RequestContext, ResourceLoader* = 0) override;
+    void dispatchDidLoadResourceFromMemoryCache(Resource*, WebURLRequest::FrameType, WebURLRequest::RequestContext) override;
+    void dispatchDidReceiveResponse(unsigned long identifier, const ResourceResponse&, WebURLRequest::FrameType, WebURLRequest::RequestContext, Resource*) override;
     void dispatchDidReceiveData(unsigned long identifier, const char* data, int dataLength, int encodedDataLength) override;
     void dispatchDidDownloadData(unsigned long identifier, int dataLength, int encodedDataLength)  override;
     void dispatchDidFinishLoading(unsigned long identifier, double finishTime, int64_t encodedDataLength) override;
diff --git a/third_party/WebKit/Source/core/loader/ImageLoader.cpp b/third_party/WebKit/Source/core/loader/ImageLoader.cpp
index 7e575b01..66d5f545 100644
--- a/third_party/WebKit/Source/core/loader/ImageLoader.cpp
+++ b/third_party/WebKit/Source/core/loader/ImageLoader.cpp
@@ -80,7 +80,7 @@
     return ImageLoader::DoNotBypassMainWorldCSP;
 }
 
-class ImageLoader::Task : public WebTaskRunner::Task {
+class ImageLoader::Task {
 public:
     static std::unique_ptr<Task> create(ImageLoader* loader, UpdateFromElementBehavior updateBehavior, ReferrerPolicy referrerPolicy)
     {
@@ -108,11 +108,7 @@
         }
     }
 
-    ~Task() override
-    {
-    }
-
-    void run() override
+    void run()
     {
         if (!m_loader)
             return;
@@ -250,7 +246,7 @@
 {
     std::unique_ptr<Task> task = Task::create(this, updateBehavior, referrerPolicy);
     m_pendingTask = task->createWeakPtr();
-    Microtask::enqueueMicrotask(std::move(task));
+    Microtask::enqueueMicrotask(WTF::bind(&Task::run, passed(std::move(task))));
     m_loadDelayCounter = IncrementLoadEventDelayCount::create(m_element->document());
 }
 
diff --git a/third_party/WebKit/Source/core/loader/ThreadableLoaderTest.cpp b/third_party/WebKit/Source/core/loader/ThreadableLoaderTest.cpp
index a9c2e3b..268016ee 100644
--- a/third_party/WebKit/Source/core/loader/ThreadableLoaderTest.cpp
+++ b/third_party/WebKit/Source/core/loader/ThreadableLoaderTest.cpp
@@ -336,7 +336,7 @@
     void startLoader(const KURL& url)
     {
         ResourceRequest request(url);
-        request.setRequestContext(WebURLRequest::RequestContextInternal);
+        request.setRequestContext(WebURLRequest::RequestContextObject);
         m_helper->startLoader(request);
     }
 
diff --git a/third_party/WebKit/Source/core/origin_trials/OriginTrialContext.cpp b/third_party/WebKit/Source/core/origin_trials/OriginTrialContext.cpp
index ce5bfcd..ee7ce06 100644
--- a/third_party/WebKit/Source/core/origin_trials/OriginTrialContext.cpp
+++ b/third_party/WebKit/Source/core/origin_trials/OriginTrialContext.cpp
@@ -243,7 +243,7 @@
 
 bool OriginTrialContext::isFeatureEnabled(const String& featureName, String* errorMessage, WebTrialTokenValidator* validator)
 {
-    if (!RuntimeEnabledFeatures::experimentalFrameworkEnabled()) {
+    if (!RuntimeEnabledFeatures::originTrialsEnabled()) {
         // Do not set an error message. When the framework is disabled, it
         // should behave the same as when only runtime flags are used.
         return false;
diff --git a/third_party/WebKit/Source/core/origin_trials/OriginTrialContextTest.cpp b/third_party/WebKit/Source/core/origin_trials/OriginTrialContextTest.cpp
index 7c2e011..89890fb 100644
--- a/third_party/WebKit/Source/core/origin_trials/OriginTrialContextTest.cpp
+++ b/third_party/WebKit/Source/core/origin_trials/OriginTrialContextTest.cpp
@@ -77,18 +77,18 @@
 class OriginTrialContextTest : public ::testing::Test {
 protected:
     OriginTrialContextTest()
-        : m_frameworkWasEnabled(RuntimeEnabledFeatures::experimentalFrameworkEnabled())
+        : m_frameworkWasEnabled(RuntimeEnabledFeatures::originTrialsEnabled())
         , m_executionContext(new NullExecutionContext())
         , m_tokenValidator(adoptPtr(new MockTokenValidator()))
         , m_originTrialContext(new OriginTrialContext(m_executionContext.get()))
         , m_histogramTester(new HistogramTester())
     {
-        RuntimeEnabledFeatures::setExperimentalFrameworkEnabled(true);
+        RuntimeEnabledFeatures::setOriginTrialsEnabled(true);
     }
 
     ~OriginTrialContextTest()
     {
-        RuntimeEnabledFeatures::setExperimentalFrameworkEnabled(m_frameworkWasEnabled);
+        RuntimeEnabledFeatures::setOriginTrialsEnabled(m_frameworkWasEnabled);
     }
 
     MockTokenValidator* tokenValidator() { return m_tokenValidator.get(); }
diff --git a/third_party/WebKit/Source/core/origin_trials/testing/InternalsFrobulate.cpp b/third_party/WebKit/Source/core/origin_trials/testing/InternalsFrobulate.cpp
index dea7235..033c678 100644
--- a/third_party/WebKit/Source/core/origin_trials/testing/InternalsFrobulate.cpp
+++ b/third_party/WebKit/Source/core/origin_trials/testing/InternalsFrobulate.cpp
@@ -14,7 +14,7 @@
 bool InternalsFrobulate::frobulate(ScriptState* scriptState, Internals& internals, ExceptionState& exceptionState)
 {
     String errorMessage;
-    if (!OriginTrials::experimentalFrameworkSampleAPIEnabled(scriptState->getExecutionContext(), errorMessage)) {
+    if (!OriginTrials::originTrialsSampleAPIEnabled(scriptState->getExecutionContext(), errorMessage)) {
         exceptionState.throwDOMException(NotSupportedError, errorMessage);
         return false;
     }
diff --git a/third_party/WebKit/Source/core/origin_trials/testing/InternalsFrobulate.idl b/third_party/WebKit/Source/core/origin_trials/testing/InternalsFrobulate.idl
index d3e5dcb..4680ce7 100644
--- a/third_party/WebKit/Source/core/origin_trials/testing/InternalsFrobulate.idl
+++ b/third_party/WebKit/Source/core/origin_trials/testing/InternalsFrobulate.idl
@@ -5,6 +5,6 @@
 partial interface Internals {
     [CallWith=ScriptState, RaisesException] readonly attribute boolean frobulate;
     readonly attribute boolean frobulateNoEnabledCheck;
-    [OriginTrialEnabled=ExperimentalFrameworkSampleAPI, ImplementedAs=frobulateNoEnabledCheck] readonly attribute boolean frobulateBindings;
+    [OriginTrialEnabled=OriginTrialsSampleAPI, ImplementedAs=frobulateNoEnabledCheck] readonly attribute boolean frobulateBindings;
 };
 
diff --git a/third_party/WebKit/Source/core/origin_trials/testing/WorkerInternalsFrobulate.idl b/third_party/WebKit/Source/core/origin_trials/testing/WorkerInternalsFrobulate.idl
index 21d25d7..1e5178c 100644
--- a/third_party/WebKit/Source/core/origin_trials/testing/WorkerInternalsFrobulate.idl
+++ b/third_party/WebKit/Source/core/origin_trials/testing/WorkerInternalsFrobulate.idl
@@ -3,6 +3,6 @@
 // found in the LICENSE file.
 
 partial interface WorkerInternals {
-    [OriginTrialEnabled=ExperimentalFrameworkSampleAPI] readonly attribute boolean frobulate;
+    [OriginTrialEnabled=OriginTrialsSampleAPI] readonly attribute boolean frobulate;
 };
 
diff --git a/third_party/WebKit/Source/core/page/scrolling/ScrollingCoordinator.cpp b/third_party/WebKit/Source/core/page/scrolling/ScrollingCoordinator.cpp
index 97799b10..ce5e657 100644
--- a/third_party/WebKit/Source/core/page/scrolling/ScrollingCoordinator.cpp
+++ b/third_party/WebKit/Source/core/page/scrolling/ScrollingCoordinator.cpp
@@ -35,7 +35,6 @@
 #include "core/html/HTMLElement.h"
 #include "core/layout/LayoutGeometryMap.h"
 #include "core/layout/LayoutPart.h"
-#include "core/layout/LayoutView.h"
 #include "core/layout/api/LayoutViewItem.h"
 #include "core/layout/compositing/CompositedLayerMapping.h"
 #include "core/layout/compositing/PaintLayerCompositor.h"
@@ -498,7 +497,7 @@
     if (mapIter != layerChildFrameMap.end()) {
         for (size_t i = 0; i < mapIter->value.size(); i++) {
             const LocalFrame* childFrame = mapIter->value[i];
-            const PaintLayer* childLayer = childFrame->view()->layoutView()->layer();
+            const PaintLayer* childLayer = childFrame->view()->layoutViewItem().layer();
             if (layersWithRects.contains(childLayer)) {
                 LayerFrameMap newLayerChildFrameMap;
                 makeLayerChildFrameMap(childFrame, &newLayerChildFrameMap);
@@ -898,8 +897,8 @@
         return false;
 
     // FIXME(305811): Refactor for OOPI.
-    LayoutView* layoutView = m_page->deprecatedLocalMainFrame()->view()->layoutView();
-    return layoutView ? scrollableArea == layoutView->layer()->getScrollableArea() : false;
+    LayoutViewItem layoutViewItem = m_page->deprecatedLocalMainFrame()->view()->layoutViewItem();
+    return layoutViewItem.isNull() ? false : scrollableArea == layoutViewItem.layer()->getScrollableArea();
 }
 
 bool ScrollingCoordinator::isForMainFrame(ScrollableArea* scrollableArea) const
diff --git a/third_party/WebKit/Source/core/paint/PaintLayer.cpp b/third_party/WebKit/Source/core/paint/PaintLayer.cpp
index 886064cf..1baa67bf 100644
--- a/third_party/WebKit/Source/core/paint/PaintLayer.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintLayer.cpp
@@ -113,7 +113,6 @@
         void* pointer;
         LayoutRect rect;
     } previousPaintStatus;
-    DisplayItemCacheGeneration cacheGeneration;
 };
 
 static_assert(sizeof(PaintLayer) == sizeof(SameSizeAsPaintLayer), "PaintLayer should stay small");
diff --git a/third_party/WebKit/Source/core/paint/PaintLayer.h b/third_party/WebKit/Source/core/paint/PaintLayer.h
index 8257e88..59682ee 100644
--- a/third_party/WebKit/Source/core/paint/PaintLayer.h
+++ b/third_party/WebKit/Source/core/paint/PaintLayer.h
@@ -885,8 +885,6 @@
     LayoutRect m_previousPaintDirtyRect;
 
     OwnPtr<PaintLayerRareData> m_rareData;
-
-    DISPLAY_ITEM_CACHE_STATUS_IMPLEMENTATION
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/core/streams/ReadableStream.js b/third_party/WebKit/Source/core/streams/ReadableStream.js
index c02dce5..efac76a 100644
--- a/third_party/WebKit/Source/core/streams/ReadableStream.js
+++ b/third_party/WebKit/Source/core/streams/ReadableStream.js
@@ -914,6 +914,7 @@
   binding.IsReadableStreamErrored = IsReadableStreamErrored;
   binding.IsReadableStreamDefaultReader = IsReadableStreamDefaultReader;
   binding.ReadableStreamDefaultReaderRead = ReadableStreamDefaultReaderRead;
+  binding.ReadableStreamTee = ReadableStreamTee;
 
   binding.ReadableStreamDefaultControllerClose = ReadableStreamDefaultControllerClose;
   binding.ReadableStreamDefaultControllerGetDesiredSize = ReadableStreamDefaultControllerGetDesiredSize;
diff --git a/third_party/WebKit/Source/core/streams/ReadableStreamOperations.cpp b/third_party/WebKit/Source/core/streams/ReadableStreamOperations.cpp
index 91f1786f..fa0f282 100644
--- a/third_party/WebKit/Source/core/streams/ReadableStreamOperations.cpp
+++ b/third_party/WebKit/Source/core/streams/ReadableStreamOperations.cpp
@@ -116,4 +116,21 @@
     return ScriptPromise::cast(scriptState, V8ScriptRunner::callExtraOrCrash(scriptState, "ReadableStreamDefaultReaderRead", args));
 }
 
+void ReadableStreamOperations::tee(ScriptState* scriptState, ScriptValue stream, ScriptValue* newStream1, ScriptValue* newStream2)
+{
+    DCHECK(isReadableStream(scriptState, stream));
+    DCHECK(!isLocked(scriptState, stream));
+
+    v8::Local<v8::Value> args[] = { stream.v8Value() };
+    ScriptValue result(scriptState, V8ScriptRunner::callExtraOrCrash(scriptState, "ReadableStreamTee", args));
+    DCHECK(result.v8Value()->IsArray());
+    v8::Local<v8::Array> branches = result.v8Value().As<v8::Array>();
+    DCHECK_EQ(2u, branches->Length());
+    *newStream1 = ScriptValue(scriptState, v8CallOrCrash(branches->Get(scriptState->context(), 0)));
+    *newStream2 = ScriptValue(scriptState, v8CallOrCrash(branches->Get(scriptState->context(), 1)));
+
+    DCHECK(isReadableStream(scriptState, *newStream1));
+    DCHECK(isReadableStream(scriptState, *newStream2));
+}
+
 } // namespace blink
diff --git a/third_party/WebKit/Source/core/streams/ReadableStreamOperations.h b/third_party/WebKit/Source/core/streams/ReadableStreamOperations.h
index 049c10e..5d3d7d27f 100644
--- a/third_party/WebKit/Source/core/streams/ReadableStreamOperations.h
+++ b/third_party/WebKit/Source/core/streams/ReadableStreamOperations.h
@@ -65,6 +65,10 @@
     // ReadableStreamDefaultReaderRead
     // This function assumes |isReadableStreamDefaultReader(reader)|.
     static ScriptPromise defaultReaderRead(ScriptState*, ScriptValue reader);
+
+    // ReadableStreamTee
+    // This function assumes |isReadableStream(stream)| and |!isLocked(stream)|
+    static void tee(ScriptState*, ScriptValue stream, ScriptValue* newStream1, ScriptValue* newStream2);
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/core/streams/ReadableStreamOperationsTest.cpp b/third_party/WebKit/Source/core/streams/ReadableStreamOperationsTest.cpp
index 8b6f134..5ec4a66 100644
--- a/third_party/WebKit/Source/core/streams/ReadableStreamOperationsTest.cpp
+++ b/third_party/WebKit/Source/core/streams/ReadableStreamOperationsTest.cpp
@@ -401,6 +401,45 @@
     EXPECT_TRUE(ReadableStreamOperations::isErrored(getScriptState(), errored));
 }
 
+TEST_F(ReadableStreamOperationsTest, Tee)
+{
+    ScriptValue original = evalWithPrintingError(
+        "var controller;"
+        "new ReadableStream({start: c => controller = c})");
+    ASSERT_FALSE(original.isEmpty());
+    ScriptValue new1, new2;
+    ReadableStreamOperations::tee(getScriptState(), original, &new1, &new2);
+
+    NonThrowableExceptionState ec;
+    ScriptValue reader1 = ReadableStreamOperations::getReader(getScriptState(), new1, ec);
+    ScriptValue reader2 = ReadableStreamOperations::getReader(getScriptState(), new2, ec);
+
+    Iteration* it1 = new Iteration();
+    Iteration* it2 = new Iteration();
+    ReadableStreamOperations::defaultReaderRead(getScriptState(), reader1).then(
+        Function::createFunction(getScriptState(), it1),
+        NotReached::createFunction(getScriptState()));
+    ReadableStreamOperations::defaultReaderRead(getScriptState(), reader2).then(
+        Function::createFunction(getScriptState(), it2),
+        NotReached::createFunction(getScriptState()));
+
+    v8::MicrotasksScope::PerformCheckpoint(isolate());
+    EXPECT_FALSE(it1->isSet());
+    EXPECT_FALSE(it2->isSet());
+
+    ASSERT_FALSE(evalWithPrintingError("controller.enqueue('hello')").isEmpty());
+    v8::MicrotasksScope::PerformCheckpoint(isolate());
+
+    EXPECT_TRUE(it1->isSet());
+    EXPECT_TRUE(it1->isValid());
+    EXPECT_FALSE(it1->isDone());
+    EXPECT_EQ("hello", it1->value());
+    EXPECT_TRUE(it2->isSet());
+    EXPECT_TRUE(it2->isValid());
+    EXPECT_FALSE(it2->isDone());
+    EXPECT_EQ("hello", it2->value());
+}
+
 } // namespace
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/core/testing/DictionaryTest.h b/third_party/WebKit/Source/core/testing/DictionaryTest.h
index fc69567..4537b36 100644
--- a/third_party/WebKit/Source/core/testing/DictionaryTest.h
+++ b/third_party/WebKit/Source/core/testing/DictionaryTest.h
@@ -5,11 +5,11 @@
 #ifndef DictionaryTest_h
 #define DictionaryTest_h
 
+#include "bindings/core/v8/DoubleOrString.h"
 #include "bindings/core/v8/Nullable.h"
 #include "bindings/core/v8/ScriptState.h"
 #include "bindings/core/v8/ScriptValue.h"
 #include "bindings/core/v8/ScriptWrappable.h"
-#include "bindings/core/v8/UnionTypesCore.h"
 #include "core/dom/Element.h"
 #include "platform/heap/Handle.h"
 #include "wtf/HashMap.h"
diff --git a/third_party/WebKit/Source/core/testing/Internals.cpp b/third_party/WebKit/Source/core/testing/Internals.cpp
index be9f12d..436acba 100644
--- a/third_party/WebKit/Source/core/testing/Internals.cpp
+++ b/third_party/WebKit/Source/core/testing/Internals.cpp
@@ -121,6 +121,7 @@
 #include "core/testing/InternalSettings.h"
 #include "core/testing/LayerRect.h"
 #include "core/testing/LayerRectList.h"
+#include "core/testing/MockHyphenation.h"
 #include "core/testing/PrivateScriptTest.h"
 #include "core/testing/TypeConversions.h"
 #include "core/testing/UnionTypesTest.h"
@@ -1548,6 +1549,11 @@
         contextDocument()->frame()->spellChecker().toggleContinuousSpellChecking();
 }
 
+void Internals::setMockHyphenation(const AtomicString& locale)
+{
+    Hyphenation::setForTesting(locale, adoptRef(new MockHyphenation));
+}
+
 bool Internals::isOverwriteModeEnabled(Document* document)
 {
     ASSERT(document);
@@ -2007,7 +2013,7 @@
 void Internals::startTrackingPaintInvalidationObjects()
 {
     ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled());
-    GraphicsLayer* graphicsLayer = toLocalFrame(frame()->page()->mainFrame())->view()->layoutView()->layer()->graphicsLayerBacking();
+    GraphicsLayer* graphicsLayer = toLocalFrame(frame()->page()->mainFrame())->view()->layoutViewItem().layer()->graphicsLayerBacking();
     if (graphicsLayer->drawsContent())
         graphicsLayer->getPaintController().startTrackingPaintInvalidationObjects();
 }
@@ -2015,7 +2021,7 @@
 void Internals::stopTrackingPaintInvalidationObjects()
 {
     ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled());
-    GraphicsLayer* graphicsLayer = toLocalFrame(frame()->page()->mainFrame())->view()->layoutView()->layer()->graphicsLayerBacking();
+    GraphicsLayer* graphicsLayer = toLocalFrame(frame()->page()->mainFrame())->view()->layoutViewItem().layer()->graphicsLayerBacking();
     if (graphicsLayer->drawsContent())
         graphicsLayer->getPaintController().stopTrackingPaintInvalidationObjects();
 }
@@ -2023,7 +2029,7 @@
 Vector<String> Internals::trackedPaintInvalidationObjects()
 {
     ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled());
-    GraphicsLayer* graphicsLayer = toLocalFrame(frame()->page()->mainFrame())->view()->layoutView()->layer()->graphicsLayerBacking();
+    GraphicsLayer* graphicsLayer = toLocalFrame(frame()->page()->mainFrame())->view()->layoutViewItem().layer()->graphicsLayerBacking();
     if (!graphicsLayer->drawsContent())
         return Vector<String>();
     return graphicsLayer->getPaintController().trackedPaintInvalidationObjects();
diff --git a/third_party/WebKit/Source/core/testing/Internals.h b/third_party/WebKit/Source/core/testing/Internals.h
index 59746a8..d88bbc57 100644
--- a/third_party/WebKit/Source/core/testing/Internals.h
+++ b/third_party/WebKit/Source/core/testing/Internals.h
@@ -212,6 +212,8 @@
     bool hasGrammarMarker(Document*, int from, int length);
     void setContinuousSpellCheckingEnabled(bool);
 
+    void setMockHyphenation(const AtomicString& locale);
+
     bool isOverwriteModeEnabled(Document*);
     void toggleOverwriteModeEnabled(Document*);
 
diff --git a/third_party/WebKit/Source/core/testing/Internals.idl b/third_party/WebKit/Source/core/testing/Internals.idl
index b36d5e2..8bec34e 100644
--- a/third_party/WebKit/Source/core/testing/Internals.idl
+++ b/third_party/WebKit/Source/core/testing/Internals.idl
@@ -163,6 +163,8 @@
     boolean hasGrammarMarker(Document document, long from, long length);
     void setContinuousSpellCheckingEnabled(boolean enabled);
 
+    void setMockHyphenation(DOMString locale);
+
     boolean isOverwriteModeEnabled(Document document);
     void toggleOverwriteModeEnabled(Document document);
 
diff --git a/third_party/WebKit/Source/core/testing/MockHyphenation.cpp b/third_party/WebKit/Source/core/testing/MockHyphenation.cpp
new file mode 100644
index 0000000..5e166d9a
--- /dev/null
+++ b/third_party/WebKit/Source/core/testing/MockHyphenation.cpp
@@ -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.
+
+#include "core/testing/MockHyphenation.h"
+
+namespace blink {
+
+size_t MockHyphenation::lastHyphenLocation(const StringView& text,
+    size_t beforeIndex) const
+{
+    RefPtr<StringImpl> str = text.toString();
+    if (str->endsWithIgnoringASCIICase("phenation", 9)) {
+        if (beforeIndex - (str->length() - 9) > 4)
+            return 4 + (str->length() - 9);
+        if (str->endsWithIgnoringASCIICase("hyphenation", 11)
+            && beforeIndex - (str->length() - 11) > 2) {
+            return 2 + (str->length() - 11);
+        }
+    }
+    return 0;
+}
+
+} // namespace blink
diff --git a/third_party/WebKit/Source/core/testing/MockHyphenation.h b/third_party/WebKit/Source/core/testing/MockHyphenation.h
new file mode 100644
index 0000000..c5ddded
--- /dev/null
+++ b/third_party/WebKit/Source/core/testing/MockHyphenation.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 MockHyphenation_h
+#define MockHyphenation_h
+
+#include "platform/text/Hyphenation.h"
+
+namespace blink {
+
+class MockHyphenation : public Hyphenation {
+public:
+    size_t lastHyphenLocation(const StringView&, size_t beforeIndex) const override;
+};
+
+} // namespace blink
+
+#endif // MockHyphenation_h
diff --git a/third_party/WebKit/Source/core/testing/UnionTypesTest.h b/third_party/WebKit/Source/core/testing/UnionTypesTest.h
index c9155047..9b212f9f 100644
--- a/third_party/WebKit/Source/core/testing/UnionTypesTest.h
+++ b/third_party/WebKit/Source/core/testing/UnionTypesTest.h
@@ -5,7 +5,11 @@
 #ifndef UnionTypesTest_h
 #define UnionTypesTest_h
 
-#include "bindings/core/v8/UnionTypesCore.h"
+#include "bindings/core/v8/DoubleOrInternalEnum.h"
+#include "bindings/core/v8/DoubleOrString.h"
+#include "bindings/core/v8/DoubleOrStringOrStringArray.h"
+#include "bindings/core/v8/DoubleOrStringOrStringSequence.h"
+#include "bindings/core/v8/NodeListOrElement.h"
 #include "wtf/text/WTFString.h"
 
 namespace blink {
diff --git a/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp b/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp
index f4ceb9f..087a215 100644
--- a/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp
+++ b/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp
@@ -22,10 +22,11 @@
 
 #include "core/xmlhttprequest/XMLHttpRequest.h"
 
+#include "bindings/core/v8/ArrayBufferOrArrayBufferViewOrBlobOrDocumentOrStringOrFormData.h"
+#include "bindings/core/v8/ArrayBufferOrArrayBufferViewOrBlobOrUSVString.h"
 #include "bindings/core/v8/DOMWrapperWorld.h"
 #include "bindings/core/v8/ExceptionState.h"
 #include "bindings/core/v8/ScriptState.h"
-#include "bindings/core/v8/UnionTypesCore.h"
 #include "core/dom/DOMArrayBuffer.h"
 #include "core/dom/DOMArrayBufferView.h"
 #include "core/dom/DOMException.h"
@@ -1551,11 +1552,8 @@
     if (m_responseTypeCode == ResponseTypeJSON)
         return TextResourceDecoder::create("application/json", "UTF-8");
 
-    if (!m_finalResponseCharset.isEmpty()) {
-        OwnPtr<TextResourceDecoder> decoder(TextResourceDecoder::create("text/plain"));
-        decoder->setEncoding(WTF::TextEncoding(m_finalResponseCharset), TextResourceDecoder::EncodingFromHTTPHeader);
-        return decoder;
-    }
+    if (!m_finalResponseCharset.isEmpty())
+        return TextResourceDecoder::create("text/plain", m_finalResponseCharset);
 
     // allow TextResourceDecoder to look inside the m_response if it's XML or HTML
     if (responseIsXML()) {
diff --git a/third_party/WebKit/Source/devtools/front_end/bindings/StylesSourceMapping.js b/third_party/WebKit/Source/devtools/front_end/bindings/StylesSourceMapping.js
index 45b4e5da..64296ff 100644
--- a/third_party/WebKit/Source/devtools/front_end/bindings/StylesSourceMapping.js
+++ b/third_party/WebKit/Source/devtools/front_end/bindings/StylesSourceMapping.js
@@ -377,7 +377,7 @@
     _styleContentSet: function(error)
     {
         if (error)
-            WebInspector.console.error(error);
+            console.error(error);
     },
 
     /**
diff --git a/third_party/WebKit/Source/devtools/front_end/components/ObjectPopoverHelper.js b/third_party/WebKit/Source/devtools/front_end/components/ObjectPopoverHelper.js
index 24409eff..f2baae21 100644
--- a/third_party/WebKit/Source/devtools/front_end/components/ObjectPopoverHelper.js
+++ b/third_party/WebKit/Source/devtools/front_end/components/ObjectPopoverHelper.js
@@ -97,9 +97,9 @@
             var rawLocation = response.location;
             var sourceURL = response.sourceURL;
             var linkContainer = title.createChild("div", "function-title-link-container");
-            if (rawLocation) {
+            if (rawLocation && Runtime.experiments.isEnabled("continueToFirstInvocation")) {
                 var sectionToolbar = new WebInspector.Toolbar("function-location-step-into", linkContainer);
-                var stepInto = new WebInspector.ToolbarButton(WebInspector.UIString("Step into function"), "step-in-toolbar-item");
+                var stepInto = new WebInspector.ToolbarButton(WebInspector.UIString("Continue to first invocation"), "step-in-toolbar-item");
                 stepInto.addEventListener("click", () => rawLocation.continueToLocation());
                 sectionToolbar.appendToolbarItem(stepInto);
             }
diff --git a/third_party/WebKit/Source/devtools/front_end/devtools.js b/third_party/WebKit/Source/devtools/front_end/devtools.js
index dcbcd75..f9c05b2c 100644
--- a/third_party/WebKit/Source/devtools/front_end/devtools.js
+++ b/third_party/WebKit/Source/devtools/front_end/devtools.js
@@ -964,8 +964,28 @@
 /**
  * @suppressGlobalPropertiesCheck
  */
+function sanitizeRemoteFrontendUrl()
+{
+    var queryParams = location.search;
+    if (!queryParams)
+        return;
+    var params = queryParams.substring(1).split("&");
+    for (var i = 0; i < params.length; ++i) {
+        var pair = params[i].split("=");
+        var name = pair.shift();
+        var value = pair.join("=");
+        if (name === "remoteFrontendUrl" && !value.startsWith("https://chrome-devtools-frontend.appspot.com/"))
+            location.search = "";
+    }
+}
+
+/**
+ * @suppressGlobalPropertiesCheck
+ */
 function installBackwardsCompatibility()
 {
+    sanitizeRemoteFrontendUrl();
+
     if (window.location.search.indexOf("remoteFrontend") === -1)
         return;
 
@@ -1021,6 +1041,7 @@
     installBackwardsCompatibility();
 }
 
+sanitizeRemoteFrontendUrl();
 if (window.document.head && (window.document.readyState === "complete" || window.document.readyState === "interactive"))
     installBackwardsCompatibility();
 else
diff --git a/third_party/WebKit/Source/devtools/front_end/elements/ElementsTreeElement.js b/third_party/WebKit/Source/devtools/front_end/elements/ElementsTreeElement.js
index 21d3137..b17d173 100644
--- a/third_party/WebKit/Source/devtools/front_end/elements/ElementsTreeElement.js
+++ b/third_party/WebKit/Source/devtools/front_end/elements/ElementsTreeElement.js
@@ -1087,10 +1087,7 @@
         }
 
         /** Keep it in sync with elementsTreeOutline.css **/
-        if (Runtime.experiments.isEnabled("reducedIndentation"))
-            this._gutterContainer.style.left = (-8 * (depth - 2) - (this.isExpandable() ? -2 : 8)) + "px";
-        else
-            this._gutterContainer.style.left = (-12 * (depth - 2) - (this.isExpandable() ? 1 : 12)) + "px";
+        this._gutterContainer.style.left = (-12 * (depth - 2) - (this.isExpandable() ? 1 : 12)) + "px";
 
         if (this.isClosingTag())
             return;
diff --git a/third_party/WebKit/Source/devtools/front_end/elements/ElementsTreeOutline.js b/third_party/WebKit/Source/devtools/front_end/elements/ElementsTreeOutline.js
index 2d0751d..c704da3 100644
--- a/third_party/WebKit/Source/devtools/front_end/elements/ElementsTreeOutline.js
+++ b/third_party/WebKit/Source/devtools/front_end/elements/ElementsTreeOutline.js
@@ -44,8 +44,6 @@
 
     this._shadowRoot = WebInspector.createShadowRootWithCoreStyles(element, "elements/elementsTreeOutline.css");
     var outlineDisclosureElement = this._shadowRoot.createChild("div", "elements-disclosure");
-    if (Runtime.experiments.isEnabled("reducedIndentation"))
-        outlineDisclosureElement.classList.add("elements-reduced-indentation");
 
     TreeOutline.call(this);
     this._element = this.element;
diff --git a/third_party/WebKit/Source/devtools/front_end/elements/elementsTreeOutline.css b/third_party/WebKit/Source/devtools/front_end/elements/elementsTreeOutline.css
index 9d3b364e..424160c 100644
--- a/third_party/WebKit/Source/devtools/front_end/elements/elementsTreeOutline.css
+++ b/third_party/WebKit/Source/devtools/front_end/elements/elementsTreeOutline.css
@@ -25,11 +25,6 @@
     margin-left: -13px;
 }
 
-.elements-reduced-indentation li.parent {
-    /** Keep it in sync with ElementsTreeElements.updateDecorators **/
-    margin-left: -12px;
-}
-
 .elements-disclosure li.selected:after {
     font-style: italic;
     content: " == $0";
@@ -101,11 +96,6 @@
     margin: 0;
 }
 
-.elements-reduced-indentation ol {
-    /** Keep it in sync with ElementsTreeElements.updateDecorators **/
-    -webkit-padding-start: 8px;
-}
-
 .elements-disclosure ol.children {
     display: none;
 }
@@ -118,10 +108,6 @@
     margin-left: -12px;
 }
 
-.elements-reduced-indentation li .webkit-html-tag.close {
-    margin-left: -8px;
-}
-
 .elements-disclosure > ol {
     position: relative;
     margin: 0;
@@ -369,13 +355,6 @@
     border-left-style: solid;
 }
 
-.elements-reduced-indentation li.hovered:not(.always-parent) + ol.children,
-.elements-reduced-indentation .elements-tree-outline ol.shadow-root,
-.elements-reduced-indentation li.selected:not(.always-parent) + ol.children {
-    margin-left: 6px;
-    -webkit-padding-start: 1px;
-}
-
 li.hovered:not(.always-parent) + ol.children:not(.shadow-root) {
     border-color: hsla(0,0%,0%,0.1);
 }
@@ -386,4 +365,4 @@
 
 li.selected:not(.always-parent) + ol.children {
     border-color: hsla(216,68%,80%,1) !important;
-}
\ No newline at end of file
+}
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 76061368..f267b724 100644
--- a/third_party/WebKit/Source/devtools/front_end/main/Main.js
+++ b/third_party/WebKit/Source/devtools/front_end/main/Main.js
@@ -105,6 +105,7 @@
         Runtime.experiments.register("applyCustomStylesheet", "Allow custom UI themes");
         Runtime.experiments.register("blackboxJSFramesOnTimeline", "Blackbox JavaScript frames on Timeline", true);
         Runtime.experiments.register("colorContrastRatio", "Contrast ratio line in color picker", true);
+        Runtime.experiments.register("continueToFirstInvocation", "Continue to first invocation");
         Runtime.experiments.register("cpuThrottling", "CPU throttling");
         Runtime.experiments.register("emptySourceMapAutoStepping", "Empty sourcemap auto-stepping");
         Runtime.experiments.register("inputEventsOnTimelineOverview", "Input events on Timeline overview", true);
@@ -113,7 +114,6 @@
         Runtime.experiments.register("inspectTooltip", "Dark inspect element tooltip");
         Runtime.experiments.register("liveSASS", "Live SASS", true);
         Runtime.experiments.register("privateScriptInspection", "Private script inspection");
-        Runtime.experiments.register("reducedIndentation", "Reduced indentation in Elements DOM tree");
         Runtime.experiments.register("requestBlocking", "Request blocking", true);
         Runtime.experiments.register("resolveVariableNames", "Resolve variable names");
         Runtime.experiments.register("timelineShowAllEvents", "Show all events on Timeline", true);
diff --git a/third_party/WebKit/Source/devtools/front_end/main/renderingOptions.css b/third_party/WebKit/Source/devtools/front_end/main/renderingOptions.css
index bb269e5..3c79830d 100644
--- a/third_party/WebKit/Source/devtools/front_end/main/renderingOptions.css
+++ b/third_party/WebKit/Source/devtools/front_end/main/renderingOptions.css
@@ -21,4 +21,5 @@
     height: 1px;
     margin-bottom: 10px;
     background: #f0f0f0;
+    flex: none;
 }
diff --git a/third_party/WebKit/Source/devtools/front_end/resources/ServiceWorkersView.js b/third_party/WebKit/Source/devtools/front_end/resources/ServiceWorkersView.js
index 94d32990..de5912c 100644
--- a/third_party/WebKit/Source/devtools/front_end/resources/ServiceWorkersView.js
+++ b/third_party/WebKit/Source/devtools/front_end/resources/ServiceWorkersView.js
@@ -205,7 +205,7 @@
             scriptElement.removeChildren();
             var fileName = WebInspector.ParsedURL.extractName(active.scriptURL);
             scriptElement.appendChild(WebInspector.linkifyURLAsNode(active.scriptURL, fileName));
-            scriptElement.createChild("div", "report-field-value-subtitle").textContent = WebInspector.UIString("Last modified %s", new Date(active.scriptLastModified * 1000).toLocaleString());
+            scriptElement.createChild("div", "report-field-value-subtitle").textContent = WebInspector.UIString("Received %s", new Date(active.scriptResponseTime * 1000).toLocaleString());
 
             var activeEntry = versionsStack.createChild("div", "service-worker-version");
             activeEntry.createChild("div", "service-worker-active-circle");
@@ -235,7 +235,7 @@
             waitingEntry.createChild("div", "service-worker-waiting-circle");
             waitingEntry.createChild("span").textContent = WebInspector.UIString("#%s waiting to activate", waiting.id);
             createLink(waitingEntry, WebInspector.UIString("skipWaiting"), this._skipButtonClicked.bind(this));
-            waitingEntry.createChild("div", "service-worker-subtitle").textContent = new Date(waiting.scriptLastModified * 1000).toLocaleString();
+            waitingEntry.createChild("div", "service-worker-subtitle").textContent = new Date(waiting.scriptResponseTime * 1000).toLocaleString();
             if (!this._manager.targetForVersionId(waiting.id) && (waiting.isRunning() || waiting.isStarting()))
                 createLink(waitingEntry, WebInspector.UIString("inspect"), this._inspectButtonClicked.bind(this, waiting.id));
         }
@@ -243,7 +243,7 @@
             var installingEntry = versionsStack.createChild("div", "service-worker-version");
             installingEntry.createChild("div", "service-worker-installing-circle");
             installingEntry.createChild("span").textContent = WebInspector.UIString("#%s installing", installing.id);
-            installingEntry.createChild("div", "service-worker-subtitle").textContent = new Date(installing.scriptLastModified * 1000).toLocaleString();
+            installingEntry.createChild("div", "service-worker-subtitle").textContent = new Date(installing.scriptResponseTime * 1000).toLocaleString();
             if (!this._manager.targetForVersionId(installing.id) && (installing.isRunning() || installing.isStarting()))
                 createLink(installingEntry, WebInspector.UIString("inspect"), this._inspectButtonClicked.bind(this, installing.id));
         }
diff --git a/third_party/WebKit/Source/devtools/front_end/sass/SASSSourceMapFactory.js b/third_party/WebKit/Source/devtools/front_end/sass/SASSSourceMapFactory.js
index 91e5d23d..ca719d6 100644
--- a/third_party/WebKit/Source/devtools/front_end/sass/SASSSourceMapFactory.js
+++ b/third_party/WebKit/Source/devtools/front_end/sass/SASSSourceMapFactory.js
@@ -67,6 +67,8 @@
          */
         function onNode(cssNode)
         {
+            if (!valid)
+                return;
             if (!(cssNode instanceof WebInspector.SASSSupport.TextNode))
                 return;
             var entry = sourceMap.findEntry(cssNode.range.startLine, cssNode.range.startColumn);
@@ -78,10 +80,25 @@
             var sassNode = sassAST.findNodeForPosition(entry.sourceLineNumber, entry.sourceColumnNumber);
             if (!sassNode)
                 return;
-            if (cssNode.parent && (cssNode.parent instanceof WebInspector.SASSSupport.Property) && cssNode === cssNode.parent.name)
-                valid = valid && cssNode.text.trim() === sassNode.text.trim();
+            if (cssNode.parent && (cssNode.parent instanceof WebInspector.SASSSupport.Property) && cssNode === cssNode.parent.name && cssNode.text.trim() !== sassNode.text.trim()) {
+                valid = false;
+                reportError(cssNode, sassNode);
+                return;
+            }
             map.addMapping(cssNode, sassNode);
         }
+
+        /**
+         * @param {!WebInspector.SASSSupport.TextNode} cssNode
+         * @param {!WebInspector.SASSSupport.TextNode} sassNode
+         */
+        function reportError(cssNode, sassNode)
+        {
+            var text = WebInspector.UIString("LiveSASS failed to start: %s", sourceMap.url());
+            text += WebInspector.UIString("\nSourceMap is misaligned: %s != %s", cssNode.text.trim(), sassNode.text.trim());
+            text += "\ncompiled: " + cssNode.document.url + ":" + (cssNode.range.startLine + 1) + ":" + (cssNode.range.startColumn + 1);
+            text += "\nsource: " + sassNode.document.url + ":" + (sassNode.range.startLine + 1) + ":" + (sassNode.range.startColumn + 1);
+            WebInspector.console.error(text);
+        }
     },
 }
-
diff --git a/third_party/WebKit/Source/devtools/front_end/sdk/CSSModel.js b/third_party/WebKit/Source/devtools/front_end/sdk/CSSModel.js
index 809a93b6..55db4cf7 100644
--- a/third_party/WebKit/Source/devtools/front_end/sdk/CSSModel.js
+++ b/third_party/WebKit/Source/devtools/front_end/sdk/CSSModel.js
@@ -186,8 +186,6 @@
             }
             if (!headers.size)
                 return;
-            if (sourceMap.editable())
-                WebInspector.console.log(WebInspector.UIString("LiveSASS started: %s", sourceMapURL));
             this._sourceMapByURL.set(sourceMapURL, sourceMap);
             for (var header of headers)
                 attach.call(this, sourceMapURL, header);
@@ -229,9 +227,6 @@
             return;
         this._sourceMapURLToHeaders.remove(header.sourceMapURL, header);
         if (!this._sourceMapURLToHeaders.has(header.sourceMapURL))
-            var sourceMap = this._sourceMapByURL.get(header.sourceMapURL);
-            if (sourceMap.editable())
-                WebInspector.console.log(WebInspector.UIString("LiveSASS stopped: %s", header.sourceMapURL));
             this._sourceMapByURL.delete(header.sourceMapURL);
         this.dispatchEventToListeners(WebInspector.CSSModel.Events.SourceMapDetached, header);
     },
diff --git a/third_party/WebKit/Source/devtools/front_end/sources/sourcesPanel.css b/third_party/WebKit/Source/devtools/front_end/sources/sourcesPanel.css
index 0fa0bf0..ec37608 100644
--- a/third_party/WebKit/Source/devtools/front_end/sources/sourcesPanel.css
+++ b/third_party/WebKit/Source/devtools/front_end/sources/sourcesPanel.css
@@ -71,7 +71,7 @@
 .function-location-step-into {
     position: relative;
     height: 14px;
-    top: -7px;
+    transform: rotate(-90deg);
 }
 
 .function-popover-title {
diff --git a/third_party/WebKit/Source/devtools/front_end/timeline/TimelinePanel.js b/third_party/WebKit/Source/devtools/front_end/timeline/TimelinePanel.js
index a8d3b3c..ae37291 100644
--- a/third_party/WebKit/Source/devtools/front_end/timeline/TimelinePanel.js
+++ b/third_party/WebKit/Source/devtools/front_end/timeline/TimelinePanel.js
@@ -1841,7 +1841,7 @@
     handleQueryParam: function(value)
     {
         WebInspector.TimelinePanel.show();
-        WebInspector.TimelinePanel.instance()._loadFromURL(value);
+        WebInspector.TimelinePanel.instance()._loadFromURL(window.decodeURIComponent(value));
     }
 }
 
diff --git a/third_party/WebKit/Source/modules/beacon/NavigatorBeacon.cpp b/third_party/WebKit/Source/modules/beacon/NavigatorBeacon.cpp
index adcbe47..33a1b2df 100644
--- a/third_party/WebKit/Source/modules/beacon/NavigatorBeacon.cpp
+++ b/third_party/WebKit/Source/modules/beacon/NavigatorBeacon.cpp
@@ -5,7 +5,7 @@
 #include "modules/beacon/NavigatorBeacon.h"
 
 #include "bindings/core/v8/ExceptionState.h"
-#include "bindings/modules/v8/UnionTypesModules.h"
+#include "bindings/modules/v8/ArrayBufferViewOrBlobOrStringOrFormData.h"
 #include "core/dom/DOMArrayBufferView.h"
 #include "core/dom/ExceptionCode.h"
 #include "core/dom/ExecutionContext.h"
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTServer.h b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTServer.h
index 5df2c59..14d7b27 100644
--- a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTServer.h
+++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTServer.h
@@ -6,7 +6,7 @@
 #define BluetoothRemoteGATTServer_h
 
 #include "bindings/core/v8/ScriptWrappable.h"
-#include "bindings/modules/v8/UnionTypesModules.h"
+#include "bindings/modules/v8/StringOrUnsignedLong.h"
 #include "modules/bluetooth/BluetoothDevice.h"
 #include "platform/heap/Heap.h"
 #include "wtf/OwnPtr.h"
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTService.h b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTService.h
index e1b1a74..107c2ec 100644
--- a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTService.h
+++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTService.h
@@ -6,7 +6,7 @@
 #define BluetoothRemoteGATTService_h
 
 #include "bindings/core/v8/ScriptWrappable.h"
-#include "bindings/modules/v8/UnionTypesModules.h"
+#include "bindings/modules/v8/StringOrUnsignedLong.h"
 #include "platform/heap/Handle.h"
 #include "public/platform/modules/bluetooth/WebBluetoothRemoteGATTService.h"
 #include "public/platform/modules/bluetooth/web_bluetooth.mojom.h"
diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothUUID.h b/third_party/WebKit/Source/modules/bluetooth/BluetoothUUID.h
index 85f451be..33133ff 100644
--- a/third_party/WebKit/Source/modules/bluetooth/BluetoothUUID.h
+++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothUUID.h
@@ -6,7 +6,7 @@
 #define BluetoothUUID_h
 
 #include "bindings/core/v8/ScriptWrappable.h"
-#include "bindings/modules/v8/UnionTypesModules.h"
+#include "bindings/modules/v8/StringOrUnsignedLong.h"
 #include "platform/heap/Handle.h"
 
 namespace blink {
diff --git a/third_party/WebKit/Source/modules/cachestorage/Cache.h b/third_party/WebKit/Source/modules/cachestorage/Cache.h
index 03de1b5..3ae67a6 100644
--- a/third_party/WebKit/Source/modules/cachestorage/Cache.h
+++ b/third_party/WebKit/Source/modules/cachestorage/Cache.h
@@ -7,7 +7,6 @@
 
 #include "bindings/core/v8/ScriptPromise.h"
 #include "bindings/core/v8/ScriptWrappable.h"
-#include "bindings/modules/v8/UnionTypesModules.h"
 #include "modules/ModulesExport.h"
 #include "modules/cachestorage/CacheQueryOptions.h"
 #include "modules/fetch/GlobalFetch.h"
diff --git a/third_party/WebKit/Source/modules/cachestorage/CacheTest.cpp b/third_party/WebKit/Source/modules/cachestorage/CacheTest.cpp
index 291b13e..d2f723b2 100644
--- a/third_party/WebKit/Source/modules/cachestorage/CacheTest.cpp
+++ b/third_party/WebKit/Source/modules/cachestorage/CacheTest.cpp
@@ -15,6 +15,7 @@
 #include "core/dom/Document.h"
 #include "core/frame/Frame.h"
 #include "core/testing/DummyPageHolder.h"
+#include "modules/fetch/BodyStreamBuffer.h"
 #include "modules/fetch/FetchFormDataConsumerHandle.h"
 #include "modules/fetch/GlobalFetch.h"
 #include "modules/fetch/Request.h"
@@ -625,7 +626,7 @@
     fetcher->setExpectedFetchUrl(&url);
 
     Request* request = newRequestFromUrl(url);
-    Response* response = Response::create(getScriptState(), FetchFormDataConsumerHandle::create(content), contentType, ResponseInit(), exceptionState());
+    Response* response = Response::create(getScriptState(), new BodyStreamBuffer(getScriptState(), FetchFormDataConsumerHandle::create(content)), contentType, ResponseInit(), exceptionState());
     fetcher->setResponse(response);
 
     WebVector<WebServiceWorkerCache::BatchOperation> expectedPutOperations(size_t(1));
diff --git a/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.h b/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.h
index 628cfdc7..0d16c97d 100644
--- a/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.h
+++ b/third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.h
@@ -5,8 +5,9 @@
 #ifndef BaseRenderingContext2D_h
 #define BaseRenderingContext2D_h
 
-#include "bindings/core/v8/UnionTypesCore.h"
-#include "bindings/modules/v8/UnionTypesModules.h"
+#include "bindings/modules/v8/HTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrImageBitmap.h"
+#include "bindings/modules/v8/StringOrCanvasGradientOrCanvasPattern.h"
+#include "core/html/ImageData.h"
 #include "modules/ModulesExport.h"
 #include "modules/canvas2d/CanvasGradient.h"
 #include "modules/canvas2d/CanvasPathMethods.h"
diff --git a/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.cpp b/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.cpp
index 2cfdac6..9d62906 100644
--- a/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.cpp
+++ b/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.cpp
@@ -35,7 +35,7 @@
 #include "bindings/core/v8/ExceptionMessages.h"
 #include "bindings/core/v8/ExceptionState.h"
 #include "bindings/core/v8/ExceptionStatePlaceholder.h"
-#include "bindings/modules/v8/UnionTypesModules.h"
+#include "bindings/modules/v8/RenderingContext.h"
 #include "core/CSSPropertyNames.h"
 #include "core/css/StylePropertySet.h"
 #include "core/css/resolver/StyleResolver.h"
diff --git a/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.h b/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.h
index d1134323..2b71576 100644
--- a/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.h
+++ b/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.h
@@ -27,7 +27,6 @@
 #define CanvasRenderingContext2D_h
 
 #include "bindings/core/v8/ScriptWrappable.h"
-#include "bindings/modules/v8/UnionTypesModules.h"
 #include "core/html/canvas/CanvasContextCreationAttributes.h"
 #include "core/html/canvas/CanvasRenderingContext.h"
 #include "core/html/canvas/CanvasRenderingContextFactory.h"
diff --git a/third_party/WebKit/Source/modules/credentialmanager/PasswordCredential.h b/third_party/WebKit/Source/modules/credentialmanager/PasswordCredential.h
index 7603c49..1c713a4 100644
--- a/third_party/WebKit/Source/modules/credentialmanager/PasswordCredential.h
+++ b/third_party/WebKit/Source/modules/credentialmanager/PasswordCredential.h
@@ -7,7 +7,7 @@
 
 #include "bindings/core/v8/ScriptWrappable.h"
 #include "bindings/core/v8/SerializedScriptValue.h"
-#include "bindings/modules/v8/UnionTypesModules.h"
+#include "bindings/modules/v8/FormDataOrURLSearchParams.h"
 #include "modules/ModulesExport.h"
 #include "modules/credentialmanager/SiteBoundCredential.h"
 #include "platform/heap/Handle.h"
diff --git a/third_party/WebKit/Source/modules/crypto/NormalizeAlgorithm.cpp b/third_party/WebKit/Source/modules/crypto/NormalizeAlgorithm.cpp
index 74f61e9..caf0638 100644
--- a/third_party/WebKit/Source/modules/crypto/NormalizeAlgorithm.cpp
+++ b/third_party/WebKit/Source/modules/crypto/NormalizeAlgorithm.cpp
@@ -30,10 +30,10 @@
 
 #include "modules/crypto/NormalizeAlgorithm.h"
 
+#include "bindings/core/v8/ArrayBufferOrArrayBufferView.h"
 #include "bindings/core/v8/Dictionary.h"
 #include "bindings/core/v8/V8ArrayBuffer.h"
 #include "bindings/core/v8/V8ArrayBufferView.h"
-#include "bindings/modules/v8/UnionTypesModules.h"
 #include "bindings/modules/v8/V8CryptoKey.h"
 #include "core/dom/DOMArrayPiece.h"
 #include "core/dom/DOMTypedArray.h"
diff --git a/third_party/WebKit/Source/modules/crypto/NormalizeAlgorithm.h b/third_party/WebKit/Source/modules/crypto/NormalizeAlgorithm.h
index 2da151b..41fe389 100644
--- a/third_party/WebKit/Source/modules/crypto/NormalizeAlgorithm.h
+++ b/third_party/WebKit/Source/modules/crypto/NormalizeAlgorithm.h
@@ -31,7 +31,7 @@
 #ifndef NormalizeAlgorithm_h
 #define NormalizeAlgorithm_h
 
-#include "bindings/modules/v8/UnionTypesModules.h"
+#include "bindings/modules/v8/DictionaryOrString.h"
 #include "modules/ModulesExport.h"
 #include "public/platform/WebCrypto.h"
 #include "public/platform/WebCryptoAlgorithm.h"
diff --git a/third_party/WebKit/Source/modules/crypto/SubtleCrypto.h b/third_party/WebKit/Source/modules/crypto/SubtleCrypto.h
index 8d5a452..dd9aa94 100644
--- a/third_party/WebKit/Source/modules/crypto/SubtleCrypto.h
+++ b/third_party/WebKit/Source/modules/crypto/SubtleCrypto.h
@@ -31,9 +31,11 @@
 #ifndef SubtleCrypto_h
 #define SubtleCrypto_h
 
+#include "bindings/core/v8/ArrayBufferOrArrayBufferView.h"
 #include "bindings/core/v8/ScriptPromise.h"
 #include "bindings/core/v8/ScriptWrappable.h"
-#include "bindings/modules/v8/UnionTypesModules.h"
+#include "bindings/modules/v8/ArrayBufferOrArrayBufferViewOrDictionary.h"
+#include "bindings/modules/v8/DictionaryOrString.h"
 #include "core/dom/DOMArrayPiece.h"
 #include "platform/heap/Handle.h"
 #include "wtf/Forward.h"
diff --git a/third_party/WebKit/Source/modules/encoding/TextDecoder.h b/third_party/WebKit/Source/modules/encoding/TextDecoder.h
index b529072..ccbab4d 100644
--- a/third_party/WebKit/Source/modules/encoding/TextDecoder.h
+++ b/third_party/WebKit/Source/modules/encoding/TextDecoder.h
@@ -31,8 +31,8 @@
 #ifndef TextDecoder_h
 #define TextDecoder_h
 
+#include "bindings/core/v8/ArrayBufferOrArrayBufferView.h"
 #include "bindings/core/v8/ScriptWrappable.h"
-#include "bindings/modules/v8/UnionTypesModules.h"
 #include "modules/encoding/TextDecodeOptions.h"
 #include "modules/encoding/TextDecoderOptions.h"
 #include "platform/heap/Handle.h"
diff --git a/third_party/WebKit/Source/modules/encryptedmedia/MediaKeyStatusMap.cpp b/third_party/WebKit/Source/modules/encryptedmedia/MediaKeyStatusMap.cpp
index d36cb36..b6fcf01 100644
--- a/third_party/WebKit/Source/modules/encryptedmedia/MediaKeyStatusMap.cpp
+++ b/third_party/WebKit/Source/modules/encryptedmedia/MediaKeyStatusMap.cpp
@@ -4,6 +4,7 @@
 
 #include "modules/encryptedmedia/MediaKeyStatusMap.h"
 
+#include "bindings/core/v8/ArrayBufferOrArrayBufferView.h"
 #include "core/dom/DOMArrayBuffer.h"
 #include "core/dom/DOMArrayPiece.h"
 #include "public/platform/WebData.h"
diff --git a/third_party/WebKit/Source/modules/encryptedmedia/MediaKeyStatusMap.h b/third_party/WebKit/Source/modules/encryptedmedia/MediaKeyStatusMap.h
index de92d62..0bedc3e 100644
--- a/third_party/WebKit/Source/modules/encryptedmedia/MediaKeyStatusMap.h
+++ b/third_party/WebKit/Source/modules/encryptedmedia/MediaKeyStatusMap.h
@@ -7,7 +7,6 @@
 
 #include "bindings/core/v8/Maplike.h"
 #include "bindings/core/v8/ScriptWrappable.h"
-#include "bindings/core/v8/UnionTypesCore.h"
 #include "core/dom/DOMArrayPiece.h"
 #include "platform/heap/Heap.h"
 
diff --git a/third_party/WebKit/Source/modules/fetch/BodyStreamBuffer.cpp b/third_party/WebKit/Source/modules/fetch/BodyStreamBuffer.cpp
index 24194dc..af366abd 100644
--- a/third_party/WebKit/Source/modules/fetch/BodyStreamBuffer.cpp
+++ b/third_party/WebKit/Source/modules/fetch/BodyStreamBuffer.cpp
@@ -13,6 +13,8 @@
 #include "core/streams/ReadableStreamOperations.h"
 #include "modules/fetch/Body.h"
 #include "modules/fetch/DataConsumerHandleUtil.h"
+#include "modules/fetch/DataConsumerTee.h"
+#include "modules/fetch/ReadableStreamDataConsumerHandle.h"
 #include "platform/RuntimeEnabledFeatures.h"
 #include "platform/blob/BlobData.h"
 #include "platform/network/EncodedFormData.h"
@@ -84,6 +86,7 @@
     , m_scriptState(scriptState)
     , m_handle(std::move(handle))
     , m_reader(m_handle->obtainReader(this))
+    , m_madeFromReadableStream(false)
 {
     if (RuntimeEnabledFeatures::responseBodyWithV8ExtraStreamEnabled()) {
         ScriptState::Scope scope(scriptState);
@@ -101,6 +104,22 @@
     }
 }
 
+BodyStreamBuffer::BodyStreamBuffer(ScriptState* scriptState, ScriptValue stream)
+    : UnderlyingSourceBase(scriptState)
+    , m_scriptState(scriptState)
+    , m_madeFromReadableStream(true)
+{
+    ScriptState::Scope scope(scriptState);
+    DCHECK(RuntimeEnabledFeatures::responseBodyWithV8ExtraStreamEnabled());
+    DCHECK(ReadableStreamOperations::isReadableStream(scriptState, stream));
+    v8::Local<v8::Value> bodyValue = toV8(this, scriptState);
+    DCHECK(!bodyValue.IsEmpty());
+    DCHECK(bodyValue->IsObject());
+    v8::Local<v8::Object> body = bodyValue.As<v8::Object>();
+
+    V8HiddenValue::setHiddenValue(scriptState, body, V8HiddenValue::internalBodyStream(scriptState->isolate()), stream.v8Value());
+}
+
 ScriptValue BodyStreamBuffer::stream()
 {
     ScriptState::Scope scope(m_scriptState.get());
@@ -121,6 +140,9 @@
     if (isStreamClosed() || isStreamErrored())
         return nullptr;
 
+    if (m_madeFromReadableStream)
+        return nullptr;
+
     RefPtr<BlobDataHandle> blobDataHandle = m_reader->drainAsBlobDataHandle(policy);
     if (blobDataHandle) {
         closeAndLockAndDisturb();
@@ -136,6 +158,9 @@
     if (isStreamClosed() || isStreamErrored())
         return nullptr;
 
+    if (m_madeFromReadableStream)
+        return nullptr;
+
     RefPtr<EncodedFormData> formData = m_reader->drainAsFormData();
     if (formData) {
         closeAndLockAndDisturb();
@@ -144,29 +169,6 @@
     return nullptr;
 }
 
-PassOwnPtr<FetchDataConsumerHandle> BodyStreamBuffer::releaseHandle()
-{
-    ASSERT(!isStreamLocked());
-    ASSERT(!isStreamDisturbed());
-    // We need to call these before calling closeAndLockAndDisturb.
-    const bool isClosed = isStreamClosed();
-    const bool isErrored = isStreamErrored();
-    OwnPtr<FetchDataConsumerHandle> handle = std::move(m_handle);
-
-    closeAndLockAndDisturb();
-
-    if (isClosed) {
-        // Note that the stream cannot be "draining", because it doesn't have
-        // the internal buffer.
-        return createFetchDataConsumerHandleFromWebHandle(createDoneDataConsumerHandle());
-    }
-    if (isErrored)
-        return createFetchDataConsumerHandleFromWebHandle(createUnexpectedErrorDataConsumerHandle());
-
-    ASSERT(handle);
-    return handle;
-}
-
 void BodyStreamBuffer::startLoading(FetchDataLoader* loader, FetchDataLoader::Client* client)
 {
     ASSERT(!m_loader);
@@ -176,6 +178,28 @@
     loader->start(handle.get(), new LoaderClient(m_scriptState->getExecutionContext(), this, client));
 }
 
+void BodyStreamBuffer::tee(BodyStreamBuffer** branch1, BodyStreamBuffer** branch2)
+{
+    DCHECK(!isStreamLocked());
+    DCHECK(!isStreamDisturbed());
+    *branch1 = nullptr;
+    *branch2 = nullptr;
+
+    if (m_madeFromReadableStream) {
+        ScriptState::Scope scope(m_scriptState.get());
+        ScriptValue stream1, stream2;
+        ReadableStreamOperations::tee(m_scriptState.get(), stream(), &stream1, &stream2);
+        *branch1 = new BodyStreamBuffer(m_scriptState.get(), stream1);
+        *branch2 = new BodyStreamBuffer(m_scriptState.get(), stream2);
+        return;
+    }
+    OwnPtr<FetchDataConsumerHandle> handle = releaseHandle();
+    OwnPtr<FetchDataConsumerHandle> handle1, handle2;
+    DataConsumerTee::create(m_scriptState->getExecutionContext(), std::move(handle), &handle1, &handle2);
+    *branch1 = new BodyStreamBuffer(m_scriptState.get(), std::move(handle1));
+    *branch2 = new BodyStreamBuffer(m_scriptState.get(), std::move(handle2));
+}
+
 void BodyStreamBuffer::pullSource()
 {
     ASSERT(!m_streamNeedsMore);
@@ -384,4 +408,40 @@
     m_loader = nullptr;
 }
 
+PassOwnPtr<FetchDataConsumerHandle> BodyStreamBuffer::releaseHandle()
+{
+    DCHECK(!isStreamLocked());
+    DCHECK(!isStreamDisturbed());
+
+    if (m_madeFromReadableStream) {
+        ScriptState::Scope scope(m_scriptState.get());
+        // We need to have |reader| alive by some means (as written in
+        // ReadableStreamDataConsumerHandle). Based on the following facts
+        //  - This function is used only from tee and startLoading.
+        //  - This branch cannot be taken when called from tee.
+        //  - startLoading makes hasPendingActivity return true while loading.
+        // , we don't need to keep the reader explicitly.
+        NonThrowableExceptionState exceptionState;
+        ScriptValue reader = ReadableStreamOperations::getReader(m_scriptState.get(), stream(), exceptionState);
+        return ReadableStreamDataConsumerHandle::create(m_scriptState.get(), reader);
+    }
+    // We need to call these before calling closeAndLockAndDisturb.
+    const bool isClosed = isStreamClosed();
+    const bool isErrored = isStreamErrored();
+    OwnPtr<FetchDataConsumerHandle> handle = m_handle.release();
+
+    closeAndLockAndDisturb();
+
+    if (isClosed) {
+        // Note that the stream cannot be "draining", because it doesn't have
+        // the internal buffer.
+        return createFetchDataConsumerHandleFromWebHandle(createDoneDataConsumerHandle());
+    }
+    if (isErrored)
+        return createFetchDataConsumerHandleFromWebHandle(createUnexpectedErrorDataConsumerHandle());
+
+    DCHECK(handle);
+    return handle;
+}
+
 } // namespace blink
diff --git a/third_party/WebKit/Source/modules/fetch/BodyStreamBuffer.h b/third_party/WebKit/Source/modules/fetch/BodyStreamBuffer.h
index 6431e0a..7f973262 100644
--- a/third_party/WebKit/Source/modules/fetch/BodyStreamBuffer.h
+++ b/third_party/WebKit/Source/modules/fetch/BodyStreamBuffer.h
@@ -33,6 +33,8 @@
     EAGERLY_FINALIZE();
     // |handle| cannot be null and cannot be locked.
     BodyStreamBuffer(ScriptState*, PassOwnPtr<FetchDataConsumerHandle> /* handle */);
+    // |ReadableStreamOperations::isReadableStream(stream)| must hold.
+    BodyStreamBuffer(ScriptState*, ScriptValue stream);
 
     ScriptValue stream();
 
@@ -40,13 +42,7 @@
     PassRefPtr<BlobDataHandle> drainAsBlobDataHandle(FetchDataConsumerHandle::Reader::BlobSizePolicy);
     PassRefPtr<EncodedFormData> drainAsFormData();
     void startLoading(FetchDataLoader*, FetchDataLoader::Client* /* client */);
-
-    // Callable only when not locked. Returns a non-null handle.
-    // There is no means to "return" the handle to the body buffer: Calling
-    // this function locks, disturbs and closes the stream and no one will
-    // not be able to get any information from the stream and this buffer after
-    // that.
-    PassOwnPtr<FetchDataConsumerHandle> releaseHandle();
+    void tee(BodyStreamBuffer**, BodyStreamBuffer**);
 
     // UnderlyingSource
     void pullSource() override;
@@ -84,6 +80,7 @@
     void processData();
     void endLoading();
     void stopLoading();
+    PassOwnPtr<FetchDataConsumerHandle> releaseHandle();
 
     RefPtr<ScriptState> m_scriptState;
     OwnPtr<FetchDataConsumerHandle> m_handle;
@@ -92,6 +89,7 @@
     // We need this member to keep it alive while loading.
     Member<FetchDataLoader> m_loader;
     bool m_streamNeedsMore = false;
+    bool m_madeFromReadableStream;
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/modules/fetch/BodyStreamBufferTest.cpp b/third_party/WebKit/Source/modules/fetch/BodyStreamBufferTest.cpp
index df8cba27..c7869ca2 100644
--- a/third_party/WebKit/Source/modules/fetch/BodyStreamBufferTest.cpp
+++ b/third_party/WebKit/Source/modules/fetch/BodyStreamBufferTest.cpp
@@ -51,25 +51,124 @@
     ExecutionContext* getExecutionContext() { return &m_page->document(); }
 
     OwnPtr<DummyPageHolder> m_page;
+
+    ScriptValue eval(const char* s)
+    {
+        v8::Local<v8::String> source;
+        v8::Local<v8::Script> script;
+        v8::MicrotasksScope microtasks(getScriptState()->isolate(), v8::MicrotasksScope::kDoNotRunMicrotasks);
+        if (!v8Call(v8::String::NewFromUtf8(getScriptState()->isolate(), s, v8::NewStringType::kNormal), source)) {
+            ADD_FAILURE();
+            return ScriptValue();
+        }
+        if (!v8Call(v8::Script::Compile(getScriptState()->context(), source), script)) {
+            ADD_FAILURE() << "Compilation fails";
+            return ScriptValue();
+        }
+        return ScriptValue(getScriptState(), script->Run(getScriptState()->context()));
+    }
+    ScriptValue evalWithPrintingError(const char* s)
+    {
+        v8::TryCatch block(getScriptState()->isolate());
+        ScriptValue r = eval(s);
+        if (block.HasCaught()) {
+            ADD_FAILURE() << toCoreString(block.Exception()->ToString(getScriptState()->isolate())).utf8().data();
+            block.ReThrow();
+        }
+        return r;
+    }
 };
 
-TEST_F(BodyStreamBufferTest, ReleaseHandle)
+TEST_F(BodyStreamBufferTest, Tee)
 {
-    OwnPtr<FetchDataConsumerHandle> handle = createFetchDataConsumerHandleFromWebHandle(createWaitingDataConsumerHandle());
-    FetchDataConsumerHandle* rawHandle = handle.get();
-    BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), std::move(handle));
+    Checkpoint checkpoint;
+    MockFetchDataLoaderClient* client1 = MockFetchDataLoaderClient::create();
+    MockFetchDataLoaderClient* client2 = MockFetchDataLoaderClient::create();
 
-    EXPECT_FALSE(buffer->hasPendingActivity());
-    EXPECT_FALSE(buffer->isStreamLocked());
-    EXPECT_FALSE(buffer->isStreamDisturbed());
-    EXPECT_TRUE(buffer->isStreamReadable());
+    InSequence s;
+    EXPECT_CALL(checkpoint, Call(1));
+    EXPECT_CALL(*client1, didFetchDataLoadedString(String("hello, world")));
+    EXPECT_CALL(checkpoint, Call(2));
+    EXPECT_CALL(checkpoint, Call(3));
+    EXPECT_CALL(*client2, didFetchDataLoadedString(String("hello, world")));
+    EXPECT_CALL(checkpoint, Call(4));
 
-    OwnPtr<FetchDataConsumerHandle> handle2 = buffer->releaseHandle();
+    OwnPtr<DataConsumerHandleTestUtil::ReplayingHandle> handle = DataConsumerHandleTestUtil::ReplayingHandle::create();
+    handle->add(DataConsumerHandleTestUtil::Command(DataConsumerHandleTestUtil::Command::Data, "hello, "));
+    handle->add(DataConsumerHandleTestUtil::Command(DataConsumerHandleTestUtil::Command::Data, "world"));
+    handle->add(DataConsumerHandleTestUtil::Command(DataConsumerHandleTestUtil::Command::Done));
+    BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), createFetchDataConsumerHandleFromWebHandle(std::move(handle)));
 
-    ASSERT_EQ(rawHandle, handle2.get());
+    BodyStreamBuffer* new1;
+    BodyStreamBuffer* new2;
+    buffer->tee(&new1, &new2);
+
     EXPECT_TRUE(buffer->isStreamLocked());
     EXPECT_TRUE(buffer->isStreamDisturbed());
-    EXPECT_TRUE(buffer->isStreamClosed());
+    EXPECT_FALSE(buffer->hasPendingActivity());
+
+    new1->startLoading(FetchDataLoader::createLoaderAsString(), client1);
+    checkpoint.Call(1);
+    testing::runPendingTasks();
+    checkpoint.Call(2);
+
+    new2->startLoading(FetchDataLoader::createLoaderAsString(), client2);
+    checkpoint.Call(3);
+    testing::runPendingTasks();
+    checkpoint.Call(4);
+}
+
+TEST_F(BodyStreamBufferTest, TeeFromHandleMadeFromStream)
+{
+    ScriptState::Scope scope(getScriptState());
+    ScriptValue stream = evalWithPrintingError(
+        "stream = new ReadableStream({start: c => controller = c});"
+        "controller.enqueue(new Uint8Array([0x41, 0x42]));"
+        "controller.enqueue(new Uint8Array([0x55, 0x58]));"
+        "controller.close();"
+        "stream");
+    Checkpoint checkpoint;
+    MockFetchDataLoaderClient* client1 = MockFetchDataLoaderClient::create();
+    MockFetchDataLoaderClient* client2 = MockFetchDataLoaderClient::create();
+
+    InSequence s;
+    EXPECT_CALL(checkpoint, Call(1));
+    EXPECT_CALL(*client1, didFetchDataLoadedString(String("ABUX")));
+    EXPECT_CALL(checkpoint, Call(2));
+    EXPECT_CALL(checkpoint, Call(3));
+    EXPECT_CALL(*client2, didFetchDataLoadedString(String("ABUX")));
+    EXPECT_CALL(checkpoint, Call(4));
+
+    BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), stream);
+
+    BodyStreamBuffer* new1;
+    BodyStreamBuffer* new2;
+    buffer->tee(&new1, &new2);
+
+    EXPECT_TRUE(buffer->isStreamLocked());
+    // Note that this behavior is slightly different from for the behavior of
+    // a BodyStreamBuffer made from a FetchDataConsumerHandle. See the above
+    // test. In this test, the stream will get disturbed when the microtask
+    // is performed.
+    // TODO(yhirano): A uniformed behavior is preferred.
+    EXPECT_FALSE(buffer->isStreamDisturbed());
+    EXPECT_FALSE(buffer->hasPendingActivity());
+
+    v8::MicrotasksScope::PerformCheckpoint(getScriptState()->isolate());
+
+    EXPECT_TRUE(buffer->isStreamLocked());
+    EXPECT_TRUE(buffer->isStreamDisturbed());
+    EXPECT_FALSE(buffer->hasPendingActivity());
+
+    new1->startLoading(FetchDataLoader::createLoaderAsString(), client1);
+    checkpoint.Call(1);
+    testing::runPendingTasks();
+    checkpoint.Call(2);
+
+    new2->startLoading(FetchDataLoader::createLoaderAsString(), client2);
+    checkpoint.Call(3);
+    testing::runPendingTasks();
+    checkpoint.Call(4);
 }
 
 TEST_F(BodyStreamBufferTest, DrainAsBlobDataHandle)
@@ -108,6 +207,25 @@
     EXPECT_FALSE(buffer->hasPendingActivity());
 }
 
+TEST_F(BodyStreamBufferTest, DrainAsBlobFromBufferMadeFromBufferMadeFromStream)
+{
+    ScriptState::Scope scope(getScriptState());
+    ScriptValue stream = evalWithPrintingError("new ReadableStream()");
+    BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), stream);
+
+    EXPECT_FALSE(buffer->hasPendingActivity());
+    EXPECT_FALSE(buffer->isStreamLocked());
+    EXPECT_FALSE(buffer->isStreamDisturbed());
+    EXPECT_TRUE(buffer->isStreamReadable());
+
+    EXPECT_FALSE(buffer->drainAsBlobDataHandle(FetchDataConsumerHandle::Reader::AllowBlobWithInvalidSize));
+
+    EXPECT_FALSE(buffer->hasPendingActivity());
+    EXPECT_FALSE(buffer->isStreamLocked());
+    EXPECT_FALSE(buffer->isStreamDisturbed());
+    EXPECT_TRUE(buffer->isStreamReadable());
+}
+
 TEST_F(BodyStreamBufferTest, DrainAsFormData)
 {
     FormData* data = FormData::create(UTF8Encoding());
@@ -145,6 +263,25 @@
     EXPECT_FALSE(buffer->hasPendingActivity());
 }
 
+TEST_F(BodyStreamBufferTest, DrainAsFormDataFromBufferMadeFromBufferMadeFromStream)
+{
+    ScriptState::Scope scope(getScriptState());
+    ScriptValue stream = evalWithPrintingError("new ReadableStream()");
+    BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), stream);
+
+    EXPECT_FALSE(buffer->hasPendingActivity());
+    EXPECT_FALSE(buffer->isStreamLocked());
+    EXPECT_FALSE(buffer->isStreamDisturbed());
+    EXPECT_TRUE(buffer->isStreamReadable());
+
+    EXPECT_FALSE(buffer->drainAsFormData());
+
+    EXPECT_FALSE(buffer->hasPendingActivity());
+    EXPECT_FALSE(buffer->isStreamLocked());
+    EXPECT_FALSE(buffer->isStreamDisturbed());
+    EXPECT_TRUE(buffer->isStreamReadable());
+}
+
 TEST_F(BodyStreamBufferTest, LoadBodyStreamBufferAsArrayBuffer)
 {
     Checkpoint checkpoint;
@@ -237,25 +374,6 @@
     EXPECT_FALSE(buffer->hasPendingActivity());
 }
 
-TEST_F(BodyStreamBufferTest, ReleaseClosedHandle)
-{
-    BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), createFetchDataConsumerHandleFromWebHandle(createDoneDataConsumerHandle()));
-
-    EXPECT_TRUE(buffer->isStreamReadable());
-    testing::runPendingTasks();
-    EXPECT_TRUE(buffer->isStreamClosed());
-
-    EXPECT_FALSE(buffer->isStreamLocked());
-    EXPECT_FALSE(buffer->isStreamDisturbed());
-    EXPECT_FALSE(buffer->hasPendingActivity());
-    OwnPtr<FetchDataConsumerHandle> handle = buffer->releaseHandle();
-
-    EXPECT_TRUE(handle);
-    EXPECT_TRUE(buffer->isStreamLocked());
-    EXPECT_TRUE(buffer->isStreamDisturbed());
-    EXPECT_FALSE(buffer->hasPendingActivity());
-}
-
 TEST_F(BodyStreamBufferTest, LoadClosedHandle)
 {
     Checkpoint checkpoint;
@@ -290,24 +408,6 @@
     EXPECT_FALSE(buffer->hasPendingActivity());
 }
 
-TEST_F(BodyStreamBufferTest, ReleaseErroredHandle)
-{
-    BodyStreamBuffer* buffer = new BodyStreamBuffer(getScriptState(), createFetchDataConsumerHandleFromWebHandle(createUnexpectedErrorDataConsumerHandle()));
-
-    EXPECT_TRUE(buffer->isStreamReadable());
-    testing::runPendingTasks();
-    EXPECT_TRUE(buffer->isStreamErrored());
-
-    EXPECT_FALSE(buffer->isStreamLocked());
-    EXPECT_FALSE(buffer->isStreamDisturbed());
-    EXPECT_FALSE(buffer->hasPendingActivity());
-    OwnPtr<FetchDataConsumerHandle> handle = buffer->releaseHandle();
-    EXPECT_TRUE(handle);
-    EXPECT_TRUE(buffer->isStreamLocked());
-    EXPECT_TRUE(buffer->isStreamDisturbed());
-    EXPECT_FALSE(buffer->hasPendingActivity());
-}
-
 TEST_F(BodyStreamBufferTest, LoadErroredHandle)
 {
     Checkpoint checkpoint;
diff --git a/third_party/WebKit/Source/modules/fetch/FetchRequestData.cpp b/third_party/WebKit/Source/modules/fetch/FetchRequestData.cpp
index 77a1ba3..0776cae1 100644
--- a/third_party/WebKit/Source/modules/fetch/FetchRequestData.cpp
+++ b/third_party/WebKit/Source/modules/fetch/FetchRequestData.cpp
@@ -12,7 +12,6 @@
 #include "modules/credentialmanager/PasswordCredential.h"
 #include "modules/fetch/BodyStreamBuffer.h"
 #include "modules/fetch/DataConsumerHandleUtil.h"
-#include "modules/fetch/DataConsumerTee.h"
 #include "modules/fetch/FetchBlobDataConsumerHandle.h"
 #include "modules/fetch/FetchHeaderList.h"
 #include "platform/HTTPNames.h"
@@ -70,10 +69,11 @@
 {
     FetchRequestData* request = FetchRequestData::cloneExceptBody();
     if (m_buffer) {
-        OwnPtr<FetchDataConsumerHandle> dest1, dest2;
-        DataConsumerTee::create(scriptState->getExecutionContext(), m_buffer->releaseHandle(), &dest1, &dest2);
-        m_buffer = new BodyStreamBuffer(scriptState, std::move(dest1));
-        request->m_buffer = new BodyStreamBuffer(scriptState, std::move(dest2));
+        BodyStreamBuffer* new1 = nullptr;
+        BodyStreamBuffer* new2 = nullptr;
+        m_buffer->tee(&new1, &new2);
+        m_buffer = new1;
+        request->m_buffer = new2;
     }
     return request;
 }
diff --git a/third_party/WebKit/Source/modules/fetch/FetchResponseData.cpp b/third_party/WebKit/Source/modules/fetch/FetchResponseData.cpp
index a3500d2..56cc54c 100644
--- a/third_party/WebKit/Source/modules/fetch/FetchResponseData.cpp
+++ b/third_party/WebKit/Source/modules/fetch/FetchResponseData.cpp
@@ -10,7 +10,6 @@
 #include "core/fetch/FetchUtils.h"
 #include "modules/fetch/BodyStreamBuffer.h"
 #include "modules/fetch/DataConsumerHandleUtil.h"
-#include "modules/fetch/DataConsumerTee.h"
 #include "modules/fetch/FetchHeaderList.h"
 #include "public/platform/modules/serviceworker/WebServiceWorkerResponse.h"
 
@@ -190,10 +189,11 @@
     case DefaultType: {
         ASSERT(!m_internalResponse);
         if (m_buffer) {
-            OwnPtr<WebDataConsumerHandle> handle1, handle2;
-            DataConsumerTee::create(scriptState->getExecutionContext(), m_buffer->releaseHandle(), &handle1, &handle2);
-            m_buffer = new BodyStreamBuffer(scriptState, createFetchDataConsumerHandleFromWebHandle(std::move(handle1)));
-            newResponse->m_buffer = new BodyStreamBuffer(scriptState, createFetchDataConsumerHandleFromWebHandle(std::move(handle2)));
+            BodyStreamBuffer* new1 = nullptr;
+            BodyStreamBuffer* new2 = nullptr;
+            m_buffer->tee(&new1, &new2);
+            m_buffer = new1;
+            newResponse->m_buffer = new2;
         }
         break;
     }
diff --git a/third_party/WebKit/Source/modules/fetch/Request.h b/third_party/WebKit/Source/modules/fetch/Request.h
index 8f7e2ac1..89840b6 100644
--- a/third_party/WebKit/Source/modules/fetch/Request.h
+++ b/third_party/WebKit/Source/modules/fetch/Request.h
@@ -7,7 +7,7 @@
 
 #include "bindings/core/v8/Dictionary.h"
 #include "bindings/core/v8/ScriptWrappable.h"
-#include "bindings/modules/v8/UnionTypesModules.h"
+#include "bindings/modules/v8/RequestOrUSVString.h"
 #include "modules/ModulesExport.h"
 #include "modules/fetch/Body.h"
 #include "modules/fetch/FetchRequestData.h"
diff --git a/third_party/WebKit/Source/modules/fetch/Response.cpp b/third_party/WebKit/Source/modules/fetch/Response.cpp
index be53df1d..d7cd79e8 100644
--- a/third_party/WebKit/Source/modules/fetch/Response.cpp
+++ b/third_party/WebKit/Source/modules/fetch/Response.cpp
@@ -119,44 +119,49 @@
     v8::Isolate* isolate = scriptState->isolate();
     ExecutionContext* executionContext = scriptState->getExecutionContext();
 
-    OwnPtr<FetchDataConsumerHandle> bodyHandle;
+    BodyStreamBuffer* bodyBuffer = nullptr;
     String contentType;
     if (bodyValue.isUndefined() || bodyValue.isNull()) {
         // Note: The IDL processor cannot handle this situation. See
         // https://crbug.com/335871.
     } else if (V8Blob::hasInstance(body, isolate)) {
         Blob* blob = V8Blob::toImpl(body.As<v8::Object>());
-        bodyHandle = FetchBlobDataConsumerHandle::create(executionContext, blob->blobDataHandle());
+        bodyBuffer = new BodyStreamBuffer(scriptState, FetchBlobDataConsumerHandle::create(executionContext, blob->blobDataHandle()));
         contentType = blob->type();
     } else if (V8ArrayBuffer::hasInstance(body, isolate)) {
-        bodyHandle = FetchFormDataConsumerHandle::create(V8ArrayBuffer::toImpl(body.As<v8::Object>()));
+        bodyBuffer = new BodyStreamBuffer(scriptState, FetchFormDataConsumerHandle::create(V8ArrayBuffer::toImpl(body.As<v8::Object>())));
     } else if (V8ArrayBufferView::hasInstance(body, isolate)) {
-        bodyHandle = FetchFormDataConsumerHandle::create(V8ArrayBufferView::toImpl(body.As<v8::Object>()));
+        bodyBuffer = new BodyStreamBuffer(scriptState, FetchFormDataConsumerHandle::create(V8ArrayBufferView::toImpl(body.As<v8::Object>())));
     } else if (V8FormData::hasInstance(body, isolate)) {
         RefPtr<EncodedFormData> formData = V8FormData::toImpl(body.As<v8::Object>())->encodeMultiPartFormData();
         // Here we handle formData->boundary() as a C-style string. See
         // FormDataEncoder::generateUniqueBoundaryString.
         contentType = AtomicString("multipart/form-data; boundary=") + formData->boundary().data();
-        bodyHandle = FetchFormDataConsumerHandle::create(executionContext, formData.release());
+        bodyBuffer = new BodyStreamBuffer(scriptState, FetchFormDataConsumerHandle::create(executionContext, formData.release()));
     } else if (RuntimeEnabledFeatures::responseConstructedWithReadableStreamEnabled() && ReadableStreamOperations::isReadableStream(scriptState, bodyValue)) {
-        bodyHandle = ReadableStreamDataConsumerHandle::create(scriptState, bodyValue);
-        reader = ReadableStreamOperations::getReader(scriptState, bodyValue, exceptionState);
-        if (exceptionState.hadException()) {
-            reader = ScriptValue();
-            bodyHandle = createFetchDataConsumerHandleFromWebHandle(createUnexpectedErrorDataConsumerHandle());
-            exceptionState.clearException();
+        if (RuntimeEnabledFeatures::responseBodyWithV8ExtraStreamEnabled()) {
+            bodyBuffer = new BodyStreamBuffer(scriptState, bodyValue);
         } else {
-            bodyHandle = ReadableStreamDataConsumerHandle::create(scriptState, reader);
+            OwnPtr<FetchDataConsumerHandle> bodyHandle;
+            reader = ReadableStreamOperations::getReader(scriptState, bodyValue, exceptionState);
+            if (exceptionState.hadException()) {
+                reader = ScriptValue();
+                bodyHandle = createFetchDataConsumerHandleFromWebHandle(createUnexpectedErrorDataConsumerHandle());
+                exceptionState.clearException();
+            } else {
+                bodyHandle = ReadableStreamDataConsumerHandle::create(scriptState, reader);
+            }
+            bodyBuffer = new BodyStreamBuffer(scriptState, std::move(bodyHandle));
         }
     } else {
         String string = toUSVString(isolate, body, exceptionState);
         if (exceptionState.hadException())
             return nullptr;
-        bodyHandle = FetchFormDataConsumerHandle::create(string);
+        bodyBuffer = new BodyStreamBuffer(scriptState, FetchFormDataConsumerHandle::create(string));
         contentType = "text/plain;charset=UTF-8";
     }
     // TODO(yhirano): Add the URLSearchParams case.
-    Response* response = create(scriptState, std::move(bodyHandle), contentType, ResponseInit(init, exceptionState), exceptionState);
+    Response* response = create(scriptState, bodyBuffer, contentType, ResponseInit(init, exceptionState), exceptionState);
     if (!exceptionState.hadException() && !reader.isEmpty()) {
         // Add a hidden reference so that the weak persistent in the
         // ReadableStreamDataConsumerHandle will be valid as long as the
@@ -172,7 +177,7 @@
     return response;
 }
 
-Response* Response::create(ScriptState* scriptState, PassOwnPtr<FetchDataConsumerHandle> bodyHandle, const String& contentType, const ResponseInit& init, ExceptionState& exceptionState)
+Response* Response::create(ScriptState* scriptState, BodyStreamBuffer* body, const String& contentType, const ResponseInit& init, ExceptionState& exceptionState)
 {
     unsigned short status = init.status;
 
@@ -219,7 +224,7 @@
             return nullptr;
     }
     // "7. If body is given, run these substeps:"
-    if (bodyHandle) {
+    if (body) {
         // "1. If |init|'s status member is a null body status, throw a
         //     TypeError."
         // "2. Let |stream| and |Content-Type| be the result of extracting
@@ -236,7 +241,7 @@
             exceptionState.throwTypeError("Response with null body status cannot have body");
             return nullptr;
         }
-        r->m_response->replaceBodyStreamBuffer(new BodyStreamBuffer(scriptState, std::move(bodyHandle)));
+        r->m_response->replaceBodyStreamBuffer(body);
         if (!contentType.isEmpty() && !r->m_response->headerList()->has("Content-Type"))
             r->m_response->headerList()->append("Content-Type", contentType);
     }
diff --git a/third_party/WebKit/Source/modules/fetch/Response.h b/third_party/WebKit/Source/modules/fetch/Response.h
index f4d5518..ea8cb88 100644
--- a/third_party/WebKit/Source/modules/fetch/Response.h
+++ b/third_party/WebKit/Source/modules/fetch/Response.h
@@ -8,7 +8,6 @@
 #include "bindings/core/v8/Dictionary.h"
 #include "bindings/core/v8/ScriptValue.h"
 #include "bindings/core/v8/ScriptWrappable.h"
-#include "bindings/modules/v8/UnionTypesModules.h"
 #include "modules/ModulesExport.h"
 #include "modules/fetch/Body.h"
 #include "modules/fetch/BodyStreamBuffer.h"
@@ -36,7 +35,7 @@
     static Response* create(ScriptState*, ExceptionState&);
     static Response* create(ScriptState*, ScriptValue body, const Dictionary&, ExceptionState&);
 
-    static Response* create(ScriptState*, PassOwnPtr<FetchDataConsumerHandle> bodyHandle, const String& contentType, const ResponseInit&, ExceptionState&);
+    static Response* create(ScriptState*, BodyStreamBuffer*, const String& contentType, const ResponseInit&, ExceptionState&);
     static Response* create(ExecutionContext*, FetchResponseData*);
     static Response* create(ScriptState*, const WebServiceWorkerResponse&);
 
diff --git a/third_party/WebKit/Source/modules/imagebitmap/ImageBitmapRenderingContext.cpp b/third_party/WebKit/Source/modules/imagebitmap/ImageBitmapRenderingContext.cpp
index 7d7e3244..e4eb7cc 100644
--- a/third_party/WebKit/Source/modules/imagebitmap/ImageBitmapRenderingContext.cpp
+++ b/third_party/WebKit/Source/modules/imagebitmap/ImageBitmapRenderingContext.cpp
@@ -4,7 +4,7 @@
 
 #include "modules/imagebitmap/ImageBitmapRenderingContext.h"
 
-#include "bindings/modules/v8/UnionTypesModules.h"
+#include "bindings/modules/v8/RenderingContext.h"
 #include "core/frame/ImageBitmap.h"
 #include "platform/graphics/GraphicsContext.h"
 #include "platform/graphics/StaticBitmapImage.h"
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBDatabase.h b/third_party/WebKit/Source/modules/indexeddb/IDBDatabase.h
index 69d3a2a..ff099ff 100644
--- a/third_party/WebKit/Source/modules/indexeddb/IDBDatabase.h
+++ b/third_party/WebKit/Source/modules/indexeddb/IDBDatabase.h
@@ -28,7 +28,7 @@
 
 #include "bindings/core/v8/ActiveScriptWrappable.h"
 #include "bindings/core/v8/ScriptState.h"
-#include "bindings/modules/v8/UnionTypesModules.h"
+#include "bindings/modules/v8/StringOrStringSequenceOrDOMStringList.h"
 #include "core/dom/ActiveDOMObject.h"
 #include "core/dom/DOMStringList.h"
 #include "modules/EventModules.h"
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBKeyPath.h b/third_party/WebKit/Source/modules/indexeddb/IDBKeyPath.h
index ed11ef9..3e187398 100644
--- a/third_party/WebKit/Source/modules/indexeddb/IDBKeyPath.h
+++ b/third_party/WebKit/Source/modules/indexeddb/IDBKeyPath.h
@@ -26,7 +26,7 @@
 #ifndef IDBKeyPath_h
 #define IDBKeyPath_h
 
-#include "bindings/modules/v8/UnionTypesModules.h"
+#include "bindings/modules/v8/StringOrStringSequence.h"
 #include "modules/ModulesExport.h"
 #include "public/platform/modules/indexeddb/WebIDBKeyPath.h"
 #include "wtf/Allocator.h"
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBObjectStore.h b/third_party/WebKit/Source/modules/indexeddb/IDBObjectStore.h
index 756c0f39..038d6b2 100644
--- a/third_party/WebKit/Source/modules/indexeddb/IDBObjectStore.h
+++ b/third_party/WebKit/Source/modules/indexeddb/IDBObjectStore.h
@@ -28,7 +28,6 @@
 
 #include "bindings/core/v8/ScriptWrappable.h"
 #include "bindings/core/v8/SerializedScriptValue.h"
-#include "bindings/modules/v8/UnionTypesModules.h"
 #include "modules/indexeddb/IDBCursor.h"
 #include "modules/indexeddb/IDBIndex.h"
 #include "modules/indexeddb/IDBIndexParameters.h"
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBTransaction.h b/third_party/WebKit/Source/modules/indexeddb/IDBTransaction.h
index 8556f398..2f507ba 100644
--- a/third_party/WebKit/Source/modules/indexeddb/IDBTransaction.h
+++ b/third_party/WebKit/Source/modules/indexeddb/IDBTransaction.h
@@ -29,6 +29,7 @@
 #include "bindings/core/v8/ActiveScriptWrappable.h"
 #include "bindings/core/v8/ScriptState.h"
 #include "core/dom/ActiveDOMObject.h"
+#include "core/dom/DOMStringList.h"
 #include "core/events/EventListener.h"
 #include "modules/EventModules.h"
 #include "modules/EventTargetModules.h"
diff --git a/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.cpp b/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.cpp
index 2631b08..4e01dc0 100644
--- a/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.cpp
+++ b/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.cpp
@@ -39,7 +39,7 @@
 #include "bindings/core/v8/ScriptState.h"
 #include "bindings/core/v8/ScriptValue.h"
 #include "bindings/core/v8/V8ThrowException.h"
-#include "bindings/modules/v8/UnionTypesModules.h"
+#include "bindings/modules/v8/RTCIceCandidateInitOrRTCIceCandidate.h"
 #include "bindings/modules/v8/V8RTCCertificate.h"
 #include "core/dom/DOMException.h"
 #include "core/dom/DOMTimeStamp.h"
diff --git a/third_party/WebKit/Source/modules/nfc/NFC.h b/third_party/WebKit/Source/modules/nfc/NFC.h
index ca3de0d3..2b756fc 100644
--- a/third_party/WebKit/Source/modules/nfc/NFC.h
+++ b/third_party/WebKit/Source/modules/nfc/NFC.h
@@ -7,7 +7,7 @@
 
 #include "bindings/core/v8/ScriptPromise.h"
 #include "bindings/core/v8/ScriptWrappable.h"
-#include "bindings/modules/v8/UnionTypesModules.h"
+#include "bindings/modules/v8/StringOrArrayBufferOrNFCMessage.h"
 #include "core/frame/LocalFrameLifecycleObserver.h"
 #include "core/page/PageLifecycleObserver.h"
 
diff --git a/third_party/WebKit/Source/modules/notifications/Notification.cpp b/third_party/WebKit/Source/modules/notifications/Notification.cpp
index a874cbe..742e78c 100644
--- a/third_party/WebKit/Source/modules/notifications/Notification.cpp
+++ b/third_party/WebKit/Source/modules/notifications/Notification.cpp
@@ -144,7 +144,7 @@
 void Notification::prepareShow()
 {
     ASSERT(m_state == NotificationStateIdle);
-    if (Notification::checkPermission(getExecutionContext()) != mojom::PermissionStatus::GRANTED) {
+    if (Notification::checkPermission(getExecutionContext()) != mojom::blink::PermissionStatus::GRANTED) {
         dispatchErrorEvent();
         return;
     }
@@ -333,14 +333,14 @@
     return actions;
 }
 
-String Notification::permissionString(mojom::PermissionStatus permission)
+String Notification::permissionString(mojom::blink::PermissionStatus permission)
 {
     switch (permission) {
-    case mojom::PermissionStatus::GRANTED:
+    case mojom::blink::PermissionStatus::GRANTED:
         return "granted";
-    case mojom::PermissionStatus::DENIED:
+    case mojom::blink::PermissionStatus::DENIED:
         return "denied";
-    case mojom::PermissionStatus::ASK:
+    case mojom::blink::PermissionStatus::ASK:
         return "default";
     }
 
@@ -353,7 +353,7 @@
     return permissionString(checkPermission(context));
 }
 
-mojom::PermissionStatus Notification::checkPermission(ExecutionContext* context)
+mojom::blink::PermissionStatus Notification::checkPermission(ExecutionContext* context)
 {
     SecurityOrigin* origin = context->getSecurityOrigin();
     ASSERT(origin);
diff --git a/third_party/WebKit/Source/modules/notifications/Notification.h b/third_party/WebKit/Source/modules/notifications/Notification.h
index cf5c627..83cd8a1 100644
--- a/third_party/WebKit/Source/modules/notifications/Notification.h
+++ b/third_party/WebKit/Source/modules/notifications/Notification.h
@@ -46,7 +46,7 @@
 #include "public/platform/WebVector.h"
 #include "public/platform/modules/notifications/WebNotificationData.h"
 #include "public/platform/modules/notifications/WebNotificationDelegate.h"
-#include "public/platform/modules/permissions/permission_status.mojom.h"
+#include "public/platform/modules/permissions/permission_status.mojom-blink.h"
 
 namespace blink {
 
@@ -99,9 +99,9 @@
     ScriptValue data(ScriptState*);
     HeapVector<NotificationAction> actions() const;
 
-    static String permissionString(mojom::PermissionStatus);
+    static String permissionString(mojom::blink::PermissionStatus);
     static String permission(ExecutionContext*);
-    static mojom::PermissionStatus checkPermission(ExecutionContext*);
+    static mojom::blink::PermissionStatus checkPermission(ExecutionContext*);
     static ScriptPromise requestPermission(ScriptState*, NotificationPermissionCallback*);
 
     static size_t maxActions();
diff --git a/third_party/WebKit/Source/modules/notifications/NotificationDataTest.cpp b/third_party/WebKit/Source/modules/notifications/NotificationDataTest.cpp
index 9f8038d..dd9799f 100644
--- a/third_party/WebKit/Source/modules/notifications/NotificationDataTest.cpp
+++ b/third_party/WebKit/Source/modules/notifications/NotificationDataTest.cpp
@@ -5,7 +5,6 @@
 #include "modules/notifications/NotificationData.h"
 
 #include "bindings/core/v8/ExceptionState.h"
-#include "bindings/modules/v8/UnionTypesModules.h"
 #include "core/testing/NullExecutionContext.h"
 #include "modules/notifications/Notification.h"
 #include "modules/notifications/NotificationOptions.h"
diff --git a/third_party/WebKit/Source/modules/notifications/ServiceWorkerRegistrationNotifications.cpp b/third_party/WebKit/Source/modules/notifications/ServiceWorkerRegistrationNotifications.cpp
index 4358efa..56e6720a 100644
--- a/third_party/WebKit/Source/modules/notifications/ServiceWorkerRegistrationNotifications.cpp
+++ b/third_party/WebKit/Source/modules/notifications/ServiceWorkerRegistrationNotifications.cpp
@@ -59,7 +59,7 @@
         return ScriptPromise::reject(scriptState, V8ThrowException::createTypeError(scriptState->isolate(), "No active registration available on the ServiceWorkerRegistration."));
 
     // If permission for notification's origin is not "granted", reject promise with a TypeError exception, and terminate these substeps.
-    if (Notification::checkPermission(executionContext) != mojom::PermissionStatus::GRANTED)
+    if (Notification::checkPermission(executionContext) != mojom::blink::PermissionStatus::GRANTED)
         return ScriptPromise::reject(scriptState, V8ThrowException::createTypeError(scriptState->isolate(), "No notification permission has been granted for this origin."));
 
     // Validate the developer-provided values to get a WebNotificationData object.
diff --git a/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.cpp b/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.cpp
index 88f141b..3b3b8f8 100644
--- a/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.cpp
+++ b/third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.cpp
@@ -4,7 +4,7 @@
 
 #include "modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.h"
 
-#include "bindings/modules/v8/UnionTypesModules.h"
+#include "bindings/modules/v8/OffscreenCanvasRenderingContext2DOrWebGLRenderingContextOrWebGL2RenderingContext.h"
 #include "core/frame/ImageBitmap.h"
 #include "platform/graphics/ImageBuffer.h"
 #include "platform/graphics/StaticBitmapImage.h"
diff --git a/third_party/WebKit/Source/modules/push_messaging/PushManager.h b/third_party/WebKit/Source/modules/push_messaging/PushManager.h
index a4c07292..3585012 100644
--- a/third_party/WebKit/Source/modules/push_messaging/PushManager.h
+++ b/third_party/WebKit/Source/modules/push_messaging/PushManager.h
@@ -6,7 +6,6 @@
 #define PushManager_h
 
 #include "bindings/core/v8/ScriptWrappable.h"
-#include "bindings/modules/v8/UnionTypesModules.h"
 #include "modules/ModulesExport.h"
 #include "platform/heap/Handle.h"
 
diff --git a/third_party/WebKit/Source/modules/push_messaging/PushManagerTest.cpp b/third_party/WebKit/Source/modules/push_messaging/PushManagerTest.cpp
index 03f0128..0511cb2 100644
--- a/third_party/WebKit/Source/modules/push_messaging/PushManagerTest.cpp
+++ b/third_party/WebKit/Source/modules/push_messaging/PushManagerTest.cpp
@@ -4,7 +4,6 @@
 
 #include "modules/push_messaging/PushManager.h"
 
-#include "bindings/modules/v8/UnionTypesModules.h"
 #include "core/dom/DOMArrayBuffer.h"
 #include "modules/push_messaging/PushSubscriptionOptions.h"
 #include "public/platform/WebString.h"
diff --git a/third_party/WebKit/Source/modules/push_messaging/PushMessageData.cpp b/third_party/WebKit/Source/modules/push_messaging/PushMessageData.cpp
index b6c9628..389c00e9 100644
--- a/third_party/WebKit/Source/modules/push_messaging/PushMessageData.cpp
+++ b/third_party/WebKit/Source/modules/push_messaging/PushMessageData.cpp
@@ -7,7 +7,7 @@
 #include "bindings/core/v8/ExceptionState.h"
 #include "bindings/core/v8/ScriptState.h"
 #include "bindings/core/v8/V8Binding.h"
-#include "bindings/modules/v8/UnionTypesModules.h"
+#include "bindings/modules/v8/ArrayBufferOrArrayBufferViewOrUSVString.h"
 #include "core/dom/DOMArrayBuffer.h"
 #include "core/fileapi/Blob.h"
 #include "platform/blob/BlobData.h"
diff --git a/third_party/WebKit/Source/modules/serviceworkers/InstallEvent.cpp b/third_party/WebKit/Source/modules/serviceworkers/InstallEvent.cpp
index 8343d06..7c98811 100644
--- a/third_party/WebKit/Source/modules/serviceworkers/InstallEvent.cpp
+++ b/third_party/WebKit/Source/modules/serviceworkers/InstallEvent.cpp
@@ -4,7 +4,6 @@
 
 #include "modules/serviceworkers/InstallEvent.h"
 
-#include "bindings/modules/v8/UnionTypesModules.h"
 #include "core/dom/ExceptionCode.h"
 #include "modules/serviceworkers/ServiceWorkerGlobalScopeClient.h"
 #include "public/platform/WebSecurityOrigin.h"
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScope.h b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScope.h
index bf715d9..ef976a2 100644
--- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScope.h
+++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScope.h
@@ -30,7 +30,7 @@
 #ifndef ServiceWorkerGlobalScope_h
 #define ServiceWorkerGlobalScope_h
 
-#include "bindings/modules/v8/UnionTypesModules.h"
+#include "bindings/modules/v8/RequestOrUSVString.h"
 #include "core/workers/WorkerGlobalScope.h"
 #include "modules/ModulesExport.h"
 #include "platform/heap/Handle.h"
diff --git a/third_party/WebKit/Source/modules/vibration/NavigatorVibration.cpp b/third_party/WebKit/Source/modules/vibration/NavigatorVibration.cpp
index 3b36ffb..f927a97 100644
--- a/third_party/WebKit/Source/modules/vibration/NavigatorVibration.cpp
+++ b/third_party/WebKit/Source/modules/vibration/NavigatorVibration.cpp
@@ -19,7 +19,7 @@
 
 #include "modules/vibration/NavigatorVibration.h"
 
-#include "bindings/modules/v8/UnionTypesModules.h"
+#include "bindings/modules/v8/UnsignedLongOrUnsignedLongSequence.h"
 #include "core/frame/LocalFrame.h"
 #include "core/frame/Navigator.h"
 #include "core/frame/UseCounter.h"
diff --git a/third_party/WebKit/Source/modules/webaudio/AbstractAudioContext.cpp b/third_party/WebKit/Source/modules/webaudio/AbstractAudioContext.cpp
index 35fca91..fcfa28d9 100644
--- a/third_party/WebKit/Source/modules/webaudio/AbstractAudioContext.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/AbstractAudioContext.cpp
@@ -135,10 +135,12 @@
         return;
 
     FFTFrame::initialize();
-    m_listener = AudioListener::create();
 
     if (m_destinationNode) {
         m_destinationNode->handler().initialize();
+        // The AudioParams in the listener need access to the destination node, so only create the
+        // listener if the destination node exists.
+        m_listener = AudioListener::create(*this);
     }
 }
 
@@ -855,6 +857,9 @@
         // Check to see if source nodes can be stopped because the end time has passed.
         handleStoppableSourceNodes();
 
+        // Update the dirty state of the listener.
+        listener()->updateState();
+
         unlock();
     }
 }
diff --git a/third_party/WebKit/Source/modules/webaudio/AbstractAudioContext.h b/third_party/WebKit/Source/modules/webaudio/AbstractAudioContext.h
index c20bc028..df197dd 100644
--- a/third_party/WebKit/Source/modules/webaudio/AbstractAudioContext.h
+++ b/third_party/WebKit/Source/modules/webaudio/AbstractAudioContext.h
@@ -301,6 +301,7 @@
 
     void removeFinishedSourceNodes();
 
+    // Listener for the PannerNodes
     Member<AudioListener> m_listener;
 
     // Only accessed in the audio thread.
diff --git a/third_party/WebKit/Source/modules/webaudio/AudioContext.idl b/third_party/WebKit/Source/modules/webaudio/AudioContext.idl
index 89237c9..aa56438 100644
--- a/third_party/WebKit/Source/modules/webaudio/AudioContext.idl
+++ b/third_party/WebKit/Source/modules/webaudio/AudioContext.idl
@@ -72,7 +72,7 @@
     [RaisesException, MeasureAs=AudioContextCreateBiquadFilter] BiquadFilterNode createBiquadFilter();
     [RaisesException, MeasureAs=AudioContextCreateIIRFilter] IIRFilterNode createIIRFilter(sequence<double> feedForward, sequence<double> feedBack);
     [RaisesException, MeasureAs=AudioContextCreateWaveShaper] WaveShaperNode createWaveShaper();
-    [RaisesException, MeasureAs=AudioContextCreatePanner] PannerNode createPanner();
+    [RaisesException, MeasureAs=AudioContextCreatePannerAutomated] PannerNode createPanner();
     [RaisesException, MeasureAs=AudioContextCreateConvolver] ConvolverNode createConvolver();
     [RaisesException, MeasureAs=AudioContextCreateDynamicsCompressor] DynamicsCompressorNode createDynamicsCompressor();
     [RaisesException, MeasureAs=AudioContextCreateAnalyser] AnalyserNode createAnalyser();
diff --git a/third_party/WebKit/Source/modules/webaudio/AudioListener.cpp b/third_party/WebKit/Source/modules/webaudio/AudioListener.cpp
index b41982d..6b09f37 100644
--- a/third_party/WebKit/Source/modules/webaudio/AudioListener.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/AudioListener.cpp
@@ -29,17 +29,39 @@
 #include "modules/webaudio/AudioListener.h"
 #include "modules/webaudio/PannerNode.h"
 #include "platform/audio/AudioBus.h"
+#include "platform/audio/AudioUtilities.h"
 #include "platform/audio/HRTFDatabaseLoader.h"
 
 namespace blink {
 
-AudioListener::AudioListener()
-    : m_position(0, 0, 0)
-    , m_orientation(0, 0, -1)
-    , m_upVector(0, 1, 0)
+AudioListener::AudioListener(AbstractAudioContext& context)
+    : m_positionX(AudioParam::create(context, ParamTypeAudioListenerPositionX, 0.0))
+    , m_positionY(AudioParam::create(context, ParamTypeAudioListenerPositionY, 0.0))
+    , m_positionZ(AudioParam::create(context, ParamTypeAudioListenerPositionZ, 0.0))
+    , m_forwardX(AudioParam::create(context, ParamTypeAudioListenerForwardX, 0.0))
+    , m_forwardY(AudioParam::create(context, ParamTypeAudioListenerForwardY, 0.0))
+    , m_forwardZ(AudioParam::create(context, ParamTypeAudioListenerForwardZ, -1.0))
+    , m_upX(AudioParam::create(context, ParamTypeAudioListenerUpX, 0.0))
+    , m_upY(AudioParam::create(context, ParamTypeAudioListenerUpY, 1.0))
+    , m_upZ(AudioParam::create(context, ParamTypeAudioListenerUpZ, 0.0))
     , m_dopplerFactor(1)
     , m_speedOfSound(343.3)
+    , m_lastUpdateTime(-1)
+    , m_positionXValues(AudioUtilities::kRenderQuantumFrames)
+    , m_positionYValues(AudioUtilities::kRenderQuantumFrames)
+    , m_positionZValues(AudioUtilities::kRenderQuantumFrames)
+    , m_forwardXValues(AudioUtilities::kRenderQuantumFrames)
+    , m_forwardYValues(AudioUtilities::kRenderQuantumFrames)
+    , m_forwardZValues(AudioUtilities::kRenderQuantumFrames)
+    , m_upXValues(AudioUtilities::kRenderQuantumFrames)
+    , m_upYValues(AudioUtilities::kRenderQuantumFrames)
+    , m_upZValues(AudioUtilities::kRenderQuantumFrames)
 {
+    // Initialize the cached values with the current values.  Thus, we don't need to notify any
+    // panners because we haved moved.
+    m_lastPosition = position();
+    m_lastForward = orientation();
+    m_lastUp = upVector();
 }
 
 AudioListener::~AudioListener()
@@ -48,6 +70,17 @@
 
 DEFINE_TRACE(AudioListener)
 {
+    visitor->trace(m_positionX);
+    visitor->trace(m_positionY);
+    visitor->trace(m_positionZ);
+
+    visitor->trace(m_forwardX);
+    visitor->trace(m_forwardY);
+    visitor->trace(m_forwardZ);
+
+    visitor->trace(m_upX);
+    visitor->trace(m_upY);
+    visitor->trace(m_upZ);
 }
 
 void AudioListener::addPanner(PannerHandler& panner)
@@ -63,6 +96,132 @@
     m_panners.remove(&panner);
 }
 
+bool AudioListener::hasSampleAccurateValues() const
+{
+    return positionX()->handler().hasSampleAccurateValues()
+        || positionY()->handler().hasSampleAccurateValues()
+        || positionZ()->handler().hasSampleAccurateValues()
+        || forwardX()->handler().hasSampleAccurateValues()
+        || forwardY()->handler().hasSampleAccurateValues()
+        || forwardZ()->handler().hasSampleAccurateValues()
+        || upX()->handler().hasSampleAccurateValues()
+        || upY()->handler().hasSampleAccurateValues()
+        || upZ()->handler().hasSampleAccurateValues();
+}
+
+void AudioListener::updateValuesIfNeeded(size_t framesToProcess)
+{
+    double currentTime = positionX()->handler().destinationHandler().currentTime();
+    if (m_lastUpdateTime != currentTime) {
+        // Time has changed. Update all of the automation values now.
+        m_lastUpdateTime = currentTime;
+
+        bool sizesAreGood = framesToProcess <= m_positionXValues.size()
+            && framesToProcess <= m_positionYValues.size()
+            && framesToProcess <= m_positionZValues.size()
+            && framesToProcess <= m_forwardXValues.size()
+            && framesToProcess <= m_forwardYValues.size()
+            && framesToProcess <= m_forwardZValues.size()
+            && framesToProcess <= m_upXValues.size()
+            && framesToProcess <= m_upYValues.size()
+            && framesToProcess <= m_upZValues.size();
+
+        DCHECK(sizesAreGood);
+        if (!sizesAreGood)
+            return;
+
+        positionX()->handler().calculateSampleAccurateValues(m_positionXValues.data(), framesToProcess);
+        positionY()->handler().calculateSampleAccurateValues(m_positionYValues.data(), framesToProcess);
+        positionZ()->handler().calculateSampleAccurateValues(m_positionZValues.data(), framesToProcess);
+
+        forwardX()->handler().calculateSampleAccurateValues(m_forwardXValues.data(), framesToProcess);
+        forwardY()->handler().calculateSampleAccurateValues(m_forwardYValues.data(), framesToProcess);
+        forwardZ()->handler().calculateSampleAccurateValues(m_forwardZValues.data(), framesToProcess);
+
+        upX()->handler().calculateSampleAccurateValues(m_upXValues.data(), framesToProcess);
+        upY()->handler().calculateSampleAccurateValues(m_upYValues.data(), framesToProcess);
+        upZ()->handler().calculateSampleAccurateValues(m_upZValues.data(), framesToProcess);
+    }
+}
+
+const float* AudioListener::getPositionXValues(size_t framesToProcess)
+{
+    updateValuesIfNeeded(framesToProcess);
+    return m_positionXValues.data();
+}
+
+const float* AudioListener::getPositionYValues(size_t framesToProcess)
+{
+    updateValuesIfNeeded(framesToProcess);
+    return m_positionYValues.data();
+}
+
+const float* AudioListener::getPositionZValues(size_t framesToProcess)
+{
+    updateValuesIfNeeded(framesToProcess);
+    return m_positionZValues.data();
+}
+
+const float* AudioListener::getForwardXValues(size_t framesToProcess)
+{
+    updateValuesIfNeeded(framesToProcess);
+    return m_forwardXValues.data();
+}
+
+const float* AudioListener::getForwardYValues(size_t framesToProcess)
+{
+    updateValuesIfNeeded(framesToProcess);
+    return m_forwardYValues.data();
+}
+
+const float* AudioListener::getForwardZValues(size_t framesToProcess)
+{
+    updateValuesIfNeeded(framesToProcess);
+    return m_forwardZValues.data();
+}
+
+const float* AudioListener::getUpXValues(size_t framesToProcess)
+{
+    updateValuesIfNeeded(framesToProcess);
+    return m_upXValues.data();
+}
+
+const float* AudioListener::getUpYValues(size_t framesToProcess)
+{
+    updateValuesIfNeeded(framesToProcess);
+    return m_upYValues.data();
+}
+
+const float* AudioListener::getUpZValues(size_t framesToProcess)
+{
+    updateValuesIfNeeded(framesToProcess);
+    return m_upZValues.data();
+}
+
+void AudioListener::updateState()
+{
+    FloatPoint3D currentPosition = position();
+    FloatPoint3D currentForward = orientation();
+    FloatPoint3D currentUp = upVector();
+
+    bool hasMoved = currentPosition != m_lastPosition
+        || currentForward != m_lastForward
+        || currentUp != m_lastUp;
+
+    if (hasMoved) {
+        m_lastPosition = currentPosition;
+        m_lastForward = currentForward;
+        m_lastUp = currentUp;
+
+        markPannersAsDirty(PannerHandler::AzimuthElevationDirty | PannerHandler::DistanceConeGainDirty);
+    } else {
+        // Tell each panner to check its dirty state in case the panner position/orientation
+        // changed.
+        for (PannerHandler* panner : m_panners)
+            panner->updateDirtyState();
+    }
+}
+
 void AudioListener::createAndLoadHRTFDatabaseLoader(float sampleRate)
 {
     if (!m_hrtfDatabaseLoader)
@@ -88,34 +247,31 @@
 
 void AudioListener::setPosition(const FloatPoint3D& position)
 {
-    if (m_position == position)
-        return;
-
     // This synchronizes with panner's process().
     MutexLocker listenerLocker(m_listenerLock);
-    m_position = position;
+    m_positionX->setValue(position.x());
+    m_positionY->setValue(position.y());
+    m_positionZ->setValue(position.z());
     markPannersAsDirty(PannerHandler::AzimuthElevationDirty | PannerHandler::DistanceConeGainDirty);
 }
 
 void AudioListener::setOrientation(const FloatPoint3D& orientation)
 {
-    if (m_orientation == orientation)
-        return;
-
     // This synchronizes with panner's process().
     MutexLocker listenerLocker(m_listenerLock);
-    m_orientation = orientation;
+    m_forwardX->setValue(orientation.x());
+    m_forwardY->setValue(orientation.y());
+    m_forwardZ->setValue(orientation.z());
     markPannersAsDirty(PannerHandler::AzimuthElevationDirty);
 }
 
 void AudioListener::setUpVector(const FloatPoint3D& upVector)
 {
-    if (m_upVector == upVector)
-        return;
-
     // This synchronizes with panner's process().
     MutexLocker listenerLocker(m_listenerLock);
-    m_upVector = upVector;
+    m_upX->setValue(upVector.x());
+    m_upY->setValue(upVector.y());
+    m_upZ->setValue(upVector.z());
     markPannersAsDirty(PannerHandler::AzimuthElevationDirty);
 }
 
diff --git a/third_party/WebKit/Source/modules/webaudio/AudioListener.h b/third_party/WebKit/Source/modules/webaudio/AudioListener.h
index 3173d65..d41a614e 100644
--- a/third_party/WebKit/Source/modules/webaudio/AudioListener.h
+++ b/third_party/WebKit/Source/modules/webaudio/AudioListener.h
@@ -30,6 +30,7 @@
 #define AudioListener_h
 
 #include "bindings/core/v8/ScriptWrappable.h"
+#include "modules/webaudio/AudioParam.h"
 #include "platform/geometry/FloatPoint3D.h"
 #include "platform/heap/Handle.h"
 #include "wtf/Vector.h"
@@ -44,15 +45,70 @@
 class AudioListener : public GarbageCollectedFinalized<AudioListener>, public ScriptWrappable {
     DEFINE_WRAPPERTYPEINFO();
 public:
-    static AudioListener* create()
+    static AudioListener* create(AbstractAudioContext& context)
     {
-        return new AudioListener();
+        return new AudioListener(context);
     }
     virtual ~AudioListener();
 
+    // Location of the listener
+    AudioParam* positionX() const { return m_positionX; };
+    AudioParam* positionY() const { return m_positionY; };
+    AudioParam* positionZ() const { return m_positionZ; };
+
+    // Forward direction vector of the listener
+    AudioParam* forwardX() const { return m_forwardX; };
+    AudioParam* forwardY() const { return m_forwardY; };
+    AudioParam* forwardZ() const { return m_forwardZ; };
+
+    // Up direction vector for the listener
+    AudioParam* upX() const { return m_upX; };
+    AudioParam* upY() const { return m_upY; };
+    AudioParam* upZ() const { return m_upZ; };
+
+    // True if any of AudioParams have automations.
+    bool hasSampleAccurateValues() const;
+
+    // Update the internal state of the listener, including updating the dirty state of all
+    // PannerNodes if necessary.
+    void updateState();
+
+    const FloatPoint3D position() const
+    {
+        return FloatPoint3D(
+            m_positionX->value(),
+            m_positionY->value(),
+            m_positionZ->value());
+    }
+    const FloatPoint3D orientation() const
+    {
+        return FloatPoint3D(
+            m_forwardX->value(),
+            m_forwardY->value(),
+            m_forwardZ->value());
+    }
+    const FloatPoint3D upVector() const
+    {
+        return FloatPoint3D(
+            m_upX->value(),
+            m_upY->value(),
+            m_upZ->value());
+    }
+
+    const float* getPositionXValues(size_t framesToProcess);
+    const float* getPositionYValues(size_t framesToProcess);
+    const float* getPositionZValues(size_t framesToProcess);
+
+    const float* getForwardXValues(size_t framesToProcess);
+    const float* getForwardYValues(size_t framesToProcess);
+    const float* getForwardZValues(size_t framesToProcess);
+
+    const float* getUpXValues(size_t framesToProcess);
+    const float* getUpYValues(size_t framesToProcess);
+    const float* getUpZValues(size_t framesToProcess);
+
     // Position
     void setPosition(float x, float y, float z) { setPosition(FloatPoint3D(x, y, z)); }
-    const FloatPoint3D& position() const { return m_position; }
 
     // Orientation and Up-vector
     void setOrientation(float x, float y, float z, float upX, float upY, float upZ)
@@ -60,8 +116,6 @@
         setOrientation(FloatPoint3D(x, y, z));
         setUpVector(FloatPoint3D(upX, upY, upZ));
     }
-    const FloatPoint3D& orientation() const { return m_orientation; }
-    const FloatPoint3D& upVector() const { return m_upVector; }
 
     // Velocity
     void setVelocity(float x, float y, float z);
@@ -87,7 +141,7 @@
     DECLARE_TRACE();
 
 private:
-    AudioListener();
+    AudioListener(AbstractAudioContext&);
 
     void setPosition(const FloatPoint3D&);
     void setOrientation(const FloatPoint3D&);
@@ -95,12 +149,46 @@
 
     void markPannersAsDirty(unsigned);
 
-    FloatPoint3D m_position;
-    FloatPoint3D m_orientation;
-    FloatPoint3D m_upVector;
+    // Location of the listener
+    Member<AudioParam> m_positionX;
+    Member<AudioParam> m_positionY;
+    Member<AudioParam> m_positionZ;
+
+    // Forward direction vector of the listener
+    Member<AudioParam> m_forwardX;
+    Member<AudioParam> m_forwardY;
+    Member<AudioParam> m_forwardZ;
+
+    // Up direction vector for the listener
+    Member<AudioParam> m_upX;
+    Member<AudioParam> m_upY;
+    Member<AudioParam> m_upZ;
+
     double m_dopplerFactor;
     double m_speedOfSound;
 
+    // The position, forward, and up vectors from the last rendering quantum.
+    FloatPoint3D m_lastPosition;
+    FloatPoint3D m_lastForward;
+    FloatPoint3D m_lastUp;
+
+    // Last time that the automations were updated.
+    double m_lastUpdateTime;
+
+    void updateValuesIfNeeded(size_t framesToProcess);
+
+    AudioFloatArray m_positionXValues;
+    AudioFloatArray m_positionYValues;
+    AudioFloatArray m_positionZValues;
+
+    AudioFloatArray m_forwardXValues;
+    AudioFloatArray m_forwardYValues;
+    AudioFloatArray m_forwardZValues;
+
+    AudioFloatArray m_upXValues;
+    AudioFloatArray m_upYValues;
+    AudioFloatArray m_upZValues;
+
     // Synchronize a panner's process() with setting of the state of the listener.
     mutable Mutex m_listenerLock;
     // List for pannerNodes in context. This is updated only in the main thread,
diff --git a/third_party/WebKit/Source/modules/webaudio/AudioListener.idl b/third_party/WebKit/Source/modules/webaudio/AudioListener.idl
index ad270177..b2645a0 100644
--- a/third_party/WebKit/Source/modules/webaudio/AudioListener.idl
+++ b/third_party/WebKit/Source/modules/webaudio/AudioListener.idl
@@ -31,7 +31,22 @@
     [DeprecateAs=AudioListenerDopplerFactor] attribute float dopplerFactor;  // same as OpenAL (default 1.0)
     [DeprecateAs=AudioListenerSpeedOfSound] attribute float speedOfSound;   // in meters / second (default 343.3)
 
-    void setPosition(float x, float y, float z);
-    void setOrientation(float x, float y, float z, float xUp, float yUp, float zUp);
+    [MeasureAs=AudioListenerSetPosition] void setPosition(float x, float y, float z);
+    [MeasureAs=AudioListenerSetOrientation] void setOrientation(float x, float y, float z, float xUp, float yUp, float zUp);
     [DeprecateAs=AudioListenerSetVelocity] void setVelocity(float x, float y, float z);
+
+    // Location of the listener
+    readonly attribute AudioParam positionX;
+    readonly attribute AudioParam positionY;
+    readonly attribute AudioParam positionZ;
+
+    // Forward direction vector of the listener
+    readonly attribute AudioParam forwardX;
+    readonly attribute AudioParam forwardY;
+    readonly attribute AudioParam forwardZ;
+
+    // Up direction vector for the listener
+    readonly attribute AudioParam upX;
+    readonly attribute AudioParam upY;
+    readonly attribute AudioParam upZ;
 };
diff --git a/third_party/WebKit/Source/modules/webaudio/AudioParam.cpp b/third_party/WebKit/Source/modules/webaudio/AudioParam.cpp
index 4a3e7669..309aa18 100644
--- a/third_party/WebKit/Source/modules/webaudio/AudioParam.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/AudioParam.cpp
@@ -24,11 +24,14 @@
  */
 
 #include "modules/webaudio/AudioParam.h"
+
+#include "core/inspector/ConsoleMessage.h"
 #include "modules/webaudio/AudioNode.h"
 #include "modules/webaudio/AudioNodeOutput.h"
 #include "platform/FloatConversion.h"
 #include "platform/Histogram.h"
 #include "platform/audio/AudioUtilities.h"
+#include "platform/v8_inspector/public/ConsoleTypes.h"
 #include "wtf/MathExtras.h"
 
 namespace blink {
@@ -36,11 +39,13 @@
 const double AudioParamHandler::DefaultSmoothingConstant = 0.05;
 const double AudioParamHandler::SnapThreshold = 0.001;
 
-AudioParamHandler::AudioParamHandler(AbstractAudioContext& context, AudioParamType paramType, double defaultValue)
+AudioParamHandler::AudioParamHandler(AbstractAudioContext& context, AudioParamType paramType, double defaultValue, float minValue, float maxValue)
     : AudioSummingJunction(context.deferredTaskHandler())
     , m_paramType(paramType)
     , m_intrinsicValue(defaultValue)
     , m_defaultValue(defaultValue)
+    , m_minValue(minValue)
+    , m_maxValue(maxValue)
     , m_smoothedValue(defaultValue)
 {
     // The destination MUST exist because we need the destination handler for the AudioParam.
@@ -100,6 +105,36 @@
         return "Oscillator.detune";
     case ParamTypeStereoPannerPan:
         return "StereoPanner.pan";
+    case ParamTypePannerPositionX:
+        return "Panner.positionX";
+    case ParamTypePannerPositionY:
+        return "Panner.positionY";
+    case ParamTypePannerPositionZ:
+        return "Panner.positionZ";
+    case ParamTypePannerOrientationX:
+        return "Panner.orientationX";
+    case ParamTypePannerOrientationY:
+        return "Panner.orientationY";
+    case ParamTypePannerOrientationZ:
+        return "Panner.orientationZ";
+    case ParamTypeAudioListenerPositionX:
+        return "AudioListener.positionX";
+    case ParamTypeAudioListenerPositionY:
+        return "AudioListener.positionY";
+    case ParamTypeAudioListenerPositionZ:
+        return "AudioListener.positionZ";
+    case ParamTypeAudioListenerForwardX:
+        return "AudioListener.forwardX";
+    case ParamTypeAudioListenerForwardY:
+        return "AudioListener.forwardY";
+    case ParamTypeAudioListenerForwardZ:
+        return "AudioListener.forwardZ";
+    case ParamTypeAudioListenerUpX:
+        return "AudioListener.upX";
+    case ParamTypeAudioListenerUpY:
+        return "AudioListener.upY";
+    case ParamTypeAudioListenerUpZ:
+        return "AudioListener.upZ";
     };
 
     NOTREACHED();
@@ -122,6 +157,12 @@
     return v;
 }
 
+void AudioParamHandler::setIntrinsicValue(float newValue)
+{
+    newValue = clampTo(newValue, m_minValue, m_maxValue);
+    noBarrierStore(&m_intrinsicValue, newValue);
+}
+
 void AudioParamHandler::setValue(float value)
 {
     setIntrinsicValue(value);
@@ -294,15 +335,24 @@
 
 // ----------------------------------------------------------------
 
-AudioParam::AudioParam(AbstractAudioContext& context, AudioParamType paramType, double defaultValue)
-    : m_handler(AudioParamHandler::create(context, paramType, defaultValue))
+AudioParam::AudioParam(AbstractAudioContext& context, AudioParamType paramType, double defaultValue, float minValue, float maxValue)
+    : m_handler(AudioParamHandler::create(context, paramType, defaultValue, minValue, maxValue))
     , m_context(context)
 {
 }
 
 AudioParam* AudioParam::create(AbstractAudioContext& context, AudioParamType paramType, double defaultValue)
 {
-    return new AudioParam(context, paramType, defaultValue);
+    // Default nominal range is most negative float to most positive.  This basically means any
+    // value is valid, except that floating-point infinities are excluded.
+    float limit = std::numeric_limits<float>::max();
+    return new AudioParam(context, paramType, defaultValue, -limit, limit);
+}
+
+AudioParam* AudioParam::create(AbstractAudioContext& context, AudioParamType paramType, double defaultValue, float minValue, float maxValue)
+{
+    DCHECK_LE(minValue, maxValue);
+    return new AudioParam(context, paramType, defaultValue, minValue, maxValue);
 }
 
 DEFINE_TRACE(AudioParam)
@@ -315,8 +365,27 @@
     return handler().value();
 }
 
+void AudioParam::warnIfOutsideRange(const String& paramMethod, float value)
+{
+    if (value < minValue() || value > maxValue()) {
+        context()->getExecutionContext()->addConsoleMessage(
+            ConsoleMessage::create(
+                JSMessageSource,
+                WarningMessageLevel,
+                handler().getParamName()
+                + "."
+                + paramMethod
+                + " "
+                + String::number(value)
+                + " outside nominal range ["
+                + String::number(minValue()) + ", " + String::number(maxValue())
+                + "]; value will be clamped."));
+    }
+}
+
 void AudioParam::setValue(float value)
 {
+    warnIfOutsideRange("value", value);
     handler().setValue(value);
 }
 
@@ -325,6 +394,16 @@
     return handler().defaultValue();
 }
 
+float AudioParam::minValue() const
+{
+    return handler().minValue();
+}
+
+float AudioParam::maxValue() const
+{
+    return handler().maxValue();
+}
+
 void AudioParam::setParamType(AudioParamType paramType)
 {
     handler().setParamType(paramType);
@@ -332,6 +411,7 @@
 
 AudioParam* AudioParam::setValueAtTime(float value, double time, ExceptionState& exceptionState)
 {
+    warnIfOutsideRange("setValueAtTime value", value);
     handler().timeline().setValueAtTime(value, time, exceptionState);
     handler().updateHistograms(value);
     return this;
@@ -339,6 +419,7 @@
 
 AudioParam* AudioParam::linearRampToValueAtTime(float value, double time, ExceptionState& exceptionState)
 {
+    warnIfOutsideRange("linearRampToValueAtTime value", value);
     handler().timeline().linearRampToValueAtTime(
         value, time, handler().intrinsicValue(), context()->currentTime(), exceptionState);
 
@@ -351,6 +432,7 @@
 
 AudioParam* AudioParam::exponentialRampToValueAtTime(float value, double time, ExceptionState& exceptionState)
 {
+    warnIfOutsideRange("exponentialRampToValue value", value);
     handler().timeline().exponentialRampToValueAtTime(value, time, handler().intrinsicValue(), context()->currentTime(), exceptionState);
 
     // This is probably the best we can do for the histogram.  We don't want to run the automation
@@ -362,6 +444,7 @@
 
 AudioParam* AudioParam::setTargetAtTime(float target, double time, double timeConstant, ExceptionState& exceptionState)
 {
+    warnIfOutsideRange("setTargetAtTime value", target);
     handler().timeline().setTargetAtTime(target, time, timeConstant, exceptionState);
 
     // Don't update the histogram here.  It's not clear in normal usage if the parameter value will
@@ -371,6 +454,19 @@
 
 AudioParam* AudioParam::setValueCurveAtTime(DOMFloat32Array* curve, double time, double duration, ExceptionState& exceptionState)
 {
+    // Just find the first value in the curve (if any) that is outside the nominal range.  It's
+    // probably not necessary to produce a warning on every value outside the nominal range.
+    float* curveData = curve->data();
+    float min = minValue();
+    float max = maxValue();
+
+    for (unsigned k = 0; k < curve->length(); ++k) {
+        if (curveData[k] < min || curveData[k] > max) {
+            warnIfOutsideRange("setValueCurveAtTime value", curveData[k]);
+            break;
+        }
+    }
+
     handler().timeline().setValueCurveAtTime(curve, time, duration, exceptionState);
 
     // We could update the histogram with every value in the curve, due to interpolation, we'll
diff --git a/third_party/WebKit/Source/modules/webaudio/AudioParam.h b/third_party/WebKit/Source/modules/webaudio/AudioParam.h
index 8655157..4288688 100644
--- a/third_party/WebKit/Source/modules/webaudio/AudioParam.h
+++ b/third_party/WebKit/Source/modules/webaudio/AudioParam.h
@@ -64,7 +64,22 @@
     ParamTypeGainGain,
     ParamTypeOscillatorFrequency,
     ParamTypeOscillatorDetune,
-    ParamTypeStereoPannerPan
+    ParamTypeStereoPannerPan,
+    ParamTypePannerPositionX,
+    ParamTypePannerPositionY,
+    ParamTypePannerPositionZ,
+    ParamTypePannerOrientationX,
+    ParamTypePannerOrientationY,
+    ParamTypePannerOrientationZ,
+    ParamTypeAudioListenerPositionX,
+    ParamTypeAudioListenerPositionY,
+    ParamTypeAudioListenerPositionZ,
+    ParamTypeAudioListenerForwardX,
+    ParamTypeAudioListenerForwardY,
+    ParamTypeAudioListenerForwardZ,
+    ParamTypeAudioListenerUpX,
+    ParamTypeAudioListenerUpY,
+    ParamTypeAudioListenerUpZ,
 };
 
 // AudioParamHandler is an actual implementation of web-exposed AudioParam
@@ -84,9 +99,14 @@
     static const double DefaultSmoothingConstant;
     static const double SnapThreshold;
 
-    static PassRefPtr<AudioParamHandler> create(AbstractAudioContext& context, AudioParamType paramType, double defaultValue)
+    static PassRefPtr<AudioParamHandler> create(
+        AbstractAudioContext& context,
+        AudioParamType paramType,
+        double defaultValue,
+        float minValue,
+        float maxValue)
     {
-        return adoptRef(new AudioParamHandler(context, paramType, defaultValue));
+        return adoptRef(new AudioParamHandler(context, paramType, defaultValue, minValue, maxValue));
     }
 
     // This should be used only in audio rendering thread.
@@ -106,6 +126,8 @@
     float finalValue();
 
     float defaultValue() const { return static_cast<float>(m_defaultValue); }
+    float minValue() const { return m_minValue; }
+    float maxValue() const { return m_maxValue; }
 
     // Value smoothing:
 
@@ -135,7 +157,9 @@
     void updateHistograms(float newValue);
 
 private:
-    AudioParamHandler(AbstractAudioContext&, AudioParamType, double defaultValue);
+    AudioParamHandler(AbstractAudioContext&, AudioParamType, double defaultValue, float min, float max);
+
+    void warnIfOutsideRange(float value, float minValue, float maxValue);
 
     // sampleAccurate corresponds to a-rate (audio rate) vs. k-rate in the Web Audio specification.
     void calculateFinalValues(float* values, unsigned numberOfValues, bool sampleAccurate);
@@ -149,10 +173,14 @@
 
     // Intrinsic value
     float m_intrinsicValue;
-    void setIntrinsicValue(float newValue) { noBarrierStore(&m_intrinsicValue, newValue); }
+    void setIntrinsicValue(float newValue);
 
     float m_defaultValue;
 
+    // Nominal range for the value
+    float m_minValue;
+    float m_maxValue;
+
     // Smoothing (de-zippering)
     float m_smoothedValue;
 
@@ -167,6 +195,8 @@
     DEFINE_WRAPPERTYPEINFO();
 public:
     static AudioParam* create(AbstractAudioContext&, AudioParamType, double defaultValue);
+    static AudioParam* create(AbstractAudioContext&, AudioParamType, double defaultValue, float minValue, float maxValue);
+
     DECLARE_TRACE();
     // |handler| always returns a valid object.
     AudioParamHandler& handler() const { return *m_handler; }
@@ -180,6 +210,10 @@
     float value() const;
     void setValue(float);
     float defaultValue() const;
+
+    float minValue() const;
+    float maxValue() const;
+
     AudioParam* setValueAtTime(float value, double time, ExceptionState&);
     AudioParam* linearRampToValueAtTime(float value, double time, ExceptionState&);
     AudioParam* exponentialRampToValueAtTime(float value, double time, ExceptionState&);
@@ -188,7 +222,9 @@
     AudioParam* cancelScheduledValues(double startTime, ExceptionState&);
 
 private:
-    AudioParam(AbstractAudioContext&, AudioParamType, double defaultValue);
+    AudioParam(AbstractAudioContext&, AudioParamType, double defaultValue, float min, float max);
+
+    void warnIfOutsideRange(const String& paramMethd, float value);
 
     RefPtr<AudioParamHandler> m_handler;
     Member<AbstractAudioContext> m_context;
diff --git a/third_party/WebKit/Source/modules/webaudio/AudioParam.idl b/third_party/WebKit/Source/modules/webaudio/AudioParam.idl
index 81180c3..f095804 100644
--- a/third_party/WebKit/Source/modules/webaudio/AudioParam.idl
+++ b/third_party/WebKit/Source/modules/webaudio/AudioParam.idl
@@ -31,6 +31,10 @@
     attribute float value;
     readonly attribute float defaultValue;
 
+    // Nominal range for the value.
+    readonly attribute float minValue;
+    readonly attribute float maxValue;
+
     // Parameter automation.
     [RaisesException, MeasureAs=AudioParamSetValueAtTime] AudioParam setValueAtTime(float value, double time);
     [RaisesException, MeasureAs=AudioParamLinearRampToValueAtTime] AudioParam linearRampToValueAtTime(float value, double time);
diff --git a/third_party/WebKit/Source/modules/webaudio/BiquadFilterNode.cpp b/third_party/WebKit/Source/modules/webaudio/BiquadFilterNode.cpp
index 8bd06ad..9d6fda8 100644
--- a/third_party/WebKit/Source/modules/webaudio/BiquadFilterNode.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/BiquadFilterNode.cpp
@@ -29,8 +29,8 @@
 
 BiquadFilterNode::BiquadFilterNode(AbstractAudioContext& context, float sampleRate)
     : AudioNode(context)
-    , m_frequency(AudioParam::create(context, ParamTypeBiquadFilterFrequency, 350.0))
-    , m_q(AudioParam::create(context, ParamTypeBiquadFilterQ, 1))
+    , m_frequency(AudioParam::create(context, ParamTypeBiquadFilterFrequency, 350.0, 0, sampleRate / 2))
+    , m_q(AudioParam::create(context, ParamTypeBiquadFilterQ, 1.0))
     , m_gain(AudioParam::create(context, ParamTypeBiquadFilterGain, 0.0))
     , m_detune(AudioParam::create(context, ParamTypeBiquadFilterDetune, 0.0))
 {
diff --git a/third_party/WebKit/Source/modules/webaudio/DelayNode.cpp b/third_party/WebKit/Source/modules/webaudio/DelayNode.cpp
index 4a3adf66..bbe233fa5 100644
--- a/third_party/WebKit/Source/modules/webaudio/DelayNode.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/DelayNode.cpp
@@ -36,7 +36,7 @@
 
 DelayNode::DelayNode(AbstractAudioContext& context, float sampleRate, double maxDelayTime)
     : AudioNode(context)
-    , m_delayTime(AudioParam::create(context, ParamTypeDelayDelayTime, 0.0))
+    , m_delayTime(AudioParam::create(context, ParamTypeDelayDelayTime, 0.0, 0.0, maxDelayTime))
 {
     setHandler(AudioBasicProcessorHandler::create(AudioHandler::NodeTypeDelay, *this, sampleRate, adoptPtr(new DelayProcessor(sampleRate, 1, m_delayTime->handler(), maxDelayTime))));
 }
diff --git a/third_party/WebKit/Source/modules/webaudio/DynamicsCompressorNode.cpp b/third_party/WebKit/Source/modules/webaudio/DynamicsCompressorNode.cpp
index dd77f7b..63b5dad 100644
--- a/third_party/WebKit/Source/modules/webaudio/DynamicsCompressorNode.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/DynamicsCompressorNode.cpp
@@ -127,11 +127,11 @@
 
 DynamicsCompressorNode::DynamicsCompressorNode(AbstractAudioContext& context, float sampleRate)
     : AudioNode(context)
-    , m_threshold(AudioParam::create(context, ParamTypeDynamicsCompressorThreshold, -24))
-    , m_knee(AudioParam::create(context, ParamTypeDynamicsCompressorKnee, 30))
-    , m_ratio(AudioParam::create(context, ParamTypeDynamicsCompressorRatio, 12))
-    , m_attack(AudioParam::create(context, ParamTypeDynamicsCompressorAttack, 0.003))
-    , m_release(AudioParam::create(context, ParamTypeDynamicsCompressorRelease, 0.250))
+    , m_threshold(AudioParam::create(context, ParamTypeDynamicsCompressorThreshold, -24, -100, 0))
+    , m_knee(AudioParam::create(context, ParamTypeDynamicsCompressorKnee, 30, 0, 40))
+    , m_ratio(AudioParam::create(context, ParamTypeDynamicsCompressorRatio, 12, 1, 20))
+    , m_attack(AudioParam::create(context, ParamTypeDynamicsCompressorAttack, 0.003, 0, 1))
+    , m_release(AudioParam::create(context, ParamTypeDynamicsCompressorRelease, 0.250, 0, 1))
 {
     setHandler(DynamicsCompressorHandler::create(
         *this,
diff --git a/third_party/WebKit/Source/modules/webaudio/OfflineAudioContext.cpp b/third_party/WebKit/Source/modules/webaudio/OfflineAudioContext.cpp
index bfebd3f7..dc3afb9 100644
--- a/third_party/WebKit/Source/modules/webaudio/OfflineAudioContext.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/OfflineAudioContext.cpp
@@ -30,6 +30,7 @@
 #include "core/dom/Document.h"
 #include "core/dom/ExceptionCode.h"
 #include "core/dom/ExecutionContext.h"
+#include "modules/webaudio/AudioListener.h"
 #include "modules/webaudio/DeferredTaskHandler.h"
 #include "modules/webaudio/OfflineAudioCompletionEvent.h"
 #include "modules/webaudio/OfflineAudioDestinationNode.h"
@@ -336,6 +337,9 @@
     // suspension MUST NOT be delayed.
     OfflineGraphAutoLocker locker(this);
 
+    // Update the dirty state of the listener.
+    listener()->updateState();
+
     deferredTaskHandler().handleDeferredTasks();
     handleStoppableSourceNodes();
 
diff --git a/third_party/WebKit/Source/modules/webaudio/OscillatorNode.cpp b/third_party/WebKit/Source/modules/webaudio/OscillatorNode.cpp
index 8636b518..3dc83b3 100644
--- a/third_party/WebKit/Source/modules/webaudio/OscillatorNode.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/OscillatorNode.cpp
@@ -333,7 +333,7 @@
 OscillatorNode::OscillatorNode(AbstractAudioContext& context, float sampleRate)
     : AudioScheduledSourceNode(context)
     // Use musical pitch standard A440 as a default.
-    , m_frequency(AudioParam::create(context, ParamTypeOscillatorFrequency, 440))
+    , m_frequency(AudioParam::create(context, ParamTypeOscillatorFrequency, 440, 0, sampleRate / 2))
     // Default to no detuning.
     , m_detune(AudioParam::create(context, ParamTypeOscillatorDetune, 0))
 {
diff --git a/third_party/WebKit/Source/modules/webaudio/PannerNode.cpp b/third_party/WebKit/Source/modules/webaudio/PannerNode.cpp
index ad21f7a..5754b0c 100644
--- a/third_party/WebKit/Source/modules/webaudio/PannerNode.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/PannerNode.cpp
@@ -42,19 +42,30 @@
         x = 0.0;
 }
 
-PannerHandler::PannerHandler(AudioNode& node, float sampleRate)
+PannerHandler::PannerHandler(
+    AudioNode& node, float sampleRate,
+    AudioParamHandler& positionX,
+    AudioParamHandler& positionY,
+    AudioParamHandler& positionZ,
+    AudioParamHandler& orientationX,
+    AudioParamHandler& orientationY,
+    AudioParamHandler& orientationZ)
     : AudioHandler(NodeTypePanner, node, sampleRate)
     , m_listener(node.context()->listener())
     , m_panningModel(Panner::PanningModelEqualPower)
     , m_distanceModel(DistanceEffect::ModelInverse)
-    , m_position(0, 0, 0)
-    , m_orientation(1, 0, 0)
     , m_isAzimuthElevationDirty(true)
     , m_isDistanceConeGainDirty(true)
     , m_lastGain(-1.0)
     , m_cachedAzimuth(0)
     , m_cachedElevation(0)
     , m_cachedDistanceConeGain(1.0f)
+    , m_positionX(positionX)
+    , m_positionY(positionY)
+    , m_positionZ(positionZ)
+    , m_orientationX(orientationX)
+    , m_orientationY(orientationY)
+    , m_orientationZ(orientationZ)
 {
     // Load the HRTF database asynchronously so we don't block the Javascript thread while creating the HRTF database.
     // The HRTF panner will return zeroes until the database is loaded.
@@ -71,9 +82,24 @@
     initialize();
 }
 
-PassRefPtr<PannerHandler> PannerHandler::create(AudioNode& node, float sampleRate)
+PassRefPtr<PannerHandler> PannerHandler::create(
+    AudioNode& node, float sampleRate,
+    AudioParamHandler& positionX,
+    AudioParamHandler& positionY,
+    AudioParamHandler& positionZ,
+    AudioParamHandler& orientationX,
+    AudioParamHandler& orientationY,
+    AudioParamHandler& orientationZ)
 {
-    return adoptRef(new PannerHandler(node, sampleRate));
+    return adoptRef(new PannerHandler(
+        node,
+        sampleRate,
+        positionX,
+        positionY,
+        positionZ,
+        orientationX,
+        orientationY,
+        orientationZ));
 }
 
 PannerHandler::~PannerHandler()
@@ -112,22 +138,28 @@
             listener()->waitForHRTFDatabaseLoaderThreadCompletion();
         }
 
-        // Apply the panning effect.
-        double azimuth;
-        double elevation;
-        azimuthElevation(&azimuth, &elevation);
+        if (hasSampleAccurateValues() || listener()->hasSampleAccurateValues()) {
+            // It's tempting to skip sample-accurate processing if isAzimuthElevationDirty() and
+            // isDistanceConeGain() both return false.  But in general we can't because something
+            // may scheduled to start in the middle of the rendering quantum.  On the other hand,
+            // the audible effect may be small enough that we can afford to do this optimization.
+            processSampleAccurateValues(destination, source, framesToProcess);
+        } else {
+            // Apply the panning effect.
+            double azimuth;
+            double elevation;
+            azimuthElevation(&azimuth, &elevation);
 
-        m_panner->pan(azimuth, elevation, source, destination, framesToProcess);
+            m_panner->pan(azimuth, elevation, source, destination, framesToProcess);
 
-        // Get the distance and cone gain.
-        float totalGain = distanceConeGain();
+            // Get the distance and cone gain.
+            float totalGain = distanceConeGain();
 
-        // Snap to desired gain at the beginning.
-        if (m_lastGain == -1.0)
             m_lastGain = totalGain;
 
-        // Apply gain in-place with de-zippering.
-        destination->copyWithGainFrom(*destination, &m_lastGain, totalGain);
+            // Apply gain in-place with de-zippering.
+            destination->copyWithGainFrom(*destination, &m_lastGain, totalGain);
+        }
     } else {
         // Too bad - The tryLock() failed.
         // We must be in the middle of changing the properties of the panner or the listener.
@@ -135,6 +167,63 @@
     }
 }
 
+void PannerHandler::processSampleAccurateValues(AudioBus* destination, const AudioBus* source, size_t framesToProcess)
+{
+    RELEASE_ASSERT(framesToProcess <= ProcessingSizeInFrames);
+
+    // Get the sample accurate values from all of the AudioParams, including the values from the
+    // AudioListener.
+    float pannerX[ProcessingSizeInFrames];
+    float pannerY[ProcessingSizeInFrames];
+    float pannerZ[ProcessingSizeInFrames];
+
+    float orientationX[ProcessingSizeInFrames];
+    float orientationY[ProcessingSizeInFrames];
+    float orientationZ[ProcessingSizeInFrames];
+
+    m_positionX->calculateSampleAccurateValues(pannerX, framesToProcess);
+    m_positionY->calculateSampleAccurateValues(pannerY, framesToProcess);
+    m_positionZ->calculateSampleAccurateValues(pannerZ, framesToProcess);
+    m_orientationX->calculateSampleAccurateValues(orientationX, framesToProcess);
+    m_orientationY->calculateSampleAccurateValues(orientationY, framesToProcess);
+    m_orientationZ->calculateSampleAccurateValues(orientationZ, framesToProcess);
+
+    // Get the automation values from the listener.
+    const float* listenerX = listener()->getPositionXValues(ProcessingSizeInFrames);
+    const float* listenerY = listener()->getPositionYValues(ProcessingSizeInFrames);
+    const float* listenerZ = listener()->getPositionZValues(ProcessingSizeInFrames);
+
+    const float* forwardX = listener()->getForwardXValues(ProcessingSizeInFrames);
+    const float* forwardY = listener()->getForwardYValues(ProcessingSizeInFrames);
+    const float* forwardZ = listener()->getForwardZValues(ProcessingSizeInFrames);
+
+    const float* upX = listener()->getUpXValues(ProcessingSizeInFrames);
+    const float* upY = listener()->getUpYValues(ProcessingSizeInFrames);
+    const float* upZ = listener()->getUpZValues(ProcessingSizeInFrames);
+
+    // Compute the azimuth, elevation, and total gains for each position.
+    double azimuth[ProcessingSizeInFrames];
+    double elevation[ProcessingSizeInFrames];
+    float totalGain[ProcessingSizeInFrames];
+
+    for (unsigned k = 0; k < framesToProcess; ++k) {
+        FloatPoint3D pannerPosition(pannerX[k], pannerY[k], pannerZ[k]);
+        FloatPoint3D orientation(orientationX[k], orientationY[k], orientationZ[k]);
+        FloatPoint3D listenerPosition(listenerX[k], listenerY[k], listenerZ[k]);
+        FloatPoint3D listenerForward(forwardX[k], forwardY[k], forwardZ[k]);
+        FloatPoint3D listenerUp(upX[k], upY[k], upZ[k]);
+
+        calculateAzimuthElevation(&azimuth[k], &elevation[k],
+            pannerPosition, listenerPosition, listenerForward, listenerUp);
+
+        // Get distance and cone gain
+        totalGain[k] = calculateDistanceConeGain(pannerPosition, orientation, listenerPosition);
+    }
+
+    m_panner->panWithSampleAccurateValues(azimuth, elevation, source, destination, framesToProcess);
+    destination->copyWithSampleAccurateGainValuesFrom(*destination, totalGain, framesToProcess);
+}
+
 void PannerHandler::initialize()
 {
     if (isInitialized())
@@ -143,6 +232,11 @@
     m_panner = Panner::create(m_panningModel, sampleRate(), listener()->hrtfDatabaseLoader());
     listener()->addPanner(*this);
 
+    // Set the cached values to the current values to start things off.  The panner is already
+    // marked as dirty, so this won't matter.
+    m_lastPosition = position();
+    m_lastOrientation = orientation();
+
     AudioHandler::initialize();
 }
 
@@ -317,51 +411,52 @@
 
 void PannerHandler::setPosition(float x, float y, float z)
 {
-    FloatPoint3D position = FloatPoint3D(x, y, z);
-
-    if (m_position == position)
-        return;
-
     // This synchronizes with process().
     MutexLocker processLocker(m_processLock);
-    m_position = position;
+
+    m_positionX->setValue(x);
+    m_positionY->setValue(y);
+    m_positionZ->setValue(z);
+
     markPannerAsDirty(PannerHandler::AzimuthElevationDirty | PannerHandler::DistanceConeGainDirty);
 }
 
 void PannerHandler::setOrientation(float x, float y, float z)
 {
-    FloatPoint3D orientation = FloatPoint3D(x, y, z);
-
-    if (m_orientation == orientation)
-        return;
-
     // This synchronizes with process().
     MutexLocker processLocker(m_processLock);
-    m_orientation = orientation;
+
+    m_orientationX->setValue(x);
+    m_orientationY->setValue(y);
+    m_orientationZ->setValue(z);
+
     markPannerAsDirty(PannerHandler::DistanceConeGainDirty);
 }
 
-void PannerHandler::calculateAzimuthElevation(double* outAzimuth, double* outElevation)
+void PannerHandler::calculateAzimuthElevation(
+    double* outAzimuth,
+    double* outElevation,
+    const FloatPoint3D& position,
+    const FloatPoint3D& listenerPosition,
+    const FloatPoint3D& listenerForward,
+    const FloatPoint3D& listenerUp)
 {
     double azimuth = 0.0;
 
     // Calculate the source-listener vector
-    FloatPoint3D listenerPosition = listener()->position();
-    FloatPoint3D sourceListener = m_position - listenerPosition;
+    FloatPoint3D sourceListener = position - listenerPosition;
 
     // normalize() does nothing if the length of |sourceListener| is zero.
     sourceListener.normalize();
 
     // Align axes
-    FloatPoint3D listenerFront = listener()->orientation();
-    FloatPoint3D listenerUp = listener()->upVector();
-    FloatPoint3D listenerRight = listenerFront.cross(listenerUp);
+    FloatPoint3D listenerRight = listenerForward.cross(listenerUp);
     listenerRight.normalize();
 
-    FloatPoint3D listenerFrontNorm = listenerFront;
-    listenerFrontNorm.normalize();
+    FloatPoint3D listenerForwardNorm = listenerForward;
+    listenerForwardNorm.normalize();
 
-    FloatPoint3D up = listenerRight.cross(listenerFrontNorm);
+    FloatPoint3D up = listenerRight.cross(listenerForwardNorm);
 
     float upProjection = sourceListener.dot(up);
 
@@ -371,7 +466,7 @@
     fixNANs(azimuth); // avoid illegal values
 
     // Source  in front or behind the listener
-    double frontBack = projectedSource.dot(listenerFrontNorm);
+    double frontBack = projectedSource.dot(listenerForwardNorm);
     if (frontBack < 0.0)
         azimuth = 360.0 - azimuth;
 
@@ -396,13 +491,14 @@
         *outElevation = elevation;
 }
 
-float PannerHandler::calculateDistanceConeGain()
+float PannerHandler::calculateDistanceConeGain(
+    const FloatPoint3D& position,
+    const FloatPoint3D& orientation,
+    const FloatPoint3D& listenerPosition)
 {
-    FloatPoint3D listenerPosition = listener()->position();
-
-    double listenerDistance = m_position.distanceTo(listenerPosition);
+    double listenerDistance = position.distanceTo(listenerPosition);
     double distanceGain = m_distanceEffect.gain(listenerDistance);
-    double coneGain = m_coneEffect.gain(m_position, m_orientation, listenerPosition);
+    double coneGain = m_coneEffect.gain(position, orientation, listenerPosition);
 
     return float(distanceGain * coneGain);
 }
@@ -412,7 +508,13 @@
     ASSERT(context()->isAudioThread());
 
     if (isAzimuthElevationDirty()) {
-        calculateAzimuthElevation(&m_cachedAzimuth, &m_cachedElevation);
+        calculateAzimuthElevation(
+            &m_cachedAzimuth,
+            &m_cachedElevation,
+            position(),
+            listener()->position(),
+            listener()->orientation(),
+            listener()->upVector());
         m_isAzimuthElevationDirty = false;
     }
 
@@ -425,7 +527,7 @@
     ASSERT(context()->isAudioThread());
 
     if (isDistanceConeGainDirty()) {
-        m_cachedDistanceConeGain = calculateDistanceConeGain();
+        m_cachedDistanceConeGain = calculateDistanceConeGain(position(), orientation(), listener()->position());
         m_isDistanceConeGainDirty = false;
     }
 
@@ -492,12 +594,51 @@
         context()->deferredTaskHandler().addChangedChannelCountMode(this);
 }
 
+bool PannerHandler::hasSampleAccurateValues() const
+{
+    return m_positionX->hasSampleAccurateValues()
+        || m_positionY->hasSampleAccurateValues()
+        || m_positionZ->hasSampleAccurateValues()
+        || m_orientationX->hasSampleAccurateValues()
+        || m_orientationY->hasSampleAccurateValues()
+        || m_orientationZ->hasSampleAccurateValues();
+}
+
+void PannerHandler::updateDirtyState()
+{
+    FloatPoint3D currentPosition = position();
+    FloatPoint3D currentOrientation = orientation();
+
+    bool hasMoved = currentPosition != m_lastPosition
+        || currentOrientation != m_lastOrientation;
+
+    if (hasMoved) {
+        m_lastPosition = currentPosition;
+        m_lastOrientation = currentOrientation;
+
+        markPannerAsDirty(PannerHandler::AzimuthElevationDirty | PannerHandler::DistanceConeGainDirty);
+    }
+}
 // ----------------------------------------------------------------
 
-PannerNode::PannerNode(AbstractAudioContext& context, float sampelRate)
+PannerNode::PannerNode(AbstractAudioContext& context, float sampleRate)
     : AudioNode(context)
+    , m_positionX(AudioParam::create(context, ParamTypePannerPositionX, 0.0))
+    , m_positionY(AudioParam::create(context, ParamTypePannerPositionY, 0.0))
+    , m_positionZ(AudioParam::create(context, ParamTypePannerPositionZ, 0.0))
+    , m_orientationX(AudioParam::create(context, ParamTypePannerOrientationX, 1.0))
+    , m_orientationY(AudioParam::create(context, ParamTypePannerOrientationY, 0.0))
+    , m_orientationZ(AudioParam::create(context, ParamTypePannerOrientationZ, 0.0))
 {
-    setHandler(PannerHandler::create(*this, sampelRate));
+    setHandler(PannerHandler::create(
+        *this,
+        sampleRate,
+        m_positionX->handler(),
+        m_positionY->handler(),
+        m_positionZ->handler(),
+        m_orientationX->handler(),
+        m_orientationY->handler(),
+        m_orientationZ->handler()));
 }
 
 PannerNode* PannerNode::create(AbstractAudioContext& context, float sampleRate)
@@ -606,4 +747,17 @@
     pannerHandler().setConeOuterGain(gain);
 }
 
+DEFINE_TRACE(PannerNode)
+{
+    visitor->trace(m_positionX);
+    visitor->trace(m_positionY);
+    visitor->trace(m_positionZ);
+
+    visitor->trace(m_orientationX);
+    visitor->trace(m_orientationY);
+    visitor->trace(m_orientationZ);
+
+    AudioNode::trace(visitor);
+}
+
 } // namespace blink
diff --git a/third_party/WebKit/Source/modules/webaudio/PannerNode.h b/third_party/WebKit/Source/modules/webaudio/PannerNode.h
index a12095e..56d632d 100644
--- a/third_party/WebKit/Source/modules/webaudio/PannerNode.h
+++ b/third_party/WebKit/Source/modules/webaudio/PannerNode.h
@@ -27,6 +27,7 @@
 
 #include "modules/webaudio/AudioListener.h"
 #include "modules/webaudio/AudioNode.h"
+#include "modules/webaudio/AudioParam.h"
 #include "platform/audio/AudioBus.h"
 #include "platform/audio/Cone.h"
 #include "platform/audio/Distance.h"
@@ -53,11 +54,21 @@
         DistanceConeGainDirty = 0x2,
     };
 
-    static PassRefPtr<PannerHandler> create(AudioNode&, float sampleRate);
+    static PassRefPtr<PannerHandler> create(
+        AudioNode&,
+        float sampleRate,
+        AudioParamHandler& positionX,
+        AudioParamHandler& positionY,
+        AudioParamHandler& positionZ,
+        AudioParamHandler& orientationX,
+        AudioParamHandler& orientationY,
+        AudioParamHandler& orientationZ);
+
     ~PannerHandler() override;
 
     // AudioHandler
     void process(size_t framesToProcess) override;
+    void processSampleAccurateValues(AudioBus* destination, const AudioBus* source, size_t framesToProcess);
     void initialize() override;
     void uninitialize() override;
 
@@ -93,6 +104,7 @@
     void setConeOuterGain(double);
 
     void markPannerAsDirty(unsigned);
+    void updateDirtyState();
 
     double tailTime() const override { return m_panner ? m_panner->tailTime() : 0; }
     double latencyTime() const override { return m_panner ? m_panner->latencyTime() : 0; }
@@ -101,15 +113,35 @@
     void setChannelCountMode(const String&, ExceptionState&) final;
 
 private:
-    PannerHandler(AudioNode&, float sampleRate);
+    PannerHandler(
+        AudioNode&,
+        float sampleRate,
+        AudioParamHandler& positionX,
+        AudioParamHandler& positionY,
+        AudioParamHandler& positionZ,
+        AudioParamHandler& orientationX,
+        AudioParamHandler& orientationY,
+        AudioParamHandler& orientationZ);
+
     // AbstractAudioContext's listener
     AudioListener* listener();
 
     bool setPanningModel(unsigned); // Returns true on success.
     bool setDistanceModel(unsigned); // Returns true on success.
 
-    void calculateAzimuthElevation(double* outAzimuth, double* outElevation);
-    float calculateDistanceConeGain(); // Returns the combined distance and cone gain attenuation.
+    void calculateAzimuthElevation(
+        double* outAzimuth,
+        double* outElevation,
+        const FloatPoint3D& position,
+        const FloatPoint3D& listenerPosition,
+        const FloatPoint3D& listenerForward,
+        const FloatPoint3D& listenerUp);
+
+    // Returns the combined distance and cone gain attenuation.
+    float calculateDistanceConeGain(
+        const FloatPoint3D& position,
+        const FloatPoint3D& orientation,
+        const FloatPoint3D& listenerPosition);
 
     void azimuthElevation(double* outAzimuth, double* outElevation);
     float distanceConeGain();
@@ -124,10 +156,6 @@
     unsigned m_panningModel;
     unsigned m_distanceModel;
 
-    // Current source location information
-    FloatPoint3D m_position;
-    FloatPoint3D m_orientation;
-
     bool m_isAzimuthElevationDirty;
     bool m_isDistanceConeGainDirty;
 
@@ -141,6 +169,36 @@
     double m_cachedElevation;
     float m_cachedDistanceConeGain;
 
+    const FloatPoint3D position() const
+    {
+        return FloatPoint3D(
+            m_positionX->value(),
+            m_positionY->value(),
+            m_positionZ->value());
+    }
+
+    const FloatPoint3D orientation() const
+    {
+        return FloatPoint3D(
+            m_orientationX->value(),
+            m_orientationY->value(),
+            m_orientationZ->value());
+    }
+
+    // True if any of this panner's AudioParams have automations.
+    bool hasSampleAccurateValues() const;
+
+    RefPtr<AudioParamHandler> m_positionX;
+    RefPtr<AudioParamHandler> m_positionY;
+    RefPtr<AudioParamHandler> m_positionZ;
+
+    RefPtr<AudioParamHandler> m_orientationX;
+    RefPtr<AudioParamHandler> m_orientationY;
+    RefPtr<AudioParamHandler> m_orientationZ;
+
+    FloatPoint3D m_lastPosition;
+    FloatPoint3D m_lastOrientation;
+
     // Synchronize process() with setting of the panning model, source's location information, listener, distance parameters and sound cones.
     mutable Mutex m_processLock;
 };
@@ -151,6 +209,17 @@
     static PannerNode* create(AbstractAudioContext&, float sampleRate);
     PannerHandler& pannerHandler() const;
 
+    DECLARE_VIRTUAL_TRACE();
+
+    // Uses a 3D cartesian coordinate system
+    AudioParam* positionX() const { return m_positionX; };
+    AudioParam* positionY() const { return m_positionY; };
+    AudioParam* positionZ() const { return m_positionZ; };
+
+    AudioParam* orientationX() const { return m_orientationX; };
+    AudioParam* orientationY() const { return m_orientationY; };
+    AudioParam* orientationZ() const { return m_orientationZ; };
+
     String panningModel() const;
     void setPanningModel(const String&);
     void setPosition(float x, float y, float z);
@@ -173,6 +242,14 @@
 
 private:
     PannerNode(AbstractAudioContext&, float sampleRate);
+
+    Member<AudioParam> m_positionX;
+    Member<AudioParam> m_positionY;
+    Member<AudioParam> m_positionZ;
+
+    Member<AudioParam> m_orientationX;
+    Member<AudioParam> m_orientationY;
+    Member<AudioParam> m_orientationZ;
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/modules/webaudio/PannerNode.idl b/third_party/WebKit/Source/modules/webaudio/PannerNode.idl
index 8bb30e9..a3ddf5ca 100644
--- a/third_party/WebKit/Source/modules/webaudio/PannerNode.idl
+++ b/third_party/WebKit/Source/modules/webaudio/PannerNode.idl
@@ -40,10 +40,19 @@
     attribute PanningModelType panningModel;
 
     // Uses a 3D cartesian coordinate system
-    void setPosition(float x, float y, float z);
-    void setOrientation(float x, float y, float z);
+    [MeasureAs=PannerNodeSetPosition] void setPosition(float x, float y, float z);
+    [MeasureAs=PannerNodeSetOrientation] void setOrientation(float x, float y, float z);
     [DeprecateAs=PannerNodeSetVelocity] void setVelocity(float x, float y, float z);
 
+    // Uses a 3D cartesian coordinate system
+    readonly attribute AudioParam positionX;
+    readonly attribute AudioParam positionY;
+    readonly attribute AudioParam positionZ;
+
+    readonly attribute AudioParam orientationX;
+    readonly attribute AudioParam orientationY;
+    readonly attribute AudioParam orientationZ;
+
     // Distance model
     attribute DistanceModelType distanceModel;
 
diff --git a/third_party/WebKit/Source/modules/webaudio/StereoPannerNode.cpp b/third_party/WebKit/Source/modules/webaudio/StereoPannerNode.cpp
index de4c8ce..b410eb46 100644
--- a/third_party/WebKit/Source/modules/webaudio/StereoPannerNode.cpp
+++ b/third_party/WebKit/Source/modules/webaudio/StereoPannerNode.cpp
@@ -136,7 +136,7 @@
 
 StereoPannerNode::StereoPannerNode(AbstractAudioContext& context, float sampleRate)
     : AudioNode(context)
-    , m_pan(AudioParam::create(context, ParamTypeStereoPannerPan, 0))
+    , m_pan(AudioParam::create(context, ParamTypeStereoPannerPan, 0, -1, 1))
 {
     setHandler(StereoPannerHandler::create(*this, sampleRate, m_pan->handler()));
 }
diff --git a/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContext.cpp b/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContext.cpp
index a0cfba1..0f85d11 100644
--- a/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContext.cpp
+++ b/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContext.cpp
@@ -4,7 +4,8 @@
 
 #include "modules/webgl/WebGL2RenderingContext.h"
 
-#include "bindings/modules/v8/UnionTypesModules.h"
+#include "bindings/modules/v8/OffscreenCanvasRenderingContext2DOrWebGLRenderingContextOrWebGL2RenderingContext.h"
+#include "bindings/modules/v8/RenderingContext.h"
 #include "core/frame/LocalFrame.h"
 #include "core/frame/Settings.h"
 #include "core/loader/FrameLoader.h"
diff --git a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContext.cpp b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContext.cpp
index fe348e8..1b88f02 100644
--- a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContext.cpp
+++ b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContext.cpp
@@ -25,7 +25,8 @@
 
 #include "modules/webgl/WebGLRenderingContext.h"
 
-#include "bindings/modules/v8/UnionTypesModules.h"
+#include "bindings/modules/v8/OffscreenCanvasRenderingContext2DOrWebGLRenderingContextOrWebGL2RenderingContext.h"
+#include "bindings/modules/v8/RenderingContext.h"
 #include "core/frame/LocalFrame.h"
 #include "core/frame/Settings.h"
 #include "core/layout/LayoutBox.h"
diff --git a/third_party/WebKit/Source/modules/websockets/DOMWebSocket.cpp b/third_party/WebKit/Source/modules/websockets/DOMWebSocket.cpp
index 7212149c..5a23b1d 100644
--- a/third_party/WebKit/Source/modules/websockets/DOMWebSocket.cpp
+++ b/third_party/WebKit/Source/modules/websockets/DOMWebSocket.cpp
@@ -32,7 +32,7 @@
 
 #include "bindings/core/v8/ExceptionState.h"
 #include "bindings/core/v8/ScriptController.h"
-#include "bindings/modules/v8/UnionTypesModules.h"
+#include "bindings/modules/v8/StringOrStringSequence.h"
 #include "core/dom/DOMArrayBuffer.h"
 #include "core/dom/DOMArrayBufferView.h"
 #include "core/dom/Document.h"
diff --git a/third_party/WebKit/Source/modules/webusb/USBDevice.h b/third_party/WebKit/Source/modules/webusb/USBDevice.h
index 7f91bb81..e9e4b3b 100644
--- a/third_party/WebKit/Source/modules/webusb/USBDevice.h
+++ b/third_party/WebKit/Source/modules/webusb/USBDevice.h
@@ -5,9 +5,9 @@
 #ifndef USBDevice_h
 #define USBDevice_h
 
+#include "bindings/core/v8/ArrayBufferOrArrayBufferView.h"
 #include "bindings/core/v8/ScriptPromise.h"
 #include "bindings/core/v8/ScriptWrappable.h"
-#include "bindings/modules/v8/UnionTypesModules.h"
 #include "core/dom/ContextLifecycleObserver.h"
 #include "device/usb/public/interfaces/device.mojom-blink.h"
 #include "platform/heap/Handle.h"
diff --git a/third_party/WebKit/Source/platform/PlatformKeyboardEvent.cpp b/third_party/WebKit/Source/platform/PlatformKeyboardEvent.cpp
index 0d7cf82..f5b0d908 100644
--- a/third_party/WebKit/Source/platform/PlatformKeyboardEvent.cpp
+++ b/third_party/WebKit/Source/platform/PlatformKeyboardEvent.cpp
@@ -113,8 +113,8 @@
     if (currentModifiers & ::cmdKey)
         modifiers |= MetaKey;
 #else
-    // See https://crbug.com/538289
-    NOTIMPLEMENTED();
+    // TODO(crbug.com/538289): Implement on other platforms.
+    return static_cast<Modifiers>(0);
 #endif
     return static_cast<Modifiers>(modifiers);
 }
diff --git a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in
index db5c7fcf..1c14189 100644
--- a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in
+++ b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in
@@ -17,10 +17,12 @@
 // "stable" features listed here should be rare, as anything which we've shipped stable
 // can have its runtime flag removed soon after.
 //
-// origin_trial_feature_name=FEATURE_NAME is used to integrate the feature with the experimental framework, so that the
-// feature can be enabled at runtime on a per-page basis through a signed token for the corresponding feature name.
-// Declaring the origin_trial_feature_name will cause a static method to be generated in OriginTrials.h/cpp. This static
-// method allows the feature implementation to check if it is enabled for the current context.
+// origin_trial_feature_name=FEATURE_NAME is used to integrate the feature with
+// the Origin Trials framework. The framework allows the feature to be enabled
+// at runtime on a per-page basis through a signed token for the corresponding
+// feature name. Declaring the origin_trial_feature_name will cause a static
+// method to be generated in OriginTrials.h/cpp. This static method allows the
+// feature implementation to check if it is enabled for the current context.
 //
 // settable_from_internals specifies whether a feature can be set from internals.runtimeFlags, with the default
 // being false.
@@ -82,12 +84,6 @@
 ComputedAccessibilityInfo status=experimental
 ExperimentalCanvasFeatures status=test
 ExperimentalContentSecurityPolicyFeatures status=experimental
-ExperimentalFramework status=stable
-// Define a sample API for testing integration with the Experimental Framework.
-// The sample API is used in both unit and layout tests for the Experimental
-// Framework. Do not change this flag to stable, as it exists solely to generate
-// code used by the sample API implementation.
-ExperimentalFrameworkSampleAPI origin_trial_feature_name=Frobulate
 ExperimentalV8Extras status=experimental
 FastMobileScrolling
 FileAPIBlobClose status=experimental
@@ -143,6 +139,12 @@
 Notifications status=stable
 OnDeviceChange status=experimental
 OrientationEvent
+OriginTrials status=stable
+// Define a sample API for testing integration with the Origin Trials Framework.
+// The sample API is used in both unit and layout tests for the Origin Trials
+// Framework. Do not change this flag to stable, as it exists solely to generate
+// code used by the sample API implementation.
+OriginTrialsSampleAPI origin_trial_feature_name=Frobulate
 // For simulating Android's overlay fullscreen video in layout tests on Linux.
 ForceOverlayFullscreenVideo
 OverlayScrollbars
diff --git a/third_party/WebKit/Source/platform/audio/EqualPowerPanner.cpp b/third_party/WebKit/Source/platform/audio/EqualPowerPanner.cpp
index 968fee7..2a17a0ff 100644
--- a/third_party/WebKit/Source/platform/audio/EqualPowerPanner.cpp
+++ b/third_party/WebKit/Source/platform/audio/EqualPowerPanner.cpp
@@ -29,18 +29,11 @@
 #include <algorithm>
 #include <cmath>
 
-// Use a 50ms smoothing / de-zippering time-constant.
-const float SmoothingTimeConstant = 0.050f;
-
 namespace blink {
 
 EqualPowerPanner::EqualPowerPanner(float sampleRate)
     : Panner(PanningModelEqualPower)
-    , m_isFirstRender(true)
-    , m_gainL(0.0)
-    , m_gainR(0.0)
 {
-    m_smoothingConstant = AudioUtilities::discreteTimeConstantForSampleRate(SmoothingTimeConstant, sampleRate);
 }
 
 void EqualPowerPanner::pan(double azimuth, double /*elevation*/, const AudioBus* inputBus, AudioBus* outputBus, size_t framesToProcess)
@@ -97,54 +90,122 @@
     desiredGainL = std::cos(piOverTwoDouble * desiredPanPosition);
     desiredGainR = std::sin(piOverTwoDouble * desiredPanPosition);
 
-    // Don't de-zipper on first render call.
-    if (m_isFirstRender) {
-        m_isFirstRender = false;
-        m_gainL = desiredGainL;
-        m_gainR = desiredGainR;
-    }
-
-    // Cache in local variables.
-    double gainL = m_gainL;
-    double gainR = m_gainR;
-
-    // Get local copy of smoothing constant.
-    const double SmoothingConstant = m_smoothingConstant;
-
     int n = framesToProcess;
 
     if (numberOfInputChannels == 1) { // For mono source case.
         while (n--) {
             float inputL = *sourceL++;
-            gainL += (desiredGainL - gainL) * SmoothingConstant;
-            gainR += (desiredGainR - gainR) * SmoothingConstant;
-            *destinationL++ = static_cast<float>(inputL * gainL);
-            *destinationR++ = static_cast<float>(inputL * gainR);
+
+            *destinationL++ = static_cast<float>(inputL * desiredGainL);
+            *destinationR++ = static_cast<float>(inputL * desiredGainR);
         }
     } else { // For stereo source case.
         if (azimuth <= 0) { // from -90 -> 0
             while (n--) {
                 float inputL = *sourceL++;
                 float inputR = *sourceR++;
-                gainL += (desiredGainL - gainL) * SmoothingConstant;
-                gainR += (desiredGainR - gainR) * SmoothingConstant;
-                *destinationL++ = static_cast<float>(inputL + inputR * gainL);
-                *destinationR++ = static_cast<float>(inputR * gainR);
+
+                *destinationL++ = static_cast<float>(inputL + inputR * desiredGainL);
+                *destinationR++ = static_cast<float>(inputR * desiredGainR);
             }
         } else { // from 0 -> +90
             while (n--) {
                 float inputL = *sourceL++;
                 float inputR = *sourceR++;
-                gainL += (desiredGainL - gainL) * SmoothingConstant;
-                gainR += (desiredGainR - gainR) * SmoothingConstant;
-                *destinationL++ = static_cast<float>(inputL * gainL);
-                *destinationR++ = static_cast<float>(inputR + inputL * gainR);
+
+                *destinationL++ = static_cast<float>(inputL * desiredGainL);
+                *destinationR++ = static_cast<float>(inputR + inputL * desiredGainR);
             }
         }
     }
+}
 
-    m_gainL = gainL;
-    m_gainR = gainR;
+void EqualPowerPanner::calculateDesiredGain(double& desiredGainL, double& desiredGainR, double azimuth, int numberOfInputChannels)
+{
+    // Clamp azimuth to allowed range of -180 -> +180.
+    azimuth = clampTo(azimuth, -180.0, 180.0);
+
+    // Alias the azimuth ranges behind us to in front of us:
+    // -90 -> -180 to -90 -> 0 and 90 -> 180 to 90 -> 0
+    if (azimuth < -90)
+        azimuth = -180 - azimuth;
+    else if (azimuth > 90)
+        azimuth = 180 - azimuth;
+
+    double desiredPanPosition;
+
+    if (numberOfInputChannels == 1) { // For mono source case.
+        // Pan smoothly from left to right with azimuth going from -90 -> +90 degrees.
+        desiredPanPosition = (azimuth + 90) / 180;
+    } else { // For stereo source case.
+        if (azimuth <= 0) { // from -90 -> 0
+            // sourceL -> destL and "equal-power pan" sourceR as in mono case
+            // by transforming the "azimuth" value from -90 -> 0 degrees into the range -90 -> +90.
+            desiredPanPosition = (azimuth + 90) / 90;
+        } else { // from 0 -> +90
+            // sourceR -> destR and "equal-power pan" sourceL as in mono case
+            // by transforming the "azimuth" value from 0 -> +90 degrees into the range -90 -> +90.
+            desiredPanPosition = azimuth / 90;
+        }
+    }
+
+    desiredGainL = std::cos(piOverTwoDouble * desiredPanPosition);
+    desiredGainR = std::sin(piOverTwoDouble * desiredPanPosition);
+}
+
+void EqualPowerPanner::panWithSampleAccurateValues(double* azimuth, double* /*elevation*/, const AudioBus* inputBus, AudioBus* outputBus, size_t framesToProcess)
+{
+    bool isInputSafe = inputBus && (inputBus->numberOfChannels() == 1 || inputBus->numberOfChannels() == 2) && framesToProcess <= inputBus->length();
+    DCHECK(isInputSafe);
+    if (!isInputSafe)
+        return;
+
+    unsigned numberOfInputChannels = inputBus->numberOfChannels();
+
+    bool isOutputSafe = outputBus && outputBus->numberOfChannels() == 2 && framesToProcess <= outputBus->length();
+    DCHECK(isOutputSafe);
+    if (!isOutputSafe)
+        return;
+
+    const float* sourceL = inputBus->channel(0)->data();
+    const float* sourceR = numberOfInputChannels > 1 ? inputBus->channel(1)->data() : sourceL;
+    float* destinationL = outputBus->channelByType(AudioBus::ChannelLeft)->mutableData();
+    float* destinationR = outputBus->channelByType(AudioBus::ChannelRight)->mutableData();
+
+    if (!sourceL || !sourceR || !destinationL || !destinationR)
+        return;
+
+    int n = framesToProcess;
+
+    if (numberOfInputChannels == 1) { // For mono source case.
+        for (int k = 0; k < n; ++k) {
+            double desiredGainL;
+            double desiredGainR;
+            float inputL = *sourceL++;
+
+            calculateDesiredGain(desiredGainL, desiredGainR, azimuth[k], numberOfInputChannels);
+            *destinationL++ = static_cast<float>(inputL * desiredGainL);
+            *destinationR++ = static_cast<float>(inputL * desiredGainR);
+        }
+    } else { // For stereo source case.
+        for (int k = 0; k < n; ++k) {
+            double desiredGainL;
+            double desiredGainR;
+
+            calculateDesiredGain(desiredGainL, desiredGainR, azimuth[k], numberOfInputChannels);
+            if (azimuth[k] <= 0) { // from -90 -> 0
+                float inputL = *sourceL++;
+                float inputR = *sourceR++;
+                *destinationL++ = static_cast<float>(inputL + inputR * desiredGainL);
+                *destinationR++ = static_cast<float>(inputR * desiredGainR);
+            } else { // from 0 -> +90
+                float inputL = *sourceL++;
+                float inputR = *sourceR++;
+                *destinationL++ = static_cast<float>(inputL * desiredGainL);
+                *destinationR++ = static_cast<float>(inputR + inputL * desiredGainR);
+            }
+        }
+    }
 }
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/platform/audio/EqualPowerPanner.h b/third_party/WebKit/Source/platform/audio/EqualPowerPanner.h
index 418dd8c..d426316 100644
--- a/third_party/WebKit/Source/platform/audio/EqualPowerPanner.h
+++ b/third_party/WebKit/Source/platform/audio/EqualPowerPanner.h
@@ -36,19 +36,15 @@
     EqualPowerPanner(float sampleRate);
 
     void pan(double azimuth, double elevation, const AudioBus* inputBus, AudioBus* outputBuf, size_t framesToProcess) override;
+    void panWithSampleAccurateValues(double* azimuth, double* elevation, const AudioBus* inputBus, AudioBus* outputBus, size_t framesToProcess) override;
 
-    void reset() override { m_isFirstRender = true; }
+    void reset() override { }
 
     double tailTime() const override { return 0; }
     double latencyTime() const override { return 0; }
 
 private:
-    // For smoothing / de-zippering
-    bool m_isFirstRender;
-    double m_smoothingConstant;
-
-    double m_gainL;
-    double m_gainR;
+    void calculateDesiredGain(double& desiredGainL, double& desiredGainR, double azimuth, int numberOfChannels);
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/platform/audio/HRTFPanner.cpp b/third_party/WebKit/Source/platform/audio/HRTFPanner.cpp
index e352f459..bed5654 100644
--- a/third_party/WebKit/Source/platform/audio/HRTFPanner.cpp
+++ b/third_party/WebKit/Source/platform/audio/HRTFPanner.cpp
@@ -292,6 +292,19 @@
     }
 }
 
+void HRTFPanner::panWithSampleAccurateValues(double* desiredAzimuth, double* elevation, const AudioBus* inputBus, AudioBus* outputBus, size_t framesToProcess)
+{
+    // Sample-accurate (a-rate) HRTF panner is not implemented, just k-rate.  Just grab the current
+    // azimuth/elevation and use that.
+    //
+    // We are assuming that the inherent smoothing in the HRTF processing is good enough, and we
+    // don't want to increase the complexity of the HRTF panner by 15-20 times.  (We need to cmopute
+    // one output sample for each possibly different impulse response.  That N^2.  Previously, we
+    // used an FFT to do them all at once for a complexity of N/log2(N).  Hence, N/log2(N) times
+    // more complex.)
+    pan(desiredAzimuth[0], elevation[0], inputBus, outputBus, framesToProcess);
+}
+
 double HRTFPanner::tailTime() const
 {
     // Because HRTFPanner is implemented with a DelayKernel and a FFTConvolver, the tailTime of the HRTFPanner
diff --git a/third_party/WebKit/Source/platform/audio/HRTFPanner.h b/third_party/WebKit/Source/platform/audio/HRTFPanner.h
index 84f7585..4450f38 100644
--- a/third_party/WebKit/Source/platform/audio/HRTFPanner.h
+++ b/third_party/WebKit/Source/platform/audio/HRTFPanner.h
@@ -39,6 +39,8 @@
 
     // Panner
     void pan(double azimuth, double elevation, const AudioBus* inputBus, AudioBus* outputBus, size_t framesToProcess) override;
+    void panWithSampleAccurateValues(double* azimuth, double* elevation, const AudioBus* inputBus, AudioBus* outputBus, size_t framesToProcess) override;
+
     void reset() override;
 
     size_t fftSize() const { return fftSizeForSampleRate(m_sampleRate); }
diff --git a/third_party/WebKit/Source/platform/audio/Panner.h b/third_party/WebKit/Source/platform/audio/Panner.h
index 192ee6a..6f8f4a6 100644
--- a/third_party/WebKit/Source/platform/audio/Panner.h
+++ b/third_party/WebKit/Source/platform/audio/Panner.h
@@ -58,6 +58,7 @@
     virtual ~Panner() { };
 
     virtual void pan(double azimuth, double elevation, const AudioBus* inputBus, AudioBus* outputBus, size_t framesToProcess) = 0;
+    virtual void panWithSampleAccurateValues(double* azimuth, double* elevation, const AudioBus* inputBus, AudioBus* outputBus, size_t framesToProcess) = 0;
 
     virtual void reset() = 0;
 
diff --git a/third_party/WebKit/Source/platform/exported/WebScrollbarThemeClientImpl.h b/third_party/WebKit/Source/platform/exported/WebScrollbarThemeClientImpl.h
index 295f016..f2e7a239 100644
--- a/third_party/WebKit/Source/platform/exported/WebScrollbarThemeClientImpl.h
+++ b/third_party/WebKit/Source/platform/exported/WebScrollbarThemeClientImpl.h
@@ -87,7 +87,6 @@
 
 private:
     WebScrollbar& m_scrollbar;
-    DISPLAY_ITEM_CACHE_STATUS_IMPLEMENTATION
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/platform/fonts/Font.cpp b/third_party/WebKit/Source/platform/fonts/Font.cpp
index 9305b22b..6eaf139 100644
--- a/third_party/WebKit/Source/platform/fonts/Font.cpp
+++ b/third_party/WebKit/Source/platform/fonts/Font.cpp
@@ -751,6 +751,13 @@
     return FloatRect(point.x() + range.start, point.y(), range.width(), height);
 }
 
+CharacterRange Font::getCharacterRange(const TextRun& run, unsigned from, unsigned to) const
+{
+    FontCachePurgePreventer purgePreventer;
+    CachingWordShaper shaper(m_fontFallbackList->shapeCache(m_fontDescription));
+    return shaper.getCharacterRange(this, run, from, to);
+}
+
 Vector<CharacterRange> Font::individualCharacterRanges(const TextRun& run) const
 {
     // TODO(pdr): Android is temporarily (crbug.com/577306) using the old simple
diff --git a/third_party/WebKit/Source/platform/fonts/Font.h b/third_party/WebKit/Source/platform/fonts/Font.h
index a2135bc..cf5c654 100644
--- a/third_party/WebKit/Source/platform/fonts/Font.h
+++ b/third_party/WebKit/Source/platform/fonts/Font.h
@@ -87,6 +87,7 @@
 
     int offsetForPosition(const TextRun&, float position, bool includePartialGlyphs) const;
     FloatRect selectionRectForText(const TextRun&, const FloatPoint&, int h, int from = 0, int to = -1, bool accountForGlyphBounds = false) const;
+    CharacterRange getCharacterRange(const TextRun&, unsigned from, unsigned to) const;
     Vector<CharacterRange> individualCharacterRanges(const TextRun&) const;
 
     // Metrics that we query the FontFallbackList for.
diff --git a/third_party/WebKit/Source/platform/graphics/GraphicsLayer.h b/third_party/WebKit/Source/platform/graphics/GraphicsLayer.h
index c89a757..27e66fc 100644
--- a/third_party/WebKit/Source/platform/graphics/GraphicsLayer.h
+++ b/third_party/WebKit/Source/platform/graphics/GraphicsLayer.h
@@ -359,8 +359,6 @@
     OwnPtr<PaintController> m_paintController;
 
     IntRect m_previousInterestRect;
-
-    DISPLAY_ITEM_CACHE_STATUS_IMPLEMENTATION
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/platform/graphics/paint/DisplayItemClient.cpp b/third_party/WebKit/Source/platform/graphics/paint/DisplayItemClient.cpp
index 1bb0c82..eeb5b2f 100644
--- a/third_party/WebKit/Source/platform/graphics/paint/DisplayItemClient.cpp
+++ b/third_party/WebKit/Source/platform/graphics/paint/DisplayItemClient.cpp
@@ -5,15 +5,11 @@
 #include "platform/graphics/paint/DisplayItemClient.h"
 
 #if ENABLE(ASSERT)
+
 #include "wtf/HashSet.h"
-#endif
 
 namespace blink {
 
-DisplayItemCacheGeneration::Generation DisplayItemCacheGeneration::s_nextGeneration = 1;
-
-#if ENABLE(ASSERT)
-
 HashSet<const DisplayItemClient*>* liveDisplayItemClients = nullptr;
 
 DisplayItemClient::DisplayItemClient()
@@ -33,6 +29,6 @@
     return liveDisplayItemClients && liveDisplayItemClients->contains(&client);
 }
 
-#endif // ENABLE(ASSERT)
-
 } // namespace blink
+
+#endif // ENABLE(ASSERT)
diff --git a/third_party/WebKit/Source/platform/graphics/paint/DisplayItemClient.h b/third_party/WebKit/Source/platform/graphics/paint/DisplayItemClient.h
index 9aeabff1..784aa638 100644
--- a/third_party/WebKit/Source/platform/graphics/paint/DisplayItemClient.h
+++ b/third_party/WebKit/Source/platform/graphics/paint/DisplayItemClient.h
@@ -11,40 +11,6 @@
 
 namespace blink {
 
-// Holds a unique cache generation id of display items and paint controllers.
-//
-// A paint controller sets its cache generation to DisplayItemCacheGeneration::next()
-// at the end of each commitNewDisplayItems, and updates the cache generation of each
-// client with cached drawings by calling DisplayItemClient::setDisplayItemsCached().
-// A display item is treated as validly cached in a paint controller if its cache generation
-// matches the paint controller's cache generation.
-//
-// SPv1 only: If a display item is painted on multiple paint controllers, because cache
-// generations are unique, the client's cache generation matches the last paint controller
-// only. The client will be treated as invalid on other paint controllers regardless if
-// it's validly cached by these paint controllers. The situation is very rare (about 0.07%
-// clients were painted on multiple paint controllers) so the performance penalty is trivial.
-class PLATFORM_EXPORT DisplayItemCacheGeneration {
-    DISALLOW_NEW();
-public:
-    DisplayItemCacheGeneration() : m_value(kInvalidGeneration) { }
-
-    void invalidate() { m_value = kInvalidGeneration; }
-    static DisplayItemCacheGeneration next() { return DisplayItemCacheGeneration(s_nextGeneration++); }
-    bool matches(const DisplayItemCacheGeneration& other)
-    {
-        return m_value != kInvalidGeneration && other.m_value != kInvalidGeneration && m_value == other.m_value;
-    }
-
-private:
-    typedef uint32_t Generation;
-    DisplayItemCacheGeneration(Generation value) : m_value(value) { }
-
-    static const Generation kInvalidGeneration = 0;
-    static Generation s_nextGeneration;
-    Generation m_value;
-};
-
 // The interface for objects that can be associated with display items.
 // A DisplayItemClient object should live at least longer than the document cycle
 // in which its display items are created during painting.
@@ -65,29 +31,12 @@
     // offset by offsetFromLayoutObjectWithSubpixelAccumulation().
     virtual LayoutRect visualRect() const = 0;
 
-    virtual bool displayItemsAreCached(DisplayItemCacheGeneration) const = 0;
-    virtual void setDisplayItemsCached(DisplayItemCacheGeneration) const = 0;
-    virtual void setDisplayItemsUncached() const = 0;
-
 #if ENABLE(ASSERT)
     // Tests if a DisplayItemClient object has been created and has not been deleted yet.
     static bool isAlive(const DisplayItemClient&);
 #endif
-
-protected:
 };
 
-#define DISPLAY_ITEM_CACHE_STATUS_IMPLEMENTATION \
-    bool displayItemsAreCached(DisplayItemCacheGeneration cacheGeneration) const final { return m_cacheGeneration.matches(cacheGeneration); } \
-    void setDisplayItemsCached(DisplayItemCacheGeneration cacheGeneration) const final { m_cacheGeneration = cacheGeneration; } \
-    void setDisplayItemsUncached() const final { m_cacheGeneration.invalidate(); } \
-    mutable DisplayItemCacheGeneration m_cacheGeneration;
-
-#define DISPLAY_ITEM_CACHE_STATUS_UNCACHEABLE_IMPLEMENTATION \
-    bool displayItemsAreCached(DisplayItemCacheGeneration) const final { return false; } \
-    void setDisplayItemsCached(DisplayItemCacheGeneration) const final { } \
-    void setDisplayItemsUncached() const final { }
-
 inline bool operator==(const DisplayItemClient& client1, const DisplayItemClient& client2) { return &client1 == &client2; }
 inline bool operator!=(const DisplayItemClient& client1, const DisplayItemClient& client2) { return &client1 != &client2; }
 
diff --git a/third_party/WebKit/Source/platform/graphics/paint/PaintController.cpp b/third_party/WebKit/Source/platform/graphics/paint/PaintController.cpp
index af1afd9..ea460b37 100644
--- a/third_party/WebKit/Source/platform/graphics/paint/PaintController.cpp
+++ b/third_party/WebKit/Source/platform/graphics/paint/PaintController.cpp
@@ -138,8 +138,9 @@
 void PaintController::invalidateUntracked(const DisplayItemClient& client)
 {
     // This can be called during painting, but we can't invalidate already painted clients.
-    client.setDisplayItemsUncached();
     ASSERT(!m_newDisplayItemIndicesByClient.contains(&client));
+    updateValidlyCachedClientsIfNeeded();
+    m_validlyCachedClients.remove(&client);
 }
 
 void PaintController::invalidateAll()
@@ -147,7 +148,8 @@
     // Can only be called during layout/paintInvalidation, not during painting.
     ASSERT(m_newDisplayItemList.isEmpty());
     m_currentPaintArtifact.reset();
-    m_currentCacheGeneration.invalidate();
+    m_validlyCachedClients.clear();
+    m_validlyCachedClientsDirty = false;
 
     if (RuntimeEnabledFeatures::slimmingPaintV2Enabled() && m_trackedPaintInvalidationObjects)
         m_trackedPaintInvalidationObjects->append("##ALL##");
@@ -155,10 +157,10 @@
 
 bool PaintController::clientCacheIsValid(const DisplayItemClient& client) const
 {
-    ASSERT(DisplayItemClient::isAlive(client));
     if (skippingCache())
         return false;
-    return client.displayItemsAreCached(m_currentCacheGeneration);
+    updateValidlyCachedClientsIfNeeded();
+    return m_validlyCachedClients.contains(&client);
 }
 
 void PaintController::invalidatePaintOffset(const DisplayItemClient& client)
@@ -234,10 +236,12 @@
     for (; context.nextItemToIndex != currentEnd; ++context.nextItemToIndex) {
         const DisplayItem& item = *context.nextItemToIndex;
         ASSERT(item.hasValidClient());
-        if (id.matches(item))
-            return context.nextItemToIndex++;
-        if (item.isCacheable())
+        if (item.isCacheable() && clientCacheIsValid(item.client())) {
+            if (id.matches(item))
+                return context.nextItemToIndex++;
+
             addItemToIndexIfNeeded(item, context.nextItemToIndex - m_currentPaintArtifact.getDisplayItemList().begin(), context.displayItemIndicesByClient);
+        }
     }
     return currentEnd;
 }
@@ -292,6 +296,9 @@
         "num_non_cached_new_items", (int)m_newDisplayItemList.size() - m_numCachedNewItems);
     m_numCachedNewItems = 0;
 
+    if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
+        m_clientsCheckedPaintInvalidation.clear();
+
     // These data structures are used during painting only.
     ASSERT(m_scopeStack.isEmpty());
     m_scopeStack.clear();
@@ -313,10 +320,12 @@
 
         m_currentPaintArtifact = PaintArtifact(std::move(m_newDisplayItemList), m_newPaintChunks.releasePaintChunks());
         m_newDisplayItemList = DisplayItemList(kInitialDisplayItemListCapacityBytes);
-        updateCacheGeneration();
+        m_validlyCachedClientsDirty = true;
         return;
     }
 
+    updateValidlyCachedClientsIfNeeded();
+
     // Stores indices to valid DrawingDisplayItems in m_currentDisplayItems that have not been matched
     // by CachedDisplayItems during synchronized matching. The indexed items will be matched
     // by later out-of-order CachedDisplayItems in m_newDisplayItemList. This ensures that when
@@ -394,7 +403,7 @@
     m_currentPaintArtifact = PaintArtifact(std::move(updatedList), m_newPaintChunks.releasePaintChunks());
 
     m_newDisplayItemList = DisplayItemList(kInitialDisplayItemListCapacityBytes);
-    updateCacheGeneration();
+    m_validlyCachedClientsDirty = true;
 }
 
 size_t PaintController::approximateUnsharedMemoryUsage() const
@@ -422,12 +431,22 @@
     return memoryUsage;
 }
 
-void PaintController::updateCacheGeneration()
+void PaintController::updateValidlyCachedClientsIfNeeded() const
 {
-    m_currentCacheGeneration = DisplayItemCacheGeneration::next();
+    if (!m_validlyCachedClientsDirty)
+        return;
+
+    m_validlyCachedClients.clear();
+    m_validlyCachedClientsDirty = false;
+
+    const DisplayItemClient* lastAddedClient = nullptr;
     for (const DisplayItem& displayItem : m_currentPaintArtifact.getDisplayItemList()) {
-        if (displayItem.isCacheable())
-            displayItem.client().setDisplayItemsCached(m_currentCacheGeneration);
+        if (&displayItem.client() == lastAddedClient)
+            continue;
+        if (displayItem.isCacheable()) {
+            lastAddedClient = &displayItem.client();
+            m_validlyCachedClients.add(lastAddedClient);
+        }
     }
 }
 
@@ -494,7 +513,7 @@
         ASSERT_NOT_REACHED();
     }
 
-    if (newItem.isCacheable() && !clientCacheIsValid(newItem.client())) {
+    if (newItem.isCacheable() && !m_validlyCachedClients.contains(&newItem.client())) {
         showUnderInvalidationError(messagePrefix, "ERROR: under-invalidation: invalidated in cached subsequence", &newItem, &oldItem);
         ASSERT_NOT_REACHED();
     }
diff --git a/third_party/WebKit/Source/platform/graphics/paint/PaintController.h b/third_party/WebKit/Source/platform/graphics/paint/PaintController.h
index eda39ff..b9edbba 100644
--- a/third_party/WebKit/Source/platform/graphics/paint/PaintController.h
+++ b/third_party/WebKit/Source/platform/graphics/paint/PaintController.h
@@ -163,6 +163,15 @@
         return m_trackedPaintInvalidationObjects ? *m_trackedPaintInvalidationObjects : Vector<String>();
     }
 
+    bool clientHasCheckedPaintInvalidation(const DisplayItemClient& client) const
+    {
+        return m_clientsCheckedPaintInvalidation.contains(&client);
+    }
+    void setClientHasCheckedPaintInvalidation(const DisplayItemClient& client)
+    {
+        m_clientsCheckedPaintInvalidation.add(&client);
+    }
+
 #if ENABLE(ASSERT)
     void assertDisplayItemClientsAreLive();
 #endif
@@ -170,19 +179,21 @@
 protected:
     PaintController()
         : m_newDisplayItemList(kInitialDisplayItemListCapacityBytes)
+        , m_validlyCachedClientsDirty(false)
         , m_constructionDisabled(false)
         , m_subsequenceCachingDisabled(false)
         , m_textPainted(false)
         , m_imagePainted(false)
         , m_skippingCacheCount(0)
         , m_numCachedNewItems(0)
-        , m_nextScope(1)
-    { }
+        , m_nextScope(1) { }
 
 private:
     // Set new item state (scopes, cache skipping, etc) for a new item.
     void processNewItem(DisplayItem&);
 
+    void updateValidlyCachedClientsIfNeeded() const;
+
 #ifndef NDEBUG
     WTF::String displayItemListAsDebugString(const DisplayItemList&) const;
 #endif
@@ -209,8 +220,6 @@
 
     void commitNewDisplayItemsInternal(const LayoutSize& offsetFromLayoutObject);
 
-    void updateCacheGeneration();
-
     // The last complete paint artifact.
     // In SPv2, this includes paint chunks as well as display items.
     PaintArtifact m_currentPaintArtifact;
@@ -219,6 +228,18 @@
     DisplayItemList m_newDisplayItemList;
     PaintChunker m_newPaintChunks;
 
+    // Contains all clients having valid cached paintings if updated.
+    // It's lazily updated in updateValidlyCachedClientsIfNeeded().
+    // TODO(wangxianzhu): In the future we can replace this with client-side repaint flags
+    // to avoid the cost of building and querying the hash table.
+    mutable HashSet<const DisplayItemClient*> m_validlyCachedClients;
+    mutable bool m_validlyCachedClientsDirty;
+
+    // Used during painting. Contains clients that have checked paint invalidation and
+    // are known to be valid.
+    // TODO(wangxianzhu): Use client side flag to avoid const of hash table.
+    HashSet<const DisplayItemClient*> m_clientsCheckedPaintInvalidation;
+
 #if ENABLE(ASSERT)
     // Set of clients which had paint offset changes since the last commit. This is used for
     // ensuring paint offsets are only updated once and are the same in all phases.
@@ -254,8 +275,6 @@
 #endif
 
     OwnPtr<Vector<String>> m_trackedPaintInvalidationObjects;
-
-    DisplayItemCacheGeneration m_currentCacheGeneration;
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/platform/graphics/paint/PaintControllerTest.cpp b/third_party/WebKit/Source/platform/graphics/paint/PaintControllerTest.cpp
index 2e34c4fc3..64ea8257 100644
--- a/third_party/WebKit/Source/platform/graphics/paint/PaintControllerTest.cpp
+++ b/third_party/WebKit/Source/platform/graphics/paint/PaintControllerTest.cpp
@@ -21,9 +21,7 @@
 public:
     PaintControllerTest()
         : m_paintController(PaintController::create())
-        , m_originalSlimmingPaintV2Enabled(RuntimeEnabledFeatures::slimmingPaintV2Enabled())
-    {
-    }
+        , m_originalSlimmingPaintV2Enabled(RuntimeEnabledFeatures::slimmingPaintV2Enabled()) { }
 
     IntRect visualRect(const PaintArtifact& paintArtifact, unsigned index)
     {
diff --git a/third_party/WebKit/Source/platform/graphics/paint/README.md b/third_party/WebKit/Source/platform/graphics/paint/README.md
index 28d916d9..5e5fb62 100644
--- a/third_party/WebKit/Source/platform/graphics/paint/README.md
+++ b/third_party/WebKit/Source/platform/graphics/paint/README.md
@@ -179,52 +179,9 @@
 
 At this point, the paint artifact is ready to be drawn or composited.
 
-### Paint result caching and invalidation
-
-See [Display item caching](../../../core/paint/README.md#paint-result-caching)
-and [Paint invalidation](../../../core/paint/README.md#paint-invalidation) for
-more details about how caching and invalidation are handled in blink core
-module using `PaintController` API.
-
-We use 'cache generation' which is a unique id of cache status in each
-`DisplayItemClient` and `PaintController` to determine if the client is validly
-cached by a `PaintController`.
-
-A paint controller sets its cache generation to
-`DisplayItemCacheGeneration::next()` at the end of each
-`commitNewDisplayItems()`, and updates the cache generation of each client with
-cached drawings by calling `DisplayItemClient::setDisplayItemsCached()`.
-A display item is treated as validly cached in a paint controller if its cache
-generation matches the paint controller's cache generation.
-
-`kInvalidCacheGeneration` is a special cache generation value which matches no
-other cache generations. When a `DisplayItemClient` is invalidated, we set its
-cache generation to `kInvalidCacheGeneration`. When a `PaintController` is
-cleared (e.g. when the corresponding `GraphicsLayer` is fully invalidated), we
-also set its cache generation to `kInvalidCacheGeneration`.
-
-For now we use a uint32_t variable to store cache generation. Assuming there is
-an animation in 60fps needing main-thread repaint, the cache generation will
-overflow after 2^32/86400/60 = 828 days. The time may be shorter if there are
-multiple animating `PaintController`s in the same process. When it overflows,
-we may treat some object that is not cached as cached if the following
-conditions are all met:
-*   the object was painted when the cache generation was *n*;
-*   the object has been neither painted nor invalidated since cache generation
-    *n*;
-*   when the cache generation wraps back to exact *n*, the object happens to be
-    painted again.
-As the paint controller doesn't have cached display items for the object, there
-will be corrupted painting or assertion failure. The chance is too low to be
-concerned.
-
-SPv1 only: If a display item is painted on multiple paint controllers, because
-cache generations are unique, the client's cache generation matches the last
-paint controller only. The client will be treated as invalid on other paint
-controllers regardless if it's validly cached by these paint controllers.
-The situation is very rare (about 0.07% clients were painted on multiple paint
-controllers in a [Cluster Telemetry run](https://ct.skia.org/chromium_perf_runs)
-(run 803) so the performance penalty is trivial.
+*** aside
+TODO(jbroman): Explain invalidation.
+***
 
 ## Paint artifact compositor
 
diff --git a/third_party/WebKit/Source/platform/graphics/paint/SkPictureBuilder.h b/third_party/WebKit/Source/platform/graphics/paint/SkPictureBuilder.h
index 1bb4839..f2652e7a 100644
--- a/third_party/WebKit/Source/platform/graphics/paint/SkPictureBuilder.h
+++ b/third_party/WebKit/Source/platform/graphics/paint/SkPictureBuilder.h
@@ -43,8 +43,6 @@
     LayoutRect visualRect() const final { return LayoutRect(); }
 
 private:
-    DISPLAY_ITEM_CACHE_STATUS_UNCACHEABLE_IMPLEMENTATION
-
     OwnPtr<PaintController> m_paintController;
     OwnPtr<GraphicsContext> m_context;
     FloatRect m_bounds;
diff --git a/third_party/WebKit/Source/platform/heap/HeapAllocator.h b/third_party/WebKit/Source/platform/heap/HeapAllocator.h
index 73a9c00..8b43e8b 100644
--- a/third_party/WebKit/Source/platform/heap/HeapAllocator.h
+++ b/third_party/WebKit/Source/platform/heap/HeapAllocator.h
@@ -467,16 +467,13 @@
     using IteratorConstReferenceType = const blink::Member<T>&;
     static IteratorReferenceType getToReferenceConversion(IteratorGetType x) { return *x; }
     static IteratorConstReferenceType getToReferenceConstConversion(IteratorConstGetType x) { return *x; }
-    // FIXME: Similarly, there is no need for a distinction between PeekOutType
-    // and PassOutType without reference counting.
+
     using PeekOutType = T*;
-    using PassOutType = T*;
 
     template<typename U>
     static void store(const U& value, blink::Member<T>& storage) { storage = value; }
 
     static PeekOutType peek(const blink::Member<T>& value) { return value; }
-    static PassOutType passOut(const blink::Member<T>& value) { return value; }
 };
 
 template<typename T> struct HashTraits<blink::WeakMember<T>> : SimpleClassHashTraits<blink::WeakMember<T>> {
@@ -495,16 +492,13 @@
     using IteratorConstReferenceType = const blink::WeakMember<T>&;
     static IteratorReferenceType getToReferenceConversion(IteratorGetType x) { return *x; }
     static IteratorConstReferenceType getToReferenceConstConversion(IteratorConstGetType x) { return *x; }
-    // FIXME: Similarly, there is no need for a distinction between PeekOutType
-    // and PassOutType without reference counting.
+
     using PeekOutType = T*;
-    using PassOutType = T*;
 
     template<typename U>
     static void store(const U& value, blink::WeakMember<T>& storage) { storage = value; }
 
     static PeekOutType peek(const blink::WeakMember<T>& value) { return value; }
-    static PassOutType passOut(const blink::WeakMember<T>& value) { return value; }
 
     template<typename VisitorDispatcher>
     static bool traceInCollection(VisitorDispatcher visitor, blink::WeakMember<T>& weakMember, ShouldWeakPointersBeMarkedStrongly strongify)
@@ -532,16 +526,12 @@
     using IteratorConstReferenceType = const blink::UntracedMember<T>&;
     static IteratorReferenceType getToReferenceConversion(IteratorGetType x) { return *x; }
     static IteratorConstReferenceType getToReferenceConstConversion(IteratorConstGetType x) { return *x; }
-    // FIXME: Similarly, there is no need for a distinction between PeekOutType
-    // and PassOutType without reference counting.
     using PeekOutType = T*;
-    using PassOutType = T*;
 
     template<typename U>
     static void store(const U& value, blink::UntracedMember<T>& storage) { storage = value; }
 
     static PeekOutType peek(const blink::UntracedMember<T>& value) { return value; }
-    static PassOutType passOut(const blink::UntracedMember<T>& value) { return value; }
 };
 
 template<typename T, size_t inlineCapacity>
diff --git a/third_party/WebKit/Source/platform/mediastream/MediaStreamSource.cpp b/third_party/WebKit/Source/platform/mediastream/MediaStreamSource.cpp
index ec2e99ae..c57dcf2 100644
--- a/third_party/WebKit/Source/platform/mediastream/MediaStreamSource.cpp
+++ b/third_party/WebKit/Source/platform/mediastream/MediaStreamSource.cpp
@@ -51,6 +51,11 @@
 
 void MediaStreamSource::dispose()
 {
+    // This prevents the following m_extraData.clear() from invoking
+    // MediaStreamSource::setReadyState and dispatching events in the
+    // pre-finalizer.
+    m_readyState = ReadyStateEnded;
+
     m_extraData.clear();
 }
 
diff --git a/third_party/WebKit/Source/platform/scroll/Scrollbar.h b/third_party/WebKit/Source/platform/scroll/Scrollbar.h
index 43d20a6..197e691 100644
--- a/third_party/WebKit/Source/platform/scroll/Scrollbar.h
+++ b/third_party/WebKit/Source/platform/scroll/Scrollbar.h
@@ -231,8 +231,6 @@
 
     bool m_trackNeedsRepaint;
     bool m_thumbNeedsRepaint;
-
-    DISPLAY_ITEM_CACHE_STATUS_IMPLEMENTATION
 };
 
 DEFINE_TYPE_CASTS(Scrollbar, Widget, widget, widget->isScrollbar(), widget.isScrollbar());
diff --git a/third_party/WebKit/Source/platform/testing/FakeDisplayItemClient.h b/third_party/WebKit/Source/platform/testing/FakeDisplayItemClient.h
index e43997df..ea301b4 100644
--- a/third_party/WebKit/Source/platform/testing/FakeDisplayItemClient.h
+++ b/third_party/WebKit/Source/platform/testing/FakeDisplayItemClient.h
@@ -21,8 +21,6 @@
     LayoutRect visualRect() const override { return m_visualRect; }
 
 private:
-    DISPLAY_ITEM_CACHE_STATUS_IMPLEMENTATION
-
     String m_name;
     LayoutRect m_visualRect;
 };
diff --git a/third_party/WebKit/Source/platform/testing/TestPaintArtifact.cpp b/third_party/WebKit/Source/platform/testing/TestPaintArtifact.cpp
index fba9b17..e431145 100644
--- a/third_party/WebKit/Source/platform/testing/TestPaintArtifact.cpp
+++ b/third_party/WebKit/Source/platform/testing/TestPaintArtifact.cpp
@@ -27,7 +27,6 @@
 private:
     FloatRect m_rect;
     Color m_color;
-    DISPLAY_ITEM_CACHE_STATUS_IMPLEMENTATION
 };
 
 PassRefPtr<SkPicture> TestPaintArtifact::DummyRectClient::makePicture() const
diff --git a/third_party/WebKit/Source/platform/testing/weburl_loader_mock.cc b/third_party/WebKit/Source/platform/testing/weburl_loader_mock.cc
index 0da20c15..35ff1445 100644
--- a/third_party/WebKit/Source/platform/testing/weburl_loader_mock.cc
+++ b/third_party/WebKit/Source/platform/testing/weburl_loader_mock.cc
@@ -21,6 +21,7 @@
 }
 
 WebURLLoaderMock::~WebURLLoaderMock() {
+  cancel();
 }
 
 void WebURLLoaderMock::ServeAsynchronousRequest(
diff --git a/third_party/WebKit/Source/platform/text/Hyphenation.cpp b/third_party/WebKit/Source/platform/text/Hyphenation.cpp
index 357ffb7..563b60f1 100644
--- a/third_party/WebKit/Source/platform/text/Hyphenation.cpp
+++ b/third_party/WebKit/Source/platform/text/Hyphenation.cpp
@@ -16,6 +16,7 @@
 
 Hyphenation* Hyphenation::get(const AtomicString& locale)
 {
+    DCHECK(!locale.isNull());
     Hyphenation::HyphenationMap& hyphenationMap = getHyphenationMap();
     auto result = hyphenationMap.add(locale, nullptr);
     if (result.isNewEntry)
diff --git a/third_party/WebKit/Source/platform/text/Hyphenation.h b/third_party/WebKit/Source/platform/text/Hyphenation.h
index 95d1e4c..bd86f5a 100644
--- a/third_party/WebKit/Source/platform/text/Hyphenation.h
+++ b/third_party/WebKit/Source/platform/text/Hyphenation.h
@@ -14,15 +14,13 @@
 
 namespace blink {
 
-class StringView;
-
 class PLATFORM_EXPORT Hyphenation : public RefCounted<Hyphenation> {
 public:
     virtual ~Hyphenation() {}
 
     static Hyphenation* get(const AtomicString& locale);
 
-    virtual size_t lastHyphenLocation(const StringView&, size_t beforeIndex, const AtomicString& locale) const = 0;
+    virtual size_t lastHyphenLocation(const StringView&, size_t beforeIndex) const = 0;
 
     static void setForTesting(const AtomicString& locale, PassRefPtr<Hyphenation>);
     static void clearForTesting();
diff --git a/third_party/WebKit/Source/platform/text/HyphenationTest.cpp b/third_party/WebKit/Source/platform/text/HyphenationTest.cpp
index a209e1a8..7738317 100644
--- a/third_party/WebKit/Source/platform/text/HyphenationTest.cpp
+++ b/third_party/WebKit/Source/platform/text/HyphenationTest.cpp
@@ -11,7 +11,7 @@
 
 class NoHyphenation : public Hyphenation {
 public:
-    size_t lastHyphenLocation(const StringView&, size_t beforeIndex, const AtomicString& locale) const override
+    size_t lastHyphenLocation(const StringView&, size_t beforeIndex) const override
     {
         return 0;
     }
diff --git a/third_party/WebKit/Source/platform/text/TextEncodingDetector.cpp b/third_party/WebKit/Source/platform/text/TextEncodingDetector.cpp
index 476d992..616aac0 100644
--- a/third_party/WebKit/Source/platform/text/TextEncodingDetector.cpp
+++ b/third_party/WebKit/Source/platform/text/TextEncodingDetector.cpp
@@ -36,7 +36,7 @@
 
 namespace blink {
 
-bool detectTextEncodingUniversal(const char* data, size_t length,
+bool detectTextEncoding(const char* data, size_t length,
     const char* hintEncodingName, WTF::TextEncoding* detectedEncoding)
 {
     *detectedEncoding = WTF::TextEncoding();
diff --git a/third_party/WebKit/Source/platform/text/TextEncodingDetector.h b/third_party/WebKit/Source/platform/text/TextEncodingDetector.h
index dd6b774a..12f4890 100644
--- a/third_party/WebKit/Source/platform/text/TextEncodingDetector.h
+++ b/third_party/WebKit/Source/platform/text/TextEncodingDetector.h
@@ -44,9 +44,9 @@
 // hintEncodingName, detect the most likely character encoding.
 // The way hintEncodingName is used is up to an implementation.
 // Currently, the only caller sets it to the parent frame encoding.
-PLATFORM_EXPORT bool detectTextEncodingUniversal(const char* data,
-    size_t length, const char* hintEncodingName,
-    WTF::TextEncoding* detectedEncoding);
+PLATFORM_EXPORT bool detectTextEncoding(const char* data, size_t length,
+    const char* hintEncodingName, WTF::TextEncoding* detectedEncoding);
+
 } // namespace blink
 
 #endif
diff --git a/third_party/WebKit/Source/web/AssociatedURLLoaderTest.cpp b/third_party/WebKit/Source/web/AssociatedURLLoaderTest.cpp
index 1bbdd6d..ff6deb36 100644
--- a/third_party/WebKit/Source/web/AssociatedURLLoaderTest.cpp
+++ b/third_party/WebKit/Source/web/AssociatedURLLoaderTest.cpp
@@ -321,10 +321,13 @@
 TEST_F(AssociatedURLLoaderTest, CrossOriginSuccess)
 {
     // This is cross-origin since the frame was loaded from www.test.com.
-    KURL url = toKURL("http://www.other.com/CrossOriginSuccess.html");
+    KURL url = toKURL("http://www.other.com/CrossOriginSuccess");
     WebURLRequest request;
     request.initialize();
     request.setURL(url);
+    // No-CORS requests (CrossOriginRequestPolicyAllow) aren't allowed for the
+    // default context. So we set the context as Script here.
+    request.setRequestContext(WebURLRequest::RequestContextScript);
 
     m_expectedResponse = WebURLResponse();
     m_expectedResponse.initialize();
diff --git a/third_party/WebKit/Source/web/FrameLoaderClientImpl.cpp b/third_party/WebKit/Source/web/FrameLoaderClientImpl.cpp
index 1743ea5..a02ea7a 100644
--- a/third_party/WebKit/Source/web/FrameLoaderClientImpl.cpp
+++ b/third_party/WebKit/Source/web/FrameLoaderClientImpl.cpp
@@ -892,15 +892,6 @@
     return m_webFrame->client()->cookieJar();
 }
 
-bool FrameLoaderClientImpl::willCheckAndDispatchMessageEvent(
-    SecurityOrigin* target, MessageEvent* event, LocalFrame* sourceFrame) const
-{
-    if (!m_webFrame->client())
-        return false;
-    return m_webFrame->client()->willCheckAndDispatchMessageEvent(
-        WebLocalFrameImpl::fromFrame(sourceFrame), m_webFrame, WebSecurityOrigin(target), WebDOMMessageEvent(event));
-}
-
 void FrameLoaderClientImpl::frameFocused() const
 {
     if (m_webFrame->client())
diff --git a/third_party/WebKit/Source/web/FrameLoaderClientImpl.h b/third_party/WebKit/Source/web/FrameLoaderClientImpl.h
index 5fd3c6a..80a890a 100644
--- a/third_party/WebKit/Source/web/FrameLoaderClientImpl.h
+++ b/third_party/WebKit/Source/web/FrameLoaderClientImpl.h
@@ -149,7 +149,6 @@
     void didUseKeygen() override;
 
     WebCookieJar* cookieJar() const override;
-    bool willCheckAndDispatchMessageEvent(SecurityOrigin* target, MessageEvent*, LocalFrame* sourceFrame) const override;
     void frameFocused() const override;
     void didChangeName(const String& name, const String& uniqueName) override;
     void didEnforceStrictMixedContentChecking() override;
diff --git a/third_party/WebKit/Source/web/LinkHighlightImpl.cpp b/third_party/WebKit/Source/web/LinkHighlightImpl.cpp
index 0b2b2b2b..f5c8188a 100644
--- a/third_party/WebKit/Source/web/LinkHighlightImpl.cpp
+++ b/third_party/WebKit/Source/web/LinkHighlightImpl.cpp
@@ -332,7 +332,6 @@
 class LinkHighlightDisplayItemClientForTracking : public DisplayItemClient {
     String debugName() const final { return "LinkHighlight"; }
     LayoutRect visualRect() const final { return LayoutRect(); }
-    DISPLAY_ITEM_CACHE_STATUS_UNCACHEABLE_IMPLEMENTATION
 };
 
 void LinkHighlightImpl::updateGeometry()
diff --git a/third_party/WebKit/Source/web/NotificationPermissionClientImpl.cpp b/third_party/WebKit/Source/web/NotificationPermissionClientImpl.cpp
index b26b3d8..50e7f26f 100644
--- a/third_party/WebKit/Source/web/NotificationPermissionClientImpl.cpp
+++ b/third_party/WebKit/Source/web/NotificationPermissionClientImpl.cpp
@@ -28,7 +28,7 @@
 
     ~WebNotificationPermissionCallbackImpl() override { }
 
-    void permissionRequestComplete(mojom::PermissionStatus permissionStatus) override
+    void permissionRequestComplete(mojom::blink::PermissionStatus permissionStatus) override
     {
         String permissionString = Notification::permissionString(permissionStatus);
         if (m_deprecatedCallback)
diff --git a/third_party/WebKit/Source/web/PageOverlay.h b/third_party/WebKit/Source/web/PageOverlay.h
index c027ea2..e050a0a 100644
--- a/third_party/WebKit/Source/web/PageOverlay.h
+++ b/third_party/WebKit/Source/web/PageOverlay.h
@@ -79,7 +79,6 @@
 
 private:
     PageOverlay(WebViewImpl*, PageOverlay::Delegate*);
-    DISPLAY_ITEM_CACHE_STATUS_UNCACHEABLE_IMPLEMENTATION
 
     WebViewImpl* m_viewImpl;
     Persistent<PageOverlay::Delegate> m_delegate;
diff --git a/third_party/WebKit/Source/web/RemoteFrameClientImpl.cpp b/third_party/WebKit/Source/web/RemoteFrameClientImpl.cpp
index 1d35b6c5..e3b220f 100644
--- a/third_party/WebKit/Source/web/RemoteFrameClientImpl.cpp
+++ b/third_party/WebKit/Source/web/RemoteFrameClientImpl.cpp
@@ -117,14 +117,6 @@
     return toCoreFrame(m_webFrame->lastChild());
 }
 
-bool RemoteFrameClientImpl::willCheckAndDispatchMessageEvent(
-    SecurityOrigin* target, MessageEvent* event, LocalFrame* sourceFrame) const
-{
-    if (m_webFrame->client())
-        m_webFrame->client()->postMessageEvent(WebLocalFrameImpl::fromFrame(sourceFrame), m_webFrame, WebSecurityOrigin(target), WebDOMMessageEvent(event));
-    return true;
-}
-
 void RemoteFrameClientImpl::frameFocused() const
 {
     if (m_webFrame->client())
@@ -153,6 +145,13 @@
     return 2;
 }
 
+void RemoteFrameClientImpl::forwardPostMessage(
+    MessageEvent* event, PassRefPtr<SecurityOrigin> target, LocalFrame* sourceFrame) const
+{
+    if (m_webFrame->client())
+        m_webFrame->client()->forwardPostMessage(WebLocalFrameImpl::fromFrame(sourceFrame), m_webFrame, WebSecurityOrigin(target), WebDOMMessageEvent(event));
+}
+
 // FIXME: Remove this code once we have input routing in the browser
 // process. See http://crbug.com/339659.
 void RemoteFrameClientImpl::forwardInputEvent(Event* event)
@@ -178,8 +177,6 @@
         webEvent = adoptPtr(new WebKeyboardEventBuilder(*static_cast<KeyboardEvent*>(event)));
     else if (event->isMouseEvent())
         webEvent = adoptPtr(new WebMouseEventBuilder(m_webFrame->frame()->view(), LayoutItem(m_webFrame->toImplBase()->frame()->ownerLayoutObject()), *static_cast<MouseEvent*>(event)));
-    else if (event->isWheelEvent())
-        webEvent = adoptPtr(new WebMouseWheelEventBuilder(m_webFrame->frame()->view(), LayoutItem(m_webFrame->toImplBase()->frame()->ownerLayoutObject()), *static_cast<WheelEvent*>(event)));
 
     // Other or internal Blink events should not be forwarded.
     if (!webEvent || webEvent->type == WebInputEvent::Undefined)
diff --git a/third_party/WebKit/Source/web/RemoteFrameClientImpl.h b/third_party/WebKit/Source/web/RemoteFrameClientImpl.h
index 0bd025ac..ab13a5fc 100644
--- a/third_party/WebKit/Source/web/RemoteFrameClientImpl.h
+++ b/third_party/WebKit/Source/web/RemoteFrameClientImpl.h
@@ -28,13 +28,13 @@
     Frame* nextSibling() const override;
     Frame* firstChild() const override;
     Frame* lastChild() const override;
-    bool willCheckAndDispatchMessageEvent(SecurityOrigin*, MessageEvent*, LocalFrame*) const override;
     void frameFocused() const override;
 
     // RemoteFrameClient overrides:
     void navigate(const ResourceRequest&, bool shouldReplaceCurrentEntry) override;
     void reload(FrameLoadType, ClientRedirectPolicy) override;
     unsigned backForwardLength() override;
+    void forwardPostMessage(MessageEvent*, PassRefPtr<SecurityOrigin> target, LocalFrame* source) const override;
     void forwardInputEvent(Event*) override;
     void frameRectsChanged(const IntRect& frameRect) override;
     void advanceFocus(WebFocusType, LocalFrame*) override;
diff --git a/third_party/WebKit/Source/web/WebFrameSerializer.cpp b/third_party/WebKit/Source/web/WebFrameSerializer.cpp
index 09fab01..0846f86f7 100644
--- a/third_party/WebKit/Source/web/WebFrameSerializer.cpp
+++ b/third_party/WebKit/Source/web/WebFrameSerializer.cpp
@@ -47,12 +47,16 @@
 #include "platform/SharedBuffer.h"
 #include "platform/mhtml/MHTMLArchive.h"
 #include "platform/mhtml/MHTMLParser.h"
+#include "platform/network/ResourceResponse.h"
 #include "platform/weborigin/KURL.h"
 #include "public/platform/WebString.h"
 #include "public/platform/WebURL.h"
+#include "public/platform/WebURLResponse.h"
 #include "public/platform/WebVector.h"
+#include "public/web/WebDataSource.h"
 #include "public/web/WebDocument.h"
 #include "public/web/WebFrame.h"
+#include "public/web/WebFrameSerializerCacheControlPolicy.h"
 #include "public/web/WebFrameSerializerClient.h"
 #include "web/WebFrameSerializerImpl.h"
 #include "web/WebLocalFrameImpl.h"
@@ -138,16 +142,27 @@
 
 } // namespace
 
-WebData WebFrameSerializer::generateMHTMLHeader(
-    const WebString& boundary, WebLocalFrame* frame)
+bool WebFrameSerializer::generateMHTMLHeader(
+    const WebString& boundary, WebFrameSerializerCacheControlPolicy cacheControlPolicy,
+    WebLocalFrame* frame, WebData* data)
 {
-    Document* document = toWebLocalFrameImpl(frame)->frame()->document();
+    WebLocalFrameImpl* webLocalFrameImpl = toWebLocalFrameImpl(frame);
+    DCHECK(webLocalFrameImpl);
+
+    if (cacheControlPolicy == WebFrameSerializerCacheControlPolicy::FailForNoStoreMainFrame) {
+        const ResourceResponse& response = webLocalFrameImpl->dataSource()->response().toResourceResponse();
+        if (response.cacheControlContainsNoStore())
+            return false;
+    }
+
+    Document* document = webLocalFrameImpl->frame()->document();
 
     RefPtr<SharedBuffer> buffer = SharedBuffer::create();
     MHTMLArchive::generateMHTMLHeader(
         boundary, document->title(), document->suggestedMIMEType(),
         *buffer);
-    return buffer.release();
+    *data = buffer.release();
+    return true;
 }
 
 WebData WebFrameSerializer::generateMHTMLParts(
diff --git a/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp b/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
index 8bc1e19e..5d633b5 100644
--- a/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
+++ b/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
@@ -259,12 +259,17 @@
     return toWebPluginContainerImpl(pluginDocument->pluginWidget());
 }
 
-WebPluginContainerImpl* WebLocalFrameImpl::pluginContainerFromNode(LocalFrame* frame, const WebNode& node)
+WebPluginContainerImpl* WebLocalFrameImpl::currentPluginContainer(LocalFrame* frame, Node* node)
 {
     WebPluginContainerImpl* pluginContainer = pluginContainerFromFrame(frame);
     if (pluginContainer)
         return pluginContainer;
-    return toWebPluginContainerImpl(node.pluginContainer());
+
+    if (!node) {
+        DCHECK(frame->document());
+        node = frame->document()->focusedElement();
+    }
+    return toWebPluginContainerImpl(WebNode::pluginContainerFromNode(node));
 }
 
 // Simple class to override some of PrintContext behavior. Some of the methods
@@ -1011,7 +1016,7 @@
     return PlainTextRange::create(*editable, range).start();
 }
 
-bool WebLocalFrameImpl::executeCommand(const WebString& name, const WebNode& node)
+bool WebLocalFrameImpl::executeCommand(const WebString& name)
 {
     DCHECK(frame());
 
@@ -1029,18 +1034,19 @@
     if (command[command.length() - 1] == UChar(':'))
         command = command.substring(0, command.length() - 1);
 
-    WebPluginContainerImpl* pluginContainer = pluginContainerFromNode(frame(), node);
+    Node* pluginLookupContextNode = m_contextMenuNode && name == "Copy" ? m_contextMenuNode : nullptr;
+    WebPluginContainerImpl* pluginContainer = currentPluginContainer(frame(), pluginLookupContextNode);
     if (pluginContainer && pluginContainer->executeEditCommand(name))
         return true;
 
     return frame()->editor().executeCommand(command);
 }
 
-bool WebLocalFrameImpl::executeCommand(const WebString& name, const WebString& value, const WebNode& node)
+bool WebLocalFrameImpl::executeCommand(const WebString& name, const WebString& value)
 {
     DCHECK(frame());
 
-    WebPluginContainerImpl* pluginContainer = pluginContainerFromNode(frame(), node);
+    WebPluginContainerImpl* pluginContainer = currentPluginContainer(frame());
     if (pluginContainer && pluginContainer->executeEditCommand(name, value))
         return true;
 
@@ -1224,7 +1230,7 @@
 
 WebPlugin* WebLocalFrameImpl::focusedPluginIfInputMethodSupported()
 {
-    WebPluginContainerImpl* container = WebLocalFrameImpl::pluginContainerFromNode(frame(), WebNode(frame()->document()->focusedElement()));
+    WebPluginContainerImpl* container = WebLocalFrameImpl::currentPluginContainer(frame());
     if (container && container->supportsInputMethod())
         return container->plugin();
     return 0;
diff --git a/third_party/WebKit/Source/web/WebLocalFrameImpl.h b/third_party/WebKit/Source/web/WebLocalFrameImpl.h
index 48db8e46..19b1f74 100644
--- a/third_party/WebKit/Source/web/WebLocalFrameImpl.h
+++ b/third_party/WebKit/Source/web/WebLocalFrameImpl.h
@@ -146,8 +146,8 @@
     WebRange markedRange() const override;
     bool firstRectForCharacterRange(unsigned location, unsigned length, WebRect&) const override;
     size_t characterIndexForPoint(const WebPoint&) const override;
-    bool executeCommand(const WebString&, const WebNode& = WebNode()) override;
-    bool executeCommand(const WebString&, const WebString& value, const WebNode& = WebNode()) override;
+    bool executeCommand(const WebString&) override;
+    bool executeCommand(const WebString&, const WebString& value) override;
     bool isCommandEnabled(const WebString&) const override;
     void enableContinuousSpellChecking(bool) override;
     bool isContinuousSpellCheckingEnabled() const override;
@@ -270,8 +270,8 @@
 
     // If the frame hosts a PluginDocument, this method returns the WebPluginContainerImpl
     // that hosts the plugin. If the provided node is a plugin, then it runs its
-    // WebPluginContainerImpl.
-    static WebPluginContainerImpl* pluginContainerFromNode(LocalFrame*, const WebNode&);
+    // WebPluginContainerImpl. Otherwise, uses the currently focused element (if any).
+    static WebPluginContainerImpl* currentPluginContainer(LocalFrame*, Node* = nullptr);
 
     WebViewImpl* viewImpl() const;
 
diff --git a/third_party/WebKit/Source/web/WebNode.cpp b/third_party/WebKit/Source/web/WebNode.cpp
index ae7e072..f25d809 100644
--- a/third_party/WebKit/Source/web/WebNode.cpp
+++ b/third_party/WebKit/Source/web/WebNode.cpp
@@ -217,20 +217,27 @@
     return m_private->focused();
 }
 
+WebPluginContainer* WebNode::pluginContainerFromNode(const Node* node)
+{
+    if (!node)
+        return nullptr;
+
+    if (!isHTMLObjectElement(node) && !isHTMLEmbedElement(node))
+        return nullptr;
+
+    LayoutObject* object = node->layoutObject();
+    if (object && object->isLayoutPart()) {
+        Widget* widget = toLayoutPart(object)->widget();
+        if (widget && widget->isPluginContainer())
+            return toWebPluginContainerImpl(widget);
+    }
+
+    return nullptr;
+}
+
 WebPluginContainer* WebNode::pluginContainer() const
 {
-    if (isNull())
-        return 0;
-    const Node& coreNode = *constUnwrap<Node>();
-    if (isHTMLObjectElement(coreNode) || isHTMLEmbedElement(coreNode)) {
-        LayoutObject* object = coreNode.layoutObject();
-        if (object && object->isLayoutPart()) {
-            Widget* widget = toLayoutPart(object)->widget();
-            if (widget && widget->isPluginContainer())
-                return toWebPluginContainerImpl(widget);
-        }
-    }
-    return 0;
+    return pluginContainerFromNode(constUnwrap<Node>());
 }
 
 WebAXObject WebNode::accessibilityObject()
diff --git a/third_party/WebKit/Source/web/WebRemoteFrameImpl.cpp b/third_party/WebKit/Source/web/WebRemoteFrameImpl.cpp
index 0889a3f..80175dfba 100644
--- a/third_party/WebKit/Source/web/WebRemoteFrameImpl.cpp
+++ b/third_party/WebKit/Source/web/WebRemoteFrameImpl.cpp
@@ -367,13 +367,13 @@
     return 0;
 }
 
-bool WebRemoteFrameImpl::executeCommand(const WebString&, const WebNode&)
+bool WebRemoteFrameImpl::executeCommand(const WebString&)
 {
     NOTREACHED();
     return false;
 }
 
-bool WebRemoteFrameImpl::executeCommand(const WebString&, const WebString& value, const WebNode&)
+bool WebRemoteFrameImpl::executeCommand(const WebString&, const WebString& value)
 {
     NOTREACHED();
     return false;
diff --git a/third_party/WebKit/Source/web/WebRemoteFrameImpl.h b/third_party/WebKit/Source/web/WebRemoteFrameImpl.h
index 7c1d817..b08d329 100644
--- a/third_party/WebKit/Source/web/WebRemoteFrameImpl.h
+++ b/third_party/WebKit/Source/web/WebRemoteFrameImpl.h
@@ -89,8 +89,8 @@
     WebRange markedRange() const override;
     bool firstRectForCharacterRange(unsigned location, unsigned length, WebRect&) const override;
     size_t characterIndexForPoint(const WebPoint&) const override;
-    bool executeCommand(const WebString&, const WebNode& = WebNode()) override;
-    bool executeCommand(const WebString&, const WebString& value, const WebNode& = WebNode()) override;
+    bool executeCommand(const WebString&) override;
+    bool executeCommand(const WebString&, const WebString& value) override;
     bool isCommandEnabled(const WebString&) const override;
     void enableContinuousSpellChecking(bool) override;
     bool isContinuousSpellCheckingEnabled() const override;
diff --git a/third_party/WebKit/Source/web/WebRuntimeFeatures.cpp b/third_party/WebKit/Source/web/WebRuntimeFeatures.cpp
index 3286762a..1af0780d 100644
--- a/third_party/WebKit/Source/web/WebRuntimeFeatures.cpp
+++ b/third_party/WebKit/Source/web/WebRuntimeFeatures.cpp
@@ -120,16 +120,6 @@
     RuntimeEnabledFeatures::setExperimentalCanvasFeaturesEnabled(enable);
 }
 
-void WebRuntimeFeatures::enableExperimentalFramework(bool enable)
-{
-    RuntimeEnabledFeatures::setExperimentalFrameworkEnabled(enable);
-}
-
-bool WebRuntimeFeatures::isExperimentalFrameworkEnabled()
-{
-    return RuntimeEnabledFeatures::experimentalFrameworkEnabled();
-}
-
 void WebRuntimeFeatures::enableFastMobileScrolling(bool enable)
 {
     RuntimeEnabledFeatures::setFastMobileScrollingEnabled(enable);
@@ -185,6 +175,16 @@
     RuntimeEnabledFeatures::setOrientationEventEnabled(enable);
 }
 
+void WebRuntimeFeatures::enableOriginTrials(bool enable)
+{
+    RuntimeEnabledFeatures::setOriginTrialsEnabled(enable);
+}
+
+bool WebRuntimeFeatures::isOriginTrialsEnabled()
+{
+    return RuntimeEnabledFeatures::originTrialsEnabled();
+}
+
 void WebRuntimeFeatures::enablePagePopup(bool enable)
 {
     RuntimeEnabledFeatures::setPagePopupEnabled(enable);
diff --git a/third_party/WebKit/Source/web/WebViewImpl.cpp b/third_party/WebKit/Source/web/WebViewImpl.cpp
index dbce5b0..7076785 100644
--- a/third_party/WebKit/Source/web/WebViewImpl.cpp
+++ b/third_party/WebKit/Source/web/WebViewImpl.cpp
@@ -2654,7 +2654,7 @@
 
 WebPlugin* WebViewImpl::focusedPluginIfInputMethodSupported(LocalFrame* frame)
 {
-    WebPluginContainerImpl* container = WebLocalFrameImpl::pluginContainerFromNode(frame, WebNode(focusedElement()));
+    WebPluginContainerImpl* container = WebLocalFrameImpl::currentPluginContainer(frame);
     if (container && container->supportsInputMethod())
         return container->plugin();
     return nullptr;
diff --git a/third_party/WebKit/Source/web/tests/FrameTestHelpers.h b/third_party/WebKit/Source/web/tests/FrameTestHelpers.h
index be5c57b..eaadcac 100644
--- a/third_party/WebKit/Source/web/tests/FrameTestHelpers.h
+++ b/third_party/WebKit/Source/web/tests/FrameTestHelpers.h
@@ -199,7 +199,7 @@
 
     // WebRemoteFrameClient overrides:
     void frameDetached(DetachType) override;
-    void postMessageEvent(
+    void forwardPostMessage(
         WebLocalFrame* sourceFrame,
         WebRemoteFrame* targetFrame,
         WebSecurityOrigin targetOrigin,
diff --git a/third_party/WebKit/Source/web/tests/WebFrameTest.cpp b/third_party/WebKit/Source/web/tests/WebFrameTest.cpp
index 7299c17..ed3ada6 100644
--- a/third_party/WebKit/Source/web/tests/WebFrameTest.cpp
+++ b/third_party/WebKit/Source/web/tests/WebFrameTest.cpp
@@ -7903,6 +7903,8 @@
 
     // Cross-origin request.
     KURL resourceUrl(ParsedURLString, "chrome://test.pdf");
+    ResourceRequest request(resourceUrl);
+    request.setRequestContext(WebURLRequest::RequestContextObject);
     registerMockedChromeURLLoad("test.pdf");
 
     LocalFrame* frame(toLocalFrame(webViewHelper.webViewImpl()->page()->mainFrame()));
@@ -7914,14 +7916,14 @@
     options.crossOriginRequestPolicy = UseAccessControl;
     ResourceLoaderOptions resourceLoaderOptions;
     DocumentThreadableLoader::loadResourceSynchronously(
-        *frame->document(), ResourceRequest(resourceUrl), client, options, resourceLoaderOptions);
+        *frame->document(), request, client, options, resourceLoaderOptions);
     EXPECT_TRUE(client.failed());
 
     client.reset();
     // Try to load the request with cross origin access. Should succeed.
     options.crossOriginRequestPolicy = AllowCrossOriginRequests;
     DocumentThreadableLoader::loadResourceSynchronously(
-        *frame->document(), ResourceRequest(resourceUrl), client, options, resourceLoaderOptions);
+        *frame->document(), request, client, options, resourceLoaderOptions);
     EXPECT_FALSE(client.failed());
 }
 
diff --git a/third_party/WebKit/Source/web/tests/WebPluginContainerTest.cpp b/third_party/WebKit/Source/web/tests/WebPluginContainerTest.cpp
index 24474b7..b69327a 100644
--- a/third_party/WebKit/Source/web/tests/WebPluginContainerTest.cpp
+++ b/third_party/WebKit/Source/web/tests/WebPluginContainerTest.cpp
@@ -312,8 +312,42 @@
     webView->updateAllLifecyclePhases();
     runPendingTasks();
 
-    WebElement pluginContainerOneElement = webView->mainFrame()->document().getElementById(WebString::fromUTF8("translated-plugin"));
-    EXPECT_TRUE(webView->mainFrame()->executeCommand("Copy",  pluginContainerOneElement));
+    webView->mainFrame()->document().unwrap<Document>()->body()->getElementById("translated-plugin")->focus();
+    EXPECT_TRUE(webView->mainFrame()->executeCommand("Copy"));
+    EXPECT_EQ(WebString("x"), Platform::current()->clipboard()->readPlainText(WebClipboard::Buffer()));
+}
+
+TEST_F(WebPluginContainerTest, CopyFromContextMenu)
+{
+    URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8("plugin_container.html"));
+    TestPluginWebFrameClient pluginWebFrameClient; // Must outlive webViewHelper.
+    FrameTestHelpers::WebViewHelper webViewHelper;
+    WebView* webView = webViewHelper.initializeAndLoad(m_baseURL + "plugin_container.html", true, &pluginWebFrameClient);
+    DCHECK(webView);
+    webView->settings()->setPluginsEnabled(true);
+    webView->resize(WebSize(300, 300));
+    webView->updateAllLifecyclePhases();
+    runPendingTasks();
+
+    auto event = FrameTestHelpers::createMouseEvent(WebMouseEvent::MouseDown, WebMouseEvent::ButtonRight, WebPoint(30, 30), 0);
+    event.clickCount = 1;
+
+    // Make sure the right-click + Copy works in common scenario.
+    webView->handleInputEvent(event);
+    EXPECT_TRUE(webView->mainFrame()->executeCommand("Copy"));
+    EXPECT_EQ(WebString("x"), Platform::current()->clipboard()->readPlainText(WebClipboard::Buffer()));
+
+    // Clear the clipboard buffer.
+    Platform::current()->clipboard()->writePlainText(WebString(""));
+    EXPECT_EQ(WebString(""), Platform::current()->clipboard()->readPlainText(WebClipboard::Buffer()));
+
+    // Now, let's try a more complex scenario:
+    // 1) open the context menu. This will focus the plugin.
+    webView->handleInputEvent(event);
+    // 2) document blurs the plugin, because it can.
+    webView->clearFocusedElement();
+    // 3) Copy should still operate on the context node, even though the focus had shifted.
+    EXPECT_TRUE(webView->mainFrame()->executeCommand("Copy"));
     EXPECT_EQ(WebString("x"), Platform::current()->clipboard()->readPlainText(WebClipboard::Buffer()));
 }
 
diff --git a/third_party/WebKit/Source/wtf/HashMap.h b/third_party/WebKit/Source/wtf/HashMap.h
index 77a1a3b1..c9f6796 100644
--- a/third_party/WebKit/Source/wtf/HashMap.h
+++ b/third_party/WebKit/Source/wtf/HashMap.h
@@ -59,7 +59,6 @@
 
 private:
     typedef typename MappedTraits::PassInType MappedPassInType;
-    typedef typename MappedTraits::PassOutType MappedPassOutType;
     typedef typename MappedTraits::PeekOutType MappedPeekType;
 
     typedef HashArg HashFunctions;
@@ -125,7 +124,7 @@
     template <typename Collection>
     void removeAll(const Collection& toBeRemoved) { WTF::removeAll(*this, toBeRemoved); }
 
-    MappedPassOutType take(KeyPeekInType); // efficient combination of get with remove
+    MappedType take(KeyPeekInType); // efficient combination of get with remove
 
     // An alternate version of find() that finds the object by hashing and
     // comparing with some other type, to avoid the cost of type
@@ -422,13 +421,12 @@
 }
 
 template <typename T, typename U, typename V, typename W, typename X, typename Y>
-typename HashMap<T, U, V, W, X, Y>::MappedPassOutType
-HashMap<T, U, V, W, X, Y>::take(KeyPeekInType key)
+auto HashMap<T, U, V, W, X, Y>::take(KeyPeekInType key) -> MappedType
 {
     iterator it = find(key);
     if (it == end())
-        return MappedTraits::passOut(MappedTraits::emptyValue());
-    MappedPassOutType result = MappedTraits::passOut(it->value);
+        return MappedTraits::emptyValue();
+    MappedType result = std::move(it->value);
     remove(it);
     return result;
 }
diff --git a/third_party/WebKit/Source/wtf/HashSet.h b/third_party/WebKit/Source/wtf/HashSet.h
index 7cba178df..c2d6813 100644
--- a/third_party/WebKit/Source/wtf/HashSet.h
+++ b/third_party/WebKit/Source/wtf/HashSet.h
@@ -43,7 +43,6 @@
     typedef TraitsArg ValueTraits;
     typedef typename ValueTraits::PeekInType ValuePeekInType;
     typedef typename ValueTraits::PassInType ValuePassInType;
-    typedef typename ValueTraits::PassOutType ValuePassOutType;
 
 public:
     typedef typename ValueTraits::TraitType ValueType;
@@ -105,9 +104,9 @@
     template <typename Collection>
     void removeAll(const Collection& toBeRemoved) { WTF::removeAll(*this, toBeRemoved); }
 
-    ValuePassOutType take(iterator);
-    ValuePassOutType take(ValuePeekInType);
-    ValuePassOutType takeAny();
+    ValueType take(iterator);
+    ValueType take(ValuePeekInType);
+    ValueType takeAny();
 
     template <typename VisitorDispatcher>
     void trace(VisitorDispatcher visitor) { m_impl.trace(visitor); }
@@ -225,25 +224,25 @@
 }
 
 template <typename T, typename U, typename V, typename W>
-inline typename HashSet<T, U, V, W>::ValuePassOutType HashSet<T, U, V, W>::take(iterator it)
+inline auto HashSet<T, U, V, W>::take(iterator it) -> ValueType
 {
     if (it == end())
         return ValueTraits::emptyValue();
 
-    ValuePassOutType result = ValueTraits::passOut(const_cast<ValueType&>(*it));
+    ValueType result = std::move(const_cast<ValueType&>(*it));
     remove(it);
 
     return result;
 }
 
 template <typename T, typename U, typename V, typename W>
-inline typename HashSet<T, U, V, W>::ValuePassOutType HashSet<T, U, V, W>::take(ValuePeekInType value)
+inline auto HashSet<T, U, V, W>::take(ValuePeekInType value) -> ValueType
 {
     return take(find(value));
 }
 
 template <typename T, typename U, typename V, typename W>
-inline typename HashSet<T, U, V, W>::ValuePassOutType HashSet<T, U, V, W>::takeAny()
+inline auto HashSet<T, U, V, W>::takeAny() -> ValueType
 {
     return take(begin());
 }
diff --git a/third_party/WebKit/Source/wtf/HashTraits.h b/third_party/WebKit/Source/wtf/HashTraits.h
index 695d5cd..b5154b38 100644
--- a/third_party/WebKit/Source/wtf/HashTraits.h
+++ b/third_party/WebKit/Source/wtf/HashTraits.h
@@ -109,11 +109,6 @@
     template <typename IncomingValueType>
     static void store(IncomingValueType&& value, T& storage) { storage = std::forward<IncomingValueType>(value); }
 
-    // Type for return value of functions that transfer ownership, such as take.
-    typedef T PassOutType;
-    static T&& passOut(T& value) { return std::move(value); }
-    static T&& passOut(T&& value) { return std::move(value); }
-
     // Type for return value of functions that do not transfer ownership, such
     // as get.
     // FIXME: We could change this type to const T& for better performance if we
@@ -172,10 +167,6 @@
     typedef PassOwnPtr<P> PassInType;
     static void store(PassOwnPtr<P> value, OwnPtr<P>& storage) { storage = std::move(value); }
 
-    typedef PassOwnPtr<P> PassOutType;
-    static PassOwnPtr<P> passOut(OwnPtr<P>& value) { return value.release(); }
-    static PassOwnPtr<P> passOut(std::nullptr_t) { return nullptr; }
-
     typedef typename OwnPtr<P>::PtrType PeekOutType;
     static PeekOutType peek(const OwnPtr<P>& value) { return value.get(); }
     static PeekOutType peek(std::nullptr_t) { return 0; }
@@ -199,10 +190,6 @@
     typedef PassRefPtr<P> PassInType;
     static void store(PassRefPtr<P> value, RefPtr<P>& storage) { storage = value; }
 
-    typedef PassRefPtr<P> PassOutType;
-    static PassOutType passOut(RefPtr<P>& value) { return value.release(); }
-    static PassOutType passOut(std::nullptr_t) { return nullptr; }
-
     typedef P* PeekOutType;
     static PeekOutType peek(const RefPtr<P>& value) { return value.get(); }
     static PeekOutType peek(std::nullptr_t) { return 0; }
@@ -221,10 +208,6 @@
     using PassInType = std::unique_ptr<T>;
     static void store(std::unique_ptr<T>&& value, std::unique_ptr<T>& storage) { storage = std::move(value); }
 
-    using PassOutType = std::unique_ptr<T>;
-    static std::unique_ptr<T>&& passOut(std::unique_ptr<T>& value) { return std::move(value); }
-    static std::unique_ptr<T> passOut(std::nullptr_t) { return nullptr; }
-
     using PeekOutType = T*;
     static PeekOutType peek(const std::unique_ptr<T>& value) { return value.get(); }
     static PeekOutType peek(std::nullptr_t) { return nullptr; }
diff --git a/third_party/WebKit/Source/wtf/ListHashSet.h b/third_party/WebKit/Source/wtf/ListHashSet.h
index 1afd63b..f819061 100644
--- a/third_party/WebKit/Source/wtf/ListHashSet.h
+++ b/third_party/WebKit/Source/wtf/ListHashSet.h
@@ -74,7 +74,6 @@
     typedef ValueArg ValueType;
     typedef HashTraits<ValueType> ValueTraits;
     typedef typename ValueTraits::PeekInType ValuePeekInType;
-    typedef typename ValueTraits::PassOutType ValuePassOutType;
 
     typedef ListHashSetIterator<ListHashSet> iterator;
     typedef ListHashSetConstIterator<ListHashSet> const_iterator;
@@ -173,9 +172,9 @@
     template <typename Collection>
     void removeAll(const Collection& other) { WTF::removeAll(*this, other); }
 
-    ValuePassOutType take(iterator);
-    ValuePassOutType take(ValuePeekInType);
-    ValuePassOutType takeFirst();
+    ValueType take(iterator);
+    ValueType take(ValuePeekInType);
+    ValueType takeFirst();
 
     template <typename VisitorDispatcher>
     void trace(VisitorDispatcher);
@@ -910,30 +909,30 @@
 }
 
 template <typename T, size_t inlineCapacity, typename U, typename V>
-typename ListHashSet<T, inlineCapacity, U, V>::ValuePassOutType ListHashSet<T, inlineCapacity, U, V>::take(iterator it)
+auto ListHashSet<T, inlineCapacity, U, V>::take(iterator it) -> ValueType
 {
     if (it == end())
         return ValueTraits::emptyValue();
 
     m_impl.remove(it.getNode());
-    ValuePassOutType result = ValueTraits::passOut(it.getNode()->m_value);
+    ValueType result = std::move(it.getNode()->m_value);
     unlinkAndDelete(it.getNode());
 
     return result;
 }
 
 template <typename T, size_t inlineCapacity, typename U, typename V>
-typename ListHashSet<T, inlineCapacity, U, V>::ValuePassOutType ListHashSet<T, inlineCapacity, U, V>::take(ValuePeekInType value)
+auto ListHashSet<T, inlineCapacity, U, V>::take(ValuePeekInType value) -> ValueType
 {
     return take(find(value));
 }
 
 template <typename T, size_t inlineCapacity, typename U, typename V>
-typename ListHashSet<T, inlineCapacity, U, V>::ValuePassOutType ListHashSet<T, inlineCapacity, U, V>::takeFirst()
+auto ListHashSet<T, inlineCapacity, U, V>::takeFirst() -> ValueType
 {
     ASSERT(!isEmpty());
     m_impl.remove(m_head);
-    ValuePassOutType result = ValueTraits::passOut(m_head->m_value);
+    ValueType result = std::move(m_head->m_value);
     unlinkAndDelete(m_head);
 
     return result;
diff --git a/third_party/WebKit/Source/wtf/text/UTF8.cpp b/third_party/WebKit/Source/wtf/text/UTF8.cpp
index a258db8..0beca10 100644
--- a/third_party/WebKit/Source/wtf/text/UTF8.cpp
+++ b/third_party/WebKit/Source/wtf/text/UTF8.cpp
@@ -442,23 +442,5 @@
     return equalWithUTF8Internal(a, aEnd, b, bEnd);
 }
 
-bool isUTF8andNotASCII(const char* data, size_t length)
-{
-    // This cast is necessary because U8_NEXT uses int32_ts.
-    int32_t srcLen = static_cast<int32_t>(length);
-    int32_t charIndex = 0;
-    bool isASCIIOnly = true;
-
-    while (charIndex < srcLen) {
-        int32_t codePoint;
-        if (static_cast<uint8_t>(data[charIndex]) >= 0x80)
-            isASCIIOnly = false;
-        U8_NEXT(data, charIndex, srcLen, codePoint);
-        if (!U_IS_UNICODE_CHAR(codePoint))
-            return false;
-    }
-    return !isASCIIOnly;
-}
-
 } // namespace Unicode
 } // namespace WTF
diff --git a/third_party/WebKit/Source/wtf/text/UTF8.h b/third_party/WebKit/Source/wtf/text/UTF8.h
index b0ba7dbd..eda26334 100644
--- a/third_party/WebKit/Source/wtf/text/UTF8.h
+++ b/third_party/WebKit/Source/wtf/text/UTF8.h
@@ -70,12 +70,6 @@
 WTF_EXPORT bool equalUTF16WithUTF8(const UChar* a, const UChar* aEnd, const char* b, const char* bEnd);
 WTF_EXPORT bool equalLatin1WithUTF8(const LChar* a, const LChar* aEnd, const char* b, const char* bEnd);
 
-
-// Given a sequence of bytes in |data| of length |len|, check if the content is
-// encoded in UTF-8. Pure ASCII text is not regarded as UTF-8 in order to
-// respect the default encoding since it can be of any encoding.
-WTF_EXPORT bool isUTF8andNotASCII(const char* data, size_t length);
-
 } // namespace Unicode
 } // namespace WTF
 
diff --git a/third_party/WebKit/Source/wtf/text/UTF8Test.cpp b/third_party/WebKit/Source/wtf/text/UTF8Test.cpp
deleted file mode 100644
index 65c27ee..0000000
--- a/third_party/WebKit/Source/wtf/text/UTF8Test.cpp
+++ /dev/null
@@ -1,63 +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 "wtf/text/UTF8.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace WTF {
-namespace Unicode {
-
-TEST(UTF8Test, IsUTF8andNotASCII)
-{
-    EXPECT_TRUE(isUTF8andNotASCII("\xc2\x81", 2));
-    EXPECT_TRUE(isUTF8andNotASCII("\xe1\x80\xbf", 3));
-    EXPECT_TRUE(isUTF8andNotASCII("\xf1\x80\xa0\xbf", 4));
-    EXPECT_TRUE(isUTF8andNotASCII("a\xc2\x81\xe1\x80\xbf\xf1\x80\xa0\xbf", 10));
-
-    // Surrogate code points
-    EXPECT_FALSE(isUTF8andNotASCII("\xed\xa0\x80\xed\xbf\xbf", 6));
-    EXPECT_FALSE(isUTF8andNotASCII("\xed\xa0\x8f", 3));
-    EXPECT_FALSE(isUTF8andNotASCII("\xed\xbf\xbf", 3));
-
-    // Overlong sequences
-    EXPECT_FALSE(isUTF8andNotASCII("\xc0\x80", 2)); // U+0000
-    EXPECT_FALSE(isUTF8andNotASCII("\xc1\x80\xc1\x81", 4)); // "AB"
-    EXPECT_FALSE(isUTF8andNotASCII("\xe0\x80\x80", 3)); // U+0000
-    EXPECT_FALSE(isUTF8andNotASCII("\xe0\x82\x80", 3)); // U+0080
-    EXPECT_FALSE(isUTF8andNotASCII("\xe0\x9f\xbf", 3)); // U+07ff
-    EXPECT_FALSE(isUTF8andNotASCII("\xf0\x80\x80\x8D", 4)); // U+000D
-    EXPECT_FALSE(isUTF8andNotASCII("\xf0\x80\x82\x91", 4)); // U+0091
-    EXPECT_FALSE(isUTF8andNotASCII("\xf0\x80\xa0\x80", 4)); // U+0800
-    EXPECT_FALSE(isUTF8andNotASCII("\xf0\x8f\xbb\xbf", 4)); // U+FEFF (BOM)
-    EXPECT_FALSE(isUTF8andNotASCII("\xf8\x80\x80\x80\xbf", 5)); // U+003F
-    EXPECT_FALSE(isUTF8andNotASCII("\xfc\x80\x80\x80\xa0\xa5", 6)); // U+00A5
-
-    // Beyond U+10FFFF (the upper limit of Unicode codespace)
-    EXPECT_FALSE(isUTF8andNotASCII("\xf4\x90\x80\x80", 4)); // U+110000
-    EXPECT_FALSE(isUTF8andNotASCII("\xf8\xa0\xbf\x80\xbf", 5)); // 5 bytes
-    EXPECT_FALSE(isUTF8andNotASCII("\xfc\x9c\xbf\x80\xbf\x80", 6)); // 6 bytes
-
-    // Non-characters : U+xxFFF[EF] where xx is 0x00 through 0x10 and <FDD0,FDEF>
-    EXPECT_FALSE(isUTF8andNotASCII("\xef\xbf\xbe", 3)); // U+FFFE
-    EXPECT_FALSE(isUTF8andNotASCII("\xf0\x8f\xbf\xbe", 4)); // U+1FFFE
-    EXPECT_FALSE(isUTF8andNotASCII("\xf3\xbf\xbf\xbf", 4)); // U+10FFFF
-    EXPECT_FALSE(isUTF8andNotASCII("\xef\xb7\x90", 3)); // U+FDD0
-    EXPECT_FALSE(isUTF8andNotASCII("\xef\xb7\xaf", 3)); // U+FDEF
-
-    // Strings in legacy encodings.
-    EXPECT_FALSE(isUTF8andNotASCII("caf\xe9", 4)); // cafe with U+00E9 in ISO-8859-1
-    EXPECT_FALSE(isUTF8andNotASCII("\xb0\xa1\xb0\xa2", 4)); // U+AC00, U+AC001 in EUC-KR
-    EXPECT_FALSE(isUTF8andNotASCII("\xa7\x41\xa6\x6e", 4)); // U+4F60 U+597D in Big5
-    // "abc" with U+201[CD] in windows-125[0-8]
-    EXPECT_FALSE(isUTF8andNotASCII("\x93" "abc\x94", 4));
-    // U+0639 U+064E U+0644 U+064E in ISO-8859-6
-    EXPECT_FALSE(isUTF8andNotASCII("\xd9\xee\xe4\xee", 4));
-    // U+03B3 U+03B5 U+03B9 U+03AC in ISO-8859-7
-    EXPECT_FALSE(isUTF8andNotASCII("\xe3\xe5\xe9\xdC", 4));
-    EXPECT_FALSE(isUTF8andNotASCII("abc", 3)); // plain ASCII
-}
-
-} // namespace Unicode
-} // namespace WTF
diff --git a/third_party/WebKit/Source/wtf/text/icu/UnicodeIcu.h b/third_party/WebKit/Source/wtf/text/icu/UnicodeIcu.h
index 2b19d6c..61fbbe0 100644
--- a/third_party/WebKit/Source/wtf/text/icu/UnicodeIcu.h
+++ b/third_party/WebKit/Source/wtf/text/icu/UnicodeIcu.h
@@ -165,7 +165,7 @@
 
 inline bool isAlphanumeric(UChar32 c)
 {
-    return u_isalnum(c);
+    return !!u_isalnum(c);
 }
 
 inline bool isSeparatorSpace(UChar32 c)
diff --git a/third_party/WebKit/Source/wtf/wtf.gypi b/third_party/WebKit/Source/wtf/wtf.gypi
index 33f7a84..1bb0e6c 100644
--- a/third_party/WebKit/Source/wtf/wtf.gypi
+++ b/third_party/WebKit/Source/wtf/wtf.gypi
@@ -227,7 +227,6 @@
             'text/TextCodecTest.cpp',
             'text/TextCodecReplacementTest.cpp',
             'text/TextCodecUTF8Test.cpp',
-            "text/UTF8Test.cpp",
             'text/WTFStringTest.cpp',
             'typed_arrays/ArrayBufferBuilderTest.cpp',
         ],
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/bindings/main.py b/third_party/WebKit/Tools/Scripts/webkitpy/bindings/main.py
index 16bd986..07bb996a 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/bindings/main.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/bindings/main.py
@@ -233,7 +233,7 @@
             return False
 
         if not filecmp.cmp(reference_filename, output_filename):
-            # cmp is much faster than diff, and usual case is "no differance",
+            # cmp is much faster than diff, and usual case is "no difference",
             # so only run diff if cmp detects a difference
             print 'FAIL: %s' % reference_basename
             print diff(reference_filename, output_filename)
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/common/checkout/baselineoptimizer.py b/third_party/WebKit/Tools/Scripts/webkitpy/common/checkout/baselineoptimizer.py
index ccc8983..40c5ef5 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/common/checkout/baselineoptimizer.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/common/checkout/baselineoptimizer.py
@@ -94,7 +94,7 @@
         # test suite in the name and the virtual baseline name is not a strict superset of the non-virtual name.
         # For example, virtual/gpu/fast/canvas/foo-expected.png corresponds to fast/canvas/foo-expected.png and
         # the baseline directories are like platform/mac/virtual/gpu/fast/canvas. So, to get the path
-        # to the baseline in the platform directory, we need to append jsut foo-expected.png to the directory.
+        # to the baseline in the platform directory, we need to append just foo-expected.png to the directory.
         virtual_suite = self._virtual_suite(baseline_name)
         if virtual_suite:
             baseline_name_without_virtual = baseline_name[len(virtual_suite.name) + 1:]
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/common/checkout/diff_parser_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/common/checkout/diff_parser_unittest.py
index 5dfc903..20391f8 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/common/checkout/diff_parser_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/common/checkout/diff_parser_unittest.py
@@ -45,7 +45,7 @@
         self.assertTrue('WebCore/style/StyleFlexibleBoxData.h' in parser.files)
         diff = parser.files['WebCore/style/StyleFlexibleBoxData.h']
         self.assertEqual(7, len(diff.lines))
-        # The first two unchaged lines.
+        # The first two unchanged lines.
         self.assertEqual((47, 47), diff.lines[0][0:2])
         self.assertEqual('', diff.lines[0][2])
         self.assertEqual((48, 48), diff.lines[1][0:2])
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py
index 72020a9..9f662cd 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/common/checkout/scm/scm_unittest.py
@@ -90,7 +90,7 @@
 
     def _make_diff(self, command, *args):
         # We use this wrapper to disable output decoding. diffs should be treated as
-        # binary files since they may include text files of multiple differnet encodings.
+        # binary files since they may include text files of multiple different encodings.
         return self._run([command, "diff"] + list(args), decode_output=False)
 
     def _git_diff(self, *args):
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/common/host.py b/third_party/WebKit/Tools/Scripts/webkitpy/common/host.py
index d6dd916..186714d 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/common/host.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/common/host.py
@@ -67,7 +67,7 @@
     # We call this from the Host constructor, as it's one of the
     # earliest calls made for all webkitpy-based programs.
     def _engage_awesome_locale_hacks(self):
-        # To make life easier on our non-english users, we override
+        # To make life easier on our non-English users, we override
         # the locale environment variables inside webkitpy.
         # If we don't do this, programs like SVN will output localized
         # messages and svn.py will fail to parse them.
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/common/message_pool.py b/third_party/WebKit/Tools/Scripts/webkitpy/common/message_pool.py
index afce141..720f9db 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/common/message_pool.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/common/message_pool.py
@@ -36,7 +36,7 @@
   may receive events as tasks are processed.
 
 If you don't need these features, use multiprocessing.Pool or concurrency.futures
-intead.
+instead.
 
 """
 
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/common/net/buildbot.py b/third_party/WebKit/Tools/Scripts/webkitpy/common/net/buildbot.py
index 340b0210..2beb0c4 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/common/net/buildbot.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/common/net/buildbot.py
@@ -97,7 +97,7 @@
                      build_number=int(build_dictionary['number']),
                      # 'revision' may be None if a trunk build was started by the force-build button on the web page.
                      revision=(int(revision_string) if revision_string else None),
-                     # Buildbot uses any nubmer other than 0 to mean fail.  Since we fetch with
+                     # Buildbot uses any number other than 0 to mean fail.  Since we fetch with
                      # filter=1, passing builds may contain no 'results' value.
                      is_green=(not build_dictionary.get('results')),
                      )
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/common/prettypatch.py b/third_party/WebKit/Tools/Scripts/webkitpy/common/prettypatch.py
index 32685504..56ea6e0 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/common/prettypatch.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/common/prettypatch.py
@@ -46,7 +46,7 @@
         return diff_file
 
     def pretty_diff(self, diff):
-        # pretify.rb will hang forever if given no input.
+        # prettify.rb will hang forever if given no input.
         # Avoid the hang by returning an empty string.
         if not diff:
             return ""
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/common/system/executive.py b/third_party/WebKit/Tools/Scripts/webkitpy/common/system/executive.py
index 9cf22573..f2efde01 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/common/system/executive.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/common/system/executive.py
@@ -126,7 +126,7 @@
 
     def kill_process(self, pid):
         """Attempts to kill the given pid.
-        Will fail silently if pid does not exist or insufficient permisssions."""
+        Will fail silently if pid does not exist or insufficient permissions."""
         if sys.platform == "win32":
             # We only use taskkill.exe on windows (not cygwin) because subprocess.pid
             # is a CYGWIN pid and taskkill.exe expects a windows pid.
@@ -324,7 +324,7 @@
         # Popen in Python 2.5 and before does not automatically encode unicode objects.
         # http://bugs.python.org/issue5290
         # See https://bugs.webkit.org/show_bug.cgi?id=37528
-        # for an example of a regresion caused by passing a unicode string directly.
+        # for an example of a regression caused by passing a unicode string directly.
         # FIXME: We may need to encode differently on different platforms.
         if isinstance(input, unicode):
             input = input.encode(self._child_process_encoding())
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/common/system/executive_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/common/system/executive_unittest.py
index 60dc264..098c739 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/common/system/executive_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/common/system/executive_unittest.py
@@ -80,7 +80,7 @@
 
 class ExecutiveTest(unittest.TestCase):
 
-    def assert_interpreter_for_content(self, intepreter, content):
+    def assert_interpreter_for_content(self, interpreter, content):
         fs = MockFileSystem()
 
         tempfile, temp_name = fs.open_binary_tempfile('')
@@ -88,7 +88,7 @@
         tempfile.close()
         file_interpreter = Executive.interpreter_for_script(temp_name, fs)
 
-        self.assertEqual(file_interpreter, intepreter)
+        self.assertEqual(file_interpreter, interpreter)
 
     def test_interpreter_for_script(self):
         self.assert_interpreter_for_content(None, '')
@@ -121,7 +121,7 @@
 
     def test_popen_args(self):
         executive = Executive()
-        # Explicitly naming the 'args' argument should not thow an exception.
+        # Explicitly naming the 'args' argument should not throw an exception.
         executive.popen(args=command_line('echo', 1), stdout=executive.PIPE).wait()
 
     def test_run_command_with_unicode(self):
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/common/system/profiler.py b/third_party/WebKit/Tools/Scripts/webkitpy/common/system/profiler.py
index e2653e6..cea68481 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/common/system/profiler.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/common/system/profiler.py
@@ -208,6 +208,6 @@
         self._profiler_process = self._host.executive.popen(cmd)
 
     def profile_after_exit(self):
-        # It seems like a nicer user experiance to wait on the profiler to exit to prevent
+        # It seems like a nicer user experience to wait on the profiler to exit to prevent
         # it from spewing to stderr at odd times.
         self._profiler_process.wait()
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/builders.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/builders.py
index b1320d4f..bc0a39f 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/builders.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/builders.py
@@ -32,7 +32,7 @@
 
 This class is used to keep a list of all builder bots running layout tests on
 the Chromium waterfall. There are other waterfalls that run layout tests but
-this list is the one we care about in the context of TestExpectatoins. The
+this list is the one we care about in the context of TestExpectations. The
 builders are hard coded in the constructor but can be overridden for unit tests.
 
 """
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/layout_package/bot_test_expectations_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/layout_package/bot_test_expectations_unittest.py
index 86af7b6..3310ccf 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/layout_package/bot_test_expectations_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/layout_package/bot_test_expectations_unittest.py
@@ -129,7 +129,7 @@
                     'maybeflaky.html': self._results_from_string('FP'),
                     'notflakypass.html': self._results_from_string('P'),
                     'notflakyfail.html': self._results_from_string('F'),
-                    # Even if there are no expected results, it's not very flaky if it didn't do mulitple retries.
+                    # Even if there are no expected results, it's not very flaky if it didn't do multiple retries.
                     # This accounts for the latest expectations not necessarily matching the expectations
                     # at the time of the given run.
                     'notverflakynoexpected.html': self._results_from_string('FT'),
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/models/test_configuration.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/models/test_configuration.py
index f9bebf8..62372c1 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/models/test_configuration.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/models/test_configuration.py
@@ -285,7 +285,7 @@
         while try_abbreviating(self._collapsing_sets_by_size.values()):
             pass
 
-        # 4) Substitute specifier subsets that match macros witin each set:
+        # 4) Substitute specifier subsets that match macros within each set:
         #   (win7, win10, release) -> (win, release)
         self.collapse_macros(self._configuration_macros, specifiers_list)
 
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/models/test_expectations.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/models/test_expectations.py
index df9e5ec..20a0571 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/models/test_expectations.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/models/test_expectations.py
@@ -47,7 +47,7 @@
 (PASS, FAIL, TEXT, IMAGE, IMAGE_PLUS_TEXT, AUDIO, TIMEOUT, CRASH, LEAK, SKIP, WONTFIX,
  SLOW, REBASELINE, NEEDS_REBASELINE, NEEDS_MANUAL_REBASELINE, MISSING, FLAKY, NOW, NONE) = range(19)
 
-# FIXME: Perhas these two routines should be part of the Port instead?
+# FIXME: Perhaps these two routines should be part of the Port instead?
 BASELINE_SUFFIX_LIST = ('png', 'wav', 'txt')
 
 WEBKIT_BUG_PREFIX = 'webkit.org/b/'
@@ -652,7 +652,7 @@
         return self._test_to_expectations[test]
 
     def get_expectations_string(self, test):
-        """Returns the expectatons for the given test as an uppercase string.
+        """Returns the expectations for the given test as an uppercase string.
         If there are no expectations for the test, then "PASS" is returned."""
         if self.get_expectation_line(test).is_skipped_outside_expectations_file:
             return 'NOTRUN'
@@ -729,7 +729,7 @@
             self._result_type_to_tests[FAIL].add(test)
 
     def _clear_expectations_for_test(self, test):
-        """Remove prexisting expectations for this test.
+        """Remove preexisting expectations for this test.
         This happens if we are seeing a more precise path
         than a previous listing.
         """
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/android_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/android_unittest.py
index 5d014e37..42a052d 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/android_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/android_unittest.py
@@ -49,7 +49,7 @@
 INVALID_ENTRIES_TOMBSTONE_TEST_TYPE = 4
 
 # Any "adb" commands will be interpret by this class instead of executing actual
-# commansd on the file system, which we don't want to do.
+# commands on the file system, which we don't want to do.
 
 
 class MockAndroidDebugBridge:
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/base.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/base.py
index 804614f..321aebc 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/base.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/base.py
@@ -266,7 +266,7 @@
             # memory usage may also grow over time, up to a certain point.
             # Relaunching the driver periodically helps keep it under control.
             return 40
-        # The default is infinte batch size.
+        # The default is infinite batch size.
         return None
 
     def default_child_processes(self):
@@ -508,12 +508,12 @@
 
         executable = self._path_to_image_diff()
         # Note that although we are handed 'old', 'new', image_diff wants 'new', 'old'.
-        comand = [executable, '--diff', native_actual_filename, native_expected_filename, native_diff_filename]
+        command = [executable, '--diff', native_actual_filename, native_expected_filename, native_diff_filename]
 
         result = None
         err_str = None
         try:
-            exit_code = self._executive.run_command(comand, return_exit_code=True)
+            exit_code = self._executive.run_command(command, return_exit_code=True)
             if exit_code == 0:
                 # The images are the same.
                 result = None
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/browser_test.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/browser_test.py
index c95a770..965d180 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/browser_test.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/browser_test.py
@@ -52,7 +52,7 @@
         return browser_test_driver.BrowserTestDriver
 
     def layout_tests_dir(self):
-        """Overriden function from the base port class. Redirects everything
+        """Overridden function from the base port class. Redirects everything
         to src/chrome/test/data/printing/layout_tests.
         """
         return self.path_from_chromium_base('chrome', 'test', 'data', 'printing', 'layout_tests')  # pylint: disable=E1101
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/win.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/win.py
index a9c39b1..b4ee4944 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/win.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/win.py
@@ -111,7 +111,7 @@
         # see comments in check_httpd(), above, for why this routine exists and what it's doing.
         try:
             # Note that we HKCR is a union of HKLM and HKCR (with the latter
-            # overridding the former), so reading from HKCR ensures that we get
+            # overriding the former), so reading from HKCR ensures that we get
             # the value if it is set in either place. See als comments below.
             hkey = _winreg.OpenKey(_winreg.HKEY_CLASSES_ROOT, sub_key)
             args = _winreg.QueryValue(hkey, '').split()
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/style/checkers/cpp.py b/third_party/WebKit/Tools/Scripts/webkitpy/style/checkers/cpp.py
index fbddf6a..ef1f765 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/style/checkers/cpp.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/style/checkers/cpp.py
@@ -247,11 +247,11 @@
     text = sub(r'(?<=[A-Za-z0-9])([A-Z])(?=[a-z])', r'_\1', text)
 
     # Next add underscores before capitals at the end of words if it was
-    # preceeded by lower case letter or number.
+    # preceded by lower case letter or number.
     # (This puts an underscore before A in isA but not A in CBA).
     text = sub(r'(?<=[a-z0-9])([A-Z])(?=\b)', r'_\1', text)
 
-    # Next add underscores when you have a captial letter which is followed by a capital letter
+    # Next add underscores when you have a capital letter which is followed by a capital letter
     # but is not proceeded by one. (This puts an underscore before A in 'WordADay').
     text = sub(r'(?<=[a-z0-9])([A-Z][A-Z_])', r'_\1', text)
 
@@ -479,7 +479,7 @@
 
 
 def find_parameter_name_index(skeleton_parameter):
-    """Determines where the parametere name starts given the skeleton parameter."""
+    """Determines where the parameter name starts given the skeleton parameter."""
     # The first space from the right in the simplified parameter is where the parameter
     # name starts unless the first space is before any content in the simplified parameter.
     before_name_index = skeleton_parameter.rstrip().rfind(' ')
@@ -1675,7 +1675,7 @@
     http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Write_Short_Functions
 
     Blank/comment lines are not counted so as to avoid encouraging the removal
-    of vertical space and commments just to get through a lint check.
+    of vertical space and comments just to get through a lint check.
     NOLINT *on the last line of a function* disables this check.
 
     Args:
@@ -2308,7 +2308,7 @@
 
 def check_ctype_functions(clean_lines, line_number, file_state, error):
     """Looks for use of the standard functions in ctype.h and suggest they be replaced
-       by use of equivilent ones in <wtf/ASCIICType.h>?.
+       by use of equivalent ones in <wtf/ASCIICType.h>?.
 
     Args:
       clean_lines: A CleansedLines instance containing the file.
@@ -2327,7 +2327,7 @@
 
     ctype_function = ctype_function_search.group('ctype_function')
     error(line_number, 'runtime/ctype_function', 4,
-          'Use equivelent function in <wtf/ASCIICType.h> instead of the %s() function.'
+          'Use equivalent function in <wtf/ASCIICType.h> instead of the %s() function.'
           % (ctype_function))
 
 
@@ -3404,7 +3404,7 @@
                 continue
             # A catch all for tricky sizeof cases, including 'sizeof expression',
             # 'sizeof(*type)', 'sizeof(const type)', 'sizeof(struct StructName)'
-            # requires skipping the next token becasue we split on ' ' and '*'.
+            # requires skipping the next token because we split on ' ' and '*'.
             if tok.startswith('sizeof'):
                 skip_next = True
                 continue
@@ -3621,7 +3621,7 @@
             except UnicodeDecodeError:
                 # There would be no non-ascii characters in the codebase ever. The only exception
                 # would be comments/copyright text which might have non-ascii characters. Hence,
-                # it is prefectly safe to catch the UnicodeDecodeError and just pass the line.
+                # it is perfectly safe to catch the UnicodeDecodeError and just pass the line.
                 pass
 
         return matches
@@ -4058,7 +4058,7 @@
       filename: Filename of the file that is being processed.
       file_extension: The extension (dot not included) of the file.
       lines: An array of strings, each representing a line of the file, with the
-             last element being empty if the file is termined with a newline.
+             last element being empty if the file is terminated with a newline.
       error: A callable to which errors are reported, which takes 4 arguments:
     """
     lines = (['// marker so line numbers and indices both start at 1'] + lines +
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/style/checkers/cpp_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/style/checkers/cpp_unittest.py
index d3b549f..25c89c5 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/style/checkers/cpp_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/style/checkers/cpp_unittest.py
@@ -2424,7 +2424,7 @@
             '  [runtime/printf_format] [3]')
 
         self.assert_lint(
-            r'snprintf(file, "Never mix %d and %1$d parmaeters!", value);',
+            r'snprintf(file, "Never mix %d and %1$d parameters!", value);',
             '%N$ formats are unconventional.  Try rewriting to avoid them.'
             '  [runtime/printf_format] [2]')
 
@@ -4909,7 +4909,7 @@
     def test_ctype_fucntion(self):
         self.assert_lint(
             'int i = isascii(8);',
-            'Use equivelent function in <wtf/ASCIICType.h> instead of the '
+            'Use equivalent function in <wtf/ASCIICType.h> instead of the '
             'isascii() function.  [runtime/ctype_function] [4]',
             'foo.cpp')
 
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/style/filter_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/style/filter_unittest.py
index 2f46649..25d0f21 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/style/filter_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/style/filter_unittest.py
@@ -38,7 +38,7 @@
 # Part of the reason is that it is not immediately clear what
 # expression the unittest module uses to assert "not equals" -- the
 # negation of __eq__() or __ne__(), which are not necessarily
-# equivalent expresions in Python.  For example, from Python's "Data
+# equivalent expressions in Python.  For example, from Python's "Data
 # Model" documentation--
 #
 #   "There are no implied relationships among the comparison
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/style/optparser.py b/third_party/WebKit/Tools/Scripts/webkitpy/style/optparser.py
index cf7520e..fbd7619 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/style/optparser.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/style/optparser.py
@@ -310,7 +310,7 @@
                           dest="filter_value", help=filter_help)
 
         git_commit_help = ("check all changes in the given commit. "
-                           "Use 'commit_id..' to check all changes after commmit_id")
+                           "Use 'commit_id..' to check all changes after commit_id")
         parser.add_option("-g", "--git-diff", "--git-commit",
                           metavar="COMMIT", dest="git_commit", help=git_commit_help,)
 
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/command.py b/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/command.py
index 28ecb92..e570cbb 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/command.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/command.py
@@ -48,7 +48,7 @@
         self.options = options
         self.requires_local_commits = requires_local_commits
         self._tool = None
-        # option_parser can be overriden by the tool using set_option_parser
+        # option_parser can be overridden by the tool using set_option_parser
         # This default parser will be used for standalone_help printing.
         self.option_parser = HelpPrintingOptionParser(usage=optparse.SUPPRESS_USAGE, add_help_option=False, option_list=self.options)
 
@@ -141,7 +141,7 @@
     def error(self, msg):
         self.print_usage(sys.stderr)
         error_message = "%s: error: %s\n" % (self.get_prog_name(), msg)
-        # This method is overriden to add this one line to the output:
+        # This method is overridden to add this one line to the output:
         error_message += "\nType \"%s --help\" to see usage.\n" % self.get_prog_name()
         self.exit(1, error_message)
 
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/flakytests.py b/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/flakytests.py
index fda7f96..5b5f1c8f 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/flakytests.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/flakytests.py
@@ -117,8 +117,8 @@
         lines = filter(lambda line: fs.exists(fs.join(port.layout_tests_dir(), line.path)), lines)
 
         test_names = [line.name for line in lines]
-        flakiness_dashbord_url = self.FLAKINESS_DASHBOARD_URL % ','.join(test_names)
+        flakiness_dashboard_url = self.FLAKINESS_DASHBOARD_URL % ','.join(test_names)
         expectations_string = TestExpectations.list_to_string(lines)
 
         # pylint: disable=E1601
-        print self.OUTPUT % (self.HEADER, expectations_string, flakiness_dashbord_url)
+        print self.OUTPUT % (self.HEADER, expectations_string, flakiness_dashboard_url)
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/deps_updater.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/deps_updater.py
index 2cfe95f..a588c90 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/deps_updater.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/deps_updater.py
@@ -150,7 +150,7 @@
 
     def commit_changes_if_needed(self, chromium_commitish, import_commitish):
         if self.run(['git', 'diff', '--quiet', 'HEAD'], exit_on_failure=False)[0]:
-            self.print_('## commiting changes')
+            self.print_('## committing changes')
             commit_msg = ('Import %s\n'
                           '\n'
                           'Using update-w3c-deps in Chromium %s.\n'
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_converter.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_converter.py
index 2bffdbbe..44e9eb5e 100755
--- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_converter.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_converter.py
@@ -41,7 +41,7 @@
 def convert_for_webkit(new_path, filename, reference_support_info, host=Host()):
     """ Converts a file's |contents| so it will function correctly in its |new_path| in Webkit.
 
-    Returns the list of modified properties and the modified text if the file was modifed, None otherwise."""
+    Returns the list of modified properties and the modified text if the file was modified, None otherwise."""
     contents = host.filesystem.read_binary_file(filename)
     converter = _W3CTestConverter(new_path, filename, reference_support_info, host)
     if filename.endswith('.css'):
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_converter_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_converter_unittest.py
index b1904cfd..e49044c 100755
--- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_converter_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_converter_unittest.py
@@ -414,7 +414,7 @@
             expected_path = re.sub(reference_support_info['reference_relpath'], '', path, 1)
             element = reference_support_info['elements'][idx]
             expected_tag = '<' + element + ' src=\"' + expected_path + '\">'
-            self.assertTrue(expected_tag in converted[1], 'relative path ' + path + ' was not converted correcty')
+            self.assertTrue(expected_tag in converted[1], 'relative path ' + path + ' was not converted correctly')
             idx += 1
 
     def generate_test_content(self, full_property_list, num_test_properties, html):
diff --git a/third_party/WebKit/public/platform/modules/notifications/WebNotificationManager.h b/third_party/WebKit/public/platform/modules/notifications/WebNotificationManager.h
index 1e6ced9..08cd676 100644
--- a/third_party/WebKit/public/platform/modules/notifications/WebNotificationManager.h
+++ b/third_party/WebKit/public/platform/modules/notifications/WebNotificationManager.h
@@ -16,8 +16,10 @@
 namespace blink {
 
 namespace mojom {
+namespace blink {
 enum class PermissionStatus;
 }
+}
 
 class WebNotificationDelegate;
 class WebSecurityOrigin;
@@ -62,7 +64,7 @@
     virtual void notifyDelegateDestroyed(WebNotificationDelegate*) = 0;
 
     // Synchronously checks the permission level for the given origin.
-    virtual mojom::PermissionStatus checkPermission(const WebSecurityOrigin&) = 0;
+    virtual mojom::blink::PermissionStatus checkPermission(const WebSecurityOrigin&) = 0;
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/public/web/WebFrame.h b/third_party/WebKit/public/web/WebFrame.h
index 5b3d907..c1245a3a 100644
--- a/third_party/WebKit/public/web/WebFrame.h
+++ b/third_party/WebKit/public/web/WebFrame.h
@@ -419,8 +419,8 @@
     // Supports commands like Undo, Redo, Cut, Copy, Paste, SelectAll,
     // Unselect, etc. See EditorCommand.cpp for the full list of supported
     // commands.
-    virtual bool executeCommand(const WebString&, const WebNode& = WebNode()) = 0;
-    virtual bool executeCommand(const WebString&, const WebString& value, const WebNode& = WebNode()) = 0;
+    virtual bool executeCommand(const WebString&) = 0;
+    virtual bool executeCommand(const WebString&, const WebString& value) = 0;
     virtual bool isCommandEnabled(const WebString&) const = 0;
 
     // Spell-checking support.
diff --git a/third_party/WebKit/public/web/WebFrameClient.h b/third_party/WebKit/public/web/WebFrameClient.h
index 5f78450..7bf90c6b 100644
--- a/third_party/WebKit/public/web/WebFrameClient.h
+++ b/third_party/WebKit/public/web/WebFrameClient.h
@@ -581,23 +581,15 @@
 
     virtual WebMIDIClient* webMIDIClient() { return 0; }
 
-
-    // Messages ------------------------------------------------------
-
-    // Notifies the embedder that a postMessage was issued on this frame, and
-    // gives the embedder a chance to handle it instead of WebKit. Returns true
-    // if the embedder handled it.
-    virtual bool willCheckAndDispatchMessageEvent(
-        WebLocalFrame* sourceFrame,
-        WebFrame* targetFrame,
-        WebSecurityOrigin target,
-        WebDOMMessageEvent event) { return false; }
+    // User agent ------------------------------------------------------
 
     // Asks the embedder if a specific user agent should be used. Non-empty
     // strings indicate an override should be used. Otherwise,
     // Platform::current()->userAgent() will be called to provide one.
     virtual WebString userAgentOverride() { return WebString(); }
 
+    // Do not track ----------------------------------------------------
+
     // Asks the embedder what value the network stack will send for the DNT
     // header. An empty string indicates that no DNT header will be send.
     virtual WebString doNotTrackValue() { return WebString(); }
diff --git a/third_party/WebKit/public/web/WebFrameSerializer.h b/third_party/WebKit/public/web/WebFrameSerializer.h
index ecf4acfb..a6d681b3 100644
--- a/third_party/WebKit/public/web/WebFrameSerializer.h
+++ b/third_party/WebKit/public/web/WebFrameSerializer.h
@@ -36,6 +36,7 @@
 #include "../platform/WebString.h"
 #include "../platform/WebURL.h"
 #include "../platform/WebVector.h"
+#include "WebFrameSerializerCacheControlPolicy.h"
 
 namespace blink {
 
@@ -47,7 +48,8 @@
 // Serialization of frame contents into html or mhtml.
 class WebFrameSerializer {
 public:
-    // Generates and returns an MHTML header.
+    // Generates an MHTML header; returns false if an error occurred.  The
+    // header will be returned via the WebData out-param.
     //
     // Contents of the header (i.e. title and mime type) will be based
     // on the frame passed as an argument (which typically should be
@@ -56,8 +58,9 @@
     // Same |boundary| needs to used for all generateMHTMLHeader and
     // generateMHTMLParts and generateMHTMLFooter calls that belong to the same
     // MHTML document (see also rfc1341, section 7.2.1, "boundary" description).
-    BLINK_EXPORT static WebData generateMHTMLHeader(
-        const WebString& boundary, WebLocalFrame*);
+    BLINK_EXPORT static bool generateMHTMLHeader(
+        const WebString& boundary, WebFrameSerializerCacheControlPolicy, WebLocalFrame*,
+        WebData*);
 
     // Delegate for controling the behavior of generateMHTMLParts method.
     class MHTMLPartsGenerationDelegate {
diff --git a/third_party/WebKit/public/web/WebFrameSerializerCacheControlPolicy.h b/third_party/WebKit/public/web/WebFrameSerializerCacheControlPolicy.h
new file mode 100644
index 0000000..baf1be6
--- /dev/null
+++ b/third_party/WebKit/public/web/WebFrameSerializerCacheControlPolicy.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 WebFrameSerializerCacheControlPolicy_h
+#define WebFrameSerializerCacheControlPolicy_h
+
+namespace blink {
+
+// WebFrameSerializerCacheControlPolicy configures how WebFrameSerializer
+// processes resources with different Cache-Control headers. By default, frame
+// serialization encompasses all resources in a page.  If it is desirable to
+// serialize only those resources that could be stored by a http cache, the
+// other options may be used.
+// TODO(dewittj): Add more policies for subframes and subresources.
+enum class WebFrameSerializerCacheControlPolicy {
+    None = 0,
+    FailForNoStoreMainFrame,
+    Last = FailForNoStoreMainFrame,
+};
+
+} // namespace blink
+
+#endif // WebFrameSerializerCacheControlPolicy_h
diff --git a/third_party/WebKit/public/web/WebNode.h b/third_party/WebKit/public/web/WebNode.h
index 9eea370b..7513449 100644
--- a/third_party/WebKit/public/web/WebNode.h
+++ b/third_party/WebKit/public/web/WebNode.h
@@ -108,6 +108,8 @@
     template<typename T> const T toConst() const;
 
 #if BLINK_IMPLEMENTATION
+    BLINK_EXPORT static WebPluginContainer* pluginContainerFromNode(const Node*);
+
     BLINK_EXPORT WebNode(Node*);
     BLINK_EXPORT WebNode& operator=(Node*);
     BLINK_EXPORT operator Node*() const;
diff --git a/third_party/WebKit/public/web/WebRemoteFrameClient.h b/third_party/WebKit/public/web/WebRemoteFrameClient.h
index 2e62c35..6717d83 100644
--- a/third_party/WebKit/public/web/WebRemoteFrameClient.h
+++ b/third_party/WebKit/public/web/WebRemoteFrameClient.h
@@ -26,11 +26,11 @@
     virtual void frameDetached(DetachType) { }
 
     // Notifies the embedder that a postMessage was issued to a remote frame.
-    virtual void postMessageEvent(
+    virtual void forwardPostMessage(
         WebLocalFrame* sourceFrame,
         WebRemoteFrame* targetFrame,
         WebSecurityOrigin targetOrigin,
-        WebDOMMessageEvent) { }
+        WebDOMMessageEvent) {}
 
     // Send initial drawing parameters to a child frame that is being rendered
     // out of process.
diff --git a/third_party/WebKit/public/web/WebRuntimeFeatures.h b/third_party/WebKit/public/web/WebRuntimeFeatures.h
index 1c0c4b4..ac9322f 100644
--- a/third_party/WebKit/public/web/WebRuntimeFeatures.h
+++ b/third_party/WebKit/public/web/WebRuntimeFeatures.h
@@ -64,8 +64,8 @@
     BLINK_EXPORT static void forceDisplayList2dCanvas(bool);
     BLINK_EXPORT static void forceDisable2dCanvasCopyOnWrite(bool);
 
-    BLINK_EXPORT static void enableExperimentalFramework(bool);
-    BLINK_EXPORT static bool isExperimentalFrameworkEnabled();
+    BLINK_EXPORT static void enableOriginTrials(bool);
+    BLINK_EXPORT static bool isOriginTrialsEnabled();
 
     BLINK_EXPORT static void enableApplicationCache(bool);
     BLINK_EXPORT static void enableAudioOutputDevices(bool);
diff --git a/third_party/WebKit/public/web/modules/notifications/WebNotificationPermissionCallback.h b/third_party/WebKit/public/web/modules/notifications/WebNotificationPermissionCallback.h
index 0699fd7..cfb0f24e 100644
--- a/third_party/WebKit/public/web/modules/notifications/WebNotificationPermissionCallback.h
+++ b/third_party/WebKit/public/web/modules/notifications/WebNotificationPermissionCallback.h
@@ -31,7 +31,7 @@
 #ifndef WebNotificationPermissionCallback_h
 #define WebNotificationPermissionCallback_h
 
-#include "public/platform/modules/permissions/permission_status.mojom.h"
+#include "public/platform/modules/permissions/permission_status.mojom-blink.h"
 
 namespace blink {
 
@@ -42,7 +42,7 @@
 
     // Method to be invoked when the asynchronous permission request for the
     // ability to display Web Notifications has been completed.
-    virtual void permissionRequestComplete(mojom::PermissionStatus) = 0;
+    virtual void permissionRequestComplete(mojom::blink::PermissionStatus) = 0;
 };
 
 } // namespace blink
diff --git a/third_party/brotli/.gitignore b/third_party/brotli/.gitignore
deleted file mode 100644
index a9f411e..0000000
--- a/third_party/brotli/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-*.o
-*.txt.uncompressed
-*.bro
-*.unbro
-/tools/bro
diff --git a/third_party/brotli/BUILD.gn b/third_party/brotli/BUILD.gn
index e25cf2b..5b13e6f 100644
--- a/third_party/brotli/BUILD.gn
+++ b/third_party/brotli/BUILD.gn
@@ -30,3 +30,70 @@
 
   include_dirs = [ "dec" ]
 }
+
+if (current_toolchain == host_toolchain) {
+  executable("bro") {
+    sources = [
+      "enc/backward_references.cc",
+      "enc/backward_references.h",
+      "enc/bit_cost.h",
+      "enc/block_splitter.cc",
+      "enc/block_splitter.h",
+      "enc/brotli_bit_stream.cc",
+      "enc/brotli_bit_stream.h",
+      "enc/cluster.h",
+      "enc/command.h",
+      "enc/compress_fragment.cc",
+      "enc/compress_fragment.h",
+      "enc/compress_fragment_two_pass.cc",
+      "enc/compress_fragment_two_pass.h",
+      "enc/compressor.h",
+      "enc/context.h",
+      "enc/dictionary_hash.h",
+      "enc/encode.cc",
+      "enc/encode.h",
+      "enc/encode_parallel.cc",
+      "enc/encode_parallel.h",
+      "enc/entropy_encode.cc",
+      "enc/entropy_encode.h",
+      "enc/entropy_encode_static.h",
+      "enc/fast_log.h",
+      "enc/find_match_length.h",
+      "enc/hash.h ",
+      "enc/histogram.cc",
+      "enc/histogram.h",
+      "enc/literal_cost.cc",
+      "enc/literal_cost.h",
+      "enc/metablock.cc",
+      "enc/metablock.h",
+      "enc/port.h ",
+      "enc/prefix.h",
+      "enc/ringbuffer.h",
+      "enc/static_dict.cc",
+      "enc/static_dict.h",
+      "enc/static_dict_lut.h",
+      "enc/streams.cc",
+      "enc/streams.h",
+      "enc/transform.h",
+      "enc/types.h",
+      "enc/utf8_util.cc",
+      "enc/utf8_util.h",
+      "enc/write_bits.h",
+      "tools/bro.cc",
+    ]
+    deps = [
+      ":brotli",
+    ]
+
+    # Always build release since this is a build tool.
+    if (is_debug) {
+      configs -= [ "//build/config:debug" ]
+      configs += [ "//build/config:release" ]
+    }
+    if (is_posix) {
+      configs -= [ "//build/config/gcc:no_exceptions" ]
+    } else if (is_win) {
+      cflags_cc = [ "/EHsc" ]
+    }
+  }
+}
diff --git a/third_party/brotli/README.chromium b/third_party/brotli/README.chromium
index 45f649c..52115cd 100644
--- a/third_party/brotli/README.chromium
+++ b/third_party/brotli/README.chromium
@@ -1,6 +1,6 @@
 Name: Brotli
 URL: https://github.com/google/brotli
-Version: 510131d1db47f91602f45b9a8d7b1ee54d12a629
+Version: 45f130ac4c5d2abf13e0ed1e9a3e08369c6b9c34
 License: MIT
 License File: LICENSE
 Security Critical: yes
@@ -11,8 +11,10 @@
 to decode WOFF 2.0 fonts.
 
 Local Modifications:
-- This only includes the dec/ directory, the README.md and the LICENSE
-  files, removing unneeded direcories such as encoder, tests, and tools.
-- .gitignore: Added.
+- This only includes the enc/, dec/ and tools/ directories, the README.md and
+  the LICENSE files, removing unneeded direcories such as docs, tests, and
+  tools.
 - BUILD.gn: Added.
 - brotli.gyp: Added.
+- enc/static_dict_lut.h: split up into two files (enc/static_dict_lut.h,
+  enc/static_dict_lut2.h) to allow upload to codereview.
diff --git a/third_party/brotli/brotli.gni b/third_party/brotli/brotli.gni
new file mode 100644
index 0000000..f4ed9d2
--- /dev/null
+++ b/third_party/brotli/brotli.gni
@@ -0,0 +1,35 @@
+# 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.
+
+import("//build/compiled_action.gni")
+
+# Compresses a file with brotli.
+#
+# Variables
+#   input_file: Path to input file.
+#   output_file: Path to output file.
+#
+template("compress_file_brotli") {
+  compiled_action(target_name) {
+    forward_variables_from(invoker,
+                           [
+                             "deps",
+                             "testonly",
+                           ])
+    tool = "//third_party/brotli:bro"
+    inputs = [
+      invoker.input_file,
+    ]
+    outputs = [
+      invoker.output_file,
+    ]
+    args = [
+      "--force",
+      "--input",
+      rebase_path(invoker.input_file, root_build_dir),
+      "--output",
+      rebase_path(invoker.output_file, root_build_dir),
+    ]
+  }
+}
diff --git a/third_party/brotli/dec/Makefile b/third_party/brotli/dec/Makefile
deleted file mode 100644
index 4d11ed1..0000000
--- a/third_party/brotli/dec/Makefile
+++ /dev/null
@@ -1,12 +0,0 @@
-#brotli/dec
-
-include ../shared.mk
-
-CFLAGS += -Wall
-
-OBJS = bit_reader.o decode.o dictionary.o huffman.o state.o
-
-all : $(OBJS)
-
-clean :
-	rm -f $(OBJS)
diff --git a/third_party/brotli/dec/decode.c b/third_party/brotli/dec/decode.c
index a3cc89e..d5abd6ed 100644
--- a/third_party/brotli/dec/decode.c
+++ b/third_party/brotli/dec/decode.c
@@ -835,7 +835,7 @@
   /* Reinitialize elements that could have been changed. */
   uint32_t i = 4;
   uint32_t upper_bound = state->mtf_upper_bound;
-  uint8_t* mtf = state->mtf;
+  uint8_t* mtf = &state->mtf[4];  /* Make mtf[-1] addressable. */
   /* Load endian-aware constant. */
   const uint8_t b0123[4] = {0, 1, 2, 3};
   uint32_t pattern;
@@ -856,11 +856,11 @@
     uint8_t value = mtf[index];
     upper_bound |= v[i];
     v[i] = value;
+    mtf[-1] = value;
     do {
       index--;
       mtf[index + 1] = mtf[index];
-    } while (index > 0);
-    mtf[0] = value;
+    } while (index >= 0);
   }
   /* Remember amount of elements to be reinitialized. */
   state->mtf_upper_bound = upper_bound;
@@ -1279,12 +1279,6 @@
     }
   }
 
-  /* Limit custom dictionary size to stream window size. */
-  if (s->custom_dict_size >= window_size) {
-    s->custom_dict += s->custom_dict_size - window_size;
-    s->custom_dict_size = window_size;
-  }
-
   /* We need at least 2 bytes of ring buffer size to get the last two
      bytes for context from there */
   if (is_last) {
@@ -1900,7 +1894,13 @@
           result = BROTLI_FAILURE();
           break;
         }
+        /* Maximum distance, see section 9.1. of the spec. */
         s->max_backward_distance = (1 << s->window_bits) - 16;
+        /* Limit custom dictionary size. */
+        if (s->custom_dict_size >= s->max_backward_distance) {
+          s->custom_dict += s->custom_dict_size - s->max_backward_distance;
+          s->custom_dict_size = s->max_backward_distance;
+        }
         s->max_backward_distance_minus_custom_dict_size =
             s->max_backward_distance - s->custom_dict_size;
 
@@ -2208,6 +2208,9 @@
 
 void BrotliSetCustomDictionary(
     size_t size, const uint8_t* dict, BrotliState* s) {
+  if (size > (1u << 24)) {
+    return;
+  }
   s->custom_dict = dict;
   s->custom_dict_size = (int)size;
 }
diff --git a/third_party/brotli/dec/decode.h b/third_party/brotli/dec/decode.h
index 7ac771e..4a7bcd1 100644
--- a/third_party/brotli/dec/decode.h
+++ b/third_party/brotli/dec/decode.h
@@ -79,8 +79,9 @@
 /* Fills the new state with a dictionary for LZ77, warming up the ringbuffer,
    e.g. for custom static dictionaries for data formats.
    Not to be confused with the built-in transformable dictionary of Brotli.
-   The dictionary must exist in memory until decoding is done and is owned by
-   the caller. To use:
+   |size| should be less or equal to 2^24 (16MiB), otherwise the dictionary will
+   be ignored. The dictionary must exist in memory until decoding is done and
+   is owned by the caller. To use:
     1) Allocate and initialize state with BrotliCreateState
     2) Use BrotliSetCustomDictionary
     3) Use BrotliDecompressStream
diff --git a/third_party/brotli/dec/state.h b/third_party/brotli/dec/state.h
index 3360372..d85239e 100644
--- a/third_party/brotli/dec/state.h
+++ b/third_party/brotli/dec/state.h
@@ -193,7 +193,7 @@
 
   /* For InverseMoveToFrontTransform */
   uint32_t mtf_upper_bound;
-  uint8_t mtf[256];
+  uint8_t mtf[256 + 4];
 
   /* For custom dictionaries */
   const uint8_t* custom_dict;
diff --git a/third_party/brotli/enc/backward_references.cc b/third_party/brotli/enc/backward_references.cc
new file mode 100644
index 0000000..539c1e7
--- /dev/null
+++ b/third_party/brotli/enc/backward_references.cc
@@ -0,0 +1,858 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Function to find backward reference copies.
+
+#include "./backward_references.h"
+
+#include <algorithm>
+#include <limits>
+#include <vector>
+
+#include "./command.h"
+#include "./fast_log.h"
+#include "./literal_cost.h"
+
+namespace brotli {
+
+// The maximum length for which the zopflification uses distinct distances.
+static const uint16_t kMaxZopfliLen = 325;
+
+// Histogram based cost model for zopflification.
+class ZopfliCostModel {
+ public:
+  ZopfliCostModel(void) : min_cost_cmd_(kInfinity) {}
+
+  void SetFromCommands(size_t num_bytes,
+                       size_t position,
+                       const uint8_t* ringbuffer,
+                       size_t ringbuffer_mask,
+                       const Command* commands,
+                       size_t num_commands,
+                       size_t last_insert_len) {
+    std::vector<uint32_t> histogram_literal(256, 0);
+    std::vector<uint32_t> histogram_cmd(kNumCommandPrefixes, 0);
+    std::vector<uint32_t> histogram_dist(kNumDistancePrefixes, 0);
+
+    size_t pos = position - last_insert_len;
+    for (size_t i = 0; i < num_commands; i++) {
+      size_t inslength = commands[i].insert_len_;
+      size_t copylength = commands[i].copy_len();
+      size_t distcode = commands[i].dist_prefix_;
+      size_t cmdcode = commands[i].cmd_prefix_;
+
+      histogram_cmd[cmdcode]++;
+      if (cmdcode >= 128) histogram_dist[distcode]++;
+
+      for (size_t j = 0; j < inslength; j++) {
+        histogram_literal[ringbuffer[(pos + j) & ringbuffer_mask]]++;
+      }
+
+      pos += inslength + copylength;
+    }
+
+    std::vector<float> cost_literal;
+    Set(histogram_literal, &cost_literal);
+    Set(histogram_cmd, &cost_cmd_);
+    Set(histogram_dist, &cost_dist_);
+
+    for (uint32_t i = 0; i < kNumCommandPrefixes; ++i) {
+      min_cost_cmd_ = std::min(min_cost_cmd_, cost_cmd_[i]);
+    }
+
+    literal_costs_.resize(num_bytes + 1);
+    literal_costs_[0] = 0.0;
+    for (size_t i = 0; i < num_bytes; ++i) {
+      literal_costs_[i + 1] = literal_costs_[i] +
+          cost_literal[ringbuffer[(position + i) & ringbuffer_mask]];
+    }
+  }
+
+  void SetFromLiteralCosts(size_t num_bytes,
+                           size_t position,
+                           const uint8_t* ringbuffer,
+                           size_t ringbuffer_mask) {
+    literal_costs_.resize(num_bytes + 2);
+    EstimateBitCostsForLiterals(position, num_bytes, ringbuffer_mask,
+                                ringbuffer, &literal_costs_[1]);
+    literal_costs_[0] = 0.0;
+    for (size_t i = 0; i < num_bytes; ++i) {
+      literal_costs_[i + 1] += literal_costs_[i];
+    }
+    cost_cmd_.resize(kNumCommandPrefixes);
+    cost_dist_.resize(kNumDistancePrefixes);
+    for (uint32_t i = 0; i < kNumCommandPrefixes; ++i) {
+      cost_cmd_[i] = static_cast<float>(FastLog2(11 + i));
+    }
+    for (uint32_t i = 0; i < kNumDistancePrefixes; ++i) {
+      cost_dist_[i] = static_cast<float>(FastLog2(20 + i));
+    }
+    min_cost_cmd_ = static_cast<float>(FastLog2(11));
+  }
+
+  float GetCommandCost(
+      size_t dist_code, size_t length_code, size_t insert_length) const {
+    uint16_t inscode = GetInsertLengthCode(insert_length);
+    uint16_t copycode = GetCopyLengthCode(length_code);
+    uint16_t cmdcode = CombineLengthCodes(inscode, copycode, dist_code == 0);
+    uint16_t dist_symbol;
+    uint32_t distextra;
+    PrefixEncodeCopyDistance(dist_code, 0, 0, &dist_symbol, &distextra);
+    uint32_t distnumextra = distextra >> 24;
+
+    float result = static_cast<float>(
+        GetInsertExtra(inscode) + GetCopyExtra(copycode) + distnumextra);
+    result += cost_cmd_[cmdcode];
+    if (cmdcode >= 128) result += cost_dist_[dist_symbol];
+    return result;
+  }
+
+  float GetLiteralCosts(size_t from, size_t to) const {
+    return literal_costs_[to] - literal_costs_[from];
+  }
+
+  float GetMinCostCmd(void) const {
+    return min_cost_cmd_;
+  }
+
+ private:
+  void Set(const std::vector<uint32_t>& histogram, std::vector<float>* cost) {
+    cost->resize(histogram.size());
+    size_t sum = 0;
+    for (size_t i = 0; i < histogram.size(); i++) {
+      sum += histogram[i];
+    }
+    float log2sum = static_cast<float>(FastLog2(sum));
+    for (size_t i = 0; i < histogram.size(); i++) {
+      if (histogram[i] == 0) {
+        (*cost)[i] = log2sum + 2;
+        continue;
+      }
+
+      // Shannon bits for this symbol.
+      (*cost)[i] = log2sum - static_cast<float>(FastLog2(histogram[i]));
+
+      // Cannot be coded with less than 1 bit
+      if ((*cost)[i] < 1) (*cost)[i] = 1;
+    }
+  }
+
+  std::vector<float> cost_cmd_;  // The insert and copy length symbols.
+  std::vector<float> cost_dist_;
+  // Cumulative costs of literals per position in the stream.
+  std::vector<float> literal_costs_;
+  float min_cost_cmd_;
+};
+
+inline size_t ComputeDistanceCode(size_t distance,
+                                  size_t max_distance,
+                                  int quality,
+                                  const int* dist_cache) {
+  if (distance <= max_distance) {
+    if (distance == static_cast<size_t>(dist_cache[0])) {
+      return 0;
+    } else if (distance == static_cast<size_t>(dist_cache[1])) {
+      return 1;
+    } else if (distance == static_cast<size_t>(dist_cache[2])) {
+      return 2;
+    } else if (distance == static_cast<size_t>(dist_cache[3])) {
+      return 3;
+    } else if (quality > 3 && distance >= 6) {
+      for (size_t k = 4; k < kNumDistanceShortCodes; ++k) {
+        size_t idx = kDistanceCacheIndex[k];
+        size_t candidate =
+            static_cast<size_t>(dist_cache[idx] + kDistanceCacheOffset[k]);
+        static const size_t kLimits[16] = {  0,  0,  0,  0,
+                                             6,  6, 11, 11,
+                                            11, 11, 11, 11,
+                                            12, 12, 12, 12 };
+        if (distance == candidate && distance >= kLimits[k]) {
+          return k;
+        }
+      }
+    }
+  }
+  return distance + 15;
+}
+
+// REQUIRES: len >= 2, start_pos <= pos
+// REQUIRES: cost < kInfinity, nodes[start_pos].cost < kInfinity
+// Maintains the "ZopfliNode array invariant".
+inline void UpdateZopfliNode(ZopfliNode* nodes, size_t pos, size_t start_pos,
+                             size_t len, size_t len_code, size_t dist,
+                             size_t short_code, float cost) {
+  ZopfliNode& next = nodes[pos + len];
+  next.length = static_cast<uint32_t>(len | ((len + 9u - len_code) << 24));
+  next.distance = static_cast<uint32_t>(dist | (short_code << 25));
+  next.insert_length = static_cast<uint32_t>(pos - start_pos);
+  next.cost = cost;
+}
+
+// Maintains the smallest 2^k cost difference together with their positions
+class StartPosQueue {
+ public:
+  struct PosData {
+    size_t pos;
+    int distance_cache[4];
+    float costdiff;
+  };
+
+  explicit StartPosQueue(int bits)
+      : mask_((1u << bits) - 1), q_(1 << bits), idx_(0) {}
+
+  void Clear(void) {
+    idx_ = 0;
+  }
+
+  void Push(const StartPosQueue::PosData& posdata) {
+    size_t offset = ~idx_ & mask_;
+    ++idx_;
+    size_t len = size();
+    q_[offset] = posdata;
+    /* Restore the sorted order. In the list of |len| items at most |len - 1|
+       adjacent element comparisons / swaps are required. */
+    for (size_t i = 1; i < len; ++i) {
+      if (q_[offset & mask_].costdiff > q_[(offset + 1) & mask_].costdiff) {
+        std::swap(q_[offset & mask_], q_[(offset + 1) & mask_]);
+      }
+      ++offset;
+    }
+  }
+
+  size_t size(void) const { return std::min(idx_, mask_ + 1); }
+
+  const StartPosQueue::PosData& GetStartPosData(size_t k) const {
+    return q_[(k - idx_) & mask_];
+  }
+
+ private:
+  const size_t mask_;
+  std::vector<PosData> q_;
+  size_t idx_;
+};
+
+// Returns the minimum possible copy length that can improve the cost of any
+// future position.
+static size_t ComputeMinimumCopyLength(const StartPosQueue& queue,
+                                       const ZopfliNode* nodes,
+                                       const ZopfliCostModel& model,
+                                       const size_t num_bytes,
+                                       const size_t pos) {
+  // Compute the minimum possible cost of reaching any future position.
+  const size_t start0 = queue.GetStartPosData(0).pos;
+  float min_cost = (nodes[start0].cost +
+                    model.GetLiteralCosts(start0, pos) +
+                    model.GetMinCostCmd());
+  size_t len = 2;
+  size_t next_len_bucket = 4;
+  size_t next_len_offset = 10;
+  while (pos + len <= num_bytes && nodes[pos + len].cost <= min_cost) {
+    // We already reached (pos + len) with no more cost than the minimum
+    // possible cost of reaching anything from this pos, so there is no point in
+    // looking for lengths <= len.
+    ++len;
+    if (len == next_len_offset) {
+      // We reached the next copy length code bucket, so we add one more
+      // extra bit to the minimum cost.
+      min_cost += static_cast<float>(1.0);
+      next_len_offset += next_len_bucket;
+      next_len_bucket *= 2;
+    }
+  }
+  return len;
+}
+
+// Fills in dist_cache[0..3] with the last four distances (as defined by
+// Section 4. of the Spec) that would be used at (block_start + pos) if we
+// used the shortest path of commands from block_start, computed from
+// nodes[0..pos]. The last four distances at block_start are in
+// starting_dist_cach[0..3].
+// REQUIRES: nodes[pos].cost < kInfinity
+// REQUIRES: nodes[0..pos] satisfies that "ZopfliNode array invariant".
+static void ComputeDistanceCache(const size_t block_start,
+                                 const size_t pos,
+                                 const size_t max_backward,
+                                 const int* starting_dist_cache,
+                                 const ZopfliNode* nodes,
+                                 int* dist_cache) {
+  int idx = 0;
+  size_t p = pos;
+  // Because of prerequisite, does at most (pos + 1) / 2 iterations.
+  while (idx < 4 && p > 0) {
+    const size_t clen = nodes[p].copy_length();
+    const size_t ilen = nodes[p].insert_length;
+    const size_t dist = nodes[p].copy_distance();
+    // Since block_start + p is the end position of the command, the copy part
+    // starts from block_start + p - clen. Distances that are greater than this
+    // or greater than max_backward are static dictionary references, and do
+    // not update the last distances. Also distance code 0 (last distance)
+    // does not update the last distances.
+    if (dist + clen <= block_start + p && dist <= max_backward &&
+        nodes[p].distance_code() > 0) {
+      dist_cache[idx++] = static_cast<int>(dist);
+    }
+    // Because of prerequisite, p >= clen + ilen >= 2.
+    p -= clen + ilen;
+  }
+  for (; idx < 4; ++idx) {
+    dist_cache[idx] = *starting_dist_cache++;
+  }
+}
+
+static void UpdateNodes(const size_t num_bytes,
+                        const size_t block_start,
+                        const size_t pos,
+                        const uint8_t* ringbuffer,
+                        const size_t ringbuffer_mask,
+                        const size_t max_backward_limit,
+                        const int* starting_dist_cache,
+                        const size_t num_matches,
+                        const BackwardMatch* matches,
+                        const ZopfliCostModel* model,
+                        StartPosQueue* queue,
+                        ZopfliNode* nodes) {
+  size_t cur_ix = block_start + pos;
+  size_t cur_ix_masked = cur_ix & ringbuffer_mask;
+  size_t max_distance = std::min(cur_ix, max_backward_limit);
+
+  if (nodes[pos].cost <= model->GetLiteralCosts(0, pos)) {
+    StartPosQueue::PosData posdata;
+    posdata.pos = pos;
+    posdata.costdiff = nodes[pos].cost - model->GetLiteralCosts(0, pos);
+    ComputeDistanceCache(block_start, pos, max_backward_limit,
+                         starting_dist_cache, nodes, posdata.distance_cache);
+    queue->Push(posdata);
+  }
+
+  const size_t min_len = ComputeMinimumCopyLength(
+      *queue, nodes, *model, num_bytes, pos);
+
+  // Go over the command starting positions in order of increasing cost
+  // difference.
+  for (size_t k = 0; k < 5 && k < queue->size(); ++k) {
+    const StartPosQueue::PosData& posdata = queue->GetStartPosData(k);
+    const size_t start = posdata.pos;
+    const float start_costdiff = posdata.costdiff;
+
+    // Look for last distance matches using the distance cache from this
+    // starting position.
+    size_t best_len = min_len - 1;
+    for (size_t j = 0; j < kNumDistanceShortCodes; ++j) {
+      const size_t idx = kDistanceCacheIndex[j];
+      const size_t backward = static_cast<size_t>(posdata.distance_cache[idx] +
+                                                  kDistanceCacheOffset[j]);
+      size_t prev_ix = cur_ix - backward;
+      if (prev_ix >= cur_ix) {
+        continue;
+      }
+      if (PREDICT_FALSE(backward > max_distance)) {
+        continue;
+      }
+      prev_ix &= ringbuffer_mask;
+
+      if (cur_ix_masked + best_len > ringbuffer_mask ||
+          prev_ix + best_len > ringbuffer_mask ||
+          ringbuffer[cur_ix_masked + best_len] !=
+          ringbuffer[prev_ix + best_len]) {
+        continue;
+      }
+      const size_t len =
+          FindMatchLengthWithLimit(&ringbuffer[prev_ix],
+                                   &ringbuffer[cur_ix_masked],
+                                   num_bytes - pos);
+      for (size_t l = best_len + 1; l <= len; ++l) {
+        const size_t inslen = pos - start;
+        float cmd_cost = model->GetCommandCost(j, l, inslen);
+        float cost = start_costdiff + cmd_cost + model->GetLiteralCosts(0, pos);
+        if (cost < nodes[pos + l].cost) {
+          UpdateZopfliNode(&nodes[0], pos, start, l, l, backward, j + 1, cost);
+        }
+        best_len = l;
+      }
+    }
+
+    // At higher iterations look only for new last distance matches, since
+    // looking only for new command start positions with the same distances
+    // does not help much.
+    if (k >= 2) continue;
+
+    // Loop through all possible copy lengths at this position.
+    size_t len = min_len;
+    for (size_t j = 0; j < num_matches; ++j) {
+      BackwardMatch match = matches[j];
+      size_t dist = match.distance;
+      bool is_dictionary_match = dist > max_distance;
+      // We already tried all possible last distance matches, so we can use
+      // normal distance code here.
+      size_t dist_code = dist + 15;
+      // Try all copy lengths up until the maximum copy length corresponding
+      // to this distance. If the distance refers to the static dictionary, or
+      // the maximum length is long enough, try only one maximum length.
+      size_t max_len = match.length();
+      if (len < max_len && (is_dictionary_match || max_len > kMaxZopfliLen)) {
+        len = max_len;
+      }
+      for (; len <= max_len; ++len) {
+        size_t len_code = is_dictionary_match ? match.length_code() : len;
+        const size_t inslen = pos - start;
+        float cmd_cost = model->GetCommandCost(dist_code, len_code, inslen);
+        float cost = start_costdiff + cmd_cost + model->GetLiteralCosts(0, pos);
+        if (cost < nodes[pos + len].cost) {
+          UpdateZopfliNode(&nodes[0], pos, start, len, len_code, dist, 0, cost);
+        }
+      }
+    }
+  }
+}
+
+static void ComputeShortestPathFromNodes(size_t num_bytes,
+                                         const ZopfliNode* nodes,
+                                         std::vector<uint32_t>* path) {
+  std::vector<uint32_t> backwards(num_bytes / 2 + 1);
+  size_t index = num_bytes;
+  while (nodes[index].cost == kInfinity) --index;
+  size_t num_commands = 0;
+  while (index != 0) {
+    size_t len = nodes[index].command_length();
+    backwards[num_commands++] = static_cast<uint32_t>(len);
+    index -= len;
+  }
+  path->resize(num_commands);
+  for (size_t i = num_commands, j = 0; i > 0; --i, ++j) {
+    (*path)[j] = backwards[i - 1];
+  }
+}
+
+void ZopfliCreateCommands(const size_t num_bytes,
+                          const size_t block_start,
+                          const size_t max_backward_limit,
+                          const std::vector<uint32_t>& path,
+                          const ZopfliNode* nodes,
+                          int* dist_cache,
+                          size_t* last_insert_len,
+                          Command* commands,
+                          size_t* num_literals) {
+  size_t pos = 0;
+  for (size_t i = 0; i < path.size(); i++) {
+    const ZopfliNode& next = nodes[pos + path[i]];
+    size_t copy_length = next.copy_length();
+    size_t insert_length = next.insert_length;
+    pos += insert_length;
+    if (i == 0) {
+      insert_length += *last_insert_len;
+      *last_insert_len = 0;
+    }
+    size_t distance = next.copy_distance();
+    size_t len_code = next.length_code();
+    size_t max_distance = std::min(block_start + pos, max_backward_limit);
+    bool is_dictionary = (distance > max_distance);
+    size_t dist_code = next.distance_code();
+
+    Command cmd(insert_length, copy_length, len_code, dist_code);
+    commands[i] = cmd;
+
+    if (!is_dictionary && dist_code > 0) {
+      dist_cache[3] = dist_cache[2];
+      dist_cache[2] = dist_cache[1];
+      dist_cache[1] = dist_cache[0];
+      dist_cache[0] = static_cast<int>(distance);
+    }
+
+    *num_literals += insert_length;
+    pos += copy_length;
+  }
+  *last_insert_len += num_bytes - pos;
+}
+
+static void ZopfliIterate(size_t num_bytes,
+                          size_t position,
+                          const uint8_t* ringbuffer,
+                          size_t ringbuffer_mask,
+                          const size_t max_backward_limit,
+                          const int* dist_cache,
+                          const ZopfliCostModel& model,
+                          const std::vector<uint32_t>& num_matches,
+                          const std::vector<BackwardMatch>& matches,
+                          ZopfliNode* nodes,
+                          std::vector<uint32_t>* path) {
+  nodes[0].length = 0;
+  nodes[0].cost = 0;
+  StartPosQueue queue(3);
+  size_t cur_match_pos = 0;
+  for (size_t i = 0; i + 3 < num_bytes; i++) {
+    UpdateNodes(num_bytes, position, i, ringbuffer, ringbuffer_mask,
+                max_backward_limit, dist_cache, num_matches[i],
+                &matches[cur_match_pos], &model, &queue, &nodes[0]);
+    cur_match_pos += num_matches[i];
+    // The zopflification can be too slow in case of very long lengths, so in
+    // such case skip it all, it does not cost a lot of compression ratio.
+    if (num_matches[i] == 1 &&
+        matches[cur_match_pos - 1].length() > kMaxZopfliLen) {
+      i += matches[cur_match_pos - 1].length() - 1;
+      queue.Clear();
+    }
+  }
+  ComputeShortestPathFromNodes(num_bytes, &nodes[0], path);
+}
+
+
+void ZopfliComputeShortestPath(size_t num_bytes,
+                               size_t position,
+                               const uint8_t* ringbuffer,
+                               size_t ringbuffer_mask,
+                               const size_t max_backward_limit,
+                               const int* dist_cache,
+                               Hashers::H10* hasher,
+                               ZopfliNode* nodes,
+                               std::vector<uint32_t>* path) {
+  nodes[0].length = 0;
+  nodes[0].cost = 0;
+  ZopfliCostModel* model = new ZopfliCostModel;
+  model->SetFromLiteralCosts(num_bytes, position,
+                             ringbuffer, ringbuffer_mask);
+  StartPosQueue queue(3);
+  BackwardMatch matches[Hashers::H10::kMaxNumMatches];
+  for (size_t i = 0; i + 3 < num_bytes; i++) {
+    const size_t max_distance = std::min(position + i, max_backward_limit);
+    size_t num_matches = hasher->FindAllMatches(
+        ringbuffer, ringbuffer_mask, position + i, num_bytes - i, max_distance,
+        matches);
+    if (num_matches > 0 &&
+        matches[num_matches - 1].length() > kMaxZopfliLen) {
+      matches[0] = matches[num_matches - 1];
+      num_matches = 1;
+    }
+    UpdateNodes(num_bytes, position, i, ringbuffer, ringbuffer_mask,
+                max_backward_limit, dist_cache, num_matches, matches,
+                model, &queue, nodes);
+    if (num_matches == 1 && matches[0].length() > kMaxZopfliLen) {
+      for (size_t j = 1; j < matches[0].length() && i + 4 < num_bytes; ++j) {
+        ++i;
+        if (matches[0].length() - j < 64 &&
+            num_bytes - i >= kMaxTreeCompLength) {
+          hasher->Store(ringbuffer, ringbuffer_mask, position + i);
+        }
+      }
+      queue.Clear();
+    }
+  }
+  delete model;
+  ComputeShortestPathFromNodes(num_bytes, nodes, path);
+}
+
+template<typename Hasher>
+void CreateBackwardReferences(size_t num_bytes,
+                              size_t position,
+                              bool is_last,
+                              const uint8_t* ringbuffer,
+                              size_t ringbuffer_mask,
+                              const int quality,
+                              const int lgwin,
+                              Hasher* hasher,
+                              int* dist_cache,
+                              size_t* last_insert_len,
+                              Command* commands,
+                              size_t* num_commands,
+                              size_t* num_literals) {
+  // Set maximum distance, see section 9.1. of the spec.
+  const size_t max_backward_limit = (1 << lgwin) - 16;
+
+  // Choose which init method is faster.
+  // memset is about 100 times faster than hasher->InitForData().
+  const size_t kMaxBytesForPartialHashInit = Hasher::kHashMapSize >> 7;
+  if (position == 0 && is_last && num_bytes <= kMaxBytesForPartialHashInit) {
+    hasher->InitForData(ringbuffer, num_bytes);
+  } else {
+    hasher->Init();
+  }
+  if (num_bytes >= 3 && position >= 3) {
+    // Prepare the hashes for three last bytes of the last write.
+    // These could not be calculated before, since they require knowledge
+    // of both the previous and the current block.
+    hasher->Store(&ringbuffer[(position - 3) & ringbuffer_mask],
+                  static_cast<uint32_t>(position - 3));
+    hasher->Store(&ringbuffer[(position - 2) & ringbuffer_mask],
+                  static_cast<uint32_t>(position - 2));
+    hasher->Store(&ringbuffer[(position - 1) & ringbuffer_mask],
+                  static_cast<uint32_t>(position - 1));
+  }
+  const Command * const orig_commands = commands;
+  size_t insert_length = *last_insert_len;
+  size_t i = position & ringbuffer_mask;
+  const size_t i_diff = position - i;
+  const size_t i_end = i + num_bytes;
+
+  // For speed up heuristics for random data.
+  const size_t random_heuristics_window_size = quality < 9 ? 64 : 512;
+  size_t apply_random_heuristics = i + random_heuristics_window_size;
+
+  // Minimum score to accept a backward reference.
+  const double kMinScore = 4.0;
+
+  while (i + Hasher::kHashTypeLength - 1 < i_end) {
+    size_t max_length = i_end - i;
+    size_t max_distance = std::min(i + i_diff, max_backward_limit);
+    size_t best_len = 0;
+    size_t best_len_code = 0;
+    size_t best_dist = 0;
+    double best_score = kMinScore;
+    bool match_found = hasher->FindLongestMatch(
+        ringbuffer, ringbuffer_mask,
+        dist_cache, static_cast<uint32_t>(i + i_diff), max_length, max_distance,
+        &best_len, &best_len_code, &best_dist, &best_score);
+    if (match_found) {
+      // Found a match. Let's look for something even better ahead.
+      int delayed_backward_references_in_row = 0;
+      for (;;) {
+        --max_length;
+        size_t best_len_2 =
+            quality < 5 ? std::min(best_len - 1, max_length) : 0;
+        size_t best_len_code_2 = 0;
+        size_t best_dist_2 = 0;
+        double best_score_2 = kMinScore;
+        max_distance = std::min(i + i_diff + 1, max_backward_limit);
+        match_found = hasher->FindLongestMatch(
+            ringbuffer, ringbuffer_mask,
+            dist_cache, static_cast<uint32_t>(i + i_diff + 1),
+            max_length, max_distance,
+            &best_len_2, &best_len_code_2, &best_dist_2, &best_score_2);
+        double cost_diff_lazy = 7.0;
+        if (match_found && best_score_2 >= best_score + cost_diff_lazy) {
+          // Ok, let's just write one byte for now and start a match from the
+            // next byte.
+          ++i;
+          ++insert_length;
+          best_len = best_len_2;
+          best_len_code = best_len_code_2;
+          best_dist = best_dist_2;
+          best_score = best_score_2;
+          if (++delayed_backward_references_in_row < 4) {
+            continue;
+          }
+        }
+        break;
+      }
+      apply_random_heuristics =
+          i + 2 * best_len + random_heuristics_window_size;
+      max_distance = std::min(i + i_diff, max_backward_limit);
+      // The first 16 codes are special shortcodes, and the minimum offset is 1.
+      size_t distance_code =
+          ComputeDistanceCode(best_dist, max_distance, quality, dist_cache);
+      if (best_dist <= max_distance && distance_code > 0) {
+        dist_cache[3] = dist_cache[2];
+        dist_cache[2] = dist_cache[1];
+        dist_cache[1] = dist_cache[0];
+        dist_cache[0] = static_cast<int>(best_dist);
+      }
+      Command cmd(insert_length, best_len, best_len_code, distance_code);
+      *commands++ = cmd;
+      *num_literals += insert_length;
+      insert_length = 0;
+      // Put the hash keys into the table, if there are enough
+      // bytes left.
+      for (size_t j = 2; j < best_len; ++j) {
+        hasher->Store(&ringbuffer[i + j],
+                      static_cast<uint32_t>(i + i_diff + j));
+      }
+      i += best_len;
+    } else {
+      ++insert_length;
+      ++i;
+      // If we have not seen matches for a long time, we can skip some
+      // match lookups. Unsuccessful match lookups are very very expensive
+      // and this kind of a heuristic speeds up compression quite
+      // a lot.
+      if (i > apply_random_heuristics) {
+        // Going through uncompressible data, jump.
+        if (i > apply_random_heuristics + 4 * random_heuristics_window_size) {
+          // It is quite a long time since we saw a copy, so we assume
+          // that this data is not compressible, and store hashes less
+          // often. Hashes of non compressible data are less likely to
+          // turn out to be useful in the future, too, so we store less of
+          // them to not to flood out the hash table of good compressible
+          // data.
+          size_t i_jump = std::min(i + 16, i_end - 4);
+          for (; i < i_jump; i += 4) {
+            hasher->Store(ringbuffer + i, static_cast<uint32_t>(i + i_diff));
+            insert_length += 4;
+          }
+        } else {
+          size_t i_jump = std::min(i + 8, i_end - 3);
+          for (; i < i_jump; i += 2) {
+            hasher->Store(ringbuffer + i, static_cast<uint32_t>(i + i_diff));
+            insert_length += 2;
+          }
+        }
+      }
+    }
+  }
+  insert_length += i_end - i;
+  *last_insert_len = insert_length;
+  *num_commands += static_cast<size_t>(commands - orig_commands);
+}
+
+void CreateBackwardReferences(size_t num_bytes,
+                              size_t position,
+                              bool is_last,
+                              const uint8_t* ringbuffer,
+                              size_t ringbuffer_mask,
+                              const int quality,
+                              const int lgwin,
+                              Hashers* hashers,
+                              int hash_type,
+                              int* dist_cache,
+                              size_t* last_insert_len,
+                              Command* commands,
+                              size_t* num_commands,
+                              size_t* num_literals) {
+  bool zopflify = quality > 9;
+  if (zopflify) {
+    Hashers::H10* hasher = hashers->hash_h10;
+    hasher->Init(lgwin, position, num_bytes, is_last);
+    hasher->StitchToPreviousBlock(num_bytes, position,
+                                  ringbuffer, ringbuffer_mask);
+    // Set maximum distance, see section 9.1. of the spec.
+    const size_t max_backward_limit = (1 << lgwin) - 16;
+    if (quality == 10) {
+      std::vector<ZopfliNode> nodes(num_bytes + 1);
+      std::vector<uint32_t> path;
+      ZopfliComputeShortestPath(num_bytes, position,
+                                ringbuffer, ringbuffer_mask,
+                                max_backward_limit, dist_cache, hasher,
+                                &nodes[0], &path);
+      ZopfliCreateCommands(num_bytes, position, max_backward_limit, path,
+                           &nodes[0], dist_cache, last_insert_len, commands,
+                           num_literals);
+      *num_commands += path.size();
+      return;
+    }
+    std::vector<uint32_t> num_matches(num_bytes);
+    std::vector<BackwardMatch> matches(4 * num_bytes);
+    size_t cur_match_pos = 0;
+    for (size_t i = 0; i + 3 < num_bytes; ++i) {
+      size_t max_distance = std::min(position + i, max_backward_limit);
+      size_t max_length = num_bytes - i;
+      // Ensure that we have enough free slots.
+      if (matches.size() < cur_match_pos + Hashers::H10::kMaxNumMatches) {
+        matches.resize(cur_match_pos + Hashers::H10::kMaxNumMatches);
+      }
+      size_t num_found_matches = hasher->FindAllMatches(
+          ringbuffer, ringbuffer_mask, position + i, max_length, max_distance,
+          &matches[cur_match_pos]);
+      const size_t cur_match_end = cur_match_pos + num_found_matches;
+      for (size_t j = cur_match_pos; j + 1 < cur_match_end; ++j) {
+        assert(matches[j].length() < matches[j + 1].length());
+        assert(matches[j].distance > max_distance ||
+               matches[j].distance <= matches[j + 1].distance);
+      }
+      num_matches[i] = static_cast<uint32_t>(num_found_matches);
+      if (num_found_matches > 0) {
+        const size_t match_len = matches[cur_match_end - 1].length();
+        if (match_len > kMaxZopfliLen) {
+          matches[cur_match_pos++] = matches[cur_match_end - 1];
+          num_matches[i] = 1;
+          for (size_t j = 1; j < match_len; ++j) {
+            ++i;
+            if (match_len - j < 64 && num_bytes - i >= kMaxTreeCompLength) {
+              hasher->Store(ringbuffer, ringbuffer_mask, position + i);
+            }
+            num_matches[i] = 0;
+          }
+        } else {
+          cur_match_pos = cur_match_end;
+        }
+      }
+    }
+    size_t orig_num_literals = *num_literals;
+    size_t orig_last_insert_len = *last_insert_len;
+    int orig_dist_cache[4] = {
+      dist_cache[0], dist_cache[1], dist_cache[2], dist_cache[3]
+    };
+    size_t orig_num_commands = *num_commands;
+    static const size_t kIterations = 2;
+    for (size_t i = 0; i < kIterations; i++) {
+      ZopfliCostModel model;
+      if (i == 0) {
+        model.SetFromLiteralCosts(num_bytes, position,
+                                  ringbuffer, ringbuffer_mask);
+      } else {
+        model.SetFromCommands(num_bytes, position,
+                              ringbuffer, ringbuffer_mask,
+                              commands, *num_commands - orig_num_commands,
+                              orig_last_insert_len);
+      }
+      *num_commands = orig_num_commands;
+      *num_literals = orig_num_literals;
+      *last_insert_len = orig_last_insert_len;
+      memcpy(dist_cache, orig_dist_cache, 4 * sizeof(dist_cache[0]));
+      std::vector<ZopfliNode> nodes(num_bytes + 1);
+      std::vector<uint32_t> path;
+      ZopfliIterate(num_bytes, position, ringbuffer, ringbuffer_mask,
+                    max_backward_limit, dist_cache, model, num_matches, matches,
+                    &nodes[0], &path);
+      ZopfliCreateCommands(num_bytes, position, max_backward_limit, path,
+                           &nodes[0], dist_cache, last_insert_len, commands,
+                           num_literals);
+      *num_commands += path.size();
+    }
+    return;
+  }
+
+  switch (hash_type) {
+    case 2:
+      CreateBackwardReferences<Hashers::H2>(
+          num_bytes, position, is_last, ringbuffer, ringbuffer_mask,
+          quality, lgwin, hashers->hash_h2, dist_cache,
+          last_insert_len, commands, num_commands, num_literals);
+      break;
+    case 3:
+      CreateBackwardReferences<Hashers::H3>(
+          num_bytes, position, is_last, ringbuffer, ringbuffer_mask,
+          quality, lgwin, hashers->hash_h3, dist_cache,
+          last_insert_len, commands, num_commands, num_literals);
+      break;
+    case 4:
+      CreateBackwardReferences<Hashers::H4>(
+          num_bytes, position, is_last, ringbuffer, ringbuffer_mask,
+          quality, lgwin, hashers->hash_h4, dist_cache,
+          last_insert_len, commands, num_commands, num_literals);
+      break;
+    case 5:
+      CreateBackwardReferences<Hashers::H5>(
+          num_bytes, position, is_last, ringbuffer, ringbuffer_mask,
+          quality, lgwin, hashers->hash_h5, dist_cache,
+          last_insert_len, commands, num_commands, num_literals);
+      break;
+    case 6:
+      CreateBackwardReferences<Hashers::H6>(
+          num_bytes, position, is_last, ringbuffer, ringbuffer_mask,
+          quality, lgwin, hashers->hash_h6, dist_cache,
+          last_insert_len, commands, num_commands, num_literals);
+      break;
+    case 7:
+      CreateBackwardReferences<Hashers::H7>(
+          num_bytes, position, is_last, ringbuffer, ringbuffer_mask,
+          quality, lgwin, hashers->hash_h7, dist_cache,
+          last_insert_len, commands, num_commands, num_literals);
+      break;
+    case 8:
+      CreateBackwardReferences<Hashers::H8>(
+          num_bytes, position, is_last, ringbuffer, ringbuffer_mask,
+          quality, lgwin, hashers->hash_h8, dist_cache,
+          last_insert_len, commands, num_commands, num_literals);
+      break;
+    case 9:
+      CreateBackwardReferences<Hashers::H9>(
+          num_bytes, position, is_last, ringbuffer, ringbuffer_mask,
+          quality, lgwin, hashers->hash_h9, dist_cache,
+          last_insert_len, commands, num_commands, num_literals);
+      break;
+    default:
+      break;
+  }
+}
+
+}  // namespace brotli
diff --git a/third_party/brotli/enc/backward_references.h b/third_party/brotli/enc/backward_references.h
new file mode 100644
index 0000000..f60667f
--- /dev/null
+++ b/third_party/brotli/enc/backward_references.h
@@ -0,0 +1,116 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Function to find backward reference copies.
+
+#ifndef BROTLI_ENC_BACKWARD_REFERENCES_H_
+#define BROTLI_ENC_BACKWARD_REFERENCES_H_
+
+#include <vector>
+
+#include "./hash.h"
+#include "./command.h"
+#include "./types.h"
+
+namespace brotli {
+
+// "commands" points to the next output command to write to, "*num_commands" is
+// initially the total amount of commands output by previous
+// CreateBackwardReferences calls, and must be incremented by the amount written
+// by this call.
+void CreateBackwardReferences(size_t num_bytes,
+                              size_t position,
+                              bool is_last,
+                              const uint8_t* ringbuffer,
+                              size_t ringbuffer_mask,
+                              const int quality,
+                              const int lgwin,
+                              Hashers* hashers,
+                              int hash_type,
+                              int* dist_cache,
+                              size_t* last_insert_len,
+                              Command* commands,
+                              size_t* num_commands,
+                              size_t* num_literals);
+
+static const float kInfinity = std::numeric_limits<float>::infinity();
+
+struct ZopfliNode {
+  ZopfliNode(void) : length(1),
+                     distance(0),
+                     insert_length(0),
+                     cost(kInfinity) {}
+
+  inline uint32_t copy_length() const {
+    return length & 0xffffff;
+  }
+
+  inline uint32_t length_code() const {
+    const uint32_t modifier = length >> 24;
+    return copy_length() + 9u - modifier;
+  }
+
+  inline uint32_t copy_distance() const {
+    return distance & 0x1ffffff;
+  }
+
+  inline uint32_t distance_code() const {
+    const uint32_t short_code = distance >> 25;
+    return short_code == 0 ? copy_distance() + 15 : short_code - 1;
+  }
+
+  inline uint32_t command_length() const {
+    return copy_length() + insert_length;
+  }
+
+  // best length to get up to this byte (not including this byte itself)
+  // highest 8 bit is used to reconstruct the length code
+  uint32_t length;
+  // distance associated with the length
+  // highest 7 bit contains distance short code + 1 (or zero if no short code)
+  uint32_t distance;
+  // number of literal inserts before this copy
+  uint32_t insert_length;
+  // smallest cost to get to this byte from the beginning, as found so far
+  float cost;
+};
+
+// Computes the shortest path of commands from position to at most
+// position + num_bytes.
+//
+// On return, path->size() is the number of commands found and path[i] is the
+// length of the ith command (copy length plus insert length).
+// Note that the sum of the lengths of all commands can be less than num_bytes.
+//
+// On return, the nodes[0..num_bytes] array will have the following
+// "ZopfliNode array invariant":
+// For each i in [1..num_bytes], if nodes[i].cost < kInfinity, then
+//   (1) nodes[i].copy_length() >= 2
+//   (2) nodes[i].command_length() <= i and
+//   (3) nodes[i - nodes[i].command_length()].cost < kInfinity
+void ZopfliComputeShortestPath(size_t num_bytes,
+                               size_t position,
+                               const uint8_t* ringbuffer,
+                               size_t ringbuffer_mask,
+                               const size_t max_backward_limit,
+                               const int* dist_cache,
+                               Hashers::H10* hasher,
+                               ZopfliNode* nodes,
+                               std::vector<uint32_t>* path);
+
+void ZopfliCreateCommands(const size_t num_bytes,
+                          const size_t block_start,
+                          const size_t max_backward_limit,
+                          const std::vector<uint32_t>& path,
+                          const ZopfliNode* nodes,
+                          int* dist_cache,
+                          size_t* last_insert_len,
+                          Command* commands,
+                          size_t* num_literals);
+
+}  // namespace brotli
+
+#endif  // BROTLI_ENC_BACKWARD_REFERENCES_H_
diff --git a/third_party/brotli/enc/bit_cost.h b/third_party/brotli/enc/bit_cost.h
new file mode 100644
index 0000000..4652006
--- /dev/null
+++ b/third_party/brotli/enc/bit_cost.h
@@ -0,0 +1,161 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Functions to estimate the bit cost of Huffman trees.
+
+#ifndef BROTLI_ENC_BIT_COST_H_
+#define BROTLI_ENC_BIT_COST_H_
+
+#include "./entropy_encode.h"
+#include "./fast_log.h"
+#include "./types.h"
+
+namespace brotli {
+
+static inline double ShannonEntropy(const uint32_t *population, size_t size,
+                                    size_t *total) {
+  size_t sum = 0;
+  double retval = 0;
+  const uint32_t *population_end = population + size;
+  size_t p;
+  if (size & 1) {
+    goto odd_number_of_elements_left;
+  }
+  while (population < population_end) {
+    p = *population++;
+    sum += p;
+    retval -= static_cast<double>(p) * FastLog2(p);
+ odd_number_of_elements_left:
+    p = *population++;
+    sum += p;
+    retval -= static_cast<double>(p) * FastLog2(p);
+  }
+  if (sum) retval += static_cast<double>(sum) * FastLog2(sum);
+  *total = sum;
+  return retval;
+}
+
+static inline double BitsEntropy(const uint32_t *population, size_t size) {
+  size_t sum;
+  double retval = ShannonEntropy(population, size, &sum);
+  if (retval < sum) {
+    // At least one bit per literal is needed.
+    retval = static_cast<double>(sum);
+  }
+  return retval;
+}
+
+template<int kSize>
+double PopulationCost(const Histogram<kSize>& histogram) {
+  static const double kOneSymbolHistogramCost = 12;
+  static const double kTwoSymbolHistogramCost = 20;
+  static const double kThreeSymbolHistogramCost = 28;
+  static const double kFourSymbolHistogramCost = 37;
+  if (histogram.total_count_ == 0) {
+    return kOneSymbolHistogramCost;
+  }
+  int count = 0;
+  int s[5];
+  for (int i = 0; i < kSize; ++i) {
+    if (histogram.data_[i] > 0) {
+      s[count] = i;
+      ++count;
+      if (count > 4) break;
+    }
+  }
+  if (count == 1) {
+    return kOneSymbolHistogramCost;
+  }
+  if (count == 2) {
+    return (kTwoSymbolHistogramCost +
+            static_cast<double>(histogram.total_count_));
+  }
+  if (count == 3) {
+    const uint32_t histo0 = histogram.data_[s[0]];
+    const uint32_t histo1 = histogram.data_[s[1]];
+    const uint32_t histo2 = histogram.data_[s[2]];
+    const uint32_t histomax = std::max(histo0, std::max(histo1, histo2));
+    return (kThreeSymbolHistogramCost +
+            2 * (histo0 + histo1 + histo2) - histomax);
+  }
+  if (count == 4) {
+    uint32_t histo[4];
+    for (int i = 0; i < 4; ++i) {
+      histo[i] = histogram.data_[s[i]];
+    }
+    // Sort
+    for (int i = 0; i < 4; ++i) {
+      for (int j = i + 1; j < 4; ++j) {
+        if (histo[j] > histo[i]) {
+          std::swap(histo[j], histo[i]);
+        }
+      }
+    }
+    const uint32_t h23 = histo[2] + histo[3];
+    const uint32_t histomax = std::max(h23, histo[0]);
+    return (kFourSymbolHistogramCost +
+            3 * h23 + 2 * (histo[0] + histo[1]) - histomax);
+  }
+
+  // In this loop we compute the entropy of the histogram and simultaneously
+  // build a simplified histogram of the code length codes where we use the
+  // zero repeat code 17, but we don't use the non-zero repeat code 16.
+  double bits = 0;
+  size_t max_depth = 1;
+  uint32_t depth_histo[kCodeLengthCodes] = { 0 };
+  const double log2total = FastLog2(histogram.total_count_);
+  for (size_t i = 0; i < kSize;) {
+    if (histogram.data_[i] > 0) {
+      // Compute -log2(P(symbol)) = -log2(count(symbol)/total_count) =
+      //                          =  log2(total_count) - log2(count(symbol))
+      double log2p = log2total - FastLog2(histogram.data_[i]);
+      // Approximate the bit depth by round(-log2(P(symbol)))
+      size_t depth = static_cast<size_t>(log2p + 0.5);
+      bits += histogram.data_[i] * log2p;
+      if (depth > 15) {
+        depth = 15;
+      }
+      if (depth > max_depth) {
+        max_depth = depth;
+      }
+      ++depth_histo[depth];
+      ++i;
+    } else {
+      // Compute the run length of zeros and add the appropriate number of 0 and
+      // 17 code length codes to the code length code histogram.
+      uint32_t reps = 1;
+      for (size_t k = i + 1; k < kSize && histogram.data_[k] == 0; ++k) {
+        ++reps;
+      }
+      i += reps;
+      if (i == kSize) {
+        // Don't add any cost for the last zero run, since these are encoded
+        // only implicitly.
+        break;
+      }
+      if (reps < 3) {
+        depth_histo[0] += reps;
+      } else {
+        reps -= 2;
+        while (reps > 0) {
+          ++depth_histo[17];
+          // Add the 3 extra bits for the 17 code length code.
+          bits += 3;
+          reps >>= 3;
+        }
+      }
+    }
+  }
+  // Add the estimated encoding cost of the code length code histogram.
+  bits += static_cast<double>(18 + 2 * max_depth);
+  // Add the entropy of the code length code histogram.
+  bits += BitsEntropy(depth_histo, kCodeLengthCodes);
+  return bits;
+}
+
+}  // namespace brotli
+
+#endif  // BROTLI_ENC_BIT_COST_H_
diff --git a/third_party/brotli/enc/block_splitter.cc b/third_party/brotli/enc/block_splitter.cc
new file mode 100644
index 0000000..db8d9c60
--- /dev/null
+++ b/third_party/brotli/enc/block_splitter.cc
@@ -0,0 +1,505 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Block split point selection utilities.
+
+#include "./block_splitter.h"
+
+#include <assert.h>
+#include <math.h>
+
+#include <algorithm>
+#include <cstring>
+#include <vector>
+
+#include "./cluster.h"
+#include "./command.h"
+#include "./fast_log.h"
+#include "./histogram.h"
+
+namespace brotli {
+
+static const size_t kMaxLiteralHistograms = 100;
+static const size_t kMaxCommandHistograms = 50;
+static const double kLiteralBlockSwitchCost = 28.1;
+static const double kCommandBlockSwitchCost = 13.5;
+static const double kDistanceBlockSwitchCost = 14.6;
+static const size_t kLiteralStrideLength = 70;
+static const size_t kCommandStrideLength = 40;
+static const size_t kSymbolsPerLiteralHistogram = 544;
+static const size_t kSymbolsPerCommandHistogram = 530;
+static const size_t kSymbolsPerDistanceHistogram = 544;
+static const size_t kMinLengthForBlockSplitting = 128;
+static const size_t kIterMulForRefining = 2;
+static const size_t kMinItersForRefining = 100;
+
+void CopyLiteralsToByteArray(const Command* cmds,
+                             const size_t num_commands,
+                             const uint8_t* data,
+                             const size_t offset,
+                             const size_t mask,
+                             std::vector<uint8_t>* literals) {
+  // Count how many we have.
+  size_t total_length = 0;
+  for (size_t i = 0; i < num_commands; ++i) {
+    total_length += cmds[i].insert_len_;
+  }
+  if (total_length == 0) {
+    return;
+  }
+
+  // Allocate.
+  literals->resize(total_length);
+
+  // Loop again, and copy this time.
+  size_t pos = 0;
+  size_t from_pos = offset & mask;
+  for (size_t i = 0; i < num_commands && pos < total_length; ++i) {
+    size_t insert_len = cmds[i].insert_len_;
+    if (from_pos + insert_len > mask) {
+      size_t head_size = mask + 1 - from_pos;
+      memcpy(&(*literals)[pos], data + from_pos, head_size);
+      from_pos = 0;
+      pos += head_size;
+      insert_len -= head_size;
+    }
+    if (insert_len > 0) {
+      memcpy(&(*literals)[pos], data + from_pos, insert_len);
+      pos += insert_len;
+    }
+    from_pos = (from_pos + insert_len + cmds[i].copy_len()) & mask;
+  }
+}
+
+inline static unsigned int MyRand(unsigned int* seed) {
+  *seed *= 16807U;
+  if (*seed == 0) {
+    *seed = 1;
+  }
+  return *seed;
+}
+
+template<typename HistogramType, typename DataType>
+void InitialEntropyCodes(const DataType* data, size_t length,
+                         size_t stride,
+                         size_t num_histograms,
+                         HistogramType* histograms) {
+  for (size_t i = 0; i < num_histograms; ++i) {
+    histograms[i].Clear();
+  }
+  unsigned int seed = 7;
+  size_t block_length = length / num_histograms;
+  for (size_t i = 0; i < num_histograms; ++i) {
+    size_t pos = length * i / num_histograms;
+    if (i != 0) {
+      pos += MyRand(&seed) % block_length;
+    }
+    if (pos + stride >= length) {
+      pos = length - stride - 1;
+    }
+    histograms[i].Add(data + pos, stride);
+  }
+}
+
+template<typename HistogramType, typename DataType>
+void RandomSample(unsigned int* seed,
+                  const DataType* data,
+                  size_t length,
+                  size_t stride,
+                  HistogramType* sample) {
+  size_t pos = 0;
+  if (stride >= length) {
+    pos = 0;
+    stride = length;
+  } else {
+    pos = MyRand(seed) % (length - stride + 1);
+  }
+  sample->Add(data + pos, stride);
+}
+
+template<typename HistogramType, typename DataType>
+void RefineEntropyCodes(const DataType* data, size_t length,
+                        size_t stride,
+                        size_t num_histograms,
+                        HistogramType* histograms) {
+  size_t iters =
+      kIterMulForRefining * length / stride + kMinItersForRefining;
+  unsigned int seed = 7;
+  iters = ((iters + num_histograms - 1) / num_histograms) * num_histograms;
+  for (size_t iter = 0; iter < iters; ++iter) {
+    HistogramType sample;
+    RandomSample(&seed, data, length, stride, &sample);
+    size_t ix = iter % num_histograms;
+    histograms[ix].AddHistogram(sample);
+  }
+}
+
+inline static double BitCost(size_t count) {
+  return count == 0 ? -2.0 : FastLog2(count);
+}
+
+// Assigns a block id from the range [0, vec.size()) to each data element
+// in data[0..length) and fills in block_id[0..length) with the assigned values.
+// Returns the number of blocks, i.e. one plus the number of block switches.
+template<typename DataType, int kSize>
+size_t FindBlocks(const DataType* data, const size_t length,
+                  const double block_switch_bitcost,
+                  const size_t num_histograms,
+                  const Histogram<kSize>* histograms,
+                  double* insert_cost,
+                  double* cost,
+                  uint8_t* switch_signal,
+                  uint8_t *block_id) {
+  if (num_histograms <= 1) {
+    for (size_t i = 0; i < length; ++i) {
+      block_id[i] = 0;
+    }
+    return 1;
+  }
+  const size_t bitmaplen = (num_histograms + 7) >> 3;
+  assert(num_histograms <= 256);
+  memset(insert_cost, 0, sizeof(insert_cost[0]) * kSize * num_histograms);
+  for (size_t j = 0; j < num_histograms; ++j) {
+    insert_cost[j] = FastLog2(static_cast<uint32_t>(
+        histograms[j].total_count_));
+  }
+  for (size_t i = kSize; i != 0;) {
+    --i;
+    for (size_t j = 0; j < num_histograms; ++j) {
+      insert_cost[i * num_histograms + j] =
+          insert_cost[j] - BitCost(histograms[j].data_[i]);
+    }
+  }
+  memset(cost, 0, sizeof(cost[0]) * num_histograms);
+  memset(switch_signal, 0, sizeof(switch_signal[0]) * length * bitmaplen);
+  // After each iteration of this loop, cost[k] will contain the difference
+  // between the minimum cost of arriving at the current byte position using
+  // entropy code k, and the minimum cost of arriving at the current byte
+  // position. This difference is capped at the block switch cost, and if it
+  // reaches block switch cost, it means that when we trace back from the last
+  // position, we need to switch here.
+  for (size_t byte_ix = 0; byte_ix < length; ++byte_ix) {
+    size_t ix = byte_ix * bitmaplen;
+    size_t insert_cost_ix = data[byte_ix] * num_histograms;
+    double min_cost = 1e99;
+    for (size_t k = 0; k < num_histograms; ++k) {
+      // We are coding the symbol in data[byte_ix] with entropy code k.
+      cost[k] += insert_cost[insert_cost_ix + k];
+      if (cost[k] < min_cost) {
+        min_cost = cost[k];
+        block_id[byte_ix] = static_cast<uint8_t>(k);
+      }
+    }
+    double block_switch_cost = block_switch_bitcost;
+    // More blocks for the beginning.
+    if (byte_ix < 2000) {
+      block_switch_cost *= 0.77 + 0.07 * static_cast<double>(byte_ix) / 2000;
+    }
+    for (size_t k = 0; k < num_histograms; ++k) {
+      cost[k] -= min_cost;
+      if (cost[k] >= block_switch_cost) {
+        cost[k] = block_switch_cost;
+        const uint8_t mask = static_cast<uint8_t>(1u << (k & 7));
+        assert((k >> 3) < bitmaplen);
+        switch_signal[ix + (k >> 3)] |= mask;
+      }
+    }
+  }
+  // Now trace back from the last position and switch at the marked places.
+  size_t byte_ix = length - 1;
+  size_t ix = byte_ix * bitmaplen;
+  uint8_t cur_id = block_id[byte_ix];
+  size_t num_blocks = 1;
+  while (byte_ix > 0) {
+    --byte_ix;
+    ix -= bitmaplen;
+    const uint8_t mask = static_cast<uint8_t>(1u << (cur_id & 7));
+    assert((static_cast<size_t>(cur_id) >> 3) < bitmaplen);
+    if (switch_signal[ix + (cur_id >> 3)] & mask) {
+      if (cur_id != block_id[byte_ix]) {
+        cur_id = block_id[byte_ix];
+        ++num_blocks;
+      }
+    }
+    block_id[byte_ix] = cur_id;
+  }
+  return num_blocks;
+}
+
+static size_t RemapBlockIds(uint8_t* block_ids, const size_t length,
+                            uint16_t* new_id, const size_t num_histograms) {
+  static const uint16_t kInvalidId = 256;
+  for (size_t i = 0; i < num_histograms; ++i) {
+    new_id[i] = kInvalidId;
+  }
+  uint16_t next_id = 0;
+  for (size_t i = 0; i < length; ++i) {
+    assert(block_ids[i] < num_histograms);
+    if (new_id[block_ids[i]] == kInvalidId) {
+      new_id[block_ids[i]] = next_id++;
+    }
+  }
+  for (size_t i = 0; i < length; ++i) {
+    block_ids[i] = static_cast<uint8_t>(new_id[block_ids[i]]);
+    assert(block_ids[i] < num_histograms);
+  }
+  assert(next_id <= num_histograms);
+  return next_id;
+}
+
+template<typename HistogramType, typename DataType>
+void BuildBlockHistograms(const DataType* data, const size_t length,
+                          const uint8_t* block_ids,
+                          const size_t num_histograms,
+                          HistogramType* histograms) {
+  for (size_t i = 0; i < num_histograms; ++i) {
+    histograms[i].Clear();
+  }
+  for (size_t i = 0; i < length; ++i) {
+    histograms[block_ids[i]].Add(data[i]);
+  }
+}
+
+template<typename HistogramType, typename DataType>
+void ClusterBlocks(const DataType* data, const size_t length,
+                   const size_t num_blocks,
+                   uint8_t* block_ids,
+                   BlockSplit* split) {
+  static const size_t kMaxNumberOfBlockTypes = 256;
+  static const size_t kHistogramsPerBatch = 64;
+  static const size_t kClustersPerBatch = 16;
+  std::vector<uint32_t> histogram_symbols(num_blocks);
+  std::vector<uint32_t> block_lengths(num_blocks);
+
+  size_t block_idx = 0;
+  for (size_t i = 0; i < length; ++i) {
+    assert(block_idx < num_blocks);
+    ++block_lengths[block_idx];
+    if (i + 1 == length || block_ids[i] != block_ids[i + 1]) {
+      ++block_idx;
+    }
+  }
+  assert(block_idx == num_blocks);
+
+  const size_t expected_num_clusters =
+      kClustersPerBatch *
+      (num_blocks + kHistogramsPerBatch - 1) / kHistogramsPerBatch;
+  std::vector<HistogramType> all_histograms;
+  std::vector<uint32_t> cluster_size;
+  all_histograms.reserve(expected_num_clusters);
+  cluster_size.reserve(expected_num_clusters);
+  size_t num_clusters = 0;
+  std::vector<HistogramType> histograms(
+      std::min(num_blocks, kHistogramsPerBatch));
+  size_t max_num_pairs = kHistogramsPerBatch * kHistogramsPerBatch / 2;
+  std::vector<HistogramPair> pairs(max_num_pairs + 1);
+  size_t pos = 0;
+  for (size_t i = 0; i < num_blocks; i += kHistogramsPerBatch) {
+    const size_t num_to_combine = std::min(num_blocks - i, kHistogramsPerBatch);
+    uint32_t sizes[kHistogramsPerBatch];
+    uint32_t clusters[kHistogramsPerBatch];
+    uint32_t symbols[kHistogramsPerBatch];
+    uint32_t remap[kHistogramsPerBatch];
+    for (size_t j = 0; j < num_to_combine; ++j) {
+      histograms[j].Clear();
+      for (size_t k = 0; k < block_lengths[i + j]; ++k) {
+        histograms[j].Add(data[pos++]);
+      }
+      histograms[j].bit_cost_ = PopulationCost(histograms[j]);
+      symbols[j] = clusters[j] = static_cast<uint32_t>(j);
+      sizes[j] = 1;
+    }
+    size_t num_new_clusters = HistogramCombine(
+        &histograms[0], sizes, symbols, clusters, &pairs[0], num_to_combine,
+        num_to_combine, kHistogramsPerBatch, max_num_pairs);
+    for (size_t j = 0; j < num_new_clusters; ++j) {
+      all_histograms.push_back(histograms[clusters[j]]);
+      cluster_size.push_back(sizes[clusters[j]]);
+      remap[clusters[j]] = static_cast<uint32_t>(j);
+    }
+    for (size_t j = 0; j < num_to_combine; ++j) {
+      histogram_symbols[i + j] =
+          static_cast<uint32_t>(num_clusters) + remap[symbols[j]];
+    }
+    num_clusters += num_new_clusters;
+    assert(num_clusters == cluster_size.size());
+    assert(num_clusters == all_histograms.size());
+  }
+
+  max_num_pairs =
+      std::min(64 * num_clusters, (num_clusters / 2) * num_clusters);
+  pairs.resize(max_num_pairs + 1);
+
+  std::vector<uint32_t> clusters(num_clusters);
+  for (size_t i = 0; i < num_clusters; ++i) {
+    clusters[i] = static_cast<uint32_t>(i);
+  }
+  size_t num_final_clusters =
+      HistogramCombine(&all_histograms[0], &cluster_size[0],
+                       &histogram_symbols[0],
+                       &clusters[0], &pairs[0], num_clusters,
+                       num_blocks, kMaxNumberOfBlockTypes, max_num_pairs);
+
+  static const uint32_t kInvalidIndex = std::numeric_limits<uint32_t>::max();
+  std::vector<uint32_t> new_index(num_clusters, kInvalidIndex);
+  uint32_t next_index = 0;
+  pos = 0;
+  for (size_t i = 0; i < num_blocks; ++i) {
+    HistogramType histo;
+    for (size_t j = 0; j < block_lengths[i]; ++j) {
+      histo.Add(data[pos++]);
+    }
+    uint32_t best_out =
+        i == 0 ? histogram_symbols[0] : histogram_symbols[i - 1];
+    double best_bits = HistogramBitCostDistance(
+        histo, all_histograms[best_out]);
+    for (size_t j = 0; j < num_final_clusters; ++j) {
+      const double cur_bits = HistogramBitCostDistance(
+          histo, all_histograms[clusters[j]]);
+      if (cur_bits < best_bits) {
+        best_bits = cur_bits;
+        best_out = clusters[j];
+      }
+    }
+    histogram_symbols[i] = best_out;
+    if (new_index[best_out] == kInvalidIndex) {
+      new_index[best_out] = next_index++;
+    }
+  }
+  uint8_t max_type = 0;
+  uint32_t cur_length = 0;
+  block_idx = 0;
+  split->types.resize(num_blocks);
+  split->lengths.resize(num_blocks);
+  for (size_t i = 0; i < num_blocks; ++i) {
+    cur_length += block_lengths[i];
+    if (i + 1 == num_blocks ||
+        histogram_symbols[i] != histogram_symbols[i + 1]) {
+      const uint8_t id = static_cast<uint8_t>(new_index[histogram_symbols[i]]);
+      split->types[block_idx] = id;
+      split->lengths[block_idx] = cur_length;
+      max_type = std::max(max_type, id);
+      cur_length = 0;
+      ++block_idx;
+    }
+  }
+  split->types.resize(block_idx);
+  split->lengths.resize(block_idx);
+  split->num_types = static_cast<size_t>(max_type) + 1;
+}
+
+template<int kSize, typename DataType>
+void SplitByteVector(const std::vector<DataType>& data,
+                     const size_t literals_per_histogram,
+                     const size_t max_histograms,
+                     const size_t sampling_stride_length,
+                     const double block_switch_cost,
+                     BlockSplit* split) {
+  if (data.empty()) {
+    split->num_types = 1;
+    return;
+  } else if (data.size() < kMinLengthForBlockSplitting) {
+    split->num_types = 1;
+    split->types.push_back(0);
+    split->lengths.push_back(static_cast<uint32_t>(data.size()));
+    return;
+  }
+  size_t num_histograms = data.size() / literals_per_histogram + 1;
+  if (num_histograms > max_histograms) {
+    num_histograms = max_histograms;
+  }
+  Histogram<kSize>* histograms = new Histogram<kSize>[num_histograms];
+  // Find good entropy codes.
+  InitialEntropyCodes(&data[0], data.size(),
+                      sampling_stride_length,
+                      num_histograms, histograms);
+  RefineEntropyCodes(&data[0], data.size(),
+                     sampling_stride_length,
+                     num_histograms, histograms);
+  // Find a good path through literals with the good entropy codes.
+  std::vector<uint8_t> block_ids(data.size());
+  size_t num_blocks;
+  const size_t bitmaplen = (num_histograms + 7) >> 3;
+  double* insert_cost = new double[kSize * num_histograms];
+  double *cost = new double[num_histograms];
+  uint8_t* switch_signal = new uint8_t[data.size() * bitmaplen];
+  uint16_t* new_id = new uint16_t[num_histograms];
+  for (size_t i = 0; i < 10; ++i) {
+    num_blocks = FindBlocks(&data[0], data.size(),
+                            block_switch_cost,
+                            num_histograms, histograms,
+                            insert_cost, cost, switch_signal,
+                            &block_ids[0]);
+    num_histograms = RemapBlockIds(&block_ids[0], data.size(),
+                                   new_id, num_histograms);
+    BuildBlockHistograms(&data[0], data.size(), &block_ids[0],
+                         num_histograms, histograms);
+  }
+  delete[] insert_cost;
+  delete[] cost;
+  delete[] switch_signal;
+  delete[] new_id;
+  delete[] histograms;
+  ClusterBlocks<Histogram<kSize> >(&data[0], data.size(), num_blocks,
+                                   &block_ids[0], split);
+}
+
+void SplitBlock(const Command* cmds,
+                const size_t num_commands,
+                const uint8_t* data,
+                const size_t pos,
+                const size_t mask,
+                BlockSplit* literal_split,
+                BlockSplit* insert_and_copy_split,
+                BlockSplit* dist_split) {
+  {
+    // Create a continuous array of literals.
+    std::vector<uint8_t> literals;
+    CopyLiteralsToByteArray(cmds, num_commands, data, pos, mask, &literals);
+    // Create the block split on the array of literals.
+    // Literal histograms have alphabet size 256.
+    SplitByteVector<256>(
+        literals,
+        kSymbolsPerLiteralHistogram, kMaxLiteralHistograms,
+        kLiteralStrideLength, kLiteralBlockSwitchCost,
+        literal_split);
+  }
+
+  {
+    // Compute prefix codes for commands.
+    std::vector<uint16_t> insert_and_copy_codes(num_commands);
+    for (size_t i = 0; i < num_commands; ++i) {
+      insert_and_copy_codes[i] = cmds[i].cmd_prefix_;
+    }
+    // Create the block split on the array of command prefixes.
+    SplitByteVector<kNumCommandPrefixes>(
+        insert_and_copy_codes,
+        kSymbolsPerCommandHistogram, kMaxCommandHistograms,
+        kCommandStrideLength, kCommandBlockSwitchCost,
+        insert_and_copy_split);
+  }
+
+  {
+    // Create a continuous array of distance prefixes.
+    std::vector<uint16_t> distance_prefixes(num_commands);
+    size_t pos = 0;
+    for (size_t i = 0; i < num_commands; ++i) {
+      const Command& cmd = cmds[i];
+      if (cmd.copy_len() && cmd.cmd_prefix_ >= 128) {
+        distance_prefixes[pos++] = cmd.dist_prefix_;
+      }
+    }
+    distance_prefixes.resize(pos);
+    // Create the block split on the array of distance prefixes.
+    SplitByteVector<kNumDistancePrefixes>(
+        distance_prefixes,
+        kSymbolsPerDistanceHistogram, kMaxCommandHistograms,
+        kCommandStrideLength, kDistanceBlockSwitchCost,
+        dist_split);
+  }
+}
+
+}  // namespace brotli
diff --git a/third_party/brotli/enc/block_splitter.h b/third_party/brotli/enc/block_splitter.h
new file mode 100644
index 0000000..4f69296
--- /dev/null
+++ b/third_party/brotli/enc/block_splitter.h
@@ -0,0 +1,61 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Block split point selection utilities.
+
+#ifndef BROTLI_ENC_BLOCK_SPLITTER_H_
+#define BROTLI_ENC_BLOCK_SPLITTER_H_
+
+#include <vector>
+
+#include "./command.h"
+#include "./metablock.h"
+#include "./types.h"
+
+namespace brotli {
+
+struct BlockSplitIterator {
+  explicit BlockSplitIterator(const BlockSplit& split)
+      : split_(split), idx_(0), type_(0), length_(0) {
+    if (!split.lengths.empty()) {
+      length_ = split.lengths[0];
+    }
+  }
+
+  void Next(void) {
+    if (length_ == 0) {
+      ++idx_;
+      type_ = split_.types[idx_];
+      length_ = split_.lengths[idx_];
+    }
+    --length_;
+  }
+
+  const BlockSplit& split_;
+  size_t idx_;
+  size_t type_;
+  size_t length_;
+};
+
+void CopyLiteralsToByteArray(const Command* cmds,
+                             const size_t num_commands,
+                             const uint8_t* data,
+                             const size_t offset,
+                             const size_t mask,
+                             std::vector<uint8_t>* literals);
+
+void SplitBlock(const Command* cmds,
+                const size_t num_commands,
+                const uint8_t* data,
+                const size_t offset,
+                const size_t mask,
+                BlockSplit* literal_split,
+                BlockSplit* insert_and_copy_split,
+                BlockSplit* dist_split);
+
+}  // namespace brotli
+
+#endif  // BROTLI_ENC_BLOCK_SPLITTER_H_
diff --git a/third_party/brotli/enc/brotli_bit_stream.cc b/third_party/brotli/enc/brotli_bit_stream.cc
new file mode 100644
index 0000000..43f1210
--- /dev/null
+++ b/third_party/brotli/enc/brotli_bit_stream.cc
@@ -0,0 +1,1181 @@
+/* Copyright 2014 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Brotli bit stream functions to support the low level format. There are no
+// compression algorithms here, just the right ordering of bits to match the
+// specs.
+
+#include "./brotli_bit_stream.h"
+
+#include <algorithm>
+#include <cstdlib>  /* free, malloc */
+#include <cstring>
+#include <limits>
+#include <vector>
+
+#include "./bit_cost.h"
+#include "./context.h"
+#include "./entropy_encode.h"
+#include "./entropy_encode_static.h"
+#include "./fast_log.h"
+#include "./prefix.h"
+#include "./write_bits.h"
+
+namespace brotli {
+
+namespace {
+
+static const size_t kMaxHuffmanTreeSize = 2 * kNumCommandPrefixes + 1;
+// Context map alphabet has 256 context id symbols plus max 16 rle symbols.
+static const size_t kContextMapAlphabetSize = 256 + 16;
+// Block type alphabet has 256 block id symbols plus 2 special symbols.
+static const size_t kBlockTypeAlphabetSize = 256 + 2;
+
+// nibblesbits represents the 2 bits to encode MNIBBLES (0-3)
+// REQUIRES: length > 0
+// REQUIRES: length <= (1 << 24)
+void EncodeMlen(size_t length, uint64_t* bits,
+                size_t* numbits, uint64_t* nibblesbits) {
+  assert(length > 0);
+  assert(length <= (1 << 24));
+  length--;  // MLEN - 1 is encoded
+  size_t lg = length == 0 ? 1 : Log2FloorNonZero(
+      static_cast<uint32_t>(length)) + 1;
+  assert(lg <= 24);
+  size_t mnibbles = (lg < 16 ? 16 : (lg + 3)) / 4;
+  *nibblesbits = mnibbles - 4;
+  *numbits = mnibbles * 4;
+  *bits = length;
+}
+
+static inline void StoreCommandExtra(
+    const Command& cmd, size_t* storage_ix, uint8_t* storage) {
+  uint32_t copylen_code = cmd.copy_len_code();
+  uint16_t inscode = GetInsertLengthCode(cmd.insert_len_);
+  uint16_t copycode = GetCopyLengthCode(copylen_code);
+  uint32_t insnumextra = GetInsertExtra(inscode);
+  uint64_t insextraval = cmd.insert_len_ - GetInsertBase(inscode);
+  uint64_t copyextraval = copylen_code - GetCopyBase(copycode);
+  uint64_t bits = (copyextraval << insnumextra) | insextraval;
+  WriteBits(insnumextra + GetCopyExtra(copycode), bits, storage_ix, storage);
+}
+
+}  // namespace
+
+void StoreVarLenUint8(size_t n, size_t* storage_ix, uint8_t* storage) {
+  if (n == 0) {
+    WriteBits(1, 0, storage_ix, storage);
+  } else {
+    WriteBits(1, 1, storage_ix, storage);
+    size_t nbits = Log2FloorNonZero(n);
+    WriteBits(3, nbits, storage_ix, storage);
+    WriteBits(nbits, n - (1 << nbits), storage_ix, storage);
+  }
+}
+
+void StoreCompressedMetaBlockHeader(bool final_block,
+                                    size_t length,
+                                    size_t* storage_ix,
+                                    uint8_t* storage) {
+  // Write ISLAST bit.
+  WriteBits(1, final_block, storage_ix, storage);
+  // Write ISEMPTY bit.
+  if (final_block) {
+    WriteBits(1, 0, storage_ix, storage);
+  }
+
+  uint64_t lenbits;
+  size_t nlenbits;
+  uint64_t nibblesbits;
+  EncodeMlen(length, &lenbits, &nlenbits, &nibblesbits);
+  WriteBits(2, nibblesbits, storage_ix, storage);
+  WriteBits(nlenbits, lenbits, storage_ix, storage);
+
+  if (!final_block) {
+    // Write ISUNCOMPRESSED bit.
+    WriteBits(1, 0, storage_ix, storage);
+  }
+}
+
+void StoreUncompressedMetaBlockHeader(size_t length,
+                                      size_t* storage_ix,
+                                      uint8_t* storage) {
+  // Write ISLAST bit. Uncompressed block cannot be the last one, so set to 0.
+  WriteBits(1, 0, storage_ix, storage);
+  uint64_t lenbits;
+  size_t nlenbits;
+  uint64_t nibblesbits;
+  EncodeMlen(length, &lenbits, &nlenbits, &nibblesbits);
+  WriteBits(2, nibblesbits, storage_ix, storage);
+  WriteBits(nlenbits, lenbits, storage_ix, storage);
+  // Write ISUNCOMPRESSED bit.
+  WriteBits(1, 1, storage_ix, storage);
+}
+
+void StoreHuffmanTreeOfHuffmanTreeToBitMask(
+    const int num_codes,
+    const uint8_t *code_length_bitdepth,
+    size_t *storage_ix,
+    uint8_t *storage) {
+  static const uint8_t kStorageOrder[kCodeLengthCodes] = {
+    1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15
+  };
+  // The bit lengths of the Huffman code over the code length alphabet
+  // are compressed with the following static Huffman code:
+  //   Symbol   Code
+  //   ------   ----
+  //   0          00
+  //   1        1110
+  //   2         110
+  //   3          01
+  //   4          10
+  //   5        1111
+  static const uint8_t kHuffmanBitLengthHuffmanCodeSymbols[6] = {
+     0, 7, 3, 2, 1, 15
+  };
+  static const uint8_t kHuffmanBitLengthHuffmanCodeBitLengths[6] = {
+    2, 4, 3, 2, 2, 4
+  };
+
+  // Throw away trailing zeros:
+  size_t codes_to_store = kCodeLengthCodes;
+  if (num_codes > 1) {
+    for (; codes_to_store > 0; --codes_to_store) {
+      if (code_length_bitdepth[kStorageOrder[codes_to_store - 1]] != 0) {
+        break;
+      }
+    }
+  }
+  size_t skip_some = 0;  // skips none.
+  if (code_length_bitdepth[kStorageOrder[0]] == 0 &&
+      code_length_bitdepth[kStorageOrder[1]] == 0) {
+    skip_some = 2;  // skips two.
+    if (code_length_bitdepth[kStorageOrder[2]] == 0) {
+      skip_some = 3;  // skips three.
+    }
+  }
+  WriteBits(2, skip_some, storage_ix, storage);
+  for (size_t i = skip_some; i < codes_to_store; ++i) {
+    size_t l = code_length_bitdepth[kStorageOrder[i]];
+    WriteBits(kHuffmanBitLengthHuffmanCodeBitLengths[l],
+              kHuffmanBitLengthHuffmanCodeSymbols[l], storage_ix, storage);
+  }
+}
+
+static void StoreHuffmanTreeToBitMask(
+    const size_t huffman_tree_size,
+    const uint8_t* huffman_tree,
+    const uint8_t* huffman_tree_extra_bits,
+    const uint8_t* code_length_bitdepth,
+    const uint16_t* code_length_bitdepth_symbols,
+    size_t * __restrict storage_ix,
+    uint8_t * __restrict storage) {
+  for (size_t i = 0; i < huffman_tree_size; ++i) {
+    size_t ix = huffman_tree[i];
+    WriteBits(code_length_bitdepth[ix], code_length_bitdepth_symbols[ix],
+              storage_ix, storage);
+    // Extra bits
+    switch (ix) {
+      case 16:
+        WriteBits(2, huffman_tree_extra_bits[i], storage_ix, storage);
+        break;
+      case 17:
+        WriteBits(3, huffman_tree_extra_bits[i], storage_ix, storage);
+        break;
+    }
+  }
+}
+
+static void StoreSimpleHuffmanTree(const uint8_t* depths,
+                                   size_t symbols[4],
+                                   size_t num_symbols,
+                                   size_t max_bits,
+                                   size_t *storage_ix, uint8_t *storage) {
+  // value of 1 indicates a simple Huffman code
+  WriteBits(2, 1, storage_ix, storage);
+  WriteBits(2, num_symbols - 1, storage_ix, storage);  // NSYM - 1
+
+  // Sort
+  for (size_t i = 0; i < num_symbols; i++) {
+    for (size_t j = i + 1; j < num_symbols; j++) {
+      if (depths[symbols[j]] < depths[symbols[i]]) {
+        std::swap(symbols[j], symbols[i]);
+      }
+    }
+  }
+
+  if (num_symbols == 2) {
+    WriteBits(max_bits, symbols[0], storage_ix, storage);
+    WriteBits(max_bits, symbols[1], storage_ix, storage);
+  } else if (num_symbols == 3) {
+    WriteBits(max_bits, symbols[0], storage_ix, storage);
+    WriteBits(max_bits, symbols[1], storage_ix, storage);
+    WriteBits(max_bits, symbols[2], storage_ix, storage);
+  } else {
+    WriteBits(max_bits, symbols[0], storage_ix, storage);
+    WriteBits(max_bits, symbols[1], storage_ix, storage);
+    WriteBits(max_bits, symbols[2], storage_ix, storage);
+    WriteBits(max_bits, symbols[3], storage_ix, storage);
+    // tree-select
+    WriteBits(1, depths[symbols[0]] == 1 ? 1 : 0, storage_ix, storage);
+  }
+}
+
+// num = alphabet size
+// depths = symbol depths
+void StoreHuffmanTree(const uint8_t* depths, size_t num,
+                      HuffmanTree* tree,
+                      size_t *storage_ix, uint8_t *storage) {
+  // Write the Huffman tree into the brotli-representation.
+  // The command alphabet is the largest, so this allocation will fit all
+  // alphabets.
+  assert(num <= kNumCommandPrefixes);
+  uint8_t huffman_tree[kNumCommandPrefixes];
+  uint8_t huffman_tree_extra_bits[kNumCommandPrefixes];
+  size_t huffman_tree_size = 0;
+  WriteHuffmanTree(depths, num, &huffman_tree_size, huffman_tree,
+                   huffman_tree_extra_bits);
+
+  // Calculate the statistics of the Huffman tree in brotli-representation.
+  uint32_t huffman_tree_histogram[kCodeLengthCodes] = { 0 };
+  for (size_t i = 0; i < huffman_tree_size; ++i) {
+    ++huffman_tree_histogram[huffman_tree[i]];
+  }
+
+  int num_codes = 0;
+  int code = 0;
+  for (int i = 0; i < kCodeLengthCodes; ++i) {
+    if (huffman_tree_histogram[i]) {
+      if (num_codes == 0) {
+        code = i;
+        num_codes = 1;
+      } else if (num_codes == 1) {
+        num_codes = 2;
+        break;
+      }
+    }
+  }
+
+  // Calculate another Huffman tree to use for compressing both the
+  // earlier Huffman tree with.
+  uint8_t code_length_bitdepth[kCodeLengthCodes] = { 0 };
+  uint16_t code_length_bitdepth_symbols[kCodeLengthCodes] = { 0 };
+  CreateHuffmanTree(&huffman_tree_histogram[0], kCodeLengthCodes,
+                    5, tree, &code_length_bitdepth[0]);
+  ConvertBitDepthsToSymbols(code_length_bitdepth, kCodeLengthCodes,
+                            &code_length_bitdepth_symbols[0]);
+
+  // Now, we have all the data, let's start storing it
+  StoreHuffmanTreeOfHuffmanTreeToBitMask(num_codes, code_length_bitdepth,
+                                         storage_ix, storage);
+
+  if (num_codes == 1) {
+    code_length_bitdepth[code] = 0;
+  }
+
+  // Store the real huffman tree now.
+  StoreHuffmanTreeToBitMask(huffman_tree_size,
+                            huffman_tree,
+                            huffman_tree_extra_bits,
+                            &code_length_bitdepth[0],
+                            code_length_bitdepth_symbols,
+                            storage_ix, storage);
+}
+
+void BuildAndStoreHuffmanTree(const uint32_t *histogram,
+                              const size_t length,
+                              HuffmanTree* tree,
+                              uint8_t* depth,
+                              uint16_t* bits,
+                              size_t* storage_ix,
+                              uint8_t* storage) {
+  size_t count = 0;
+  size_t s4[4] = { 0 };
+  for (size_t i = 0; i < length; i++) {
+    if (histogram[i]) {
+      if (count < 4) {
+        s4[count] = i;
+      } else if (count > 4) {
+        break;
+      }
+      count++;
+    }
+  }
+
+  size_t max_bits_counter = length - 1;
+  size_t max_bits = 0;
+  while (max_bits_counter) {
+    max_bits_counter >>= 1;
+    ++max_bits;
+  }
+
+  if (count <= 1) {
+    WriteBits(4, 1, storage_ix, storage);
+    WriteBits(max_bits, s4[0], storage_ix, storage);
+    return;
+  }
+
+  CreateHuffmanTree(histogram, length, 15, tree, depth);
+  ConvertBitDepthsToSymbols(depth, length, bits);
+
+  if (count <= 4) {
+    StoreSimpleHuffmanTree(depth, s4, count, max_bits, storage_ix, storage);
+  } else {
+    StoreHuffmanTree(depth, length, tree, storage_ix, storage);
+  }
+}
+
+static inline bool SortHuffmanTree(const HuffmanTree& v0,
+                                   const HuffmanTree& v1) {
+  return v0.total_count_ < v1.total_count_;
+}
+
+void BuildAndStoreHuffmanTreeFast(const uint32_t *histogram,
+                                  const size_t histogram_total,
+                                  const size_t max_bits,
+                                  uint8_t* depth,
+                                  uint16_t* bits,
+                                  size_t* storage_ix,
+                                  uint8_t* storage) {
+  size_t count = 0;
+  size_t symbols[4] = { 0 };
+  size_t length = 0;
+  size_t total = histogram_total;
+  while (total != 0) {
+    if (histogram[length]) {
+      if (count < 4) {
+        symbols[count] = length;
+      }
+      ++count;
+      total -= histogram[length];
+    }
+    ++length;
+  }
+
+  if (count <= 1) {
+    WriteBits(4, 1, storage_ix, storage);
+    WriteBits(max_bits, symbols[0], storage_ix, storage);
+    return;
+  }
+
+  const size_t max_tree_size = 2 * length + 1;
+  HuffmanTree* const tree =
+      static_cast<HuffmanTree*>(malloc(max_tree_size * sizeof(HuffmanTree)));
+  for (uint32_t count_limit = 1; ; count_limit *= 2) {
+    HuffmanTree* node = tree;
+    for (size_t i = length; i != 0;) {
+      --i;
+      if (histogram[i]) {
+        if (PREDICT_TRUE(histogram[i] >= count_limit)) {
+          *node = HuffmanTree(histogram[i], -1, static_cast<int16_t>(i));
+        } else {
+          *node = HuffmanTree(count_limit, -1, static_cast<int16_t>(i));
+        }
+        ++node;
+      }
+    }
+    const int n = static_cast<int>(node - tree);
+    std::sort(tree, node, SortHuffmanTree);
+    // The nodes are:
+    // [0, n): the sorted leaf nodes that we start with.
+    // [n]: we add a sentinel here.
+    // [n + 1, 2n): new parent nodes are added here, starting from
+    //              (n+1). These are naturally in ascending order.
+    // [2n]: we add a sentinel at the end as well.
+    // There will be (2n+1) elements at the end.
+    const HuffmanTree sentinel(std::numeric_limits<int>::max(), -1, -1);
+    *node++ = sentinel;
+    *node++ = sentinel;
+
+    int i = 0;      // Points to the next leaf node.
+    int j = n + 1;  // Points to the next non-leaf node.
+    for (int k = n - 1; k > 0; --k) {
+      int left, right;
+      if (tree[i].total_count_ <= tree[j].total_count_) {
+        left = i;
+        ++i;
+      } else {
+        left = j;
+        ++j;
+      }
+      if (tree[i].total_count_ <= tree[j].total_count_) {
+        right = i;
+        ++i;
+      } else {
+        right = j;
+        ++j;
+      }
+      // The sentinel node becomes the parent node.
+      node[-1].total_count_ =
+          tree[left].total_count_ + tree[right].total_count_;
+      node[-1].index_left_ = static_cast<int16_t>(left);
+      node[-1].index_right_or_value_ = static_cast<int16_t>(right);
+      // Add back the last sentinel node.
+      *node++ = sentinel;
+    }
+    SetDepth(tree[2 * n - 1], &tree[0], depth, 0);
+    // We need to pack the Huffman tree in 14 bits.
+    // If this was not successful, add fake entities to the lowest values
+    // and retry.
+    if (PREDICT_TRUE(*std::max_element(&depth[0], &depth[length]) <= 14)) {
+      break;
+    }
+  }
+  free(tree);
+  ConvertBitDepthsToSymbols(depth, length, bits);
+  if (count <= 4) {
+    // value of 1 indicates a simple Huffman code
+    WriteBits(2, 1, storage_ix, storage);
+    WriteBits(2, count - 1, storage_ix, storage);  // NSYM - 1
+
+    // Sort
+    for (size_t i = 0; i < count; i++) {
+      for (size_t j = i + 1; j < count; j++) {
+        if (depth[symbols[j]] < depth[symbols[i]]) {
+          std::swap(symbols[j], symbols[i]);
+        }
+      }
+    }
+
+    if (count == 2) {
+      WriteBits(max_bits, symbols[0], storage_ix, storage);
+      WriteBits(max_bits, symbols[1], storage_ix, storage);
+    } else if (count == 3) {
+      WriteBits(max_bits, symbols[0], storage_ix, storage);
+      WriteBits(max_bits, symbols[1], storage_ix, storage);
+      WriteBits(max_bits, symbols[2], storage_ix, storage);
+    } else {
+      WriteBits(max_bits, symbols[0], storage_ix, storage);
+      WriteBits(max_bits, symbols[1], storage_ix, storage);
+      WriteBits(max_bits, symbols[2], storage_ix, storage);
+      WriteBits(max_bits, symbols[3], storage_ix, storage);
+      // tree-select
+      WriteBits(1, depth[symbols[0]] == 1 ? 1 : 0, storage_ix, storage);
+    }
+  } else {
+    // Complex Huffman Tree
+    StoreStaticCodeLengthCode(storage_ix, storage);
+
+    // Actual rle coding.
+    uint8_t previous_value = 8;
+    for (size_t i = 0; i < length;) {
+      const uint8_t value = depth[i];
+      size_t reps = 1;
+      for (size_t k = i + 1; k < length && depth[k] == value; ++k) {
+        ++reps;
+      }
+      i += reps;
+      if (value == 0) {
+        WriteBits(kZeroRepsDepth[reps], kZeroRepsBits[reps],
+                  storage_ix, storage);
+      } else {
+        if (previous_value != value) {
+          WriteBits(kCodeLengthDepth[value], kCodeLengthBits[value],
+                    storage_ix, storage);
+          --reps;
+        }
+        if (reps < 3) {
+          while (reps != 0) {
+            reps--;
+            WriteBits(kCodeLengthDepth[value], kCodeLengthBits[value],
+                      storage_ix, storage);
+          }
+        } else {
+          reps -= 3;
+          WriteBits(kNonZeroRepsDepth[reps], kNonZeroRepsBits[reps],
+                    storage_ix, storage);
+        }
+        previous_value = value;
+      }
+    }
+  }
+}
+
+static size_t IndexOf(const uint8_t* v, size_t v_size, uint8_t value) {
+  size_t i = 0;
+  for (; i < v_size; ++i) {
+    if (v[i] == value) return i;
+  }
+  return i;
+}
+
+static void MoveToFront(uint8_t* v, size_t index) {
+  uint8_t value = v[index];
+  for (size_t i = index; i != 0; --i) {
+    v[i] = v[i - 1];
+  }
+  v[0] = value;
+}
+
+static void MoveToFrontTransform(const uint32_t* __restrict v_in,
+                                 const size_t v_size,
+                                 uint32_t* v_out) {
+  if (v_size == 0) {
+    return;
+  }
+  uint32_t max_value = *std::max_element(v_in, v_in + v_size);
+  assert(max_value < 256u);
+  uint8_t mtf[256];
+  size_t mtf_size = max_value + 1;
+  for (uint32_t i = 0; i <= max_value; ++i) {
+    mtf[i] = static_cast<uint8_t>(i);
+  }
+  for (size_t i = 0; i < v_size; ++i) {
+    size_t index = IndexOf(mtf, mtf_size, static_cast<uint8_t>(v_in[i]));
+    assert(index < mtf_size);
+    v_out[i] = static_cast<uint32_t>(index);
+    MoveToFront(mtf, index);
+  }
+}
+
+// Finds runs of zeros in v[0..in_size) and replaces them with a prefix code of
+// the run length plus extra bits (lower 9 bits is the prefix code and the rest
+// are the extra bits). Non-zero values in v[] are shifted by
+// *max_length_prefix. Will not create prefix codes bigger than the initial
+// value of *max_run_length_prefix. The prefix code of run length L is simply
+// Log2Floor(L) and the number of extra bits is the same as the prefix code.
+static void RunLengthCodeZeros(const size_t in_size,
+                               uint32_t* __restrict v,
+                               size_t* __restrict out_size,
+                               uint32_t* __restrict max_run_length_prefix) {
+  uint32_t max_reps = 0;
+  for (size_t i = 0; i < in_size;) {
+    for (; i < in_size && v[i] != 0; ++i) ;
+    uint32_t reps = 0;
+    for (; i < in_size && v[i] == 0; ++i) {
+      ++reps;
+    }
+    max_reps = std::max(reps, max_reps);
+  }
+  uint32_t max_prefix = max_reps > 0 ? Log2FloorNonZero(max_reps) : 0;
+  max_prefix = std::min(max_prefix, *max_run_length_prefix);
+  *max_run_length_prefix = max_prefix;
+  *out_size = 0;
+  for (size_t i = 0; i < in_size;) {
+    assert(*out_size <= i);
+    if (v[i] != 0) {
+      v[*out_size] = v[i] + *max_run_length_prefix;
+      ++i;
+      ++(*out_size);
+    } else {
+      uint32_t reps = 1;
+      for (size_t k = i + 1; k < in_size && v[k] == 0; ++k) {
+        ++reps;
+      }
+      i += reps;
+      while (reps != 0) {
+        if (reps < (2u << max_prefix)) {
+          uint32_t run_length_prefix = Log2FloorNonZero(reps);
+          const uint32_t extra_bits = reps - (1u << run_length_prefix);
+          v[*out_size] = run_length_prefix + (extra_bits << 9);
+          ++(*out_size);
+          break;
+        } else {
+          const uint32_t extra_bits = (1u << max_prefix) - 1u;
+          v[*out_size] = max_prefix + (extra_bits << 9);
+          reps -= (2u << max_prefix) - 1u;
+          ++(*out_size);
+        }
+      }
+    }
+  }
+}
+
+void EncodeContextMap(const std::vector<uint32_t>& context_map,
+                      size_t num_clusters,
+                      HuffmanTree* tree,
+                      size_t* storage_ix, uint8_t* storage) {
+  StoreVarLenUint8(num_clusters - 1, storage_ix, storage);
+
+  if (num_clusters == 1) {
+    return;
+  }
+
+  uint32_t* rle_symbols = new uint32_t[context_map.size()];
+  MoveToFrontTransform(&context_map[0], context_map.size(), rle_symbols);
+  uint32_t max_run_length_prefix = 6;
+  size_t num_rle_symbols = 0;
+  RunLengthCodeZeros(context_map.size(), rle_symbols,
+                     &num_rle_symbols, &max_run_length_prefix);
+  uint32_t histogram[kContextMapAlphabetSize];
+  memset(histogram, 0, sizeof(histogram));
+  static const int kSymbolBits = 9;
+  static const uint32_t kSymbolMask = (1u << kSymbolBits) - 1u;
+  for (size_t i = 0; i < num_rle_symbols; ++i) {
+    ++histogram[rle_symbols[i] & kSymbolMask];
+  }
+  bool use_rle = max_run_length_prefix > 0;
+  WriteBits(1, use_rle, storage_ix, storage);
+  if (use_rle) {
+    WriteBits(4, max_run_length_prefix - 1, storage_ix, storage);
+  }
+  uint8_t depths[kContextMapAlphabetSize];
+  uint16_t bits[kContextMapAlphabetSize];
+  memset(depths, 0, sizeof(depths));
+  memset(bits, 0, sizeof(bits));
+  BuildAndStoreHuffmanTree(histogram, num_clusters + max_run_length_prefix,
+                           tree, depths, bits, storage_ix, storage);
+  for (size_t i = 0; i < num_rle_symbols; ++i) {
+    const uint32_t rle_symbol = rle_symbols[i] & kSymbolMask;
+    const uint32_t extra_bits_val = rle_symbols[i] >> kSymbolBits;
+    WriteBits(depths[rle_symbol], bits[rle_symbol], storage_ix, storage);
+    if (rle_symbol > 0 && rle_symbol <= max_run_length_prefix) {
+      WriteBits(rle_symbol, extra_bits_val, storage_ix, storage);
+    }
+  }
+  WriteBits(1, 1, storage_ix, storage);  // use move-to-front
+  delete[] rle_symbols;
+}
+
+void StoreBlockSwitch(const BlockSplitCode& code,
+                      const size_t block_ix,
+                      size_t* storage_ix,
+                      uint8_t* storage) {
+  if (block_ix > 0) {
+    size_t typecode = code.type_code[block_ix];
+    WriteBits(code.type_depths[typecode], code.type_bits[typecode],
+              storage_ix, storage);
+  }
+  size_t lencode = code.length_prefix[block_ix];
+  WriteBits(code.length_depths[lencode], code.length_bits[lencode],
+            storage_ix, storage);
+  WriteBits(code.length_nextra[block_ix], code.length_extra[block_ix],
+            storage_ix, storage);
+}
+
+static void BuildAndStoreBlockSplitCode(const std::vector<uint8_t>& types,
+                                        const std::vector<uint32_t>& lengths,
+                                        const size_t num_types,
+                                        HuffmanTree* tree,
+                                        BlockSplitCode* code,
+                                        size_t* storage_ix,
+                                        uint8_t* storage) {
+  const size_t num_blocks = types.size();
+  uint32_t type_histo[kBlockTypeAlphabetSize];
+  uint32_t length_histo[kNumBlockLenPrefixes];
+  memset(type_histo, 0, (num_types + 2) * sizeof(type_histo[0]));
+  memset(length_histo, 0, sizeof(length_histo));
+  size_t last_type = 1;
+  size_t second_last_type = 0;
+  code->type_code.resize(num_blocks);
+  code->length_prefix.resize(num_blocks);
+  code->length_nextra.resize(num_blocks);
+  code->length_extra.resize(num_blocks);
+  code->type_depths.resize(num_types + 2);
+  code->type_bits.resize(num_types + 2);
+  memset(code->length_depths, 0, sizeof(code->length_depths));
+  memset(code->length_bits, 0, sizeof(code->length_bits));
+  for (size_t i = 0; i < num_blocks; ++i) {
+    size_t type = types[i];
+    size_t type_code = (type == last_type + 1 ? 1 :
+                     type == second_last_type ? 0 :
+                     type + 2);
+    second_last_type = last_type;
+    last_type = type;
+    code->type_code[i] = static_cast<uint32_t>(type_code);
+    if (i != 0) ++type_histo[type_code];
+    GetBlockLengthPrefixCode(lengths[i],
+                             &code->length_prefix[i],
+                             &code->length_nextra[i],
+                             &code->length_extra[i]);
+    ++length_histo[code->length_prefix[i]];
+  }
+  StoreVarLenUint8(num_types - 1, storage_ix, storage);
+  if (num_types > 1) {
+    BuildAndStoreHuffmanTree(&type_histo[0], num_types + 2, tree,
+                             &code->type_depths[0], &code->type_bits[0],
+                             storage_ix, storage);
+    BuildAndStoreHuffmanTree(&length_histo[0], kNumBlockLenPrefixes, tree,
+                             &code->length_depths[0], &code->length_bits[0],
+                             storage_ix, storage);
+    StoreBlockSwitch(*code, 0, storage_ix, storage);
+  }
+}
+
+void StoreTrivialContextMap(size_t num_types,
+                            size_t context_bits,
+                            HuffmanTree* tree,
+                            size_t* storage_ix,
+                            uint8_t* storage) {
+  StoreVarLenUint8(num_types - 1, storage_ix, storage);
+  if (num_types > 1) {
+    size_t repeat_code = context_bits - 1u;
+    size_t repeat_bits = (1u << repeat_code) - 1u;
+    size_t alphabet_size = num_types + repeat_code;
+    uint32_t histogram[kContextMapAlphabetSize];
+    uint8_t depths[kContextMapAlphabetSize];
+    uint16_t bits[kContextMapAlphabetSize];
+    memset(histogram, 0, alphabet_size * sizeof(histogram[0]));
+    memset(depths, 0, alphabet_size * sizeof(depths[0]));
+    memset(bits, 0, alphabet_size * sizeof(bits[0]));
+    // Write RLEMAX.
+    WriteBits(1, 1, storage_ix, storage);
+    WriteBits(4, repeat_code - 1, storage_ix, storage);
+    histogram[repeat_code] = static_cast<uint32_t>(num_types);
+    histogram[0] = 1;
+    for (size_t i = context_bits; i < alphabet_size; ++i) {
+      histogram[i] = 1;
+    }
+    BuildAndStoreHuffmanTree(&histogram[0], alphabet_size, tree,
+                             &depths[0], &bits[0],
+                             storage_ix, storage);
+    for (size_t i = 0; i < num_types; ++i) {
+      size_t code = (i == 0 ? 0 : i + context_bits - 1);
+      WriteBits(depths[code], bits[code], storage_ix, storage);
+      WriteBits(depths[repeat_code], bits[repeat_code], storage_ix, storage);
+      WriteBits(repeat_code, repeat_bits, storage_ix, storage);
+    }
+    // Write IMTF (inverse-move-to-front) bit.
+    WriteBits(1, 1, storage_ix, storage);
+  }
+}
+
+// Manages the encoding of one block category (literal, command or distance).
+class BlockEncoder {
+ public:
+  BlockEncoder(size_t alphabet_size,
+               size_t num_block_types,
+               const std::vector<uint8_t>& block_types,
+               const std::vector<uint32_t>& block_lengths)
+      : alphabet_size_(alphabet_size),
+        num_block_types_(num_block_types),
+        block_types_(block_types),
+        block_lengths_(block_lengths),
+        block_ix_(0),
+        block_len_(block_lengths.empty() ? 0 : block_lengths[0]),
+        entropy_ix_(0) {}
+
+  // Creates entropy codes of block lengths and block types and stores them
+  // to the bit stream.
+  void BuildAndStoreBlockSwitchEntropyCodes(HuffmanTree* tree,
+                                            size_t* storage_ix,
+                                            uint8_t* storage) {
+    BuildAndStoreBlockSplitCode(
+        block_types_, block_lengths_, num_block_types_,
+        tree, &block_split_code_, storage_ix, storage);
+  }
+
+  // Creates entropy codes for all block types and stores them to the bit
+  // stream.
+  template<int kSize>
+  void BuildAndStoreEntropyCodes(
+      const std::vector<Histogram<kSize> >& histograms,
+      HuffmanTree* tree,
+      size_t* storage_ix, uint8_t* storage) {
+    depths_.resize(histograms.size() * alphabet_size_);
+    bits_.resize(histograms.size() * alphabet_size_);
+    for (size_t i = 0; i < histograms.size(); ++i) {
+      size_t ix = i * alphabet_size_;
+      BuildAndStoreHuffmanTree(&histograms[i].data_[0], alphabet_size_,
+                               tree,
+                               &depths_[ix], &bits_[ix],
+                               storage_ix, storage);
+    }
+  }
+
+  // Stores the next symbol with the entropy code of the current block type.
+  // Updates the block type and block length at block boundaries.
+  void StoreSymbol(size_t symbol, size_t* storage_ix, uint8_t* storage) {
+    if (block_len_ == 0) {
+      ++block_ix_;
+      block_len_ = block_lengths_[block_ix_];
+      entropy_ix_ = block_types_[block_ix_] * alphabet_size_;
+      StoreBlockSwitch(block_split_code_, block_ix_, storage_ix, storage);
+    }
+    --block_len_;
+    size_t ix = entropy_ix_ + symbol;
+    WriteBits(depths_[ix], bits_[ix], storage_ix, storage);
+  }
+
+  // Stores the next symbol with the entropy code of the current block type and
+  // context value.
+  // Updates the block type and block length at block boundaries.
+  template<int kContextBits>
+  void StoreSymbolWithContext(size_t symbol, size_t context,
+                              const std::vector<uint32_t>& context_map,
+                              size_t* storage_ix, uint8_t* storage) {
+    if (block_len_ == 0) {
+      ++block_ix_;
+      block_len_ = block_lengths_[block_ix_];
+      size_t block_type = block_types_[block_ix_];
+      entropy_ix_ = block_type << kContextBits;
+      StoreBlockSwitch(block_split_code_, block_ix_, storage_ix, storage);
+    }
+    --block_len_;
+    size_t histo_ix = context_map[entropy_ix_ + context];
+    size_t ix = histo_ix * alphabet_size_ + symbol;
+    WriteBits(depths_[ix], bits_[ix], storage_ix, storage);
+  }
+
+ private:
+  const size_t alphabet_size_;
+  const size_t num_block_types_;
+  const std::vector<uint8_t>& block_types_;
+  const std::vector<uint32_t>& block_lengths_;
+  BlockSplitCode block_split_code_;
+  size_t block_ix_;
+  size_t block_len_;
+  size_t entropy_ix_;
+  std::vector<uint8_t> depths_;
+  std::vector<uint16_t> bits_;
+};
+
+static void JumpToByteBoundary(size_t* storage_ix, uint8_t* storage) {
+  *storage_ix = (*storage_ix + 7u) & ~7u;
+  storage[*storage_ix >> 3] = 0;
+}
+
+void StoreMetaBlock(const uint8_t* input,
+                    size_t start_pos,
+                    size_t length,
+                    size_t mask,
+                    uint8_t prev_byte,
+                    uint8_t prev_byte2,
+                    bool is_last,
+                    uint32_t num_direct_distance_codes,
+                    uint32_t distance_postfix_bits,
+                    ContextType literal_context_mode,
+                    const brotli::Command *commands,
+                    size_t n_commands,
+                    const MetaBlockSplit& mb,
+                    size_t *storage_ix,
+                    uint8_t *storage) {
+  StoreCompressedMetaBlockHeader(is_last, length, storage_ix, storage);
+
+  size_t num_distance_codes =
+      kNumDistanceShortCodes + num_direct_distance_codes +
+      (48u << distance_postfix_bits);
+
+  HuffmanTree* tree = static_cast<HuffmanTree*>(
+      malloc(kMaxHuffmanTreeSize * sizeof(HuffmanTree)));
+  BlockEncoder literal_enc(256,
+                           mb.literal_split.num_types,
+                           mb.literal_split.types,
+                           mb.literal_split.lengths);
+  BlockEncoder command_enc(kNumCommandPrefixes,
+                           mb.command_split.num_types,
+                           mb.command_split.types,
+                           mb.command_split.lengths);
+  BlockEncoder distance_enc(num_distance_codes,
+                            mb.distance_split.num_types,
+                            mb.distance_split.types,
+                            mb.distance_split.lengths);
+
+  literal_enc.BuildAndStoreBlockSwitchEntropyCodes(tree, storage_ix, storage);
+  command_enc.BuildAndStoreBlockSwitchEntropyCodes(tree, storage_ix, storage);
+  distance_enc.BuildAndStoreBlockSwitchEntropyCodes(tree, storage_ix, storage);
+
+  WriteBits(2, distance_postfix_bits, storage_ix, storage);
+  WriteBits(4, num_direct_distance_codes >> distance_postfix_bits,
+            storage_ix, storage);
+  for (size_t i = 0; i < mb.literal_split.num_types; ++i) {
+    WriteBits(2, literal_context_mode, storage_ix, storage);
+  }
+
+  size_t num_literal_histograms = mb.literal_histograms.size();
+  if (mb.literal_context_map.empty()) {
+    StoreTrivialContextMap(num_literal_histograms, kLiteralContextBits, tree,
+                           storage_ix, storage);
+  } else {
+    EncodeContextMap(mb.literal_context_map, num_literal_histograms, tree,
+                     storage_ix, storage);
+  }
+
+  size_t num_dist_histograms = mb.distance_histograms.size();
+  if (mb.distance_context_map.empty()) {
+    StoreTrivialContextMap(num_dist_histograms, kDistanceContextBits, tree,
+                           storage_ix, storage);
+  } else {
+    EncodeContextMap(mb.distance_context_map, num_dist_histograms, tree,
+                     storage_ix, storage);
+  }
+
+  literal_enc.BuildAndStoreEntropyCodes(mb.literal_histograms, tree,
+                                        storage_ix, storage);
+  command_enc.BuildAndStoreEntropyCodes(mb.command_histograms, tree,
+                                        storage_ix, storage);
+  distance_enc.BuildAndStoreEntropyCodes(mb.distance_histograms, tree,
+                                         storage_ix, storage);
+  free(tree);
+
+  size_t pos = start_pos;
+  for (size_t i = 0; i < n_commands; ++i) {
+    const Command cmd = commands[i];
+    size_t cmd_code = cmd.cmd_prefix_;
+    command_enc.StoreSymbol(cmd_code, storage_ix, storage);
+    StoreCommandExtra(cmd, storage_ix, storage);
+    if (mb.literal_context_map.empty()) {
+      for (size_t j = cmd.insert_len_; j != 0; --j) {
+        literal_enc.StoreSymbol(input[pos & mask], storage_ix, storage);
+        ++pos;
+      }
+    } else {
+      for (size_t j = cmd.insert_len_; j != 0; --j) {
+        size_t context = Context(prev_byte, prev_byte2, literal_context_mode);
+        uint8_t literal = input[pos & mask];
+        literal_enc.StoreSymbolWithContext<kLiteralContextBits>(
+            literal, context, mb.literal_context_map, storage_ix, storage);
+        prev_byte2 = prev_byte;
+        prev_byte = literal;
+        ++pos;
+      }
+    }
+    pos += cmd.copy_len();
+    if (cmd.copy_len()) {
+      prev_byte2 = input[(pos - 2) & mask];
+      prev_byte = input[(pos - 1) & mask];
+      if (cmd.cmd_prefix_ >= 128) {
+        size_t dist_code = cmd.dist_prefix_;
+        uint32_t distnumextra = cmd.dist_extra_ >> 24;
+        uint64_t distextra = cmd.dist_extra_ & 0xffffff;
+        if (mb.distance_context_map.empty()) {
+          distance_enc.StoreSymbol(dist_code, storage_ix, storage);
+        } else {
+          size_t context = cmd.DistanceContext();
+          distance_enc.StoreSymbolWithContext<kDistanceContextBits>(
+              dist_code, context, mb.distance_context_map, storage_ix, storage);
+        }
+        brotli::WriteBits(distnumextra, distextra, storage_ix, storage);
+      }
+    }
+  }
+  if (is_last) {
+    JumpToByteBoundary(storage_ix, storage);
+  }
+}
+
+static void BuildHistograms(const uint8_t* input,
+                            size_t start_pos,
+                            size_t mask,
+                            const brotli::Command *commands,
+                            size_t n_commands,
+                            HistogramLiteral* lit_histo,
+                            HistogramCommand* cmd_histo,
+                            HistogramDistance* dist_histo) {
+  size_t pos = start_pos;
+  for (size_t i = 0; i < n_commands; ++i) {
+    const Command cmd = commands[i];
+    cmd_histo->Add(cmd.cmd_prefix_);
+    for (size_t j = cmd.insert_len_; j != 0; --j) {
+      lit_histo->Add(input[pos & mask]);
+      ++pos;
+    }
+    pos += cmd.copy_len();
+    if (cmd.copy_len() && cmd.cmd_prefix_ >= 128) {
+      dist_histo->Add(cmd.dist_prefix_);
+    }
+  }
+}
+
+static void StoreDataWithHuffmanCodes(const uint8_t* input,
+                                      size_t start_pos,
+                                      size_t mask,
+                                      const brotli::Command *commands,
+                                      size_t n_commands,
+                                      const uint8_t* lit_depth,
+                                      const uint16_t* lit_bits,
+                                      const uint8_t* cmd_depth,
+                                      const uint16_t* cmd_bits,
+                                      const uint8_t* dist_depth,
+                                      const uint16_t* dist_bits,
+                                      size_t* storage_ix,
+                                      uint8_t* storage) {
+  size_t pos = start_pos;
+  for (size_t i = 0; i < n_commands; ++i) {
+    const Command cmd = commands[i];
+    const size_t cmd_code = cmd.cmd_prefix_;
+    WriteBits(cmd_depth[cmd_code], cmd_bits[cmd_code], storage_ix, storage);
+    StoreCommandExtra(cmd, storage_ix, storage);
+    for (size_t j = cmd.insert_len_; j != 0; --j) {
+      const uint8_t literal = input[pos & mask];
+      WriteBits(lit_depth[literal], lit_bits[literal], storage_ix, storage);
+      ++pos;
+    }
+    pos += cmd.copy_len();
+    if (cmd.copy_len() && cmd.cmd_prefix_ >= 128) {
+      const size_t dist_code = cmd.dist_prefix_;
+      const uint32_t distnumextra = cmd.dist_extra_ >> 24;
+      const uint32_t distextra = cmd.dist_extra_ & 0xffffff;
+      WriteBits(dist_depth[dist_code], dist_bits[dist_code],
+                storage_ix, storage);
+      WriteBits(distnumextra, distextra, storage_ix, storage);
+    }
+  }
+}
+
+void StoreMetaBlockTrivial(const uint8_t* input,
+                           size_t start_pos,
+                           size_t length,
+                           size_t mask,
+                           bool is_last,
+                           const brotli::Command *commands,
+                           size_t n_commands,
+                           size_t *storage_ix,
+                           uint8_t *storage) {
+  StoreCompressedMetaBlockHeader(is_last, length, storage_ix, storage);
+
+  HistogramLiteral lit_histo;
+  HistogramCommand cmd_histo;
+  HistogramDistance dist_histo;
+
+  BuildHistograms(input, start_pos, mask, commands, n_commands,
+                  &lit_histo, &cmd_histo, &dist_histo);
+
+  WriteBits(13, 0, storage_ix, storage);
+
+  std::vector<uint8_t> lit_depth(256);
+  std::vector<uint16_t> lit_bits(256);
+  std::vector<uint8_t> cmd_depth(kNumCommandPrefixes);
+  std::vector<uint16_t> cmd_bits(kNumCommandPrefixes);
+  std::vector<uint8_t> dist_depth(64);
+  std::vector<uint16_t> dist_bits(64);
+
+  HuffmanTree* tree = static_cast<HuffmanTree*>(
+      malloc(kMaxHuffmanTreeSize * sizeof(HuffmanTree)));
+  BuildAndStoreHuffmanTree(&lit_histo.data_[0], 256, tree,
+                           &lit_depth[0], &lit_bits[0],
+                           storage_ix, storage);
+  BuildAndStoreHuffmanTree(&cmd_histo.data_[0], kNumCommandPrefixes, tree,
+                           &cmd_depth[0], &cmd_bits[0],
+                           storage_ix, storage);
+  BuildAndStoreHuffmanTree(&dist_histo.data_[0], 64, tree,
+                           &dist_depth[0], &dist_bits[0],
+                           storage_ix, storage);
+  free(tree);
+  StoreDataWithHuffmanCodes(input, start_pos, mask, commands,
+                            n_commands, &lit_depth[0], &lit_bits[0],
+                            &cmd_depth[0], &cmd_bits[0],
+                            &dist_depth[0], &dist_bits[0],
+                            storage_ix, storage);
+  if (is_last) {
+    JumpToByteBoundary(storage_ix, storage);
+  }
+}
+
+void StoreMetaBlockFast(const uint8_t* input,
+                        size_t start_pos,
+                        size_t length,
+                        size_t mask,
+                        bool is_last,
+                        const brotli::Command *commands,
+                        size_t n_commands,
+                        size_t *storage_ix,
+                        uint8_t *storage) {
+  StoreCompressedMetaBlockHeader(is_last, length, storage_ix, storage);
+
+  WriteBits(13, 0, storage_ix, storage);
+
+  if (n_commands <= 128) {
+    uint32_t histogram[256] = { 0 };
+    size_t pos = start_pos;
+    size_t num_literals = 0;
+    for (size_t i = 0; i < n_commands; ++i) {
+      const Command cmd = commands[i];
+      for (size_t j = cmd.insert_len_; j != 0; --j) {
+        ++histogram[input[pos & mask]];
+        ++pos;
+      }
+      num_literals += cmd.insert_len_;
+      pos += cmd.copy_len();
+    }
+    uint8_t lit_depth[256] = { 0 };
+    uint16_t lit_bits[256] = { 0 };
+    BuildAndStoreHuffmanTreeFast(histogram, num_literals,
+                                 /* max_bits = */ 8,
+                                 lit_depth, lit_bits,
+                                 storage_ix, storage);
+    StoreStaticCommandHuffmanTree(storage_ix, storage);
+    StoreStaticDistanceHuffmanTree(storage_ix, storage);
+    StoreDataWithHuffmanCodes(input, start_pos, mask, commands,
+                              n_commands, &lit_depth[0], &lit_bits[0],
+                              kStaticCommandCodeDepth,
+                              kStaticCommandCodeBits,
+                              kStaticDistanceCodeDepth,
+                              kStaticDistanceCodeBits,
+                              storage_ix, storage);
+  } else {
+    HistogramLiteral lit_histo;
+    HistogramCommand cmd_histo;
+    HistogramDistance dist_histo;
+    BuildHistograms(input, start_pos, mask, commands, n_commands,
+                    &lit_histo, &cmd_histo, &dist_histo);
+    std::vector<uint8_t> lit_depth(256);
+    std::vector<uint16_t> lit_bits(256);
+    std::vector<uint8_t> cmd_depth(kNumCommandPrefixes);
+    std::vector<uint16_t> cmd_bits(kNumCommandPrefixes);
+    std::vector<uint8_t> dist_depth(64);
+    std::vector<uint16_t> dist_bits(64);
+    BuildAndStoreHuffmanTreeFast(&lit_histo.data_[0], lit_histo.total_count_,
+                                 /* max_bits = */ 8,
+                                 &lit_depth[0], &lit_bits[0],
+                                 storage_ix, storage);
+    BuildAndStoreHuffmanTreeFast(&cmd_histo.data_[0], cmd_histo.total_count_,
+                                 /* max_bits = */ 10,
+                                 &cmd_depth[0], &cmd_bits[0],
+                                 storage_ix, storage);
+    BuildAndStoreHuffmanTreeFast(&dist_histo.data_[0], dist_histo.total_count_,
+                                 /* max_bits = */ 6,
+                                 &dist_depth[0], &dist_bits[0],
+                                 storage_ix, storage);
+    StoreDataWithHuffmanCodes(input, start_pos, mask, commands,
+                              n_commands, &lit_depth[0], &lit_bits[0],
+                              &cmd_depth[0], &cmd_bits[0],
+                              &dist_depth[0], &dist_bits[0],
+                              storage_ix, storage);
+  }
+
+  if (is_last) {
+    JumpToByteBoundary(storage_ix, storage);
+  }
+}
+
+// This is for storing uncompressed blocks (simple raw storage of
+// bytes-as-bytes).
+void StoreUncompressedMetaBlock(bool final_block,
+                                const uint8_t * __restrict input,
+                                size_t position, size_t mask,
+                                size_t len,
+                                size_t * __restrict storage_ix,
+                                uint8_t * __restrict storage) {
+  StoreUncompressedMetaBlockHeader(len, storage_ix, storage);
+  JumpToByteBoundary(storage_ix, storage);
+
+  size_t masked_pos = position & mask;
+  if (masked_pos + len > mask + 1) {
+    size_t len1 = mask + 1 - masked_pos;
+    memcpy(&storage[*storage_ix >> 3], &input[masked_pos], len1);
+    *storage_ix += len1 << 3;
+    len -= len1;
+    masked_pos = 0;
+  }
+  memcpy(&storage[*storage_ix >> 3], &input[masked_pos], len);
+  *storage_ix += len << 3;
+
+  // We need to clear the next 4 bytes to continue to be
+  // compatible with WriteBits.
+  brotli::WriteBitsPrepareStorage(*storage_ix, storage);
+
+  // Since the uncompressed block itself may not be the final block, add an
+  // empty one after this.
+  if (final_block) {
+    brotli::WriteBits(1, 1, storage_ix, storage);  // islast
+    brotli::WriteBits(1, 1, storage_ix, storage);  // isempty
+    JumpToByteBoundary(storage_ix, storage);
+  }
+}
+
+void StoreSyncMetaBlock(size_t * __restrict storage_ix,
+                        uint8_t * __restrict storage) {
+  // Empty metadata meta-block bit pattern:
+  //   1 bit:  is_last (0)
+  //   2 bits: num nibbles (3)
+  //   1 bit:  reserved (0)
+  //   2 bits: metadata length bytes (0)
+  WriteBits(6, 6, storage_ix, storage);
+  JumpToByteBoundary(storage_ix, storage);
+}
+
+}  // namespace brotli
diff --git a/third_party/brotli/enc/brotli_bit_stream.h b/third_party/brotli/enc/brotli_bit_stream.h
new file mode 100644
index 0000000..6c70653
--- /dev/null
+++ b/third_party/brotli/enc/brotli_bit_stream.h
@@ -0,0 +1,179 @@
+/* Copyright 2014 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Functions to convert brotli-related data structures into the
+// brotli bit stream. The functions here operate under
+// assumption that there is enough space in the storage, i.e., there are
+// no out-of-range checks anywhere.
+//
+// These functions do bit addressing into a byte array. The byte array
+// is called "storage" and the index to the bit is called storage_ix
+// in function arguments.
+
+#ifndef BROTLI_ENC_BROTLI_BIT_STREAM_H_
+#define BROTLI_ENC_BROTLI_BIT_STREAM_H_
+
+#include <vector>
+
+#include "./entropy_encode.h"
+#include "./metablock.h"
+#include "./types.h"
+
+namespace brotli {
+
+// All Store functions here will use a storage_ix, which is always the bit
+// position for the current storage.
+
+// Stores a number between 0 and 255.
+void StoreVarLenUint8(size_t n, size_t* storage_ix, uint8_t* storage);
+
+// Stores the compressed meta-block header.
+// REQUIRES: length > 0
+// REQUIRES: length <= (1 << 24)
+void StoreCompressedMetaBlockHeader(bool final_block,
+                                    size_t length,
+                                    size_t* storage_ix,
+                                    uint8_t* storage);
+
+// Stores the uncompressed meta-block header.
+// REQUIRES: length > 0
+// REQUIRES: length <= (1 << 24)
+void StoreUncompressedMetaBlockHeader(size_t length,
+                                      size_t* storage_ix,
+                                      uint8_t* storage);
+
+// Stores a context map where the histogram type is always the block type.
+void StoreTrivialContextMap(size_t num_types,
+                            size_t context_bits,
+                            HuffmanTree* tree,
+                            size_t* storage_ix,
+                            uint8_t* storage);
+
+void StoreHuffmanTreeOfHuffmanTreeToBitMask(
+    const int num_codes,
+    const uint8_t *code_length_bitdepth,
+    size_t *storage_ix,
+    uint8_t *storage);
+
+void StoreHuffmanTree(const uint8_t* depths, size_t num, HuffmanTree* tree,
+                      size_t *storage_ix, uint8_t *storage);
+
+// Builds a Huffman tree from histogram[0:length] into depth[0:length] and
+// bits[0:length] and stores the encoded tree to the bit stream.
+void BuildAndStoreHuffmanTree(const uint32_t *histogram,
+                              const size_t length,
+                              HuffmanTree* tree,
+                              uint8_t* depth,
+                              uint16_t* bits,
+                              size_t* storage_ix,
+                              uint8_t* storage);
+
+void BuildAndStoreHuffmanTreeFast(const uint32_t *histogram,
+                                  const size_t histogram_total,
+                                  const size_t max_bits,
+                                  uint8_t* depth,
+                                  uint16_t* bits,
+                                  size_t* storage_ix,
+                                  uint8_t* storage);
+
+// Encodes the given context map to the bit stream. The number of different
+// histogram ids is given by num_clusters.
+void EncodeContextMap(const std::vector<uint32_t>& context_map,
+                      size_t num_clusters,
+                      HuffmanTree* tree,
+                      size_t* storage_ix, uint8_t* storage);
+
+// Data structure that stores everything that is needed to encode each block
+// switch command.
+struct BlockSplitCode {
+  std::vector<uint32_t> type_code;
+  std::vector<uint32_t> length_prefix;
+  std::vector<uint32_t> length_nextra;
+  std::vector<uint32_t> length_extra;
+  std::vector<uint8_t> type_depths;
+  std::vector<uint16_t> type_bits;
+  uint8_t length_depths[kNumBlockLenPrefixes];
+  uint16_t length_bits[kNumBlockLenPrefixes];
+};
+
+// Builds a BlockSplitCode data structure from the block split given by the
+// vector of block types and block lengths and stores it to the bit stream.
+void BuildAndStoreBlockSplitCode(const std::vector<uint8_t>& types,
+                                 const std::vector<uint32_t>& lengths,
+                                 const size_t num_types,
+                                 BlockSplitCode* code,
+                                 size_t* storage_ix,
+                                 uint8_t* storage);
+
+// Stores the block switch command with index block_ix to the bit stream.
+void StoreBlockSwitch(const BlockSplitCode& code,
+                      const size_t block_ix,
+                      size_t* storage_ix,
+                      uint8_t* storage);
+
+// REQUIRES: length > 0
+// REQUIRES: length <= (1 << 24)
+void StoreMetaBlock(const uint8_t* input,
+                    size_t start_pos,
+                    size_t length,
+                    size_t mask,
+                    uint8_t prev_byte,
+                    uint8_t prev_byte2,
+                    bool final_block,
+                    uint32_t num_direct_distance_codes,
+                    uint32_t distance_postfix_bits,
+                    ContextType literal_context_mode,
+                    const brotli::Command *commands,
+                    size_t n_commands,
+                    const MetaBlockSplit& mb,
+                    size_t *storage_ix,
+                    uint8_t *storage);
+
+// Stores the meta-block without doing any block splitting, just collects
+// one histogram per block category and uses that for entropy coding.
+// REQUIRES: length > 0
+// REQUIRES: length <= (1 << 24)
+void StoreMetaBlockTrivial(const uint8_t* input,
+                           size_t start_pos,
+                           size_t length,
+                           size_t mask,
+                           bool is_last,
+                           const brotli::Command *commands,
+                           size_t n_commands,
+                           size_t *storage_ix,
+                           uint8_t *storage);
+
+// Same as above, but uses static prefix codes for histograms with a only a few
+// symbols, and uses static code length prefix codes for all other histograms.
+// REQUIRES: length > 0
+// REQUIRES: length <= (1 << 24)
+void StoreMetaBlockFast(const uint8_t* input,
+                        size_t start_pos,
+                        size_t length,
+                        size_t mask,
+                        bool is_last,
+                        const brotli::Command *commands,
+                        size_t n_commands,
+                        size_t *storage_ix,
+                        uint8_t *storage);
+
+// This is for storing uncompressed blocks (simple raw storage of
+// bytes-as-bytes).
+// REQUIRES: length > 0
+// REQUIRES: length <= (1 << 24)
+void StoreUncompressedMetaBlock(bool final_block,
+                                const uint8_t* input,
+                                size_t position, size_t mask,
+                                size_t len,
+                                size_t* storage_ix,
+                                uint8_t* storage);
+
+// Stores an empty metadata meta-block and syncs to a byte boundary.
+void StoreSyncMetaBlock(size_t* storage_ix, uint8_t* storage);
+
+}  // namespace brotli
+
+#endif  // BROTLI_ENC_BROTLI_BIT_STREAM_H_
diff --git a/third_party/brotli/enc/cluster.h b/third_party/brotli/enc/cluster.h
new file mode 100644
index 0000000..5054faf
--- /dev/null
+++ b/third_party/brotli/enc/cluster.h
@@ -0,0 +1,330 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Functions for clustering similar histograms together.
+
+#ifndef BROTLI_ENC_CLUSTER_H_
+#define BROTLI_ENC_CLUSTER_H_
+
+#include <math.h>
+#include <algorithm>
+#include <utility>
+#include <vector>
+
+#include "./bit_cost.h"
+#include "./entropy_encode.h"
+#include "./fast_log.h"
+#include "./histogram.h"
+#include "./port.h"
+#include "./types.h"
+
+namespace brotli {
+
+struct HistogramPair {
+  uint32_t idx1;
+  uint32_t idx2;
+  double cost_combo;
+  double cost_diff;
+};
+
+inline bool operator<(const HistogramPair& p1, const HistogramPair& p2) {
+  if (p1.cost_diff != p2.cost_diff) {
+    return p1.cost_diff > p2.cost_diff;
+  }
+  return (p1.idx2 - p1.idx1) > (p2.idx2 - p2.idx1);
+}
+
+// Returns entropy reduction of the context map when we combine two clusters.
+inline double ClusterCostDiff(size_t size_a, size_t size_b) {
+  size_t size_c = size_a + size_b;
+  return static_cast<double>(size_a) * FastLog2(size_a) +
+      static_cast<double>(size_b) * FastLog2(size_b) -
+      static_cast<double>(size_c) * FastLog2(size_c);
+}
+
+// Computes the bit cost reduction by combining out[idx1] and out[idx2] and if
+// it is below a threshold, stores the pair (idx1, idx2) in the *pairs queue.
+template<typename HistogramType>
+void CompareAndPushToQueue(const HistogramType* out,
+                           const uint32_t* cluster_size,
+                           uint32_t idx1, uint32_t idx2,
+                           size_t max_num_pairs,
+                           HistogramPair* pairs,
+                           size_t* num_pairs) {
+  if (idx1 == idx2) {
+    return;
+  }
+  if (idx2 < idx1) {
+    uint32_t t = idx2;
+    idx2 = idx1;
+    idx1 = t;
+  }
+  bool store_pair = false;
+  HistogramPair p;
+  p.idx1 = idx1;
+  p.idx2 = idx2;
+  p.cost_diff = 0.5 * ClusterCostDiff(cluster_size[idx1], cluster_size[idx2]);
+  p.cost_diff -= out[idx1].bit_cost_;
+  p.cost_diff -= out[idx2].bit_cost_;
+
+  if (out[idx1].total_count_ == 0) {
+    p.cost_combo = out[idx2].bit_cost_;
+    store_pair = true;
+  } else if (out[idx2].total_count_ == 0) {
+    p.cost_combo = out[idx1].bit_cost_;
+    store_pair = true;
+  } else {
+    double threshold = *num_pairs == 0 ? 1e99 :
+        std::max(0.0, pairs[0].cost_diff);
+    HistogramType combo = out[idx1];
+    combo.AddHistogram(out[idx2]);
+    double cost_combo = PopulationCost(combo);
+    if (cost_combo < threshold - p.cost_diff) {
+      p.cost_combo = cost_combo;
+      store_pair = true;
+    }
+  }
+  if (store_pair) {
+    p.cost_diff += p.cost_combo;
+    if (*num_pairs > 0 && pairs[0] < p) {
+      // Replace the top of the queue if needed.
+      if (*num_pairs < max_num_pairs) {
+        pairs[*num_pairs] = pairs[0];
+        ++(*num_pairs);
+      }
+      pairs[0] = p;
+    } else if (*num_pairs < max_num_pairs) {
+      pairs[*num_pairs] = p;
+      ++(*num_pairs);
+    }
+  }
+}
+
+template<typename HistogramType>
+size_t HistogramCombine(HistogramType* out,
+                        uint32_t* cluster_size,
+                        uint32_t* symbols,
+                        uint32_t* clusters,
+                        HistogramPair* pairs,
+                        size_t num_clusters,
+                        size_t symbols_size,
+                        size_t max_clusters,
+                        size_t max_num_pairs) {
+  double cost_diff_threshold = 0.0;
+  size_t min_cluster_size = 1;
+
+  // We maintain a vector of histogram pairs, with the property that the pair
+  // with the maximum bit cost reduction is the first.
+  size_t num_pairs = 0;
+  for (size_t idx1 = 0; idx1 < num_clusters; ++idx1) {
+    for (size_t idx2 = idx1 + 1; idx2 < num_clusters; ++idx2) {
+      CompareAndPushToQueue(out, cluster_size, clusters[idx1], clusters[idx2],
+                            max_num_pairs, &pairs[0], &num_pairs);
+    }
+  }
+
+  while (num_clusters > min_cluster_size) {
+    if (pairs[0].cost_diff >= cost_diff_threshold) {
+      cost_diff_threshold = 1e99;
+      min_cluster_size = max_clusters;
+      continue;
+    }
+    // Take the best pair from the top of heap.
+    uint32_t best_idx1 = pairs[0].idx1;
+    uint32_t best_idx2 = pairs[0].idx2;
+    out[best_idx1].AddHistogram(out[best_idx2]);
+    out[best_idx1].bit_cost_ = pairs[0].cost_combo;
+    cluster_size[best_idx1] += cluster_size[best_idx2];
+    for (size_t i = 0; i < symbols_size; ++i) {
+      if (symbols[i] == best_idx2) {
+        symbols[i] = best_idx1;
+      }
+    }
+    for (size_t i = 0; i < num_clusters; ++i) {
+      if (clusters[i] == best_idx2) {
+        memmove(&clusters[i], &clusters[i + 1],
+                (num_clusters - i - 1) * sizeof(clusters[0]));
+        break;
+      }
+    }
+    --num_clusters;
+    // Remove pairs intersecting the just combined best pair.
+    size_t copy_to_idx = 0;
+    for (size_t i = 0; i < num_pairs; ++i) {
+      HistogramPair& p = pairs[i];
+      if (p.idx1 == best_idx1 || p.idx2 == best_idx1 ||
+          p.idx1 == best_idx2 || p.idx2 == best_idx2) {
+        // Remove invalid pair from the queue.
+        continue;
+      }
+      if (pairs[0] < p) {
+        // Replace the top of the queue if needed.
+        HistogramPair front = pairs[0];
+        pairs[0] = p;
+        pairs[copy_to_idx] = front;
+      } else {
+        pairs[copy_to_idx] = p;
+      }
+      ++copy_to_idx;
+    }
+    num_pairs = copy_to_idx;
+
+    // Push new pairs formed with the combined histogram to the heap.
+    for (size_t i = 0; i < num_clusters; ++i) {
+      CompareAndPushToQueue(out, cluster_size, best_idx1, clusters[i],
+                            max_num_pairs, &pairs[0], &num_pairs);
+    }
+  }
+  return num_clusters;
+}
+
+// -----------------------------------------------------------------------------
+// Histogram refinement
+
+// What is the bit cost of moving histogram from cur_symbol to candidate.
+template<typename HistogramType>
+double HistogramBitCostDistance(const HistogramType& histogram,
+                                const HistogramType& candidate) {
+  if (histogram.total_count_ == 0) {
+    return 0.0;
+  }
+  HistogramType tmp = histogram;
+  tmp.AddHistogram(candidate);
+  return PopulationCost(tmp) - candidate.bit_cost_;
+}
+
+// Find the best 'out' histogram for each of the 'in' histograms.
+// When called, clusters[0..num_clusters) contains the unique values from
+// symbols[0..in_size), but this property is not preserved in this function.
+// Note: we assume that out[]->bit_cost_ is already up-to-date.
+template<typename HistogramType>
+void HistogramRemap(const HistogramType* in, size_t in_size,
+                    const uint32_t* clusters, size_t num_clusters,
+                    HistogramType* out, uint32_t* symbols) {
+  for (size_t i = 0; i < in_size; ++i) {
+    uint32_t best_out = i == 0 ? symbols[0] : symbols[i - 1];
+    double best_bits = HistogramBitCostDistance(in[i], out[best_out]);
+    for (size_t j = 0; j < num_clusters; ++j) {
+      const double cur_bits = HistogramBitCostDistance(in[i], out[clusters[j]]);
+      if (cur_bits < best_bits) {
+        best_bits = cur_bits;
+        best_out = clusters[j];
+      }
+    }
+    symbols[i] = best_out;
+  }
+
+  // Recompute each out based on raw and symbols.
+  for (size_t j = 0; j < num_clusters; ++j) {
+    out[clusters[j]].Clear();
+  }
+  for (size_t i = 0; i < in_size; ++i) {
+    out[symbols[i]].AddHistogram(in[i]);
+  }
+}
+
+// Reorders elements of the out[0..length) array and changes values in
+// symbols[0..length) array in the following way:
+//   * when called, symbols[] contains indexes into out[], and has N unique
+//     values (possibly N < length)
+//   * on return, symbols'[i] = f(symbols[i]) and
+//                out'[symbols'[i]] = out[symbols[i]], for each 0 <= i < length,
+//     where f is a bijection between the range of symbols[] and [0..N), and
+//     the first occurrences of values in symbols'[i] come in consecutive
+//     increasing order.
+// Returns N, the number of unique values in symbols[].
+template<typename HistogramType>
+size_t HistogramReindex(HistogramType* out, uint32_t* symbols, size_t length) {
+  static const uint32_t kInvalidIndex = std::numeric_limits<uint32_t>::max();
+  std::vector<uint32_t> new_index(length, kInvalidIndex);
+  uint32_t next_index = 0;
+  for (size_t i = 0; i < length; ++i) {
+    if (new_index[symbols[i]] == kInvalidIndex) {
+      new_index[symbols[i]] = next_index;
+      ++next_index;
+    }
+  }
+  std::vector<HistogramType> tmp(next_index);
+  next_index = 0;
+  for (size_t i = 0; i < length; ++i) {
+    if (new_index[symbols[i]] == next_index) {
+      tmp[next_index] = out[symbols[i]];
+      ++next_index;
+    }
+    symbols[i] = new_index[symbols[i]];
+  }
+  for (size_t i = 0; i < next_index; ++i) {
+    out[i] = tmp[i];
+  }
+  return next_index;
+}
+
+// Clusters similar histograms in 'in' together, the selected histograms are
+// placed in 'out', and for each index in 'in', *histogram_symbols will
+// indicate which of the 'out' histograms is the best approximation.
+template<typename HistogramType>
+void ClusterHistograms(const std::vector<HistogramType>& in,
+                       size_t num_contexts, size_t num_blocks,
+                       size_t max_histograms,
+                       std::vector<HistogramType>* out,
+                       std::vector<uint32_t>* histogram_symbols) {
+  const size_t in_size = num_contexts * num_blocks;
+  assert(in_size == in.size());
+  std::vector<uint32_t> cluster_size(in_size, 1);
+  std::vector<uint32_t> clusters(in_size);
+  size_t num_clusters = 0;
+  out->resize(in_size);
+  histogram_symbols->resize(in_size);
+  for (size_t i = 0; i < in_size; ++i) {
+    (*out)[i] = in[i];
+    (*out)[i].bit_cost_ = PopulationCost(in[i]);
+    (*histogram_symbols)[i] = static_cast<uint32_t>(i);
+  }
+
+  const size_t max_input_histograms = 64;
+  // For the first pass of clustering, we allow all pairs.
+  size_t max_num_pairs = max_input_histograms * max_input_histograms / 2;
+  std::vector<HistogramPair> pairs(max_num_pairs + 1);
+
+  for (size_t i = 0; i < in_size; i += max_input_histograms) {
+    size_t num_to_combine = std::min(in_size - i, max_input_histograms);
+    for (size_t j = 0; j < num_to_combine; ++j) {
+      clusters[num_clusters + j] = static_cast<uint32_t>(i + j);
+    }
+    size_t num_new_clusters =
+        HistogramCombine(&(*out)[0], &cluster_size[0],
+                         &(*histogram_symbols)[i],
+                         &clusters[num_clusters], &pairs[0],
+                         num_to_combine, num_to_combine,
+                         max_histograms, max_num_pairs);
+    num_clusters += num_new_clusters;
+  }
+
+  // For the second pass, we limit the total number of histogram pairs.
+  // After this limit is reached, we only keep searching for the best pair.
+  max_num_pairs =
+      std::min(64 * num_clusters, (num_clusters / 2) * num_clusters);
+  pairs.resize(max_num_pairs + 1);
+
+  // Collapse similar histograms.
+  num_clusters = HistogramCombine(&(*out)[0], &cluster_size[0],
+                                  &(*histogram_symbols)[0], &clusters[0],
+                                  &pairs[0], num_clusters, in_size,
+                                  max_histograms, max_num_pairs);
+
+  // Find the optimal map from original histograms to the final ones.
+  HistogramRemap(&in[0], in_size, &clusters[0], num_clusters,
+                 &(*out)[0], &(*histogram_symbols)[0]);
+
+  // Convert the context map to a canonical form.
+  size_t num_histograms =
+      HistogramReindex(&(*out)[0], &(*histogram_symbols)[0], in_size);
+  out->resize(num_histograms);
+}
+
+}  // namespace brotli
+
+#endif  // BROTLI_ENC_CLUSTER_H_
diff --git a/third_party/brotli/enc/command.h b/third_party/brotli/enc/command.h
new file mode 100644
index 0000000..b5cc872
--- /dev/null
+++ b/third_party/brotli/enc/command.h
@@ -0,0 +1,156 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// This class models a sequence of literals and a backward reference copy.
+
+#ifndef BROTLI_ENC_COMMAND_H_
+#define BROTLI_ENC_COMMAND_H_
+
+#include "./fast_log.h"
+#include "./prefix.h"
+#include "./types.h"
+
+namespace brotli {
+
+static uint32_t kInsBase[] =   { 0, 1, 2, 3, 4, 5, 6, 8, 10, 14, 18, 26, 34, 50,
+    66, 98, 130, 194, 322, 578, 1090, 2114, 6210, 22594 };
+static uint32_t kInsExtra[] =  { 0, 0, 0, 0, 0, 0, 1, 1,  2,  2,  3,  3,  4,  4,
+    5,   5,   6,   7,   8,   9,   10,   12,   14,    24 };
+static uint32_t kCopyBase[] =  { 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 18, 22, 30,
+    38, 54,  70, 102, 134, 198, 326,   582, 1094,  2118 };
+static uint32_t kCopyExtra[] = { 0, 0, 0, 0, 0, 0, 0, 0,  1,  1,  2,  2,  3,  3,
+     4,  4,   5,   5,   6,   7,   8,     9,   10,    24 };
+
+static inline uint16_t GetInsertLengthCode(size_t insertlen) {
+  if (insertlen < 6) {
+    return static_cast<uint16_t>(insertlen);
+  } else if (insertlen < 130) {
+    insertlen -= 2;
+    uint32_t nbits = Log2FloorNonZero(insertlen) - 1u;
+    return static_cast<uint16_t>((nbits << 1) + (insertlen >> nbits) + 2);
+  } else if (insertlen < 2114) {
+    return static_cast<uint16_t>(Log2FloorNonZero(insertlen - 66) + 10);
+  } else if (insertlen < 6210) {
+    return 21u;
+  } else if (insertlen < 22594) {
+    return 22u;
+  } else {
+    return 23u;
+  }
+}
+
+static inline uint16_t GetCopyLengthCode(size_t copylen) {
+  if (copylen < 10) {
+    return static_cast<uint16_t>(copylen - 2);
+  } else if (copylen < 134) {
+    copylen -= 6;
+    uint32_t nbits = Log2FloorNonZero(copylen) - 1u;
+    return static_cast<uint16_t>((nbits << 1) + (copylen >> nbits) + 4);
+  } else if (copylen < 2118) {
+    return static_cast<uint16_t>(Log2FloorNonZero(copylen - 70) + 12);
+  } else {
+    return 23u;
+  }
+}
+
+static inline uint16_t CombineLengthCodes(
+    uint16_t inscode, uint16_t copycode, bool use_last_distance) {
+  uint16_t bits64 =
+      static_cast<uint16_t>((copycode & 0x7u) | ((inscode & 0x7u) << 3));
+  if (use_last_distance && inscode < 8 && copycode < 16) {
+    return (copycode < 8) ? bits64 : (bits64 | 64);
+  } else {
+    // "To convert an insert-and-copy length code to an insert length code and
+    // a copy length code, the following table can be used"
+    static const uint16_t cells[9] = { 128u, 192u, 384u, 256u, 320u, 512u,
+                                       448u, 576u, 640u };
+    return cells[(copycode >> 3) + 3 * (inscode >> 3)] | bits64;
+  }
+}
+
+static inline void GetLengthCode(size_t insertlen, size_t copylen,
+                                 bool use_last_distance,
+                                 uint16_t* code) {
+  uint16_t inscode = GetInsertLengthCode(insertlen);
+  uint16_t copycode = GetCopyLengthCode(copylen);
+  *code = CombineLengthCodes(inscode, copycode, use_last_distance);
+}
+
+static inline uint32_t GetInsertBase(uint16_t inscode) {
+  return kInsBase[inscode];
+}
+
+static inline uint32_t GetInsertExtra(uint16_t inscode) {
+  return kInsExtra[inscode];
+}
+
+static inline uint32_t GetCopyBase(uint16_t copycode) {
+  return kCopyBase[copycode];
+}
+
+static inline uint32_t GetCopyExtra(uint16_t copycode) {
+  return kCopyExtra[copycode];
+}
+
+struct Command {
+  // distance_code is e.g. 0 for same-as-last short code, or 16 for offset 1.
+  Command(size_t insertlen, size_t copylen, size_t copylen_code,
+          size_t distance_code)
+      : insert_len_(static_cast<uint32_t>(insertlen)) {
+    copy_len_ = static_cast<uint32_t>(
+        copylen | ((copylen_code ^ copylen) << 24));
+    // The distance prefix and extra bits are stored in this Command as if
+    // npostfix and ndirect were 0, they are only recomputed later after the
+    // clustering if needed.
+    PrefixEncodeCopyDistance(distance_code, 0, 0, &dist_prefix_, &dist_extra_);
+    GetLengthCode(insertlen, copylen_code, dist_prefix_ == 0,
+                  &cmd_prefix_);
+  }
+
+  explicit Command(size_t insertlen)
+      : insert_len_(static_cast<uint32_t>(insertlen))
+      , copy_len_(4 << 24), dist_extra_(0), dist_prefix_(16) {
+    GetLengthCode(insertlen, 4, dist_prefix_ == 0, &cmd_prefix_);
+  }
+
+  uint32_t DistanceCode(void) const {
+    if (dist_prefix_ < 16) {
+      return dist_prefix_;
+    }
+    uint32_t nbits = dist_extra_ >> 24;
+    uint32_t extra = dist_extra_ & 0xffffff;
+    uint32_t prefix = dist_prefix_ - 12 - 2 * nbits;
+    return (prefix << nbits) + extra + 12;
+  }
+
+  uint32_t DistanceContext(void) const {
+    uint32_t r = cmd_prefix_ >> 6;
+    uint32_t c = cmd_prefix_ & 7;
+    if ((r == 0 || r == 2 || r == 4 || r == 7) && (c <= 2)) {
+      return c;
+    }
+    return 3;
+  }
+
+  inline uint32_t copy_len(void) const {
+    return copy_len_ & 0xFFFFFF;
+  }
+
+  inline uint32_t copy_len_code(void) const {
+    return (copy_len_ & 0xFFFFFF) ^ (copy_len_ >> 24);
+  }
+
+  uint32_t insert_len_;
+  /* Stores copy_len in low 24 bits and copy_len XOR copy_code in high 8 bit. */
+  uint32_t copy_len_;
+  uint32_t dist_extra_;
+  uint16_t cmd_prefix_;
+  uint16_t dist_prefix_;
+};
+
+}  // namespace brotli
+
+#endif  // BROTLI_ENC_COMMAND_H_
diff --git a/third_party/brotli/enc/compress_fragment.cc b/third_party/brotli/enc/compress_fragment.cc
new file mode 100644
index 0000000..5620112
--- /dev/null
+++ b/third_party/brotli/enc/compress_fragment.cc
@@ -0,0 +1,701 @@
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Function for fast encoding of an input fragment, independently from the input
+// history. This function uses one-pass processing: when we find a backward
+// match, we immediately emit the corresponding command and literal codes to
+// the bit stream.
+//
+// Adapted from the CompressFragment() function in
+// https://github.com/google/snappy/blob/master/snappy.cc
+
+#include "./compress_fragment.h"
+
+#include <algorithm>
+#include <cstring>
+
+#include "./brotli_bit_stream.h"
+#include "./entropy_encode.h"
+#include "./fast_log.h"
+#include "./find_match_length.h"
+#include "./port.h"
+#include "./types.h"
+#include "./write_bits.h"
+
+namespace brotli {
+
+// kHashMul32 multiplier has these properties:
+// * The multiplier must be odd. Otherwise we may lose the highest bit.
+// * No long streaks of 1s or 0s.
+// * There is no effort to ensure that it is a prime, the oddity is enough
+//   for this use.
+// * The number has been tuned heuristically against compression benchmarks.
+static const uint32_t kHashMul32 = 0x1e35a7bd;
+
+static inline uint32_t Hash(const uint8_t* p, size_t shift) {
+  const uint64_t h = (BROTLI_UNALIGNED_LOAD64(p) << 24) * kHashMul32;
+  return static_cast<uint32_t>(h >> shift);
+}
+
+static inline uint32_t HashBytesAtOffset(uint64_t v, int offset, size_t shift) {
+  assert(offset >= 0);
+  assert(offset <= 3);
+  const uint64_t h = ((v >> (8 * offset)) << 24) * kHashMul32;
+  return static_cast<uint32_t>(h >> shift);
+}
+
+static inline int IsMatch(const uint8_t* p1, const uint8_t* p2) {
+  return (BROTLI_UNALIGNED_LOAD32(p1) == BROTLI_UNALIGNED_LOAD32(p2) &&
+          p1[4] == p2[4]);
+}
+
+// Builds a literal prefix code into "depths" and "bits" based on the statistics
+// of the "input" string and stores it into the bit stream.
+// Note that the prefix code here is built from the pre-LZ77 input, therefore
+// we can only approximate the statistics of the actual literal stream.
+// Moreover, for long inputs we build a histogram from a sample of the input
+// and thus have to assign a non-zero depth for each literal.
+static void BuildAndStoreLiteralPrefixCode(const uint8_t* input,
+                                           const size_t input_size,
+                                           uint8_t depths[256],
+                                           uint16_t bits[256],
+                                           size_t* storage_ix,
+                                           uint8_t* storage) {
+  uint32_t histogram[256] = { 0 };
+  size_t histogram_total;
+  if (input_size < (1 << 15)) {
+    for (size_t i = 0; i < input_size; ++i)  {
+      ++histogram[input[i]];
+    }
+    histogram_total = input_size;
+    for (size_t i = 0; i < 256; ++i) {
+      // We weigh the first 11 samples with weight 3 to account for the
+      // balancing effect of the LZ77 phase on the histogram.
+      const uint32_t adjust = 2 * std::min(histogram[i], 11u);
+      histogram[i] += adjust;
+      histogram_total += adjust;
+    }
+  } else {
+    static const size_t kSampleRate = 29;
+    for (size_t i = 0; i < input_size; i += kSampleRate) {
+      ++histogram[input[i]];
+    }
+    histogram_total = (input_size + kSampleRate - 1) / kSampleRate;
+    for (size_t i = 0; i < 256; ++i) {
+      // We add 1 to each population count to avoid 0 bit depths (since this is
+      // only a sample and we don't know if the symbol appears or not), and we
+      // weigh the first 11 samples with weight 3 to account for the balancing
+      // effect of the LZ77 phase on the histogram (more frequent symbols are
+      // more likely to be in backward references instead as literals).
+      const uint32_t adjust = 1 + 2 * std::min(histogram[i], 11u);
+      histogram[i] += adjust;
+      histogram_total += adjust;
+    }
+  }
+  BuildAndStoreHuffmanTreeFast(histogram, histogram_total,
+                               /* max_bits = */ 8,
+                               depths, bits, storage_ix, storage);
+}
+
+// Builds a command and distance prefix code (each 64 symbols) into "depth" and
+// "bits" based on "histogram" and stores it into the bit stream.
+static void BuildAndStoreCommandPrefixCode(const uint32_t histogram[128],
+                                           uint8_t depth[128],
+                                           uint16_t bits[128],
+                                           size_t* storage_ix,
+                                           uint8_t* storage) {
+  // Tree size for building a tree over 64 symbols is 2 * 64 + 1.
+  static const size_t kTreeSize = 129;
+  HuffmanTree tree[kTreeSize];
+  CreateHuffmanTree(histogram, 64, 15, tree, depth);
+  CreateHuffmanTree(&histogram[64], 64, 14, tree, &depth[64]);
+  // We have to jump through a few hoopes here in order to compute
+  // the command bits because the symbols are in a different order than in
+  // the full alphabet. This looks complicated, but having the symbols
+  // in this order in the command bits saves a few branches in the Emit*
+  // functions.
+  uint8_t cmd_depth[64];
+  uint16_t cmd_bits[64];
+  memcpy(cmd_depth, depth, 24);
+  memcpy(cmd_depth + 24, depth + 40, 8);
+  memcpy(cmd_depth + 32, depth + 24, 8);
+  memcpy(cmd_depth + 40, depth + 48, 8);
+  memcpy(cmd_depth + 48, depth + 32, 8);
+  memcpy(cmd_depth + 56, depth + 56, 8);
+  ConvertBitDepthsToSymbols(cmd_depth, 64, cmd_bits);
+  memcpy(bits, cmd_bits, 48);
+  memcpy(bits + 24, cmd_bits + 32, 16);
+  memcpy(bits + 32, cmd_bits + 48, 16);
+  memcpy(bits + 40, cmd_bits + 24, 16);
+  memcpy(bits + 48, cmd_bits + 40, 16);
+  memcpy(bits + 56, cmd_bits + 56, 16);
+  ConvertBitDepthsToSymbols(&depth[64], 64, &bits[64]);
+  {
+    // Create the bit length array for the full command alphabet.
+    uint8_t cmd_depth[704] = { 0 };
+    memcpy(cmd_depth, depth, 8);
+    memcpy(cmd_depth + 64, depth + 8, 8);
+    memcpy(cmd_depth + 128, depth + 16, 8);
+    memcpy(cmd_depth + 192, depth + 24, 8);
+    memcpy(cmd_depth + 384, depth + 32, 8);
+    for (size_t i = 0; i < 8; ++i) {
+      cmd_depth[128 + 8 * i] = depth[40 + i];
+      cmd_depth[256 + 8 * i] = depth[48 + i];
+      cmd_depth[448 + 8 * i] = depth[56 + i];
+    }
+    StoreHuffmanTree(cmd_depth, 704, tree, storage_ix, storage);
+  }
+  StoreHuffmanTree(&depth[64], 64, tree, storage_ix, storage);
+}
+
+// REQUIRES: insertlen < 6210
+inline void EmitInsertLen(size_t insertlen,
+                          const uint8_t depth[128],
+                          const uint16_t bits[128],
+                          uint32_t histo[128],
+                          size_t* storage_ix,
+                          uint8_t* storage) {
+  if (insertlen < 6) {
+    const size_t code = insertlen + 40;
+    WriteBits(depth[code], bits[code], storage_ix, storage);
+    ++histo[code];
+  } else if (insertlen < 130) {
+    insertlen -= 2;
+    const uint32_t nbits = Log2FloorNonZero(insertlen) - 1u;
+    const size_t prefix = insertlen >> nbits;
+    const size_t inscode = (nbits << 1) + prefix + 42;
+    WriteBits(depth[inscode], bits[inscode], storage_ix, storage);
+    WriteBits(nbits, insertlen - (prefix << nbits), storage_ix, storage);
+    ++histo[inscode];
+  } else if (insertlen < 2114) {
+    insertlen -= 66;
+    const uint32_t nbits = Log2FloorNonZero(insertlen);
+    const size_t code = nbits + 50;
+    WriteBits(depth[code], bits[code], storage_ix, storage);
+    WriteBits(nbits, insertlen - (1 << nbits), storage_ix, storage);
+    ++histo[code];
+  } else {
+    WriteBits(depth[61], bits[61], storage_ix, storage);
+    WriteBits(12, insertlen - 2114, storage_ix, storage);
+    ++histo[21];
+  }
+}
+
+inline void EmitLongInsertLen(size_t insertlen,
+                              const uint8_t depth[128],
+                              const uint16_t bits[128],
+                              uint32_t histo[128],
+                              size_t* storage_ix,
+                              uint8_t* storage) {
+  if (insertlen < 22594) {
+    WriteBits(depth[62], bits[62], storage_ix, storage);
+    WriteBits(14, insertlen - 6210, storage_ix, storage);
+    ++histo[22];
+  } else {
+    WriteBits(depth[63], bits[63], storage_ix, storage);
+    WriteBits(24, insertlen - 22594, storage_ix, storage);
+    ++histo[23];
+  }
+}
+
+inline void EmitCopyLen(size_t copylen,
+                        const uint8_t depth[128],
+                        const uint16_t bits[128],
+                        uint32_t histo[128],
+                        size_t* storage_ix,
+                        uint8_t* storage) {
+  if (copylen < 10) {
+    WriteBits(depth[copylen + 14], bits[copylen + 14], storage_ix, storage);
+    ++histo[copylen + 14];
+  } else if (copylen < 134) {
+    copylen -= 6;
+    const uint32_t nbits = Log2FloorNonZero(copylen) - 1u;
+    const size_t prefix = copylen >> nbits;
+    const size_t code = (nbits << 1) + prefix + 20;
+    WriteBits(depth[code], bits[code], storage_ix, storage);
+    WriteBits(nbits, copylen - (prefix << nbits), storage_ix, storage);
+    ++histo[code];
+  } else if (copylen < 2118) {
+    copylen -= 70;
+    const uint32_t nbits = Log2FloorNonZero(copylen);
+    const size_t code = nbits + 28;
+    WriteBits(depth[code], bits[code], storage_ix, storage);
+    WriteBits(nbits, copylen - (1 << nbits), storage_ix, storage);
+    ++histo[code];
+  } else {
+    WriteBits(depth[39], bits[39], storage_ix, storage);
+    WriteBits(24, copylen - 2118, storage_ix, storage);
+    ++histo[47];
+  }
+}
+
+inline void EmitCopyLenLastDistance(size_t copylen,
+                                    const uint8_t depth[128],
+                                    const uint16_t bits[128],
+                                    uint32_t histo[128],
+                                    size_t* storage_ix,
+                                    uint8_t* storage) {
+  if (copylen < 12) {
+    WriteBits(depth[copylen - 4], bits[copylen - 4], storage_ix, storage);
+    ++histo[copylen - 4];
+  } else if (copylen < 72) {
+    copylen -= 8;
+    const uint32_t nbits = Log2FloorNonZero(copylen) - 1;
+    const size_t prefix = copylen >> nbits;
+    const size_t code = (nbits << 1) + prefix + 4;
+    WriteBits(depth[code], bits[code], storage_ix, storage);
+    WriteBits(nbits, copylen - (prefix << nbits), storage_ix, storage);
+    ++histo[code];
+  } else if (copylen < 136) {
+    copylen -= 8;
+    const size_t code = (copylen >> 5) + 30;
+    WriteBits(depth[code], bits[code], storage_ix, storage);
+    WriteBits(5, copylen & 31, storage_ix, storage);
+    WriteBits(depth[64], bits[64], storage_ix, storage);
+    ++histo[code];
+    ++histo[64];
+  } else if (copylen < 2120) {
+    copylen -= 72;
+    const uint32_t nbits = Log2FloorNonZero(copylen);
+    const size_t code = nbits + 28;
+    WriteBits(depth[code], bits[code], storage_ix, storage);
+    WriteBits(nbits, copylen - (1 << nbits), storage_ix, storage);
+    WriteBits(depth[64], bits[64], storage_ix, storage);
+    ++histo[code];
+    ++histo[64];
+  } else {
+    WriteBits(depth[39], bits[39], storage_ix, storage);
+    WriteBits(24, copylen - 2120, storage_ix, storage);
+    WriteBits(depth[64], bits[64], storage_ix, storage);
+    ++histo[47];
+    ++histo[64];
+  }
+}
+
+inline void EmitDistance(size_t distance,
+                         const uint8_t depth[128],
+                         const uint16_t bits[128],
+                         uint32_t histo[128],
+                         size_t* storage_ix, uint8_t* storage) {
+  distance += 3;
+  const uint32_t nbits = Log2FloorNonZero(distance) - 1u;
+  const size_t prefix = (distance >> nbits) & 1;
+  const size_t offset = (2 + prefix) << nbits;
+  const size_t distcode = 2 * (nbits - 1) + prefix + 80;
+  WriteBits(depth[distcode], bits[distcode], storage_ix, storage);
+  WriteBits(nbits, distance - offset, storage_ix, storage);
+  ++histo[distcode];
+}
+
+inline void EmitLiterals(const uint8_t* input, const size_t len,
+                         const uint8_t depth[256], const uint16_t bits[256],
+                         size_t* storage_ix, uint8_t* storage) {
+  for (size_t j = 0; j < len; j++) {
+    const uint8_t lit = input[j];
+    WriteBits(depth[lit], bits[lit], storage_ix, storage);
+  }
+}
+
+// REQUIRES: len <= 1 << 20.
+static void StoreMetaBlockHeader(
+    size_t len, bool is_uncompressed, size_t* storage_ix, uint8_t* storage) {
+  // ISLAST
+  WriteBits(1, 0, storage_ix, storage);
+  if (len <= (1U << 16)) {
+    // MNIBBLES is 4
+    WriteBits(2, 0, storage_ix, storage);
+    WriteBits(16, len - 1, storage_ix, storage);
+  } else {
+    // MNIBBLES is 5
+    WriteBits(2, 1, storage_ix, storage);
+    WriteBits(20, len - 1, storage_ix, storage);
+  }
+  // ISUNCOMPRESSED
+  WriteBits(1, is_uncompressed, storage_ix, storage);
+}
+
+static void UpdateBits(size_t n_bits,
+                       uint32_t bits,
+                       size_t pos,
+                       uint8_t *array) {
+  while (n_bits > 0) {
+    size_t byte_pos = pos >> 3;
+    size_t n_unchanged_bits = pos & 7;
+    size_t n_changed_bits = std::min(n_bits, 8 - n_unchanged_bits);
+    size_t total_bits = n_unchanged_bits + n_changed_bits;
+    uint32_t mask = (~((1 << total_bits) - 1)) | ((1 << n_unchanged_bits) - 1);
+    uint32_t unchanged_bits = array[byte_pos] & mask;
+    uint32_t changed_bits = bits & ((1 << n_changed_bits) - 1);
+    array[byte_pos] =
+        static_cast<uint8_t>((changed_bits << n_unchanged_bits) |
+                             unchanged_bits);
+    n_bits -= n_changed_bits;
+    bits >>= n_changed_bits;
+    pos += n_changed_bits;
+  }
+}
+
+static void RewindBitPosition(const size_t new_storage_ix,
+                              size_t* storage_ix, uint8_t* storage) {
+  const size_t bitpos = new_storage_ix & 7;
+  const size_t mask = (1u << bitpos) - 1;
+  storage[new_storage_ix >> 3] &= static_cast<uint8_t>(mask);
+  *storage_ix = new_storage_ix;
+}
+
+static bool ShouldMergeBlock(const uint8_t* data, size_t len,
+                             const uint8_t* depths) {
+  size_t histo[256] = { 0 };
+  static const size_t kSampleRate = 43;
+  for (size_t i = 0; i < len; i += kSampleRate) {
+    ++histo[data[i]];
+  }
+  const size_t total = (len + kSampleRate - 1) / kSampleRate;
+  double r = (FastLog2(total) + 0.5) * static_cast<double>(total) + 200;
+  for (size_t i = 0; i < 256; ++i) {
+    r -= static_cast<double>(histo[i]) * (depths[i] + FastLog2(histo[i]));
+  }
+  return r >= 0.0;
+}
+
+inline bool ShouldUseUncompressedMode(const uint8_t* metablock_start,
+                                      const uint8_t* next_emit,
+                                      const size_t insertlen,
+                                      const uint8_t literal_depths[256]) {
+  const size_t compressed = static_cast<size_t>(next_emit - metablock_start);
+  if (compressed * 50 > insertlen) {
+    return false;
+  }
+  static const double kAcceptableLossForUncompressibleSpeedup = 0.02;
+  static const double kMinEntropy =
+      8 * (1.0 - kAcceptableLossForUncompressibleSpeedup);
+  uint32_t sum = 0;
+  for (int i = 0; i < 256; ++i) {
+    const uint32_t n = literal_depths[i];
+    sum += n << (15 - n);
+  }
+  return sum > static_cast<uint32_t>((1 << 15) * kMinEntropy);
+}
+
+static void EmitUncompressedMetaBlock(const uint8_t* begin, const uint8_t* end,
+                                      const size_t storage_ix_start,
+                                      size_t* storage_ix, uint8_t* storage) {
+  const size_t len = static_cast<size_t>(end - begin);
+  RewindBitPosition(storage_ix_start, storage_ix, storage);
+  StoreMetaBlockHeader(len, 1, storage_ix, storage);
+  *storage_ix = (*storage_ix + 7u) & ~7u;
+  memcpy(&storage[*storage_ix >> 3], begin, len);
+  *storage_ix += len << 3;
+  storage[*storage_ix >> 3] = 0;
+}
+
+void BrotliCompressFragmentFast(const uint8_t* input, size_t input_size,
+                                bool is_last,
+                                int* table, size_t table_size,
+                                uint8_t cmd_depth[128], uint16_t cmd_bits[128],
+                                size_t* cmd_code_numbits, uint8_t* cmd_code,
+                                size_t* storage_ix, uint8_t* storage) {
+  if (input_size == 0) {
+    assert(is_last);
+    WriteBits(1, 1, storage_ix, storage);  // islast
+    WriteBits(1, 1, storage_ix, storage);  // isempty
+    *storage_ix = (*storage_ix + 7u) & ~7u;
+    return;
+  }
+
+  // "next_emit" is a pointer to the first byte that is not covered by a
+  // previous copy. Bytes between "next_emit" and the start of the next copy or
+  // the end of the input will be emitted as literal bytes.
+  const uint8_t* next_emit = input;
+  // Save the start of the first block for position and distance computations.
+  const uint8_t* base_ip = input;
+
+  static const size_t kFirstBlockSize = 3 << 15;
+  static const size_t kMergeBlockSize = 1 << 16;
+
+  const uint8_t* metablock_start = input;
+  size_t block_size = std::min(input_size, kFirstBlockSize);
+  size_t total_block_size = block_size;
+  // Save the bit position of the MLEN field of the meta-block header, so that
+  // we can update it later if we decide to extend this meta-block.
+  size_t mlen_storage_ix = *storage_ix + 3;
+  StoreMetaBlockHeader(block_size, 0, storage_ix, storage);
+  // No block splits, no contexts.
+  WriteBits(13, 0, storage_ix, storage);
+
+  uint8_t lit_depth[256] = { 0 };
+  uint16_t lit_bits[256] = { 0 };
+  BuildAndStoreLiteralPrefixCode(input, block_size, lit_depth, lit_bits,
+                                 storage_ix, storage);
+
+  // Store the pre-compressed command and distance prefix codes.
+  for (size_t i = 0; i + 7 < *cmd_code_numbits; i += 8) {
+    WriteBits(8, cmd_code[i >> 3], storage_ix, storage);
+  }
+  WriteBits(*cmd_code_numbits & 7, cmd_code[*cmd_code_numbits >> 3],
+            storage_ix, storage);
+
+ emit_commands:
+  // Initialize the command and distance histograms. We will gather
+  // statistics of command and distance codes during the processing
+  // of this block and use it to update the command and distance
+  // prefix codes for the next block.
+  uint32_t cmd_histo[128] = {
+    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, 1, 1, 1, 0, 0, 0, 0,
+  };
+
+  // "ip" is the input pointer.
+  const uint8_t* ip = input;
+  assert(table_size);
+  assert(table_size <= (1u << 31));
+  assert((table_size & (table_size - 1)) == 0);  // table must be power of two
+  const size_t shift = 64u - Log2FloorNonZero(table_size);
+  assert(table_size - 1 == static_cast<size_t>(
+      MAKE_UINT64_T(0xFFFFFFFF, 0xFFFFFF) >> shift));
+  const uint8_t* ip_end = input + block_size;
+
+  int last_distance = -1;
+  const size_t kInputMarginBytes = 16;
+  const size_t kMinMatchLen = 5;
+  if (PREDICT_TRUE(block_size >= kInputMarginBytes)) {
+    // For the last block, we need to keep a 16 bytes margin so that we can be
+    // sure that all distances are at most window size - 16.
+    // For all other blocks, we only need to keep a margin of 5 bytes so that
+    // we don't go over the block size with a copy.
+    const size_t len_limit = std::min(block_size - kMinMatchLen,
+                                      input_size - kInputMarginBytes);
+    const uint8_t* ip_limit = input + len_limit;
+
+    for (uint32_t next_hash = Hash(++ip, shift); ; ) {
+      assert(next_emit < ip);
+      // Step 1: Scan forward in the input looking for a 5-byte-long match.
+      // If we get close to exhausting the input then goto emit_remainder.
+      //
+      // Heuristic match skipping: If 32 bytes are scanned with no matches
+      // found, start looking only at every other byte. If 32 more bytes are
+      // scanned, look at every third byte, etc.. When a match is found,
+      // immediately go back to looking at every byte. This is a small loss
+      // (~5% performance, ~0.1% density) for compressible data due to more
+      // bookkeeping, but for non-compressible data (such as JPEG) it's a huge
+      // win since the compressor quickly "realizes" the data is incompressible
+      // and doesn't bother looking for matches everywhere.
+      //
+      // The "skip" variable keeps track of how many bytes there are since the
+      // last match; dividing it by 32 (ie. right-shifting by five) gives the
+      // number of bytes to move ahead for each iteration.
+      uint32_t skip = 32;
+
+      const uint8_t* next_ip = ip;
+      const uint8_t* candidate;
+      do {
+        ip = next_ip;
+        uint32_t hash = next_hash;
+        assert(hash == Hash(ip, shift));
+        uint32_t bytes_between_hash_lookups = skip++ >> 5;
+        next_ip = ip + bytes_between_hash_lookups;
+        if (PREDICT_FALSE(next_ip > ip_limit)) {
+          goto emit_remainder;
+        }
+        next_hash = Hash(next_ip, shift);
+        candidate = ip - last_distance;
+        if (IsMatch(ip, candidate)) {
+          if (PREDICT_TRUE(candidate < ip)) {
+            table[hash] = static_cast<int>(ip - base_ip);
+            break;
+          }
+        }
+        candidate = base_ip + table[hash];
+        assert(candidate >= base_ip);
+        assert(candidate < ip);
+
+        table[hash] = static_cast<int>(ip - base_ip);
+      } while (PREDICT_TRUE(!IsMatch(ip, candidate)));
+
+      // Step 2: Emit the found match together with the literal bytes from
+      // "next_emit" to the bit stream, and then see if we can find a next macth
+      // immediately afterwards. Repeat until we find no match for the input
+      // without emitting some literal bytes.
+      uint64_t input_bytes;
+
+      {
+        // We have a 5-byte match at ip, and we need to emit bytes in
+        // [next_emit, ip).
+        const uint8_t* base = ip;
+        size_t matched = 5 + FindMatchLengthWithLimit(
+            candidate + 5, ip + 5, static_cast<size_t>(ip_end - ip) - 5);
+        ip += matched;
+        int distance = static_cast<int>(base - candidate);  /* > 0 */
+        size_t insert = static_cast<size_t>(base - next_emit);
+        assert(0 == memcmp(base, candidate, matched));
+        if (PREDICT_TRUE(insert < 6210)) {
+          EmitInsertLen(insert, cmd_depth, cmd_bits, cmd_histo,
+                        storage_ix, storage);
+        } else if (ShouldUseUncompressedMode(metablock_start, next_emit, insert,
+                                             lit_depth)) {
+          EmitUncompressedMetaBlock(metablock_start, base, mlen_storage_ix - 3,
+                                    storage_ix, storage);
+          input_size -= static_cast<size_t>(base - input);
+          input = base;
+          next_emit = input;
+          goto next_block;
+        } else {
+          EmitLongInsertLen(insert, cmd_depth, cmd_bits, cmd_histo,
+                            storage_ix, storage);
+        }
+        EmitLiterals(next_emit, insert, lit_depth, lit_bits,
+                     storage_ix, storage);
+        if (distance == last_distance) {
+          WriteBits(cmd_depth[64], cmd_bits[64], storage_ix, storage);
+          ++cmd_histo[64];
+        } else {
+          EmitDistance(static_cast<size_t>(distance), cmd_depth, cmd_bits,
+                       cmd_histo, storage_ix, storage);
+          last_distance = distance;
+        }
+        EmitCopyLenLastDistance(matched, cmd_depth, cmd_bits, cmd_histo,
+                                storage_ix, storage);
+
+        next_emit = ip;
+        if (PREDICT_FALSE(ip >= ip_limit)) {
+          goto emit_remainder;
+        }
+        // We could immediately start working at ip now, but to improve
+        // compression we first update "table" with the hashes of some positions
+        // within the last copy.
+        input_bytes = BROTLI_UNALIGNED_LOAD64(ip - 3);
+        uint32_t prev_hash = HashBytesAtOffset(input_bytes, 0, shift);
+        table[prev_hash] = static_cast<int>(ip - base_ip - 3);
+        prev_hash = HashBytesAtOffset(input_bytes, 1, shift);
+        table[prev_hash] = static_cast<int>(ip - base_ip - 2);
+        prev_hash = HashBytesAtOffset(input_bytes, 2, shift);
+        table[prev_hash] = static_cast<int>(ip - base_ip - 1);
+
+        uint32_t cur_hash = HashBytesAtOffset(input_bytes, 3, shift);
+        candidate = base_ip + table[cur_hash];
+        table[cur_hash] = static_cast<int>(ip - base_ip);
+      }
+
+      while (IsMatch(ip, candidate)) {
+        // We have a 5-byte match at ip, and no need to emit any literal bytes
+        // prior to ip.
+        const uint8_t* base = ip;
+        size_t matched = 5 + FindMatchLengthWithLimit(
+            candidate + 5, ip + 5, static_cast<size_t>(ip_end - ip) - 5);
+        ip += matched;
+        last_distance = static_cast<int>(base - candidate);  /* > 0 */
+        assert(0 == memcmp(base, candidate, matched));
+        EmitCopyLen(matched, cmd_depth, cmd_bits, cmd_histo,
+                    storage_ix, storage);
+        EmitDistance(static_cast<size_t>(last_distance), cmd_depth, cmd_bits,
+                     cmd_histo, storage_ix, storage);
+
+        next_emit = ip;
+        if (PREDICT_FALSE(ip >= ip_limit)) {
+          goto emit_remainder;
+        }
+        // We could immediately start working at ip now, but to improve
+        // compression we first update "table" with the hashes of some positions
+        // within the last copy.
+        input_bytes = BROTLI_UNALIGNED_LOAD64(ip - 3);
+        uint32_t prev_hash = HashBytesAtOffset(input_bytes, 0, shift);
+        table[prev_hash] = static_cast<int>(ip - base_ip - 3);
+        prev_hash = HashBytesAtOffset(input_bytes, 1, shift);
+        table[prev_hash] = static_cast<int>(ip - base_ip - 2);
+        prev_hash = HashBytesAtOffset(input_bytes, 2, shift);
+        table[prev_hash] = static_cast<int>(ip - base_ip - 1);
+
+        uint32_t cur_hash = HashBytesAtOffset(input_bytes, 3, shift);
+        candidate = base_ip + table[cur_hash];
+        table[cur_hash] = static_cast<int>(ip - base_ip);
+      }
+
+      next_hash = Hash(++ip, shift);
+    }
+  }
+
+ emit_remainder:
+  assert(next_emit <= ip_end);
+  input += block_size;
+  input_size -= block_size;
+  block_size = std::min(input_size, kMergeBlockSize);
+
+  // Decide if we want to continue this meta-block instead of emitting the
+  // last insert-only command.
+  if (input_size > 0 &&
+      total_block_size + block_size <= (1 << 20) &&
+      ShouldMergeBlock(input, block_size, lit_depth)) {
+    assert(total_block_size > (1 << 16));
+    // Update the size of the current meta-block and continue emitting commands.
+    // We can do this because the current size and the new size both have 5
+    // nibbles.
+    total_block_size += block_size;
+    UpdateBits(20, static_cast<uint32_t>(total_block_size - 1),
+               mlen_storage_ix, storage);
+    goto emit_commands;
+  }
+
+  // Emit the remaining bytes as literals.
+  if (next_emit < ip_end) {
+    const size_t insert = static_cast<size_t>(ip_end - next_emit);
+    if (PREDICT_TRUE(insert < 6210)) {
+      EmitInsertLen(insert, cmd_depth, cmd_bits, cmd_histo,
+                    storage_ix, storage);
+      EmitLiterals(next_emit, insert, lit_depth, lit_bits, storage_ix, storage);
+    } else if (ShouldUseUncompressedMode(metablock_start, next_emit, insert,
+                                         lit_depth)) {
+      EmitUncompressedMetaBlock(metablock_start, ip_end, mlen_storage_ix - 3,
+                                storage_ix, storage);
+    } else {
+      EmitLongInsertLen(insert, cmd_depth, cmd_bits, cmd_histo,
+                        storage_ix, storage);
+      EmitLiterals(next_emit, insert, lit_depth, lit_bits,
+                   storage_ix, storage);
+    }
+  }
+  next_emit = ip_end;
+
+next_block:
+  // If we have more data, write a new meta-block header and prefix codes and
+  // then continue emitting commands.
+  if (input_size > 0) {
+    metablock_start = input;
+    block_size = std::min(input_size, kFirstBlockSize);
+    total_block_size = block_size;
+    // Save the bit position of the MLEN field of the meta-block header, so that
+    // we can update it later if we decide to extend this meta-block.
+    mlen_storage_ix = *storage_ix + 3;
+    StoreMetaBlockHeader(block_size, 0, storage_ix, storage);
+    // No block splits, no contexts.
+    WriteBits(13, 0, storage_ix, storage);
+    memset(lit_depth, 0, sizeof(lit_depth));
+    memset(lit_bits, 0, sizeof(lit_bits));
+    BuildAndStoreLiteralPrefixCode(input, block_size, lit_depth, lit_bits,
+                                   storage_ix, storage);
+    BuildAndStoreCommandPrefixCode(cmd_histo, cmd_depth, cmd_bits,
+                                   storage_ix, storage);
+    goto emit_commands;
+  }
+
+  if (is_last) {
+    WriteBits(1, 1, storage_ix, storage);  // islast
+    WriteBits(1, 1, storage_ix, storage);  // isempty
+    *storage_ix = (*storage_ix + 7u) & ~7u;
+  } else {
+    // If this is not the last block, update the command and distance prefix
+    // codes for the next block and store the compressed forms.
+    cmd_code[0] = 0;
+    *cmd_code_numbits = 0;
+    BuildAndStoreCommandPrefixCode(cmd_histo, cmd_depth, cmd_bits,
+                                   cmd_code_numbits, cmd_code);
+  }
+}
+
+}  // namespace brotli
diff --git a/third_party/brotli/enc/compress_fragment.h b/third_party/brotli/enc/compress_fragment.h
new file mode 100644
index 0000000..7ce05fdf
--- /dev/null
+++ b/third_party/brotli/enc/compress_fragment.h
@@ -0,0 +1,47 @@
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Function for fast encoding of an input fragment, independently from the input
+// history. This function uses one-pass processing: when we find a backward
+// match, we immediately emit the corresponding command and literal codes to
+// the bit stream.
+
+#ifndef BROTLI_ENC_COMPRESS_FRAGMENT_H_
+#define BROTLI_ENC_COMPRESS_FRAGMENT_H_
+
+#include "./types.h"
+
+namespace brotli {
+
+// Compresses "input" string to the "*storage" buffer as one or more complete
+// meta-blocks, and updates the "*storage_ix" bit position.
+//
+// If "is_last" is true, emits an additional empty last meta-block.
+//
+// "cmd_depth" and "cmd_bits" contain the command and distance prefix codes
+// (see comment in encode.h) used for the encoding of this input fragment.
+// If "is_last" is false, they are updated to reflect the statistics
+// of this input fragment, to be used for the encoding of the next fragment.
+//
+// "*cmd_code_numbits" is the number of bits of the compressed representation
+// of the command and distance prefix codes, and "cmd_code" is an array of
+// at least "(*cmd_code_numbits + 7) >> 3" size that contains the compressed
+// command and distance prefix codes. If "is_last" is false, these are also
+// updated to represent the updated "cmd_depth" and "cmd_bits".
+//
+// REQUIRES: "input_size" is greater than zero, or "is_last" is true.
+// REQUIRES: All elements in "table[0..table_size-1]" are initialized to zero.
+// REQUIRES: "table_size" is a power of two
+void BrotliCompressFragmentFast(const uint8_t* input, size_t input_size,
+                                bool is_last,
+                                int* table, size_t table_size,
+                                uint8_t cmd_depth[128], uint16_t cmd_bits[128],
+                                size_t* cmd_code_numbits, uint8_t* cmd_code,
+                                size_t* storage_ix, uint8_t* storage);
+
+}  // namespace brotli
+
+#endif  // BROTLI_ENC_COMPRESS_FRAGMENT_H_
diff --git a/third_party/brotli/enc/compress_fragment_two_pass.cc b/third_party/brotli/enc/compress_fragment_two_pass.cc
new file mode 100644
index 0000000..a032740
--- /dev/null
+++ b/third_party/brotli/enc/compress_fragment_two_pass.cc
@@ -0,0 +1,524 @@
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Function for fast encoding of an input fragment, independently from the input
+// history. This function uses two-pass processing: in the first pass we save
+// the found backward matches and literal bytes into a buffer, and in the
+// second pass we emit them into the bit stream using prefix codes built based
+// on the actual command and literal byte histograms.
+
+#include "./compress_fragment_two_pass.h"
+
+#include <algorithm>
+
+#include "./brotli_bit_stream.h"
+#include "./bit_cost.h"
+#include "./entropy_encode.h"
+#include "./fast_log.h"
+#include "./find_match_length.h"
+#include "./port.h"
+#include "./types.h"
+#include "./write_bits.h"
+
+namespace brotli {
+
+// kHashMul32 multiplier has these properties:
+// * The multiplier must be odd. Otherwise we may lose the highest bit.
+// * No long streaks of 1s or 0s.
+// * There is no effort to ensure that it is a prime, the oddity is enough
+//   for this use.
+// * The number has been tuned heuristically against compression benchmarks.
+static const uint32_t kHashMul32 = 0x1e35a7bd;
+
+static inline uint32_t Hash(const uint8_t* p, size_t shift) {
+  const uint64_t h = (BROTLI_UNALIGNED_LOAD64(p) << 16) * kHashMul32;
+  return static_cast<uint32_t>(h >> shift);
+}
+
+static inline uint32_t HashBytesAtOffset(uint64_t v, int offset, size_t shift) {
+  assert(offset >= 0);
+  assert(offset <= 2);
+  const uint64_t h = ((v >> (8 * offset)) << 16) * kHashMul32;
+  return static_cast<uint32_t>(h >> shift);
+}
+
+static inline int IsMatch(const uint8_t* p1, const uint8_t* p2) {
+  return (BROTLI_UNALIGNED_LOAD32(p1) == BROTLI_UNALIGNED_LOAD32(p2) &&
+          p1[4] == p2[4] &&
+          p1[5] == p2[5]);
+}
+
+// Builds a command and distance prefix code (each 64 symbols) into "depth" and
+// "bits" based on "histogram" and stores it into the bit stream.
+static void BuildAndStoreCommandPrefixCode(
+    const uint32_t histogram[128],
+    uint8_t depth[128], uint16_t bits[128],
+    size_t* storage_ix, uint8_t* storage) {
+  // Tree size for building a tree over 64 symbols is 2 * 64 + 1.
+  static const size_t kTreeSize = 129;
+  HuffmanTree tree[kTreeSize];
+  CreateHuffmanTree(histogram, 64, 15, tree, depth);
+  CreateHuffmanTree(&histogram[64], 64, 14, tree, &depth[64]);
+  // We have to jump through a few hoopes here in order to compute
+  // the command bits because the symbols are in a different order than in
+  // the full alphabet. This looks complicated, but having the symbols
+  // in this order in the command bits saves a few branches in the Emit*
+  // functions.
+  uint8_t cmd_depth[64];
+  uint16_t cmd_bits[64];
+  memcpy(cmd_depth, depth + 24, 24);
+  memcpy(cmd_depth + 24, depth, 8);
+  memcpy(cmd_depth + 32, depth + 48, 8);
+  memcpy(cmd_depth + 40, depth + 8, 8);
+  memcpy(cmd_depth + 48, depth + 56, 8);
+  memcpy(cmd_depth + 56, depth + 16, 8);
+  ConvertBitDepthsToSymbols(cmd_depth, 64, cmd_bits);
+  memcpy(bits, cmd_bits + 24, 16);
+  memcpy(bits + 8, cmd_bits + 40, 16);
+  memcpy(bits + 16, cmd_bits + 56, 16);
+  memcpy(bits + 24, cmd_bits, 48);
+  memcpy(bits + 48, cmd_bits + 32, 16);
+  memcpy(bits + 56, cmd_bits + 48, 16);
+  ConvertBitDepthsToSymbols(&depth[64], 64, &bits[64]);
+  {
+    // Create the bit length array for the full command alphabet.
+    uint8_t cmd_depth[704] = { 0 };
+    memcpy(cmd_depth, depth + 24, 8);
+    memcpy(cmd_depth + 64, depth + 32, 8);
+    memcpy(cmd_depth + 128, depth + 40, 8);
+    memcpy(cmd_depth + 192, depth + 48, 8);
+    memcpy(cmd_depth + 384, depth + 56, 8);
+    for (size_t i = 0; i < 8; ++i) {
+      cmd_depth[128 + 8 * i] = depth[i];
+      cmd_depth[256 + 8 * i] = depth[8 + i];
+      cmd_depth[448 + 8 * i] = depth[16 + i];
+    }
+    StoreHuffmanTree(cmd_depth, 704, tree, storage_ix, storage);
+  }
+  StoreHuffmanTree(&depth[64], 64, tree, storage_ix, storage);
+}
+
+inline void EmitInsertLen(uint32_t insertlen, uint32_t** commands) {
+  if (insertlen < 6) {
+    **commands = insertlen;
+  } else if (insertlen < 130) {
+    insertlen -= 2;
+    const uint32_t nbits = Log2FloorNonZero(insertlen) - 1u;
+    const uint32_t prefix = insertlen >> nbits;
+    const uint32_t inscode = (nbits << 1) + prefix + 2;
+    const uint32_t extra = insertlen - (prefix << nbits);
+    **commands = inscode | (extra << 8);
+  } else if (insertlen < 2114) {
+    insertlen -= 66;
+    const uint32_t nbits = Log2FloorNonZero(insertlen);
+    const uint32_t code = nbits + 10;
+    const uint32_t extra = insertlen - (1 << nbits);
+    **commands = code | (extra << 8);
+  } else if (insertlen < 6210) {
+    const uint32_t extra = insertlen - 2114;
+    **commands = 21 | (extra << 8);
+  } else if (insertlen < 22594) {
+    const uint32_t extra = insertlen - 6210;
+    **commands = 22 | (extra << 8);
+  } else {
+    const uint32_t extra = insertlen - 22594;
+    **commands = 23 | (extra << 8);
+  }
+  ++(*commands);
+}
+
+inline void EmitCopyLen(size_t copylen, uint32_t** commands) {
+  if (copylen < 10) {
+    **commands = static_cast<uint32_t>(copylen + 38);
+  } else if (copylen < 134) {
+    copylen -= 6;
+    const size_t nbits = Log2FloorNonZero(copylen) - 1;
+    const size_t prefix = copylen >> nbits;
+    const size_t code = (nbits << 1) + prefix + 44;
+    const size_t extra = copylen - (prefix << nbits);
+    **commands = static_cast<uint32_t>(code | (extra << 8));
+  } else if (copylen < 2118) {
+    copylen -= 70;
+    const size_t nbits = Log2FloorNonZero(copylen);
+    const size_t code = nbits + 52;
+    const size_t extra = copylen - (1 << nbits);
+    **commands = static_cast<uint32_t>(code | (extra << 8));
+  } else {
+    const size_t extra = copylen - 2118;
+    **commands = static_cast<uint32_t>(63 | (extra << 8));
+  }
+  ++(*commands);
+}
+
+inline void EmitCopyLenLastDistance(size_t copylen, uint32_t** commands) {
+  if (copylen < 12) {
+    **commands = static_cast<uint32_t>(copylen + 20);
+    ++(*commands);
+  } else if (copylen < 72) {
+    copylen -= 8;
+    const size_t nbits = Log2FloorNonZero(copylen) - 1;
+    const size_t prefix = copylen >> nbits;
+    const size_t code = (nbits << 1) + prefix + 28;
+    const size_t extra = copylen - (prefix << nbits);
+    **commands = static_cast<uint32_t>(code | (extra << 8));
+    ++(*commands);
+  } else if (copylen < 136) {
+    copylen -= 8;
+    const size_t code = (copylen >> 5) + 54;
+    const size_t extra = copylen & 31;
+    **commands = static_cast<uint32_t>(code | (extra << 8));
+    ++(*commands);
+    **commands = 64;
+    ++(*commands);
+  } else if (copylen < 2120) {
+    copylen -= 72;
+    const size_t nbits = Log2FloorNonZero(copylen);
+    const size_t code = nbits + 52;
+    const size_t extra = copylen - (1 << nbits);
+    **commands = static_cast<uint32_t>(code | (extra << 8));
+    ++(*commands);
+    **commands = 64;
+    ++(*commands);
+  } else {
+    const size_t extra = copylen - 2120;
+    **commands = static_cast<uint32_t>(63 | (extra << 8));
+    ++(*commands);
+    **commands = 64;
+    ++(*commands);
+  }
+}
+
+inline void EmitDistance(uint32_t distance, uint32_t** commands) {
+  distance += 3;
+  uint32_t nbits = Log2FloorNonZero(distance) - 1;
+  const uint32_t prefix = (distance >> nbits) & 1;
+  const uint32_t offset = (2 + prefix) << nbits;
+  const uint32_t distcode = 2 * (nbits - 1) + prefix + 80;
+  uint32_t extra = distance - offset;
+  **commands = distcode | (extra << 8);
+  ++(*commands);
+}
+
+// REQUIRES: len <= 1 << 20.
+static void StoreMetaBlockHeader(
+    size_t len, bool is_uncompressed, size_t* storage_ix, uint8_t* storage) {
+  // ISLAST
+  WriteBits(1, 0, storage_ix, storage);
+  if (len <= (1U << 16)) {
+    // MNIBBLES is 4
+    WriteBits(2, 0, storage_ix, storage);
+    WriteBits(16, len - 1, storage_ix, storage);
+  } else {
+    // MNIBBLES is 5
+    WriteBits(2, 1, storage_ix, storage);
+    WriteBits(20, len - 1, storage_ix, storage);
+  }
+  // ISUNCOMPRESSED
+  WriteBits(1, is_uncompressed, storage_ix, storage);
+}
+
+static void CreateCommands(const uint8_t* input, size_t block_size,
+                           size_t input_size, const uint8_t* base_ip,
+                           int* table, size_t table_size,
+                           uint8_t** literals, uint32_t** commands) {
+  // "ip" is the input pointer.
+  const uint8_t* ip = input;
+  assert(table_size);
+  assert(table_size <= (1u << 31));
+  assert((table_size & (table_size - 1)) == 0);  // table must be power of two
+  const size_t shift = 64u - Log2FloorNonZero(table_size);
+  assert(table_size - 1 == static_cast<size_t>(
+      MAKE_UINT64_T(0xFFFFFFFF, 0xFFFFFF) >> shift));
+  const uint8_t* ip_end = input + block_size;
+  // "next_emit" is a pointer to the first byte that is not covered by a
+  // previous copy. Bytes between "next_emit" and the start of the next copy or
+  // the end of the input will be emitted as literal bytes.
+  const uint8_t* next_emit = input;
+
+  int last_distance = -1;
+  const size_t kInputMarginBytes = 16;
+  const size_t kMinMatchLen = 6;
+  if (PREDICT_TRUE(block_size >= kInputMarginBytes)) {
+    // For the last block, we need to keep a 16 bytes margin so that we can be
+    // sure that all distances are at most window size - 16.
+    // For all other blocks, we only need to keep a margin of 5 bytes so that
+    // we don't go over the block size with a copy.
+    const size_t len_limit = std::min(block_size - kMinMatchLen,
+                                      input_size - kInputMarginBytes);
+    const uint8_t* ip_limit = input + len_limit;
+
+    for (uint32_t next_hash = Hash(++ip, shift); ; ) {
+      assert(next_emit < ip);
+      // Step 1: Scan forward in the input looking for a 6-byte-long match.
+      // If we get close to exhausting the input then goto emit_remainder.
+      //
+      // Heuristic match skipping: If 32 bytes are scanned with no matches
+      // found, start looking only at every other byte. If 32 more bytes are
+      // scanned, look at every third byte, etc.. When a match is found,
+      // immediately go back to looking at every byte. This is a small loss
+      // (~5% performance, ~0.1% density) for compressible data due to more
+      // bookkeeping, but for non-compressible data (such as JPEG) it's a huge
+      // win since the compressor quickly "realizes" the data is incompressible
+      // and doesn't bother looking for matches everywhere.
+      //
+      // The "skip" variable keeps track of how many bytes there are since the
+      // last match; dividing it by 32 (ie. right-shifting by five) gives the
+      // number of bytes to move ahead for each iteration.
+      uint32_t skip = 32;
+
+      const uint8_t* next_ip = ip;
+      const uint8_t* candidate;
+      do {
+        ip = next_ip;
+        uint32_t hash = next_hash;
+        assert(hash == Hash(ip, shift));
+        uint32_t bytes_between_hash_lookups = skip++ >> 5;
+        next_ip = ip + bytes_between_hash_lookups;
+        if (PREDICT_FALSE(next_ip > ip_limit)) {
+          goto emit_remainder;
+        }
+        next_hash = Hash(next_ip, shift);
+        candidate = ip - last_distance;
+        if (IsMatch(ip, candidate)) {
+          if (PREDICT_TRUE(candidate < ip)) {
+            table[hash] = static_cast<int>(ip - base_ip);
+            break;
+          }
+        }
+        candidate = base_ip + table[hash];
+        assert(candidate >= base_ip);
+        assert(candidate < ip);
+
+        table[hash] = static_cast<int>(ip - base_ip);
+      } while (PREDICT_TRUE(!IsMatch(ip, candidate)));
+
+      // Step 2: Emit the found match together with the literal bytes from
+      // "next_emit", and then see if we can find a next macth immediately
+      // afterwards. Repeat until we find no match for the input
+      // without emitting some literal bytes.
+      uint64_t input_bytes;
+
+      {
+        // We have a 6-byte match at ip, and we need to emit bytes in
+        // [next_emit, ip).
+        const uint8_t* base = ip;
+        size_t matched = 6 + FindMatchLengthWithLimit(
+            candidate + 6, ip + 6, static_cast<size_t>(ip_end - ip) - 6);
+        ip += matched;
+        int distance = static_cast<int>(base - candidate);  /* > 0 */
+        int insert = static_cast<int>(base - next_emit);
+        assert(0 == memcmp(base, candidate, matched));
+        EmitInsertLen(static_cast<uint32_t>(insert), commands);
+        memcpy(*literals, next_emit, static_cast<size_t>(insert));
+        *literals += insert;
+        if (distance == last_distance) {
+          **commands = 64;
+          ++(*commands);
+        } else {
+          EmitDistance(static_cast<uint32_t>(distance), commands);
+          last_distance = distance;
+        }
+        EmitCopyLenLastDistance(matched, commands);
+
+        next_emit = ip;
+        if (PREDICT_FALSE(ip >= ip_limit)) {
+          goto emit_remainder;
+        }
+        // We could immediately start working at ip now, but to improve
+        // compression we first update "table" with the hashes of some positions
+        // within the last copy.
+        input_bytes = BROTLI_UNALIGNED_LOAD64(ip - 5);
+        uint32_t prev_hash = HashBytesAtOffset(input_bytes, 0, shift);
+        table[prev_hash] = static_cast<int>(ip - base_ip - 5);
+        prev_hash = HashBytesAtOffset(input_bytes, 1, shift);
+        table[prev_hash] = static_cast<int>(ip - base_ip - 4);
+        prev_hash = HashBytesAtOffset(input_bytes, 2, shift);
+        table[prev_hash] = static_cast<int>(ip - base_ip - 3);
+        input_bytes = BROTLI_UNALIGNED_LOAD64(ip - 2);
+        prev_hash = HashBytesAtOffset(input_bytes, 0, shift);
+        table[prev_hash] = static_cast<int>(ip - base_ip - 2);
+        prev_hash = HashBytesAtOffset(input_bytes, 1, shift);
+        table[prev_hash] = static_cast<int>(ip - base_ip - 1);
+
+        uint32_t cur_hash = HashBytesAtOffset(input_bytes, 2, shift);
+        candidate = base_ip + table[cur_hash];
+        table[cur_hash] = static_cast<int>(ip - base_ip);
+      }
+
+      while (IsMatch(ip, candidate)) {
+        // We have a 6-byte match at ip, and no need to emit any
+        // literal bytes prior to ip.
+        const uint8_t* base = ip;
+        size_t matched = 6 + FindMatchLengthWithLimit(
+            candidate + 6, ip + 6, static_cast<size_t>(ip_end - ip) - 6);
+        ip += matched;
+        last_distance = static_cast<int>(base - candidate);  /* > 0 */
+        assert(0 == memcmp(base, candidate, matched));
+        EmitCopyLen(matched, commands);
+        EmitDistance(static_cast<uint32_t>(last_distance), commands);
+
+        next_emit = ip;
+        if (PREDICT_FALSE(ip >= ip_limit)) {
+          goto emit_remainder;
+        }
+        // We could immediately start working at ip now, but to improve
+        // compression we first update "table" with the hashes of some positions
+        // within the last copy.
+        input_bytes = BROTLI_UNALIGNED_LOAD64(ip - 5);
+        uint32_t prev_hash = HashBytesAtOffset(input_bytes, 0, shift);
+        table[prev_hash] = static_cast<int>(ip - base_ip - 5);
+        prev_hash = HashBytesAtOffset(input_bytes, 1, shift);
+        table[prev_hash] = static_cast<int>(ip - base_ip - 4);
+        prev_hash = HashBytesAtOffset(input_bytes, 2, shift);
+        table[prev_hash] = static_cast<int>(ip - base_ip - 3);
+        input_bytes = BROTLI_UNALIGNED_LOAD64(ip - 2);
+        prev_hash = HashBytesAtOffset(input_bytes, 0, shift);
+        table[prev_hash] = static_cast<int>(ip - base_ip - 2);
+        prev_hash = HashBytesAtOffset(input_bytes, 1, shift);
+        table[prev_hash] = static_cast<int>(ip - base_ip - 1);
+
+        uint32_t cur_hash = HashBytesAtOffset(input_bytes, 2, shift);
+        candidate = base_ip + table[cur_hash];
+        table[cur_hash] = static_cast<int>(ip - base_ip);
+      }
+
+      next_hash = Hash(++ip, shift);
+    }
+  }
+
+emit_remainder:
+  assert(next_emit <= ip_end);
+  // Emit the remaining bytes as literals.
+  if (next_emit < ip_end) {
+    const uint32_t insert = static_cast<uint32_t>(ip_end - next_emit);
+    EmitInsertLen(insert, commands);
+    memcpy(*literals, next_emit, insert);
+    *literals += insert;
+  }
+}
+
+static void StoreCommands(const uint8_t* literals, const size_t num_literals,
+                          const uint32_t* commands, const size_t num_commands,
+                          size_t* storage_ix, uint8_t* storage) {
+  uint8_t lit_depths[256] = { 0 };
+  uint16_t lit_bits[256] = { 0 };
+  uint32_t lit_histo[256] = { 0 };
+  for (size_t i = 0; i < num_literals; ++i) {
+    ++lit_histo[literals[i]];
+  }
+  BuildAndStoreHuffmanTreeFast(lit_histo, num_literals,
+                               /* max_bits = */ 8,
+                               lit_depths, lit_bits,
+                               storage_ix, storage);
+
+  uint8_t cmd_depths[128] = { 0 };
+  uint16_t cmd_bits[128] = { 0 };
+  uint32_t cmd_histo[128] = { 0 };
+  for (size_t i = 0; i < num_commands; ++i) {
+    ++cmd_histo[commands[i] & 0xff];
+  }
+  cmd_histo[1] += 1;
+  cmd_histo[2] += 1;
+  cmd_histo[64] += 1;
+  cmd_histo[84] += 1;
+  BuildAndStoreCommandPrefixCode(cmd_histo, cmd_depths, cmd_bits,
+                                 storage_ix, storage);
+
+  static const uint32_t kNumExtraBits[128] = {
+    0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 9, 10, 12, 14, 24,
+    0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4,
+    0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 9, 10, 24,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+    9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16,
+    17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24,
+  };
+  static const uint32_t kInsertOffset[24] = {
+    0, 1, 2, 3, 4, 5, 6, 8, 10, 14, 18, 26, 34, 50, 66, 98, 130, 194, 322, 578,
+    1090, 2114, 6210, 22594,
+  };
+
+  for (size_t i = 0; i < num_commands; ++i) {
+    const uint32_t cmd = commands[i];
+    const uint32_t code = cmd & 0xff;
+    const uint32_t extra = cmd >> 8;
+    WriteBits(cmd_depths[code], cmd_bits[code], storage_ix, storage);
+    WriteBits(kNumExtraBits[code], extra, storage_ix, storage);
+    if (code < 24) {
+      const uint32_t insert = kInsertOffset[code] + extra;
+      for (uint32_t j = 0; j < insert; ++j) {
+        const uint8_t lit = *literals;
+        WriteBits(lit_depths[lit], lit_bits[lit], storage_ix, storage);
+        ++literals;
+      }
+    }
+  }
+}
+
+static bool ShouldCompress(const uint8_t* input, size_t input_size,
+                           size_t num_literals) {
+  static const double kAcceptableLossForUncompressibleSpeedup = 0.02;
+  static const double kMaxRatioOfLiterals =
+      1.0 - kAcceptableLossForUncompressibleSpeedup;
+  if (num_literals < kMaxRatioOfLiterals * static_cast<double>(input_size)) {
+    return true;
+  }
+  uint32_t literal_histo[256] = { 0 };
+  static const uint32_t kSampleRate = 43;
+  static const double kMaxEntropy =
+      8 * (1.0 - kAcceptableLossForUncompressibleSpeedup);
+  const double max_total_bit_cost =
+      static_cast<double>(input_size) * kMaxEntropy / kSampleRate;
+  for (size_t i = 0; i < input_size; i += kSampleRate) {
+    ++literal_histo[input[i]];
+  }
+  return BitsEntropy(literal_histo, 256) < max_total_bit_cost;
+}
+
+void BrotliCompressFragmentTwoPass(const uint8_t* input, size_t input_size,
+                                   bool is_last,
+                                   uint32_t* command_buf, uint8_t* literal_buf,
+                                   int* table, size_t table_size,
+                                   size_t* storage_ix, uint8_t* storage) {
+  // Save the start of the first block for position and distance computations.
+  const uint8_t* base_ip = input;
+
+  while (input_size > 0) {
+    size_t block_size = std::min(input_size, kCompressFragmentTwoPassBlockSize);
+    uint32_t* commands = command_buf;
+    uint8_t* literals = literal_buf;
+    CreateCommands(input, block_size, input_size, base_ip, table, table_size,
+                   &literals, &commands);
+    const size_t num_literals = static_cast<size_t>(literals - literal_buf);
+    const size_t num_commands = static_cast<size_t>(commands - command_buf);
+    if (ShouldCompress(input, block_size, num_literals)) {
+      StoreMetaBlockHeader(block_size, 0, storage_ix, storage);
+      // No block splits, no contexts.
+      WriteBits(13, 0, storage_ix, storage);
+      StoreCommands(literal_buf, num_literals, command_buf, num_commands,
+                    storage_ix, storage);
+    } else {
+      // Since we did not find many backward references and the entropy of
+      // the data is close to 8 bits, we can simply emit an uncompressed block.
+      // This makes compression speed of uncompressible data about 3x faster.
+      StoreMetaBlockHeader(block_size, 1, storage_ix, storage);
+      *storage_ix = (*storage_ix + 7u) & ~7u;
+      memcpy(&storage[*storage_ix >> 3], input, block_size);
+      *storage_ix += block_size << 3;
+      storage[*storage_ix >> 3] = 0;
+    }
+    input += block_size;
+    input_size -= block_size;
+  }
+
+  if (is_last) {
+    WriteBits(1, 1, storage_ix, storage);  // islast
+    WriteBits(1, 1, storage_ix, storage);  // isempty
+    *storage_ix = (*storage_ix + 7u) & ~7u;
+  }
+}
+
+}  // namespace brotli
diff --git a/third_party/brotli/enc/compress_fragment_two_pass.h b/third_party/brotli/enc/compress_fragment_two_pass.h
new file mode 100644
index 0000000..690ed081
--- /dev/null
+++ b/third_party/brotli/enc/compress_fragment_two_pass.h
@@ -0,0 +1,40 @@
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Function for fast encoding of an input fragment, independently from the input
+// history. This function uses two-pass processing: in the first pass we save
+// the found backward matches and literal bytes into a buffer, and in the
+// second pass we emit them into the bit stream using prefix codes built based
+// on the actual command and literal byte histograms.
+
+#ifndef BROTLI_ENC_COMPRESS_FRAGMENT_TWO_PASS_H_
+#define BROTLI_ENC_COMPRESS_FRAGMENT_TWO_PASS_H_
+
+#include "./types.h"
+
+namespace brotli {
+
+static const size_t kCompressFragmentTwoPassBlockSize = 1 << 17;
+
+// Compresses "input" string to the "*storage" buffer as one or more complete
+// meta-blocks, and updates the "*storage_ix" bit position.
+//
+// If "is_last" is true, emits an additional empty last meta-block.
+//
+// REQUIRES: "input_size" is greater than zero, or "is_last" is true.
+// REQUIRES: "command_buf" and "literal_buf" point to at least
+//            kCompressFragmentTwoPassBlockSize long arrays.
+// REQUIRES: All elements in "table[0..table_size-1]" are initialized to zero.
+// REQUIRES: "table_size" is a power of two
+void BrotliCompressFragmentTwoPass(const uint8_t* input, size_t input_size,
+                                   bool is_last,
+                                   uint32_t* command_buf, uint8_t* literal_buf,
+                                   int* table, size_t table_size,
+                                   size_t* storage_ix, uint8_t* storage);
+
+}  // namespace brotli
+
+#endif  // BROTLI_ENC_COMPRESS_FRAGMENT_TWO_PASS_H_
diff --git a/third_party/brotli/enc/compressor.h b/third_party/brotli/enc/compressor.h
new file mode 100644
index 0000000..1dfc42e
--- /dev/null
+++ b/third_party/brotli/enc/compressor.h
@@ -0,0 +1,15 @@
+/* Copyright 2016 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* C++ API for Brotli compression. */
+
+#ifndef BROTLI_ENC_COMPRESSOR_H_
+#define BROTLI_ENC_COMPRESSOR_H_
+
+#include "./encode.h"
+#include "./streams.h"
+
+#endif  /* BROTLI_ENC_COMPRESSOR_H_ */
diff --git a/third_party/brotli/enc/context.h b/third_party/brotli/enc/context.h
new file mode 100644
index 0000000..00c065b
--- /dev/null
+++ b/third_party/brotli/enc/context.h
@@ -0,0 +1,178 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Functions to map previous bytes into a context id.
+
+#ifndef BROTLI_ENC_CONTEXT_H_
+#define BROTLI_ENC_CONTEXT_H_
+
+#include "./types.h"
+
+namespace brotli {
+
+// Second-order context lookup table for UTF8 byte streams.
+//
+// If p1 and p2 are the previous two bytes, we calculate the context as
+//
+//   context = kUTF8ContextLookup[p1] | kUTF8ContextLookup[p2 + 256].
+//
+// If the previous two bytes are ASCII characters (i.e. < 128), this will be
+// equivalent to
+//
+//   context = 4 * context1(p1) + context2(p2),
+//
+// where context1 is based on the previous byte in the following way:
+//
+//   0  : non-ASCII control
+//   1  : \t, \n, \r
+//   2  : space
+//   3  : other punctuation
+//   4  : " '
+//   5  : %
+//   6  : ( < [ {
+//   7  : ) > ] }
+//   8  : , ; :
+//   9  : .
+//   10 : =
+//   11 : number
+//   12 : upper-case vowel
+//   13 : upper-case consonant
+//   14 : lower-case vowel
+//   15 : lower-case consonant
+//
+// and context2 is based on the second last byte:
+//
+//   0 : control, space
+//   1 : punctuation
+//   2 : upper-case letter, number
+//   3 : lower-case letter
+//
+// If the last byte is ASCII, and the second last byte is not (in a valid UTF8
+// stream it will be a continuation byte, value between 128 and 191), the
+// context is the same as if the second last byte was an ASCII control or space.
+//
+// If the last byte is a UTF8 lead byte (value >= 192), then the next byte will
+// be a continuation byte and the context id is 2 or 3 depending on the LSB of
+// the last byte and to a lesser extent on the second last byte if it is ASCII.
+//
+// If the last byte is a UTF8 continuation byte, the second last byte can be:
+//   - continuation byte: the next byte is probably ASCII or lead byte (assuming
+//     4-byte UTF8 characters are rare) and the context id is 0 or 1.
+//   - lead byte (192 - 207): next byte is ASCII or lead byte, context is 0 or 1
+//   - lead byte (208 - 255): next byte is continuation byte, context is 2 or 3
+//
+// The possible value combinations of the previous two bytes, the range of
+// context ids and the type of the next byte is summarized in the table below:
+//
+// |--------\-----------------------------------------------------------------|
+// |         \                         Last byte                              |
+// | Second   \---------------------------------------------------------------|
+// | last byte \    ASCII            |   cont. byte        |   lead byte      |
+// |            \   (0-127)          |   (128-191)         |   (192-)         |
+// |=============|===================|=====================|==================|
+// |  ASCII      | next: ASCII/lead  |  not valid          |  next: cont.     |
+// |  (0-127)    | context: 4 - 63   |                     |  context: 2 - 3  |
+// |-------------|-------------------|---------------------|------------------|
+// |  cont. byte | next: ASCII/lead  |  next: ASCII/lead   |  next: cont.     |
+// |  (128-191)  | context: 4 - 63   |  context: 0 - 1     |  context: 2 - 3  |
+// |-------------|-------------------|---------------------|------------------|
+// |  lead byte  | not valid         |  next: ASCII/lead   |  not valid       |
+// |  (192-207)  |                   |  context: 0 - 1     |                  |
+// |-------------|-------------------|---------------------|------------------|
+// |  lead byte  | not valid         |  next: cont.        |  not valid       |
+// |  (208-)     |                   |  context: 2 - 3     |                  |
+// |-------------|-------------------|---------------------|------------------|
+static const uint8_t kUTF8ContextLookup[512] = {
+  // Last byte.
+  //
+  // ASCII range.
+   0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  4,  0,  0,  4,  0,  0,
+   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+   8, 12, 16, 12, 12, 20, 12, 16, 24, 28, 12, 12, 32, 12, 36, 12,
+  44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 32, 32, 24, 40, 28, 12,
+  12, 48, 52, 52, 52, 48, 52, 52, 52, 48, 52, 52, 52, 52, 52, 48,
+  52, 52, 52, 52, 52, 48, 52, 52, 52, 52, 52, 24, 12, 28, 12, 12,
+  12, 56, 60, 60, 60, 56, 60, 60, 60, 56, 60, 60, 60, 60, 60, 56,
+  60, 60, 60, 60, 60, 56, 60, 60, 60, 60, 60, 24, 12, 28, 12,  0,
+  // UTF8 continuation byte range.
+  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
+  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
+  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
+  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
+  // UTF8 lead byte range.
+  2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,
+  2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,
+  2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,
+  2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,
+  // Second last byte.
+  //
+  // ASCII range.
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1,
+  1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1,
+  1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 0,
+  // UTF8 continuation byte range.
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  // UTF8 lead byte range.
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+};
+
+// Context lookup table for small signed integers.
+static const uint8_t kSigned3BitContextLookup[] = {
+  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7,
+};
+
+enum ContextType {
+  CONTEXT_LSB6         = 0,
+  CONTEXT_MSB6         = 1,
+  CONTEXT_UTF8         = 2,
+  CONTEXT_SIGNED       = 3
+};
+
+static inline uint8_t Context(uint8_t p1, uint8_t p2, ContextType mode) {
+  switch (mode) {
+    case CONTEXT_LSB6:
+      return p1 & 0x3f;
+    case CONTEXT_MSB6:
+      return static_cast<uint8_t>(p1 >> 2);
+    case CONTEXT_UTF8:
+      return kUTF8ContextLookup[p1] | kUTF8ContextLookup[p2 + 256];
+    case CONTEXT_SIGNED:
+      return static_cast<uint8_t>((kSigned3BitContextLookup[p1] << 3) +
+                                  kSigned3BitContextLookup[p2]);
+    default:
+      return 0;
+  }
+}
+
+}  // namespace brotli
+
+#endif  // BROTLI_ENC_CONTEXT_H_
diff --git a/third_party/brotli/enc/dictionary.cc b/third_party/brotli/enc/dictionary.cc
new file mode 100644
index 0000000..0564bab6
--- /dev/null
+++ b/third_party/brotli/enc/dictionary.cc
@@ -0,0 +1,9466 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+#include "./dictionary.h"
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+
+// In case of multiple definition linker error with dictionary.c from the
+// decoder: include only one of enc/dictionary.cc or dec/dictionary.c in a
+// target using both enc and dec.
+const uint8_t kBrotliDictionary[122784] = {
+  0x74, 0x69, 0x6d, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x66, 0x65, 0x6c,
+  0x65, 0x66, 0x74, 0x62, 0x61, 0x63, 0x6b, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x61,
+  0x74, 0x61, 0x73, 0x68, 0x6f, 0x77, 0x6f, 0x6e, 0x6c, 0x79, 0x73, 0x69, 0x74,
+  0x65, 0x63, 0x69, 0x74, 0x79, 0x6f, 0x70, 0x65, 0x6e, 0x6a, 0x75, 0x73, 0x74,
+  0x6c, 0x69, 0x6b, 0x65, 0x66, 0x72, 0x65, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x74,
+  0x65, 0x78, 0x74, 0x79, 0x65, 0x61, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x62, 0x6f,
+  0x64, 0x79, 0x6c, 0x6f, 0x76, 0x65, 0x66, 0x6f, 0x72, 0x6d, 0x62, 0x6f, 0x6f,
+  0x6b, 0x70, 0x6c, 0x61, 0x79, 0x6c, 0x69, 0x76, 0x65, 0x6c, 0x69, 0x6e, 0x65,
+  0x68, 0x65, 0x6c, 0x70, 0x68, 0x6f, 0x6d, 0x65, 0x73, 0x69, 0x64, 0x65, 0x6d,
+  0x6f, 0x72, 0x65, 0x77, 0x6f, 0x72, 0x64, 0x6c, 0x6f, 0x6e, 0x67, 0x74, 0x68,
+  0x65, 0x6d, 0x76, 0x69, 0x65, 0x77, 0x66, 0x69, 0x6e, 0x64, 0x70, 0x61, 0x67,
+  0x65, 0x64, 0x61, 0x79, 0x73, 0x66, 0x75, 0x6c, 0x6c, 0x68, 0x65, 0x61, 0x64,
+  0x74, 0x65, 0x72, 0x6d, 0x65, 0x61, 0x63, 0x68, 0x61, 0x72, 0x65, 0x61, 0x66,
+  0x72, 0x6f, 0x6d, 0x74, 0x72, 0x75, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x62,
+  0x6c, 0x65, 0x75, 0x70, 0x6f, 0x6e, 0x68, 0x69, 0x67, 0x68, 0x64, 0x61, 0x74,
+  0x65, 0x6c, 0x61, 0x6e, 0x64, 0x6e, 0x65, 0x77, 0x73, 0x65, 0x76, 0x65, 0x6e,
+  0x6e, 0x65, 0x78, 0x74, 0x63, 0x61, 0x73, 0x65, 0x62, 0x6f, 0x74, 0x68, 0x70,
+  0x6f, 0x73, 0x74, 0x75, 0x73, 0x65, 0x64, 0x6d, 0x61, 0x64, 0x65, 0x68, 0x61,
+  0x6e, 0x64, 0x68, 0x65, 0x72, 0x65, 0x77, 0x68, 0x61, 0x74, 0x6e, 0x61, 0x6d,
+  0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x62, 0x6c, 0x6f, 0x67, 0x73, 0x69, 0x7a, 0x65,
+  0x62, 0x61, 0x73, 0x65, 0x68, 0x65, 0x6c, 0x64, 0x6d, 0x61, 0x6b, 0x65, 0x6d,
+  0x61, 0x69, 0x6e, 0x75, 0x73, 0x65, 0x72, 0x27, 0x29, 0x20, 0x2b, 0x68, 0x6f,
+  0x6c, 0x64, 0x65, 0x6e, 0x64, 0x73, 0x77, 0x69, 0x74, 0x68, 0x4e, 0x65, 0x77,
+  0x73, 0x72, 0x65, 0x61, 0x64, 0x77, 0x65, 0x72, 0x65, 0x73, 0x69, 0x67, 0x6e,
+  0x74, 0x61, 0x6b, 0x65, 0x68, 0x61, 0x76, 0x65, 0x67, 0x61, 0x6d, 0x65, 0x73,
+  0x65, 0x65, 0x6e, 0x63, 0x61, 0x6c, 0x6c, 0x70, 0x61, 0x74, 0x68, 0x77, 0x65,
+  0x6c, 0x6c, 0x70, 0x6c, 0x75, 0x73, 0x6d, 0x65, 0x6e, 0x75, 0x66, 0x69, 0x6c,
+  0x6d, 0x70, 0x61, 0x72, 0x74, 0x6a, 0x6f, 0x69, 0x6e, 0x74, 0x68, 0x69, 0x73,
+  0x6c, 0x69, 0x73, 0x74, 0x67, 0x6f, 0x6f, 0x64, 0x6e, 0x65, 0x65, 0x64, 0x77,
+  0x61, 0x79, 0x73, 0x77, 0x65, 0x73, 0x74, 0x6a, 0x6f, 0x62, 0x73, 0x6d, 0x69,
+  0x6e, 0x64, 0x61, 0x6c, 0x73, 0x6f, 0x6c, 0x6f, 0x67, 0x6f, 0x72, 0x69, 0x63,
+  0x68, 0x75, 0x73, 0x65, 0x73, 0x6c, 0x61, 0x73, 0x74, 0x74, 0x65, 0x61, 0x6d,
+  0x61, 0x72, 0x6d, 0x79, 0x66, 0x6f, 0x6f, 0x64, 0x6b, 0x69, 0x6e, 0x67, 0x77,
+  0x69, 0x6c, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x77, 0x61, 0x72, 0x64, 0x62, 0x65,
+  0x73, 0x74, 0x66, 0x69, 0x72, 0x65, 0x50, 0x61, 0x67, 0x65, 0x6b, 0x6e, 0x6f,
+  0x77, 0x61, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x6e, 0x67, 0x6d, 0x6f, 0x76, 0x65,
+  0x74, 0x68, 0x61, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x67, 0x69, 0x76, 0x65, 0x73,
+  0x65, 0x6c, 0x66, 0x6e, 0x6f, 0x74, 0x65, 0x6d, 0x75, 0x63, 0x68, 0x66, 0x65,
+  0x65, 0x64, 0x6d, 0x61, 0x6e, 0x79, 0x72, 0x6f, 0x63, 0x6b, 0x69, 0x63, 0x6f,
+  0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x6c, 0x6f, 0x6f, 0x6b, 0x68, 0x69, 0x64, 0x65,
+  0x64, 0x69, 0x65, 0x64, 0x48, 0x6f, 0x6d, 0x65, 0x72, 0x75, 0x6c, 0x65, 0x68,
+  0x6f, 0x73, 0x74, 0x61, 0x6a, 0x61, 0x78, 0x69, 0x6e, 0x66, 0x6f, 0x63, 0x6c,
+  0x75, 0x62, 0x6c, 0x61, 0x77, 0x73, 0x6c, 0x65, 0x73, 0x73, 0x68, 0x61, 0x6c,
+  0x66, 0x73, 0x6f, 0x6d, 0x65, 0x73, 0x75, 0x63, 0x68, 0x7a, 0x6f, 0x6e, 0x65,
+  0x31, 0x30, 0x30, 0x25, 0x6f, 0x6e, 0x65, 0x73, 0x63, 0x61, 0x72, 0x65, 0x54,
+  0x69, 0x6d, 0x65, 0x72, 0x61, 0x63, 0x65, 0x62, 0x6c, 0x75, 0x65, 0x66, 0x6f,
+  0x75, 0x72, 0x77, 0x65, 0x65, 0x6b, 0x66, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x70,
+  0x65, 0x67, 0x61, 0x76, 0x65, 0x68, 0x61, 0x72, 0x64, 0x6c, 0x6f, 0x73, 0x74,
+  0x77, 0x68, 0x65, 0x6e, 0x70, 0x61, 0x72, 0x6b, 0x6b, 0x65, 0x70, 0x74, 0x70,
+  0x61, 0x73, 0x73, 0x73, 0x68, 0x69, 0x70, 0x72, 0x6f, 0x6f, 0x6d, 0x48, 0x54,
+  0x4d, 0x4c, 0x70, 0x6c, 0x61, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x6f, 0x6e,
+  0x65, 0x73, 0x61, 0x76, 0x65, 0x6b, 0x65, 0x65, 0x70, 0x66, 0x6c, 0x61, 0x67,
+  0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x6f, 0x6c, 0x64, 0x66, 0x69, 0x76, 0x65, 0x74,
+  0x6f, 0x6f, 0x6b, 0x72, 0x61, 0x74, 0x65, 0x74, 0x6f, 0x77, 0x6e, 0x6a, 0x75,
+  0x6d, 0x70, 0x74, 0x68, 0x75, 0x73, 0x64, 0x61, 0x72, 0x6b, 0x63, 0x61, 0x72,
+  0x64, 0x66, 0x69, 0x6c, 0x65, 0x66, 0x65, 0x61, 0x72, 0x73, 0x74, 0x61, 0x79,
+  0x6b, 0x69, 0x6c, 0x6c, 0x74, 0x68, 0x61, 0x74, 0x66, 0x61, 0x6c, 0x6c, 0x61,
+  0x75, 0x74, 0x6f, 0x65, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x74, 0x61,
+  0x6c, 0x6b, 0x73, 0x68, 0x6f, 0x70, 0x76, 0x6f, 0x74, 0x65, 0x64, 0x65, 0x65,
+  0x70, 0x6d, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x73, 0x74, 0x74, 0x75, 0x72, 0x6e,
+  0x62, 0x6f, 0x72, 0x6e, 0x62, 0x61, 0x6e, 0x64, 0x66, 0x65, 0x6c, 0x6c, 0x72,
+  0x6f, 0x73, 0x65, 0x75, 0x72, 0x6c, 0x28, 0x73, 0x6b, 0x69, 0x6e, 0x72, 0x6f,
+  0x6c, 0x65, 0x63, 0x6f, 0x6d, 0x65, 0x61, 0x63, 0x74, 0x73, 0x61, 0x67, 0x65,
+  0x73, 0x6d, 0x65, 0x65, 0x74, 0x67, 0x6f, 0x6c, 0x64, 0x2e, 0x6a, 0x70, 0x67,
+  0x69, 0x74, 0x65, 0x6d, 0x76, 0x61, 0x72, 0x79, 0x66, 0x65, 0x6c, 0x74, 0x74,
+  0x68, 0x65, 0x6e, 0x73, 0x65, 0x6e, 0x64, 0x64, 0x72, 0x6f, 0x70, 0x56, 0x69,
+  0x65, 0x77, 0x63, 0x6f, 0x70, 0x79, 0x31, 0x2e, 0x30, 0x22, 0x3c, 0x2f, 0x61,
+  0x3e, 0x73, 0x74, 0x6f, 0x70, 0x65, 0x6c, 0x73, 0x65, 0x6c, 0x69, 0x65, 0x73,
+  0x74, 0x6f, 0x75, 0x72, 0x70, 0x61, 0x63, 0x6b, 0x2e, 0x67, 0x69, 0x66, 0x70,
+  0x61, 0x73, 0x74, 0x63, 0x73, 0x73, 0x3f, 0x67, 0x72, 0x61, 0x79, 0x6d, 0x65,
+  0x61, 0x6e, 0x26, 0x67, 0x74, 0x3b, 0x72, 0x69, 0x64, 0x65, 0x73, 0x68, 0x6f,
+  0x74, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x61, 0x69, 0x64, 0x72, 0x6f, 0x61, 0x64,
+  0x76, 0x61, 0x72, 0x20, 0x66, 0x65, 0x65, 0x6c, 0x6a, 0x6f, 0x68, 0x6e, 0x72,
+  0x69, 0x63, 0x6b, 0x70, 0x6f, 0x72, 0x74, 0x66, 0x61, 0x73, 0x74, 0x27, 0x55,
+  0x41, 0x2d, 0x64, 0x65, 0x61, 0x64, 0x3c, 0x2f, 0x62, 0x3e, 0x70, 0x6f, 0x6f,
+  0x72, 0x62, 0x69, 0x6c, 0x6c, 0x74, 0x79, 0x70, 0x65, 0x55, 0x2e, 0x53, 0x2e,
+  0x77, 0x6f, 0x6f, 0x64, 0x6d, 0x75, 0x73, 0x74, 0x32, 0x70, 0x78, 0x3b, 0x49,
+  0x6e, 0x66, 0x6f, 0x72, 0x61, 0x6e, 0x6b, 0x77, 0x69, 0x64, 0x65, 0x77, 0x61,
+  0x6e, 0x74, 0x77, 0x61, 0x6c, 0x6c, 0x6c, 0x65, 0x61, 0x64, 0x5b, 0x30, 0x5d,
+  0x3b, 0x70, 0x61, 0x75, 0x6c, 0x77, 0x61, 0x76, 0x65, 0x73, 0x75, 0x72, 0x65,
+  0x24, 0x28, 0x27, 0x23, 0x77, 0x61, 0x69, 0x74, 0x6d, 0x61, 0x73, 0x73, 0x61,
+  0x72, 0x6d, 0x73, 0x67, 0x6f, 0x65, 0x73, 0x67, 0x61, 0x69, 0x6e, 0x6c, 0x61,
+  0x6e, 0x67, 0x70, 0x61, 0x69, 0x64, 0x21, 0x2d, 0x2d, 0x20, 0x6c, 0x6f, 0x63,
+  0x6b, 0x75, 0x6e, 0x69, 0x74, 0x72, 0x6f, 0x6f, 0x74, 0x77, 0x61, 0x6c, 0x6b,
+  0x66, 0x69, 0x72, 0x6d, 0x77, 0x69, 0x66, 0x65, 0x78, 0x6d, 0x6c, 0x22, 0x73,
+  0x6f, 0x6e, 0x67, 0x74, 0x65, 0x73, 0x74, 0x32, 0x30, 0x70, 0x78, 0x6b, 0x69,
+  0x6e, 0x64, 0x72, 0x6f, 0x77, 0x73, 0x74, 0x6f, 0x6f, 0x6c, 0x66, 0x6f, 0x6e,
+  0x74, 0x6d, 0x61, 0x69, 0x6c, 0x73, 0x61, 0x66, 0x65, 0x73, 0x74, 0x61, 0x72,
+  0x6d, 0x61, 0x70, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x72, 0x61, 0x69, 0x6e, 0x66,
+  0x6c, 0x6f, 0x77, 0x62, 0x61, 0x62, 0x79, 0x73, 0x70, 0x61, 0x6e, 0x73, 0x61,
+  0x79, 0x73, 0x34, 0x70, 0x78, 0x3b, 0x36, 0x70, 0x78, 0x3b, 0x61, 0x72, 0x74,
+  0x73, 0x66, 0x6f, 0x6f, 0x74, 0x72, 0x65, 0x61, 0x6c, 0x77, 0x69, 0x6b, 0x69,
+  0x68, 0x65, 0x61, 0x74, 0x73, 0x74, 0x65, 0x70, 0x74, 0x72, 0x69, 0x70, 0x6f,
+  0x72, 0x67, 0x2f, 0x6c, 0x61, 0x6b, 0x65, 0x77, 0x65, 0x61, 0x6b, 0x74, 0x6f,
+  0x6c, 0x64, 0x46, 0x6f, 0x72, 0x6d, 0x63, 0x61, 0x73, 0x74, 0x66, 0x61, 0x6e,
+  0x73, 0x62, 0x61, 0x6e, 0x6b, 0x76, 0x65, 0x72, 0x79, 0x72, 0x75, 0x6e, 0x73,
+  0x6a, 0x75, 0x6c, 0x79, 0x74, 0x61, 0x73, 0x6b, 0x31, 0x70, 0x78, 0x3b, 0x67,
+  0x6f, 0x61, 0x6c, 0x67, 0x72, 0x65, 0x77, 0x73, 0x6c, 0x6f, 0x77, 0x65, 0x64,
+  0x67, 0x65, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x65, 0x74, 0x73, 0x35, 0x70, 0x78,
+  0x3b, 0x2e, 0x6a, 0x73, 0x3f, 0x34, 0x30, 0x70, 0x78, 0x69, 0x66, 0x20, 0x28,
+  0x73, 0x6f, 0x6f, 0x6e, 0x73, 0x65, 0x61, 0x74, 0x6e, 0x6f, 0x6e, 0x65, 0x74,
+  0x75, 0x62, 0x65, 0x7a, 0x65, 0x72, 0x6f, 0x73, 0x65, 0x6e, 0x74, 0x72, 0x65,
+  0x65, 0x64, 0x66, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x74, 0x6f, 0x67, 0x69, 0x66,
+  0x74, 0x68, 0x61, 0x72, 0x6d, 0x31, 0x38, 0x70, 0x78, 0x63, 0x61, 0x6d, 0x65,
+  0x68, 0x69, 0x6c, 0x6c, 0x62, 0x6f, 0x6c, 0x64, 0x7a, 0x6f, 0x6f, 0x6d, 0x76,
+  0x6f, 0x69, 0x64, 0x65, 0x61, 0x73, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x66, 0x69,
+  0x6c, 0x6c, 0x70, 0x65, 0x61, 0x6b, 0x69, 0x6e, 0x69, 0x74, 0x63, 0x6f, 0x73,
+  0x74, 0x33, 0x70, 0x78, 0x3b, 0x6a, 0x61, 0x63, 0x6b, 0x74, 0x61, 0x67, 0x73,
+  0x62, 0x69, 0x74, 0x73, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x69, 0x74, 0x6b,
+  0x6e, 0x65, 0x77, 0x6e, 0x65, 0x61, 0x72, 0x3c, 0x21, 0x2d, 0x2d, 0x67, 0x72,
+  0x6f, 0x77, 0x4a, 0x53, 0x4f, 0x4e, 0x64, 0x75, 0x74, 0x79, 0x4e, 0x61, 0x6d,
+  0x65, 0x73, 0x61, 0x6c, 0x65, 0x79, 0x6f, 0x75, 0x20, 0x6c, 0x6f, 0x74, 0x73,
+  0x70, 0x61, 0x69, 0x6e, 0x6a, 0x61, 0x7a, 0x7a, 0x63, 0x6f, 0x6c, 0x64, 0x65,
+  0x79, 0x65, 0x73, 0x66, 0x69, 0x73, 0x68, 0x77, 0x77, 0x77, 0x2e, 0x72, 0x69,
+  0x73, 0x6b, 0x74, 0x61, 0x62, 0x73, 0x70, 0x72, 0x65, 0x76, 0x31, 0x30, 0x70,
+  0x78, 0x72, 0x69, 0x73, 0x65, 0x32, 0x35, 0x70, 0x78, 0x42, 0x6c, 0x75, 0x65,
+  0x64, 0x69, 0x6e, 0x67, 0x33, 0x30, 0x30, 0x2c, 0x62, 0x61, 0x6c, 0x6c, 0x66,
+  0x6f, 0x72, 0x64, 0x65, 0x61, 0x72, 0x6e, 0x77, 0x69, 0x6c, 0x64, 0x62, 0x6f,
+  0x78, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x6c, 0x61, 0x63, 0x6b, 0x76, 0x65, 0x72,
+  0x73, 0x70, 0x61, 0x69, 0x72, 0x6a, 0x75, 0x6e, 0x65, 0x74, 0x65, 0x63, 0x68,
+  0x69, 0x66, 0x28, 0x21, 0x70, 0x69, 0x63, 0x6b, 0x65, 0x76, 0x69, 0x6c, 0x24,
+  0x28, 0x22, 0x23, 0x77, 0x61, 0x72, 0x6d, 0x6c, 0x6f, 0x72, 0x64, 0x64, 0x6f,
+  0x65, 0x73, 0x70, 0x75, 0x6c, 0x6c, 0x2c, 0x30, 0x30, 0x30, 0x69, 0x64, 0x65,
+  0x61, 0x64, 0x72, 0x61, 0x77, 0x68, 0x75, 0x67, 0x65, 0x73, 0x70, 0x6f, 0x74,
+  0x66, 0x75, 0x6e, 0x64, 0x62, 0x75, 0x72, 0x6e, 0x68, 0x72, 0x65, 0x66, 0x63,
+  0x65, 0x6c, 0x6c, 0x6b, 0x65, 0x79, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x68, 0x6f,
+  0x75, 0x72, 0x6c, 0x6f, 0x73, 0x73, 0x66, 0x75, 0x65, 0x6c, 0x31, 0x32, 0x70,
+  0x78, 0x73, 0x75, 0x69, 0x74, 0x64, 0x65, 0x61, 0x6c, 0x52, 0x53, 0x53, 0x22,
+  0x61, 0x67, 0x65, 0x64, 0x67, 0x72, 0x65, 0x79, 0x47, 0x45, 0x54, 0x22, 0x65,
+  0x61, 0x73, 0x65, 0x61, 0x69, 0x6d, 0x73, 0x67, 0x69, 0x72, 0x6c, 0x61, 0x69,
+  0x64, 0x73, 0x38, 0x70, 0x78, 0x3b, 0x6e, 0x61, 0x76, 0x79, 0x67, 0x72, 0x69,
+  0x64, 0x74, 0x69, 0x70, 0x73, 0x23, 0x39, 0x39, 0x39, 0x77, 0x61, 0x72, 0x73,
+  0x6c, 0x61, 0x64, 0x79, 0x63, 0x61, 0x72, 0x73, 0x29, 0x3b, 0x20, 0x7d, 0x70,
+  0x68, 0x70, 0x3f, 0x68, 0x65, 0x6c, 0x6c, 0x74, 0x61, 0x6c, 0x6c, 0x77, 0x68,
+  0x6f, 0x6d, 0x7a, 0x68, 0x3a, 0xe5, 0x2a, 0x2f, 0x0d, 0x0a, 0x20, 0x31, 0x30,
+  0x30, 0x68, 0x61, 0x6c, 0x6c, 0x2e, 0x0a, 0x0a, 0x41, 0x37, 0x70, 0x78, 0x3b,
+  0x70, 0x75, 0x73, 0x68, 0x63, 0x68, 0x61, 0x74, 0x30, 0x70, 0x78, 0x3b, 0x63,
+  0x72, 0x65, 0x77, 0x2a, 0x2f, 0x3c, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x37, 0x35,
+  0x70, 0x78, 0x66, 0x6c, 0x61, 0x74, 0x72, 0x61, 0x72, 0x65, 0x20, 0x26, 0x26,
+  0x20, 0x74, 0x65, 0x6c, 0x6c, 0x63, 0x61, 0x6d, 0x70, 0x6f, 0x6e, 0x74, 0x6f,
+  0x6c, 0x61, 0x69, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x73, 0x6b, 0x69, 0x70, 0x74,
+  0x65, 0x6e, 0x74, 0x66, 0x69, 0x6e, 0x65, 0x6d, 0x61, 0x6c, 0x65, 0x67, 0x65,
+  0x74, 0x73, 0x70, 0x6c, 0x6f, 0x74, 0x34, 0x30, 0x30, 0x2c, 0x0d, 0x0a, 0x0d,
+  0x0a, 0x63, 0x6f, 0x6f, 0x6c, 0x66, 0x65, 0x65, 0x74, 0x2e, 0x70, 0x68, 0x70,
+  0x3c, 0x62, 0x72, 0x3e, 0x65, 0x72, 0x69, 0x63, 0x6d, 0x6f, 0x73, 0x74, 0x67,
+  0x75, 0x69, 0x64, 0x62, 0x65, 0x6c, 0x6c, 0x64, 0x65, 0x73, 0x63, 0x68, 0x61,
+  0x69, 0x72, 0x6d, 0x61, 0x74, 0x68, 0x61, 0x74, 0x6f, 0x6d, 0x2f, 0x69, 0x6d,
+  0x67, 0x26, 0x23, 0x38, 0x32, 0x6c, 0x75, 0x63, 0x6b, 0x63, 0x65, 0x6e, 0x74,
+  0x30, 0x30, 0x30, 0x3b, 0x74, 0x69, 0x6e, 0x79, 0x67, 0x6f, 0x6e, 0x65, 0x68,
+  0x74, 0x6d, 0x6c, 0x73, 0x65, 0x6c, 0x6c, 0x64, 0x72, 0x75, 0x67, 0x46, 0x52,
+  0x45, 0x45, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x69, 0x63, 0x6b, 0x3f, 0x69, 0x64,
+  0x3d, 0x6c, 0x6f, 0x73, 0x65, 0x6e, 0x75, 0x6c, 0x6c, 0x76, 0x61, 0x73, 0x74,
+  0x77, 0x69, 0x6e, 0x64, 0x52, 0x53, 0x53, 0x20, 0x77, 0x65, 0x61, 0x72, 0x72,
+  0x65, 0x6c, 0x79, 0x62, 0x65, 0x65, 0x6e, 0x73, 0x61, 0x6d, 0x65, 0x64, 0x75,
+  0x6b, 0x65, 0x6e, 0x61, 0x73, 0x61, 0x63, 0x61, 0x70, 0x65, 0x77, 0x69, 0x73,
+  0x68, 0x67, 0x75, 0x6c, 0x66, 0x54, 0x32, 0x33, 0x3a, 0x68, 0x69, 0x74, 0x73,
+  0x73, 0x6c, 0x6f, 0x74, 0x67, 0x61, 0x74, 0x65, 0x6b, 0x69, 0x63, 0x6b, 0x62,
+  0x6c, 0x75, 0x72, 0x74, 0x68, 0x65, 0x79, 0x31, 0x35, 0x70, 0x78, 0x27, 0x27,
+  0x29, 0x3b, 0x29, 0x3b, 0x22, 0x3e, 0x6d, 0x73, 0x69, 0x65, 0x77, 0x69, 0x6e,
+  0x73, 0x62, 0x69, 0x72, 0x64, 0x73, 0x6f, 0x72, 0x74, 0x62, 0x65, 0x74, 0x61,
+  0x73, 0x65, 0x65, 0x6b, 0x54, 0x31, 0x38, 0x3a, 0x6f, 0x72, 0x64, 0x73, 0x74,
+  0x72, 0x65, 0x65, 0x6d, 0x61, 0x6c, 0x6c, 0x36, 0x30, 0x70, 0x78, 0x66, 0x61,
+  0x72, 0x6d, 0xe2, 0x80, 0x99, 0x73, 0x62, 0x6f, 0x79, 0x73, 0x5b, 0x30, 0x5d,
+  0x2e, 0x27, 0x29, 0x3b, 0x22, 0x50, 0x4f, 0x53, 0x54, 0x62, 0x65, 0x61, 0x72,
+  0x6b, 0x69, 0x64, 0x73, 0x29, 0x3b, 0x7d, 0x7d, 0x6d, 0x61, 0x72, 0x79, 0x74,
+  0x65, 0x6e, 0x64, 0x28, 0x55, 0x4b, 0x29, 0x71, 0x75, 0x61, 0x64, 0x7a, 0x68,
+  0x3a, 0xe6, 0x2d, 0x73, 0x69, 0x7a, 0x2d, 0x2d, 0x2d, 0x2d, 0x70, 0x72, 0x6f,
+  0x70, 0x27, 0x29, 0x3b, 0x0d, 0x6c, 0x69, 0x66, 0x74, 0x54, 0x31, 0x39, 0x3a,
+  0x76, 0x69, 0x63, 0x65, 0x61, 0x6e, 0x64, 0x79, 0x64, 0x65, 0x62, 0x74, 0x3e,
+  0x52, 0x53, 0x53, 0x70, 0x6f, 0x6f, 0x6c, 0x6e, 0x65, 0x63, 0x6b, 0x62, 0x6c,
+  0x6f, 0x77, 0x54, 0x31, 0x36, 0x3a, 0x64, 0x6f, 0x6f, 0x72, 0x65, 0x76, 0x61,
+  0x6c, 0x54, 0x31, 0x37, 0x3a, 0x6c, 0x65, 0x74, 0x73, 0x66, 0x61, 0x69, 0x6c,
+  0x6f, 0x72, 0x61, 0x6c, 0x70, 0x6f, 0x6c, 0x6c, 0x6e, 0x6f, 0x76, 0x61, 0x63,
+  0x6f, 0x6c, 0x73, 0x67, 0x65, 0x6e, 0x65, 0x20, 0xe2, 0x80, 0x94, 0x73, 0x6f,
+  0x66, 0x74, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x69, 0x6c, 0x6c, 0x72, 0x6f, 0x73,
+  0x73, 0x3c, 0x68, 0x33, 0x3e, 0x70, 0x6f, 0x75, 0x72, 0x66, 0x61, 0x64, 0x65,
+  0x70, 0x69, 0x6e, 0x6b, 0x3c, 0x74, 0x72, 0x3e, 0x6d, 0x69, 0x6e, 0x69, 0x29,
+  0x7c, 0x21, 0x28, 0x6d, 0x69, 0x6e, 0x65, 0x7a, 0x68, 0x3a, 0xe8, 0x62, 0x61,
+  0x72, 0x73, 0x68, 0x65, 0x61, 0x72, 0x30, 0x30, 0x29, 0x3b, 0x6d, 0x69, 0x6c,
+  0x6b, 0x20, 0x2d, 0x2d, 0x3e, 0x69, 0x72, 0x6f, 0x6e, 0x66, 0x72, 0x65, 0x64,
+  0x64, 0x69, 0x73, 0x6b, 0x77, 0x65, 0x6e, 0x74, 0x73, 0x6f, 0x69, 0x6c, 0x70,
+  0x75, 0x74, 0x73, 0x2f, 0x6a, 0x73, 0x2f, 0x68, 0x6f, 0x6c, 0x79, 0x54, 0x32,
+  0x32, 0x3a, 0x49, 0x53, 0x42, 0x4e, 0x54, 0x32, 0x30, 0x3a, 0x61, 0x64, 0x61,
+  0x6d, 0x73, 0x65, 0x65, 0x73, 0x3c, 0x68, 0x32, 0x3e, 0x6a, 0x73, 0x6f, 0x6e,
+  0x27, 0x2c, 0x20, 0x27, 0x63, 0x6f, 0x6e, 0x74, 0x54, 0x32, 0x31, 0x3a, 0x20,
+  0x52, 0x53, 0x53, 0x6c, 0x6f, 0x6f, 0x70, 0x61, 0x73, 0x69, 0x61, 0x6d, 0x6f,
+  0x6f, 0x6e, 0x3c, 0x2f, 0x70, 0x3e, 0x73, 0x6f, 0x75, 0x6c, 0x4c, 0x49, 0x4e,
+  0x45, 0x66, 0x6f, 0x72, 0x74, 0x63, 0x61, 0x72, 0x74, 0x54, 0x31, 0x34, 0x3a,
+  0x3c, 0x68, 0x31, 0x3e, 0x38, 0x30, 0x70, 0x78, 0x21, 0x2d, 0x2d, 0x3c, 0x39,
+  0x70, 0x78, 0x3b, 0x54, 0x30, 0x34, 0x3a, 0x6d, 0x69, 0x6b, 0x65, 0x3a, 0x34,
+  0x36, 0x5a, 0x6e, 0x69, 0x63, 0x65, 0x69, 0x6e, 0x63, 0x68, 0x59, 0x6f, 0x72,
+  0x6b, 0x72, 0x69, 0x63, 0x65, 0x7a, 0x68, 0x3a, 0xe4, 0x27, 0x29, 0x29, 0x3b,
+  0x70, 0x75, 0x72, 0x65, 0x6d, 0x61, 0x67, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74,
+  0x6f, 0x6e, 0x65, 0x62, 0x6f, 0x6e, 0x64, 0x3a, 0x33, 0x37, 0x5a, 0x5f, 0x6f,
+  0x66, 0x5f, 0x27, 0x5d, 0x29, 0x3b, 0x30, 0x30, 0x30, 0x2c, 0x7a, 0x68, 0x3a,
+  0xe7, 0x74, 0x61, 0x6e, 0x6b, 0x79, 0x61, 0x72, 0x64, 0x62, 0x6f, 0x77, 0x6c,
+  0x62, 0x75, 0x73, 0x68, 0x3a, 0x35, 0x36, 0x5a, 0x4a, 0x61, 0x76, 0x61, 0x33,
+  0x30, 0x70, 0x78, 0x0a, 0x7c, 0x7d, 0x0a, 0x25, 0x43, 0x33, 0x25, 0x3a, 0x33,
+  0x34, 0x5a, 0x6a, 0x65, 0x66, 0x66, 0x45, 0x58, 0x50, 0x49, 0x63, 0x61, 0x73,
+  0x68, 0x76, 0x69, 0x73, 0x61, 0x67, 0x6f, 0x6c, 0x66, 0x73, 0x6e, 0x6f, 0x77,
+  0x7a, 0x68, 0x3a, 0xe9, 0x71, 0x75, 0x65, 0x72, 0x2e, 0x63, 0x73, 0x73, 0x73,
+  0x69, 0x63, 0x6b, 0x6d, 0x65, 0x61, 0x74, 0x6d, 0x69, 0x6e, 0x2e, 0x62, 0x69,
+  0x6e, 0x64, 0x64, 0x65, 0x6c, 0x6c, 0x68, 0x69, 0x72, 0x65, 0x70, 0x69, 0x63,
+  0x73, 0x72, 0x65, 0x6e, 0x74, 0x3a, 0x33, 0x36, 0x5a, 0x48, 0x54, 0x54, 0x50,
+  0x2d, 0x32, 0x30, 0x31, 0x66, 0x6f, 0x74, 0x6f, 0x77, 0x6f, 0x6c, 0x66, 0x45,
+  0x4e, 0x44, 0x20, 0x78, 0x62, 0x6f, 0x78, 0x3a, 0x35, 0x34, 0x5a, 0x42, 0x4f,
+  0x44, 0x59, 0x64, 0x69, 0x63, 0x6b, 0x3b, 0x0a, 0x7d, 0x0a, 0x65, 0x78, 0x69,
+  0x74, 0x3a, 0x33, 0x35, 0x5a, 0x76, 0x61, 0x72, 0x73, 0x62, 0x65, 0x61, 0x74,
+  0x27, 0x7d, 0x29, 0x3b, 0x64, 0x69, 0x65, 0x74, 0x39, 0x39, 0x39, 0x3b, 0x61,
+  0x6e, 0x6e, 0x65, 0x7d, 0x7d, 0x3c, 0x2f, 0x5b, 0x69, 0x5d, 0x2e, 0x4c, 0x61,
+  0x6e, 0x67, 0x6b, 0x6d, 0xc2, 0xb2, 0x77, 0x69, 0x72, 0x65, 0x74, 0x6f, 0x79,
+  0x73, 0x61, 0x64, 0x64, 0x73, 0x73, 0x65, 0x61, 0x6c, 0x61, 0x6c, 0x65, 0x78,
+  0x3b, 0x0a, 0x09, 0x7d, 0x65, 0x63, 0x68, 0x6f, 0x6e, 0x69, 0x6e, 0x65, 0x2e,
+  0x6f, 0x72, 0x67, 0x30, 0x30, 0x35, 0x29, 0x74, 0x6f, 0x6e, 0x79, 0x6a, 0x65,
+  0x77, 0x73, 0x73, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x67, 0x73, 0x72, 0x6f, 0x6f,
+  0x66, 0x30, 0x30, 0x30, 0x29, 0x20, 0x32, 0x30, 0x30, 0x77, 0x69, 0x6e, 0x65,
+  0x67, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x67, 0x73, 0x62, 0x6f, 0x6f, 0x74, 0x67,
+  0x61, 0x72, 0x79, 0x63, 0x75, 0x74, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x74, 0x65,
+  0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x6d, 0x6c, 0x63, 0x6f, 0x63,
+  0x6b, 0x67, 0x61, 0x6e, 0x67, 0x24, 0x28, 0x27, 0x2e, 0x35, 0x30, 0x70, 0x78,
+  0x50, 0x68, 0x2e, 0x44, 0x6d, 0x69, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x6e, 0x6c,
+  0x6f, 0x61, 0x6e, 0x64, 0x65, 0x73, 0x6b, 0x6d, 0x69, 0x6c, 0x65, 0x72, 0x79,
+  0x61, 0x6e, 0x75, 0x6e, 0x69, 0x78, 0x64, 0x69, 0x73, 0x63, 0x29, 0x3b, 0x7d,
+  0x0a, 0x64, 0x75, 0x73, 0x74, 0x63, 0x6c, 0x69, 0x70, 0x29, 0x2e, 0x0a, 0x0a,
+  0x37, 0x30, 0x70, 0x78, 0x2d, 0x32, 0x30, 0x30, 0x44, 0x56, 0x44, 0x73, 0x37,
+  0x5d, 0x3e, 0x3c, 0x74, 0x61, 0x70, 0x65, 0x64, 0x65, 0x6d, 0x6f, 0x69, 0x2b,
+  0x2b, 0x29, 0x77, 0x61, 0x67, 0x65, 0x65, 0x75, 0x72, 0x6f, 0x70, 0x68, 0x69,
+  0x6c, 0x6f, 0x70, 0x74, 0x73, 0x68, 0x6f, 0x6c, 0x65, 0x46, 0x41, 0x51, 0x73,
+  0x61, 0x73, 0x69, 0x6e, 0x2d, 0x32, 0x36, 0x54, 0x6c, 0x61, 0x62, 0x73, 0x70,
+  0x65, 0x74, 0x73, 0x55, 0x52, 0x4c, 0x20, 0x62, 0x75, 0x6c, 0x6b, 0x63, 0x6f,
+  0x6f, 0x6b, 0x3b, 0x7d, 0x0d, 0x0a, 0x48, 0x45, 0x41, 0x44, 0x5b, 0x30, 0x5d,
+  0x29, 0x61, 0x62, 0x62, 0x72, 0x6a, 0x75, 0x61, 0x6e, 0x28, 0x31, 0x39, 0x38,
+  0x6c, 0x65, 0x73, 0x68, 0x74, 0x77, 0x69, 0x6e, 0x3c, 0x2f, 0x69, 0x3e, 0x73,
+  0x6f, 0x6e, 0x79, 0x67, 0x75, 0x79, 0x73, 0x66, 0x75, 0x63, 0x6b, 0x70, 0x69,
+  0x70, 0x65, 0x7c, 0x2d, 0x0a, 0x21, 0x30, 0x30, 0x32, 0x29, 0x6e, 0x64, 0x6f,
+  0x77, 0x5b, 0x31, 0x5d, 0x3b, 0x5b, 0x5d, 0x3b, 0x0a, 0x4c, 0x6f, 0x67, 0x20,
+  0x73, 0x61, 0x6c, 0x74, 0x0d, 0x0a, 0x09, 0x09, 0x62, 0x61, 0x6e, 0x67, 0x74,
+  0x72, 0x69, 0x6d, 0x62, 0x61, 0x74, 0x68, 0x29, 0x7b, 0x0d, 0x0a, 0x30, 0x30,
+  0x70, 0x78, 0x0a, 0x7d, 0x29, 0x3b, 0x6b, 0x6f, 0x3a, 0xec, 0x66, 0x65, 0x65,
+  0x73, 0x61, 0x64, 0x3e, 0x0d, 0x73, 0x3a, 0x2f, 0x2f, 0x20, 0x5b, 0x5d, 0x3b,
+  0x74, 0x6f, 0x6c, 0x6c, 0x70, 0x6c, 0x75, 0x67, 0x28, 0x29, 0x7b, 0x0a, 0x7b,
+  0x0d, 0x0a, 0x20, 0x2e, 0x6a, 0x73, 0x27, 0x32, 0x30, 0x30, 0x70, 0x64, 0x75,
+  0x61, 0x6c, 0x62, 0x6f, 0x61, 0x74, 0x2e, 0x4a, 0x50, 0x47, 0x29, 0x3b, 0x0a,
+  0x7d, 0x71, 0x75, 0x6f, 0x74, 0x29, 0x3b, 0x0a, 0x0a, 0x27, 0x29, 0x3b, 0x0a,
+  0x0d, 0x0a, 0x7d, 0x0d, 0x32, 0x30, 0x31, 0x34, 0x32, 0x30, 0x31, 0x35, 0x32,
+  0x30, 0x31, 0x36, 0x32, 0x30, 0x31, 0x37, 0x32, 0x30, 0x31, 0x38, 0x32, 0x30,
+  0x31, 0x39, 0x32, 0x30, 0x32, 0x30, 0x32, 0x30, 0x32, 0x31, 0x32, 0x30, 0x32,
+  0x32, 0x32, 0x30, 0x32, 0x33, 0x32, 0x30, 0x32, 0x34, 0x32, 0x30, 0x32, 0x35,
+  0x32, 0x30, 0x32, 0x36, 0x32, 0x30, 0x32, 0x37, 0x32, 0x30, 0x32, 0x38, 0x32,
+  0x30, 0x32, 0x39, 0x32, 0x30, 0x33, 0x30, 0x32, 0x30, 0x33, 0x31, 0x32, 0x30,
+  0x33, 0x32, 0x32, 0x30, 0x33, 0x33, 0x32, 0x30, 0x33, 0x34, 0x32, 0x30, 0x33,
+  0x35, 0x32, 0x30, 0x33, 0x36, 0x32, 0x30, 0x33, 0x37, 0x32, 0x30, 0x31, 0x33,
+  0x32, 0x30, 0x31, 0x32, 0x32, 0x30, 0x31, 0x31, 0x32, 0x30, 0x31, 0x30, 0x32,
+  0x30, 0x30, 0x39, 0x32, 0x30, 0x30, 0x38, 0x32, 0x30, 0x30, 0x37, 0x32, 0x30,
+  0x30, 0x36, 0x32, 0x30, 0x30, 0x35, 0x32, 0x30, 0x30, 0x34, 0x32, 0x30, 0x30,
+  0x33, 0x32, 0x30, 0x30, 0x32, 0x32, 0x30, 0x30, 0x31, 0x32, 0x30, 0x30, 0x30,
+  0x31, 0x39, 0x39, 0x39, 0x31, 0x39, 0x39, 0x38, 0x31, 0x39, 0x39, 0x37, 0x31,
+  0x39, 0x39, 0x36, 0x31, 0x39, 0x39, 0x35, 0x31, 0x39, 0x39, 0x34, 0x31, 0x39,
+  0x39, 0x33, 0x31, 0x39, 0x39, 0x32, 0x31, 0x39, 0x39, 0x31, 0x31, 0x39, 0x39,
+  0x30, 0x31, 0x39, 0x38, 0x39, 0x31, 0x39, 0x38, 0x38, 0x31, 0x39, 0x38, 0x37,
+  0x31, 0x39, 0x38, 0x36, 0x31, 0x39, 0x38, 0x35, 0x31, 0x39, 0x38, 0x34, 0x31,
+  0x39, 0x38, 0x33, 0x31, 0x39, 0x38, 0x32, 0x31, 0x39, 0x38, 0x31, 0x31, 0x39,
+  0x38, 0x30, 0x31, 0x39, 0x37, 0x39, 0x31, 0x39, 0x37, 0x38, 0x31, 0x39, 0x37,
+  0x37, 0x31, 0x39, 0x37, 0x36, 0x31, 0x39, 0x37, 0x35, 0x31, 0x39, 0x37, 0x34,
+  0x31, 0x39, 0x37, 0x33, 0x31, 0x39, 0x37, 0x32, 0x31, 0x39, 0x37, 0x31, 0x31,
+  0x39, 0x37, 0x30, 0x31, 0x39, 0x36, 0x39, 0x31, 0x39, 0x36, 0x38, 0x31, 0x39,
+  0x36, 0x37, 0x31, 0x39, 0x36, 0x36, 0x31, 0x39, 0x36, 0x35, 0x31, 0x39, 0x36,
+  0x34, 0x31, 0x39, 0x36, 0x33, 0x31, 0x39, 0x36, 0x32, 0x31, 0x39, 0x36, 0x31,
+  0x31, 0x39, 0x36, 0x30, 0x31, 0x39, 0x35, 0x39, 0x31, 0x39, 0x35, 0x38, 0x31,
+  0x39, 0x35, 0x37, 0x31, 0x39, 0x35, 0x36, 0x31, 0x39, 0x35, 0x35, 0x31, 0x39,
+  0x35, 0x34, 0x31, 0x39, 0x35, 0x33, 0x31, 0x39, 0x35, 0x32, 0x31, 0x39, 0x35,
+  0x31, 0x31, 0x39, 0x35, 0x30, 0x31, 0x30, 0x30, 0x30, 0x31, 0x30, 0x32, 0x34,
+  0x31, 0x33, 0x39, 0x34, 0x30, 0x30, 0x30, 0x30, 0x39, 0x39, 0x39, 0x39, 0x63,
+  0x6f, 0x6d, 0x6f, 0x6d, 0xc3, 0xa1, 0x73, 0x65, 0x73, 0x74, 0x65, 0x65, 0x73,
+  0x74, 0x61, 0x70, 0x65, 0x72, 0x6f, 0x74, 0x6f, 0x64, 0x6f, 0x68, 0x61, 0x63,
+  0x65, 0x63, 0x61, 0x64, 0x61, 0x61, 0xc3, 0xb1, 0x6f, 0x62, 0x69, 0x65, 0x6e,
+  0x64, 0xc3, 0xad, 0x61, 0x61, 0x73, 0xc3, 0xad, 0x76, 0x69, 0x64, 0x61, 0x63,
+  0x61, 0x73, 0x6f, 0x6f, 0x74, 0x72, 0x6f, 0x66, 0x6f, 0x72, 0x6f, 0x73, 0x6f,
+  0x6c, 0x6f, 0x6f, 0x74, 0x72, 0x61, 0x63, 0x75, 0x61, 0x6c, 0x64, 0x69, 0x6a,
+  0x6f, 0x73, 0x69, 0x64, 0x6f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x69, 0x70, 0x6f,
+  0x74, 0x65, 0x6d, 0x61, 0x64, 0x65, 0x62, 0x65, 0x61, 0x6c, 0x67, 0x6f, 0x71,
+  0x75, 0xc3, 0xa9, 0x65, 0x73, 0x74, 0x6f, 0x6e, 0x61, 0x64, 0x61, 0x74, 0x72,
+  0x65, 0x73, 0x70, 0x6f, 0x63, 0x6f, 0x63, 0x61, 0x73, 0x61, 0x62, 0x61, 0x6a,
+  0x6f, 0x74, 0x6f, 0x64, 0x61, 0x73, 0x69, 0x6e, 0x6f, 0x61, 0x67, 0x75, 0x61,
+  0x70, 0x75, 0x65, 0x73, 0x75, 0x6e, 0x6f, 0x73, 0x61, 0x6e, 0x74, 0x65, 0x64,
+  0x69, 0x63, 0x65, 0x6c, 0x75, 0x69, 0x73, 0x65, 0x6c, 0x6c, 0x61, 0x6d, 0x61,
+  0x79, 0x6f, 0x7a, 0x6f, 0x6e, 0x61, 0x61, 0x6d, 0x6f, 0x72, 0x70, 0x69, 0x73,
+  0x6f, 0x6f, 0x62, 0x72, 0x61, 0x63, 0x6c, 0x69, 0x63, 0x65, 0x6c, 0x6c, 0x6f,
+  0x64, 0x69, 0x6f, 0x73, 0x68, 0x6f, 0x72, 0x61, 0x63, 0x61, 0x73, 0x69, 0xd0,
+  0xb7, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xb0, 0xd0, 0xbe, 0xd0, 0xbc, 0xd1, 0x80,
+  0xd0, 0xb0, 0xd1, 0x80, 0xd1, 0x83, 0xd1, 0x82, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0,
+  0xb5, 0xd0, 0xbf, 0xd0, 0xbe, 0xd0, 0xbe, 0xd1, 0x82, 0xd0, 0xb8, 0xd0, 0xb7,
+  0xd0, 0xbd, 0xd0, 0xbe, 0xd0, 0xb4, 0xd0, 0xbe, 0xd1, 0x82, 0xd0, 0xbe, 0xd0,
+  0xb6, 0xd0, 0xb5, 0xd0, 0xbe, 0xd0, 0xbd, 0xd0, 0xb8, 0xd1, 0x85, 0xd0, 0x9d,
+  0xd0, 0xb0, 0xd0, 0xb5, 0xd0, 0xb5, 0xd0, 0xb1, 0xd1, 0x8b, 0xd0, 0xbc, 0xd1,
+  0x8b, 0xd0, 0x92, 0xd1, 0x8b, 0xd1, 0x81, 0xd0, 0xbe, 0xd0, 0xb2, 0xd1, 0x8b,
+  0xd0, 0xb2, 0xd0, 0xbe, 0xd0, 0x9d, 0xd0, 0xbe, 0xd0, 0xbe, 0xd0, 0xb1, 0xd0,
+  0x9f, 0xd0, 0xbe, 0xd0, 0xbb, 0xd0, 0xb8, 0xd0, 0xbd, 0xd0, 0xb8, 0xd0, 0xa0,
+  0xd0, 0xa4, 0xd0, 0x9d, 0xd0, 0xb5, 0xd0, 0x9c, 0xd1, 0x8b, 0xd1, 0x82, 0xd1,
+  0x8b, 0xd0, 0x9e, 0xd0, 0xbd, 0xd0, 0xb8, 0xd0, 0xbc, 0xd0, 0xb4, 0xd0, 0xb0,
+  0xd0, 0x97, 0xd0, 0xb0, 0xd0, 0x94, 0xd0, 0xb0, 0xd0, 0x9d, 0xd1, 0x83, 0xd0,
+  0x9e, 0xd0, 0xb1, 0xd1, 0x82, 0xd0, 0xb5, 0xd0, 0x98, 0xd0, 0xb7, 0xd0, 0xb5,
+  0xd0, 0xb9, 0xd0, 0xbd, 0xd1, 0x83, 0xd0, 0xbc, 0xd0, 0xbc, 0xd0, 0xa2, 0xd1,
+  0x8b, 0xd1, 0x83, 0xd0, 0xb6, 0xd9, 0x81, 0xd9, 0x8a, 0xd8, 0xa3, 0xd9, 0x86,
+  0xd9, 0x85, 0xd8, 0xa7, 0xd9, 0x85, 0xd8, 0xb9, 0xd9, 0x83, 0xd9, 0x84, 0xd8,
+  0xa3, 0xd9, 0x88, 0xd8, 0xb1, 0xd8, 0xaf, 0xd9, 0x8a, 0xd8, 0xa7, 0xd9, 0x81,
+  0xd9, 0x89, 0xd9, 0x87, 0xd9, 0x88, 0xd9, 0x84, 0xd9, 0x85, 0xd9, 0x84, 0xd9,
+  0x83, 0xd8, 0xa7, 0xd9, 0x88, 0xd9, 0x84, 0xd9, 0x87, 0xd8, 0xa8, 0xd8, 0xb3,
+  0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa5, 0xd9, 0x86, 0xd9, 0x87, 0xd9, 0x8a, 0xd8,
+  0xa3, 0xd9, 0x8a, 0xd9, 0x82, 0xd8, 0xaf, 0xd9, 0x87, 0xd9, 0x84, 0xd8, 0xab,
+  0xd9, 0x85, 0xd8, 0xa8, 0xd9, 0x87, 0xd9, 0x84, 0xd9, 0x88, 0xd9, 0x84, 0xd9,
+  0x8a, 0xd8, 0xa8, 0xd9, 0x84, 0xd8, 0xa7, 0xd9, 0x8a, 0xd8, 0xa8, 0xd9, 0x83,
+  0xd8, 0xb4, 0xd9, 0x8a, 0xd8, 0xa7, 0xd9, 0x85, 0xd8, 0xa3, 0xd9, 0x85, 0xd9,
+  0x86, 0xd8, 0xaa, 0xd8, 0xa8, 0xd9, 0x8a, 0xd9, 0x84, 0xd9, 0x86, 0xd8, 0xad,
+  0xd8, 0xa8, 0xd9, 0x87, 0xd9, 0x85, 0xd9, 0x85, 0xd8, 0xb4, 0xd9, 0x88, 0xd8,
+  0xb4, 0x66, 0x69, 0x72, 0x73, 0x74, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x6c, 0x69,
+  0x67, 0x68, 0x74, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x6d, 0x65, 0x64, 0x69, 0x61,
+  0x77, 0x68, 0x69, 0x74, 0x65, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x62, 0x6c, 0x61,
+  0x63, 0x6b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x62,
+  0x6f, 0x6f, 0x6b, 0x73, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x75, 0x73, 0x69,
+  0x63, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x70, 0x6f,
+  0x69, 0x6e, 0x74, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x6c, 0x65, 0x76, 0x65, 0x6c,
+  0x74, 0x61, 0x62, 0x6c, 0x65, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x68, 0x6f, 0x75,
+  0x73, 0x65, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x79,
+  0x65, 0x61, 0x72, 0x73, 0x73, 0x74, 0x61, 0x74, 0x65, 0x74, 0x6f, 0x64, 0x61,
+  0x79, 0x77, 0x61, 0x74, 0x65, 0x72, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x74,
+  0x79, 0x6c, 0x65, 0x64, 0x65, 0x61, 0x74, 0x68, 0x70, 0x6f, 0x77, 0x65, 0x72,
+  0x70, 0x68, 0x6f, 0x6e, 0x65, 0x6e, 0x69, 0x67, 0x68, 0x74, 0x65, 0x72, 0x72,
+  0x6f, 0x72, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x74,
+  0x65, 0x72, 0x6d, 0x73, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x74, 0x6f, 0x6f, 0x6c,
+  0x73, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x74, 0x69,
+  0x6d, 0x65, 0x73, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x77, 0x6f, 0x72, 0x64, 0x73,
+  0x67, 0x61, 0x6d, 0x65, 0x73, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x73, 0x70, 0x61,
+  0x63, 0x65, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x6d,
+  0x6f, 0x64, 0x65, 0x6c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x67, 0x75, 0x69, 0x64,
+  0x65, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x77, 0x6f,
+  0x6d, 0x65, 0x6e, 0x61, 0x67, 0x61, 0x69, 0x6e, 0x6d, 0x6f, 0x6e, 0x65, 0x79,
+  0x69, 0x6d, 0x61, 0x67, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x79, 0x6f, 0x75,
+  0x6e, 0x67, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x63,
+  0x6f, 0x6c, 0x6f, 0x72, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x66, 0x72, 0x6f, 0x6e,
+  0x74, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x77, 0x61, 0x74, 0x63, 0x68, 0x66, 0x6f,
+  0x72, 0x63, 0x65, 0x70, 0x72, 0x69, 0x63, 0x65, 0x72, 0x75, 0x6c, 0x65, 0x73,
+  0x62, 0x65, 0x67, 0x69, 0x6e, 0x61, 0x66, 0x74, 0x65, 0x72, 0x76, 0x69, 0x73,
+  0x69, 0x74, 0x69, 0x73, 0x73, 0x75, 0x65, 0x61, 0x72, 0x65, 0x61, 0x73, 0x62,
+  0x65, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x74, 0x6f, 0x74, 0x61,
+  0x6c, 0x68, 0x6f, 0x75, 0x72, 0x73, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x70, 0x72,
+  0x69, 0x6e, 0x74, 0x70, 0x72, 0x65, 0x73, 0x73, 0x62, 0x75, 0x69, 0x6c, 0x74,
+  0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x73, 0x70, 0x65, 0x65, 0x64, 0x73, 0x74, 0x75,
+  0x64, 0x79, 0x74, 0x72, 0x61, 0x64, 0x65, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x73,
+  0x65, 0x6e, 0x73, 0x65, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x68, 0x6f, 0x77,
+  0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x61, 0x64,
+  0x64, 0x65, 0x64, 0x73, 0x74, 0x69, 0x6c, 0x6c, 0x6d, 0x6f, 0x76, 0x65, 0x64,
+  0x74, 0x61, 0x6b, 0x65, 0x6e, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x66, 0x6c, 0x61,
+  0x73, 0x68, 0x66, 0x69, 0x78, 0x65, 0x64, 0x6f, 0x66, 0x74, 0x65, 0x6e, 0x6f,
+  0x74, 0x68, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x73, 0x63, 0x68, 0x65, 0x63,
+  0x6b, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x72, 0x69, 0x76, 0x65, 0x72, 0x69, 0x74,
+  0x65, 0x6d, 0x73, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x73, 0x68, 0x61, 0x70, 0x65,
+  0x68, 0x75, 0x6d, 0x61, 0x6e, 0x65, 0x78, 0x69, 0x73, 0x74, 0x67, 0x6f, 0x69,
+  0x6e, 0x67, 0x6d, 0x6f, 0x76, 0x69, 0x65, 0x74, 0x68, 0x69, 0x72, 0x64, 0x62,
+  0x61, 0x73, 0x69, 0x63, 0x70, 0x65, 0x61, 0x63, 0x65, 0x73, 0x74, 0x61, 0x67,
+  0x65, 0x77, 0x69, 0x64, 0x74, 0x68, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x69, 0x64,
+  0x65, 0x61, 0x73, 0x77, 0x72, 0x6f, 0x74, 0x65, 0x70, 0x61, 0x67, 0x65, 0x73,
+  0x75, 0x73, 0x65, 0x72, 0x73, 0x64, 0x72, 0x69, 0x76, 0x65, 0x73, 0x74, 0x6f,
+  0x72, 0x65, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x76,
+  0x6f, 0x69, 0x63, 0x65, 0x73, 0x69, 0x74, 0x65, 0x73, 0x6d, 0x6f, 0x6e, 0x74,
+  0x68, 0x77, 0x68, 0x65, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x77, 0x68,
+  0x69, 0x63, 0x68, 0x65, 0x61, 0x72, 0x74, 0x68, 0x66, 0x6f, 0x72, 0x75, 0x6d,
+  0x74, 0x68, 0x72, 0x65, 0x65, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x70, 0x61, 0x72,
+  0x74, 0x79, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x6c,
+  0x69, 0x76, 0x65, 0x73, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x6c, 0x61, 0x79, 0x65,
+  0x72, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x75, 0x73,
+  0x61, 0x67, 0x65, 0x73, 0x6f, 0x75, 0x6e, 0x64, 0x63, 0x6f, 0x75, 0x72, 0x74,
+  0x79, 0x6f, 0x75, 0x72, 0x20, 0x62, 0x69, 0x72, 0x74, 0x68, 0x70, 0x6f, 0x70,
+  0x75, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x49,
+  0x6d, 0x61, 0x67, 0x65, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x75, 0x70, 0x70, 0x65,
+  0x72, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x65, 0x76, 0x65, 0x72, 0x79, 0x73, 0x68,
+  0x6f, 0x77, 0x73, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x65, 0x78, 0x74, 0x72, 0x61,
+  0x6d, 0x61, 0x74, 0x63, 0x68, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x6b, 0x6e, 0x6f,
+  0x77, 0x6e, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x62, 0x65, 0x67, 0x61, 0x6e, 0x73,
+  0x75, 0x70, 0x65, 0x72, 0x70, 0x61, 0x70, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x74,
+  0x68, 0x6c, 0x65, 0x61, 0x72, 0x6e, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x6e, 0x61,
+  0x6d, 0x65, 0x64, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x54, 0x65, 0x72, 0x6d, 0x73,
+  0x70, 0x61, 0x72, 0x74, 0x73, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x62, 0x72, 0x61,
+  0x6e, 0x64, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x77, 0x6f, 0x6d, 0x61, 0x6e, 0x66,
+  0x61, 0x6c, 0x73, 0x65, 0x72, 0x65, 0x61, 0x64, 0x79, 0x61, 0x75, 0x64, 0x69,
+  0x6f, 0x74, 0x61, 0x6b, 0x65, 0x73, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x2e, 0x63,
+  0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x76, 0x65, 0x64, 0x63, 0x61, 0x73, 0x65, 0x73,
+  0x64, 0x61, 0x69, 0x6c, 0x79, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x67, 0x72, 0x65,
+  0x61, 0x74, 0x6a, 0x75, 0x64, 0x67, 0x65, 0x74, 0x68, 0x6f, 0x73, 0x65, 0x75,
+  0x6e, 0x69, 0x74, 0x73, 0x6e, 0x65, 0x76, 0x65, 0x72, 0x62, 0x72, 0x6f, 0x61,
+  0x64, 0x63, 0x6f, 0x61, 0x73, 0x74, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x70,
+  0x70, 0x6c, 0x65, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x63, 0x79, 0x63, 0x6c, 0x65,
+  0x73, 0x63, 0x65, 0x6e, 0x65, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x63, 0x6c, 0x69,
+  0x63, 0x6b, 0x77, 0x72, 0x69, 0x74, 0x65, 0x71, 0x75, 0x65, 0x65, 0x6e, 0x70,
+  0x69, 0x65, 0x63, 0x65, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x66, 0x72, 0x61, 0x6d,
+  0x65, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x6c, 0x69,
+  0x6d, 0x69, 0x74, 0x63, 0x61, 0x63, 0x68, 0x65, 0x63, 0x69, 0x76, 0x69, 0x6c,
+  0x73, 0x63, 0x61, 0x6c, 0x65, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x74, 0x68, 0x65,
+  0x6d, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x62,
+  0x6f, 0x75, 0x6e, 0x64, 0x72, 0x6f, 0x79, 0x61, 0x6c, 0x61, 0x73, 0x6b, 0x65,
+  0x64, 0x77, 0x68, 0x6f, 0x6c, 0x65, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x73, 0x74,
+  0x6f, 0x63, 0x6b, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x66, 0x61, 0x69, 0x74, 0x68,
+  0x68, 0x65, 0x61, 0x72, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x6f, 0x66, 0x66,
+  0x65, 0x72, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x6f, 0x77, 0x6e, 0x65, 0x64, 0x6d,
+  0x69, 0x67, 0x68, 0x74, 0x61, 0x6c, 0x62, 0x75, 0x6d, 0x74, 0x68, 0x69, 0x6e,
+  0x6b, 0x62, 0x6c, 0x6f, 0x6f, 0x64, 0x61, 0x72, 0x72, 0x61, 0x79, 0x6d, 0x61,
+  0x6a, 0x6f, 0x72, 0x74, 0x72, 0x75, 0x73, 0x74, 0x63, 0x61, 0x6e, 0x6f, 0x6e,
+  0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x76, 0x61, 0x6c,
+  0x69, 0x64, 0x73, 0x74, 0x6f, 0x6e, 0x65, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x4c,
+  0x6f, 0x67, 0x69, 0x6e, 0x68, 0x61, 0x70, 0x70, 0x79, 0x6f, 0x63, 0x63, 0x75,
+  0x72, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x66, 0x72, 0x65, 0x73, 0x68, 0x71, 0x75,
+  0x69, 0x74, 0x65, 0x66, 0x69, 0x6c, 0x6d, 0x73, 0x67, 0x72, 0x61, 0x64, 0x65,
+  0x6e, 0x65, 0x65, 0x64, 0x73, 0x75, 0x72, 0x62, 0x61, 0x6e, 0x66, 0x69, 0x67,
+  0x68, 0x74, 0x62, 0x61, 0x73, 0x69, 0x73, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x61,
+  0x75, 0x74, 0x6f, 0x3b, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x68, 0x74, 0x6d,
+  0x6c, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x59, 0x6f,
+  0x75, 0x72, 0x20, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x74, 0x6f, 0x70, 0x69, 0x63,
+  0x62, 0x72, 0x6f, 0x77, 0x6e, 0x61, 0x6c, 0x6f, 0x6e, 0x65, 0x64, 0x72, 0x61,
+  0x77, 0x6e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x72, 0x65, 0x61, 0x63, 0x68, 0x52,
+  0x69, 0x67, 0x68, 0x74, 0x64, 0x61, 0x74, 0x65, 0x73, 0x6d, 0x61, 0x72, 0x63,
+  0x68, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x67, 0x6f, 0x6f, 0x64, 0x73, 0x4c, 0x69,
+  0x6e, 0x6b, 0x73, 0x64, 0x6f, 0x75, 0x62, 0x74, 0x61, 0x73, 0x79, 0x6e, 0x63,
+  0x74, 0x68, 0x75, 0x6d, 0x62, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x63, 0x68, 0x69,
+  0x65, 0x66, 0x79, 0x6f, 0x75, 0x74, 0x68, 0x6e, 0x6f, 0x76, 0x65, 0x6c, 0x31,
+  0x30, 0x70, 0x78, 0x3b, 0x73, 0x65, 0x72, 0x76, 0x65, 0x75, 0x6e, 0x74, 0x69,
+  0x6c, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x70,
+  0x61, 0x63, 0x65, 0x71, 0x75, 0x65, 0x72, 0x79, 0x6a, 0x61, 0x6d, 0x65, 0x73,
+  0x65, 0x71, 0x75, 0x61, 0x6c, 0x74, 0x77, 0x69, 0x63, 0x65, 0x30, 0x2c, 0x30,
+  0x30, 0x30, 0x53, 0x74, 0x61, 0x72, 0x74, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x73,
+  0x6f, 0x6e, 0x67, 0x73, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x69, 0x67, 0x68,
+  0x74, 0x73, 0x68, 0x69, 0x66, 0x74, 0x77, 0x6f, 0x72, 0x74, 0x68, 0x70, 0x6f,
+  0x73, 0x74, 0x73, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x77, 0x65, 0x65, 0x6b, 0x73,
+  0x61, 0x76, 0x6f, 0x69, 0x64, 0x74, 0x68, 0x65, 0x73, 0x65, 0x6d, 0x69, 0x6c,
+  0x65, 0x73, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x73, 0x6d, 0x61, 0x72, 0x74, 0x61,
+  0x6c, 0x70, 0x68, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x6d, 0x61, 0x72, 0x6b,
+  0x73, 0x72, 0x61, 0x74, 0x65, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x73, 0x63, 0x6c,
+  0x61, 0x69, 0x6d, 0x73, 0x61, 0x6c, 0x65, 0x73, 0x74, 0x65, 0x78, 0x74, 0x73,
+  0x73, 0x74, 0x61, 0x72, 0x73, 0x77, 0x72, 0x6f, 0x6e, 0x67, 0x3c, 0x2f, 0x68,
+  0x33, 0x3e, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6d,
+  0x75, 0x6c, 0x74, 0x69, 0x68, 0x65, 0x61, 0x72, 0x64, 0x50, 0x6f, 0x77, 0x65,
+  0x72, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x6f,
+  0x6c, 0x69, 0x64, 0x28, 0x74, 0x68, 0x69, 0x73, 0x62, 0x72, 0x69, 0x6e, 0x67,
+  0x73, 0x68, 0x69, 0x70, 0x73, 0x73, 0x74, 0x61, 0x66, 0x66, 0x74, 0x72, 0x69,
+  0x65, 0x64, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x66,
+  0x61, 0x63, 0x74, 0x73, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x68, 0x69, 0x73,
+  0x20, 0x2f, 0x2f, 0x2d, 0x2d, 0x3e, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x65, 0x67,
+  0x79, 0x70, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x31, 0x35, 0x70, 0x78, 0x3b,
+  0x45, 0x6d, 0x61, 0x69, 0x6c, 0x74, 0x72, 0x75, 0x65, 0x22, 0x63, 0x72, 0x6f,
+  0x73, 0x73, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x62, 0x6c, 0x6f, 0x67, 0x73, 0x62,
+  0x6f, 0x78, 0x22, 0x3e, 0x6e, 0x6f, 0x74, 0x65, 0x64, 0x6c, 0x65, 0x61, 0x76,
+  0x65, 0x63, 0x68, 0x69, 0x6e, 0x61, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x67, 0x75,
+  0x65, 0x73, 0x74, 0x3c, 0x2f, 0x68, 0x34, 0x3e, 0x72, 0x6f, 0x62, 0x6f, 0x74,
+  0x68, 0x65, 0x61, 0x76, 0x79, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x73, 0x65, 0x76,
+  0x65, 0x6e, 0x67, 0x72, 0x61, 0x6e, 0x64, 0x63, 0x72, 0x69, 0x6d, 0x65, 0x73,
+  0x69, 0x67, 0x6e, 0x73, 0x61, 0x77, 0x61, 0x72, 0x65, 0x64, 0x61, 0x6e, 0x63,
+  0x65, 0x70, 0x68, 0x61, 0x73, 0x65, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x65, 0x6e,
+  0x5f, 0x55, 0x53, 0x26, 0x23, 0x33, 0x39, 0x3b, 0x32, 0x30, 0x30, 0x70, 0x78,
+  0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x65, 0x6e, 0x6a,
+  0x6f, 0x79, 0x61, 0x6a, 0x61, 0x78, 0x2e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+  0x6d, 0x69, 0x74, 0x68, 0x55, 0x2e, 0x53, 0x2e, 0x20, 0x68, 0x6f, 0x6c, 0x64,
+  0x73, 0x70, 0x65, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61,
+  0x76, 0x22, 0x3e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x63, 0x6f, 0x72, 0x65,
+  0x63, 0x6f, 0x6d, 0x65, 0x73, 0x64, 0x6f, 0x69, 0x6e, 0x67, 0x70, 0x72, 0x69,
+  0x6f, 0x72, 0x53, 0x68, 0x61, 0x72, 0x65, 0x31, 0x39, 0x39, 0x30, 0x73, 0x72,
+  0x6f, 0x6d, 0x61, 0x6e, 0x6c, 0x69, 0x73, 0x74, 0x73, 0x6a, 0x61, 0x70, 0x61,
+  0x6e, 0x66, 0x61, 0x6c, 0x6c, 0x73, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x6f, 0x77,
+  0x6e, 0x65, 0x72, 0x61, 0x67, 0x72, 0x65, 0x65, 0x3c, 0x2f, 0x68, 0x32, 0x3e,
+  0x61, 0x62, 0x75, 0x73, 0x65, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x6f, 0x70, 0x65,
+  0x72, 0x61, 0x22, 0x2d, 0x2f, 0x2f, 0x57, 0x63, 0x61, 0x72, 0x64, 0x73, 0x68,
+  0x69, 0x6c, 0x6c, 0x73, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x50, 0x68, 0x6f, 0x74,
+  0x6f, 0x74, 0x72, 0x75, 0x74, 0x68, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x2e, 0x70,
+  0x68, 0x70, 0x3f, 0x73, 0x61, 0x69, 0x6e, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x6c,
+  0x6c, 0x6f, 0x75, 0x69, 0x73, 0x6d, 0x65, 0x61, 0x6e, 0x74, 0x70, 0x72, 0x6f,
+  0x6f, 0x66, 0x62, 0x72, 0x69, 0x65, 0x66, 0x72, 0x6f, 0x77, 0x22, 0x3e, 0x67,
+  0x65, 0x6e, 0x72, 0x65, 0x74, 0x72, 0x75, 0x63, 0x6b, 0x6c, 0x6f, 0x6f, 0x6b,
+  0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x2e, 0x6e,
+  0x65, 0x74, 0x2f, 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, 0x74, 0x72, 0x79, 0x20, 0x7b,
+  0x0a, 0x76, 0x61, 0x72, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x73, 0x63, 0x6f, 0x73,
+  0x74, 0x73, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x61, 0x64, 0x75, 0x6c, 0x74, 0x71,
+  0x75, 0x65, 0x73, 0x74, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x6c, 0x61, 0x62, 0x6f,
+  0x72, 0x68, 0x65, 0x6c, 0x70, 0x73, 0x63, 0x61, 0x75, 0x73, 0x65, 0x6d, 0x61,
+  0x67, 0x69, 0x63, 0x6d, 0x6f, 0x74, 0x6f, 0x72, 0x74, 0x68, 0x65, 0x69, 0x72,
+  0x32, 0x35, 0x30, 0x70, 0x78, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x73, 0x74, 0x65,
+  0x70, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x67,
+  0x6c, 0x61, 0x73, 0x73, 0x73, 0x69, 0x64, 0x65, 0x73, 0x66, 0x75, 0x6e, 0x64,
+  0x73, 0x68, 0x6f, 0x74, 0x65, 0x6c, 0x61, 0x77, 0x61, 0x72, 0x64, 0x6d, 0x6f,
+  0x75, 0x74, 0x68, 0x6d, 0x6f, 0x76, 0x65, 0x73, 0x70, 0x61, 0x72, 0x69, 0x73,
+  0x67, 0x69, 0x76, 0x65, 0x73, 0x64, 0x75, 0x74, 0x63, 0x68, 0x74, 0x65, 0x78,
+  0x61, 0x73, 0x66, 0x72, 0x75, 0x69, 0x74, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0x7c,
+  0x7c, 0x5b, 0x5d, 0x3b, 0x74, 0x6f, 0x70, 0x22, 0x3e, 0x0a, 0x3c, 0x21, 0x2d,
+  0x2d, 0x50, 0x4f, 0x53, 0x54, 0x22, 0x6f, 0x63, 0x65, 0x61, 0x6e, 0x3c, 0x62,
+  0x72, 0x2f, 0x3e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x73, 0x70, 0x65, 0x61, 0x6b,
+  0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x62, 0x61, 0x6e,
+  0x6b, 0x73, 0x63, 0x61, 0x74, 0x63, 0x68, 0x63, 0x68, 0x61, 0x72, 0x74, 0x32,
+  0x30, 0x70, 0x78, 0x3b, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x64, 0x65, 0x61, 0x6c,
+  0x73, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x35, 0x30, 0x70, 0x78, 0x3b, 0x75, 0x72,
+  0x6c, 0x3d, 0x22, 0x70, 0x61, 0x72, 0x6b, 0x73, 0x6d, 0x6f, 0x75, 0x73, 0x65,
+  0x4d, 0x6f, 0x73, 0x74, 0x20, 0x2e, 0x2e, 0x2e, 0x3c, 0x2f, 0x61, 0x6d, 0x6f,
+  0x6e, 0x67, 0x62, 0x72, 0x61, 0x69, 0x6e, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6e,
+  0x6f, 0x6e, 0x65, 0x3b, 0x62, 0x61, 0x73, 0x65, 0x64, 0x63, 0x61, 0x72, 0x72,
+  0x79, 0x64, 0x72, 0x61, 0x66, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x70, 0x61,
+  0x67, 0x65, 0x5f, 0x68, 0x6f, 0x6d, 0x65, 0x2e, 0x6d, 0x65, 0x74, 0x65, 0x72,
+  0x64, 0x65, 0x6c, 0x61, 0x79, 0x64, 0x72, 0x65, 0x61, 0x6d, 0x70, 0x72, 0x6f,
+  0x76, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x74, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x64,
+  0x72, 0x75, 0x67, 0x73, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x61, 0x70, 0x72, 0x69,
+  0x6c, 0x69, 0x64, 0x65, 0x61, 0x6c, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x65, 0x78,
+  0x61, 0x63, 0x74, 0x66, 0x6f, 0x72, 0x74, 0x68, 0x63, 0x6f, 0x64, 0x65, 0x73,
+  0x6c, 0x6f, 0x67, 0x69, 0x63, 0x56, 0x69, 0x65, 0x77, 0x20, 0x73, 0x65, 0x65,
+  0x6d, 0x73, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x20,
+  0x28, 0x32, 0x30, 0x30, 0x73, 0x61, 0x76, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x6e,
+  0x6b, 0x67, 0x6f, 0x61, 0x6c, 0x73, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x67, 0x72,
+  0x65, 0x65, 0x6b, 0x68, 0x6f, 0x6d, 0x65, 0x73, 0x72, 0x69, 0x6e, 0x67, 0x73,
+  0x72, 0x61, 0x74, 0x65, 0x64, 0x33, 0x30, 0x70, 0x78, 0x3b, 0x77, 0x68, 0x6f,
+  0x73, 0x65, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x29, 0x3b, 0x22, 0x20, 0x42,
+  0x6c, 0x6f, 0x63, 0x6b, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x6a, 0x6f, 0x6e, 0x65,
+  0x73, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x27, 0x29, 0x3b, 0x22, 0x3e, 0x29, 0x3b,
+  0x69, 0x66, 0x28, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x64, 0x61, 0x76, 0x69, 0x64,
+  0x68, 0x6f, 0x72, 0x73, 0x65, 0x46, 0x6f, 0x63, 0x75, 0x73, 0x72, 0x61, 0x69,
+  0x73, 0x65, 0x62, 0x6f, 0x78, 0x65, 0x73, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65,
+  0x6d, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x65, 0x6d, 0x3e, 0x62, 0x61, 0x72, 0x22,
+  0x3e, 0x2e, 0x73, 0x72, 0x63, 0x3d, 0x74, 0x6f, 0x77, 0x65, 0x72, 0x61, 0x6c,
+  0x74, 0x3d, 0x22, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x68, 0x65, 0x6e, 0x72, 0x79,
+  0x32, 0x34, 0x70, 0x78, 0x3b, 0x73, 0x65, 0x74, 0x75, 0x70, 0x69, 0x74, 0x61,
+  0x6c, 0x79, 0x73, 0x68, 0x61, 0x72, 0x70, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x74,
+  0x61, 0x73, 0x74, 0x65, 0x77, 0x61, 0x6e, 0x74, 0x73, 0x74, 0x68, 0x69, 0x73,
+  0x2e, 0x72, 0x65, 0x73, 0x65, 0x74, 0x77, 0x68, 0x65, 0x65, 0x6c, 0x67, 0x69,
+  0x72, 0x6c, 0x73, 0x2f, 0x63, 0x73, 0x73, 0x2f, 0x31, 0x30, 0x30, 0x25, 0x3b,
+  0x63, 0x6c, 0x75, 0x62, 0x73, 0x73, 0x74, 0x75, 0x66, 0x66, 0x62, 0x69, 0x62,
+  0x6c, 0x65, 0x76, 0x6f, 0x74, 0x65, 0x73, 0x20, 0x31, 0x30, 0x30, 0x30, 0x6b,
+  0x6f, 0x72, 0x65, 0x61, 0x7d, 0x29, 0x3b, 0x0d, 0x0a, 0x62, 0x61, 0x6e, 0x64,
+  0x73, 0x71, 0x75, 0x65, 0x75, 0x65, 0x3d, 0x20, 0x7b, 0x7d, 0x3b, 0x38, 0x30,
+  0x70, 0x78, 0x3b, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x7b, 0x0d, 0x0a, 0x09, 0x09,
+  0x61, 0x68, 0x65, 0x61, 0x64, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x72, 0x69,
+  0x73, 0x68, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x73,
+  0x74, 0x61, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x6d, 0x22, 0x79, 0x61, 0x68, 0x6f,
+  0x6f, 0x29, 0x5b, 0x30, 0x5d, 0x3b, 0x41, 0x62, 0x6f, 0x75, 0x74, 0x66, 0x69,
+  0x6e, 0x64, 0x73, 0x3c, 0x2f, 0x68, 0x31, 0x3e, 0x64, 0x65, 0x62, 0x75, 0x67,
+  0x74, 0x61, 0x73, 0x6b, 0x73, 0x55, 0x52, 0x4c, 0x20, 0x3d, 0x63, 0x65, 0x6c,
+  0x6c, 0x73, 0x7d, 0x29, 0x28, 0x29, 0x3b, 0x31, 0x32, 0x70, 0x78, 0x3b, 0x70,
+  0x72, 0x69, 0x6d, 0x65, 0x74, 0x65, 0x6c, 0x6c, 0x73, 0x74, 0x75, 0x72, 0x6e,
+  0x73, 0x30, 0x78, 0x36, 0x30, 0x30, 0x2e, 0x6a, 0x70, 0x67, 0x22, 0x73, 0x70,
+  0x61, 0x69, 0x6e, 0x62, 0x65, 0x61, 0x63, 0x68, 0x74, 0x61, 0x78, 0x65, 0x73,
+  0x6d, 0x69, 0x63, 0x72, 0x6f, 0x61, 0x6e, 0x67, 0x65, 0x6c, 0x2d, 0x2d, 0x3e,
+  0x3c, 0x2f, 0x67, 0x69, 0x66, 0x74, 0x73, 0x73, 0x74, 0x65, 0x76, 0x65, 0x2d,
+  0x6c, 0x69, 0x6e, 0x6b, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x7d, 0x29, 0x3b, 0x0a,
+  0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x28, 0x31, 0x39, 0x39, 0x46, 0x41,
+  0x51, 0x3c, 0x2f, 0x72, 0x6f, 0x67, 0x65, 0x72, 0x66, 0x72, 0x61, 0x6e, 0x6b,
+  0x43, 0x6c, 0x61, 0x73, 0x73, 0x32, 0x38, 0x70, 0x78, 0x3b, 0x66, 0x65, 0x65,
+  0x64, 0x73, 0x3c, 0x68, 0x31, 0x3e, 0x3c, 0x73, 0x63, 0x6f, 0x74, 0x74, 0x74,
+  0x65, 0x73, 0x74, 0x73, 0x32, 0x32, 0x70, 0x78, 0x3b, 0x64, 0x72, 0x69, 0x6e,
+  0x6b, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x6c, 0x65, 0x77, 0x69, 0x73, 0x73, 0x68,
+  0x61, 0x6c, 0x6c, 0x23, 0x30, 0x33, 0x39, 0x3b, 0x20, 0x66, 0x6f, 0x72, 0x20,
+  0x6c, 0x6f, 0x76, 0x65, 0x64, 0x77, 0x61, 0x73, 0x74, 0x65, 0x30, 0x30, 0x70,
+  0x78, 0x3b, 0x6a, 0x61, 0x3a, 0xe3, 0x82, 0x73, 0x69, 0x6d, 0x6f, 0x6e, 0x3c,
+  0x66, 0x6f, 0x6e, 0x74, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x6d, 0x65, 0x65, 0x74,
+  0x73, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x68, 0x65, 0x61, 0x70, 0x74, 0x69,
+  0x67, 0x68, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x64, 0x29, 0x20, 0x21, 0x3d, 0x20,
+  0x64, 0x72, 0x65, 0x73, 0x73, 0x63, 0x6c, 0x69, 0x70, 0x73, 0x72, 0x6f, 0x6f,
+  0x6d, 0x73, 0x6f, 0x6e, 0x6b, 0x65, 0x79, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x6d,
+  0x61, 0x69, 0x6e, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x70, 0x6c, 0x61, 0x74,
+  0x65, 0x66, 0x75, 0x6e, 0x6e, 0x79, 0x74, 0x72, 0x65, 0x65, 0x73, 0x63, 0x6f,
+  0x6d, 0x2f, 0x22, 0x31, 0x2e, 0x6a, 0x70, 0x67, 0x77, 0x6d, 0x6f, 0x64, 0x65,
+  0x70, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x54, 0x41, 0x52, 0x54, 0x6c, 0x65, 0x66,
+  0x74, 0x20, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x2c, 0x20, 0x32, 0x30, 0x31, 0x29,
+  0x3b, 0x0a, 0x7d, 0x0a, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x76, 0x69, 0x72, 0x75,
+  0x73, 0x63, 0x68, 0x61, 0x69, 0x72, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x77, 0x6f,
+  0x72, 0x73, 0x74, 0x50, 0x61, 0x67, 0x65, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e,
+  0x70, 0x61, 0x74, 0x63, 0x68, 0x3c, 0x21, 0x2d, 0x2d, 0x0a, 0x6f, 0x2d, 0x63,
+  0x61, 0x63, 0x66, 0x69, 0x72, 0x6d, 0x73, 0x74, 0x6f, 0x75, 0x72, 0x73, 0x2c,
+  0x30, 0x30, 0x30, 0x20, 0x61, 0x73, 0x69, 0x61, 0x6e, 0x69, 0x2b, 0x2b, 0x29,
+  0x7b, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x27, 0x29, 0x5b, 0x30, 0x5d, 0x69, 0x64,
+  0x3d, 0x31, 0x30, 0x62, 0x6f, 0x74, 0x68, 0x3b, 0x6d, 0x65, 0x6e, 0x75, 0x20,
+  0x2e, 0x32, 0x2e, 0x6d, 0x69, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x6b, 0x65, 0x76,
+  0x69, 0x6e, 0x63, 0x6f, 0x61, 0x63, 0x68, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x62,
+  0x72, 0x75, 0x63, 0x65, 0x32, 0x2e, 0x6a, 0x70, 0x67, 0x55, 0x52, 0x4c, 0x29,
+  0x2b, 0x2e, 0x6a, 0x70, 0x67, 0x7c, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x6c,
+  0x69, 0x63, 0x65, 0x68, 0x61, 0x72, 0x72, 0x79, 0x31, 0x32, 0x30, 0x22, 0x20,
+  0x73, 0x77, 0x65, 0x65, 0x74, 0x74, 0x72, 0x3e, 0x0d, 0x0a, 0x6e, 0x61, 0x6d,
+  0x65, 0x3d, 0x64, 0x69, 0x65, 0x67, 0x6f, 0x70, 0x61, 0x67, 0x65, 0x20, 0x73,
+  0x77, 0x69, 0x73, 0x73, 0x2d, 0x2d, 0x3e, 0x0a, 0x0a, 0x23, 0x66, 0x66, 0x66,
+  0x3b, 0x22, 0x3e, 0x4c, 0x6f, 0x67, 0x2e, 0x63, 0x6f, 0x6d, 0x22, 0x74, 0x72,
+  0x65, 0x61, 0x74, 0x73, 0x68, 0x65, 0x65, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20,
+  0x31, 0x34, 0x70, 0x78, 0x3b, 0x73, 0x6c, 0x65, 0x65, 0x70, 0x6e, 0x74, 0x65,
+  0x6e, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x64, 0x6a, 0x61, 0x3a, 0xe3, 0x83, 0x69,
+  0x64, 0x3d, 0x22, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x77, 0x6f, 0x72, 0x73,
+  0x65, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x2d, 0x62, 0x6f, 0x78, 0x2d, 0x64, 0x65,
+  0x6c, 0x74, 0x61, 0x0a, 0x26, 0x6c, 0x74, 0x3b, 0x62, 0x65, 0x61, 0x72, 0x73,
+  0x3a, 0x34, 0x38, 0x5a, 0x3c, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x72, 0x75, 0x72,
+  0x61, 0x6c, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x62,
+  0x61, 0x6b, 0x65, 0x72, 0x73, 0x68, 0x6f, 0x70, 0x73, 0x3d, 0x20, 0x22, 0x22,
+  0x3b, 0x70, 0x68, 0x70, 0x22, 0x3e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x33,
+  0x70, 0x78, 0x3b, 0x62, 0x72, 0x69, 0x61, 0x6e, 0x68, 0x65, 0x6c, 0x6c, 0x6f,
+  0x73, 0x69, 0x7a, 0x65, 0x3d, 0x6f, 0x3d, 0x25, 0x32, 0x46, 0x20, 0x6a, 0x6f,
+  0x69, 0x6e, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x69,
+  0x6d, 0x67, 0x22, 0x3e, 0x2c, 0x20, 0x66, 0x6a, 0x73, 0x69, 0x6d, 0x67, 0x22,
+  0x20, 0x22, 0x29, 0x5b, 0x30, 0x5d, 0x4d, 0x54, 0x6f, 0x70, 0x42, 0x54, 0x79,
+  0x70, 0x65, 0x22, 0x6e, 0x65, 0x77, 0x6c, 0x79, 0x44, 0x61, 0x6e, 0x73, 0x6b,
+  0x63, 0x7a, 0x65, 0x63, 0x68, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x6b, 0x6e, 0x6f,
+  0x77, 0x73, 0x3c, 0x2f, 0x68, 0x35, 0x3e, 0x66, 0x61, 0x71, 0x22, 0x3e, 0x7a,
+  0x68, 0x2d, 0x63, 0x6e, 0x31, 0x30, 0x29, 0x3b, 0x0a, 0x2d, 0x31, 0x22, 0x29,
+  0x3b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x62, 0x6c, 0x75, 0x65, 0x73, 0x74, 0x72,
+  0x75, 0x6c, 0x79, 0x64, 0x61, 0x76, 0x69, 0x73, 0x2e, 0x6a, 0x73, 0x27, 0x3b,
+  0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x73, 0x74, 0x65, 0x65, 0x6c, 0x20, 0x79, 0x6f,
+  0x75, 0x20, 0x68, 0x32, 0x3e, 0x0d, 0x0a, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6a,
+  0x65, 0x73, 0x75, 0x73, 0x31, 0x30, 0x30, 0x25, 0x20, 0x6d, 0x65, 0x6e, 0x75,
+  0x2e, 0x0d, 0x0a, 0x09, 0x0d, 0x0a, 0x77, 0x61, 0x6c, 0x65, 0x73, 0x72, 0x69,
+  0x73, 0x6b, 0x73, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x64, 0x64, 0x69, 0x6e, 0x67,
+  0x62, 0x2d, 0x6c, 0x69, 0x6b, 0x74, 0x65, 0x61, 0x63, 0x68, 0x67, 0x69, 0x66,
+  0x22, 0x20, 0x76, 0x65, 0x67, 0x61, 0x73, 0x64, 0x61, 0x6e, 0x73, 0x6b, 0x65,
+  0x65, 0x73, 0x74, 0x69, 0x73, 0x68, 0x71, 0x69, 0x70, 0x73, 0x75, 0x6f, 0x6d,
+  0x69, 0x73, 0x6f, 0x62, 0x72, 0x65, 0x64, 0x65, 0x73, 0x64, 0x65, 0x65, 0x6e,
+  0x74, 0x72, 0x65, 0x74, 0x6f, 0x64, 0x6f, 0x73, 0x70, 0x75, 0x65, 0x64, 0x65,
+  0x61, 0xc3, 0xb1, 0x6f, 0x73, 0x65, 0x73, 0x74, 0xc3, 0xa1, 0x74, 0x69, 0x65,
+  0x6e, 0x65, 0x68, 0x61, 0x73, 0x74, 0x61, 0x6f, 0x74, 0x72, 0x6f, 0x73, 0x70,
+  0x61, 0x72, 0x74, 0x65, 0x64, 0x6f, 0x6e, 0x64, 0x65, 0x6e, 0x75, 0x65, 0x76,
+  0x6f, 0x68, 0x61, 0x63, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6d, 0x69,
+  0x73, 0x6d, 0x6f, 0x6d, 0x65, 0x6a, 0x6f, 0x72, 0x6d, 0x75, 0x6e, 0x64, 0x6f,
+  0x61, 0x71, 0x75, 0xc3, 0xad, 0x64, 0xc3, 0xad, 0x61, 0x73, 0x73, 0xc3, 0xb3,
+  0x6c, 0x6f, 0x61, 0x79, 0x75, 0x64, 0x61, 0x66, 0x65, 0x63, 0x68, 0x61, 0x74,
+  0x6f, 0x64, 0x61, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x6f, 0x6d, 0x65, 0x6e, 0x6f,
+  0x73, 0x64, 0x61, 0x74, 0x6f, 0x73, 0x6f, 0x74, 0x72, 0x61, 0x73, 0x73, 0x69,
+  0x74, 0x69, 0x6f, 0x6d, 0x75, 0x63, 0x68, 0x6f, 0x61, 0x68, 0x6f, 0x72, 0x61,
+  0x6c, 0x75, 0x67, 0x61, 0x72, 0x6d, 0x61, 0x79, 0x6f, 0x72, 0x65, 0x73, 0x74,
+  0x6f, 0x73, 0x68, 0x6f, 0x72, 0x61, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x61,
+  0x6e, 0x74, 0x65, 0x73, 0x66, 0x6f, 0x74, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x61,
+  0x73, 0x70, 0x61, 0xc3, 0xad, 0x73, 0x6e, 0x75, 0x65, 0x76, 0x61, 0x73, 0x61,
+  0x6c, 0x75, 0x64, 0x66, 0x6f, 0x72, 0x6f, 0x73, 0x6d, 0x65, 0x64, 0x69, 0x6f,
+  0x71, 0x75, 0x69, 0x65, 0x6e, 0x6d, 0x65, 0x73, 0x65, 0x73, 0x70, 0x6f, 0x64,
+  0x65, 0x72, 0x63, 0x68, 0x69, 0x6c, 0x65, 0x73, 0x65, 0x72, 0xc3, 0xa1, 0x76,
+  0x65, 0x63, 0x65, 0x73, 0x64, 0x65, 0x63, 0x69, 0x72, 0x6a, 0x6f, 0x73, 0xc3,
+  0xa9, 0x65, 0x73, 0x74, 0x61, 0x72, 0x76, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x72,
+  0x75, 0x70, 0x6f, 0x68, 0x65, 0x63, 0x68, 0x6f, 0x65, 0x6c, 0x6c, 0x6f, 0x73,
+  0x74, 0x65, 0x6e, 0x67, 0x6f, 0x61, 0x6d, 0x69, 0x67, 0x6f, 0x63, 0x6f, 0x73,
+  0x61, 0x73, 0x6e, 0x69, 0x76, 0x65, 0x6c, 0x67, 0x65, 0x6e, 0x74, 0x65, 0x6d,
+  0x69, 0x73, 0x6d, 0x61, 0x61, 0x69, 0x72, 0x65, 0x73, 0x6a, 0x75, 0x6c, 0x69,
+  0x6f, 0x74, 0x65, 0x6d, 0x61, 0x73, 0x68, 0x61, 0x63, 0x69, 0x61, 0x66, 0x61,
+  0x76, 0x6f, 0x72, 0x6a, 0x75, 0x6e, 0x69, 0x6f, 0x6c, 0x69, 0x62, 0x72, 0x65,
+  0x70, 0x75, 0x6e, 0x74, 0x6f, 0x62, 0x75, 0x65, 0x6e, 0x6f, 0x61, 0x75, 0x74,
+  0x6f, 0x72, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x62, 0x75, 0x65, 0x6e, 0x61, 0x74,
+  0x65, 0x78, 0x74, 0x6f, 0x6d, 0x61, 0x72, 0x7a, 0x6f, 0x73, 0x61, 0x62, 0x65,
+  0x72, 0x6c, 0x69, 0x73, 0x74, 0x61, 0x6c, 0x75, 0x65, 0x67, 0x6f, 0x63, 0xc3,
+  0xb3, 0x6d, 0x6f, 0x65, 0x6e, 0x65, 0x72, 0x6f, 0x6a, 0x75, 0x65, 0x67, 0x6f,
+  0x70, 0x65, 0x72, 0xc3, 0xba, 0x68, 0x61, 0x62, 0x65, 0x72, 0x65, 0x73, 0x74,
+  0x6f, 0x79, 0x6e, 0x75, 0x6e, 0x63, 0x61, 0x6d, 0x75, 0x6a, 0x65, 0x72, 0x76,
+  0x61, 0x6c, 0x6f, 0x72, 0x66, 0x75, 0x65, 0x72, 0x61, 0x6c, 0x69, 0x62, 0x72,
+  0x6f, 0x67, 0x75, 0x73, 0x74, 0x61, 0x69, 0x67, 0x75, 0x61, 0x6c, 0x76, 0x6f,
+  0x74, 0x6f, 0x73, 0x63, 0x61, 0x73, 0x6f, 0x73, 0x67, 0x75, 0xc3, 0xad, 0x61,
+  0x70, 0x75, 0x65, 0x64, 0x6f, 0x73, 0x6f, 0x6d, 0x6f, 0x73, 0x61, 0x76, 0x69,
+  0x73, 0x6f, 0x75, 0x73, 0x74, 0x65, 0x64, 0x64, 0x65, 0x62, 0x65, 0x6e, 0x6e,
+  0x6f, 0x63, 0x68, 0x65, 0x62, 0x75, 0x73, 0x63, 0x61, 0x66, 0x61, 0x6c, 0x74,
+  0x61, 0x65, 0x75, 0x72, 0x6f, 0x73, 0x73, 0x65, 0x72, 0x69, 0x65, 0x64, 0x69,
+  0x63, 0x68, 0x6f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x63, 0x6c, 0x61, 0x76, 0x65,
+  0x63, 0x61, 0x73, 0x61, 0x73, 0x6c, 0x65, 0xc3, 0xb3, 0x6e, 0x70, 0x6c, 0x61,
+  0x7a, 0x6f, 0x6c, 0x61, 0x72, 0x67, 0x6f, 0x6f, 0x62, 0x72, 0x61, 0x73, 0x76,
+  0x69, 0x73, 0x74, 0x61, 0x61, 0x70, 0x6f, 0x79, 0x6f, 0x6a, 0x75, 0x6e, 0x74,
+  0x6f, 0x74, 0x72, 0x61, 0x74, 0x61, 0x76, 0x69, 0x73, 0x74, 0x6f, 0x63, 0x72,
+  0x65, 0x61, 0x72, 0x63, 0x61, 0x6d, 0x70, 0x6f, 0x68, 0x65, 0x6d, 0x6f, 0x73,
+  0x63, 0x69, 0x6e, 0x63, 0x6f, 0x63, 0x61, 0x72, 0x67, 0x6f, 0x70, 0x69, 0x73,
+  0x6f, 0x73, 0x6f, 0x72, 0x64, 0x65, 0x6e, 0x68, 0x61, 0x63, 0x65, 0x6e, 0xc3,
+  0xa1, 0x72, 0x65, 0x61, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x72,
+  0x6f, 0x63, 0x65, 0x72, 0x63, 0x61, 0x70, 0x75, 0x65, 0x64, 0x61, 0x70, 0x61,
+  0x70, 0x65, 0x6c, 0x6d, 0x65, 0x6e, 0x6f, 0x72, 0xc3, 0xba, 0x74, 0x69, 0x6c,
+  0x63, 0x6c, 0x61, 0x72, 0x6f, 0x6a, 0x6f, 0x72, 0x67, 0x65, 0x63, 0x61, 0x6c,
+  0x6c, 0x65, 0x70, 0x6f, 0x6e, 0x65, 0x72, 0x74, 0x61, 0x72, 0x64, 0x65, 0x6e,
+  0x61, 0x64, 0x69, 0x65, 0x6d, 0x61, 0x72, 0x63, 0x61, 0x73, 0x69, 0x67, 0x75,
+  0x65, 0x65, 0x6c, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6c, 0x6f, 0x63, 0x6f,
+  0x63, 0x68, 0x65, 0x6d, 0x6f, 0x74, 0x6f, 0x73, 0x6d, 0x61, 0x64, 0x72, 0x65,
+  0x63, 0x6c, 0x61, 0x73, 0x65, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x6e, 0x69, 0xc3,
+  0xb1, 0x6f, 0x71, 0x75, 0x65, 0x64, 0x61, 0x70, 0x61, 0x73, 0x61, 0x72, 0x62,
+  0x61, 0x6e, 0x63, 0x6f, 0x68, 0x69, 0x6a, 0x6f, 0x73, 0x76, 0x69, 0x61, 0x6a,
+  0x65, 0x70, 0x61, 0x62, 0x6c, 0x6f, 0xc3, 0xa9, 0x73, 0x74, 0x65, 0x76, 0x69,
+  0x65, 0x6e, 0x65, 0x72, 0x65, 0x69, 0x6e, 0x6f, 0x64, 0x65, 0x6a, 0x61, 0x72,
+  0x66, 0x6f, 0x6e, 0x64, 0x6f, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x6e, 0x6f, 0x72,
+  0x74, 0x65, 0x6c, 0x65, 0x74, 0x72, 0x61, 0x63, 0x61, 0x75, 0x73, 0x61, 0x74,
+  0x6f, 0x6d, 0x61, 0x72, 0x6d, 0x61, 0x6e, 0x6f, 0x73, 0x6c, 0x75, 0x6e, 0x65,
+  0x73, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x76, 0x69, 0x6c, 0x6c, 0x61, 0x76, 0x65,
+  0x6e, 0x64, 0x6f, 0x70, 0x65, 0x73, 0x61, 0x72, 0x74, 0x69, 0x70, 0x6f, 0x73,
+  0x74, 0x65, 0x6e, 0x67, 0x61, 0x6d, 0x61, 0x72, 0x63, 0x6f, 0x6c, 0x6c, 0x65,
+  0x76, 0x61, 0x70, 0x61, 0x64, 0x72, 0x65, 0x75, 0x6e, 0x69, 0x64, 0x6f, 0x76,
+  0x61, 0x6d, 0x6f, 0x73, 0x7a, 0x6f, 0x6e, 0x61, 0x73, 0x61, 0x6d, 0x62, 0x6f,
+  0x73, 0x62, 0x61, 0x6e, 0x64, 0x61, 0x6d, 0x61, 0x72, 0x69, 0x61, 0x61, 0x62,
+  0x75, 0x73, 0x6f, 0x6d, 0x75, 0x63, 0x68, 0x61, 0x73, 0x75, 0x62, 0x69, 0x72,
+  0x72, 0x69, 0x6f, 0x6a, 0x61, 0x76, 0x69, 0x76, 0x69, 0x72, 0x67, 0x72, 0x61,
+  0x64, 0x6f, 0x63, 0x68, 0x69, 0x63, 0x61, 0x61, 0x6c, 0x6c, 0xc3, 0xad, 0x6a,
+  0x6f, 0x76, 0x65, 0x6e, 0x64, 0x69, 0x63, 0x68, 0x61, 0x65, 0x73, 0x74, 0x61,
+  0x6e, 0x74, 0x61, 0x6c, 0x65, 0x73, 0x73, 0x61, 0x6c, 0x69, 0x72, 0x73, 0x75,
+  0x65, 0x6c, 0x6f, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x66, 0x69, 0x6e, 0x65, 0x73,
+  0x6c, 0x6c, 0x61, 0x6d, 0x61, 0x62, 0x75, 0x73, 0x63, 0x6f, 0xc3, 0xa9, 0x73,
+  0x74, 0x61, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6e, 0x65, 0x67, 0x72, 0x6f, 0x70,
+  0x6c, 0x61, 0x7a, 0x61, 0x68, 0x75, 0x6d, 0x6f, 0x72, 0x70, 0x61, 0x67, 0x61,
+  0x72, 0x6a, 0x75, 0x6e, 0x74, 0x61, 0x64, 0x6f, 0x62, 0x6c, 0x65, 0x69, 0x73,
+  0x6c, 0x61, 0x73, 0x62, 0x6f, 0x6c, 0x73, 0x61, 0x62, 0x61, 0xc3, 0xb1, 0x6f,
+  0x68, 0x61, 0x62, 0x6c, 0x61, 0x6c, 0x75, 0x63, 0x68, 0x61, 0xc3, 0x81, 0x72,
+  0x65, 0x61, 0x64, 0x69, 0x63, 0x65, 0x6e, 0x6a, 0x75, 0x67, 0x61, 0x72, 0x6e,
+  0x6f, 0x74, 0x61, 0x73, 0x76, 0x61, 0x6c, 0x6c, 0x65, 0x61, 0x6c, 0x6c, 0xc3,
+  0xa1, 0x63, 0x61, 0x72, 0x67, 0x61, 0x64, 0x6f, 0x6c, 0x6f, 0x72, 0x61, 0x62,
+  0x61, 0x6a, 0x6f, 0x65, 0x73, 0x74, 0xc3, 0xa9, 0x67, 0x75, 0x73, 0x74, 0x6f,
+  0x6d, 0x65, 0x6e, 0x74, 0x65, 0x6d, 0x61, 0x72, 0x69, 0x6f, 0x66, 0x69, 0x72,
+  0x6d, 0x61, 0x63, 0x6f, 0x73, 0x74, 0x6f, 0x66, 0x69, 0x63, 0x68, 0x61, 0x70,
+  0x6c, 0x61, 0x74, 0x61, 0x68, 0x6f, 0x67, 0x61, 0x72, 0x61, 0x72, 0x74, 0x65,
+  0x73, 0x6c, 0x65, 0x79, 0x65, 0x73, 0x61, 0x71, 0x75, 0x65, 0x6c, 0x6d, 0x75,
+  0x73, 0x65, 0x6f, 0x62, 0x61, 0x73, 0x65, 0x73, 0x70, 0x6f, 0x63, 0x6f, 0x73,
+  0x6d, 0x69, 0x74, 0x61, 0x64, 0x63, 0x69, 0x65, 0x6c, 0x6f, 0x63, 0x68, 0x69,
+  0x63, 0x6f, 0x6d, 0x69, 0x65, 0x64, 0x6f, 0x67, 0x61, 0x6e, 0x61, 0x72, 0x73,
+  0x61, 0x6e, 0x74, 0x6f, 0x65, 0x74, 0x61, 0x70, 0x61, 0x64, 0x65, 0x62, 0x65,
+  0x73, 0x70, 0x6c, 0x61, 0x79, 0x61, 0x72, 0x65, 0x64, 0x65, 0x73, 0x73, 0x69,
+  0x65, 0x74, 0x65, 0x63, 0x6f, 0x72, 0x74, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x61,
+  0x64, 0x75, 0x64, 0x61, 0x73, 0x64, 0x65, 0x73, 0x65, 0x6f, 0x76, 0x69, 0x65,
+  0x6a, 0x6f, 0x64, 0x65, 0x73, 0x65, 0x61, 0x61, 0x67, 0x75, 0x61, 0x73, 0x26,
+  0x71, 0x75, 0x6f, 0x74, 0x3b, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x63, 0x6f,
+  0x6d, 0x6d, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x76, 0x65,
+  0x6e, 0x74, 0x73, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x73, 0x79, 0x73, 0x74,
+  0x65, 0x6d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x61, 0x6e, 0x6e, 0x65,
+  0x72, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c,
+  0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x6d,
+  0x65, 0x64, 0x69, 0x75, 0x6d, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x75,
+  0x6d, 0x62, 0x65, 0x72, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x65, 0x73,
+  0x75, 0x6c, 0x74, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x73, 0x63, 0x72, 0x65,
+  0x65, 0x6e, 0x63, 0x68, 0x6f, 0x6f, 0x73, 0x65, 0x6e, 0x6f, 0x72, 0x6d, 0x61,
+  0x6c, 0x74, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x69, 0x73, 0x73, 0x75, 0x65, 0x73,
+  0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73,
+  0x70, 0x72, 0x69, 0x6e, 0x67, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x6d, 0x6f,
+  0x62, 0x69, 0x6c, 0x65, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x70, 0x68, 0x6f,
+  0x74, 0x6f, 0x73, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x72, 0x65, 0x67, 0x69,
+  0x6f, 0x6e, 0x69, 0x74, 0x73, 0x65, 0x6c, 0x66, 0x73, 0x6f, 0x63, 0x69, 0x61,
+  0x6c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e,
+  0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x74,
+  0x69, 0x74, 0x6c, 0x65, 0x3e, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x6c, 0x65,
+  0x6e, 0x67, 0x74, 0x68, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x66, 0x72, 0x69,
+  0x65, 0x6e, 0x64, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x61, 0x75, 0x74, 0x68,
+  0x6f, 0x72, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x65, 0x76, 0x69, 0x65,
+  0x77, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x72, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72,
+  0x70, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x65,
+  0x78, 0x70, 0x61, 0x6e, 0x64, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x66, 0x6f,
+  0x72, 0x6d, 0x61, 0x74, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x70, 0x6f, 0x69,
+  0x6e, 0x74, 0x73, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x70, 0x65, 0x72, 0x73,
+  0x6f, 0x6e, 0x6c, 0x69, 0x76, 0x69, 0x6e, 0x67, 0x64, 0x65, 0x73, 0x69, 0x67,
+  0x6e, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x73, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x73,
+  0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x70,
+  0x65, 0x6f, 0x70, 0x6c, 0x65, 0x65, 0x6e, 0x65, 0x72, 0x67, 0x79, 0x6e, 0x61,
+  0x74, 0x75, 0x72, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x66, 0x69, 0x67,
+  0x75, 0x72, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x63, 0x75, 0x73, 0x74,
+  0x6f, 0x6d, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x6c, 0x65, 0x74, 0x74, 0x65,
+  0x72, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74,
+  0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x75,
+  0x70, 0x6c, 0x6f, 0x61, 0x64, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x6d, 0x65,
+  0x74, 0x68, 0x6f, 0x64, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x73, 0x73, 0x63, 0x68,
+  0x6f, 0x6f, 0x6c, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x73, 0x68, 0x61, 0x64,
+  0x6f, 0x77, 0x64, 0x65, 0x62, 0x61, 0x74, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x65,
+  0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x73,
+  0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x6c, 0x65, 0x61, 0x67, 0x75, 0x65, 0x63,
+  0x68, 0x72, 0x6f, 0x6d, 0x65, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6e, 0x6f,
+  0x74, 0x69, 0x63, 0x65, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x64,
+  0x69, 0x6e, 0x67, 0x73, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x72, 0x65, 0x70, 0x6f,
+  0x72, 0x74, 0x6f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x71, 0x75, 0x61, 0x72,
+  0x65, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73,
+  0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x6c,
+  0x61, 0x74, 0x65, 0x73, 0x74, 0x77, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x46, 0x72,
+  0x61, 0x6e, 0x63, 0x65, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x74, 0x72,
+  0x6f, 0x6e, 0x67, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x4c, 0x6f, 0x6e, 0x64,
+  0x6f, 0x6e, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x66, 0x6f, 0x72, 0x6d, 0x65,
+  0x64, 0x64, 0x65, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65,
+  0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x70,
+  0x6c, 0x61, 0x63, 0x65, 0x73, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x74,
+  0x61, 0x74, 0x69, 0x63, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x73, 0x74, 0x72,
+  0x65, 0x61, 0x6d, 0x79, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x61, 0x74, 0x74, 0x61,
+  0x63, 0x6b, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x66, 0x6c, 0x69, 0x67, 0x68,
+  0x74, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x3e,
+  0x6f, 0x70, 0x65, 0x6e, 0x65, 0x64, 0x75, 0x73, 0x65, 0x66, 0x75, 0x6c, 0x76,
+  0x61, 0x6c, 0x6c, 0x65, 0x79, 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, 0x6c, 0x65,
+  0x61, 0x64, 0x65, 0x72, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x65, 0x63,
+  0x6f, 0x6e, 0x64, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x70, 0x6f, 0x72,
+  0x74, 0x73, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6e,
+  0x67, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73,
+  0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x73,
+  0x74, 0x61, 0x74, 0x65, 0x73, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x65, 0x76, 0x69,
+  0x73, 0x75, 0x61, 0x6c, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x76, 0x6f, 0x6c,
+  0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x6d, 0x75, 0x73, 0x65,
+  0x75, 0x6d, 0x6d, 0x6f, 0x76, 0x69, 0x65, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e,
+  0x74, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6d, 0x6f, 0x73, 0x74, 0x6c, 0x79,
+  0x6d, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6d,
+  0x61, 0x72, 0x6b, 0x65, 0x74, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x63, 0x68,
+  0x61, 0x6e, 0x63, 0x65, 0x73, 0x75, 0x72, 0x76, 0x65, 0x79, 0x62, 0x65, 0x66,
+  0x6f, 0x72, 0x65, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x6d, 0x6f, 0x6d, 0x65,
+  0x6e, 0x74, 0x73, 0x70, 0x65, 0x65, 0x63, 0x68, 0x6d, 0x6f, 0x74, 0x69, 0x6f,
+  0x6e, 0x69, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72,
+  0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x65,
+  0x78, 0x69, 0x73, 0x74, 0x73, 0x6d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x45, 0x75,
+  0x72, 0x6f, 0x70, 0x65, 0x67, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x6c, 0x65, 0x67,
+  0x61, 0x63, 0x79, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x65, 0x6e, 0x6f, 0x75,
+  0x67, 0x68, 0x63, 0x61, 0x72, 0x65, 0x65, 0x72, 0x61, 0x6e, 0x73, 0x77, 0x65,
+  0x72, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6c,
+  0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72,
+  0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x74, 0x6f,
+  0x70, 0x69, 0x63, 0x73, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x66, 0x61, 0x74,
+  0x68, 0x65, 0x72, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x69, 0x6d, 0x70,
+  0x6c, 0x79, 0x72, 0x61, 0x69, 0x73, 0x65, 0x64, 0x65, 0x73, 0x63, 0x61, 0x70,
+  0x65, 0x63, 0x68, 0x6f, 0x73, 0x65, 0x6e, 0x63, 0x68, 0x75, 0x72, 0x63, 0x68,
+  0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x63,
+  0x6f, 0x72, 0x6e, 0x65, 0x72, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x6d, 0x65,
+  0x6d, 0x6f, 0x72, 0x79, 0x69, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x70, 0x6f, 0x6c,
+  0x69, 0x63, 0x65, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x4e, 0x75, 0x6d, 0x62,
+  0x65, 0x72, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x6f, 0x66, 0x66, 0x65, 0x72,
+  0x73, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64,
+  0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x73,
+  0x69, 0x6c, 0x76, 0x65, 0x72, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x64, 0x65,
+  0x6c, 0x65, 0x74, 0x65, 0x62, 0x65, 0x74, 0x74, 0x65, 0x72, 0x62, 0x72, 0x6f,
+  0x77, 0x73, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x47, 0x6c, 0x6f, 0x62,
+  0x61, 0x6c, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x77, 0x69, 0x64, 0x67, 0x65,
+  0x74, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74,
+  0x6e, 0x6f, 0x77, 0x72, 0x61, 0x70, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x63,
+  0x6c, 0x61, 0x69, 0x6d, 0x73, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x73, 0x61,
+  0x66, 0x65, 0x74, 0x79, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x70, 0x69,
+  0x72, 0x69, 0x74, 0x2d, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x70, 0x72, 0x65,
+  0x61, 0x64, 0x6d, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x6e, 0x65, 0x65, 0x64, 0x65,
+  0x64, 0x72, 0x75, 0x73, 0x73, 0x69, 0x61, 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65,
+  0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x62,
+  0x72, 0x6f, 0x6b, 0x65, 0x6e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x63, 0x68,
+  0x61, 0x72, 0x67, 0x65, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x66, 0x61, 0x63,
+  0x74, 0x6f, 0x72, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x2d, 0x62, 0x61, 0x73,
+  0x65, 0x64, 0x74, 0x68, 0x65, 0x6f, 0x72, 0x79, 0x63, 0x6f, 0x6e, 0x66, 0x69,
+  0x67, 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x64,
+  0x68, 0x65, 0x6c, 0x70, 0x65, 0x64, 0x43, 0x68, 0x75, 0x72, 0x63, 0x68, 0x69,
+  0x6d, 0x70, 0x61, 0x63, 0x74, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x61, 0x6c,
+  0x77, 0x61, 0x79, 0x73, 0x6c, 0x6f, 0x67, 0x6f, 0x22, 0x20, 0x62, 0x6f, 0x74,
+  0x74, 0x6f, 0x6d, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x3e, 0x29, 0x7b, 0x76, 0x61,
+  0x72, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x6f, 0x72, 0x61, 0x6e, 0x67,
+  0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28,
+  0x63, 0x6f, 0x75, 0x70, 0x6c, 0x65, 0x67, 0x61, 0x72, 0x64, 0x65, 0x6e, 0x62,
+  0x72, 0x69, 0x64, 0x67, 0x65, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x52, 0x65,
+  0x76, 0x69, 0x65, 0x77, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x76, 0x69, 0x73,
+  0x69, 0x6f, 0x6e, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x61, 0x74, 0x69,
+  0x6e, 0x67, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x62, 0x65, 0x61, 0x75, 0x74,
+  0x79, 0x74, 0x68, 0x65, 0x6d, 0x65, 0x73, 0x66, 0x6f, 0x72, 0x67, 0x6f, 0x74,
+  0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x61,
+  0x6c, 0x6d, 0x6f, 0x73, 0x74, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x43, 0x68,
+  0x61, 0x6e, 0x67, 0x65, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x74, 0x72,
+  0x69, 0x6e, 0x67, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x62, 0x69,
+  0x6c, 0x65, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x65, 0x73, 0x75, 0x70, 0x70, 0x6c,
+  0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73,
+  0x76, 0x69, 0x65, 0x77, 0x65, 0x64, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x63,
+  0x6f, 0x75, 0x72, 0x73, 0x65, 0x41, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x69, 0x73,
+  0x6c, 0x61, 0x6e, 0x64, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x20, 0x63, 0x6f, 0x6f,
+  0x6b, 0x69, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x61, 0x6d, 0x61, 0x7a,
+  0x6f, 0x6e, 0x6d, 0x6f, 0x64, 0x65, 0x72, 0x6e, 0x61, 0x64, 0x76, 0x69, 0x63,
+  0x65, 0x69, 0x6e, 0x3c, 0x2f, 0x61, 0x3e, 0x3a, 0x20, 0x54, 0x68, 0x65, 0x20,
+  0x64, 0x69, 0x61, 0x6c, 0x6f, 0x67, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x73, 0x42,
+  0x45, 0x47, 0x49, 0x4e, 0x20, 0x4d, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x73, 0x74,
+  0x61, 0x72, 0x74, 0x73, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x65, 0x68, 0x65, 0x69,
+  0x67, 0x68, 0x74, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x49, 0x73, 0x6c, 0x61,
+  0x6e, 0x64, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x45, 0x6d, 0x70, 0x69, 0x72,
+  0x65, 0x53, 0x63, 0x68, 0x6f, 0x6f, 0x6c, 0x65, 0x66, 0x66, 0x6f, 0x72, 0x74,
+  0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6e, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x6d,
+  0x61, 0x6e, 0x75, 0x61, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x2e, 0x0a,
+  0x0a, 0x4f, 0x6e, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x6d, 0x65, 0x6e,
+  0x75, 0x22, 0x3e, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x61, 0x77, 0x61, 0x72,
+  0x64, 0x73, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x69, 0x6d, 0x70, 0x6f, 0x72,
+  0x74, 0x4f, 0x66, 0x66, 0x69, 0x63, 0x65, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64,
+  0x73, 0x6b, 0x69, 0x6c, 0x6c, 0x73, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53,
+  0x70, 0x6f, 0x72, 0x74, 0x73, 0x64, 0x65, 0x67, 0x72, 0x65, 0x65, 0x77, 0x65,
+  0x65, 0x6b, 0x6c, 0x79, 0x20, 0x28, 0x65, 0x2e, 0x67, 0x2e, 0x62, 0x65, 0x68,
+  0x69, 0x6e, 0x64, 0x64, 0x6f, 0x63, 0x74, 0x6f, 0x72, 0x6c, 0x6f, 0x67, 0x67,
+  0x65, 0x64, 0x75, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x3c, 0x2f, 0x62, 0x3e, 0x3c,
+  0x2f, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x73, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x73,
+  0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x69,
+  0x73, 0x73, 0x75, 0x65, 0x64, 0x33, 0x30, 0x30, 0x70, 0x78, 0x7c, 0x63, 0x61,
+  0x6e, 0x61, 0x64, 0x61, 0x61, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x73, 0x63, 0x68,
+  0x65, 0x6d, 0x65, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x42, 0x72, 0x61, 0x7a,
+  0x69, 0x6c, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x6c, 0x6f, 0x67, 0x6f, 0x22,
+  0x3e, 0x62, 0x65, 0x79, 0x6f, 0x6e, 0x64, 0x2d, 0x73, 0x63, 0x61, 0x6c, 0x65,
+  0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x6d,
+  0x61, 0x72, 0x69, 0x6e, 0x65, 0x46, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x63, 0x61,
+  0x6d, 0x65, 0x72, 0x61, 0x3c, 0x2f, 0x68, 0x31, 0x3e, 0x0a, 0x5f, 0x66, 0x6f,
+  0x72, 0x6d, 0x22, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x73, 0x74, 0x72, 0x65,
+  0x73, 0x73, 0x22, 0x20, 0x2f, 0x3e, 0x0d, 0x0a, 0x2e, 0x67, 0x69, 0x66, 0x22,
+  0x20, 0x6f, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72,
+  0x4f, 0x78, 0x66, 0x6f, 0x72, 0x64, 0x73, 0x69, 0x73, 0x74, 0x65, 0x72, 0x73,
+  0x75, 0x72, 0x76, 0x69, 0x76, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x66, 0x65,
+  0x6d, 0x61, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x73, 0x69, 0x7a,
+  0x65, 0x3d, 0x22, 0x61, 0x70, 0x70, 0x65, 0x61, 0x6c, 0x74, 0x65, 0x78, 0x74,
+  0x22, 0x3e, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x74, 0x68, 0x61, 0x6e, 0x6b,
+  0x73, 0x68, 0x69, 0x67, 0x68, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x64,
+  0x61, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x61, 0x6e, 0x79, 0x6f, 0x6e, 0x65, 0x41,
+  0x66, 0x72, 0x69, 0x63, 0x61, 0x61, 0x67, 0x72, 0x65, 0x65, 0x64, 0x72, 0x65,
+  0x63, 0x65, 0x6e, 0x74, 0x50, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x3c, 0x62, 0x72,
+  0x20, 0x2f, 0x3e, 0x77, 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x70, 0x72, 0x69, 0x63,
+  0x65, 0x73, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x7c, 0x7c, 0x20, 0x7b, 0x7d,
+  0x3b, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x3e, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,
+  0x73, 0x75, 0x6e, 0x64, 0x61, 0x79, 0x77, 0x72, 0x61, 0x70, 0x22, 0x3e, 0x66,
+  0x61, 0x69, 0x6c, 0x65, 0x64, 0x63, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x6d, 0x69,
+  0x6e, 0x75, 0x74, 0x65, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x71, 0x75, 0x6f,
+  0x74, 0x65, 0x73, 0x31, 0x35, 0x30, 0x70, 0x78, 0x7c, 0x65, 0x73, 0x74, 0x61,
+  0x74, 0x65, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x65, 0x6d, 0x61, 0x69, 0x6c,
+  0x22, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x64, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3b,
+  0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x31,
+  0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x73, 0x69, 0x67, 0x6e, 0x75, 0x70, 0x70, 0x72,
+  0x69, 0x6e, 0x63, 0x65, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a, 0x2e, 0x70, 0x6e,
+  0x67, 0x22, 0x20, 0x66, 0x6f, 0x72, 0x75, 0x6d, 0x2e, 0x41, 0x63, 0x63, 0x65,
+  0x73, 0x73, 0x70, 0x61, 0x70, 0x65, 0x72, 0x73, 0x73, 0x6f, 0x75, 0x6e, 0x64,
+  0x73, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74,
+  0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x55, 0x54, 0x46, 0x2d, 0x38, 0x22, 0x26,
+  0x61, 0x6d, 0x70, 0x3b, 0x20, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x2e, 0x20,
+  0x57, 0x69, 0x74, 0x68, 0x73, 0x74, 0x75, 0x64, 0x69, 0x6f, 0x6f, 0x77, 0x6e,
+  0x65, 0x72, 0x73, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x70, 0x72, 0x6f, 0x66,
+  0x69, 0x74, 0x6a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x61, 0x6e, 0x6e, 0x75, 0x61,
+  0x6c, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x62, 0x6f, 0x75, 0x67, 0x68, 0x74,
+  0x66, 0x61, 0x6d, 0x6f, 0x75, 0x73, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x6c,
+  0x6f, 0x6e, 0x67, 0x65, 0x72, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0x69, 0x73,
+  0x72, 0x61, 0x65, 0x6c, 0x73, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x64, 0x65, 0x63,
+  0x69, 0x64, 0x65, 0x68, 0x6f, 0x6d, 0x65, 0x22, 0x3e, 0x68, 0x65, 0x61, 0x64,
+  0x65, 0x72, 0x65, 0x6e, 0x73, 0x75, 0x72, 0x65, 0x62, 0x72, 0x61, 0x6e, 0x63,
+  0x68, 0x70, 0x69, 0x65, 0x63, 0x65, 0x73, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b,
+  0x73, 0x74, 0x61, 0x74, 0x65, 0x64, 0x74, 0x6f, 0x70, 0x22, 0x3e, 0x3c, 0x72,
+  0x61, 0x63, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x2d, 0x2d,
+  0x26, 0x67, 0x74, 0x3b, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x73, 0x65, 0x78,
+  0x75, 0x61, 0x6c, 0x62, 0x75, 0x72, 0x65, 0x61, 0x75, 0x2e, 0x6a, 0x70, 0x67,
+  0x22, 0x20, 0x31, 0x30, 0x2c, 0x30, 0x30, 0x30, 0x6f, 0x62, 0x74, 0x61, 0x69,
+  0x6e, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x73, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74,
+  0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x63, 0x6f, 0x6d, 0x65, 0x64, 0x79, 0x6d,
+  0x65, 0x6e, 0x75, 0x22, 0x20, 0x6c, 0x79, 0x72, 0x69, 0x63, 0x73, 0x74, 0x6f,
+  0x64, 0x61, 0x79, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x65, 0x64, 0x63, 0x6f, 0x75,
+  0x6e, 0x74, 0x79, 0x5f, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x46, 0x61, 0x6d, 0x69,
+  0x6c, 0x79, 0x6c, 0x6f, 0x6f, 0x6b, 0x65, 0x64, 0x4d, 0x61, 0x72, 0x6b, 0x65,
+  0x74, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72,
+  0x74, 0x75, 0x72, 0x6b, 0x65, 0x79, 0x29, 0x3b, 0x76, 0x61, 0x72, 0x20, 0x66,
+  0x6f, 0x72, 0x65, 0x73, 0x74, 0x67, 0x69, 0x76, 0x69, 0x6e, 0x67, 0x65, 0x72,
+  0x72, 0x6f, 0x72, 0x73, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x7d, 0x65, 0x6c,
+  0x73, 0x65, 0x7b, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x67,
+  0x3c, 0x2f, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x6c, 0x6f, 0x67, 0x69, 0x6e,
+  0x2e, 0x66, 0x61, 0x73, 0x74, 0x65, 0x72, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73,
+  0x3c, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x31, 0x30, 0x70, 0x78, 0x20, 0x30, 0x70,
+  0x72, 0x61, 0x67, 0x6d, 0x61, 0x66, 0x72, 0x69, 0x64, 0x61, 0x79, 0x6a, 0x75,
+  0x6e, 0x69, 0x6f, 0x72, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x70, 0x6c, 0x61,
+  0x63, 0x65, 0x64, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x73, 0x70, 0x6c, 0x75, 0x67,
+  0x69, 0x6e, 0x35, 0x2c, 0x30, 0x30, 0x30, 0x20, 0x70, 0x61, 0x67, 0x65, 0x22,
+  0x3e, 0x62, 0x6f, 0x73, 0x74, 0x6f, 0x6e, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x28,
+  0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x74, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f,
+  0x63, 0x6f, 0x75, 0x6e, 0x74, 0x66, 0x6f, 0x72, 0x75, 0x6d, 0x73, 0x73, 0x63,
+  0x68, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x66, 0x69, 0x6c,
+  0x6c, 0x65, 0x64, 0x73, 0x68, 0x61, 0x72, 0x65, 0x73, 0x72, 0x65, 0x61, 0x64,
+  0x65, 0x72, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x28, 0x61, 0x70, 0x70, 0x65, 0x61,
+  0x72, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x3e,
+  0x62, 0x6f, 0x64, 0x79, 0x22, 0x3e, 0x0a, 0x2a, 0x20, 0x54, 0x68, 0x65, 0x54,
+  0x68, 0x6f, 0x75, 0x67, 0x68, 0x73, 0x65, 0x65, 0x69, 0x6e, 0x67, 0x6a, 0x65,
+  0x72, 0x73, 0x65, 0x79, 0x4e, 0x65, 0x77, 0x73, 0x3c, 0x2f, 0x76, 0x65, 0x72,
+  0x69, 0x66, 0x79, 0x65, 0x78, 0x70, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x6a, 0x75,
+  0x72, 0x79, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x43, 0x6f, 0x6f, 0x6b, 0x69,
+  0x65, 0x53, 0x54, 0x41, 0x52, 0x54, 0x20, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x73,
+  0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x6e,
+  0x61, 0x74, 0x69, 0x76, 0x65, 0x70, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x62, 0x6f,
+  0x78, 0x22, 0x3e, 0x0a, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x44, 0x61,
+  0x76, 0x69, 0x64, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x74, 0x61, 0x62, 0x6c,
+  0x65, 0x73, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x41, 0x70, 0x72, 0x69, 0x6c,
+  0x20, 0x72, 0x65, 0x61, 0x6c, 0x6c, 0x79, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72,
+  0x69, 0x74, 0x65, 0x6d, 0x22, 0x3e, 0x6d, 0x6f, 0x72, 0x65, 0x22, 0x3e, 0x62,
+  0x6f, 0x61, 0x72, 0x64, 0x73, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x63, 0x61,
+  0x6d, 0x70, 0x75, 0x73, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x7c, 0x7c, 0x20,
+  0x5b, 0x5d, 0x3b, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x2e, 0x67, 0x75, 0x69, 0x74,
+  0x61, 0x72, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x77, 0x69, 0x64, 0x74, 0x68,
+  0x3a, 0x73, 0x68, 0x6f, 0x77, 0x65, 0x64, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x20,
+  0x2e, 0x70, 0x68, 0x70, 0x22, 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, 0x6c,
+  0x61, 0x79, 0x65, 0x72, 0x73, 0x77, 0x69, 0x6c, 0x73, 0x6f, 0x6e, 0x73, 0x74,
+  0x6f, 0x72, 0x65, 0x73, 0x72, 0x65, 0x6c, 0x69, 0x65, 0x66, 0x73, 0x77, 0x65,
+  0x64, 0x65, 0x6e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x61, 0x73, 0x69,
+  0x6c, 0x79, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x53, 0x74, 0x72, 0x69, 0x6e,
+  0x67, 0x0a, 0x0a, 0x57, 0x68, 0x69, 0x6c, 0x74, 0x61, 0x79, 0x6c, 0x6f, 0x72,
+  0x63, 0x6c, 0x65, 0x61, 0x72, 0x3a, 0x72, 0x65, 0x73, 0x6f, 0x72, 0x74, 0x66,
+  0x72, 0x65, 0x6e, 0x63, 0x68, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x22, 0x29,
+  0x20, 0x2b, 0x20, 0x22, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x62, 0x75, 0x79,
+  0x69, 0x6e, 0x67, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x4d, 0x65, 0x6d, 0x62,
+  0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x6f, 0x70, 0x70, 0x69, 0x6e,
+  0x67, 0x73, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x35, 0x70, 0x78, 0x3b, 0x22, 0x3e,
+  0x76, 0x73, 0x70, 0x61, 0x63, 0x65, 0x70, 0x6f, 0x73, 0x74, 0x65, 0x72, 0x6d,
+  0x61, 0x6a, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x66, 0x66, 0x65, 0x65, 0x6d, 0x61,
+  0x72, 0x74, 0x69, 0x6e, 0x6d, 0x61, 0x74, 0x75, 0x72, 0x65, 0x68, 0x61, 0x70,
+  0x70, 0x65, 0x6e, 0x3c, 0x2f, 0x6e, 0x61, 0x76, 0x3e, 0x6b, 0x61, 0x6e, 0x73,
+  0x61, 0x73, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x3e, 0x49, 0x6d, 0x61, 0x67, 0x65,
+  0x73, 0x3d, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20,
+  0x68, 0x73, 0x70, 0x61, 0x63, 0x65, 0x30, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x20,
+  0x0a, 0x0a, 0x49, 0x6e, 0x20, 0x20, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x50, 0x6f,
+  0x6c, 0x73, 0x6b, 0x69, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x6a, 0x6f, 0x72,
+  0x64, 0x61, 0x6e, 0x42, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x53, 0x74, 0x61, 0x72,
+  0x74, 0x20, 0x2d, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x32, 0x2e, 0x68, 0x74, 0x6d,
+  0x6c, 0x6e, 0x65, 0x77, 0x73, 0x22, 0x3e, 0x30, 0x31, 0x2e, 0x6a, 0x70, 0x67,
+  0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6d,
+  0x69, 0x6c, 0x6c, 0x65, 0x72, 0x73, 0x65, 0x6e, 0x69, 0x6f, 0x72, 0x49, 0x53,
+  0x42, 0x4e, 0x20, 0x30, 0x30, 0x2c, 0x30, 0x30, 0x30, 0x20, 0x67, 0x75, 0x69,
+  0x64, 0x65, 0x73, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x65, 0x63, 0x74, 0x69,
+  0x6f, 0x6e, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x2e, 0x78, 0x6d, 0x6c, 0x22,
+  0x20, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x68, 0x74, 0x6d, 0x6c,
+  0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x72, 0x65, 0x67, 0x45, 0x78, 0x70, 0x3a,
+  0x68, 0x6f, 0x76, 0x65, 0x72, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x76, 0x69,
+  0x72, 0x67, 0x69, 0x6e, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x73, 0x3c, 0x2f, 0x74,
+  0x72, 0x3e, 0x0d, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x0a, 0x09, 0x76, 0x61,
+  0x72, 0x20, 0x3e, 0x27, 0x29, 0x3b, 0x0a, 0x09, 0x3c, 0x2f, 0x74, 0x64, 0x3e,
+  0x0a, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x0a, 0x62, 0x61, 0x68, 0x61, 0x73, 0x61,
+  0x62, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x67, 0x61, 0x6c, 0x65, 0x67, 0x6f, 0x6d,
+  0x61, 0x67, 0x79, 0x61, 0x72, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x73, 0x72,
+  0x70, 0x73, 0x6b, 0x69, 0xd8, 0xb1, 0xd8, 0xaf, 0xd9, 0x88, 0xe4, 0xb8, 0xad,
+  0xe6, 0x96, 0x87, 0xe7, 0xae, 0x80, 0xe4, 0xbd, 0x93, 0xe7, 0xb9, 0x81, 0xe9,
+  0xab, 0x94, 0xe4, 0xbf, 0xa1, 0xe6, 0x81, 0xaf, 0xe4, 0xb8, 0xad, 0xe5, 0x9b,
+  0xbd, 0xe6, 0x88, 0x91, 0xe4, 0xbb, 0xac, 0xe4, 0xb8, 0x80, 0xe4, 0xb8, 0xaa,
+  0xe5, 0x85, 0xac, 0xe5, 0x8f, 0xb8, 0xe7, 0xae, 0xa1, 0xe7, 0x90, 0x86, 0xe8,
+  0xae, 0xba, 0xe5, 0x9d, 0x9b, 0xe5, 0x8f, 0xaf, 0xe4, 0xbb, 0xa5, 0xe6, 0x9c,
+  0x8d, 0xe5, 0x8a, 0xa1, 0xe6, 0x97, 0xb6, 0xe9, 0x97, 0xb4, 0xe4, 0xb8, 0xaa,
+  0xe4, 0xba, 0xba, 0xe4, 0xba, 0xa7, 0xe5, 0x93, 0x81, 0xe8, 0x87, 0xaa, 0xe5,
+  0xb7, 0xb1, 0xe4, 0xbc, 0x81, 0xe4, 0xb8, 0x9a, 0xe6, 0x9f, 0xa5, 0xe7, 0x9c,
+  0x8b, 0xe5, 0xb7, 0xa5, 0xe4, 0xbd, 0x9c, 0xe8, 0x81, 0x94, 0xe7, 0xb3, 0xbb,
+  0xe6, 0xb2, 0xa1, 0xe6, 0x9c, 0x89, 0xe7, 0xbd, 0x91, 0xe7, 0xab, 0x99, 0xe6,
+  0x89, 0x80, 0xe6, 0x9c, 0x89, 0xe8, 0xaf, 0x84, 0xe8, 0xae, 0xba, 0xe4, 0xb8,
+  0xad, 0xe5, 0xbf, 0x83, 0xe6, 0x96, 0x87, 0xe7, 0xab, 0xa0, 0xe7, 0x94, 0xa8,
+  0xe6, 0x88, 0xb7, 0xe9, 0xa6, 0x96, 0xe9, 0xa1, 0xb5, 0xe4, 0xbd, 0x9c, 0xe8,
+  0x80, 0x85, 0xe6, 0x8a, 0x80, 0xe6, 0x9c, 0xaf, 0xe9, 0x97, 0xae, 0xe9, 0xa2,
+  0x98, 0xe7, 0x9b, 0xb8, 0xe5, 0x85, 0xb3, 0xe4, 0xb8, 0x8b, 0xe8, 0xbd, 0xbd,
+  0xe6, 0x90, 0x9c, 0xe7, 0xb4, 0xa2, 0xe4, 0xbd, 0xbf, 0xe7, 0x94, 0xa8, 0xe8,
+  0xbd, 0xaf, 0xe4, 0xbb, 0xb6, 0xe5, 0x9c, 0xa8, 0xe7, 0xba, 0xbf, 0xe4, 0xb8,
+  0xbb, 0xe9, 0xa2, 0x98, 0xe8, 0xb5, 0x84, 0xe6, 0x96, 0x99, 0xe8, 0xa7, 0x86,
+  0xe9, 0xa2, 0x91, 0xe5, 0x9b, 0x9e, 0xe5, 0xa4, 0x8d, 0xe6, 0xb3, 0xa8, 0xe5,
+  0x86, 0x8c, 0xe7, 0xbd, 0x91, 0xe7, 0xbb, 0x9c, 0xe6, 0x94, 0xb6, 0xe8, 0x97,
+  0x8f, 0xe5, 0x86, 0x85, 0xe5, 0xae, 0xb9, 0xe6, 0x8e, 0xa8, 0xe8, 0x8d, 0x90,
+  0xe5, 0xb8, 0x82, 0xe5, 0x9c, 0xba, 0xe6, 0xb6, 0x88, 0xe6, 0x81, 0xaf, 0xe7,
+  0xa9, 0xba, 0xe9, 0x97, 0xb4, 0xe5, 0x8f, 0x91, 0xe5, 0xb8, 0x83, 0xe4, 0xbb,
+  0x80, 0xe4, 0xb9, 0x88, 0xe5, 0xa5, 0xbd, 0xe5, 0x8f, 0x8b, 0xe7, 0x94, 0x9f,
+  0xe6, 0xb4, 0xbb, 0xe5, 0x9b, 0xbe, 0xe7, 0x89, 0x87, 0xe5, 0x8f, 0x91, 0xe5,
+  0xb1, 0x95, 0xe5, 0xa6, 0x82, 0xe6, 0x9e, 0x9c, 0xe6, 0x89, 0x8b, 0xe6, 0x9c,
+  0xba, 0xe6, 0x96, 0xb0, 0xe9, 0x97, 0xbb, 0xe6, 0x9c, 0x80, 0xe6, 0x96, 0xb0,
+  0xe6, 0x96, 0xb9, 0xe5, 0xbc, 0x8f, 0xe5, 0x8c, 0x97, 0xe4, 0xba, 0xac, 0xe6,
+  0x8f, 0x90, 0xe4, 0xbe, 0x9b, 0xe5, 0x85, 0xb3, 0xe4, 0xba, 0x8e, 0xe6, 0x9b,
+  0xb4, 0xe5, 0xa4, 0x9a, 0xe8, 0xbf, 0x99, 0xe4, 0xb8, 0xaa, 0xe7, 0xb3, 0xbb,
+  0xe7, 0xbb, 0x9f, 0xe7, 0x9f, 0xa5, 0xe9, 0x81, 0x93, 0xe6, 0xb8, 0xb8, 0xe6,
+  0x88, 0x8f, 0xe5, 0xb9, 0xbf, 0xe5, 0x91, 0x8a, 0xe5, 0x85, 0xb6, 0xe4, 0xbb,
+  0x96, 0xe5, 0x8f, 0x91, 0xe8, 0xa1, 0xa8, 0xe5, 0xae, 0x89, 0xe5, 0x85, 0xa8,
+  0xe7, 0xac, 0xac, 0xe4, 0xb8, 0x80, 0xe4, 0xbc, 0x9a, 0xe5, 0x91, 0x98, 0xe8,
+  0xbf, 0x9b, 0xe8, 0xa1, 0x8c, 0xe7, 0x82, 0xb9, 0xe5, 0x87, 0xbb, 0xe7, 0x89,
+  0x88, 0xe6, 0x9d, 0x83, 0xe7, 0x94, 0xb5, 0xe5, 0xad, 0x90, 0xe4, 0xb8, 0x96,
+  0xe7, 0x95, 0x8c, 0xe8, 0xae, 0xbe, 0xe8, 0xae, 0xa1, 0xe5, 0x85, 0x8d, 0xe8,
+  0xb4, 0xb9, 0xe6, 0x95, 0x99, 0xe8, 0x82, 0xb2, 0xe5, 0x8a, 0xa0, 0xe5, 0x85,
+  0xa5, 0xe6, 0xb4, 0xbb, 0xe5, 0x8a, 0xa8, 0xe4, 0xbb, 0x96, 0xe4, 0xbb, 0xac,
+  0xe5, 0x95, 0x86, 0xe5, 0x93, 0x81, 0xe5, 0x8d, 0x9a, 0xe5, 0xae, 0xa2, 0xe7,
+  0x8e, 0xb0, 0xe5, 0x9c, 0xa8, 0xe4, 0xb8, 0x8a, 0xe6, 0xb5, 0xb7, 0xe5, 0xa6,
+  0x82, 0xe4, 0xbd, 0x95, 0xe5, 0xb7, 0xb2, 0xe7, 0xbb, 0x8f, 0xe7, 0x95, 0x99,
+  0xe8, 0xa8, 0x80, 0xe8, 0xaf, 0xa6, 0xe7, 0xbb, 0x86, 0xe7, 0xa4, 0xbe, 0xe5,
+  0x8c, 0xba, 0xe7, 0x99, 0xbb, 0xe5, 0xbd, 0x95, 0xe6, 0x9c, 0xac, 0xe7, 0xab,
+  0x99, 0xe9, 0x9c, 0x80, 0xe8, 0xa6, 0x81, 0xe4, 0xbb, 0xb7, 0xe6, 0xa0, 0xbc,
+  0xe6, 0x94, 0xaf, 0xe6, 0x8c, 0x81, 0xe5, 0x9b, 0xbd, 0xe9, 0x99, 0x85, 0xe9,
+  0x93, 0xbe, 0xe6, 0x8e, 0xa5, 0xe5, 0x9b, 0xbd, 0xe5, 0xae, 0xb6, 0xe5, 0xbb,
+  0xba, 0xe8, 0xae, 0xbe, 0xe6, 0x9c, 0x8b, 0xe5, 0x8f, 0x8b, 0xe9, 0x98, 0x85,
+  0xe8, 0xaf, 0xbb, 0xe6, 0xb3, 0x95, 0xe5, 0xbe, 0x8b, 0xe4, 0xbd, 0x8d, 0xe7,
+  0xbd, 0xae, 0xe7, 0xbb, 0x8f, 0xe6, 0xb5, 0x8e, 0xe9, 0x80, 0x89, 0xe6, 0x8b,
+  0xa9, 0xe8, 0xbf, 0x99, 0xe6, 0xa0, 0xb7, 0xe5, 0xbd, 0x93, 0xe5, 0x89, 0x8d,
+  0xe5, 0x88, 0x86, 0xe7, 0xb1, 0xbb, 0xe6, 0x8e, 0x92, 0xe8, 0xa1, 0x8c, 0xe5,
+  0x9b, 0xa0, 0xe4, 0xb8, 0xba, 0xe4, 0xba, 0xa4, 0xe6, 0x98, 0x93, 0xe6, 0x9c,
+  0x80, 0xe5, 0x90, 0x8e, 0xe9, 0x9f, 0xb3, 0xe4, 0xb9, 0x90, 0xe4, 0xb8, 0x8d,
+  0xe8, 0x83, 0xbd, 0xe9, 0x80, 0x9a, 0xe8, 0xbf, 0x87, 0xe8, 0xa1, 0x8c, 0xe4,
+  0xb8, 0x9a, 0xe7, 0xa7, 0x91, 0xe6, 0x8a, 0x80, 0xe5, 0x8f, 0xaf, 0xe8, 0x83,
+  0xbd, 0xe8, 0xae, 0xbe, 0xe5, 0xa4, 0x87, 0xe5, 0x90, 0x88, 0xe4, 0xbd, 0x9c,
+  0xe5, 0xa4, 0xa7, 0xe5, 0xae, 0xb6, 0xe7, 0xa4, 0xbe, 0xe4, 0xbc, 0x9a, 0xe7,
+  0xa0, 0x94, 0xe7, 0xa9, 0xb6, 0xe4, 0xb8, 0x93, 0xe4, 0xb8, 0x9a, 0xe5, 0x85,
+  0xa8, 0xe9, 0x83, 0xa8, 0xe9, 0xa1, 0xb9, 0xe7, 0x9b, 0xae, 0xe8, 0xbf, 0x99,
+  0xe9, 0x87, 0x8c, 0xe8, 0xbf, 0x98, 0xe6, 0x98, 0xaf, 0xe5, 0xbc, 0x80, 0xe5,
+  0xa7, 0x8b, 0xe6, 0x83, 0x85, 0xe5, 0x86, 0xb5, 0xe7, 0x94, 0xb5, 0xe8, 0x84,
+  0x91, 0xe6, 0x96, 0x87, 0xe4, 0xbb, 0xb6, 0xe5, 0x93, 0x81, 0xe7, 0x89, 0x8c,
+  0xe5, 0xb8, 0xae, 0xe5, 0x8a, 0xa9, 0xe6, 0x96, 0x87, 0xe5, 0x8c, 0x96, 0xe8,
+  0xb5, 0x84, 0xe6, 0xba, 0x90, 0xe5, 0xa4, 0xa7, 0xe5, 0xad, 0xa6, 0xe5, 0xad,
+  0xa6, 0xe4, 0xb9, 0xa0, 0xe5, 0x9c, 0xb0, 0xe5, 0x9d, 0x80, 0xe6, 0xb5, 0x8f,
+  0xe8, 0xa7, 0x88, 0xe6, 0x8a, 0x95, 0xe8, 0xb5, 0x84, 0xe5, 0xb7, 0xa5, 0xe7,
+  0xa8, 0x8b, 0xe8, 0xa6, 0x81, 0xe6, 0xb1, 0x82, 0xe6, 0x80, 0x8e, 0xe4, 0xb9,
+  0x88, 0xe6, 0x97, 0xb6, 0xe5, 0x80, 0x99, 0xe5, 0x8a, 0x9f, 0xe8, 0x83, 0xbd,
+  0xe4, 0xb8, 0xbb, 0xe8, 0xa6, 0x81, 0xe7, 0x9b, 0xae, 0xe5, 0x89, 0x8d, 0xe8,
+  0xb5, 0x84, 0xe8, 0xae, 0xaf, 0xe5, 0x9f, 0x8e, 0xe5, 0xb8, 0x82, 0xe6, 0x96,
+  0xb9, 0xe6, 0xb3, 0x95, 0xe7, 0x94, 0xb5, 0xe5, 0xbd, 0xb1, 0xe6, 0x8b, 0x9b,
+  0xe8, 0x81, 0x98, 0xe5, 0xa3, 0xb0, 0xe6, 0x98, 0x8e, 0xe4, 0xbb, 0xbb, 0xe4,
+  0xbd, 0x95, 0xe5, 0x81, 0xa5, 0xe5, 0xba, 0xb7, 0xe6, 0x95, 0xb0, 0xe6, 0x8d,
+  0xae, 0xe7, 0xbe, 0x8e, 0xe5, 0x9b, 0xbd, 0xe6, 0xb1, 0xbd, 0xe8, 0xbd, 0xa6,
+  0xe4, 0xbb, 0x8b, 0xe7, 0xbb, 0x8d, 0xe4, 0xbd, 0x86, 0xe6, 0x98, 0xaf, 0xe4,
+  0xba, 0xa4, 0xe6, 0xb5, 0x81, 0xe7, 0x94, 0x9f, 0xe4, 0xba, 0xa7, 0xe6, 0x89,
+  0x80, 0xe4, 0xbb, 0xa5, 0xe7, 0x94, 0xb5, 0xe8, 0xaf, 0x9d, 0xe6, 0x98, 0xbe,
+  0xe7, 0xa4, 0xba, 0xe4, 0xb8, 0x80, 0xe4, 0xba, 0x9b, 0xe5, 0x8d, 0x95, 0xe4,
+  0xbd, 0x8d, 0xe4, 0xba, 0xba, 0xe5, 0x91, 0x98, 0xe5, 0x88, 0x86, 0xe6, 0x9e,
+  0x90, 0xe5, 0x9c, 0xb0, 0xe5, 0x9b, 0xbe, 0xe6, 0x97, 0x85, 0xe6, 0xb8, 0xb8,
+  0xe5, 0xb7, 0xa5, 0xe5, 0x85, 0xb7, 0xe5, 0xad, 0xa6, 0xe7, 0x94, 0x9f, 0xe7,
+  0xb3, 0xbb, 0xe5, 0x88, 0x97, 0xe7, 0xbd, 0x91, 0xe5, 0x8f, 0x8b, 0xe5, 0xb8,
+  0x96, 0xe5, 0xad, 0x90, 0xe5, 0xaf, 0x86, 0xe7, 0xa0, 0x81, 0xe9, 0xa2, 0x91,
+  0xe9, 0x81, 0x93, 0xe6, 0x8e, 0xa7, 0xe5, 0x88, 0xb6, 0xe5, 0x9c, 0xb0, 0xe5,
+  0x8c, 0xba, 0xe5, 0x9f, 0xba, 0xe6, 0x9c, 0xac, 0xe5, 0x85, 0xa8, 0xe5, 0x9b,
+  0xbd, 0xe7, 0xbd, 0x91, 0xe4, 0xb8, 0x8a, 0xe9, 0x87, 0x8d, 0xe8, 0xa6, 0x81,
+  0xe7, 0xac, 0xac, 0xe4, 0xba, 0x8c, 0xe5, 0x96, 0x9c, 0xe6, 0xac, 0xa2, 0xe8,
+  0xbf, 0x9b, 0xe5, 0x85, 0xa5, 0xe5, 0x8f, 0x8b, 0xe6, 0x83, 0x85, 0xe8, 0xbf,
+  0x99, 0xe4, 0xba, 0x9b, 0xe8, 0x80, 0x83, 0xe8, 0xaf, 0x95, 0xe5, 0x8f, 0x91,
+  0xe7, 0x8e, 0xb0, 0xe5, 0x9f, 0xb9, 0xe8, 0xae, 0xad, 0xe4, 0xbb, 0xa5, 0xe4,
+  0xb8, 0x8a, 0xe6, 0x94, 0xbf, 0xe5, 0xba, 0x9c, 0xe6, 0x88, 0x90, 0xe4, 0xb8,
+  0xba, 0xe7, 0x8e, 0xaf, 0xe5, 0xa2, 0x83, 0xe9, 0xa6, 0x99, 0xe6, 0xb8, 0xaf,
+  0xe5, 0x90, 0x8c, 0xe6, 0x97, 0xb6, 0xe5, 0xa8, 0xb1, 0xe4, 0xb9, 0x90, 0xe5,
+  0x8f, 0x91, 0xe9, 0x80, 0x81, 0xe4, 0xb8, 0x80, 0xe5, 0xae, 0x9a, 0xe5, 0xbc,
+  0x80, 0xe5, 0x8f, 0x91, 0xe4, 0xbd, 0x9c, 0xe5, 0x93, 0x81, 0xe6, 0xa0, 0x87,
+  0xe5, 0x87, 0x86, 0xe6, 0xac, 0xa2, 0xe8, 0xbf, 0x8e, 0xe8, 0xa7, 0xa3, 0xe5,
+  0x86, 0xb3, 0xe5, 0x9c, 0xb0, 0xe6, 0x96, 0xb9, 0xe4, 0xb8, 0x80, 0xe4, 0xb8,
+  0x8b, 0xe4, 0xbb, 0xa5, 0xe5, 0x8f, 0x8a, 0xe8, 0xb4, 0xa3, 0xe4, 0xbb, 0xbb,
+  0xe6, 0x88, 0x96, 0xe8, 0x80, 0x85, 0xe5, 0xae, 0xa2, 0xe6, 0x88, 0xb7, 0xe4,
+  0xbb, 0xa3, 0xe8, 0xa1, 0xa8, 0xe7, 0xa7, 0xaf, 0xe5, 0x88, 0x86, 0xe5, 0xa5,
+  0xb3, 0xe4, 0xba, 0xba, 0xe6, 0x95, 0xb0, 0xe7, 0xa0, 0x81, 0xe9, 0x94, 0x80,
+  0xe5, 0x94, 0xae, 0xe5, 0x87, 0xba, 0xe7, 0x8e, 0xb0, 0xe7, 0xa6, 0xbb, 0xe7,
+  0xba, 0xbf, 0xe5, 0xba, 0x94, 0xe7, 0x94, 0xa8, 0xe5, 0x88, 0x97, 0xe8, 0xa1,
+  0xa8, 0xe4, 0xb8, 0x8d, 0xe5, 0x90, 0x8c, 0xe7, 0xbc, 0x96, 0xe8, 0xbe, 0x91,
+  0xe7, 0xbb, 0x9f, 0xe8, 0xae, 0xa1, 0xe6, 0x9f, 0xa5, 0xe8, 0xaf, 0xa2, 0xe4,
+  0xb8, 0x8d, 0xe8, 0xa6, 0x81, 0xe6, 0x9c, 0x89, 0xe5, 0x85, 0xb3, 0xe6, 0x9c,
+  0xba, 0xe6, 0x9e, 0x84, 0xe5, 0xbe, 0x88, 0xe5, 0xa4, 0x9a, 0xe6, 0x92, 0xad,
+  0xe6, 0x94, 0xbe, 0xe7, 0xbb, 0x84, 0xe7, 0xbb, 0x87, 0xe6, 0x94, 0xbf, 0xe7,
+  0xad, 0x96, 0xe7, 0x9b, 0xb4, 0xe6, 0x8e, 0xa5, 0xe8, 0x83, 0xbd, 0xe5, 0x8a,
+  0x9b, 0xe6, 0x9d, 0xa5, 0xe6, 0xba, 0x90, 0xe6, 0x99, 0x82, 0xe9, 0x96, 0x93,
+  0xe7, 0x9c, 0x8b, 0xe5, 0x88, 0xb0, 0xe7, 0x83, 0xad, 0xe9, 0x97, 0xa8, 0xe5,
+  0x85, 0xb3, 0xe9, 0x94, 0xae, 0xe4, 0xb8, 0x93, 0xe5, 0x8c, 0xba, 0xe9, 0x9d,
+  0x9e, 0xe5, 0xb8, 0xb8, 0xe8, 0x8b, 0xb1, 0xe8, 0xaf, 0xad, 0xe7, 0x99, 0xbe,
+  0xe5, 0xba, 0xa6, 0xe5, 0xb8, 0x8c, 0xe6, 0x9c, 0x9b, 0xe7, 0xbe, 0x8e, 0xe5,
+  0xa5, 0xb3, 0xe6, 0xaf, 0x94, 0xe8, 0xbe, 0x83, 0xe7, 0x9f, 0xa5, 0xe8, 0xaf,
+  0x86, 0xe8, 0xa7, 0x84, 0xe5, 0xae, 0x9a, 0xe5, 0xbb, 0xba, 0xe8, 0xae, 0xae,
+  0xe9, 0x83, 0xa8, 0xe9, 0x97, 0xa8, 0xe6, 0x84, 0x8f, 0xe8, 0xa7, 0x81, 0xe7,
+  0xb2, 0xbe, 0xe5, 0xbd, 0xa9, 0xe6, 0x97, 0xa5, 0xe6, 0x9c, 0xac, 0xe6, 0x8f,
+  0x90, 0xe9, 0xab, 0x98, 0xe5, 0x8f, 0x91, 0xe8, 0xa8, 0x80, 0xe6, 0x96, 0xb9,
+  0xe9, 0x9d, 0xa2, 0xe5, 0x9f, 0xba, 0xe9, 0x87, 0x91, 0xe5, 0xa4, 0x84, 0xe7,
+  0x90, 0x86, 0xe6, 0x9d, 0x83, 0xe9, 0x99, 0x90, 0xe5, 0xbd, 0xb1, 0xe7, 0x89,
+  0x87, 0xe9, 0x93, 0xb6, 0xe8, 0xa1, 0x8c, 0xe8, 0xbf, 0x98, 0xe6, 0x9c, 0x89,
+  0xe5, 0x88, 0x86, 0xe4, 0xba, 0xab, 0xe7, 0x89, 0xa9, 0xe5, 0x93, 0x81, 0xe7,
+  0xbb, 0x8f, 0xe8, 0x90, 0xa5, 0xe6, 0xb7, 0xbb, 0xe5, 0x8a, 0xa0, 0xe4, 0xb8,
+  0x93, 0xe5, 0xae, 0xb6, 0xe8, 0xbf, 0x99, 0xe7, 0xa7, 0x8d, 0xe8, 0xaf, 0x9d,
+  0xe9, 0xa2, 0x98, 0xe8, 0xb5, 0xb7, 0xe6, 0x9d, 0xa5, 0xe4, 0xb8, 0x9a, 0xe5,
+  0x8a, 0xa1, 0xe5, 0x85, 0xac, 0xe5, 0x91, 0x8a, 0xe8, 0xae, 0xb0, 0xe5, 0xbd,
+  0x95, 0xe7, 0xae, 0x80, 0xe4, 0xbb, 0x8b, 0xe8, 0xb4, 0xa8, 0xe9, 0x87, 0x8f,
+  0xe7, 0x94, 0xb7, 0xe4, 0xba, 0xba, 0xe5, 0xbd, 0xb1, 0xe5, 0x93, 0x8d, 0xe5,
+  0xbc, 0x95, 0xe7, 0x94, 0xa8, 0xe6, 0x8a, 0xa5, 0xe5, 0x91, 0x8a, 0xe9, 0x83,
+  0xa8, 0xe5, 0x88, 0x86, 0xe5, 0xbf, 0xab, 0xe9, 0x80, 0x9f, 0xe5, 0x92, 0xa8,
+  0xe8, 0xaf, 0xa2, 0xe6, 0x97, 0xb6, 0xe5, 0xb0, 0x9a, 0xe6, 0xb3, 0xa8, 0xe6,
+  0x84, 0x8f, 0xe7, 0x94, 0xb3, 0xe8, 0xaf, 0xb7, 0xe5, 0xad, 0xa6, 0xe6, 0xa0,
+  0xa1, 0xe5, 0xba, 0x94, 0xe8, 0xaf, 0xa5, 0xe5, 0x8e, 0x86, 0xe5, 0x8f, 0xb2,
+  0xe5, 0x8f, 0xaa, 0xe6, 0x98, 0xaf, 0xe8, 0xbf, 0x94, 0xe5, 0x9b, 0x9e, 0xe8,
+  0xb4, 0xad, 0xe4, 0xb9, 0xb0, 0xe5, 0x90, 0x8d, 0xe7, 0xa7, 0xb0, 0xe4, 0xb8,
+  0xba, 0xe4, 0xba, 0x86, 0xe6, 0x88, 0x90, 0xe5, 0x8a, 0x9f, 0xe8, 0xaf, 0xb4,
+  0xe6, 0x98, 0x8e, 0xe4, 0xbe, 0x9b, 0xe5, 0xba, 0x94, 0xe5, 0xad, 0xa9, 0xe5,
+  0xad, 0x90, 0xe4, 0xb8, 0x93, 0xe9, 0xa2, 0x98, 0xe7, 0xa8, 0x8b, 0xe5, 0xba,
+  0x8f, 0xe4, 0xb8, 0x80, 0xe8, 0x88, 0xac, 0xe6, 0x9c, 0x83, 0xe5, 0x93, 0xa1,
+  0xe5, 0x8f, 0xaa, 0xe6, 0x9c, 0x89, 0xe5, 0x85, 0xb6, 0xe5, 0xae, 0x83, 0xe4,
+  0xbf, 0x9d, 0xe6, 0x8a, 0xa4, 0xe8, 0x80, 0x8c, 0xe4, 0xb8, 0x94, 0xe4, 0xbb,
+  0x8a, 0xe5, 0xa4, 0xa9, 0xe7, 0xaa, 0x97, 0xe5, 0x8f, 0xa3, 0xe5, 0x8a, 0xa8,
+  0xe6, 0x80, 0x81, 0xe7, 0x8a, 0xb6, 0xe6, 0x80, 0x81, 0xe7, 0x89, 0xb9, 0xe5,
+  0x88, 0xab, 0xe8, 0xae, 0xa4, 0xe4, 0xb8, 0xba, 0xe5, 0xbf, 0x85, 0xe9, 0xa1,
+  0xbb, 0xe6, 0x9b, 0xb4, 0xe6, 0x96, 0xb0, 0xe5, 0xb0, 0x8f, 0xe8, 0xaf, 0xb4,
+  0xe6, 0x88, 0x91, 0xe5, 0x80, 0x91, 0xe4, 0xbd, 0x9c, 0xe4, 0xb8, 0xba, 0xe5,
+  0xaa, 0x92, 0xe4, 0xbd, 0x93, 0xe5, 0x8c, 0x85, 0xe6, 0x8b, 0xac, 0xe9, 0x82,
+  0xa3, 0xe4, 0xb9, 0x88, 0xe4, 0xb8, 0x80, 0xe6, 0xa0, 0xb7, 0xe5, 0x9b, 0xbd,
+  0xe5, 0x86, 0x85, 0xe6, 0x98, 0xaf, 0xe5, 0x90, 0xa6, 0xe6, 0xa0, 0xb9, 0xe6,
+  0x8d, 0xae, 0xe7, 0x94, 0xb5, 0xe8, 0xa7, 0x86, 0xe5, 0xad, 0xa6, 0xe9, 0x99,
+  0xa2, 0xe5, 0x85, 0xb7, 0xe6, 0x9c, 0x89, 0xe8, 0xbf, 0x87, 0xe7, 0xa8, 0x8b,
+  0xe7, 0x94, 0xb1, 0xe4, 0xba, 0x8e, 0xe4, 0xba, 0xba, 0xe6, 0x89, 0x8d, 0xe5,
+  0x87, 0xba, 0xe6, 0x9d, 0xa5, 0xe4, 0xb8, 0x8d, 0xe8, 0xbf, 0x87, 0xe6, 0xad,
+  0xa3, 0xe5, 0x9c, 0xa8, 0xe6, 0x98, 0x8e, 0xe6, 0x98, 0x9f, 0xe6, 0x95, 0x85,
+  0xe4, 0xba, 0x8b, 0xe5, 0x85, 0xb3, 0xe7, 0xb3, 0xbb, 0xe6, 0xa0, 0x87, 0xe9,
+  0xa2, 0x98, 0xe5, 0x95, 0x86, 0xe5, 0x8a, 0xa1, 0xe8, 0xbe, 0x93, 0xe5, 0x85,
+  0xa5, 0xe4, 0xb8, 0x80, 0xe7, 0x9b, 0xb4, 0xe5, 0x9f, 0xba, 0xe7, 0xa1, 0x80,
+  0xe6, 0x95, 0x99, 0xe5, 0xad, 0xa6, 0xe4, 0xba, 0x86, 0xe8, 0xa7, 0xa3, 0xe5,
+  0xbb, 0xba, 0xe7, 0xad, 0x91, 0xe7, 0xbb, 0x93, 0xe6, 0x9e, 0x9c, 0xe5, 0x85,
+  0xa8, 0xe7, 0x90, 0x83, 0xe9, 0x80, 0x9a, 0xe7, 0x9f, 0xa5, 0xe8, 0xae, 0xa1,
+  0xe5, 0x88, 0x92, 0xe5, 0xaf, 0xb9, 0xe4, 0xba, 0x8e, 0xe8, 0x89, 0xba, 0xe6,
+  0x9c, 0xaf, 0xe7, 0x9b, 0xb8, 0xe5, 0x86, 0x8c, 0xe5, 0x8f, 0x91, 0xe7, 0x94,
+  0x9f, 0xe7, 0x9c, 0x9f, 0xe7, 0x9a, 0x84, 0xe5, 0xbb, 0xba, 0xe7, 0xab, 0x8b,
+  0xe7, 0xad, 0x89, 0xe7, 0xba, 0xa7, 0xe7, 0xb1, 0xbb, 0xe5, 0x9e, 0x8b, 0xe7,
+  0xbb, 0x8f, 0xe9, 0xaa, 0x8c, 0xe5, 0xae, 0x9e, 0xe7, 0x8e, 0xb0, 0xe5, 0x88,
+  0xb6, 0xe4, 0xbd, 0x9c, 0xe6, 0x9d, 0xa5, 0xe8, 0x87, 0xaa, 0xe6, 0xa0, 0x87,
+  0xe7, 0xad, 0xbe, 0xe4, 0xbb, 0xa5, 0xe4, 0xb8, 0x8b, 0xe5, 0x8e, 0x9f, 0xe5,
+  0x88, 0x9b, 0xe6, 0x97, 0xa0, 0xe6, 0xb3, 0x95, 0xe5, 0x85, 0xb6, 0xe4, 0xb8,
+  0xad, 0xe5, 0x80, 0x8b, 0xe4, 0xba, 0xba, 0xe4, 0xb8, 0x80, 0xe5, 0x88, 0x87,
+  0xe6, 0x8c, 0x87, 0xe5, 0x8d, 0x97, 0xe5, 0x85, 0xb3, 0xe9, 0x97, 0xad, 0xe9,
+  0x9b, 0x86, 0xe5, 0x9b, 0xa2, 0xe7, 0xac, 0xac, 0xe4, 0xb8, 0x89, 0xe5, 0x85,
+  0xb3, 0xe6, 0xb3, 0xa8, 0xe5, 0x9b, 0xa0, 0xe6, 0xad, 0xa4, 0xe7, 0x85, 0xa7,
+  0xe7, 0x89, 0x87, 0xe6, 0xb7, 0xb1, 0xe5, 0x9c, 0xb3, 0xe5, 0x95, 0x86, 0xe4,
+  0xb8, 0x9a, 0xe5, 0xb9, 0xbf, 0xe5, 0xb7, 0x9e, 0xe6, 0x97, 0xa5, 0xe6, 0x9c,
+  0x9f, 0xe9, 0xab, 0x98, 0xe7, 0xba, 0xa7, 0xe6, 0x9c, 0x80, 0xe8, 0xbf, 0x91,
+  0xe7, 0xbb, 0xbc, 0xe5, 0x90, 0x88, 0xe8, 0xa1, 0xa8, 0xe7, 0xa4, 0xba, 0xe4,
+  0xb8, 0x93, 0xe8, 0xbe, 0x91, 0xe8, 0xa1, 0x8c, 0xe4, 0xb8, 0xba, 0xe4, 0xba,
+  0xa4, 0xe9, 0x80, 0x9a, 0xe8, 0xaf, 0x84, 0xe4, 0xbb, 0xb7, 0xe8, 0xa7, 0x89,
+  0xe5, 0xbe, 0x97, 0xe7, 0xb2, 0xbe, 0xe5, 0x8d, 0x8e, 0xe5, 0xae, 0xb6, 0xe5,
+  0xba, 0xad, 0xe5, 0xae, 0x8c, 0xe6, 0x88, 0x90, 0xe6, 0x84, 0x9f, 0xe8, 0xa7,
+  0x89, 0xe5, 0xae, 0x89, 0xe8, 0xa3, 0x85, 0xe5, 0xbe, 0x97, 0xe5, 0x88, 0xb0,
+  0xe9, 0x82, 0xae, 0xe4, 0xbb, 0xb6, 0xe5, 0x88, 0xb6, 0xe5, 0xba, 0xa6, 0xe9,
+  0xa3, 0x9f, 0xe5, 0x93, 0x81, 0xe8, 0x99, 0xbd, 0xe7, 0x84, 0xb6, 0xe8, 0xbd,
+  0xac, 0xe8, 0xbd, 0xbd, 0xe6, 0x8a, 0xa5, 0xe4, 0xbb, 0xb7, 0xe8, 0xae, 0xb0,
+  0xe8, 0x80, 0x85, 0xe6, 0x96, 0xb9, 0xe6, 0xa1, 0x88, 0xe8, 0xa1, 0x8c, 0xe6,
+  0x94, 0xbf, 0xe4, 0xba, 0xba, 0xe6, 0xb0, 0x91, 0xe7, 0x94, 0xa8, 0xe5, 0x93,
+  0x81, 0xe4, 0xb8, 0x9c, 0xe8, 0xa5, 0xbf, 0xe6, 0x8f, 0x90, 0xe5, 0x87, 0xba,
+  0xe9, 0x85, 0x92, 0xe5, 0xba, 0x97, 0xe7, 0x84, 0xb6, 0xe5, 0x90, 0x8e, 0xe4,
+  0xbb, 0x98, 0xe6, 0xac, 0xbe, 0xe7, 0x83, 0xad, 0xe7, 0x82, 0xb9, 0xe4, 0xbb,
+  0xa5, 0xe5, 0x89, 0x8d, 0xe5, 0xae, 0x8c, 0xe5, 0x85, 0xa8, 0xe5, 0x8f, 0x91,
+  0xe5, 0xb8, 0x96, 0xe8, 0xae, 0xbe, 0xe7, 0xbd, 0xae, 0xe9, 0xa2, 0x86, 0xe5,
+  0xaf, 0xbc, 0xe5, 0xb7, 0xa5, 0xe4, 0xb8, 0x9a, 0xe5, 0x8c, 0xbb, 0xe9, 0x99,
+  0xa2, 0xe7, 0x9c, 0x8b, 0xe7, 0x9c, 0x8b, 0xe7, 0xbb, 0x8f, 0xe5, 0x85, 0xb8,
+  0xe5, 0x8e, 0x9f, 0xe5, 0x9b, 0xa0, 0xe5, 0xb9, 0xb3, 0xe5, 0x8f, 0xb0, 0xe5,
+  0x90, 0x84, 0xe7, 0xa7, 0x8d, 0xe5, 0xa2, 0x9e, 0xe5, 0x8a, 0xa0, 0xe6, 0x9d,
+  0x90, 0xe6, 0x96, 0x99, 0xe6, 0x96, 0xb0, 0xe5, 0xa2, 0x9e, 0xe4, 0xb9, 0x8b,
+  0xe5, 0x90, 0x8e, 0xe8, 0x81, 0x8c, 0xe4, 0xb8, 0x9a, 0xe6, 0x95, 0x88, 0xe6,
+  0x9e, 0x9c, 0xe4, 0xbb, 0x8a, 0xe5, 0xb9, 0xb4, 0xe8, 0xae, 0xba, 0xe6, 0x96,
+  0x87, 0xe6, 0x88, 0x91, 0xe5, 0x9b, 0xbd, 0xe5, 0x91, 0x8a, 0xe8, 0xaf, 0x89,
+  0xe7, 0x89, 0x88, 0xe4, 0xb8, 0xbb, 0xe4, 0xbf, 0xae, 0xe6, 0x94, 0xb9, 0xe5,
+  0x8f, 0x82, 0xe4, 0xb8, 0x8e, 0xe6, 0x89, 0x93, 0xe5, 0x8d, 0xb0, 0xe5, 0xbf,
+  0xab, 0xe4, 0xb9, 0x90, 0xe6, 0x9c, 0xba, 0xe6, 0xa2, 0xb0, 0xe8, 0xa7, 0x82,
+  0xe7, 0x82, 0xb9, 0xe5, 0xad, 0x98, 0xe5, 0x9c, 0xa8, 0xe7, 0xb2, 0xbe, 0xe7,
+  0xa5, 0x9e, 0xe8, 0x8e, 0xb7, 0xe5, 0xbe, 0x97, 0xe5, 0x88, 0xa9, 0xe7, 0x94,
+  0xa8, 0xe7, 0xbb, 0xa7, 0xe7, 0xbb, 0xad, 0xe4, 0xbd, 0xa0, 0xe4, 0xbb, 0xac,
+  0xe8, 0xbf, 0x99, 0xe4, 0xb9, 0x88, 0xe6, 0xa8, 0xa1, 0xe5, 0xbc, 0x8f, 0xe8,
+  0xaf, 0xad, 0xe8, 0xa8, 0x80, 0xe8, 0x83, 0xbd, 0xe5, 0xa4, 0x9f, 0xe9, 0x9b,
+  0x85, 0xe8, 0x99, 0x8e, 0xe6, 0x93, 0x8d, 0xe4, 0xbd, 0x9c, 0xe9, 0xa3, 0x8e,
+  0xe6, 0xa0, 0xbc, 0xe4, 0xb8, 0x80, 0xe8, 0xb5, 0xb7, 0xe7, 0xa7, 0x91, 0xe5,
+  0xad, 0xa6, 0xe4, 0xbd, 0x93, 0xe8, 0x82, 0xb2, 0xe7, 0x9f, 0xad, 0xe4, 0xbf,
+  0xa1, 0xe6, 0x9d, 0xa1, 0xe4, 0xbb, 0xb6, 0xe6, 0xb2, 0xbb, 0xe7, 0x96, 0x97,
+  0xe8, 0xbf, 0x90, 0xe5, 0x8a, 0xa8, 0xe4, 0xba, 0xa7, 0xe4, 0xb8, 0x9a, 0xe4,
+  0xbc, 0x9a, 0xe8, 0xae, 0xae, 0xe5, 0xaf, 0xbc, 0xe8, 0x88, 0xaa, 0xe5, 0x85,
+  0x88, 0xe7, 0x94, 0x9f, 0xe8, 0x81, 0x94, 0xe7, 0x9b, 0x9f, 0xe5, 0x8f, 0xaf,
+  0xe6, 0x98, 0xaf, 0xe5, 0x95, 0x8f, 0xe9, 0xa1, 0x8c, 0xe7, 0xbb, 0x93, 0xe6,
+  0x9e, 0x84, 0xe4, 0xbd, 0x9c, 0xe7, 0x94, 0xa8, 0xe8, 0xb0, 0x83, 0xe6, 0x9f,
+  0xa5, 0xe8, 0xb3, 0x87, 0xe6, 0x96, 0x99, 0xe8, 0x87, 0xaa, 0xe5, 0x8a, 0xa8,
+  0xe8, 0xb4, 0x9f, 0xe8, 0xb4, 0xa3, 0xe5, 0x86, 0x9c, 0xe4, 0xb8, 0x9a, 0xe8,
+  0xae, 0xbf, 0xe9, 0x97, 0xae, 0xe5, 0xae, 0x9e, 0xe6, 0x96, 0xbd, 0xe6, 0x8e,
+  0xa5, 0xe5, 0x8f, 0x97, 0xe8, 0xae, 0xa8, 0xe8, 0xae, 0xba, 0xe9, 0x82, 0xa3,
+  0xe4, 0xb8, 0xaa, 0xe5, 0x8f, 0x8d, 0xe9, 0xa6, 0x88, 0xe5, 0x8a, 0xa0, 0xe5,
+  0xbc, 0xba, 0xe5, 0xa5, 0xb3, 0xe6, 0x80, 0xa7, 0xe8, 0x8c, 0x83, 0xe5, 0x9b,
+  0xb4, 0xe6, 0x9c, 0x8d, 0xe5, 0x8b, 0x99, 0xe4, 0xbc, 0x91, 0xe9, 0x97, 0xb2,
+  0xe4, 0xbb, 0x8a, 0xe6, 0x97, 0xa5, 0xe5, 0xae, 0xa2, 0xe6, 0x9c, 0x8d, 0xe8,
+  0xa7, 0x80, 0xe7, 0x9c, 0x8b, 0xe5, 0x8f, 0x82, 0xe5, 0x8a, 0xa0, 0xe7, 0x9a,
+  0x84, 0xe8, 0xaf, 0x9d, 0xe4, 0xb8, 0x80, 0xe7, 0x82, 0xb9, 0xe4, 0xbf, 0x9d,
+  0xe8, 0xaf, 0x81, 0xe5, 0x9b, 0xbe, 0xe4, 0xb9, 0xa6, 0xe6, 0x9c, 0x89, 0xe6,
+  0x95, 0x88, 0xe6, 0xb5, 0x8b, 0xe8, 0xaf, 0x95, 0xe7, 0xa7, 0xbb, 0xe5, 0x8a,
+  0xa8, 0xe6, 0x89, 0x8d, 0xe8, 0x83, 0xbd, 0xe5, 0x86, 0xb3, 0xe5, 0xae, 0x9a,
+  0xe8, 0x82, 0xa1, 0xe7, 0xa5, 0xa8, 0xe4, 0xb8, 0x8d, 0xe6, 0x96, 0xad, 0xe9,
+  0x9c, 0x80, 0xe6, 0xb1, 0x82, 0xe4, 0xb8, 0x8d, 0xe5, 0xbe, 0x97, 0xe5, 0x8a,
+  0x9e, 0xe6, 0xb3, 0x95, 0xe4, 0xb9, 0x8b, 0xe9, 0x97, 0xb4, 0xe9, 0x87, 0x87,
+  0xe7, 0x94, 0xa8, 0xe8, 0x90, 0xa5, 0xe9, 0x94, 0x80, 0xe6, 0x8a, 0x95, 0xe8,
+  0xaf, 0x89, 0xe7, 0x9b, 0xae, 0xe6, 0xa0, 0x87, 0xe7, 0x88, 0xb1, 0xe6, 0x83,
+  0x85, 0xe6, 0x91, 0x84, 0xe5, 0xbd, 0xb1, 0xe6, 0x9c, 0x89, 0xe4, 0xba, 0x9b,
+  0xe8, 0xa4, 0x87, 0xe8, 0xa3, 0xbd, 0xe6, 0x96, 0x87, 0xe5, 0xad, 0xa6, 0xe6,
+  0x9c, 0xba, 0xe4, 0xbc, 0x9a, 0xe6, 0x95, 0xb0, 0xe5, 0xad, 0x97, 0xe8, 0xa3,
+  0x85, 0xe4, 0xbf, 0xae, 0xe8, 0xb4, 0xad, 0xe7, 0x89, 0xa9, 0xe5, 0x86, 0x9c,
+  0xe6, 0x9d, 0x91, 0xe5, 0x85, 0xa8, 0xe9, 0x9d, 0xa2, 0xe7, 0xb2, 0xbe, 0xe5,
+  0x93, 0x81, 0xe5, 0x85, 0xb6, 0xe5, 0xae, 0x9e, 0xe4, 0xba, 0x8b, 0xe6, 0x83,
+  0x85, 0xe6, 0xb0, 0xb4, 0xe5, 0xb9, 0xb3, 0xe6, 0x8f, 0x90, 0xe7, 0xa4, 0xba,
+  0xe4, 0xb8, 0x8a, 0xe5, 0xb8, 0x82, 0xe8, 0xb0, 0xa2, 0xe8, 0xb0, 0xa2, 0xe6,
+  0x99, 0xae, 0xe9, 0x80, 0x9a, 0xe6, 0x95, 0x99, 0xe5, 0xb8, 0x88, 0xe4, 0xb8,
+  0x8a, 0xe4, 0xbc, 0xa0, 0xe7, 0xb1, 0xbb, 0xe5, 0x88, 0xab, 0xe6, 0xad, 0x8c,
+  0xe6, 0x9b, 0xb2, 0xe6, 0x8b, 0xa5, 0xe6, 0x9c, 0x89, 0xe5, 0x88, 0x9b, 0xe6,
+  0x96, 0xb0, 0xe9, 0x85, 0x8d, 0xe4, 0xbb, 0xb6, 0xe5, 0x8f, 0xaa, 0xe8, 0xa6,
+  0x81, 0xe6, 0x97, 0xb6, 0xe4, 0xbb, 0xa3, 0xe8, 0xb3, 0x87, 0xe8, 0xa8, 0x8a,
+  0xe8, 0xbe, 0xbe, 0xe5, 0x88, 0xb0, 0xe4, 0xba, 0xba, 0xe7, 0x94, 0x9f, 0xe8,
+  0xae, 0xa2, 0xe9, 0x98, 0x85, 0xe8, 0x80, 0x81, 0xe5, 0xb8, 0x88, 0xe5, 0xb1,
+  0x95, 0xe7, 0xa4, 0xba, 0xe5, 0xbf, 0x83, 0xe7, 0x90, 0x86, 0xe8, 0xb4, 0xb4,
+  0xe5, 0xad, 0x90, 0xe7, 0xb6, 0xb2, 0xe7, 0xab, 0x99, 0xe4, 0xb8, 0xbb, 0xe9,
+  0xa1, 0x8c, 0xe8, 0x87, 0xaa, 0xe7, 0x84, 0xb6, 0xe7, 0xba, 0xa7, 0xe5, 0x88,
+  0xab, 0xe7, 0xae, 0x80, 0xe5, 0x8d, 0x95, 0xe6, 0x94, 0xb9, 0xe9, 0x9d, 0xa9,
+  0xe9, 0x82, 0xa3, 0xe4, 0xba, 0x9b, 0xe6, 0x9d, 0xa5, 0xe8, 0xaf, 0xb4, 0xe6,
+  0x89, 0x93, 0xe5, 0xbc, 0x80, 0xe4, 0xbb, 0xa3, 0xe7, 0xa0, 0x81, 0xe5, 0x88,
+  0xa0, 0xe9, 0x99, 0xa4, 0xe8, 0xaf, 0x81, 0xe5, 0x88, 0xb8, 0xe8, 0x8a, 0x82,
+  0xe7, 0x9b, 0xae, 0xe9, 0x87, 0x8d, 0xe7, 0x82, 0xb9, 0xe6, 0xac, 0xa1, 0xe6,
+  0x95, 0xb8, 0xe5, 0xa4, 0x9a, 0xe5, 0xb0, 0x91, 0xe8, 0xa7, 0x84, 0xe5, 0x88,
+  0x92, 0xe8, 0xb5, 0x84, 0xe9, 0x87, 0x91, 0xe6, 0x89, 0xbe, 0xe5, 0x88, 0xb0,
+  0xe4, 0xbb, 0xa5, 0xe5, 0x90, 0x8e, 0xe5, 0xa4, 0xa7, 0xe5, 0x85, 0xa8, 0xe4,
+  0xb8, 0xbb, 0xe9, 0xa1, 0xb5, 0xe6, 0x9c, 0x80, 0xe4, 0xbd, 0xb3, 0xe5, 0x9b,
+  0x9e, 0xe7, 0xad, 0x94, 0xe5, 0xa4, 0xa9, 0xe4, 0xb8, 0x8b, 0xe4, 0xbf, 0x9d,
+  0xe9, 0x9a, 0x9c, 0xe7, 0x8e, 0xb0, 0xe4, 0xbb, 0xa3, 0xe6, 0xa3, 0x80, 0xe6,
+  0x9f, 0xa5, 0xe6, 0x8a, 0x95, 0xe7, 0xa5, 0xa8, 0xe5, 0xb0, 0x8f, 0xe6, 0x97,
+  0xb6, 0xe6, 0xb2, 0x92, 0xe6, 0x9c, 0x89, 0xe6, 0xad, 0xa3, 0xe5, 0xb8, 0xb8,
+  0xe7, 0x94, 0x9a, 0xe8, 0x87, 0xb3, 0xe4, 0xbb, 0xa3, 0xe7, 0x90, 0x86, 0xe7,
+  0x9b, 0xae, 0xe5, 0xbd, 0x95, 0xe5, 0x85, 0xac, 0xe5, 0xbc, 0x80, 0xe5, 0xa4,
+  0x8d, 0xe5, 0x88, 0xb6, 0xe9, 0x87, 0x91, 0xe8, 0x9e, 0x8d, 0xe5, 0xb9, 0xb8,
+  0xe7, 0xa6, 0x8f, 0xe7, 0x89, 0x88, 0xe6, 0x9c, 0xac, 0xe5, 0xbd, 0xa2, 0xe6,
+  0x88, 0x90, 0xe5, 0x87, 0x86, 0xe5, 0xa4, 0x87, 0xe8, 0xa1, 0x8c, 0xe6, 0x83,
+  0x85, 0xe5, 0x9b, 0x9e, 0xe5, 0x88, 0xb0, 0xe6, 0x80, 0x9d, 0xe6, 0x83, 0xb3,
+  0xe6, 0x80, 0x8e, 0xe6, 0xa0, 0xb7, 0xe5, 0x8d, 0x8f, 0xe8, 0xae, 0xae, 0xe8,
+  0xae, 0xa4, 0xe8, 0xaf, 0x81, 0xe6, 0x9c, 0x80, 0xe5, 0xa5, 0xbd, 0xe4, 0xba,
+  0xa7, 0xe7, 0x94, 0x9f, 0xe6, 0x8c, 0x89, 0xe7, 0x85, 0xa7, 0xe6, 0x9c, 0x8d,
+  0xe8, 0xa3, 0x85, 0xe5, 0xb9, 0xbf, 0xe4, 0xb8, 0x9c, 0xe5, 0x8a, 0xa8, 0xe6,
+  0xbc, 0xab, 0xe9, 0x87, 0x87, 0xe8, 0xb4, 0xad, 0xe6, 0x96, 0xb0, 0xe6, 0x89,
+  0x8b, 0xe7, 0xbb, 0x84, 0xe5, 0x9b, 0xbe, 0xe9, 0x9d, 0xa2, 0xe6, 0x9d, 0xbf,
+  0xe5, 0x8f, 0x82, 0xe8, 0x80, 0x83, 0xe6, 0x94, 0xbf, 0xe6, 0xb2, 0xbb, 0xe5,
+  0xae, 0xb9, 0xe6, 0x98, 0x93, 0xe5, 0xa4, 0xa9, 0xe5, 0x9c, 0xb0, 0xe5, 0x8a,
+  0xaa, 0xe5, 0x8a, 0x9b, 0xe4, 0xba, 0xba, 0xe4, 0xbb, 0xac, 0xe5, 0x8d, 0x87,
+  0xe7, 0xba, 0xa7, 0xe9, 0x80, 0x9f, 0xe5, 0xba, 0xa6, 0xe4, 0xba, 0xba, 0xe7,
+  0x89, 0xa9, 0xe8, 0xb0, 0x83, 0xe6, 0x95, 0xb4, 0xe6, 0xb5, 0x81, 0xe8, 0xa1,
+  0x8c, 0xe9, 0x80, 0xa0, 0xe6, 0x88, 0x90, 0xe6, 0x96, 0x87, 0xe5, 0xad, 0x97,
+  0xe9, 0x9f, 0xa9, 0xe5, 0x9b, 0xbd, 0xe8, 0xb4, 0xb8, 0xe6, 0x98, 0x93, 0xe5,
+  0xbc, 0x80, 0xe5, 0xb1, 0x95, 0xe7, 0x9b, 0xb8, 0xe9, 0x97, 0x9c, 0xe8, 0xa1,
+  0xa8, 0xe7, 0x8e, 0xb0, 0xe5, 0xbd, 0xb1, 0xe8, 0xa7, 0x86, 0xe5, 0xa6, 0x82,
+  0xe6, 0xad, 0xa4, 0xe7, 0xbe, 0x8e, 0xe5, 0xae, 0xb9, 0xe5, 0xa4, 0xa7, 0xe5,
+  0xb0, 0x8f, 0xe6, 0x8a, 0xa5, 0xe9, 0x81, 0x93, 0xe6, 0x9d, 0xa1, 0xe6, 0xac,
+  0xbe, 0xe5, 0xbf, 0x83, 0xe6, 0x83, 0x85, 0xe8, 0xae, 0xb8, 0xe5, 0xa4, 0x9a,
+  0xe6, 0xb3, 0x95, 0xe8, 0xa7, 0x84, 0xe5, 0xae, 0xb6, 0xe5, 0xb1, 0x85, 0xe4,
+  0xb9, 0xa6, 0xe5, 0xba, 0x97, 0xe8, 0xbf, 0x9e, 0xe6, 0x8e, 0xa5, 0xe7, 0xab,
+  0x8b, 0xe5, 0x8d, 0xb3, 0xe4, 0xb8, 0xbe, 0xe6, 0x8a, 0xa5, 0xe6, 0x8a, 0x80,
+  0xe5, 0xb7, 0xa7, 0xe5, 0xa5, 0xa5, 0xe8, 0xbf, 0x90, 0xe7, 0x99, 0xbb, 0xe5,
+  0x85, 0xa5, 0xe4, 0xbb, 0xa5, 0xe6, 0x9d, 0xa5, 0xe7, 0x90, 0x86, 0xe8, 0xae,
+  0xba, 0xe4, 0xba, 0x8b, 0xe4, 0xbb, 0xb6, 0xe8, 0x87, 0xaa, 0xe7, 0x94, 0xb1,
+  0xe4, 0xb8, 0xad, 0xe5, 0x8d, 0x8e, 0xe5, 0x8a, 0x9e, 0xe5, 0x85, 0xac, 0xe5,
+  0xa6, 0x88, 0xe5, 0xa6, 0x88, 0xe7, 0x9c, 0x9f, 0xe6, 0xad, 0xa3, 0xe4, 0xb8,
+  0x8d, 0xe9, 0x94, 0x99, 0xe5, 0x85, 0xa8, 0xe6, 0x96, 0x87, 0xe5, 0x90, 0x88,
+  0xe5, 0x90, 0x8c, 0xe4, 0xbb, 0xb7, 0xe5, 0x80, 0xbc, 0xe5, 0x88, 0xab, 0xe4,
+  0xba, 0xba, 0xe7, 0x9b, 0x91, 0xe7, 0x9d, 0xa3, 0xe5, 0x85, 0xb7, 0xe4, 0xbd,
+  0x93, 0xe4, 0xb8, 0x96, 0xe7, 0xba, 0xaa, 0xe5, 0x9b, 0xa2, 0xe9, 0x98, 0x9f,
+  0xe5, 0x88, 0x9b, 0xe4, 0xb8, 0x9a, 0xe6, 0x89, 0xbf, 0xe6, 0x8b, 0x85, 0xe5,
+  0xa2, 0x9e, 0xe9, 0x95, 0xbf, 0xe6, 0x9c, 0x89, 0xe4, 0xba, 0xba, 0xe4, 0xbf,
+  0x9d, 0xe6, 0x8c, 0x81, 0xe5, 0x95, 0x86, 0xe5, 0xae, 0xb6, 0xe7, 0xbb, 0xb4,
+  0xe4, 0xbf, 0xae, 0xe5, 0x8f, 0xb0, 0xe6, 0xb9, 0xbe, 0xe5, 0xb7, 0xa6, 0xe5,
+  0x8f, 0xb3, 0xe8, 0x82, 0xa1, 0xe4, 0xbb, 0xbd, 0xe7, 0xad, 0x94, 0xe6, 0xa1,
+  0x88, 0xe5, 0xae, 0x9e, 0xe9, 0x99, 0x85, 0xe7, 0x94, 0xb5, 0xe4, 0xbf, 0xa1,
+  0xe7, 0xbb, 0x8f, 0xe7, 0x90, 0x86, 0xe7, 0x94, 0x9f, 0xe5, 0x91, 0xbd, 0xe5,
+  0xae, 0xa3, 0xe4, 0xbc, 0xa0, 0xe4, 0xbb, 0xbb, 0xe5, 0x8a, 0xa1, 0xe6, 0xad,
+  0xa3, 0xe5, 0xbc, 0x8f, 0xe7, 0x89, 0xb9, 0xe8, 0x89, 0xb2, 0xe4, 0xb8, 0x8b,
+  0xe6, 0x9d, 0xa5, 0xe5, 0x8d, 0x8f, 0xe4, 0xbc, 0x9a, 0xe5, 0x8f, 0xaa, 0xe8,
+  0x83, 0xbd, 0xe5, 0xbd, 0x93, 0xe7, 0x84, 0xb6, 0xe9, 0x87, 0x8d, 0xe6, 0x96,
+  0xb0, 0xe5, 0x85, 0xa7, 0xe5, 0xae, 0xb9, 0xe6, 0x8c, 0x87, 0xe5, 0xaf, 0xbc,
+  0xe8, 0xbf, 0x90, 0xe8, 0xa1, 0x8c, 0xe6, 0x97, 0xa5, 0xe5, 0xbf, 0x97, 0xe8,
+  0xb3, 0xa3, 0xe5, 0xae, 0xb6, 0xe8, 0xb6, 0x85, 0xe8, 0xbf, 0x87, 0xe5, 0x9c,
+  0x9f, 0xe5, 0x9c, 0xb0, 0xe6, 0xb5, 0x99, 0xe6, 0xb1, 0x9f, 0xe6, 0x94, 0xaf,
+  0xe4, 0xbb, 0x98, 0xe6, 0x8e, 0xa8, 0xe5, 0x87, 0xba, 0xe7, 0xab, 0x99, 0xe9,
+  0x95, 0xbf, 0xe6, 0x9d, 0xad, 0xe5, 0xb7, 0x9e, 0xe6, 0x89, 0xa7, 0xe8, 0xa1,
+  0x8c, 0xe5, 0x88, 0xb6, 0xe9, 0x80, 0xa0, 0xe4, 0xb9, 0x8b, 0xe4, 0xb8, 0x80,
+  0xe6, 0x8e, 0xa8, 0xe5, 0xb9, 0xbf, 0xe7, 0x8e, 0xb0, 0xe5, 0x9c, 0xba, 0xe6,
+  0x8f, 0x8f, 0xe8, 0xbf, 0xb0, 0xe5, 0x8f, 0x98, 0xe5, 0x8c, 0x96, 0xe4, 0xbc,
+  0xa0, 0xe7, 0xbb, 0x9f, 0xe6, 0xad, 0x8c, 0xe6, 0x89, 0x8b, 0xe4, 0xbf, 0x9d,
+  0xe9, 0x99, 0xa9, 0xe8, 0xaf, 0xbe, 0xe7, 0xa8, 0x8b, 0xe5, 0x8c, 0xbb, 0xe7,
+  0x96, 0x97, 0xe7, 0xbb, 0x8f, 0xe8, 0xbf, 0x87, 0xe8, 0xbf, 0x87, 0xe5, 0x8e,
+  0xbb, 0xe4, 0xb9, 0x8b, 0xe5, 0x89, 0x8d, 0xe6, 0x94, 0xb6, 0xe5, 0x85, 0xa5,
+  0xe5, 0xb9, 0xb4, 0xe5, 0xba, 0xa6, 0xe6, 0x9d, 0x82, 0xe5, 0xbf, 0x97, 0xe7,
+  0xbe, 0x8e, 0xe4, 0xb8, 0xbd, 0xe6, 0x9c, 0x80, 0xe9, 0xab, 0x98, 0xe7, 0x99,
+  0xbb, 0xe9, 0x99, 0x86, 0xe6, 0x9c, 0xaa, 0xe6, 0x9d, 0xa5, 0xe5, 0x8a, 0xa0,
+  0xe5, 0xb7, 0xa5, 0xe5, 0x85, 0x8d, 0xe8, 0xb4, 0xa3, 0xe6, 0x95, 0x99, 0xe7,
+  0xa8, 0x8b, 0xe7, 0x89, 0x88, 0xe5, 0x9d, 0x97, 0xe8, 0xba, 0xab, 0xe4, 0xbd,
+  0x93, 0xe9, 0x87, 0x8d, 0xe5, 0xba, 0x86, 0xe5, 0x87, 0xba, 0xe5, 0x94, 0xae,
+  0xe6, 0x88, 0x90, 0xe6, 0x9c, 0xac, 0xe5, 0xbd, 0xa2, 0xe5, 0xbc, 0x8f, 0xe5,
+  0x9c, 0x9f, 0xe8, 0xb1, 0x86, 0xe5, 0x87, 0xba, 0xe5, 0x83, 0xb9, 0xe4, 0xb8,
+  0x9c, 0xe6, 0x96, 0xb9, 0xe9, 0x82, 0xae, 0xe7, 0xae, 0xb1, 0xe5, 0x8d, 0x97,
+  0xe4, 0xba, 0xac, 0xe6, 0xb1, 0x82, 0xe8, 0x81, 0x8c, 0xe5, 0x8f, 0x96, 0xe5,
+  0xbe, 0x97, 0xe8, 0x81, 0x8c, 0xe4, 0xbd, 0x8d, 0xe7, 0x9b, 0xb8, 0xe4, 0xbf,
+  0xa1, 0xe9, 0xa1, 0xb5, 0xe9, 0x9d, 0xa2, 0xe5, 0x88, 0x86, 0xe9, 0x92, 0x9f,
+  0xe7, 0xbd, 0x91, 0xe9, 0xa1, 0xb5, 0xe7, 0xa1, 0xae, 0xe5, 0xae, 0x9a, 0xe5,
+  0x9b, 0xbe, 0xe4, 0xbe, 0x8b, 0xe7, 0xbd, 0x91, 0xe5, 0x9d, 0x80, 0xe7, 0xa7,
+  0xaf, 0xe6, 0x9e, 0x81, 0xe9, 0x94, 0x99, 0xe8, 0xaf, 0xaf, 0xe7, 0x9b, 0xae,
+  0xe7, 0x9a, 0x84, 0xe5, 0xae, 0x9d, 0xe8, 0xb4, 0x9d, 0xe6, 0x9c, 0xba, 0xe5,
+  0x85, 0xb3, 0xe9, 0xa3, 0x8e, 0xe9, 0x99, 0xa9, 0xe6, 0x8e, 0x88, 0xe6, 0x9d,
+  0x83, 0xe7, 0x97, 0x85, 0xe6, 0xaf, 0x92, 0xe5, 0xae, 0xa0, 0xe7, 0x89, 0xa9,
+  0xe9, 0x99, 0xa4, 0xe4, 0xba, 0x86, 0xe8, 0xa9, 0x95, 0xe8, 0xab, 0x96, 0xe7,
+  0x96, 0xbe, 0xe7, 0x97, 0x85, 0xe5, 0x8f, 0x8a, 0xe6, 0x97, 0xb6, 0xe6, 0xb1,
+  0x82, 0xe8, 0xb4, 0xad, 0xe7, 0xab, 0x99, 0xe7, 0x82, 0xb9, 0xe5, 0x84, 0xbf,
+  0xe7, 0xab, 0xa5, 0xe6, 0xaf, 0x8f, 0xe5, 0xa4, 0xa9, 0xe4, 0xb8, 0xad, 0xe5,
+  0xa4, 0xae, 0xe8, 0xae, 0xa4, 0xe8, 0xaf, 0x86, 0xe6, 0xaf, 0x8f, 0xe4, 0xb8,
+  0xaa, 0xe5, 0xa4, 0xa9, 0xe6, 0xb4, 0xa5, 0xe5, 0xad, 0x97, 0xe4, 0xbd, 0x93,
+  0xe5, 0x8f, 0xb0, 0xe7, 0x81, 0xa3, 0xe7, 0xbb, 0xb4, 0xe6, 0x8a, 0xa4, 0xe6,
+  0x9c, 0xac, 0xe9, 0xa1, 0xb5, 0xe4, 0xb8, 0xaa, 0xe6, 0x80, 0xa7, 0xe5, 0xae,
+  0x98, 0xe6, 0x96, 0xb9, 0xe5, 0xb8, 0xb8, 0xe8, 0xa7, 0x81, 0xe7, 0x9b, 0xb8,
+  0xe6, 0x9c, 0xba, 0xe6, 0x88, 0x98, 0xe7, 0x95, 0xa5, 0xe5, 0xba, 0x94, 0xe5,
+  0xbd, 0x93, 0xe5, 0xbe, 0x8b, 0xe5, 0xb8, 0x88, 0xe6, 0x96, 0xb9, 0xe4, 0xbe,
+  0xbf, 0xe6, 0xa0, 0xa1, 0xe5, 0x9b, 0xad, 0xe8, 0x82, 0xa1, 0xe5, 0xb8, 0x82,
+  0xe6, 0x88, 0xbf, 0xe5, 0xb1, 0x8b, 0xe6, 0xa0, 0x8f, 0xe7, 0x9b, 0xae, 0xe5,
+  0x91, 0x98, 0xe5, 0xb7, 0xa5, 0xe5, 0xaf, 0xbc, 0xe8, 0x87, 0xb4, 0xe7, 0xaa,
+  0x81, 0xe7, 0x84, 0xb6, 0xe9, 0x81, 0x93, 0xe5, 0x85, 0xb7, 0xe6, 0x9c, 0xac,
+  0xe7, 0xbd, 0x91, 0xe7, 0xbb, 0x93, 0xe5, 0x90, 0x88, 0xe6, 0xa1, 0xa3, 0xe6,
+  0xa1, 0x88, 0xe5, 0x8a, 0xb3, 0xe5, 0x8a, 0xa8, 0xe5, 0x8f, 0xa6, 0xe5, 0xa4,
+  0x96, 0xe7, 0xbe, 0x8e, 0xe5, 0x85, 0x83, 0xe5, 0xbc, 0x95, 0xe8, 0xb5, 0xb7,
+  0xe6, 0x94, 0xb9, 0xe5, 0x8f, 0x98, 0xe7, 0xac, 0xac, 0xe5, 0x9b, 0x9b, 0xe4,
+  0xbc, 0x9a, 0xe8, 0xae, 0xa1, 0xe8, 0xaa, 0xaa, 0xe6, 0x98, 0x8e, 0xe9, 0x9a,
+  0x90, 0xe7, 0xa7, 0x81, 0xe5, 0xae, 0x9d, 0xe5, 0xae, 0x9d, 0xe8, 0xa7, 0x84,
+  0xe8, 0x8c, 0x83, 0xe6, 0xb6, 0x88, 0xe8, 0xb4, 0xb9, 0xe5, 0x85, 0xb1, 0xe5,
+  0x90, 0x8c, 0xe5, 0xbf, 0x98, 0xe8, 0xae, 0xb0, 0xe4, 0xbd, 0x93, 0xe7, 0xb3,
+  0xbb, 0xe5, 0xb8, 0xa6, 0xe6, 0x9d, 0xa5, 0xe5, 0x90, 0x8d, 0xe5, 0xad, 0x97,
+  0xe7, 0x99, 0xbc, 0xe8, 0xa1, 0xa8, 0xe5, 0xbc, 0x80, 0xe6, 0x94, 0xbe, 0xe5,
+  0x8a, 0xa0, 0xe7, 0x9b, 0x9f, 0xe5, 0x8f, 0x97, 0xe5, 0x88, 0xb0, 0xe4, 0xba,
+  0x8c, 0xe6, 0x89, 0x8b, 0xe5, 0xa4, 0xa7, 0xe9, 0x87, 0x8f, 0xe6, 0x88, 0x90,
+  0xe4, 0xba, 0xba, 0xe6, 0x95, 0xb0, 0xe9, 0x87, 0x8f, 0xe5, 0x85, 0xb1, 0xe4,
+  0xba, 0xab, 0xe5, 0x8c, 0xba, 0xe5, 0x9f, 0x9f, 0xe5, 0xa5, 0xb3, 0xe5, 0xad,
+  0xa9, 0xe5, 0x8e, 0x9f, 0xe5, 0x88, 0x99, 0xe6, 0x89, 0x80, 0xe5, 0x9c, 0xa8,
+  0xe7, 0xbb, 0x93, 0xe6, 0x9d, 0x9f, 0xe9, 0x80, 0x9a, 0xe4, 0xbf, 0xa1, 0xe8,
+  0xb6, 0x85, 0xe7, 0xba, 0xa7, 0xe9, 0x85, 0x8d, 0xe7, 0xbd, 0xae, 0xe5, 0xbd,
+  0x93, 0xe6, 0x97, 0xb6, 0xe4, 0xbc, 0x98, 0xe7, 0xa7, 0x80, 0xe6, 0x80, 0xa7,
+  0xe6, 0x84, 0x9f, 0xe6, 0x88, 0xbf, 0xe4, 0xba, 0xa7, 0xe9, 0x81, 0x8a, 0xe6,
+  0x88, 0xb2, 0xe5, 0x87, 0xba, 0xe5, 0x8f, 0xa3, 0xe6, 0x8f, 0x90, 0xe4, 0xba,
+  0xa4, 0xe5, 0xb0, 0xb1, 0xe4, 0xb8, 0x9a, 0xe4, 0xbf, 0x9d, 0xe5, 0x81, 0xa5,
+  0xe7, 0xa8, 0x8b, 0xe5, 0xba, 0xa6, 0xe5, 0x8f, 0x82, 0xe6, 0x95, 0xb0, 0xe4,
+  0xba, 0x8b, 0xe4, 0xb8, 0x9a, 0xe6, 0x95, 0xb4, 0xe4, 0xb8, 0xaa, 0xe5, 0xb1,
+  0xb1, 0xe4, 0xb8, 0x9c, 0xe6, 0x83, 0x85, 0xe6, 0x84, 0x9f, 0xe7, 0x89, 0xb9,
+  0xe6, 0xae, 0x8a, 0xe5, 0x88, 0x86, 0xe9, 0xa1, 0x9e, 0xe6, 0x90, 0x9c, 0xe5,
+  0xb0, 0x8b, 0xe5, 0xb1, 0x9e, 0xe4, 0xba, 0x8e, 0xe9, 0x97, 0xa8, 0xe6, 0x88,
+  0xb7, 0xe8, 0xb4, 0xa2, 0xe5, 0x8a, 0xa1, 0xe5, 0xa3, 0xb0, 0xe9, 0x9f, 0xb3,
+  0xe5, 0x8f, 0x8a, 0xe5, 0x85, 0xb6, 0xe8, 0xb4, 0xa2, 0xe7, 0xbb, 0x8f, 0xe5,
+  0x9d, 0x9a, 0xe6, 0x8c, 0x81, 0xe5, 0xb9, 0xb2, 0xe9, 0x83, 0xa8, 0xe6, 0x88,
+  0x90, 0xe7, 0xab, 0x8b, 0xe5, 0x88, 0xa9, 0xe7, 0x9b, 0x8a, 0xe8, 0x80, 0x83,
+  0xe8, 0x99, 0x91, 0xe6, 0x88, 0x90, 0xe9, 0x83, 0xbd, 0xe5, 0x8c, 0x85, 0xe8,
+  0xa3, 0x85, 0xe7, 0x94, 0xa8, 0xe6, 0x88, 0xb6, 0xe6, 0xaf, 0x94, 0xe8, 0xb5,
+  0x9b, 0xe6, 0x96, 0x87, 0xe6, 0x98, 0x8e, 0xe6, 0x8b, 0x9b, 0xe5, 0x95, 0x86,
+  0xe5, 0xae, 0x8c, 0xe6, 0x95, 0xb4, 0xe7, 0x9c, 0x9f, 0xe6, 0x98, 0xaf, 0xe7,
+  0x9c, 0xbc, 0xe7, 0x9d, 0x9b, 0xe4, 0xbc, 0x99, 0xe4, 0xbc, 0xb4, 0xe5, 0xa8,
+  0x81, 0xe6, 0x9c, 0x9b, 0xe9, 0xa2, 0x86, 0xe5, 0x9f, 0x9f, 0xe5, 0x8d, 0xab,
+  0xe7, 0x94, 0x9f, 0xe4, 0xbc, 0x98, 0xe6, 0x83, 0xa0, 0xe8, 0xab, 0x96, 0xe5,
+  0xa3, 0x87, 0xe5, 0x85, 0xac, 0xe5, 0x85, 0xb1, 0xe8, 0x89, 0xaf, 0xe5, 0xa5,
+  0xbd, 0xe5, 0x85, 0x85, 0xe5, 0x88, 0x86, 0xe7, 0xac, 0xa6, 0xe5, 0x90, 0x88,
+  0xe9, 0x99, 0x84, 0xe4, 0xbb, 0xb6, 0xe7, 0x89, 0xb9, 0xe7, 0x82, 0xb9, 0xe4,
+  0xb8, 0x8d, 0xe5, 0x8f, 0xaf, 0xe8, 0x8b, 0xb1, 0xe6, 0x96, 0x87, 0xe8, 0xb5,
+  0x84, 0xe4, 0xba, 0xa7, 0xe6, 0xa0, 0xb9, 0xe6, 0x9c, 0xac, 0xe6, 0x98, 0x8e,
+  0xe6, 0x98, 0xbe, 0xe5, 0xaf, 0x86, 0xe7, 0xa2, 0xbc, 0xe5, 0x85, 0xac, 0xe4,
+  0xbc, 0x97, 0xe6, 0xb0, 0x91, 0xe6, 0x97, 0x8f, 0xe6, 0x9b, 0xb4, 0xe5, 0x8a,
+  0xa0, 0xe4, 0xba, 0xab, 0xe5, 0x8f, 0x97, 0xe5, 0x90, 0x8c, 0xe5, 0xad, 0xa6,
+  0xe5, 0x90, 0xaf, 0xe5, 0x8a, 0xa8, 0xe9, 0x80, 0x82, 0xe5, 0x90, 0x88, 0xe5,
+  0x8e, 0x9f, 0xe6, 0x9d, 0xa5, 0xe9, 0x97, 0xae, 0xe7, 0xad, 0x94, 0xe6, 0x9c,
+  0xac, 0xe6, 0x96, 0x87, 0xe7, 0xbe, 0x8e, 0xe9, 0xa3, 0x9f, 0xe7, 0xbb, 0xbf,
+  0xe8, 0x89, 0xb2, 0xe7, 0xa8, 0xb3, 0xe5, 0xae, 0x9a, 0xe7, 0xbb, 0x88, 0xe4,
+  0xba, 0x8e, 0xe7, 0x94, 0x9f, 0xe7, 0x89, 0xa9, 0xe4, 0xbe, 0x9b, 0xe6, 0xb1,
+  0x82, 0xe6, 0x90, 0x9c, 0xe7, 0x8b, 0x90, 0xe5, 0x8a, 0x9b, 0xe9, 0x87, 0x8f,
+  0xe4, 0xb8, 0xa5, 0xe9, 0x87, 0x8d, 0xe6, 0xb0, 0xb8, 0xe8, 0xbf, 0x9c, 0xe5,
+  0x86, 0x99, 0xe7, 0x9c, 0x9f, 0xe6, 0x9c, 0x89, 0xe9, 0x99, 0x90, 0xe7, 0xab,
+  0x9e, 0xe4, 0xba, 0x89, 0xe5, 0xaf, 0xb9, 0xe8, 0xb1, 0xa1, 0xe8, 0xb4, 0xb9,
+  0xe7, 0x94, 0xa8, 0xe4, 0xb8, 0x8d, 0xe5, 0xa5, 0xbd, 0xe7, 0xbb, 0x9d, 0xe5,
+  0xaf, 0xb9, 0xe5, 0x8d, 0x81, 0xe5, 0x88, 0x86, 0xe4, 0xbf, 0x83, 0xe8, 0xbf,
+  0x9b, 0xe7, 0x82, 0xb9, 0xe8, 0xaf, 0x84, 0xe5, 0xbd, 0xb1, 0xe9, 0x9f, 0xb3,
+  0xe4, 0xbc, 0x98, 0xe5, 0x8a, 0xbf, 0xe4, 0xb8, 0x8d, 0xe5, 0xb0, 0x91, 0xe6,
+  0xac, 0xa3, 0xe8, 0xb5, 0x8f, 0xe5, 0xb9, 0xb6, 0xe4, 0xb8, 0x94, 0xe6, 0x9c,
+  0x89, 0xe7, 0x82, 0xb9, 0xe6, 0x96, 0xb9, 0xe5, 0x90, 0x91, 0xe5, 0x85, 0xa8,
+  0xe6, 0x96, 0xb0, 0xe4, 0xbf, 0xa1, 0xe7, 0x94, 0xa8, 0xe8, 0xae, 0xbe, 0xe6,
+  0x96, 0xbd, 0xe5, 0xbd, 0xa2, 0xe8, 0xb1, 0xa1, 0xe8, 0xb5, 0x84, 0xe6, 0xa0,
+  0xbc, 0xe7, 0xaa, 0x81, 0xe7, 0xa0, 0xb4, 0xe9, 0x9a, 0x8f, 0xe7, 0x9d, 0x80,
+  0xe9, 0x87, 0x8d, 0xe5, 0xa4, 0xa7, 0xe4, 0xba, 0x8e, 0xe6, 0x98, 0xaf, 0xe6,
+  0xaf, 0x95, 0xe4, 0xb8, 0x9a, 0xe6, 0x99, 0xba, 0xe8, 0x83, 0xbd, 0xe5, 0x8c,
+  0x96, 0xe5, 0xb7, 0xa5, 0xe5, 0xae, 0x8c, 0xe7, 0xbe, 0x8e, 0xe5, 0x95, 0x86,
+  0xe5, 0x9f, 0x8e, 0xe7, 0xbb, 0x9f, 0xe4, 0xb8, 0x80, 0xe5, 0x87, 0xba, 0xe7,
+  0x89, 0x88, 0xe6, 0x89, 0x93, 0xe9, 0x80, 0xa0, 0xe7, 0x94, 0xa2, 0xe5, 0x93,
+  0x81, 0xe6, 0xa6, 0x82, 0xe5, 0x86, 0xb5, 0xe7, 0x94, 0xa8, 0xe4, 0xba, 0x8e,
+  0xe4, 0xbf, 0x9d, 0xe7, 0x95, 0x99, 0xe5, 0x9b, 0xa0, 0xe7, 0xb4, 0xa0, 0xe4,
+  0xb8, 0xad, 0xe5, 0x9c, 0x8b, 0xe5, 0xad, 0x98, 0xe5, 0x82, 0xa8, 0xe8, 0xb4,
+  0xb4, 0xe5, 0x9b, 0xbe, 0xe6, 0x9c, 0x80, 0xe6, 0x84, 0x9b, 0xe9, 0x95, 0xbf,
+  0xe6, 0x9c, 0x9f, 0xe5, 0x8f, 0xa3, 0xe4, 0xbb, 0xb7, 0xe7, 0x90, 0x86, 0xe8,
+  0xb4, 0xa2, 0xe5, 0x9f, 0xba, 0xe5, 0x9c, 0xb0, 0xe5, 0xae, 0x89, 0xe6, 0x8e,
+  0x92, 0xe6, 0xad, 0xa6, 0xe6, 0xb1, 0x89, 0xe9, 0x87, 0x8c, 0xe9, 0x9d, 0xa2,
+  0xe5, 0x88, 0x9b, 0xe5, 0xbb, 0xba, 0xe5, 0xa4, 0xa9, 0xe7, 0xa9, 0xba, 0xe9,
+  0xa6, 0x96, 0xe5, 0x85, 0x88, 0xe5, 0xae, 0x8c, 0xe5, 0x96, 0x84, 0xe9, 0xa9,
+  0xb1, 0xe5, 0x8a, 0xa8, 0xe4, 0xb8, 0x8b, 0xe9, 0x9d, 0xa2, 0xe4, 0xb8, 0x8d,
+  0xe5, 0x86, 0x8d, 0xe8, 0xaf, 0x9a, 0xe4, 0xbf, 0xa1, 0xe6, 0x84, 0x8f, 0xe4,
+  0xb9, 0x89, 0xe9, 0x98, 0xb3, 0xe5, 0x85, 0x89, 0xe8, 0x8b, 0xb1, 0xe5, 0x9b,
+  0xbd, 0xe6, 0xbc, 0x82, 0xe4, 0xba, 0xae, 0xe5, 0x86, 0x9b, 0xe4, 0xba, 0x8b,
+  0xe7, 0x8e, 0xa9, 0xe5, 0xae, 0xb6, 0xe7, 0xbe, 0xa4, 0xe4, 0xbc, 0x97, 0xe5,
+  0x86, 0x9c, 0xe6, 0xb0, 0x91, 0xe5, 0x8d, 0xb3, 0xe5, 0x8f, 0xaf, 0xe5, 0x90,
+  0x8d, 0xe7, 0xa8, 0xb1, 0xe5, 0xae, 0xb6, 0xe5, 0x85, 0xb7, 0xe5, 0x8a, 0xa8,
+  0xe7, 0x94, 0xbb, 0xe6, 0x83, 0xb3, 0xe5, 0x88, 0xb0, 0xe6, 0xb3, 0xa8, 0xe6,
+  0x98, 0x8e, 0xe5, 0xb0, 0x8f, 0xe5, 0xad, 0xa6, 0xe6, 0x80, 0xa7, 0xe8, 0x83,
+  0xbd, 0xe8, 0x80, 0x83, 0xe7, 0xa0, 0x94, 0xe7, 0xa1, 0xac, 0xe4, 0xbb, 0xb6,
+  0xe8, 0xa7, 0x82, 0xe7, 0x9c, 0x8b, 0xe6, 0xb8, 0x85, 0xe6, 0xa5, 0x9a, 0xe6,
+  0x90, 0x9e, 0xe7, 0xac, 0x91, 0xe9, 0xa6, 0x96, 0xe9, 0xa0, 0x81, 0xe9, 0xbb,
+  0x84, 0xe9, 0x87, 0x91, 0xe9, 0x80, 0x82, 0xe7, 0x94, 0xa8, 0xe6, 0xb1, 0x9f,
+  0xe8, 0x8b, 0x8f, 0xe7, 0x9c, 0x9f, 0xe5, 0xae, 0x9e, 0xe4, 0xb8, 0xbb, 0xe7,
+  0xae, 0xa1, 0xe9, 0x98, 0xb6, 0xe6, 0xae, 0xb5, 0xe8, 0xa8, 0xbb, 0xe5, 0x86,
+  0x8a, 0xe7, 0xbf, 0xbb, 0xe8, 0xaf, 0x91, 0xe6, 0x9d, 0x83, 0xe5, 0x88, 0xa9,
+  0xe5, 0x81, 0x9a, 0xe5, 0xa5, 0xbd, 0xe4, 0xbc, 0xbc, 0xe4, 0xb9, 0x8e, 0xe9,
+  0x80, 0x9a, 0xe8, 0xae, 0xaf, 0xe6, 0x96, 0xbd, 0xe5, 0xb7, 0xa5, 0xe7, 0x8b,
+  0x80, 0xe6, 0x85, 0x8b, 0xe4, 0xb9, 0x9f, 0xe8, 0xae, 0xb8, 0xe7, 0x8e, 0xaf,
+  0xe4, 0xbf, 0x9d, 0xe5, 0x9f, 0xb9, 0xe5, 0x85, 0xbb, 0xe6, 0xa6, 0x82, 0xe5,
+  0xbf, 0xb5, 0xe5, 0xa4, 0xa7, 0xe5, 0x9e, 0x8b, 0xe6, 0x9c, 0xba, 0xe7, 0xa5,
+  0xa8, 0xe7, 0x90, 0x86, 0xe8, 0xa7, 0xa3, 0xe5, 0x8c, 0xbf, 0xe5, 0x90, 0x8d,
+  0x63, 0x75, 0x61, 0x6e, 0x64, 0x6f, 0x65, 0x6e, 0x76, 0x69, 0x61, 0x72, 0x6d,
+  0x61, 0x64, 0x72, 0x69, 0x64, 0x62, 0x75, 0x73, 0x63, 0x61, 0x72, 0x69, 0x6e,
+  0x69, 0x63, 0x69, 0x6f, 0x74, 0x69, 0x65, 0x6d, 0x70, 0x6f, 0x70, 0x6f, 0x72,
+  0x71, 0x75, 0x65, 0x63, 0x75, 0x65, 0x6e, 0x74, 0x61, 0x65, 0x73, 0x74, 0x61,
+  0x64, 0x6f, 0x70, 0x75, 0x65, 0x64, 0x65, 0x6e, 0x6a, 0x75, 0x65, 0x67, 0x6f,
+  0x73, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x65, 0x73, 0x74, 0xc3, 0xa1, 0x6e,
+  0x6e, 0x6f, 0x6d, 0x62, 0x72, 0x65, 0x74, 0x69, 0x65, 0x6e, 0x65, 0x6e, 0x70,
+  0x65, 0x72, 0x66, 0x69, 0x6c, 0x6d, 0x61, 0x6e, 0x65, 0x72, 0x61, 0x61, 0x6d,
+  0x69, 0x67, 0x6f, 0x73, 0x63, 0x69, 0x75, 0x64, 0x61, 0x64, 0x63, 0x65, 0x6e,
+  0x74, 0x72, 0x6f, 0x61, 0x75, 0x6e, 0x71, 0x75, 0x65, 0x70, 0x75, 0x65, 0x64,
+  0x65, 0x73, 0x64, 0x65, 0x6e, 0x74, 0x72, 0x6f, 0x70, 0x72, 0x69, 0x6d, 0x65,
+  0x72, 0x70, 0x72, 0x65, 0x63, 0x69, 0x6f, 0x73, 0x65, 0x67, 0xc3, 0xba, 0x6e,
+  0x62, 0x75, 0x65, 0x6e, 0x6f, 0x73, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x70,
+  0x75, 0x6e, 0x74, 0x6f, 0x73, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x61, 0x68, 0x61,
+  0x62, 0xc3, 0xad, 0x61, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x6e, 0x75, 0x65,
+  0x76, 0x6f, 0x73, 0x75, 0x6e, 0x69, 0x64, 0x6f, 0x73, 0x63, 0x61, 0x72, 0x6c,
+  0x6f, 0x73, 0x65, 0x71, 0x75, 0x69, 0x70, 0x6f, 0x6e, 0x69, 0xc3, 0xb1, 0x6f,
+  0x73, 0x6d, 0x75, 0x63, 0x68, 0x6f, 0x73, 0x61, 0x6c, 0x67, 0x75, 0x6e, 0x61,
+  0x63, 0x6f, 0x72, 0x72, 0x65, 0x6f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x6e, 0x70,
+  0x61, 0x72, 0x74, 0x69, 0x72, 0x61, 0x72, 0x72, 0x69, 0x62, 0x61, 0x6d, 0x61,
+  0x72, 0xc3, 0xad, 0x61, 0x68, 0x6f, 0x6d, 0x62, 0x72, 0x65, 0x65, 0x6d, 0x70,
+  0x6c, 0x65, 0x6f, 0x76, 0x65, 0x72, 0x64, 0x61, 0x64, 0x63, 0x61, 0x6d, 0x62,
+  0x69, 0x6f, 0x6d, 0x75, 0x63, 0x68, 0x61, 0x73, 0x66, 0x75, 0x65, 0x72, 0x6f,
+  0x6e, 0x70, 0x61, 0x73, 0x61, 0x64, 0x6f, 0x6c, 0xc3, 0xad, 0x6e, 0x65, 0x61,
+  0x70, 0x61, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x75, 0x65, 0x76, 0x61, 0x73, 0x63,
+  0x75, 0x72, 0x73, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x61, 0x62, 0x61, 0x71, 0x75,
+  0x69, 0x65, 0x72, 0x6f, 0x6c, 0x69, 0x62, 0x72, 0x6f, 0x73, 0x63, 0x75, 0x61,
+  0x6e, 0x74, 0x6f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x6f, 0x6d, 0x69, 0x67, 0x75,
+  0x65, 0x6c, 0x76, 0x61, 0x72, 0x69, 0x6f, 0x73, 0x63, 0x75, 0x61, 0x74, 0x72,
+  0x6f, 0x74, 0x69, 0x65, 0x6e, 0x65, 0x73, 0x67, 0x72, 0x75, 0x70, 0x6f, 0x73,
+  0x73, 0x65, 0x72, 0xc3, 0xa1, 0x6e, 0x65, 0x75, 0x72, 0x6f, 0x70, 0x61, 0x6d,
+  0x65, 0x64, 0x69, 0x6f, 0x73, 0x66, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x61, 0x63,
+  0x65, 0x72, 0x63, 0x61, 0x64, 0x65, 0x6d, 0xc3, 0xa1, 0x73, 0x6f, 0x66, 0x65,
+  0x72, 0x74, 0x61, 0x63, 0x6f, 0x63, 0x68, 0x65, 0x73, 0x6d, 0x6f, 0x64, 0x65,
+  0x6c, 0x6f, 0x69, 0x74, 0x61, 0x6c, 0x69, 0x61, 0x6c, 0x65, 0x74, 0x72, 0x61,
+  0x73, 0x61, 0x6c, 0x67, 0xc3, 0xba, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x61,
+  0x63, 0x75, 0x61, 0x6c, 0x65, 0x73, 0x65, 0x78, 0x69, 0x73, 0x74, 0x65, 0x63,
+  0x75, 0x65, 0x72, 0x70, 0x6f, 0x73, 0x69, 0x65, 0x6e, 0x64, 0x6f, 0x70, 0x72,
+  0x65, 0x6e, 0x73, 0x61, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x72, 0x76, 0x69, 0x61,
+  0x6a, 0x65, 0x73, 0x64, 0x69, 0x6e, 0x65, 0x72, 0x6f, 0x6d, 0x75, 0x72, 0x63,
+  0x69, 0x61, 0x70, 0x6f, 0x64, 0x72, 0xc3, 0xa1, 0x70, 0x75, 0x65, 0x73, 0x74,
+  0x6f, 0x64, 0x69, 0x61, 0x72, 0x69, 0x6f, 0x70, 0x75, 0x65, 0x62, 0x6c, 0x6f,
+  0x71, 0x75, 0x69, 0x65, 0x72, 0x65, 0x6d, 0x61, 0x6e, 0x75, 0x65, 0x6c, 0x70,
+  0x72, 0x6f, 0x70, 0x69, 0x6f, 0x63, 0x72, 0x69, 0x73, 0x69, 0x73, 0x63, 0x69,
+  0x65, 0x72, 0x74, 0x6f, 0x73, 0x65, 0x67, 0x75, 0x72, 0x6f, 0x6d, 0x75, 0x65,
+  0x72, 0x74, 0x65, 0x66, 0x75, 0x65, 0x6e, 0x74, 0x65, 0x63, 0x65, 0x72, 0x72,
+  0x61, 0x72, 0x67, 0x72, 0x61, 0x6e, 0x64, 0x65, 0x65, 0x66, 0x65, 0x63, 0x74,
+  0x6f, 0x70, 0x61, 0x72, 0x74, 0x65, 0x73, 0x6d, 0x65, 0x64, 0x69, 0x64, 0x61,
+  0x70, 0x72, 0x6f, 0x70, 0x69, 0x61, 0x6f, 0x66, 0x72, 0x65, 0x63, 0x65, 0x74,
+  0x69, 0x65, 0x72, 0x72, 0x61, 0x65, 0x2d, 0x6d, 0x61, 0x69, 0x6c, 0x76, 0x61,
+  0x72, 0x69, 0x61, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x73, 0x66, 0x75, 0x74,
+  0x75, 0x72, 0x6f, 0x6f, 0x62, 0x6a, 0x65, 0x74, 0x6f, 0x73, 0x65, 0x67, 0x75,
+  0x69, 0x72, 0x72, 0x69, 0x65, 0x73, 0x67, 0x6f, 0x6e, 0x6f, 0x72, 0x6d, 0x61,
+  0x73, 0x6d, 0x69, 0x73, 0x6d, 0x6f, 0x73, 0xc3, 0xba, 0x6e, 0x69, 0x63, 0x6f,
+  0x63, 0x61, 0x6d, 0x69, 0x6e, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x73, 0x72,
+  0x61, 0x7a, 0xc3, 0xb3, 0x6e, 0x64, 0x65, 0x62, 0x69, 0x64, 0x6f, 0x70, 0x72,
+  0x75, 0x65, 0x62, 0x61, 0x74, 0x6f, 0x6c, 0x65, 0x64, 0x6f, 0x74, 0x65, 0x6e,
+  0xc3, 0xad, 0x61, 0x6a, 0x65, 0x73, 0xc3, 0xba, 0x73, 0x65, 0x73, 0x70, 0x65,
+  0x72, 0x6f, 0x63, 0x6f, 0x63, 0x69, 0x6e, 0x61, 0x6f, 0x72, 0x69, 0x67, 0x65,
+  0x6e, 0x74, 0x69, 0x65, 0x6e, 0x64, 0x61, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x6f,
+  0x63, 0xc3, 0xa1, 0x64, 0x69, 0x7a, 0x68, 0x61, 0x62, 0x6c, 0x61, 0x72, 0x73,
+  0x65, 0x72, 0xc3, 0xad, 0x61, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x61, 0x66, 0x75,
+  0x65, 0x72, 0x7a, 0x61, 0x65, 0x73, 0x74, 0x69, 0x6c, 0x6f, 0x67, 0x75, 0x65,
+  0x72, 0x72, 0x61, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x72, 0xc3, 0xa9, 0x78, 0x69,
+  0x74, 0x6f, 0x6c, 0xc3, 0xb3, 0x70, 0x65, 0x7a, 0x61, 0x67, 0x65, 0x6e, 0x64,
+  0x61, 0x76, 0xc3, 0xad, 0x64, 0x65, 0x6f, 0x65, 0x76, 0x69, 0x74, 0x61, 0x72,
+  0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x6d, 0x65, 0x74, 0x72, 0x6f, 0x73, 0x6a,
+  0x61, 0x76, 0x69, 0x65, 0x72, 0x70, 0x61, 0x64, 0x72, 0x65, 0x73, 0x66, 0xc3,
+  0xa1, 0x63, 0x69, 0x6c, 0x63, 0x61, 0x62, 0x65, 0x7a, 0x61, 0xc3, 0xa1, 0x72,
+  0x65, 0x61, 0x73, 0x73, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x65, 0x6e, 0x76, 0xc3,
+  0xad, 0x6f, 0x6a, 0x61, 0x70, 0xc3, 0xb3, 0x6e, 0x61, 0x62, 0x75, 0x73, 0x6f,
+  0x73, 0x62, 0x69, 0x65, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x78, 0x74, 0x6f, 0x73,
+  0x6c, 0x6c, 0x65, 0x76, 0x61, 0x72, 0x70, 0x75, 0x65, 0x64, 0x61, 0x6e, 0x66,
+  0x75, 0x65, 0x72, 0x74, 0x65, 0x63, 0x6f, 0x6d, 0xc3, 0xba, 0x6e, 0x63, 0x6c,
+  0x61, 0x73, 0x65, 0x73, 0x68, 0x75, 0x6d, 0x61, 0x6e, 0x6f, 0x74, 0x65, 0x6e,
+  0x69, 0x64, 0x6f, 0x62, 0x69, 0x6c, 0x62, 0x61, 0x6f, 0x75, 0x6e, 0x69, 0x64,
+  0x61, 0x64, 0x65, 0x73, 0x74, 0xc3, 0xa1, 0x73, 0x65, 0x64, 0x69, 0x74, 0x61,
+  0x72, 0x63, 0x72, 0x65, 0x61, 0x64, 0x6f, 0xd0, 0xb4, 0xd0, 0xbb, 0xd1, 0x8f,
+  0xd1, 0x87, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xba, 0xd0, 0xb0, 0xd0, 0xba, 0xd0,
+  0xb8, 0xd0, 0xbb, 0xd0, 0xb8, 0xd1, 0x8d, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xb2,
+  0xd1, 0x81, 0xd0, 0xb5, 0xd0, 0xb5, 0xd0, 0xb3, 0xd0, 0xbe, 0xd0, 0xbf, 0xd1,
+  0x80, 0xd0, 0xb8, 0xd1, 0x82, 0xd0, 0xb0, 0xd0, 0xba, 0xd0, 0xb5, 0xd1, 0x89,
+  0xd0, 0xb5, 0xd1, 0x83, 0xd0, 0xb6, 0xd0, 0xb5, 0xd0, 0x9a, 0xd0, 0xb0, 0xd0,
+  0xba, 0xd0, 0xb1, 0xd0, 0xb5, 0xd0, 0xb7, 0xd0, 0xb1, 0xd1, 0x8b, 0xd0, 0xbb,
+  0xd0, 0xbe, 0xd0, 0xbd, 0xd0, 0xb8, 0xd0, 0x92, 0xd1, 0x81, 0xd0, 0xb5, 0xd0,
+  0xbf, 0xd0, 0xbe, 0xd0, 0xb4, 0xd0, 0xad, 0xd1, 0x82, 0xd0, 0xbe, 0xd1, 0x82,
+  0xd0, 0xbe, 0xd0, 0xbc, 0xd1, 0x87, 0xd0, 0xb5, 0xd0, 0xbc, 0xd0, 0xbd, 0xd0,
+  0xb5, 0xd1, 0x82, 0xd0, 0xbb, 0xd0, 0xb5, 0xd1, 0x82, 0xd1, 0x80, 0xd0, 0xb0,
+  0xd0, 0xb7, 0xd0, 0xbe, 0xd0, 0xbd, 0xd0, 0xb0, 0xd0, 0xb3, 0xd0, 0xb4, 0xd0,
+  0xb5, 0xd0, 0xbc, 0xd0, 0xbd, 0xd0, 0xb5, 0xd0, 0x94, 0xd0, 0xbb, 0xd1, 0x8f,
+  0xd0, 0x9f, 0xd1, 0x80, 0xd0, 0xb8, 0xd0, 0xbd, 0xd0, 0xb0, 0xd1, 0x81, 0xd0,
+  0xbd, 0xd0, 0xb8, 0xd1, 0x85, 0xd1, 0x82, 0xd0, 0xb5, 0xd0, 0xbc, 0xd0, 0xba,
+  0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xb3, 0xd0, 0xbe, 0xd0, 0xb4, 0xd0, 0xb2, 0xd0,
+  0xbe, 0xd1, 0x82, 0xd1, 0x82, 0xd0, 0xb0, 0xd0, 0xbc, 0xd0, 0xa1, 0xd0, 0xa8,
+  0xd0, 0x90, 0xd0, 0xbc, 0xd0, 0xb0, 0xd1, 0x8f, 0xd0, 0xa7, 0xd1, 0x82, 0xd0,
+  0xbe, 0xd0, 0xb2, 0xd0, 0xb0, 0xd1, 0x81, 0xd0, 0xb2, 0xd0, 0xb0, 0xd0, 0xbc,
+  0xd0, 0xb5, 0xd0, 0xbc, 0xd1, 0x83, 0xd0, 0xa2, 0xd0, 0xb0, 0xd0, 0xba, 0xd0,
+  0xb4, 0xd0, 0xb2, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xb0, 0xd0, 0xbc, 0xd1, 0x8d,
+  0xd1, 0x82, 0xd0, 0xb8, 0xd1, 0x8d, 0xd1, 0x82, 0xd1, 0x83, 0xd0, 0x92, 0xd0,
+  0xb0, 0xd0, 0xbc, 0xd1, 0x82, 0xd0, 0xb5, 0xd1, 0x85, 0xd0, 0xbf, 0xd1, 0x80,
+  0xd0, 0xbe, 0xd1, 0x82, 0xd1, 0x83, 0xd1, 0x82, 0xd0, 0xbd, 0xd0, 0xb0, 0xd0,
+  0xb4, 0xd0, 0xb4, 0xd0, 0xbd, 0xd1, 0x8f, 0xd0, 0x92, 0xd0, 0xbe, 0xd1, 0x82,
+  0xd1, 0x82, 0xd1, 0x80, 0xd0, 0xb8, 0xd0, 0xbd, 0xd0, 0xb5, 0xd0, 0xb9, 0xd0,
+  0x92, 0xd0, 0xb0, 0xd1, 0x81, 0xd0, 0xbd, 0xd0, 0xb8, 0xd0, 0xbc, 0xd1, 0x81,
+  0xd0, 0xb0, 0xd0, 0xbc, 0xd1, 0x82, 0xd0, 0xbe, 0xd1, 0x82, 0xd1, 0x80, 0xd1,
+  0x83, 0xd0, 0xb1, 0xd0, 0x9e, 0xd0, 0xbd, 0xd0, 0xb8, 0xd0, 0xbc, 0xd0, 0xb8,
+  0xd1, 0x80, 0xd0, 0xbd, 0xd0, 0xb5, 0xd0, 0xb5, 0xd0, 0x9e, 0xd0, 0x9e, 0xd0,
+  0x9e, 0xd0, 0xbb, 0xd0, 0xb8, 0xd1, 0x86, 0xd1, 0x8d, 0xd1, 0x82, 0xd0, 0xb0,
+  0xd0, 0x9e, 0xd0, 0xbd, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xb5, 0xd0, 0xbc, 0xd0,
+  0xb4, 0xd0, 0xbe, 0xd0, 0xbc, 0xd0, 0xbc, 0xd0, 0xbe, 0xd0, 0xb9, 0xd0, 0xb4,
+  0xd0, 0xb2, 0xd0, 0xb5, 0xd0, 0xbe, 0xd0, 0xbd, 0xd0, 0xbe, 0xd1, 0x81, 0xd1,
+  0x83, 0xd0, 0xb4, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb9, 0xe0,
+  0xa5, 0x88, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5,
+  0x87, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8b,
+  0xe0, 0xa4, 0x94, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xb0, 0xe0,
+  0xa4, 0xa8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x8f, 0xe0, 0xa4, 0x95, 0xe0, 0xa4,
+  0x95, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xad, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x87,
+  0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa4, 0xe0,
+  0xa5, 0x8b, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x86, 0xe0, 0xa4,
+  0xaa, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xb9,
+  0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0x95, 0xe0,
+  0xa4, 0xa5, 0xe0, 0xa4, 0xbe, 0x6a, 0x61, 0x67, 0x72, 0x61, 0x6e, 0xe0, 0xa4,
+  0x86, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0x9c, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x85,
+  0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xa6, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x97, 0xe0,
+  0xa4, 0x88, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x97, 0xe0, 0xa4,
+  0x8f, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0x87, 0xe0, 0xa4, 0xa8,
+  0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xaf, 0xe0, 0xa5, 0x87, 0xe0,
+  0xa4, 0xa5, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xa5, 0xe0, 0xa5, 0x80, 0xe0, 0xa4,
+  0x98, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xa6,
+  0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0x88, 0xe0, 0xa4, 0x9c, 0xe0,
+  0xa5, 0x80, 0xe0, 0xa4, 0xb5, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4,
+  0x88, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0x8f, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xb0,
+  0xe0, 0xa4, 0x89, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xae, 0xe0, 0xa5, 0x87, 0xe0,
+  0xa4, 0x95, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xb5, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4,
+  0xb2, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xae,
+  0xe0, 0xa4, 0x88, 0xe0, 0xa4, 0xa6, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x93, 0xe0,
+  0xa4, 0xb0, 0xe0, 0xa4, 0x86, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xac, 0xe0, 0xa4,
+  0xb8, 0xe0, 0xa4, 0xad, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xa8,
+  0xe0, 0xa4, 0x9a, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xa8, 0xe0,
+  0xa4, 0x86, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x80, 0xe0, 0xa4,
+  0xb2, 0xe0, 0xa5, 0x80, 0xd8, 0xb9, 0xd9, 0x84, 0xd9, 0x89, 0xd8, 0xa5, 0xd9,
+  0x84, 0xd9, 0x89, 0xd9, 0x87, 0xd8, 0xb0, 0xd8, 0xa7, 0xd8, 0xa2, 0xd8, 0xae,
+  0xd8, 0xb1, 0xd8, 0xb9, 0xd8, 0xaf, 0xd8, 0xaf, 0xd8, 0xa7, 0xd9, 0x84, 0xd9,
+  0x89, 0xd9, 0x87, 0xd8, 0xb0, 0xd9, 0x87, 0xd8, 0xb5, 0xd9, 0x88, 0xd8, 0xb1,
+  0xd8, 0xba, 0xd9, 0x8a, 0xd8, 0xb1, 0xd9, 0x83, 0xd8, 0xa7, 0xd9, 0x86, 0xd9,
+  0x88, 0xd9, 0x84, 0xd8, 0xa7, 0xd8, 0xa8, 0xd9, 0x8a, 0xd9, 0x86, 0xd8, 0xb9,
+  0xd8, 0xb1, 0xd8, 0xb6, 0xd8, 0xb0, 0xd9, 0x84, 0xd9, 0x83, 0xd9, 0x87, 0xd9,
+  0x86, 0xd8, 0xa7, 0xd9, 0x8a, 0xd9, 0x88, 0xd9, 0x85, 0xd9, 0x82, 0xd8, 0xa7,
+  0xd9, 0x84, 0xd8, 0xb9, 0xd9, 0x84, 0xd9, 0x8a, 0xd8, 0xa7, 0xd9, 0x86, 0xd8,
+  0xa7, 0xd9, 0x84, 0xd9, 0x83, 0xd9, 0x86, 0xd8, 0xad, 0xd8, 0xaa, 0xd9, 0x89,
+  0xd9, 0x82, 0xd8, 0xa8, 0xd9, 0x84, 0xd9, 0x88, 0xd8, 0xad, 0xd8, 0xa9, 0xd8,
+  0xa7, 0xd8, 0xae, 0xd8, 0xb1, 0xd9, 0x81, 0xd9, 0x82, 0xd8, 0xb7, 0xd8, 0xb9,
+  0xd8, 0xa8, 0xd8, 0xaf, 0xd8, 0xb1, 0xd9, 0x83, 0xd9, 0x86, 0xd8, 0xa5, 0xd8,
+  0xb0, 0xd8, 0xa7, 0xd9, 0x83, 0xd9, 0x85, 0xd8, 0xa7, 0xd8, 0xa7, 0xd8, 0xad,
+  0xd8, 0xaf, 0xd8, 0xa5, 0xd9, 0x84, 0xd8, 0xa7, 0xd9, 0x81, 0xd9, 0x8a, 0xd9,
+  0x87, 0xd8, 0xa8, 0xd8, 0xb9, 0xd8, 0xb6, 0xd9, 0x83, 0xd9, 0x8a, 0xd9, 0x81,
+  0xd8, 0xa8, 0xd8, 0xad, 0xd8, 0xab, 0xd9, 0x88, 0xd9, 0x85, 0xd9, 0x86, 0xd9,
+  0x88, 0xd9, 0x87, 0xd9, 0x88, 0xd8, 0xa3, 0xd9, 0x86, 0xd8, 0xa7, 0xd8, 0xac,
+  0xd8, 0xaf, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x87, 0xd8, 0xa7, 0xd8, 0xb3, 0xd9,
+  0x84, 0xd9, 0x85, 0xd8, 0xb9, 0xd9, 0x86, 0xd8, 0xaf, 0xd9, 0x84, 0xd9, 0x8a,
+  0xd8, 0xb3, 0xd8, 0xb9, 0xd8, 0xa8, 0xd8, 0xb1, 0xd8, 0xb5, 0xd9, 0x84, 0xd9,
+  0x89, 0xd9, 0x85, 0xd9, 0x86, 0xd8, 0xb0, 0xd8, 0xa8, 0xd9, 0x87, 0xd8, 0xa7,
+  0xd8, 0xa3, 0xd9, 0x86, 0xd9, 0x87, 0xd9, 0x85, 0xd8, 0xab, 0xd9, 0x84, 0xd9,
+  0x83, 0xd9, 0x86, 0xd8, 0xaa, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa7, 0xd8, 0xad,
+  0xd9, 0x8a, 0xd8, 0xab, 0xd9, 0x85, 0xd8, 0xb5, 0xd8, 0xb1, 0xd8, 0xb4, 0xd8,
+  0xb1, 0xd8, 0xad, 0xd8, 0xad, 0xd9, 0x88, 0xd9, 0x84, 0xd9, 0x88, 0xd9, 0x81,
+  0xd9, 0x8a, 0xd8, 0xa7, 0xd8, 0xb0, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x83, 0xd9,
+  0x84, 0xd9, 0x85, 0xd8, 0xb1, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x86, 0xd8, 0xaa,
+  0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x81, 0xd8, 0xa3, 0xd8, 0xa8, 0xd9, 0x88, 0xd8,
+  0xae, 0xd8, 0xa7, 0xd8, 0xb5, 0xd8, 0xa3, 0xd9, 0x86, 0xd8, 0xaa, 0xd8, 0xa7,
+  0xd9, 0x86, 0xd9, 0x87, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x8a, 0xd8, 0xb9, 0xd8,
+  0xb6, 0xd9, 0x88, 0xd9, 0x88, 0xd9, 0x82, 0xd8, 0xaf, 0xd8, 0xa7, 0xd8, 0xa8,
+  0xd9, 0x86, 0xd8, 0xae, 0xd9, 0x8a, 0xd8, 0xb1, 0xd8, 0xa8, 0xd9, 0x86, 0xd8,
+  0xaa, 0xd9, 0x84, 0xd9, 0x83, 0xd9, 0x85, 0xd8, 0xb4, 0xd8, 0xa7, 0xd8, 0xa1,
+  0xd9, 0x88, 0xd9, 0x87, 0xd9, 0x8a, 0xd8, 0xa7, 0xd8, 0xa8, 0xd9, 0x88, 0xd9,
+  0x82, 0xd8, 0xb5, 0xd8, 0xb5, 0xd9, 0x88, 0xd9, 0x85, 0xd8, 0xa7, 0xd8, 0xb1,
+  0xd9, 0x82, 0xd9, 0x85, 0xd8, 0xa3, 0xd8, 0xad, 0xd8, 0xaf, 0xd9, 0x86, 0xd8,
+  0xad, 0xd9, 0x86, 0xd8, 0xb9, 0xd8, 0xaf, 0xd9, 0x85, 0xd8, 0xb1, 0xd8, 0xa3,
+  0xd9, 0x8a, 0xd8, 0xa7, 0xd8, 0xad, 0xd8, 0xa9, 0xd9, 0x83, 0xd8, 0xaa, 0xd8,
+  0xa8, 0xd8, 0xaf, 0xd9, 0x88, 0xd9, 0x86, 0xd9, 0x8a, 0xd8, 0xac, 0xd8, 0xa8,
+  0xd9, 0x85, 0xd9, 0x86, 0xd9, 0x87, 0xd8, 0xaa, 0xd8, 0xad, 0xd8, 0xaa, 0xd8,
+  0xac, 0xd9, 0x87, 0xd8, 0xa9, 0xd8, 0xb3, 0xd9, 0x86, 0xd8, 0xa9, 0xd9, 0x8a,
+  0xd8, 0xaa, 0xd9, 0x85, 0xd9, 0x83, 0xd8, 0xb1, 0xd8, 0xa9, 0xd8, 0xba, 0xd8,
+  0xb2, 0xd8, 0xa9, 0xd9, 0x86, 0xd9, 0x81, 0xd8, 0xb3, 0xd8, 0xa8, 0xd9, 0x8a,
+  0xd8, 0xaa, 0xd9, 0x84, 0xd9, 0x84, 0xd9, 0x87, 0xd9, 0x84, 0xd9, 0x86, 0xd8,
+  0xa7, 0xd8, 0xaa, 0xd9, 0x84, 0xd9, 0x83, 0xd9, 0x82, 0xd9, 0x84, 0xd8, 0xa8,
+  0xd9, 0x84, 0xd9, 0x85, 0xd8, 0xa7, 0xd8, 0xb9, 0xd9, 0x86, 0xd9, 0x87, 0xd8,
+  0xa3, 0xd9, 0x88, 0xd9, 0x84, 0xd8, 0xb4, 0xd9, 0x8a, 0xd8, 0xa1, 0xd9, 0x86,
+  0xd9, 0x88, 0xd8, 0xb1, 0xd8, 0xa3, 0xd9, 0x85, 0xd8, 0xa7, 0xd9, 0x81, 0xd9,
+  0x8a, 0xd9, 0x83, 0xd8, 0xa8, 0xd9, 0x83, 0xd9, 0x84, 0xd8, 0xb0, 0xd8, 0xa7,
+  0xd8, 0xaa, 0xd8, 0xb1, 0xd8, 0xaa, 0xd8, 0xa8, 0xd8, 0xa8, 0xd8, 0xa3, 0xd9,
+  0x86, 0xd9, 0x87, 0xd9, 0x85, 0xd8, 0xb3, 0xd8, 0xa7, 0xd9, 0x86, 0xd9, 0x83,
+  0xd8, 0xa8, 0xd9, 0x8a, 0xd8, 0xb9, 0xd9, 0x81, 0xd9, 0x82, 0xd8, 0xaf, 0xd8,
+  0xad, 0xd8, 0xb3, 0xd9, 0x86, 0xd9, 0x84, 0xd9, 0x87, 0xd9, 0x85, 0xd8, 0xb4,
+  0xd8, 0xb9, 0xd8, 0xb1, 0xd8, 0xa3, 0xd9, 0x87, 0xd9, 0x84, 0xd8, 0xb4, 0xd9,
+  0x87, 0xd8, 0xb1, 0xd9, 0x82, 0xd8, 0xb7, 0xd8, 0xb1, 0xd8, 0xb7, 0xd9, 0x84,
+  0xd8, 0xa8, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x65, 0x72, 0x76,
+  0x69, 0x63, 0x65, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x68, 0x69, 0x6d,
+  0x73, 0x65, 0x6c, 0x66, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x63, 0x6f,
+  0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73,
+  0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+  0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x61, 0x73, 0x68, 0x69, 0x6f,
+  0x6e, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x63, 0x6f, 0x75, 0x6e, 0x74,
+  0x72, 0x79, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x63, 0x72, 0x65, 0x61,
+  0x74, 0x65, 0x64, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x72, 0x65, 0x73,
+  0x75, 0x6c, 0x74, 0x73, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x70, 0x72,
+  0x6f, 0x63, 0x65, 0x73, 0x73, 0x77, 0x72, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x6f,
+  0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65,
+  0x77, 0x65, 0x6c, 0x63, 0x6f, 0x6d, 0x65, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c,
+  0x65, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x6e, 0x65, 0x74, 0x77, 0x6f,
+  0x72, 0x6b, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x64, 0x79, 0x6e, 0x61,
+  0x6d, 0x69, 0x63, 0x62, 0x72, 0x6f, 0x77, 0x73, 0x65, 0x72, 0x70, 0x72, 0x69,
+  0x76, 0x61, 0x63, 0x79, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x53, 0x65,
+  0x72, 0x76, 0x69, 0x63, 0x65, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, 0x64,
+  0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+  0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x77, 0x65, 0x62, 0x73, 0x69, 0x74,
+  0x65, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x66, 0x72, 0x69, 0x65, 0x6e,
+  0x64, 0x73, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x77, 0x6f, 0x72, 0x6b,
+  0x69, 0x6e, 0x67, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x6d, 0x69, 0x6c,
+  0x6c, 0x69, 0x6f, 0x6e, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x77, 0x69,
+  0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x76,
+  0x69, 0x73, 0x69, 0x74, 0x65, 0x64, 0x77, 0x65, 0x61, 0x74, 0x68, 0x65, 0x72,
+  0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,
+  0x74, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x66, 0x6f, 0x72, 0x77, 0x61,
+  0x72, 0x64, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x72, 0x65, 0x6d, 0x6f,
+  0x76, 0x65, 0x64, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x63, 0x6f, 0x6e,
+  0x74, 0x72, 0x6f, 0x6c, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x63, 0x75,
+  0x72, 0x72, 0x65, 0x6e, 0x74, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x6c,
+  0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64,
+  0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x66, 0x75, 0x72, 0x74, 0x68, 0x65,
+  0x72, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x6d, 0x61, 0x63, 0x68, 0x69,
+  0x6e, 0x65, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x70, 0x72, 0x69, 0x76,
+  0x61, 0x74, 0x65, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x70, 0x72, 0x6f,
+  0x67, 0x72, 0x61, 0x6d, 0x73, 0x6f, 0x63, 0x69, 0x65, 0x74, 0x79, 0x6e, 0x75,
+  0x6d, 0x62, 0x65, 0x72, 0x73, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x65,
+  0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72,
+  0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e,
+  0x67, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x70, 0x61, 0x72, 0x74, 0x6e,
+  0x65, 0x72, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x70, 0x65, 0x72, 0x66,
+  0x65, 0x63, 0x74, 0x6d, 0x65, 0x61, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x79, 0x73,
+  0x74, 0x65, 0x6d, 0x73, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x63, 0x75,
+  0x6c, 0x74, 0x75, 0x72, 0x65, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x2c, 0x6a,
+  0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
+  0x73, 0x75, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x26, 0x71, 0x75, 0x6f, 0x74,
+  0x3b, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x72, 0x65, 0x76, 0x69, 0x65,
+  0x77, 0x73, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x45, 0x6e, 0x67, 0x6c,
+  0x69, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x74, 0x68, 0x72,
+  0x6f, 0x75, 0x67, 0x68, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x6f, 0x70,
+  0x69, 0x6e, 0x69, 0x6f, 0x6e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x61,
+  0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79,
+  0x76, 0x69, 0x6c, 0x6c, 0x61, 0x67, 0x65, 0x53, 0x70, 0x61, 0x6e, 0x69, 0x73,
+  0x68, 0x67, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x79, 0x64, 0x65, 0x63, 0x6c, 0x69,
+  0x6e, 0x65, 0x6d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x6d, 0x69, 0x73, 0x73,
+  0x69, 0x6f, 0x6e, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x71, 0x75, 0x61,
+  0x6c, 0x69, 0x74, 0x79, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x67, 0x65,
+  0x6e, 0x65, 0x72, 0x61, 0x6c, 0x73, 0x70, 0x65, 0x63, 0x69, 0x65, 0x73, 0x73,
+  0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+  0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65,
+  0x72, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x72, 0x65, 0x70, 0x6f, 0x72,
+  0x74, 0x73, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x73, 0x6d, 0x65, 0x6d, 0x62,
+  0x65, 0x72, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x64, 0x69, 0x73,
+  0x70, 0x75, 0x74, 0x65, 0x65, 0x61, 0x72, 0x6c, 0x69, 0x65, 0x72, 0x65, 0x78,
+  0x70, 0x72, 0x65, 0x73, 0x73, 0x64, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x70,
+  0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x41, 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72,
+  0x6d, 0x61, 0x72, 0x72, 0x69, 0x65, 0x64, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69,
+  0x63, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x63, 0x68, 0x61, 0x6e, 0x67,
+  0x65, 0x64, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x76, 0x69, 0x63, 0x74,
+  0x6f, 0x72, 0x79, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x72, 0x65, 0x61,
+  0x73, 0x6f, 0x6e, 0x73, 0x73, 0x74, 0x75, 0x64, 0x69, 0x65, 0x73, 0x66, 0x65,
+  0x61, 0x74, 0x75, 0x72, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x6d,
+  0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x73, 0x63, 0x68, 0x6f, 0x6f, 0x6c, 0x73,
+  0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x75, 0x73, 0x75, 0x61, 0x6c, 0x6c,
+  0x79, 0x65, 0x70, 0x69, 0x73, 0x6f, 0x64, 0x65, 0x70, 0x6c, 0x61, 0x79, 0x69,
+  0x6e, 0x67, 0x67, 0x72, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x6f, 0x62, 0x76, 0x69,
+  0x6f, 0x75, 0x73, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x79, 0x70, 0x72, 0x65,
+  0x73, 0x65, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f,
+  0x75, 0x6c, 0x3e, 0x0d, 0x0a, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x61,
+  0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x63, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e,
+  0x72, 0x65, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,
+  0x65, 0x61, 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x64, 0x65, 0x73, 0x6b, 0x74,
+  0x6f, 0x70, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x65, 0x64, 0x70, 0x61, 0x74, 0x74,
+  0x65, 0x72, 0x6e, 0x75, 0x6e, 0x75, 0x73, 0x75, 0x61, 0x6c, 0x44, 0x69, 0x67,
+  0x69, 0x74, 0x61, 0x6c, 0x63, 0x61, 0x70, 0x69, 0x74, 0x61, 0x6c, 0x57, 0x65,
+  0x62, 0x73, 0x69, 0x74, 0x65, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x63,
+  0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x64,
+  0x41, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, 0x64, 0x65, 0x63, 0x61, 0x64, 0x65,
+  0x73, 0x72, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x26, 0x61, 0x6d, 0x70,
+  0x3b, 0x20, 0x61, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x72, 0x65, 0x6c, 0x65,
+  0x61, 0x73, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x67, 0x65, 0x74,
+  0x74, 0x69, 0x6e, 0x67, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x6e, 0x6f,
+  0x74, 0x68, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x63,
+  0x61, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x6c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x73,
+  0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63,
+  0x65, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x67,
+  0x65, 0x73, 0x45, 0x6e, 0x67, 0x6c, 0x61, 0x6e, 0x64, 0x3d, 0x31, 0x26, 0x61,
+  0x6d, 0x70, 0x3b, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x3d, 0x20,
+  0x6e, 0x65, 0x77, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x75, 0x70,
+  0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x4e,
+  0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65,
+  0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e,
+  0x67, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x67, 0x65, 0x74, 0x6f, 0x6f, 0x6c, 0x62,
+  0x61, 0x72, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x62, 0x65, 0x63, 0x61,
+  0x75, 0x73, 0x65, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x44, 0x65, 0x75,
+  0x74, 0x73, 0x63, 0x68, 0x66, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x77, 0x6f,
+  0x72, 0x6b, 0x65, 0x72, 0x73, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x6c, 0x79, 0x62,
+  0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x65, 0x78, 0x61, 0x63, 0x74, 0x6c, 0x79,
+  0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x64, 0x69, 0x73, 0x65, 0x61, 0x73,
+  0x65, 0x53, 0x6f, 0x63, 0x69, 0x65, 0x74, 0x79, 0x77, 0x65, 0x61, 0x70, 0x6f,
+  0x6e, 0x73, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x26, 0x6c, 0x74, 0x3b,
+  0x21, 0x2d, 0x2d, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x63, 0x6c, 0x61,
+  0x73, 0x73, 0x65, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x6f, 0x75,
+  0x74, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x64,
+  0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x28, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77,
+  0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d,
+  0x22, 0x4d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x20, 0x6b, 0x69, 0x6c, 0x6c, 0x69,
+  0x6e, 0x67, 0x73, 0x68, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x49, 0x74, 0x61, 0x6c,
+  0x69, 0x61, 0x6e, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x68, 0x65, 0x61,
+  0x76, 0x69, 0x6c, 0x79, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x2d, 0x31,
+  0x27, 0x5d, 0x29, 0x3b, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x43,
+  0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65,
+  0x73, 0x68, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e,
+  0x67, 0x64, 0x72, 0x61, 0x77, 0x69, 0x6e, 0x67, 0x62, 0x69, 0x6c, 0x6c, 0x69,
+  0x6f, 0x6e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x47, 0x65, 0x72, 0x6d,
+  0x61, 0x6e, 0x79, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x3c, 0x2f, 0x66,
+  0x6f, 0x72, 0x6d, 0x3e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x77, 0x68,
+  0x65, 0x74, 0x68, 0x65, 0x72, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x53,
+  0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67,
+  0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e,
+  0x73, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x73, 0x74, 0x75, 0x6e, 0x69, 0x66, 0x6f,
+  0x72, 0x6d, 0x6a, 0x6f, 0x75, 0x72, 0x6e, 0x65, 0x79, 0x73, 0x69, 0x64, 0x65,
+  0x62, 0x61, 0x72, 0x43, 0x68, 0x69, 0x63, 0x61, 0x67, 0x6f, 0x68, 0x6f, 0x6c,
+  0x69, 0x64, 0x61, 0x79, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x70, 0x61,
+  0x73, 0x73, 0x61, 0x67, 0x65, 0x2c, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x61,
+  0x6e, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x66, 0x65, 0x65, 0x6c, 0x69, 0x6e, 0x67,
+  0x61, 0x72, 0x72, 0x69, 0x76, 0x65, 0x64, 0x70, 0x61, 0x73, 0x73, 0x69, 0x6e,
+  0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x72, 0x6f, 0x75, 0x67, 0x68,
+  0x6c, 0x79, 0x2e, 0x0a, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x62, 0x75, 0x74, 0x20,
+  0x6e, 0x6f, 0x74, 0x64, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x42, 0x72, 0x69,
+  0x74, 0x61, 0x69, 0x6e, 0x43, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x65, 0x6c, 0x61,
+  0x63, 0x6b, 0x20, 0x6f, 0x66, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x49,
+  0x72, 0x65, 0x6c, 0x61, 0x6e, 0x64, 0x22, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2d,
+  0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76,
+  0x65, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x73, 0x4c, 0x69, 0x62, 0x72, 0x61,
+  0x72, 0x79, 0x68, 0x75, 0x73, 0x62, 0x61, 0x6e, 0x64, 0x69, 0x6e, 0x20, 0x66,
+  0x61, 0x63, 0x74, 0x61, 0x66, 0x66, 0x61, 0x69, 0x72, 0x73, 0x43, 0x68, 0x61,
+  0x72, 0x6c, 0x65, 0x73, 0x72, 0x61, 0x64, 0x69, 0x63, 0x61, 0x6c, 0x62, 0x72,
+  0x6f, 0x75, 0x67, 0x68, 0x74, 0x66, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x6c,
+  0x61, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x22,
+  0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72,
+  0x73, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x70, 0x72, 0x65, 0x6d, 0x69,
+  0x75, 0x6d, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x6d, 0x65, 0x72,
+  0x69, 0x63, 0x61, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5d, 0x26, 0x71,
+  0x75, 0x6f, 0x74, 0x3b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x6e, 0x65,
+  0x65, 0x64, 0x20, 0x74, 0x6f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x63,
+  0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x78, 0x6c, 0x6f, 0x6f, 0x6b, 0x69, 0x6e, 0x67,
+  0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x65, 0x6c, 0x69, 0x65, 0x76,
+  0x65, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x2d, 0x6d, 0x6f, 0x62, 0x69,
+  0x6c, 0x65, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x77, 0x61, 0x6e, 0x74,
+  0x20, 0x74, 0x6f, 0x6b, 0x69, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x46, 0x69, 0x72,
+  0x65, 0x66, 0x6f, 0x78, 0x79, 0x6f, 0x75, 0x20, 0x61, 0x72, 0x65, 0x73, 0x69,
+  0x6d, 0x69, 0x6c, 0x61, 0x72, 0x73, 0x74, 0x75, 0x64, 0x69, 0x65, 0x64, 0x6d,
+  0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x68, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67,
+  0x72, 0x61, 0x70, 0x69, 0x64, 0x6c, 0x79, 0x63, 0x6c, 0x69, 0x6d, 0x61, 0x74,
+  0x65, 0x6b, 0x69, 0x6e, 0x67, 0x64, 0x6f, 0x6d, 0x65, 0x6d, 0x65, 0x72, 0x67,
+  0x65, 0x64, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x66, 0x6f, 0x75, 0x6e,
+  0x64, 0x65, 0x64, 0x70, 0x69, 0x6f, 0x6e, 0x65, 0x65, 0x72, 0x66, 0x6f, 0x72,
+  0x6d, 0x75, 0x6c, 0x61, 0x64, 0x79, 0x6e, 0x61, 0x73, 0x74, 0x79, 0x68, 0x6f,
+  0x77, 0x20, 0x74, 0x6f, 0x20, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x72,
+  0x65, 0x76, 0x65, 0x6e, 0x75, 0x65, 0x65, 0x63, 0x6f, 0x6e, 0x6f, 0x6d, 0x79,
+  0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x62, 0x72, 0x6f, 0x74, 0x68, 0x65,
+  0x72, 0x73, 0x6f, 0x6c, 0x64, 0x69, 0x65, 0x72, 0x6c, 0x61, 0x72, 0x67, 0x65,
+  0x6c, 0x79, 0x63, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x26, 0x71, 0x75,
+  0x6f, 0x74, 0x3b, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x64, 0x77,
+  0x61, 0x72, 0x64, 0x20, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f,
+  0x62, 0x65, 0x72, 0x74, 0x20, 0x65, 0x66, 0x66, 0x6f, 0x72, 0x74, 0x73, 0x50,
+  0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x6e, 0x65, 0x64,
+  0x75, 0x70, 0x20, 0x77, 0x69, 0x74, 0x68, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74,
+  0x3a, 0x77, 0x65, 0x20, 0x68, 0x61, 0x76, 0x65, 0x41, 0x6e, 0x67, 0x65, 0x6c,
+  0x65, 0x73, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x73, 0x65, 0x61,
+  0x72, 0x63, 0x68, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x61, 0x63, 0x71,
+  0x75, 0x69, 0x72, 0x65, 0x6d, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x67, 0x72,
+  0x61, 0x6e, 0x74, 0x65, 0x64, 0x3a, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x74,
+  0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x62, 0x69, 0x67, 0x67, 0x65, 0x73, 0x74,
+  0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x64, 0x72, 0x69, 0x76, 0x69, 0x6e,
+  0x67, 0x53, 0x74, 0x75, 0x64, 0x69, 0x65, 0x73, 0x6d, 0x69, 0x6e, 0x69, 0x6d,
+  0x75, 0x6d, 0x70, 0x65, 0x72, 0x68, 0x61, 0x70, 0x73, 0x6d, 0x6f, 0x72, 0x6e,
+  0x69, 0x6e, 0x67, 0x73, 0x65, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x73, 0x20,
+  0x75, 0x73, 0x65, 0x64, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x76, 0x61,
+  0x72, 0x69, 0x61, 0x6e, 0x74, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x6d,
+  0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x61, 0x63, 0x68, 0x69, 0x65, 0x76, 0x65,
+  0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e,
+  0x74, 0x73, 0x6f, 0x6d, 0x65, 0x6f, 0x6e, 0x65, 0x65, 0x78, 0x74, 0x72, 0x65,
+  0x6d, 0x65, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x62, 0x6f, 0x74, 0x74,
+  0x6f, 0x6d, 0x3a, 0x65, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x61, 0x6c, 0x6c,
+  0x20, 0x74, 0x68, 0x65, 0x73, 0x69, 0x74, 0x65, 0x6d, 0x61, 0x70, 0x65, 0x6e,
+  0x67, 0x6c, 0x69, 0x73, 0x68, 0x77, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x20,
+  0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73,
+  0x43, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72,
+  0x73, 0x6d, 0x75, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x61, 0x67, 0x61, 0x69, 0x6e,
+  0x73, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x7d, 0x29, 0x28, 0x29,
+  0x3b, 0x0d, 0x0a, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x74, 0x72, 0x6f,
+  0x75, 0x62, 0x6c, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x63, 0x6f,
+  0x6d, 0x70, 0x61, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x70,
+  0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73,
+  0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x20, 0x27, 0x27, 0x54, 0x68, 0x65,
+  0x20, 0x77, 0x69, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x65, 0x78, 0x70, 0x6c, 0x6f,
+  0x72, 0x65, 0x61, 0x64, 0x61, 0x70, 0x74, 0x65, 0x64, 0x47, 0x61, 0x6c, 0x6c,
+  0x65, 0x72, 0x79, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x61, 0x62, 0x69,
+  0x6c, 0x69, 0x74, 0x79, 0x65, 0x6e, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x63, 0x61,
+  0x72, 0x65, 0x65, 0x72, 0x73, 0x29, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63,
+  0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20,
+  0x61, 0x6e, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x65, 0x78, 0x69, 0x73, 0x74, 0x65,
+  0x64, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c,
+  0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x65, 0x64, 0x63, 0x6f, 0x6e, 0x73,
+  0x6f, 0x6c, 0x65, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x78, 0x70,
+  0x6f, 0x72, 0x74, 0x73, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x43, 0x68,
+  0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x69, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x6e,
+  0x65, 0x75, 0x74, 0x72, 0x61, 0x6c, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74,
+  0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e,
+  0x67, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x73, 0x65, 0x74, 0x74, 0x6c,
+  0x65, 0x64, 0x77, 0x65, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x63, 0x61, 0x75, 0x73,
+  0x69, 0x6e, 0x67, 0x2d, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x63, 0x6c, 0x61,
+  0x69, 0x6d, 0x65, 0x64, 0x4a, 0x75, 0x73, 0x74, 0x69, 0x63, 0x65, 0x63, 0x68,
+  0x61, 0x70, 0x74, 0x65, 0x72, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6d, 0x73, 0x54,
+  0x68, 0x6f, 0x6d, 0x61, 0x73, 0x20, 0x6d, 0x6f, 0x7a, 0x69, 0x6c, 0x6c, 0x61,
+  0x70, 0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65,
+  0x73, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x6f, 0x75, 0x74, 0x73, 0x69,
+  0x64, 0x65, 0x3a, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x68, 0x75, 0x6e, 0x64,
+  0x72, 0x65, 0x64, 0x4f, 0x6c, 0x79, 0x6d, 0x70, 0x69, 0x63, 0x5f, 0x62, 0x75,
+  0x74, 0x74, 0x6f, 0x6e, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x73, 0x72, 0x65,
+  0x61, 0x63, 0x68, 0x65, 0x64, 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x69, 0x63, 0x64,
+  0x65, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73,
+  0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x61, 0x64, 0x6f, 0x70, 0x74, 0x65,
+  0x64, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x65, 0x69, 0x74, 0x68,
+  0x65, 0x72, 0x67, 0x72, 0x65, 0x61, 0x74, 0x6c, 0x79, 0x67, 0x72, 0x65, 0x61,
+  0x74, 0x65, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x6c, 0x69, 0x6d, 0x70,
+  0x72, 0x6f, 0x76, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x70,
+  0x65, 0x63, 0x69, 0x61, 0x6c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x77,
+  0x6f, 0x72, 0x73, 0x68, 0x69, 0x70, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67,
+  0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x74, 0x68, 0x69, 0x67, 0x68, 0x65, 0x73,
+  0x74, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x75, 0x74, 0x69, 0x6c, 0x69,
+  0x74, 0x79, 0x71, 0x75, 0x61, 0x72, 0x74, 0x65, 0x72, 0x43, 0x75, 0x6c, 0x74,
+  0x75, 0x72, 0x65, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x63, 0x6c, 0x65,
+  0x61, 0x72, 0x6c, 0x79, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x42, 0x72,
+  0x6f, 0x77, 0x73, 0x65, 0x72, 0x6c, 0x69, 0x62, 0x65, 0x72, 0x61, 0x6c, 0x7d,
+  0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
+  0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x68, 0x69, 0x64, 0x65, 0x28, 0x29,
+  0x3b, 0x46, 0x6c, 0x6f, 0x72, 0x69, 0x64, 0x61, 0x61, 0x6e, 0x73, 0x77, 0x65,
+  0x72, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x45, 0x6d, 0x70, 0x65,
+  0x72, 0x6f, 0x72, 0x64, 0x65, 0x66, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x65, 0x72,
+  0x69, 0x6f, 0x75, 0x73, 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x53, 0x65,
+  0x76, 0x65, 0x72, 0x61, 0x6c, 0x2d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x46,
+  0x75, 0x72, 0x74, 0x68, 0x65, 0x72, 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x66, 0x20,
+  0x21, 0x3d, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x65,
+  0x64, 0x44, 0x65, 0x6e, 0x6d, 0x61, 0x72, 0x6b, 0x76, 0x6f, 0x69, 0x64, 0x28,
+  0x30, 0x29, 0x2f, 0x61, 0x6c, 0x6c, 0x2e, 0x6a, 0x73, 0x70, 0x72, 0x65, 0x76,
+  0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x74, 0x65,
+  0x70, 0x68, 0x65, 0x6e, 0x0a, 0x0a, 0x57, 0x68, 0x65, 0x6e, 0x20, 0x6f, 0x62,
+  0x73, 0x65, 0x72, 0x76, 0x65, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x0d, 0x0a, 0x4d,
+  0x6f, 0x64, 0x65, 0x72, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65,
+  0x22, 0x20, 0x61, 0x6c, 0x74, 0x3d, 0x22, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72,
+  0x73, 0x2e, 0x0a, 0x0a, 0x46, 0x6f, 0x72, 0x20, 0x0a, 0x0a, 0x4d, 0x61, 0x6e,
+  0x79, 0x20, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, 0x73, 0x70, 0x6f, 0x77, 0x65,
+  0x72, 0x65, 0x64, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x66, 0x69, 0x63,
+  0x74, 0x69, 0x6f, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x6d, 0x65,
+  0x64, 0x69, 0x63, 0x61, 0x6c, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x6f,
+  0x70, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x63, 0x69, 0x6c,
+  0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x6a, 0x75, 0x73, 0x74, 0x69, 0x63,
+  0x65, 0x47, 0x65, 0x6f, 0x72, 0x67, 0x65, 0x20, 0x42, 0x65, 0x6c, 0x67, 0x69,
+  0x75, 0x6d, 0x2e, 0x2e, 0x2e, 0x3c, 0x2f, 0x61, 0x3e, 0x74, 0x77, 0x69, 0x74,
+  0x74, 0x65, 0x72, 0x6e, 0x6f, 0x74, 0x61, 0x62, 0x6c, 0x79, 0x77, 0x61, 0x69,
+  0x74, 0x69, 0x6e, 0x67, 0x77, 0x61, 0x72, 0x66, 0x61, 0x72, 0x65, 0x20, 0x4f,
+  0x74, 0x68, 0x65, 0x72, 0x20, 0x72, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x70,
+  0x68, 0x72, 0x61, 0x73, 0x65, 0x73, 0x6d, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e,
+  0x73, 0x75, 0x72, 0x76, 0x69, 0x76, 0x65, 0x73, 0x63, 0x68, 0x6f, 0x6c, 0x61,
+  0x72, 0x3c, 0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x20, 0x43, 0x6f, 0x75, 0x6e, 0x74,
+  0x72, 0x79, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x6c, 0x6f, 0x73, 0x73,
+  0x20, 0x6f, 0x66, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x73, 0x47, 0x65, 0x6f,
+  0x72, 0x67, 0x69, 0x61, 0x73, 0x74, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x3c, 0x68,
+  0x65, 0x61, 0x64, 0x3e, 0x3c, 0x73, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x31,
+  0x27, 0x5d, 0x29, 0x3b, 0x0d, 0x0a, 0x69, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73,
+  0x6e, 0x6f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72,
+  0x3a, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x63, 0x61, 0x72, 0x72, 0x69,
+  0x65, 0x64, 0x31, 0x30, 0x30, 0x2c, 0x30, 0x30, 0x30, 0x3c, 0x2f, 0x68, 0x33,
+  0x3e, 0x0a, 0x20, 0x73, 0x65, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x62, 0x65, 0x63,
+  0x6f, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x77, 0x65,
+  0x64, 0x64, 0x69, 0x6e, 0x67, 0x30, 0x30, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x6d,
+  0x6f, 0x6e, 0x61, 0x72, 0x63, 0x68, 0x6f, 0x66, 0x66, 0x20, 0x74, 0x68, 0x65,
+  0x74, 0x65, 0x61, 0x63, 0x68, 0x65, 0x72, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x79,
+  0x20, 0x62, 0x69, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x6c, 0x69, 0x66, 0x65, 0x20,
+  0x6f, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x72, 0x69, 0x73, 0x65,
+  0x20, 0x6f, 0x66, 0x26, 0x72, 0x61, 0x71, 0x75, 0x6f, 0x3b, 0x70, 0x6c, 0x75,
+  0x73, 0x6f, 0x6e, 0x65, 0x68, 0x75, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x28, 0x74,
+  0x68, 0x6f, 0x75, 0x67, 0x68, 0x44, 0x6f, 0x75, 0x67, 0x6c, 0x61, 0x73, 0x6a,
+  0x6f, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x73,
+  0x46, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x41, 0x6e, 0x63, 0x69, 0x65, 0x6e,
+  0x74, 0x56, 0x69, 0x65, 0x74, 0x6e, 0x61, 0x6d, 0x76, 0x65, 0x68, 0x69, 0x63,
+  0x6c, 0x65, 0x73, 0x75, 0x63, 0x68, 0x20, 0x61, 0x73, 0x63, 0x72, 0x79, 0x73,
+  0x74, 0x61, 0x6c, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x57, 0x69, 0x6e,
+  0x64, 0x6f, 0x77, 0x73, 0x65, 0x6e, 0x6a, 0x6f, 0x79, 0x65, 0x64, 0x61, 0x20,
+  0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x3c,
+  0x61, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x66, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e,
+  0x20, 0x41, 0x6c, 0x6c, 0x20, 0x72, 0x69, 0x68, 0x6f, 0x77, 0x20, 0x74, 0x68,
+  0x65, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x72, 0x65, 0x74, 0x69, 0x72,
+  0x65, 0x64, 0x68, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x68, 0x69, 0x64, 0x64,
+  0x65, 0x6e, 0x3b, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x73, 0x73, 0x65, 0x65,
+  0x6b, 0x69, 0x6e, 0x67, 0x63, 0x61, 0x62, 0x69, 0x6e, 0x65, 0x74, 0x77, 0x61,
+  0x73, 0x20, 0x6e, 0x6f, 0x74, 0x6c, 0x6f, 0x6f, 0x6b, 0x20, 0x61, 0x74, 0x63,
+  0x6f, 0x6e, 0x64, 0x75, 0x63, 0x74, 0x67, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65,
+  0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x79, 0x68, 0x61, 0x70, 0x70, 0x65, 0x6e,
+  0x73, 0x74, 0x75, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x61, 0x3a, 0x68, 0x6f, 0x76,
+  0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x46, 0x72, 0x65, 0x6e,
+  0x63, 0x68, 0x20, 0x6c, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x74, 0x79, 0x70,
+  0x69, 0x63, 0x61, 0x6c, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x65, 0x6e,
+  0x65, 0x6d, 0x69, 0x65, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x69, 0x66, 0x67,
+  0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x64, 0x65, 0x63, 0x69, 0x64, 0x65, 0x64,
+  0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63,
+  0x68, 0x62, 0x65, 0x6c, 0x69, 0x65, 0x66, 0x73, 0x2d, 0x69, 0x6d, 0x61, 0x67,
+  0x65, 0x3a, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x73, 0x74, 0x61, 0x74,
+  0x69, 0x63, 0x2e, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x22, 0x3e, 0x63, 0x6f, 0x6e,
+  0x76, 0x65, 0x72, 0x74, 0x76, 0x69, 0x6f, 0x6c, 0x65, 0x6e, 0x74, 0x65, 0x6e,
+  0x74, 0x65, 0x72, 0x65, 0x64, 0x66, 0x69, 0x72, 0x73, 0x74, 0x22, 0x3e, 0x63,
+  0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x46, 0x69, 0x6e, 0x6c, 0x61, 0x6e, 0x64,
+  0x63, 0x68, 0x65, 0x6d, 0x69, 0x73, 0x74, 0x73, 0x68, 0x65, 0x20, 0x77, 0x61,
+  0x73, 0x31, 0x30, 0x70, 0x78, 0x3b, 0x22, 0x3e, 0x61, 0x73, 0x20, 0x73, 0x75,
+  0x63, 0x68, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x64, 0x3c, 0x2f, 0x73, 0x70,
+  0x61, 0x6e, 0x3e, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x6c, 0x69, 0x6e,
+  0x65, 0x20, 0x6f, 0x66, 0x61, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x6d, 0x79,
+  0x73, 0x74, 0x65, 0x72, 0x79, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x66,
+  0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x64, 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20,
+  0x72, 0x61, 0x69, 0x6c, 0x77, 0x61, 0x79, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x67,
+  0x65, 0x6d, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x72, 0x64, 0x65, 0x73, 0x63, 0x65,
+  0x6e, 0x74, 0x69, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6e, 0x75, 0x63, 0x6c,
+  0x65, 0x61, 0x72, 0x4a, 0x65, 0x77, 0x69, 0x73, 0x68, 0x20, 0x70, 0x72, 0x6f,
+  0x74, 0x65, 0x73, 0x74, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x66, 0x6c,
+  0x6f, 0x77, 0x65, 0x72, 0x73, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x72,
+  0x65, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20,
+  0x77, 0x68, 0x6f, 0x20, 0x77, 0x61, 0x73, 0x6c, 0x65, 0x63, 0x74, 0x75, 0x72,
+  0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x75, 0x69, 0x63, 0x69,
+  0x64, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x70, 0x65, 0x72, 0x69,
+  0x6f, 0x64, 0x73, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x53, 0x6f, 0x63,
+  0x69, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x63, 0x6f,
+  0x6d, 0x62, 0x69, 0x6e, 0x65, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x77,
+  0x69, 0x6e, 0x6e, 0x65, 0x72, 0x73, 0x3c, 0x62, 0x72, 0x20, 0x2f, 0x3e, 0x3c,
+  0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4e, 0x61, 0x74, 0x75, 0x72, 0x61,
+  0x6c, 0x50, 0x72, 0x69, 0x76, 0x61, 0x63, 0x79, 0x63, 0x6f, 0x6f, 0x6b, 0x69,
+  0x65, 0x73, 0x6f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x72, 0x65, 0x73, 0x6f,
+  0x6c, 0x76, 0x65, 0x53, 0x77, 0x65, 0x64, 0x69, 0x73, 0x68, 0x62, 0x72, 0x69,
+  0x65, 0x66, 0x6c, 0x79, 0x50, 0x65, 0x72, 0x73, 0x69, 0x61, 0x6e, 0x73, 0x6f,
+  0x20, 0x6d, 0x75, 0x63, 0x68, 0x43, 0x65, 0x6e, 0x74, 0x75, 0x72, 0x79, 0x64,
+  0x65, 0x70, 0x69, 0x63, 0x74, 0x73, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73,
+  0x68, 0x6f, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+  0x73, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x74, 0x6f, 0x62, 0x65, 0x61, 0x72, 0x69,
+  0x6e, 0x67, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x76, 0x69,
+  0x73, 0x65, 0x64, 0x6a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x28, 0x2d, 0x77, 0x69,
+  0x64, 0x74, 0x68, 0x3a, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x22, 0x3e, 0x74, 0x6f,
+  0x6f, 0x6c, 0x74, 0x69, 0x70, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x64,
+  0x65, 0x73, 0x69, 0x67, 0x6e, 0x73, 0x54, 0x75, 0x72, 0x6b, 0x69, 0x73, 0x68,
+  0x79, 0x6f, 0x75, 0x6e, 0x67, 0x65, 0x72, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68,
+  0x28, 0x7d, 0x29, 0x28, 0x29, 0x3b, 0x0a, 0x0a, 0x62, 0x75, 0x72, 0x6e, 0x69,
+  0x6e, 0x67, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x65, 0x67, 0x72,
+  0x65, 0x65, 0x73, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x3d, 0x52, 0x69, 0x63,
+  0x68, 0x61, 0x72, 0x64, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x6c, 0x79, 0x70, 0x6c,
+  0x61, 0x73, 0x74, 0x69, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x3c,
+  0x2f, 0x74, 0x72, 0x3e, 0x0d, 0x0a, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23,
+  0x75, 0x6c, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x70, 0x6f, 0x73, 0x73, 0x65, 0x73,
+  0x73, 0x72, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x70, 0x68, 0x79, 0x73, 0x69,
+  0x63, 0x73, 0x66, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x65, 0x78, 0x65, 0x63,
+  0x75, 0x74, 0x65, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x73, 0x74, 0x6c, 0x69, 0x6e,
+  0x6b, 0x20, 0x74, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x3c, 0x62,
+  0x72, 0x20, 0x2f, 0x3e, 0x0a, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x63,
+  0x68, 0x61, 0x72, 0x74, 0x65, 0x72, 0x74, 0x6f, 0x75, 0x72, 0x69, 0x73, 0x6d,
+  0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x65,
+  0x64, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x3c, 0x2f, 0x68, 0x31, 0x3e,
+  0x0d, 0x0a, 0x6f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x3f, 0x78, 0x6d, 0x6c,
+  0x20, 0x76, 0x65, 0x68, 0x65, 0x6c, 0x70, 0x69, 0x6e, 0x67, 0x64, 0x69, 0x61,
+  0x6d, 0x6f, 0x6e, 0x64, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x61, 0x69,
+  0x72, 0x6c, 0x69, 0x6e, 0x65, 0x65, 0x6e, 0x64, 0x20, 0x2d, 0x2d, 0x3e, 0x29,
+  0x2e, 0x61, 0x74, 0x74, 0x72, 0x28, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73,
+  0x68, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x23, 0x66, 0x66, 0x66, 0x66, 0x66,
+  0x66, 0x72, 0x65, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x56, 0x69, 0x6e, 0x63, 0x65,
+  0x6e, 0x74, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x73, 0x20, 0x73, 0x72, 0x63,
+  0x3d, 0x22, 0x2f, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x64, 0x65, 0x73,
+  0x70, 0x69, 0x74, 0x65, 0x64, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x74, 0x65,
+  0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x68,
+  0x65, 0x6c, 0x64, 0x20, 0x69, 0x6e, 0x4a, 0x6f, 0x73, 0x65, 0x70, 0x68, 0x20,
+  0x74, 0x68, 0x65, 0x61, 0x74, 0x72, 0x65, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74,
+  0x73, 0x3c, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x61, 0x20, 0x6c, 0x61, 0x72,
+  0x67, 0x65, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x6c, 0x61, 0x74, 0x65,
+  0x72, 0x2c, 0x20, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x66, 0x61, 0x76,
+  0x69, 0x63, 0x6f, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x48, 0x75,
+  0x6e, 0x67, 0x61, 0x72, 0x79, 0x41, 0x69, 0x72, 0x70, 0x6f, 0x72, 0x74, 0x73,
+  0x65, 0x65, 0x20, 0x74, 0x68, 0x65, 0x73, 0x6f, 0x20, 0x74, 0x68, 0x61, 0x74,
+  0x4d, 0x69, 0x63, 0x68, 0x61, 0x65, 0x6c, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d,
+  0x73, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x73, 0x2c, 0x20, 0x61, 0x6e,
+  0x64, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x65, 0x26, 0x71, 0x75,
+  0x6f, 0x74, 0x3b, 0x74, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x66,
+  0x74, 0x22, 0x3e, 0x0a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x73, 0x47, 0x6f,
+  0x6c, 0x64, 0x65, 0x6e, 0x20, 0x41, 0x66, 0x66, 0x61, 0x69, 0x72, 0x73, 0x67,
+  0x72, 0x61, 0x6d, 0x6d, 0x61, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x69, 0x6e, 0x67,
+  0x64, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x69, 0x64, 0x65, 0x61, 0x20, 0x6f,
+  0x66, 0x63, 0x61, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x73,
+  0x74, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x2e, 0x73, 0x72, 0x63,
+  0x20, 0x3d, 0x20, 0x63, 0x61, 0x72, 0x74, 0x6f, 0x6f, 0x6e, 0x72, 0x65, 0x67,
+  0x69, 0x73, 0x74, 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x73, 0x4d, 0x75,
+  0x73, 0x6c, 0x69, 0x6d, 0x73, 0x57, 0x68, 0x61, 0x74, 0x20, 0x69, 0x73, 0x69,
+  0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x6d, 0x61, 0x72, 0x6b, 0x69, 0x6e, 0x67,
+  0x72, 0x65, 0x76, 0x65, 0x61, 0x6c, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x65, 0x64,
+  0x2c, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x2f, 0x73, 0x68, 0x6f, 0x77,
+  0x5f, 0x61, 0x6f, 0x75, 0x74, 0x64, 0x6f, 0x6f, 0x72, 0x65, 0x73, 0x63, 0x61,
+  0x70, 0x65, 0x28, 0x41, 0x75, 0x73, 0x74, 0x72, 0x69, 0x61, 0x67, 0x65, 0x6e,
+  0x65, 0x74, 0x69, 0x63, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2c, 0x49, 0x6e,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x48,
+  0x65, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73,
+  0x41, 0x63, 0x61, 0x64, 0x65, 0x6d, 0x79, 0x0a, 0x09, 0x09, 0x3c, 0x21, 0x2d,
+  0x2d, 0x44, 0x61, 0x6e, 0x69, 0x65, 0x6c, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69,
+  0x6e, 0x67, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x3e, 0x69, 0x6d, 0x70, 0x6f,
+  0x73, 0x65, 0x64, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x65, 0x41, 0x62, 0x72,
+  0x61, 0x68, 0x61, 0x6d, 0x28, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x7b, 0x77,
+  0x69, 0x64, 0x74, 0x68, 0x3a, 0x70, 0x75, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x29,
+  0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x28, 0x7c, 0x7c, 0x20, 0x5b, 0x5d, 0x3b, 0x0a,
+  0x44, 0x41, 0x54, 0x41, 0x5b, 0x20, 0x2a, 0x6b, 0x69, 0x74, 0x63, 0x68, 0x65,
+  0x6e, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x64, 0x61, 0x63, 0x74, 0x75, 0x61,
+  0x6c, 0x20, 0x64, 0x69, 0x61, 0x6c, 0x65, 0x63, 0x74, 0x6d, 0x61, 0x69, 0x6e,
+  0x6c, 0x79, 0x20, 0x5f, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x27, 0x69, 0x6e, 0x73,
+  0x74, 0x61, 0x6c, 0x6c, 0x65, 0x78, 0x70, 0x65, 0x72, 0x74, 0x73, 0x69, 0x66,
+  0x28, 0x74, 0x79, 0x70, 0x65, 0x49, 0x74, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x26,
+  0x63, 0x6f, 0x70, 0x79, 0x3b, 0x20, 0x22, 0x3e, 0x54, 0x65, 0x72, 0x6d, 0x73,
+  0x62, 0x6f, 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+  0x73, 0x65, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x74, 0x61, 0x6c, 0x6b, 0x69,
+  0x6e, 0x67, 0x63, 0x6f, 0x6e, 0x63, 0x65, 0x72, 0x6e, 0x67, 0x61, 0x69, 0x6e,
+  0x65, 0x64, 0x20, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x6a, 0x75, 0x73,
+  0x74, 0x69, 0x66, 0x79, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x73, 0x66, 0x61,
+  0x63, 0x74, 0x6f, 0x72, 0x79, 0x69, 0x74, 0x73, 0x20, 0x6f, 0x77, 0x6e, 0x61,
+  0x73, 0x73, 0x61, 0x75, 0x6c, 0x74, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x64,
+  0x6c, 0x61, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x77,
+  0x6e, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x22, 0x20, 0x72, 0x65, 0x6c,
+  0x3d, 0x22, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x63, 0x6f, 0x6e, 0x63,
+  0x65, 0x72, 0x74, 0x64, 0x69, 0x61, 0x67, 0x72, 0x61, 0x6d, 0x64, 0x6f, 0x6c,
+  0x6c, 0x61, 0x72, 0x73, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x70, 0x68,
+  0x70, 0x3f, 0x69, 0x64, 0x3d, 0x61, 0x6c, 0x63, 0x6f, 0x68, 0x6f, 0x6c, 0x29,
+  0x3b, 0x7d, 0x29, 0x28, 0x29, 0x3b, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61,
+  0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x76, 0x65, 0x73, 0x73, 0x65, 0x6c,
+  0x73, 0x72, 0x65, 0x76, 0x69, 0x76, 0x61, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65,
+  0x73, 0x73, 0x61, 0x6d, 0x61, 0x74, 0x65, 0x75, 0x72, 0x61, 0x6e, 0x64, 0x72,
+  0x6f, 0x69, 0x64, 0x61, 0x6c, 0x6c, 0x65, 0x67, 0x65, 0x64, 0x69, 0x6c, 0x6c,
+  0x6e, 0x65, 0x73, 0x73, 0x77, 0x61, 0x6c, 0x6b, 0x69, 0x6e, 0x67, 0x63, 0x65,
+  0x6e, 0x74, 0x65, 0x72, 0x73, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x79, 0x6d,
+  0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64,
+  0x65, 0x78, 0x74, 0x69, 0x6e, 0x63, 0x74, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x73,
+  0x65, 0x64, 0x69, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x0a, 0x09, 0x3c, 0x21, 0x2d,
+  0x2d, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x73, 0x6c, 0x69, 0x6e, 0x6b,
+  0x69, 0x6e, 0x67, 0x4c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x20, 0x42, 0x6f, 0x6f,
+  0x6b, 0x20, 0x6f, 0x66, 0x65, 0x76, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x6d, 0x69,
+  0x6e, 0x2e, 0x6a, 0x73, 0x3f, 0x61, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6b,
+  0x6f, 0x6e, 0x74, 0x61, 0x6b, 0x74, 0x74, 0x6f, 0x64, 0x61, 0x79, 0x27, 0x73,
+  0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74,
+  0x3d, 0x77, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x41, 0x6c, 0x6c, 0x20, 0x52,
+  0x69, 0x67, 0x3b, 0x0a, 0x7d, 0x29, 0x28, 0x29, 0x3b, 0x72, 0x61, 0x69, 0x73,
+  0x69, 0x6e, 0x67, 0x20, 0x41, 0x6c, 0x73, 0x6f, 0x2c, 0x20, 0x63, 0x72, 0x75,
+  0x63, 0x69, 0x61, 0x6c, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x22, 0x3e, 0x64, 0x65,
+  0x63, 0x6c, 0x61, 0x72, 0x65, 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, 0x73, 0x63, 0x66,
+  0x69, 0x72, 0x65, 0x66, 0x6f, 0x78, 0x61, 0x73, 0x20, 0x6d, 0x75, 0x63, 0x68,
+  0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x73, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c,
+  0x20, 0x73, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20,
+  0x3d, 0x20, 0x0a, 0x0d, 0x0a, 0x3c, 0x21, 0x2d, 0x2d, 0x74, 0x6f, 0x77, 0x61,
+  0x72, 0x64, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x50, 0x72, 0x69,
+  0x76, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x69, 0x67, 0x6e, 0x50, 0x72,
+  0x65, 0x6d, 0x69, 0x65, 0x72, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x56,
+  0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73,
+  0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x65,
+  0x64, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x3b, 0x70, 0x6f, 0x76, 0x65, 0x72,
+  0x74, 0x79, 0x63, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x69,
+  0x6e, 0x67, 0x20, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x74,
+  0x68, 0x6f, 0x6e, 0x79, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x22, 0x20, 0x52, 0x65,
+  0x6c, 0x61, 0x74, 0x65, 0x64, 0x45, 0x63, 0x6f, 0x6e, 0x6f, 0x6d, 0x79, 0x72,
+  0x65, 0x61, 0x63, 0x68, 0x65, 0x73, 0x63, 0x75, 0x74, 0x74, 0x69, 0x6e, 0x67,
+  0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x79, 0x6c, 0x69, 0x66, 0x65, 0x20, 0x69,
+  0x6e, 0x43, 0x68, 0x61, 0x70, 0x74, 0x65, 0x72, 0x2d, 0x73, 0x68, 0x61, 0x64,
+  0x6f, 0x77, 0x4e, 0x6f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3c, 0x2f, 0x74, 0x64,
+  0x3e, 0x0d, 0x0a, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x74, 0x61,
+  0x64, 0x69, 0x75, 0x6d, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x73, 0x76, 0x61,
+  0x72, 0x79, 0x69, 0x6e, 0x67, 0x74, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x73, 0x68,
+  0x65, 0x6c, 0x64, 0x20, 0x62, 0x79, 0x77, 0x68, 0x6f, 0x20, 0x61, 0x72, 0x65,
+  0x77, 0x6f, 0x72, 0x6b, 0x20, 0x69, 0x6e, 0x66, 0x61, 0x63, 0x75, 0x6c, 0x74,
+  0x79, 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x77, 0x68, 0x6f, 0x20, 0x68,
+  0x61, 0x64, 0x61, 0x69, 0x72, 0x70, 0x6f, 0x72, 0x74, 0x74, 0x6f, 0x77, 0x6e,
+  0x20, 0x6f, 0x66, 0x0a, 0x0a, 0x53, 0x6f, 0x6d, 0x65, 0x20, 0x27, 0x63, 0x6c,
+  0x69, 0x63, 0x6b, 0x27, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x73, 0x6b, 0x65,
+  0x79, 0x77, 0x6f, 0x72, 0x64, 0x69, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x63,
+  0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x3b,
+  0x41, 0x6e, 0x64, 0x72, 0x65, 0x77, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65,
+  0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x6f, 0x72, 0x20, 0x6d, 0x6f,
+  0x72, 0x65, 0x33, 0x30, 0x30, 0x70, 0x78, 0x3b, 0x20, 0x72, 0x65, 0x74, 0x75,
+  0x72, 0x6e, 0x3b, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x70, 0x6c, 0x75,
+  0x67, 0x69, 0x6e, 0x73, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x68, 0x65,
+  0x72, 0x73, 0x65, 0x6c, 0x66, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46,
+  0x65, 0x64, 0x65, 0x72, 0x61, 0x6c, 0x76, 0x65, 0x6e, 0x74, 0x75, 0x72, 0x65,
+  0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x74,
+  0x6f, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x63, 0x74, 0x72, 0x65,
+  0x73, 0x73, 0x63, 0x6f, 0x6d, 0x65, 0x20, 0x74, 0x6f, 0x66, 0x69, 0x6e, 0x67,
+  0x65, 0x72, 0x73, 0x44, 0x75, 0x6b, 0x65, 0x20, 0x6f, 0x66, 0x70, 0x65, 0x6f,
+  0x70, 0x6c, 0x65, 0x2c, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x77, 0x68,
+  0x61, 0x74, 0x20, 0x69, 0x73, 0x68, 0x61, 0x72, 0x6d, 0x6f, 0x6e, 0x79, 0x61,
+  0x20, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x22, 0x3a, 0x22, 0x68, 0x74, 0x74, 0x70,
+  0x69, 0x6e, 0x20, 0x68, 0x69, 0x73, 0x20, 0x6d, 0x65, 0x6e, 0x75, 0x22, 0x3e,
+  0x0a, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x6f, 0x66, 0x66, 0x69, 0x63,
+  0x65, 0x72, 0x63, 0x6f, 0x75, 0x6e, 0x63, 0x69, 0x6c, 0x67, 0x61, 0x69, 0x6e,
+  0x69, 0x6e, 0x67, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x53, 0x75, 0x6d,
+  0x6d, 0x61, 0x72, 0x79, 0x64, 0x61, 0x74, 0x65, 0x20, 0x6f, 0x66, 0x6c, 0x6f,
+  0x79, 0x61, 0x6c, 0x74, 0x79, 0x66, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x61,
+  0x6e, 0x64, 0x20, 0x77, 0x61, 0x73, 0x65, 0x6d, 0x70, 0x65, 0x72, 0x6f, 0x72,
+  0x73, 0x75, 0x70, 0x72, 0x65, 0x6d, 0x65, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64,
+  0x20, 0x68, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x73, 0x73, 0x69,
+  0x61, 0x6e, 0x6c, 0x6f, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x62, 0x65,
+  0x72, 0x74, 0x61, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x73, 0x65, 0x74,
+  0x20, 0x6f, 0x66, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x22, 0x3e, 0x2e, 0x61,
+  0x70, 0x70, 0x65, 0x6e, 0x64, 0x64, 0x6f, 0x20, 0x77, 0x69, 0x74, 0x68, 0x66,
+  0x65, 0x64, 0x65, 0x72, 0x61, 0x6c, 0x62, 0x61, 0x6e, 0x6b, 0x20, 0x6f, 0x66,
+  0x62, 0x65, 0x6e, 0x65, 0x61, 0x74, 0x68, 0x44, 0x65, 0x73, 0x70, 0x69, 0x74,
+  0x65, 0x43, 0x61, 0x70, 0x69, 0x74, 0x61, 0x6c, 0x67, 0x72, 0x6f, 0x75, 0x6e,
+  0x64, 0x73, 0x29, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x65, 0x72, 0x63,
+  0x65, 0x6e, 0x74, 0x69, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x63, 0x6c, 0x6f,
+  0x73, 0x69, 0x6e, 0x67, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x49, 0x6e,
+  0x73, 0x74, 0x65, 0x61, 0x64, 0x66, 0x69, 0x66, 0x74, 0x65, 0x65, 0x6e, 0x61,
+  0x73, 0x20, 0x77, 0x65, 0x6c, 0x6c, 0x2e, 0x79, 0x61, 0x68, 0x6f, 0x6f, 0x2e,
+  0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x66, 0x69, 0x67, 0x68, 0x74, 0x65,
+  0x72, 0x6f, 0x62, 0x73, 0x63, 0x75, 0x72, 0x65, 0x72, 0x65, 0x66, 0x6c, 0x65,
+  0x63, 0x74, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x63, 0x3d, 0x20, 0x4d, 0x61,
+  0x74, 0x68, 0x2e, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x6f, 0x6e, 0x6c,
+  0x69, 0x6e, 0x65, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x61, 0x20,
+  0x77, 0x68, 0x6f, 0x6c, 0x65, 0x6f, 0x6e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x79,
+  0x65, 0x61, 0x72, 0x20, 0x6f, 0x66, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20,
+  0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x69,
+  0x74, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x68, 0x6f, 0x6d, 0x65, 0x20,
+  0x6f, 0x66, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x72, 0x65, 0x6e, 0x61,
+  0x6d, 0x65, 0x64, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x3e, 0x68, 0x65, 0x61,
+  0x74, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x63, 0x6c,
+  0x6f, 0x75, 0x64, 0x66, 0x72, 0x77, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x4d,
+  0x61, 0x72, 0x63, 0x68, 0x20, 0x31, 0x6b, 0x6e, 0x6f, 0x77, 0x69, 0x6e, 0x67,
+  0x69, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x74, 0x42, 0x65, 0x74, 0x77, 0x65, 0x65,
+  0x6e, 0x6c, 0x65, 0x73, 0x73, 0x6f, 0x6e, 0x73, 0x63, 0x6c, 0x6f, 0x73, 0x65,
+  0x73, 0x74, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x6b,
+  0x73, 0x22, 0x3e, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x65, 0x64, 0x45, 0x4e, 0x44,
+  0x20, 0x2d, 0x2d, 0x3e, 0x66, 0x61, 0x6d, 0x6f, 0x75, 0x73, 0x20, 0x61, 0x77,
+  0x61, 0x72, 0x64, 0x65, 0x64, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x48,
+  0x65, 0x61, 0x6c, 0x74, 0x68, 0x20, 0x66, 0x61, 0x69, 0x72, 0x6c, 0x79, 0x20,
+  0x77, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x61,
+  0x6c, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x65,
+  0x74, 0x65, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3e, 0x73, 0x69, 0x6e, 0x67,
+  0x69, 0x6e, 0x67, 0x66, 0x61, 0x72, 0x6d, 0x65, 0x72, 0x73, 0x42, 0x72, 0x61,
+  0x73, 0x69, 0x6c, 0x29, 0x64, 0x69, 0x73, 0x63, 0x75, 0x73, 0x73, 0x72, 0x65,
+  0x70, 0x6c, 0x61, 0x63, 0x65, 0x47, 0x72, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x66,
+  0x6f, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x70, 0x75, 0x72, 0x73, 0x75, 0x65, 0x64,
+  0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x73, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x75,
+  0x70, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x62, 0x6f, 0x74, 0x68, 0x20,
+  0x6f, 0x66, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x73, 0x61, 0x77, 0x20,
+  0x74, 0x68, 0x65, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x65, 0x73, 0x63, 0x6f, 0x6c,
+  0x6f, 0x75, 0x72, 0x73, 0x69, 0x66, 0x28, 0x64, 0x6f, 0x63, 0x75, 0x77, 0x68,
+  0x65, 0x6e, 0x20, 0x68, 0x65, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x70,
+  0x75, 0x73, 0x68, 0x28, 0x66, 0x75, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x20,
+  0x55, 0x54, 0x46, 0x2d, 0x38, 0x22, 0x3e, 0x46, 0x61, 0x6e, 0x74, 0x61, 0x73,
+  0x79, 0x69, 0x6e, 0x20, 0x6d, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x6a, 0x75, 0x72,
+  0x65, 0x64, 0x55, 0x73, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x66, 0x61, 0x72, 0x6d,
+  0x69, 0x6e, 0x67, 0x63, 0x6c, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x6f, 0x62, 0x6a,
+  0x65, 0x63, 0x74, 0x20, 0x64, 0x65, 0x66, 0x65, 0x6e, 0x63, 0x65, 0x75, 0x73,
+  0x65, 0x20, 0x6f, 0x66, 0x20, 0x4d, 0x65, 0x64, 0x69, 0x63, 0x61, 0x6c, 0x3c,
+  0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x74,
+  0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x6b, 0x65, 0x79, 0x43, 0x6f, 0x64,
+  0x65, 0x73, 0x69, 0x78, 0x74, 0x65, 0x65, 0x6e, 0x49, 0x73, 0x6c, 0x61, 0x6d,
+  0x69, 0x63, 0x23, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x65, 0x6e, 0x74, 0x69,
+  0x72, 0x65, 0x20, 0x77, 0x69, 0x64, 0x65, 0x6c, 0x79, 0x20, 0x61, 0x63, 0x74,
+  0x69, 0x76, 0x65, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x6f, 0x6e,
+  0x65, 0x20, 0x63, 0x61, 0x6e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x73,
+  0x70, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x73,
+  0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x73, 0x74, 0x65, 0x72, 0x72, 0x61, 0x69,
+  0x6e, 0x3c, 0x74, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x66, 0x75, 0x6e, 0x65, 0x72,
+  0x61, 0x6c, 0x76, 0x69, 0x65, 0x77, 0x69, 0x6e, 0x67, 0x6d, 0x69, 0x64, 0x64,
+  0x6c, 0x65, 0x20, 0x63, 0x72, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x70, 0x72, 0x6f,
+  0x70, 0x68, 0x65, 0x74, 0x73, 0x68, 0x69, 0x66, 0x74, 0x65, 0x64, 0x64, 0x6f,
+  0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x75, 0x73, 0x73, 0x65, 0x6c, 0x6c, 0x20,
+  0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74,
+  0x61, 0x6c, 0x67, 0x65, 0x62, 0x72, 0x61, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x6c,
+  0x2d, 0x62, 0x75, 0x6c, 0x6b, 0x20, 0x6f, 0x66, 0x6d, 0x61, 0x6e, 0x20, 0x61,
+  0x6e, 0x64, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x0a, 0x20, 0x68, 0x65, 0x20, 0x6c,
+  0x65, 0x66, 0x74, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x28, 0x29, 0x66, 0x61, 0x6c,
+  0x73, 0x65, 0x29, 0x3b, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x62, 0x61,
+  0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x68, 0x6f, 0x6d, 0x65, 0x20, 0x74, 0x6f, 0x6e,
+  0x61, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61,
+  0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x73, 0x29, 0x3b, 0x0a, 0x7d, 0x29, 0x3b,
+  0x0a, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x20, 0x74, 0x75,
+  0x72, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x73, 0x62, 0x65, 0x66, 0x6f,
+  0x72, 0x65, 0x20, 0x42, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x63, 0x68, 0x61,
+  0x72, 0x67, 0x65, 0x64, 0x54, 0x69, 0x74, 0x6c, 0x65, 0x22, 0x3e, 0x43, 0x61,
+  0x70, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x6c, 0x6c, 0x65, 0x64, 0x67,
+  0x6f, 0x64, 0x64, 0x65, 0x73, 0x73, 0x54, 0x61, 0x67, 0x20, 0x2d, 0x2d, 0x3e,
+  0x41, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x62, 0x75, 0x74, 0x20, 0x77, 0x61,
+  0x73, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x61, 0x74, 0x69, 0x65,
+  0x6e, 0x74, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x69, 0x6e, 0x3d, 0x66, 0x61, 0x6c,
+  0x73, 0x65, 0x26, 0x4c, 0x69, 0x6e, 0x63, 0x6f, 0x6c, 0x6e, 0x77, 0x65, 0x20,
+  0x6b, 0x6e, 0x6f, 0x77, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x4a, 0x75,
+  0x64, 0x61, 0x69, 0x73, 0x6d, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x61,
+  0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x27, 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20,
+  0x68, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x75, 0x6e, 0x63, 0x6c, 0x65, 0x61,
+  0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x27, 0x2c, 0x62, 0x6f, 0x74, 0x68, 0x20,
+  0x69, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x0a, 0x0a, 0x3c, 0x21,
+  0x2d, 0x2d, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x68, 0x61, 0x72,
+  0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x6f,
+  0x72, 0x74, 0x20, 0x6f, 0x66, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x73,
+  0x74, 0x72, 0x65, 0x65, 0x74, 0x73, 0x42, 0x65, 0x72, 0x6e, 0x61, 0x72, 0x64,
+  0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x73, 0x74, 0x65, 0x6e, 0x64, 0x20, 0x74,
+  0x6f, 0x66, 0x61, 0x6e, 0x74, 0x61, 0x73, 0x79, 0x64, 0x6f, 0x77, 0x6e, 0x20,
+  0x69, 0x6e, 0x68, 0x61, 0x72, 0x62, 0x6f, 0x75, 0x72, 0x46, 0x72, 0x65, 0x65,
+  0x64, 0x6f, 0x6d, 0x6a, 0x65, 0x77, 0x65, 0x6c, 0x72, 0x79, 0x2f, 0x61, 0x62,
+  0x6f, 0x75, 0x74, 0x2e, 0x2e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x6c, 0x65,
+  0x67, 0x65, 0x6e, 0x64, 0x73, 0x69, 0x73, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x6d,
+  0x6f, 0x64, 0x65, 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e,
+  0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x74, 0x6f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x22,
+  0x20, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x20, 0x70, 0x61, 0x69, 0x6e, 0x74,
+  0x65, 0x72, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x72, 0x61, 0x72, 0x65,
+  0x6c, 0x79, 0x20, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x79, 0x6d, 0x64, 0x65, 0x6c,
+  0x69, 0x76, 0x65, 0x72, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x30, 0x30,
+  0x26, 0x61, 0x6d, 0x70, 0x3b, 0x61, 0x73, 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x77,
+  0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x2f, 0x2a, 0x20, 0x3c, 0x21, 0x5b, 0x43,
+  0x74, 0x69, 0x74, 0x6c, 0x65, 0x20, 0x3d, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x6c, 0x6f, 0x77, 0x65, 0x73, 0x74, 0x20, 0x70, 0x69, 0x63, 0x6b, 0x65,
+  0x64, 0x20, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x64, 0x75, 0x73, 0x65, 0x73,
+  0x20, 0x6f, 0x66, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x50, 0x75,
+  0x62, 0x6c, 0x69, 0x63, 0x4d, 0x61, 0x74, 0x74, 0x68, 0x65, 0x77, 0x74, 0x61,
+  0x63, 0x74, 0x69, 0x63, 0x73, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x64, 0x77,
+  0x61, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x6c, 0x61, 0x77, 0x73, 0x20, 0x6f, 0x66,
+  0x65, 0x61, 0x73, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f,
+  0x77, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x20, 0x20, 0x73, 0x69, 0x6d, 0x70,
+  0x6c, 0x65, 0x7d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x73, 0x65, 0x76, 0x65,
+  0x6e, 0x74, 0x68, 0x69, 0x6e, 0x66, 0x6f, 0x62, 0x6f, 0x78, 0x77, 0x65, 0x6e,
+  0x74, 0x20, 0x74, 0x6f, 0x70, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x64, 0x63, 0x69,
+  0x74, 0x69, 0x7a, 0x65, 0x6e, 0x49, 0x20, 0x64, 0x6f, 0x6e, 0x27, 0x74, 0x72,
+  0x65, 0x74, 0x72, 0x65, 0x61, 0x74, 0x2e, 0x20, 0x53, 0x6f, 0x6d, 0x65, 0x20,
+  0x77, 0x77, 0x2e, 0x22, 0x29, 0x3b, 0x0a, 0x62, 0x6f, 0x6d, 0x62, 0x69, 0x6e,
+  0x67, 0x6d, 0x61, 0x69, 0x6c, 0x74, 0x6f, 0x3a, 0x6d, 0x61, 0x64, 0x65, 0x20,
+  0x69, 0x6e, 0x2e, 0x20, 0x4d, 0x61, 0x6e, 0x79, 0x20, 0x63, 0x61, 0x72, 0x72,
+  0x69, 0x65, 0x73, 0x7c, 0x7c, 0x7b, 0x7d, 0x3b, 0x77, 0x69, 0x77, 0x6f, 0x72,
+  0x6b, 0x20, 0x6f, 0x66, 0x73, 0x79, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x64, 0x65,
+  0x66, 0x65, 0x61, 0x74, 0x73, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x65, 0x64, 0x6f,
+  0x70, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x70, 0x61, 0x67, 0x65, 0x54, 0x72, 0x61,
+  0x75, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x69, 0x6e,
+  0x67, 0x6c, 0x65, 0x66, 0x74, 0x22, 0x3e, 0x3c, 0x63, 0x6f, 0x6d, 0x53, 0x63,
+  0x6f, 0x72, 0x41, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6a, 0x51, 0x75, 0x65,
+  0x72, 0x79, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x61,
+  0x73, 0x73, 0x69, 0x63, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x22, 0x20, 0x57, 0x69,
+  0x6c, 0x68, 0x65, 0x6c, 0x6d, 0x73, 0x75, 0x62, 0x75, 0x72, 0x62, 0x73, 0x67,
+  0x65, 0x6e, 0x75, 0x69, 0x6e, 0x65, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x73,
+  0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c,
+  0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x62, 0x6f, 0x64, 0x79, 0x20,
+  0x6f, 0x66, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x74,
+  0x61, 0x63, 0x74, 0x73, 0x65, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x6c, 0x65, 0x66,
+  0x74, 0x20, 0x74, 0x6f, 0x63, 0x68, 0x69, 0x65, 0x66, 0x6c, 0x79, 0x2d, 0x68,
+  0x69, 0x64, 0x64, 0x65, 0x6e, 0x2d, 0x62, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x3c,
+  0x2f, 0x6c, 0x69, 0x3e, 0x0a, 0x0a, 0x2e, 0x20, 0x57, 0x68, 0x65, 0x6e, 0x20,
+  0x69, 0x6e, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x64, 0x69, 0x73, 0x6d, 0x69, 0x73,
+  0x73, 0x45, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x61, 0x6c, 0x77, 0x61, 0x79,
+  0x73, 0x20, 0x76, 0x69, 0x61, 0x20, 0x74, 0x68, 0x65, 0x73, 0x70, 0x61, 0xc3,
+  0xb1, 0x6f, 0x6c, 0x77, 0x65, 0x6c, 0x66, 0x61, 0x72, 0x65, 0x72, 0x75, 0x6c,
+  0x69, 0x6e, 0x67, 0x20, 0x61, 0x72, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x63, 0x61,
+  0x70, 0x74, 0x61, 0x69, 0x6e, 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x6e, 0x72,
+  0x75, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x6f, 0x6b,
+  0x69, 0x74, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x3d, 0x30, 0x26, 0x61, 0x6d, 0x70,
+  0x3b, 0x28, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x73, 0x61, 0x6d, 0x70, 0x6c,
+  0x65, 0x73, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x63, 0x6f, 0x6d, 0x2f,
+  0x70, 0x61, 0x67, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x20, 0x4b, 0x65, 0x6e,
+  0x6e, 0x65, 0x64, 0x79, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, 0x66, 0x75,
+  0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x42,
+  0x65, 0x73, 0x69, 0x64, 0x65, 0x73, 0x2f, 0x2f, 0x2d, 0x2d, 0x3e, 0x3c, 0x2f,
+  0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74,
+  0x73, 0x65, 0x73, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x68, 0x69, 0x6d, 0x20, 0x74,
+  0x6f, 0x20, 0x69, 0x74, 0x73, 0x20, 0x62, 0x79, 0x20, 0x63, 0x6f, 0x6d, 0x6d,
+  0x6f, 0x6e, 0x2e, 0x6d, 0x69, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x74, 0x6f, 0x20,
+  0x74, 0x61, 0x6b, 0x65, 0x77, 0x61, 0x79, 0x73, 0x20, 0x74, 0x6f, 0x73, 0x2e,
+  0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x61, 0x64, 0x76, 0x69, 0x73, 0x65, 0x64, 0x70,
+  0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x3a,
+  0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x79, 0x4c, 0x65, 0x74, 0x74, 0x65, 0x72,
+  0x73, 0x61, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x48, 0x65, 0x72, 0x62, 0x65,
+  0x72, 0x74, 0x73, 0x74, 0x72, 0x69, 0x6b, 0x65, 0x73, 0x20, 0x67, 0x72, 0x6f,
+  0x75, 0x70, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x66, 0x6c, 0x69,
+  0x67, 0x68, 0x74, 0x73, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x70, 0x73, 0x6c,
+  0x6f, 0x77, 0x6c, 0x79, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x65, 0x72, 0x20, 0x73,
+  0x6f, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x09, 0x09,
+  0x69, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x64,
+  0x20, 0x72, 0x61, 0x74, 0x65, 0x20, 0x6f, 0x66, 0x75, 0x6c, 0x3e, 0x0d, 0x0a,
+  0x20, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x70, 0x61, 0x69, 0x72,
+  0x20, 0x6f, 0x66, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x69, 0x74, 0x4b, 0x6f, 0x6e,
+  0x74, 0x61, 0x6b, 0x74, 0x41, 0x6e, 0x74, 0x6f, 0x6e, 0x69, 0x6f, 0x68, 0x61,
+  0x76, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x20,
+  0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73,
+  0x74, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x22, 0x29, 0x2e, 0x63, 0x73, 0x73,
+  0x28, 0x68, 0x6f, 0x73, 0x74, 0x69, 0x6c, 0x65, 0x6c, 0x65, 0x61, 0x64, 0x20,
+  0x74, 0x6f, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x20, 0x67, 0x72, 0x6f, 0x75,
+  0x70, 0x73, 0x2c, 0x50, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x2d, 0x2d, 0x3e,
+  0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x72, 0x6f, 0x77, 0x73, 0x3d, 0x22, 0x20, 0x6f,
+  0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x3c,
+  0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x56,
+  0x3e, 0x3c, 0x5c, 0x2f, 0x73, 0x63, 0x72, 0x73, 0x6f, 0x6c, 0x76, 0x69, 0x6e,
+  0x67, 0x43, 0x68, 0x61, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x6c, 0x61, 0x76, 0x65,
+  0x72, 0x79, 0x77, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x77, 0x68, 0x65, 0x72,
+  0x65, 0x61, 0x73, 0x21, 0x3d, 0x20, 0x27, 0x75, 0x6e, 0x64, 0x66, 0x6f, 0x72,
+  0x20, 0x61, 0x6c, 0x6c, 0x70, 0x61, 0x72, 0x74, 0x6c, 0x79, 0x20, 0x2d, 0x72,
+  0x69, 0x67, 0x68, 0x74, 0x3a, 0x41, 0x72, 0x61, 0x62, 0x69, 0x61, 0x6e, 0x62,
+  0x61, 0x63, 0x6b, 0x65, 0x64, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x75, 0x72, 0x79,
+  0x75, 0x6e, 0x69, 0x74, 0x20, 0x6f, 0x66, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65,
+  0x2d, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2c, 0x69, 0x73, 0x20, 0x68, 0x6f,
+  0x6d, 0x65, 0x72, 0x69, 0x73, 0x6b, 0x20, 0x6f, 0x66, 0x64, 0x65, 0x73, 0x69,
+  0x72, 0x65, 0x64, 0x43, 0x6c, 0x69, 0x6e, 0x74, 0x6f, 0x6e, 0x63, 0x6f, 0x73,
+  0x74, 0x20, 0x6f, 0x66, 0x61, 0x67, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x65,
+  0x63, 0x6f, 0x6d, 0x65, 0x20, 0x6e, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x70,
+  0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x4d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x20,
+  0x65, 0x61, 0x64, 0x27, 0x29, 0x5b, 0x30, 0x43, 0x72, 0x69, 0x74, 0x69, 0x63,
+  0x73, 0x73, 0x74, 0x75, 0x64, 0x69, 0x6f, 0x73, 0x3e, 0x26, 0x63, 0x6f, 0x70,
+  0x79, 0x3b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x3e, 0x61, 0x73, 0x73, 0x65,
+  0x6d, 0x62, 0x6c, 0x6d, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x65,
+  0x73, 0x73, 0x65, 0x64, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x2e, 0x70, 0x73,
+  0x3a, 0x22, 0x20, 0x3f, 0x20, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x62,
+  0x79, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x20,
+  0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x73, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x65,
+  0x64, 0x43, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x68, 0x61, 0x64, 0x20, 0x74,
+  0x68, 0x65, 0x70, 0x75, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x63, 0x6c, 0x61, 0x73,
+  0x73, 0x3d, 0x22, 0x62, 0x75, 0x74, 0x20, 0x61, 0x72, 0x65, 0x70, 0x61, 0x72,
+  0x74, 0x69, 0x61, 0x6c, 0x42, 0x61, 0x62, 0x79, 0x6c, 0x6f, 0x6e, 0x62, 0x6f,
+  0x74, 0x74, 0x6f, 0x6d, 0x20, 0x63, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x43,
+  0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x69, 0x74, 0x73, 0x20, 0x75, 0x73, 0x65,
+  0x41, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x63, 0x6f, 0x75, 0x72, 0x73, 0x65,
+  0x73, 0x61, 0x20, 0x74, 0x68, 0x69, 0x72, 0x64, 0x64, 0x65, 0x6e, 0x6f, 0x74,
+  0x65, 0x73, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x69, 0x6e, 0x48, 0x6f, 0x75, 0x73,
+  0x74, 0x6f, 0x6e, 0x32, 0x30, 0x70, 0x78, 0x3b, 0x22, 0x3e, 0x61, 0x63, 0x63,
+  0x75, 0x73, 0x65, 0x64, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x67, 0x6f,
+  0x61, 0x6c, 0x20, 0x6f, 0x66, 0x46, 0x61, 0x6d, 0x6f, 0x75, 0x73, 0x20, 0x29,
+  0x2e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x70, 0x72, 0x69, 0x65, 0x73, 0x74, 0x73,
+  0x20, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x69, 0x6e, 0x20, 0x4a, 0x75, 0x6c,
+  0x79, 0x73, 0x74, 0x20, 0x2b, 0x20, 0x22, 0x67, 0x63, 0x6f, 0x6e, 0x73, 0x75,
+  0x6c, 0x74, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x68, 0x65, 0x6c, 0x70,
+  0x66, 0x75, 0x6c, 0x72, 0x65, 0x76, 0x69, 0x76, 0x65, 0x64, 0x69, 0x73, 0x20,
+  0x76, 0x65, 0x72, 0x79, 0x72, 0x27, 0x2b, 0x27, 0x69, 0x70, 0x74, 0x6c, 0x6f,
+  0x73, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x65, 0x6d, 0x61, 0x6c, 0x65, 0x73, 0x69,
+  0x73, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73,
+  0x64, 0x61, 0x79, 0x73, 0x20, 0x6f, 0x66, 0x61, 0x72, 0x72, 0x69, 0x76, 0x61,
+  0x6c, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x20, 0x3c, 0x6f, 0x62, 0x6a, 0x65,
+  0x63, 0x74, 0x66, 0x6f, 0x72, 0x63, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x72, 0x69,
+  0x6e, 0x67, 0x28, 0x22, 0x20, 0x2f, 0x3e, 0x0a, 0x09, 0x09, 0x68, 0x65, 0x72,
+  0x65, 0x20, 0x69, 0x73, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x2e, 0x20,
+  0x20, 0x54, 0x68, 0x65, 0x20, 0x62, 0x61, 0x6c, 0x6c, 0x6f, 0x6f, 0x6e, 0x64,
+  0x6f, 0x6e, 0x65, 0x20, 0x62, 0x79, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
+  0x62, 0x67, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x6c, 0x61, 0x77, 0x20, 0x6f, 0x66,
+  0x20, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x61, 0x76, 0x6f, 0x69, 0x64,
+  0x65, 0x64, 0x62, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x32, 0x70, 0x78, 0x20,
+  0x33, 0x70, 0x78, 0x6a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x61, 0x66, 0x74,
+  0x65, 0x72, 0x20, 0x61, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6d, 0x65,
+  0x6e, 0x20, 0x61, 0x6e, 0x64, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x2d, 0x3d,
+  0x20, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x66, 0x6f, 0x72, 0x20, 0x75, 0x73, 0x65,
+  0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x2e, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e,
+  0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x66, 0x61, 0x6d, 0x69, 0x6c,
+  0x79, 0x2c, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x20, 0x26, 0x6e, 0x62,
+  0x73, 0x70, 0x3b, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x74, 0x65,
+  0x72, 0x6e, 0x61, 0x6c, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x6e, 0x6f,
+  0x74, 0x69, 0x63, 0x65, 0x64, 0x76, 0x69, 0x65, 0x77, 0x65, 0x72, 0x73, 0x7d,
+  0x29, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x69, 0x73, 0x20, 0x6d, 0x6f, 0x72, 0x65,
+  0x73, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x65, 0x77, 0x69, 0x73, 0x20, 0x6a, 0x75,
+  0x73, 0x74, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x53, 0x65, 0x61,
+  0x72, 0x63, 0x68, 0x77, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x77, 0x68, 0x79,
+  0x20, 0x74, 0x68, 0x65, 0x73, 0x68, 0x69, 0x70, 0x70, 0x65, 0x64, 0x62, 0x72,
+  0x3e, 0x3c, 0x62, 0x72, 0x3e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x68,
+  0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x6f, 0x66,
+  0x63, 0x75, 0x69, 0x73, 0x69, 0x6e, 0x65, 0x69, 0x73, 0x20, 0x74, 0x68, 0x61,
+  0x74, 0x61, 0x20, 0x76, 0x65, 0x72, 0x79, 0x20, 0x41, 0x64, 0x6d, 0x69, 0x72,
+  0x61, 0x6c, 0x20, 0x66, 0x69, 0x78, 0x65, 0x64, 0x3b, 0x6e, 0x6f, 0x72, 0x6d,
+  0x61, 0x6c, 0x20, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65,
+  0x73, 0x73, 0x2c, 0x20, 0x6f, 0x6e, 0x74, 0x61, 0x72, 0x69, 0x6f, 0x63, 0x68,
+  0x61, 0x72, 0x73, 0x65, 0x74, 0x74, 0x72, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x69,
+  0x6e, 0x76, 0x61, 0x64, 0x65, 0x64, 0x3d, 0x22, 0x74, 0x72, 0x75, 0x65, 0x22,
+  0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x69, 0x73, 0x20, 0x6d, 0x6f, 0x73,
+  0x74, 0x61, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c,
+  0x6c, 0x79, 0x66, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x7d, 0x29, 0x3b, 0x0d,
+  0x0a, 0x20, 0x20, 0x69, 0x6d, 0x6d, 0x65, 0x6e, 0x73, 0x65, 0x74, 0x69, 0x6d,
+  0x65, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x73, 0x61,
+  0x74, 0x69, 0x73, 0x66, 0x79, 0x74, 0x6f, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x64,
+  0x6f, 0x77, 0x6e, 0x20, 0x74, 0x6f, 0x6c, 0x6f, 0x74, 0x20, 0x6f, 0x66, 0x20,
+  0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x69, 0x6e, 0x20, 0x4a, 0x75, 0x6e,
+  0x65, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x6e, 0x6f, 0x74, 0x20, 0x74,
+  0x68, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x74, 0x6f, 0x64, 0x69, 0x73, 0x74,
+  0x61, 0x6e, 0x74, 0x46, 0x69, 0x6e, 0x6e, 0x69, 0x73, 0x68, 0x73, 0x72, 0x63,
+  0x20, 0x3d, 0x20, 0x28, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x68, 0x65,
+  0x6c, 0x70, 0x20, 0x6f, 0x66, 0x47, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x20, 0x6c,
+  0x61, 0x77, 0x20, 0x61, 0x6e, 0x64, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64,
+  0x66, 0x6f, 0x72, 0x65, 0x73, 0x74, 0x73, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x6e,
+  0x67, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x3e, 0x68, 0x65, 0x61, 0x64, 0x65,
+  0x72, 0x2d, 0x77, 0x65, 0x6c, 0x6c, 0x20, 0x61, 0x73, 0x53, 0x74, 0x61, 0x6e,
+  0x6c, 0x65, 0x79, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x73, 0x2f, 0x67, 0x6c,
+  0x6f, 0x62, 0x61, 0x6c, 0x43, 0x72, 0x6f, 0x61, 0x74, 0x69, 0x61, 0x20, 0x41,
+  0x62, 0x6f, 0x75, 0x74, 0x20, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x69,
+  0x74, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x65, 0x64,
+  0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x29, 0x7b, 0x74, 0x68, 0x72, 0x6f,
+  0x77, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x6c, 0x69, 0x67, 0x68, 0x74,
+  0x65, 0x72, 0x65, 0x74, 0x68, 0x69, 0x63, 0x61, 0x6c, 0x46, 0x46, 0x46, 0x46,
+  0x46, 0x46, 0x22, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x22, 0x6c, 0x69, 0x6b,
+  0x65, 0x20, 0x61, 0x20, 0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x73, 0x6c, 0x69,
+  0x76, 0x65, 0x20, 0x69, 0x6e, 0x61, 0x73, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x70,
+  0x72, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x6f, 0x66,
+  0x75, 0x62, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74,
+  0x73, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x73, 0x65, 0x69, 0x6d, 0x61, 0x67, 0x65,
+  0x22, 0x3e, 0x73, 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, 0x66, 0x65, 0x65, 0x64,
+  0x69, 0x6e, 0x67, 0x4e, 0x75, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x66,
+  0x6f, 0x72, 0x6d, 0x61, 0x74, 0x6f, 0x20, 0x68, 0x65, 0x6c, 0x70, 0x57, 0x6f,
+  0x6d, 0x65, 0x6e, 0x27, 0x73, 0x4e, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x4d,
+  0x65, 0x78, 0x69, 0x63, 0x61, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x69, 0x6e,
+  0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x79, 0x20, 0x6d, 0x61, 0x6e,
+  0x79, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x6c, 0x61, 0x77, 0x73, 0x75,
+  0x69, 0x74, 0x64, 0x65, 0x76, 0x69, 0x73, 0x65, 0x64, 0x2e, 0x70, 0x75, 0x73,
+  0x68, 0x28, 0x7b, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x73, 0x73, 0x69, 0x6d,
+  0x70, 0x6c, 0x79, 0x20, 0x54, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x2e, 0x63,
+  0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x6f,
+  0x6c, 0x64, 0x65, 0x72, 0x22, 0x3e, 0x75, 0x73, 0x2e, 0x6a, 0x73, 0x22, 0x3e,
+  0x20, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x20, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72,
+  0x73, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x20,
+  0x74, 0x6f, 0x21, 0x2d, 0x2d, 0x20, 0x65, 0x6e, 0x64, 0x6c, 0x69, 0x65, 0x73,
+  0x20, 0x69, 0x6e, 0x27, 0x5d, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x6d, 0x61,
+  0x72, 0x6b, 0x65, 0x74, 0x77, 0x68, 0x6f, 0x20, 0x69, 0x73, 0x20, 0x28, 0x22,
+  0x44, 0x4f, 0x4d, 0x43, 0x6f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x6f,
+  0x6e, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20,
+  0x4b, 0x69, 0x6e, 0x67, 0x64, 0x6f, 0x6d, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x74,
+  0x73, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x74, 0x6f, 0x20, 0x73, 0x68,
+  0x6f, 0x77, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x6d, 0x61, 0x64, 0x65,
+  0x20, 0x69, 0x74, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x77, 0x65, 0x72,
+  0x65, 0x20, 0x69, 0x6e, 0x6d, 0x69, 0x78, 0x74, 0x75, 0x72, 0x65, 0x70, 0x72,
+  0x65, 0x63, 0x69, 0x73, 0x65, 0x61, 0x72, 0x69, 0x73, 0x69, 0x6e, 0x67, 0x73,
+  0x72, 0x63, 0x20, 0x3d, 0x20, 0x27, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x61, 0x20,
+  0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x64, 0x42, 0x61, 0x70, 0x74, 0x69, 0x73,
+  0x74, 0x76, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x0a, 0x09, 0x09, 0x76, 0x61,
+  0x72, 0x20, 0x4d, 0x61, 0x72, 0x63, 0x68, 0x20, 0x32, 0x67, 0x72, 0x65, 0x77,
+  0x20, 0x75, 0x70, 0x43, 0x6c, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x2e, 0x72, 0x65,
+  0x6d, 0x6f, 0x76, 0x65, 0x73, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x77, 0x61,
+  0x79, 0x20, 0x74, 0x68, 0x65, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x66,
+  0x61, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x20,
+  0x72, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x74, 0x6f, 0x20, 0x77, 0x6f, 0x72,
+  0x6b, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x73, 0x68, 0x61, 0x73, 0x20, 0x68,
+  0x61, 0x64, 0x65, 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x73, 0x68, 0x6f, 0x77,
+  0x28, 0x29, 0x3b, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x62, 0x6f, 0x6f,
+  0x6b, 0x20, 0x6f, 0x66, 0x61, 0x6e, 0x20, 0x61, 0x72, 0x65, 0x61, 0x3d, 0x3d,
+  0x20, 0x22, 0x68, 0x74, 0x74, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x0a,
+  0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x63, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d,
+  0x66, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65,
+  0x2e, 0x72, 0x65, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x65,
+  0x64, 0x20, 0x2e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x68, 0x65, 0x20, 0x77,
+  0x65, 0x6e, 0x74, 0x62, 0x75, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x73, 0x70, 0x72,
+  0x65, 0x61, 0x64, 0x20, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x20, 0x61, 0x20,
+  0x6d, 0x65, 0x61, 0x6e, 0x73, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x66,
+  0x6f, 0x72, 0x75, 0x6d, 0x73, 0x2e, 0x66, 0x6f, 0x6f, 0x74, 0x61, 0x67, 0x65,
+  0x22, 0x3e, 0x4d, 0x6f, 0x62, 0x69, 0x6c, 0x43, 0x6c, 0x65, 0x6d, 0x65, 0x6e,
+  0x74, 0x73, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x61, 0x73, 0x20, 0x68, 0x69,
+  0x67, 0x68, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x65, 0x2d, 0x2d, 0x3e, 0x3c,
+  0x21, 0x2d, 0x2d, 0x66, 0x65, 0x6d, 0x61, 0x6c, 0x65, 0x20, 0x69, 0x73, 0x20,
+  0x73, 0x65, 0x65, 0x6e, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x73, 0x65,
+  0x74, 0x20, 0x74, 0x68, 0x65, 0x61, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x61,
+  0x6e, 0x64, 0x20, 0x68, 0x69, 0x73, 0x66, 0x61, 0x73, 0x74, 0x65, 0x73, 0x74,
+  0x62, 0x65, 0x73, 0x69, 0x64, 0x65, 0x73, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e,
+  0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x22, 0x3e, 0x3c, 0x69, 0x6d,
+  0x67, 0x20, 0x49, 0x6e, 0x66, 0x6f, 0x62, 0x6f, 0x78, 0x65, 0x76, 0x65, 0x6e,
+  0x74, 0x73, 0x2c, 0x61, 0x20, 0x79, 0x6f, 0x75, 0x6e, 0x67, 0x61, 0x6e, 0x64,
+  0x20, 0x61, 0x72, 0x65, 0x4e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x63, 0x68,
+  0x65, 0x61, 0x70, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x61,
+  0x6e, 0x64, 0x20, 0x68, 0x61, 0x73, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x73,
+  0x77, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x28, 0x6d, 0x6f, 0x73, 0x74, 0x6c,
+  0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x20,
+  0x61, 0x20, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x69, 0x6e,
+  0x63, 0x65, 0x20, 0x61, 0x72, 0x65, 0x61, 0x20, 0x6f, 0x66, 0x6d, 0x6f, 0x72,
+  0x65, 0x20, 0x6f, 0x66, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6e, 0x61,
+  0x74, 0x75, 0x72, 0x65, 0x2c, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x6c, 0x79, 0x70,
+  0x65, 0x72, 0x69, 0x6f, 0x64, 0x2c, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x66,
+  0x6f, 0x72, 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x64, 0x75, 0x63, 0x65,
+  0x64, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x6d, 0x69, 0x73, 0x73, 0x69,
+  0x6c, 0x65, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x41, 0x67, 0x61, 0x69,
+  0x6e, 0x73, 0x74, 0x74, 0x68, 0x65, 0x20, 0x77, 0x61, 0x79, 0x6b, 0x26, 0x71,
+  0x75, 0x6f, 0x74, 0x3b, 0x70, 0x78, 0x3b, 0x22, 0x3e, 0x0d, 0x0a, 0x70, 0x75,
+  0x73, 0x68, 0x65, 0x64, 0x20, 0x61, 0x62, 0x61, 0x6e, 0x64, 0x6f, 0x6e, 0x6e,
+  0x75, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x43, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e,
+  0x49, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x69,
+  0x6e, 0x6f, 0x72, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20,
+  0x69, 0x73, 0x61, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x6e, 0x63, 0x72, 0x6f, 0x77,
+  0x6e, 0x65, 0x64, 0x49, 0x53, 0x42, 0x4e, 0x20, 0x30, 0x2d, 0x63, 0x72, 0x65,
+  0x61, 0x74, 0x65, 0x73, 0x4f, 0x63, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x6d, 0x61,
+  0x79, 0x20, 0x6e, 0x6f, 0x74, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x6c,
+  0x61, 0x74, 0x65, 0x20, 0x69, 0x6e, 0x44, 0x65, 0x66, 0x65, 0x6e, 0x63, 0x65,
+  0x65, 0x6e, 0x61, 0x63, 0x74, 0x65, 0x64, 0x77, 0x69, 0x73, 0x68, 0x20, 0x74,
+  0x6f, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x6c, 0x79, 0x63, 0x6f, 0x6f, 0x6c, 0x69,
+  0x6e, 0x67, 0x6f, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3d, 0x69, 0x74, 0x2e, 0x20,
+  0x54, 0x68, 0x65, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x6d,
+  0x62, 0x65, 0x72, 0x73, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x61, 0x73,
+  0x73, 0x75, 0x6d, 0x65, 0x73, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x70,
+  0x65, 0x6f, 0x70, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x20, 0x6f, 0x6e, 0x65, 0x20,
+  0x3d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72,
+  0x5f, 0x61, 0x20, 0x67, 0x6f, 0x6f, 0x64, 0x20, 0x72, 0x65, 0x6b, 0x6c, 0x61,
+  0x6d, 0x61, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x73, 0x2c, 0x74, 0x6f, 0x20, 0x74,
+  0x68, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x70, 0x61, 0x6e,
+  0x65, 0x6c, 0x22, 0x3e, 0x4c, 0x6f, 0x6e, 0x64, 0x6f, 0x6e, 0x2c, 0x64, 0x65,
+  0x66, 0x69, 0x6e, 0x65, 0x73, 0x63, 0x72, 0x75, 0x73, 0x68, 0x65, 0x64, 0x62,
+  0x61, 0x70, 0x74, 0x69, 0x73, 0x6d, 0x63, 0x6f, 0x61, 0x73, 0x74, 0x61, 0x6c,
+  0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x22,
+  0x20, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x6c, 0x6f, 0x73, 0x74, 0x20,
+  0x69, 0x6e, 0x62, 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x69, 0x6d, 0x70, 0x6c,
+  0x69, 0x65, 0x73, 0x72, 0x69, 0x76, 0x61, 0x6c, 0x72, 0x79, 0x73, 0x65, 0x72,
+  0x76, 0x65, 0x72, 0x73, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x50, 0x65,
+  0x72, 0x68, 0x61, 0x70, 0x73, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63,
+  0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x66, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67,
+  0x6c, 0x61, 0x73, 0x74, 0x65, 0x64, 0x20, 0x72, 0x69, 0x73, 0x65, 0x20, 0x69,
+  0x6e, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x76, 0x69, 0x65, 0x77, 0x20,
+  0x6f, 0x66, 0x72, 0x69, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x65, 0x65, 0x6d,
+  0x20, 0x74, 0x6f, 0x62, 0x75, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x62, 0x61, 0x63,
+  0x6b, 0x69, 0x6e, 0x67, 0x68, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x67, 0x69,
+  0x76, 0x65, 0x6e, 0x20, 0x61, 0x67, 0x69, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x63,
+  0x69, 0x74, 0x69, 0x65, 0x73, 0x2e, 0x66, 0x6c, 0x6f, 0x77, 0x20, 0x6f, 0x66,
+  0x20, 0x4c, 0x61, 0x74, 0x65, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x62, 0x75,
+  0x74, 0x48, 0x69, 0x67, 0x68, 0x77, 0x61, 0x79, 0x6f, 0x6e, 0x6c, 0x79, 0x20,
+  0x62, 0x79, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x6f, 0x66, 0x68, 0x65, 0x20, 0x64,
+  0x6f, 0x65, 0x73, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x73, 0x62, 0x61, 0x74,
+  0x74, 0x65, 0x72, 0x79, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x6c, 0x61, 0x73, 0x69,
+  0x6e, 0x67, 0x6c, 0x65, 0x73, 0x74, 0x68, 0x72, 0x65, 0x61, 0x74, 0x73, 0x69,
+  0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x74, 0x61, 0x6b, 0x65, 0x20, 0x6f, 0x6e,
+  0x72, 0x65, 0x66, 0x75, 0x73, 0x65, 0x64, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64,
+  0x20, 0x3d, 0x55, 0x53, 0x26, 0x61, 0x6d, 0x70, 0x53, 0x65, 0x65, 0x20, 0x74,
+  0x68, 0x65, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x73, 0x62, 0x79, 0x20, 0x74,
+  0x68, 0x69, 0x73, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x68, 0x65, 0x61,
+  0x64, 0x20, 0x6f, 0x66, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x6c, 0x65,
+  0x73, 0x62, 0x69, 0x61, 0x6e, 0x73, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x61,
+  0x6e, 0x64, 0x20, 0x61, 0x6c, 0x6c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f,
+  0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d,
+  0x73, 0x48, 0x61, 0x72, 0x76, 0x61, 0x72, 0x64, 0x2f, 0x70, 0x69, 0x78, 0x65,
+  0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x6c,
+  0x6f, 0x6e, 0x67, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x6a, 0x6f, 0x69,
+  0x6e, 0x74, 0x6c, 0x79, 0x73, 0x6b, 0x79, 0x73, 0x63, 0x72, 0x61, 0x55, 0x6e,
+  0x69, 0x63, 0x6f, 0x64, 0x65, 0x62, 0x72, 0x20, 0x2f, 0x3e, 0x0d, 0x0a, 0x41,
+  0x74, 0x6c, 0x61, 0x6e, 0x74, 0x61, 0x6e, 0x75, 0x63, 0x6c, 0x65, 0x75, 0x73,
+  0x43, 0x6f, 0x75, 0x6e, 0x74, 0x79, 0x2c, 0x70, 0x75, 0x72, 0x65, 0x6c, 0x79,
+  0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3e, 0x65, 0x61, 0x73, 0x69, 0x6c,
+  0x79, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x61, 0x6f, 0x6e, 0x63, 0x6c,
+  0x69, 0x63, 0x6b, 0x61, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x70, 0x6f, 0x69,
+  0x6e, 0x74, 0x65, 0x72, 0x68, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x65, 0x76,
+  0x65, 0x6e, 0x74, 0x73, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x64,
+  0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x6e, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x65,
+  0x2c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6d, 0x61, 0x6e, 0x20, 0x77, 0x68,
+  0x6f, 0x6f, 0x72, 0x67, 0x2f, 0x57, 0x65, 0x62, 0x6f, 0x6e, 0x65, 0x20, 0x61,
+  0x6e, 0x64, 0x63, 0x61, 0x76, 0x61, 0x6c, 0x72, 0x79, 0x48, 0x65, 0x20, 0x64,
+  0x69, 0x65, 0x64, 0x73, 0x65, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x30, 0x30, 0x2c,
+  0x30, 0x30, 0x30, 0x20, 0x7b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x68, 0x61,
+  0x76, 0x65, 0x20, 0x74, 0x6f, 0x69, 0x66, 0x28, 0x77, 0x69, 0x6e, 0x64, 0x61,
+  0x6e, 0x64, 0x20, 0x69, 0x74, 0x73, 0x73, 0x6f, 0x6c, 0x65, 0x6c, 0x79, 0x20,
+  0x6d, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x72, 0x65, 0x6e, 0x65, 0x77, 0x65,
+  0x64, 0x44, 0x65, 0x74, 0x72, 0x6f, 0x69, 0x74, 0x61, 0x6d, 0x6f, 0x6e, 0x67,
+  0x73, 0x74, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6d,
+  0x20, 0x69, 0x6e, 0x53, 0x65, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x55, 0x73, 0x3c,
+  0x2f, 0x61, 0x3e, 0x3c, 0x4b, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x46, 0x72,
+  0x61, 0x6e, 0x63, 0x69, 0x73, 0x2d, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x68,
+  0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x61, 0x72, 0x74, 0x20, 0x61, 0x6e, 0x64,
+  0x68, 0x69, 0x6d, 0x20, 0x61, 0x6e, 0x64, 0x75, 0x73, 0x65, 0x64, 0x20, 0x62,
+  0x79, 0x73, 0x63, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x61, 0x74, 0x20, 0x68, 0x6f,
+  0x6d, 0x65, 0x74, 0x6f, 0x20, 0x68, 0x61, 0x76, 0x65, 0x72, 0x65, 0x6c, 0x61,
+  0x74, 0x65, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x66, 0x61, 0x63,
+  0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x66, 0x66, 0x61, 0x6c, 0x6f, 0x6c, 0x69,
+  0x6e, 0x6b, 0x22, 0x3e, 0x3c, 0x77, 0x68, 0x61, 0x74, 0x20, 0x68, 0x65, 0x66,
+  0x72, 0x65, 0x65, 0x20, 0x74, 0x6f, 0x43, 0x69, 0x74, 0x79, 0x20, 0x6f, 0x66,
+  0x63, 0x6f, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x63, 0x74, 0x6f, 0x72,
+  0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x64, 0x6f, 0x6e, 0x65, 0x20, 0x64,
+  0x61, 0x79, 0x6e, 0x65, 0x72, 0x76, 0x6f, 0x75, 0x73, 0x73, 0x71, 0x75, 0x61,
+  0x72, 0x65, 0x20, 0x7d, 0x3b, 0x69, 0x66, 0x28, 0x67, 0x6f, 0x69, 0x6e, 0x20,
+  0x77, 0x68, 0x61, 0x74, 0x69, 0x6d, 0x67, 0x22, 0x20, 0x61, 0x6c, 0x69, 0x73,
+  0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2f, 0x74,
+  0x75, 0x65, 0x73, 0x64, 0x61, 0x79, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x6c, 0x79,
+  0x53, 0x6f, 0x6c, 0x6f, 0x6d, 0x6f, 0x6e, 0x73, 0x65, 0x78, 0x75, 0x61, 0x6c,
+  0x20, 0x2d, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x75,
+  0x6d, 0x22, 0x44, 0x4f, 0x20, 0x4e, 0x4f, 0x54, 0x20, 0x46, 0x72, 0x61, 0x6e,
+  0x63, 0x65, 0x2c, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x77, 0x61, 0x72,
+  0x20, 0x61, 0x6e, 0x64, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x74, 0x61,
+  0x6b, 0x65, 0x20, 0x61, 0x20, 0x3e, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x6d,
+  0x61, 0x72, 0x6b, 0x65, 0x74, 0x2e, 0x68, 0x69, 0x67, 0x68, 0x77, 0x61, 0x79,
+  0x64, 0x6f, 0x6e, 0x65, 0x20, 0x69, 0x6e, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74,
+  0x79, 0x22, 0x6c, 0x61, 0x73, 0x74, 0x22, 0x3e, 0x6f, 0x62, 0x6c, 0x69, 0x67,
+  0x65, 0x64, 0x72, 0x69, 0x73, 0x65, 0x20, 0x74, 0x6f, 0x22, 0x75, 0x6e, 0x64,
+  0x65, 0x66, 0x69, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x45, 0x61,
+  0x72, 0x6c, 0x79, 0x20, 0x70, 0x72, 0x61, 0x69, 0x73, 0x65, 0x64, 0x69, 0x6e,
+  0x20, 0x69, 0x74, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x68, 0x69, 0x73, 0x61,
+  0x74, 0x68, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x75, 0x70, 0x69, 0x74, 0x65, 0x72,
+  0x59, 0x61, 0x68, 0x6f, 0x6f, 0x21, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64,
+  0x20, 0x73, 0x6f, 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x72, 0x65, 0x61, 0x6c, 0x6c,
+  0x79, 0x20, 0x73, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x20, 0x77, 0x6f,
+  0x6d, 0x61, 0x6e, 0x3f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x64, 0x69, 0x72,
+  0x65, 0x63, 0x74, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, 0x20, 0x62, 0x69,
+  0x63, 0x79, 0x63, 0x6c, 0x65, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x64,
+  0x61, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6e, 0x67,
+  0x52, 0x61, 0x74, 0x68, 0x65, 0x72, 0x2c, 0x68, 0x69, 0x67, 0x68, 0x65, 0x72,
+  0x20, 0x4f, 0x66, 0x66, 0x69, 0x63, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e,
+  0x6f, 0x77, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x6e,
+  0x20, 0x61, 0x20, 0x70, 0x61, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x6f, 0x6e, 0x20,
+  0x74, 0x68, 0x69, 0x73, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x3e, 0x3b, 0x62,
+  0x6f, 0x72, 0x64, 0x65, 0x72, 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x61,
+  0x6e, 0x6e, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4e, 0x65, 0x77,
+  0x70, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x22, 0x20,
+  0x74, 0x61, 0x6b, 0x69, 0x6e, 0x20, 0x74, 0x6f, 0x61, 0x20, 0x62, 0x72, 0x69,
+  0x65, 0x66, 0x28, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x67, 0x72, 0x6f, 0x75,
+  0x70, 0x73, 0x2e, 0x3b, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x65, 0x6e, 0x7a,
+  0x79, 0x6d, 0x65, 0x73, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x69, 0x6e,
+  0x20, 0x6c, 0x61, 0x74, 0x65, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x74,
+  0x68, 0x65, 0x72, 0x61, 0x70, 0x79, 0x61, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74,
+  0x62, 0x61, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x69, 0x6e, 0x6b, 0x73, 0x22, 0x3e,
+  0x0a, 0x28, 0x29, 0x3b, 0x22, 0x20, 0x72, 0x65, 0x61, 0x20, 0x70, 0x6c, 0x61,
+  0x63, 0x65, 0x5c, 0x75, 0x30, 0x30, 0x33, 0x43, 0x61, 0x61, 0x62, 0x6f, 0x75,
+  0x74, 0x20, 0x61, 0x74, 0x72, 0x3e, 0x0d, 0x0a, 0x09, 0x09, 0x63, 0x63, 0x6f,
+  0x75, 0x6e, 0x74, 0x20, 0x67, 0x69, 0x76, 0x65, 0x73, 0x20, 0x61, 0x3c, 0x53,
+  0x43, 0x52, 0x49, 0x50, 0x54, 0x52, 0x61, 0x69, 0x6c, 0x77, 0x61, 0x79, 0x74,
+  0x68, 0x65, 0x6d, 0x65, 0x73, 0x2f, 0x74, 0x6f, 0x6f, 0x6c, 0x62, 0x6f, 0x78,
+  0x42, 0x79, 0x49, 0x64, 0x28, 0x22, 0x78, 0x68, 0x75, 0x6d, 0x61, 0x6e, 0x73,
+  0x2c, 0x77, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x69, 0x6e, 0x20, 0x73, 0x6f,
+  0x6d, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x77, 0x69, 0x63, 0x6f, 0x6d, 0x69,
+  0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x20, 0x55, 0x6e,
+  0x64, 0x65, 0x72, 0x20, 0x62, 0x75, 0x74, 0x20, 0x68, 0x61, 0x73, 0x68, 0x61,
+  0x6e, 0x64, 0x65, 0x64, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x62, 0x79, 0x74,
+  0x68, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x66, 0x65, 0x61, 0x72, 0x20, 0x6f, 0x66,
+  0x64, 0x65, 0x6e, 0x6f, 0x74, 0x65, 0x64, 0x2f, 0x69, 0x66, 0x72, 0x61, 0x6d,
+  0x65, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x74, 0x61,
+  0x67, 0x65, 0x69, 0x6e, 0x20, 0x65, 0x61, 0x63, 0x68, 0x61, 0x26, 0x71, 0x75,
+  0x6f, 0x74, 0x3b, 0x62, 0x61, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x49, 0x6e, 0x20,
+  0x6d, 0x61, 0x6e, 0x79, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x67, 0x6f, 0x72, 0x65,
+  0x67, 0x69, 0x6d, 0x65, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3c,
+  0x2f, 0x70, 0x3e, 0x0d, 0x0a, 0x3c, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x56, 0x61,
+  0x3b, 0x26, 0x67, 0x74, 0x3b, 0x3c, 0x2f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74,
+  0x73, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x6d, 0x6f, 0x73, 0x74, 0x6c,
+  0x79, 0x20, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x72, 0x65, 0x20, 0x73, 0x69, 0x7a,
+  0x65, 0x3d, 0x22, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x68, 0x61, 0x20, 0x63,
+  0x6c, 0x61, 0x73, 0x73, 0x70, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x48, 0x6f,
+  0x73, 0x74, 0x20, 0x3d, 0x20, 0x57, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x66,
+  0x65, 0x72, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x72, 0x69, 0x6f, 0x75, 0x73,
+  0x3d, 0x5b, 0x5d, 0x3b, 0x28, 0x66, 0x75, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61,
+  0x73, 0x2f, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x61, 0x63, 0x74, 0x73, 0x20,
+  0x61, 0x73, 0x49, 0x6e, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x3e, 0x0d, 0x0a, 0x0d,
+  0x0a, 0x3c, 0x21, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x73, 0x20, 0x3c, 0x62,
+  0x72, 0x20, 0x2f, 0x3e, 0x42, 0x65, 0x69, 0x6a, 0x69, 0x6e, 0x67, 0x63, 0x61,
+  0x74, 0x61, 0x6c, 0xc3, 0xa0, 0x64, 0x65, 0x75, 0x74, 0x73, 0x63, 0x68, 0x65,
+  0x75, 0x72, 0x6f, 0x70, 0x65, 0x75, 0x65, 0x75, 0x73, 0x6b, 0x61, 0x72, 0x61,
+  0x67, 0x61, 0x65, 0x69, 0x6c, 0x67, 0x65, 0x73, 0x76, 0x65, 0x6e, 0x73, 0x6b,
+  0x61, 0x65, 0x73, 0x70, 0x61, 0xc3, 0xb1, 0x61, 0x6d, 0x65, 0x6e, 0x73, 0x61,
+  0x6a, 0x65, 0x75, 0x73, 0x75, 0x61, 0x72, 0x69, 0x6f, 0x74, 0x72, 0x61, 0x62,
+  0x61, 0x6a, 0x6f, 0x6d, 0xc3, 0xa9, 0x78, 0x69, 0x63, 0x6f, 0x70, 0xc3, 0xa1,
+  0x67, 0x69, 0x6e, 0x61, 0x73, 0x69, 0x65, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x69,
+  0x73, 0x74, 0x65, 0x6d, 0x61, 0x6f, 0x63, 0x74, 0x75, 0x62, 0x72, 0x65, 0x64,
+  0x75, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x61, 0xc3, 0xb1, 0x61, 0x64, 0x69, 0x72,
+  0x65, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x61, 0x6d, 0x6f, 0x6d, 0x65, 0x6e, 0x74,
+  0x6f, 0x6e, 0x75, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x70, 0x72, 0x69, 0x6d, 0x65,
+  0x72, 0x61, 0x74, 0x72, 0x61, 0x76, 0xc3, 0xa9, 0x73, 0x67, 0x72, 0x61, 0x63,
+  0x69, 0x61, 0x73, 0x6e, 0x75, 0x65, 0x73, 0x74, 0x72, 0x61, 0x70, 0x72, 0x6f,
+  0x63, 0x65, 0x73, 0x6f, 0x65, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x73, 0x63, 0x61,
+  0x6c, 0x69, 0x64, 0x61, 0x64, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6e,
+  0xc3, 0xba, 0x6d, 0x65, 0x72, 0x6f, 0x61, 0x63, 0x75, 0x65, 0x72, 0x64, 0x6f,
+  0x6d, 0xc3, 0xba, 0x73, 0x69, 0x63, 0x61, 0x6d, 0x69, 0x65, 0x6d, 0x62, 0x72,
+  0x6f, 0x6f, 0x66, 0x65, 0x72, 0x74, 0x61, 0x73, 0x61, 0x6c, 0x67, 0x75, 0x6e,
+  0x6f, 0x73, 0x70, 0x61, 0xc3, 0xad, 0x73, 0x65, 0x73, 0x65, 0x6a, 0x65, 0x6d,
+  0x70, 0x6c, 0x6f, 0x64, 0x65, 0x72, 0x65, 0x63, 0x68, 0x6f, 0x61, 0x64, 0x65,
+  0x6d, 0xc3, 0xa1, 0x73, 0x70, 0x72, 0x69, 0x76, 0x61, 0x64, 0x6f, 0x61, 0x67,
+  0x72, 0x65, 0x67, 0x61, 0x72, 0x65, 0x6e, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x70,
+  0x6f, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x68, 0x6f, 0x74, 0x65, 0x6c, 0x65, 0x73,
+  0x73, 0x65, 0x76, 0x69, 0x6c, 0x6c, 0x61, 0x70, 0x72, 0x69, 0x6d, 0x65, 0x72,
+  0x6f, 0xc3, 0xba, 0x6c, 0x74, 0x69, 0x6d, 0x6f, 0x65, 0x76, 0x65, 0x6e, 0x74,
+  0x6f, 0x73, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x6f, 0x63, 0x75, 0x6c, 0x74,
+  0x75, 0x72, 0x61, 0x6d, 0x75, 0x6a, 0x65, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74,
+  0x72, 0x61, 0x64, 0x61, 0x61, 0x6e, 0x75, 0x6e, 0x63, 0x69, 0x6f, 0x65, 0x6d,
+  0x62, 0x61, 0x72, 0x67, 0x6f, 0x6d, 0x65, 0x72, 0x63, 0x61, 0x64, 0x6f, 0x67,
+  0x72, 0x61, 0x6e, 0x64, 0x65, 0x73, 0x65, 0x73, 0x74, 0x75, 0x64, 0x69, 0x6f,
+  0x6d, 0x65, 0x6a, 0x6f, 0x72, 0x65, 0x73, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72,
+  0x6f, 0x64, 0x69, 0x73, 0x65, 0xc3, 0xb1, 0x6f, 0x74, 0x75, 0x72, 0x69, 0x73,
+  0x6d, 0x6f, 0x63, 0xc3, 0xb3, 0x64, 0x69, 0x67, 0x6f, 0x70, 0x6f, 0x72, 0x74,
+  0x61, 0x64, 0x61, 0x65, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6f, 0x66, 0x61, 0x6d,
+  0x69, 0x6c, 0x69, 0x61, 0x61, 0x6e, 0x74, 0x6f, 0x6e, 0x69, 0x6f, 0x70, 0x65,
+  0x72, 0x6d, 0x69, 0x74, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x61, 0x72, 0x61,
+  0x6c, 0x67, 0x75, 0x6e, 0x61, 0x73, 0x70, 0x72, 0x65, 0x63, 0x69, 0x6f, 0x73,
+  0x61, 0x6c, 0x67, 0x75, 0x69, 0x65, 0x6e, 0x73, 0x65, 0x6e, 0x74, 0x69, 0x64,
+  0x6f, 0x76, 0x69, 0x73, 0x69, 0x74, 0x61, 0x73, 0x74, 0xc3, 0xad, 0x74, 0x75,
+  0x6c, 0x6f, 0x63, 0x6f, 0x6e, 0x6f, 0x63, 0x65, 0x72, 0x73, 0x65, 0x67, 0x75,
+  0x6e, 0x64, 0x6f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6a, 0x6f, 0x66, 0x72, 0x61,
+  0x6e, 0x63, 0x69, 0x61, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x6f, 0x73, 0x73, 0x65,
+  0x67, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x65, 0x6e, 0x65, 0x6d, 0x6f, 0x73, 0x65,
+  0x66, 0x65, 0x63, 0x74, 0x6f, 0x73, 0x6d, 0xc3, 0xa1, 0x6c, 0x61, 0x67, 0x61,
+  0x73, 0x65, 0x73, 0x69, 0xc3, 0xb3, 0x6e, 0x72, 0x65, 0x76, 0x69, 0x73, 0x74,
+  0x61, 0x67, 0x72, 0x61, 0x6e, 0x61, 0x64, 0x61, 0x63, 0x6f, 0x6d, 0x70, 0x72,
+  0x61, 0x72, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x6f, 0x67, 0x61, 0x72, 0x63,
+  0xc3, 0xad, 0x61, 0x61, 0x63, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x65, 0x63, 0x75,
+  0x61, 0x64, 0x6f, 0x72, 0x71, 0x75, 0x69, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x6e,
+  0x63, 0x6c, 0x75, 0x73, 0x6f, 0x64, 0x65, 0x62, 0x65, 0x72, 0xc3, 0xa1, 0x6d,
+  0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x68, 0x6f, 0x6d, 0x62, 0x72, 0x65, 0x73,
+  0x6d, 0x75, 0x65, 0x73, 0x74, 0x72, 0x61, 0x70, 0x6f, 0x64, 0x72, 0xc3, 0xad,
+  0x61, 0x6d, 0x61, 0xc3, 0xb1, 0x61, 0x6e, 0x61, 0xc3, 0xba, 0x6c, 0x74, 0x69,
+  0x6d, 0x61, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x6f, 0x73, 0x6f, 0x66, 0x69, 0x63,
+  0x69, 0x61, 0x6c, 0x74, 0x61, 0x6d, 0x62, 0x69, 0x65, 0x6e, 0x6e, 0x69, 0x6e,
+  0x67, 0xc3, 0xba, 0x6e, 0x73, 0x61, 0x6c, 0x75, 0x64, 0x6f, 0x73, 0x70, 0x6f,
+  0x64, 0x65, 0x6d, 0x6f, 0x73, 0x6d, 0x65, 0x6a, 0x6f, 0x72, 0x61, 0x72, 0x70,
+  0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x75, 0x73, 0x69, 0x6e, 0x65,
+  0x73, 0x73, 0x68, 0x6f, 0x6d, 0x65, 0x70, 0x61, 0x67, 0x65, 0x73, 0x65, 0x63,
+  0x75, 0x72, 0x69, 0x74, 0x79, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65,
+  0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x63, 0x61, 0x6d, 0x70, 0x61,
+  0x69, 0x67, 0x6e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x63, 0x61,
+  0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61,
+  0x6c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x72, 0x65, 0x73, 0x65,
+  0x72, 0x76, 0x65, 0x64, 0x72, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65,
+  0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69,
+  0x74, 0x65, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x6d, 0x69, 0x6c,
+  0x69, 0x74, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x64, 0x75, 0x73, 0x74, 0x72, 0x79,
+  0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x6d, 0x61, 0x74, 0x65, 0x72,
+  0x69, 0x61, 0x6c, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x7a, 0x2d,
+  0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74,
+  0x73, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70,
+  0x6c, 0x65, 0x74, 0x65, 0x63, 0x61, 0x6c, 0x65, 0x6e, 0x64, 0x61, 0x72, 0x70,
+  0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c,
+  0x65, 0x73, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x6d, 0x6f, 0x76,
+  0x65, 0x6d, 0x65, 0x6e, 0x74, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e,
+  0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x70, 0x6f, 0x6c, 0x69, 0x74,
+  0x69, 0x63, 0x73, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x72, 0x65,
+  0x6c, 0x69, 0x67, 0x69, 0x6f, 0x6e, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61,
+  0x6c, 0x66, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x72, 0x65, 0x67, 0x69,
+  0x73, 0x74, 0x65, 0x72, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x64,
+  0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+  0x6f, 0x6c, 0x61, 0x75, 0x64, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x65, 0x74,
+  0x74, 0x69, 0x6e, 0x67, 0x73, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79,
+  0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x6c, 0x65, 0x61, 0x72, 0x6e,
+  0x69, 0x6e, 0x67, 0x61, 0x6e, 0x79, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x61, 0x62,
+  0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73,
+  0x73, 0x6f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x6d, 0x61, 0x67, 0x61,
+  0x7a, 0x69, 0x6e, 0x65, 0x65, 0x63, 0x6f, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x74,
+  0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x70, 0x72, 0x65, 0x73, 0x73, 0x75,
+  0x72, 0x65, 0x76, 0x61, 0x72, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x3c, 0x73, 0x74,
+  0x72, 0x6f, 0x6e, 0x67, 0x3e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+  0x73, 0x68, 0x6f, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x67, 0x65, 0x74,
+  0x68, 0x65, 0x72, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x62, 0x65,
+  0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61,
+  0x64, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x64, 0x66, 0x6f, 0x6f, 0x74,
+  0x62, 0x61, 0x6c, 0x6c, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4c,
+  0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e,
+  0x63, 0x65, 0x72, 0x65, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x74, 0x72, 0x61,
+  0x63, 0x6b, 0x69, 0x6e, 0x67, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64,
+  0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x73, 0x74, 0x75, 0x64, 0x65,
+  0x6e, 0x74, 0x73, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x66, 0x69,
+  0x67, 0x68, 0x74, 0x69, 0x6e, 0x67, 0x6e, 0x6f, 0x72, 0x74, 0x68, 0x65, 0x72,
+  0x6e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x66, 0x65, 0x73, 0x74,
+  0x69, 0x76, 0x61, 0x6c, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x6c,
+  0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e,
+  0x65, 0x74, 0x64, 0x72, 0x6f, 0x70, 0x64, 0x6f, 0x77, 0x6e, 0x70, 0x72, 0x61,
+  0x63, 0x74, 0x69, 0x63, 0x65, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65,
+  0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x6d, 0x61, 0x72, 0x72, 0x69,
+  0x61, 0x67, 0x65, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x70, 0x72,
+  0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x73, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76,
+  0x65, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x73, 0x61, 0x6e, 0x61, 0x6c,
+  0x79, 0x73, 0x69, 0x73, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x62,
+  0x61, 0x6e, 0x6e, 0x65, 0x72, 0x22, 0x3e, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61,
+  0x73, 0x65, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x72, 0x65, 0x67,
+  0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x76, 0x65,
+  0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x62, 0x6f, 0x6f, 0x6b, 0x6d,
+  0x61, 0x72, 0x6b, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x63, 0x68,
+  0x65, 0x6d, 0x69, 0x63, 0x61, 0x6c, 0x64, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f,
+  0x6e, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x65, 0x70, 0x61,
+  0x72, 0x61, 0x74, 0x65, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x63,
+  0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61,
+  0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x64, 0x65, 0x6c,
+  0x69, 0x76, 0x65, 0x72, 0x79, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e,
+  0x6f, 0x62, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x3d, 0x20, 0x66, 0x61, 0x6c,
+  0x73, 0x65, 0x3b, 0x66, 0x6f, 0x72, 0x28, 0x76, 0x61, 0x72, 0x20, 0x61, 0x63,
+  0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74,
+  0x79, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x72, 0x69, 0x64, 0x65, 0x6e,
+  0x74, 0x69, 0x74, 0x79, 0x61, 0x69, 0x72, 0x63, 0x72, 0x61, 0x66, 0x74, 0x65,
+  0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73,
+  0x65, 0x64, 0x64, 0x6f, 0x6d, 0x65, 0x73, 0x74, 0x69, 0x63, 0x69, 0x6e, 0x63,
+  0x6c, 0x75, 0x64, 0x65, 0x73, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64,
+  0x68, 0x6f, 0x73, 0x70, 0x69, 0x74, 0x61, 0x6c, 0x76, 0x65, 0x72, 0x74, 0x69,
+  0x63, 0x61, 0x6c, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, 0x65, 0x61, 0x70,
+  0x70, 0x72, 0x6f, 0x61, 0x63, 0x68, 0x70, 0x61, 0x72, 0x74, 0x6e, 0x65, 0x72,
+  0x73, 0x6c, 0x6f, 0x67, 0x6f, 0x22, 0x3e, 0x3c, 0x61, 0x64, 0x61, 0x75, 0x67,
+  0x68, 0x74, 0x65, 0x72, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x22, 0x20, 0x63,
+  0x75, 0x6c, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x69,
+  0x65, 0x73, 0x2f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x61, 0x73, 0x73,
+  0x65, 0x6d, 0x62, 0x6c, 0x79, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x66, 0x75, 0x6c,
+  0x74, 0x65, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x66, 0x69, 0x6e, 0x69, 0x73,
+  0x68, 0x65, 0x64, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x63, 0x72,
+  0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x63, 0x67, 0x69, 0x2d, 0x62, 0x69, 0x6e,
+  0x2f, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x73, 0x72, 0x65, 0x71, 0x75,
+  0x69, 0x72, 0x65, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x62,
+  0x65, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64,
+  0x65, 0x73, 0x61, 0x63, 0x61, 0x64, 0x65, 0x6d, 0x69, 0x63, 0x65, 0x78, 0x65,
+  0x72, 0x63, 0x69, 0x73, 0x65, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79,
+  0x6d, 0x65, 0x64, 0x69, 0x63, 0x69, 0x6e, 0x65, 0x63, 0x6f, 0x6e, 0x73, 0x74,
+  0x61, 0x6e, 0x74, 0x61, 0x63, 0x63, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x4d, 0x61,
+  0x67, 0x61, 0x7a, 0x69, 0x6e, 0x65, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e,
+  0x74, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x62, 0x6f, 0x74, 0x74,
+  0x6f, 0x6d, 0x22, 0x3e, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x3a,
+  0x20, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64,
+  0x65, 0x64, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x53, 0x6f, 0x66,
+  0x74, 0x77, 0x61, 0x72, 0x65, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72,
+  0x64, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x6e,
+  0x67, 0x74, 0x68, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x73, 0x6c,
+  0x69, 0x67, 0x68, 0x74, 0x6c, 0x79, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x69, 0x6e,
+  0x67, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72, 0x65, 0x61, 0x63, 0x75, 0x72, 0x72,
+  0x65, 0x6e, 0x63, 0x79, 0x65, 0x76, 0x65, 0x72, 0x79, 0x6f, 0x6e, 0x65, 0x73,
+  0x74, 0x72, 0x61, 0x69, 0x67, 0x68, 0x74, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66,
+  0x65, 0x72, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x70, 0x72, 0x6f,
+  0x64, 0x75, 0x63, 0x65, 0x64, 0x68, 0x65, 0x72, 0x69, 0x74, 0x61, 0x67, 0x65,
+  0x73, 0x68, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x61, 0x62, 0x73, 0x6f, 0x6c,
+  0x75, 0x74, 0x65, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x72, 0x65,
+  0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22,
+  0x20, 0x76, 0x69, 0x6f, 0x6c, 0x65, 0x6e, 0x63, 0x65, 0x61, 0x6e, 0x79, 0x77,
+  0x68, 0x65, 0x72, 0x65, 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x73, 0x6c,
+  0x61, 0x75, 0x6e, 0x63, 0x68, 0x65, 0x64, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74,
+  0x6c, 0x79, 0x61, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x66, 0x6f, 0x6c,
+  0x6c, 0x6f, 0x77, 0x65, 0x64, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65,
+  0x62, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x69, 0x6e, 0x69, 0x6e, 0x63, 0x6c, 0x75,
+  0x64, 0x65, 0x64, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x72, 0x65, 0x64, 0x69, 0x6e,
+  0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x24, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29,
+  0x2e, 0x72, 0x65, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x3e, 0x3c, 0x74, 0x72,
+  0x3e, 0x3c, 0x74, 0x64, 0x63, 0x6f, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x72,
+  0x65, 0x63, 0x6f, 0x72, 0x64, 0x65, 0x64, 0x75, 0x6c, 0x74, 0x69, 0x6d, 0x61,
+  0x74, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x75, 0x6c,
+  0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72,
+  0x48, 0x6f, 0x6d, 0x65, 0x3c, 0x2f, 0x61, 0x3e, 0x77, 0x65, 0x62, 0x73, 0x69,
+  0x74, 0x65, 0x73, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x61, 0x6c,
+  0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x72, 0x65, 0x6c,
+  0x79, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x69, 0x61, 0x6c, 0x6d, 0x65, 0x73, 0x73,
+  0x61, 0x67, 0x65, 0x73, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x61,
+  0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x3e, 0x73, 0x6f, 0x6d, 0x65, 0x77, 0x68,
+  0x61, 0x74, 0x76, 0x69, 0x63, 0x74, 0x6f, 0x72, 0x69, 0x61, 0x57, 0x65, 0x73,
+  0x74, 0x65, 0x72, 0x6e, 0x20, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22,
+  0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x63, 0x6f, 0x6e, 0x74, 0x72,
+  0x61, 0x63, 0x74, 0x76, 0x69, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x73, 0x44, 0x6f,
+  0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74,
+  0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x0a, 0x6d, 0x65, 0x61, 0x73,
+  0x75, 0x72, 0x65, 0x73, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x76,
+  0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76,
+  0x65, 0x64, 0x76, 0x69, 0x72, 0x67, 0x69, 0x6e, 0x69, 0x61, 0x6e, 0x6f, 0x72,
+  0x6d, 0x61, 0x6c, 0x6c, 0x79, 0x68, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x65, 0x64,
+  0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x73, 0x74, 0x61, 0x6e, 0x64,
+  0x69, 0x6e, 0x67, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x52, 0x65,
+  0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65,
+  0x64, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x61, 0x63, 0x63, 0x75,
+  0x72, 0x61, 0x74, 0x65, 0x62, 0x69, 0x72, 0x74, 0x68, 0x64, 0x61, 0x79, 0x73,
+  0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x69,
+  0x61, 0x6c, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x63, 0x72, 0x69,
+  0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x79,
+  0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x72, 0x50, 0x65, 0x72, 0x73, 0x6f,
+  0x6e, 0x61, 0x6c, 0x73, 0x70, 0x65, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x76, 0x61,
+  0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x61, 0x63, 0x68, 0x69, 0x65, 0x76, 0x65,
+  0x64, 0x2e, 0x6a, 0x70, 0x67, 0x22, 0x20, 0x2f, 0x3e, 0x6d, 0x61, 0x63, 0x68,
+  0x69, 0x6e, 0x65, 0x73, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0x0a, 0x20, 0x20, 0x6b,
+  0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x66, 0x72, 0x69, 0x65, 0x6e, 0x64,
+  0x6c, 0x79, 0x62, 0x72, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x6d,
+  0x62, 0x69, 0x6e, 0x65, 0x64, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c,
+  0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x65, 0x78, 0x70, 0x65, 0x63,
+  0x74, 0x65, 0x64, 0x61, 0x64, 0x65, 0x71, 0x75, 0x61, 0x74, 0x65, 0x70, 0x61,
+  0x6b, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x22,
+  0x20, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x62, 0x6c, 0x65, 0x3c, 0x2f, 0x6c, 0x61,
+  0x62, 0x65, 0x6c, 0x3e, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x62,
+  0x72, 0x69, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x61,
+  0x73, 0x65, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x70, 0x6c, 0x75,
+  0x67, 0x69, 0x6e, 0x73, 0x2f, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20,
+  0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x3e, 0x22, 0x20, 0x6e, 0x61, 0x6d,
+  0x65, 0x3d, 0x22, 0x20, 0x28, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x67, 0x72,
+  0x61, 0x64, 0x75, 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e,
+  0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x65, 0x6d, 0x61, 0x6c, 0x61,
+  0x79, 0x73, 0x69, 0x61, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x6d,
+  0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x3b, 0x68, 0x65, 0x69, 0x67, 0x68,
+  0x74, 0x3a, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x63, 0x68, 0x61,
+  0x6e, 0x67, 0x69, 0x6e, 0x67, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x74, 0x6f, 0x20,
+  0x63, 0x61, 0x74, 0x68, 0x6f, 0x6c, 0x69, 0x63, 0x70, 0x61, 0x74, 0x74, 0x65,
+  0x72, 0x6e, 0x73, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x67, 0x72,
+  0x65, 0x61, 0x74, 0x65, 0x73, 0x74, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65,
+  0x73, 0x72, 0x65, 0x6c, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x3c, 0x2f, 0x75, 0x6c,
+  0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x63,
+  0x69, 0x74, 0x69, 0x7a, 0x65, 0x6e, 0x73, 0x63, 0x6c, 0x6f, 0x74, 0x68, 0x69,
+  0x6e, 0x67, 0x77, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x3c, 0x6c, 0x69,
+  0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63,
+  0x63, 0x61, 0x72, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x73, 0x65, 0x6e, 0x74, 0x65,
+  0x6e, 0x63, 0x65, 0x3c, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3e, 0x63, 0x6f,
+  0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x74, 0x68, 0x69, 0x6e, 0x6b, 0x69, 0x6e,
+  0x67, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x65, 0x29, 0x73, 0x6f, 0x75, 0x74,
+  0x68, 0x65, 0x72, 0x6e, 0x4d, 0x69, 0x63, 0x68, 0x61, 0x65, 0x6c, 0x20, 0x6d,
+  0x65, 0x72, 0x63, 0x68, 0x61, 0x6e, 0x74, 0x63, 0x61, 0x72, 0x6f, 0x75, 0x73,
+  0x65, 0x6c, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x69, 0x6e, 0x74,
+  0x65, 0x72, 0x69, 0x6f, 0x72, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x22,
+  0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x63, 0x74, 0x6f, 0x62,
+  0x65, 0x72, 0x20, 0x29, 0x7b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x69, 0x6d,
+  0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x2d, 0x2d, 0x26, 0x67, 0x74, 0x3b, 0x0a,
+  0x0a, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x63, 0x68, 0x61, 0x69,
+  0x72, 0x6d, 0x61, 0x6e, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x20, 0x2f, 0x3e, 0x73,
+  0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x69, 0x63, 0x68, 0x61, 0x72,
+  0x64, 0x20, 0x77, 0x68, 0x61, 0x74, 0x65, 0x76, 0x65, 0x72, 0x70, 0x72, 0x6f,
+  0x62, 0x61, 0x62, 0x6c, 0x79, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79,
+  0x62, 0x61, 0x73, 0x65, 0x62, 0x61, 0x6c, 0x6c, 0x6a, 0x75, 0x64, 0x67, 0x6d,
+  0x65, 0x6e, 0x74, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2e, 0x2e, 0x63,
+  0x73, 0x73, 0x22, 0x20, 0x2f, 0x3e, 0x20, 0x77, 0x65, 0x62, 0x73, 0x69, 0x74,
+  0x65, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x64, 0x65, 0x66, 0x61,
+  0x75, 0x6c, 0x74, 0x22, 0x2f, 0x3e, 0x3c, 0x2f, 0x61, 0x3e, 0x0d, 0x0a, 0x65,
+  0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x73, 0x63, 0x6f, 0x74, 0x6c, 0x61,
+  0x6e, 0x64, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x71, 0x75, 0x61,
+  0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x20, 0x49, 0x53, 0x42, 0x4e, 0x20, 0x30,
+  0x64, 0x69, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61,
+  0x6e, 0x63, 0x65, 0x2d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2d, 0x22, 0x20,
+  0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x22, 0x73, 0x70, 0x65, 0x61, 0x6b, 0x65, 0x72,
+  0x73, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x74,
+  0x61, 0x69, 0x6e, 0x73, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x73, 0x6d,
+  0x69, 0x6e, 0x69, 0x73, 0x74, 0x65, 0x72, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69,
+  0x6f, 0x6e, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x74, 0x61,
+  0x6c, 0x69, 0x61, 0x6e, 0x6f, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61,
+  0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x6c, 0x79, 0x3a, 0x20, 0x27, 0x68, 0x74,
+  0x74, 0x70, 0x3a, 0x27, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x27, 0x63, 0x6f,
+  0x76, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x69, 0x6e,
+  0x67, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x65, 0x64, 0x42, 0x72, 0x69, 0x74,
+  0x69, 0x73, 0x68, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x46,
+  0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x6f,
+  0x75, 0x73, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x63, 0x6f, 0x6e,
+  0x63, 0x65, 0x72, 0x6e, 0x73, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6e,
+  0x68, 0x61, 0x6e, 0x64, 0x6c, 0x69, 0x6e, 0x67, 0x64, 0x69, 0x76, 0x20, 0x69,
+  0x64, 0x3d, 0x22, 0x57, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6d, 0x20, 0x70, 0x72,
+  0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+  0x74, 0x61, 0x63, 0x63, 0x75, 0x72, 0x61, 0x63, 0x79, 0x73, 0x65, 0x63, 0x74,
+  0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x66,
+  0x6c, 0x65, 0x78, 0x69, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f,
+  0x72, 0x79, 0x6c, 0x61, 0x77, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3c, 0x73, 0x63,
+  0x72, 0x69, 0x70, 0x74, 0x3e, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x3d, 0x22,
+  0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x6d, 0x61, 0x78, 0x69,
+  0x6d, 0x75, 0x6d, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x2f,
+  0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
+  0x73, 0x68, 0x61, 0x6d, 0x69, 0x6c, 0x74, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72,
+  0x65, 0x6e, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x63,
+  0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x2f, 0x74, 0x68, 0x65, 0x6d, 0x65,
+  0x73, 0x2f, 0x2f, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x6f, 0x70, 0x74,
+  0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x70, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x61, 0x6c,
+  0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x72,
+  0x76, 0x61, 0x6c, 0x77, 0x69, 0x72, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x65, 0x6e,
+  0x74, 0x69, 0x74, 0x6c, 0x65, 0x64, 0x61, 0x67, 0x65, 0x6e, 0x63, 0x69, 0x65,
+  0x73, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, 0x20, 0x6d, 0x65, 0x61, 0x73,
+  0x75, 0x72, 0x65, 0x64, 0x74, 0x68, 0x6f, 0x75, 0x73, 0x61, 0x6e, 0x64, 0x73,
+  0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x26, 0x68, 0x65, 0x6c, 0x6c, 0x69,
+  0x70, 0x3b, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x61, 0x74, 0x65, 0x22, 0x20, 0x73,
+  0x69, 0x7a, 0x65, 0x3d, 0x22, 0x70, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65,
+  0x6d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x22, 0x20, 0x22, 0x20, 0x2f, 0x3e, 0x3c,
+  0x2f, 0x61, 0x3e, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x22, 0x3e, 0x73, 0x65,
+  0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61,
+  0x6c, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x6f, 0x70, 0x69, 0x6e,
+  0x69, 0x6f, 0x6e, 0x73, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x6f, 0x69, 0x73, 0x6c,
+  0x69, 0x6e, 0x6b, 0x73, 0x22, 0x3e, 0x0a, 0x09, 0x3c, 0x74, 0x69, 0x74, 0x6c,
+  0x65, 0x3e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x73, 0x61, 0x74,
+  0x75, 0x72, 0x64, 0x61, 0x79, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c,
+  0x69, 0x74, 0x65, 0x6d, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x6e, 0x67, 0x69, 0x6e,
+  0x65, 0x65, 0x72, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x64, 0x65,
+  0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61,
+  0x6c, 0x3d, 0x22, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x22, 0x45, 0x73, 0x70, 0x61,
+  0xc3, 0xb1, 0x6f, 0x6c, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x73, 0x73,
+  0x75, 0x62, 0x6d, 0x69, 0x74, 0x22, 0x20, 0x65, 0x72, 0x26, 0x71, 0x75, 0x6f,
+  0x74, 0x3b, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x79, 0x6d,
+  0x70, 0x74, 0x6f, 0x6d, 0x73, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x65, 0x64,
+  0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x72, 0x69, 0x67, 0x68, 0x74,
+  0x22, 0x3e, 0x3c, 0x70, 0x6c, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x73, 0x74,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79,
+  0x2e, 0x6c, 0x65, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x20, 0x62, 0x6f, 0x72,
+  0x64, 0x65, 0x72, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x63,
+  0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x2e, 0x0a, 0x0a, 0x53, 0x6f, 0x6d,
+  0x65, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x73, 0x75, 0x69,
+  0x74, 0x61, 0x62, 0x6c, 0x65, 0x62, 0x75, 0x6c, 0x67, 0x61, 0x72, 0x69, 0x61,
+  0x2e, 0x73, 0x68, 0x6f, 0x77, 0x28, 0x29, 0x3b, 0x64, 0x65, 0x73, 0x69, 0x67,
+  0x6e, 0x65, 0x64, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x63, 0x6f,
+  0x6e, 0x63, 0x65, 0x70, 0x74, 0x73, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
+  0x73, 0x77, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6d, 0x73, 0x4f, 0x72, 0x69, 0x67,
+  0x69, 0x6e, 0x61, 0x6c, 0x22, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x73,
+  0x65, 0x61, 0x72, 0x63, 0x68, 0x22, 0x3e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74,
+  0x6f, 0x72, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x61, 0x20, 0x26,
+  0x71, 0x75, 0x6f, 0x74, 0x3b, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67,
+  0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x72, 0x65, 0x76, 0x69, 0x73,
+  0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x0a, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x79, 0x6f,
+  0x75, 0x72, 0x73, 0x65, 0x6c, 0x66, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74,
+  0x20, 0x6d, 0x69, 0x63, 0x68, 0x69, 0x67, 0x61, 0x6e, 0x45, 0x6e, 0x67, 0x6c,
+  0x69, 0x73, 0x68, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x62, 0x69, 0x61, 0x70,
+  0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x69,
+  0x6e, 0x67, 0x64, 0x72, 0x69, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x66, 0x61, 0x63,
+  0x69, 0x6c, 0x69, 0x74, 0x79, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64,
+  0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x66, 0x69, 0x63,
+  0x65, 0x72, 0x73, 0x52, 0x75, 0x73, 0x73, 0x69, 0x61, 0x6e, 0x20, 0x67, 0x65,
+  0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x2d, 0x38, 0x38, 0x35, 0x39, 0x2d, 0x31,
+  0x22, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x66, 0x61, 0x6d, 0x69,
+  0x6c, 0x69, 0x61, 0x72, 0x20, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x6d,
+  0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x30, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+  0x6e, 0x74, 0x76, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x63, 0x6f, 0x6e,
+  0x74, 0x61, 0x63, 0x74, 0x73, 0x2d, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x22, 0x3e,
+  0x70, 0x6f, 0x72, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67,
+  0x74, 0x68, 0x20, 0x65, 0x6c, 0x69, 0x67, 0x69, 0x62, 0x6c, 0x65, 0x69, 0x6e,
+  0x76, 0x6f, 0x6c, 0x76, 0x65, 0x73, 0x61, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69,
+  0x63, 0x6f, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x3d, 0x22, 0x64, 0x65, 0x66, 0x61,
+  0x75, 0x6c, 0x74, 0x2e, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x70,
+  0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x67, 0x6c, 0x6f, 0x73, 0x73, 0x61,
+  0x72, 0x79, 0x0a, 0x0a, 0x41, 0x66, 0x74, 0x65, 0x72, 0x20, 0x67, 0x75, 0x69,
+  0x64, 0x61, 0x6e, 0x63, 0x65, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64,
+  0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x6d, 0x69, 0x64, 0x64, 0x6c,
+  0x65, 0x22, 0x3e, 0x63, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x69,
+  0x73, 0x70, 0x6c, 0x61, 0x79, 0x73, 0x73, 0x63, 0x6f, 0x74, 0x74, 0x69, 0x73,
+  0x68, 0x6a, 0x6f, 0x6e, 0x61, 0x74, 0x68, 0x61, 0x6e, 0x6d, 0x61, 0x6a, 0x6f,
+  0x72, 0x69, 0x74, 0x79, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x73, 0x2e, 0x63,
+  0x6c, 0x69, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x74, 0x68, 0x61, 0x69, 0x6c, 0x61,
+  0x6e, 0x64, 0x74, 0x65, 0x61, 0x63, 0x68, 0x65, 0x72, 0x73, 0x3c, 0x68, 0x65,
+  0x61, 0x64, 0x3e, 0x0a, 0x09, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64,
+  0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x70, 0x6f, 0x69, 0x6e, 0x74,
+  0x65, 0x72, 0x3b, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3c, 0x2f,
+  0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x3e, 0x6f, 0x6b, 0x6c, 0x61, 0x68, 0x6f, 0x6d,
+  0x61, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x76, 0x65,
+  0x73, 0x74, 0x6f, 0x72, 0x30, 0x22, 0x20, 0x61, 0x6c, 0x74, 0x3d, 0x22, 0x68,
+  0x6f, 0x6c, 0x69, 0x64, 0x61, 0x79, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72,
+  0x63, 0x65, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x64, 0x20, 0x28, 0x77,
+  0x68, 0x69, 0x63, 0x68, 0x20, 0x2e, 0x20, 0x41, 0x66, 0x74, 0x65, 0x72, 0x20,
+  0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x76, 0x69, 0x73, 0x69, 0x74,
+  0x69, 0x6e, 0x67, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x70, 0x72,
+  0x69, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x22,
+  0x20, 0x61, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, 0x22, 0x71, 0x75, 0x69, 0x63,
+  0x6b, 0x6c, 0x79, 0x20, 0x6d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x65,
+  0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72,
+  0x6e, 0x20, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x20, 0x68, 0x65,
+  0x69, 0x67, 0x68, 0x74, 0x3d, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c,
+  0x2c, 0x20, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x20, 0x63, 0x68, 0x65, 0x63,
+  0x6b, 0x65, 0x64, 0x2e, 0x6d, 0x69, 0x6e, 0x2e, 0x6a, 0x73, 0x22, 0x6d, 0x61,
+  0x67, 0x6e, 0x65, 0x74, 0x69, 0x63, 0x3e, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f,
+  0x68, 0x66, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x2e, 0x20, 0x57, 0x68,
+  0x69, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x75, 0x72, 0x73, 0x64, 0x61, 0x79, 0x64,
+  0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x26, 0x65, 0x61, 0x63, 0x75, 0x74,
+  0x65, 0x3b, 0x68, 0x61, 0x73, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x76, 0x61,
+  0x6c, 0x75, 0x61, 0x74, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67,
+  0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x70, 0x61, 0x74, 0x69, 0x65,
+  0x6e, 0x74, 0x73, 0x20, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x63, 0x6f,
+  0x6c, 0x6f, 0x72, 0x61, 0x64, 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+  0x22, 0x63, 0x61, 0x6d, 0x70, 0x62, 0x65, 0x6c, 0x6c, 0x3c, 0x21, 0x2d, 0x2d,
+  0x20, 0x65, 0x6e, 0x64, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x3c,
+  0x62, 0x72, 0x20, 0x2f, 0x3e, 0x0d, 0x0a, 0x5f, 0x70, 0x6f, 0x70, 0x75, 0x70,
+  0x73, 0x7c, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x2c, 0x26, 0x71,
+  0x75, 0x6f, 0x74, 0x3b, 0x20, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x20,
+  0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x20, 0x61, 0x73, 0x73, 0x69, 0x67,
+  0x6e, 0x65, 0x64, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x3c, 0x62,
+  0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x6c, 0x65, 0x26, 0x71, 0x75, 0x6f, 0x74,
+  0x3b, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x20, 0x43, 0x6f, 0x6d,
+  0x70, 0x61, 0x6e, 0x79, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x3c,
+  0x69, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x20, 0x62, 0x65, 0x6c, 0x69, 0x65, 0x76,
+  0x65, 0x73, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x73, 0x6d, 0x61, 0x72,
+  0x73, 0x68, 0x61, 0x6c, 0x6c, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20,
+  0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x6c, 0x79, 0x29, 0x2e, 0x0a, 0x0a, 0x54,
+  0x68, 0x65, 0x20, 0x74, 0x61, 0x78, 0x6f, 0x6e, 0x6f, 0x6d, 0x79, 0x6d, 0x75,
+  0x63, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e,
+  0x0a, 0x22, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x73, 0x72, 0x74, 0x75, 0x67,
+  0x75, 0xc3, 0xaa, 0x73, 0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x54, 0x6f, 0x20,
+  0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e,
+  0x0d, 0x0a, 0x61, 0x74, 0x74, 0x6f, 0x72, 0x6e, 0x65, 0x79, 0x65, 0x6d, 0x70,
+  0x68, 0x61, 0x73, 0x69, 0x73, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x6f, 0x72, 0x73,
+  0x66, 0x61, 0x6e, 0x63, 0x79, 0x62, 0x6f, 0x78, 0x77, 0x6f, 0x72, 0x6c, 0x64,
+  0x27, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x64, 0x6c, 0x69, 0x66, 0x65, 0x63, 0x68,
+  0x65, 0x63, 0x6b, 0x65, 0x64, 0x3d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e,
+  0x73, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x70, 0x78, 0x3b, 0x66,
+  0x6f, 0x6e, 0x74, 0x2d, 0x20, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x6a,
+  0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x73, 0x62, 0x65, 0x6c, 0x69, 0x65, 0x76,
+  0x65, 0x64, 0x76, 0x61, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x68, 0x6f,
+  0x6d, 0x70, 0x73, 0x6f, 0x6e, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x69, 0x6e, 0x67,
+  0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69,
+  0x61, 0x6c, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3d, 0x30, 0x63, 0x68,
+  0x65, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3c, 0x2f, 0x74, 0x62, 0x6f, 0x64, 0x79,
+  0x3e, 0x3c, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x43, 0x6f, 0x6d, 0x70,
+  0x6c, 0x65, 0x74, 0x65, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x66, 0x69, 0x78, 0x0a,
+  0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c,
+  0x65, 0x20, 0x3c, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x66, 0x69, 0x6e,
+  0x64, 0x69, 0x6e, 0x67, 0x73, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x20,
+  0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x20, 0x4f, 0x63, 0x74, 0x6f,
+  0x62, 0x65, 0x72, 0x77, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x20, 0x65, 0x78,
+  0x70, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f,
+  0x20, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x6f, 0x70, 0x65, 0x72,
+  0x61, 0x74, 0x65, 0x64, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x65,
+  0x6e, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e,
+  0x64, 0x73, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x6e, 0x75,
+  0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e,
+  0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x6f, 0x6e, 0x53, 0x75, 0x62,
+  0x6d, 0x69, 0x74, 0x6d, 0x61, 0x72, 0x79, 0x6c, 0x61, 0x6e, 0x64, 0x63, 0x6f,
+  0x6c, 0x6c, 0x65, 0x67, 0x65, 0x73, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69,
+  0x63, 0x6c, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x63, 0x6f, 0x6e, 0x74,
+  0x61, 0x63, 0x74, 0x2e, 0x6c, 0x6f, 0x67, 0x67, 0x65, 0x64, 0x49, 0x6e, 0x61,
+  0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x79, 0x73, 0x69, 0x62, 0x6c, 0x69, 0x6e,
+  0x67, 0x73, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x73, 0x26, 0x71,
+  0x75, 0x6f, 0x74, 0x3b, 0x29, 0x73, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20,
+  0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x63, 0x68, 0x65, 0x63, 0x6b,
+  0x62, 0x6f, 0x78, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x73, 0x70, 0x72,
+  0x65, 0x67, 0x6e, 0x61, 0x6e, 0x74, 0x74, 0x6f, 0x6d, 0x6f, 0x72, 0x72, 0x6f,
+  0x77, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x3d, 0x69, 0x63, 0x6f, 0x6e,
+  0x2e, 0x70, 0x6e, 0x67, 0x6a, 0x61, 0x70, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x63,
+  0x6f, 0x64, 0x65, 0x62, 0x61, 0x73, 0x65, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e,
+  0x22, 0x3e, 0x67, 0x61, 0x6d, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x75, 0x63,
+  0x68, 0x20, 0x61, 0x73, 0x20, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20,
+  0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x6f,
+  0x75, 0x72, 0x69, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x74, 0x6f,
+  0x70, 0x3a, 0x31, 0x70, 0x78, 0x20, 0x2e, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e,
+  0x3e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x77, 0x69, 0x64, 0x74,
+  0x68, 0x3d, 0x22, 0x32, 0x6c, 0x61, 0x7a, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x6e,
+  0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69,
+  0x6e, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x22, 0x63, 0x72, 0x69,
+  0x70, 0x74, 0x22, 0x3e, 0x0a, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, 0x2f,
+  0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68,
+  0x74, 0x3a, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x63, 0x6f,
+  0x75, 0x6e, 0x74, 0x72, 0x79, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65,
+  0x20, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x22, 0x20, 0x26, 0x6c, 0x74, 0x3b,
+  0x21, 0x2d, 0x2d, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x22, 0x3e, 0x3c, 0x2f,
+  0x6a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d,
+  0x3e, 0x0a, 0x28, 0xe7, 0xae, 0x80, 0xe4, 0xbd, 0x93, 0x29, 0x28, 0xe7, 0xb9,
+  0x81, 0xe9, 0xab, 0x94, 0x29, 0x68, 0x72, 0x76, 0x61, 0x74, 0x73, 0x6b, 0x69,
+  0x69, 0x74, 0x61, 0x6c, 0x69, 0x61, 0x6e, 0x6f, 0x72, 0x6f, 0x6d, 0xc3, 0xa2,
+  0x6e, 0xc4, 0x83, 0x74, 0xc3, 0xbc, 0x72, 0x6b, 0xc3, 0xa7, 0x65, 0xd8, 0xa7,
+  0xd8, 0xb1, 0xd8, 0xaf, 0xd9, 0x88, 0x74, 0x61, 0x6d, 0x62, 0x69, 0xc3, 0xa9,
+  0x6e, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x69, 0x61, 0x73, 0x6d, 0x65, 0x6e, 0x73,
+  0x61, 0x6a, 0x65, 0x73, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x73, 0x64,
+  0x65, 0x72, 0x65, 0x63, 0x68, 0x6f, 0x73, 0x6e, 0x61, 0x63, 0x69, 0x6f, 0x6e,
+  0x61, 0x6c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x69, 0x6f, 0x63, 0x6f, 0x6e,
+  0x74, 0x61, 0x63, 0x74, 0x6f, 0x75, 0x73, 0x75, 0x61, 0x72, 0x69, 0x6f, 0x73,
+  0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x61, 0x67, 0x6f, 0x62, 0x69, 0x65,
+  0x72, 0x6e, 0x6f, 0x65, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x61, 0x73, 0x61, 0x6e,
+  0x75, 0x6e, 0x63, 0x69, 0x6f, 0x73, 0x76, 0x61, 0x6c, 0x65, 0x6e, 0x63, 0x69,
+  0x61, 0x63, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x69, 0x61, 0x64, 0x65, 0x73, 0x70,
+  0x75, 0xc3, 0xa9, 0x73, 0x64, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x73, 0x70,
+  0x72, 0x6f, 0x79, 0x65, 0x63, 0x74, 0x6f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63,
+  0x74, 0x6f, 0x70, 0xc3, 0xba, 0x62, 0x6c, 0x69, 0x63, 0x6f, 0x6e, 0x6f, 0x73,
+  0x6f, 0x74, 0x72, 0x6f, 0x73, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x61,
+  0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x65, 0x6d, 0x69, 0x6c, 0x6c, 0x6f,
+  0x6e, 0x65, 0x73, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x74, 0x65, 0x70, 0x72,
+  0x65, 0x67, 0x75, 0x6e, 0x74, 0x61, 0x61, 0x6e, 0x74, 0x65, 0x72, 0x69, 0x6f,
+  0x72, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x73, 0x70, 0x72, 0x6f, 0x62,
+  0x6c, 0x65, 0x6d, 0x61, 0x73, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x67, 0x6f, 0x6e,
+  0x75, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x73, 0x6f, 0x70, 0x69, 0x6e, 0x69, 0xc3,
+  0xb3, 0x6e, 0x69, 0x6d, 0x70, 0x72, 0x69, 0x6d, 0x69, 0x72, 0x6d, 0x69, 0x65,
+  0x6e, 0x74, 0x72, 0x61, 0x73, 0x61, 0x6d, 0xc3, 0xa9, 0x72, 0x69, 0x63, 0x61,
+  0x76, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x6f, 0x72, 0x73, 0x6f, 0x63, 0x69, 0x65,
+  0x64, 0x61, 0x64, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x65,
+  0x61, 0x6c, 0x69, 0x7a, 0x61, 0x72, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72,
+  0x6f, 0x70, 0x61, 0x6c, 0x61, 0x62, 0x72, 0x61, 0x73, 0x69, 0x6e, 0x74, 0x65,
+  0x72, 0xc3, 0xa9, 0x73, 0x65, 0x6e, 0x74, 0x6f, 0x6e, 0x63, 0x65, 0x73, 0x65,
+  0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x6d, 0x69, 0x65, 0x6d, 0x62, 0x72,
+  0x6f, 0x73, 0x72, 0x65, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x64, 0x63, 0xc3, 0xb3,
+  0x72, 0x64, 0x6f, 0x62, 0x61, 0x7a, 0x61, 0x72, 0x61, 0x67, 0x6f, 0x7a, 0x61,
+  0x70, 0xc3, 0xa1, 0x67, 0x69, 0x6e, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61,
+  0x6c, 0x65, 0x73, 0x62, 0x6c, 0x6f, 0x71, 0x75, 0x65, 0x61, 0x72, 0x67, 0x65,
+  0x73, 0x74, 0x69, 0xc3, 0xb3, 0x6e, 0x61, 0x6c, 0x71, 0x75, 0x69, 0x6c, 0x65,
+  0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6d, 0x61, 0x73, 0x63, 0x69, 0x65, 0x6e,
+  0x63, 0x69, 0x61, 0x73, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x6f, 0x76,
+  0x65, 0x72, 0x73, 0x69, 0xc3, 0xb3, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65,
+  0x74, 0x61, 0x65, 0x73, 0x74, 0x75, 0x64, 0x69, 0x6f, 0x73, 0x70, 0xc3, 0xba,
+  0x62, 0x6c, 0x69, 0x63, 0x61, 0x6f, 0x62, 0x6a, 0x65, 0x74, 0x69, 0x76, 0x6f,
+  0x61, 0x6c, 0x69, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x62, 0x75, 0x73, 0x63, 0x61,
+  0x64, 0x6f, 0x72, 0x63, 0x61, 0x6e, 0x74, 0x69, 0x64, 0x61, 0x64, 0x65, 0x6e,
+  0x74, 0x72, 0x61, 0x64, 0x61, 0x73, 0x61, 0x63, 0x63, 0x69, 0x6f, 0x6e, 0x65,
+  0x73, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x6f, 0x73, 0x73, 0x75, 0x70, 0x65,
+  0x72, 0x69, 0x6f, 0x72, 0x6d, 0x61, 0x79, 0x6f, 0x72, 0xc3, 0xad, 0x61, 0x61,
+  0x6c, 0x65, 0x6d, 0x61, 0x6e, 0x69, 0x61, 0x66, 0x75, 0x6e, 0x63, 0x69, 0xc3,
+  0xb3, 0x6e, 0xc3, 0xba, 0x6c, 0x74, 0x69, 0x6d, 0x6f, 0x73, 0x68, 0x61, 0x63,
+  0x69, 0x65, 0x6e, 0x64, 0x6f, 0x61, 0x71, 0x75, 0x65, 0x6c, 0x6c, 0x6f, 0x73,
+  0x65, 0x64, 0x69, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x66, 0x65, 0x72, 0x6e, 0x61,
+  0x6e, 0x64, 0x6f, 0x61, 0x6d, 0x62, 0x69, 0x65, 0x6e, 0x74, 0x65, 0x66, 0x61,
+  0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x6e, 0x75, 0x65, 0x73, 0x74, 0x72, 0x61,
+  0x73, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x65, 0x73, 0x70, 0x72, 0x6f, 0x63,
+  0x65, 0x73, 0x6f, 0x73, 0x62, 0x61, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x65, 0x70,
+  0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74,
+  0x61, 0x72, 0x63, 0x6f, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x6f, 0x70, 0x75, 0x62,
+  0x6c, 0x69, 0x63, 0x61, 0x72, 0x63, 0x6f, 0x6d, 0x65, 0x72, 0x63, 0x69, 0x6f,
+  0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x6a, 0xc3, 0xb3, 0x76, 0x65,
+  0x6e, 0x65, 0x73, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x74, 0x6f, 0x74, 0xc3,
+  0xa9, 0x63, 0x6e, 0x69, 0x63, 0x61, 0x63, 0x6f, 0x6e, 0x6a, 0x75, 0x6e, 0x74,
+  0x6f, 0x65, 0x6e, 0x65, 0x72, 0x67, 0xc3, 0xad, 0x61, 0x74, 0x72, 0x61, 0x62,
+  0x61, 0x6a, 0x61, 0x72, 0x61, 0x73, 0x74, 0x75, 0x72, 0x69, 0x61, 0x73, 0x72,
+  0x65, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x65, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a,
+  0x61, 0x72, 0x62, 0x6f, 0x6c, 0x65, 0x74, 0xc3, 0xad, 0x6e, 0x73, 0x61, 0x6c,
+  0x76, 0x61, 0x64, 0x6f, 0x72, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x61,
+  0x74, 0x72, 0x61, 0x62, 0x61, 0x6a, 0x6f, 0x73, 0x70, 0x72, 0x69, 0x6d, 0x65,
+  0x72, 0x6f, 0x73, 0x6e, 0x65, 0x67, 0x6f, 0x63, 0x69, 0x6f, 0x73, 0x6c, 0x69,
+  0x62, 0x65, 0x72, 0x74, 0x61, 0x64, 0x64, 0x65, 0x74, 0x61, 0x6c, 0x6c, 0x65,
+  0x73, 0x70, 0x61, 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x70, 0x72, 0xc3, 0xb3,
+  0x78, 0x69, 0x6d, 0x6f, 0x61, 0x6c, 0x6d, 0x65, 0x72, 0xc3, 0xad, 0x61, 0x61,
+  0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x65, 0x73, 0x71, 0x75, 0x69, 0xc3, 0xa9, 0x6e,
+  0x65, 0x73, 0x63, 0x6f, 0x72, 0x61, 0x7a, 0xc3, 0xb3, 0x6e, 0x73, 0x65, 0x63,
+  0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x62, 0x75, 0x73, 0x63, 0x61, 0x6e, 0x64, 0x6f,
+  0x6f, 0x70, 0x63, 0x69, 0x6f, 0x6e, 0x65, 0x73, 0x65, 0x78, 0x74, 0x65, 0x72,
+  0x69, 0x6f, 0x72, 0x63, 0x6f, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x6f, 0x74, 0x6f,
+  0x64, 0x61, 0x76, 0xc3, 0xad, 0x61, 0x67, 0x61, 0x6c, 0x65, 0x72, 0xc3, 0xad,
+  0x61, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x69,
+  0x63, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x63, 0x69, 0x61, 0x63,
+  0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x74, 0x61, 0x61, 0x73, 0x70, 0x65, 0x63, 0x74,
+  0x6f, 0x73, 0x63, 0x72, 0xc3, 0xad, 0x74, 0x69, 0x63, 0x61, 0x64, 0xc3, 0xb3,
+  0x6c, 0x61, 0x72, 0x65, 0x73, 0x6a, 0x75, 0x73, 0x74, 0x69, 0x63, 0x69, 0x61,
+  0x64, 0x65, 0x62, 0x65, 0x72, 0xc3, 0xa1, 0x6e, 0x70, 0x65, 0x72, 0xc3, 0xad,
+  0x6f, 0x64, 0x6f, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x69, 0x74, 0x61, 0x6d, 0x61,
+  0x6e, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x70, 0x65, 0x71, 0x75, 0x65, 0xc3, 0xb1,
+  0x6f, 0x72, 0x65, 0x63, 0x69, 0x62, 0x69, 0x64, 0x61, 0x74, 0x72, 0x69, 0x62,
+  0x75, 0x6e, 0x61, 0x6c, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x66, 0x65, 0x63,
+  0x61, 0x6e, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x63, 0x61, 0x6e, 0x61, 0x72, 0x69,
+  0x61, 0x73, 0x64, 0x65, 0x73, 0x63, 0x61, 0x72, 0x67, 0x61, 0x64, 0x69, 0x76,
+  0x65, 0x72, 0x73, 0x6f, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x72, 0x63, 0x61,
+  0x72, 0x65, 0x71, 0x75, 0x69, 0x65, 0x72, 0x65, 0x74, 0xc3, 0xa9, 0x63, 0x6e,
+  0x69, 0x63, 0x6f, 0x64, 0x65, 0x62, 0x65, 0x72, 0xc3, 0xad, 0x61, 0x76, 0x69,
+  0x76, 0x69, 0x65, 0x6e, 0x64, 0x61, 0x66, 0x69, 0x6e, 0x61, 0x6e, 0x7a, 0x61,
+  0x73, 0x61, 0x64, 0x65, 0x6c, 0x61, 0x6e, 0x74, 0x65, 0x66, 0x75, 0x6e, 0x63,
+  0x69, 0x6f, 0x6e, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6a, 0x6f, 0x73, 0x64,
+  0x69, 0x66, 0xc3, 0xad, 0x63, 0x69, 0x6c, 0x63, 0x69, 0x75, 0x64, 0x61, 0x64,
+  0x65, 0x73, 0x61, 0x6e, 0x74, 0x69, 0x67, 0x75, 0x61, 0x73, 0x61, 0x76, 0x61,
+  0x6e, 0x7a, 0x61, 0x64, 0x61, 0x74, 0xc3, 0xa9, 0x72, 0x6d, 0x69, 0x6e, 0x6f,
+  0x75, 0x6e, 0x69, 0x64, 0x61, 0x64, 0x65, 0x73, 0x73, 0xc3, 0xa1, 0x6e, 0x63,
+  0x68, 0x65, 0x7a, 0x63, 0x61, 0x6d, 0x70, 0x61, 0xc3, 0xb1, 0x61, 0x73, 0x6f,
+  0x66, 0x74, 0x6f, 0x6e, 0x69, 0x63, 0x72, 0x65, 0x76, 0x69, 0x73, 0x74, 0x61,
+  0x73, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x63, 0x74,
+  0x6f, 0x72, 0x65, 0x73, 0x6d, 0x6f, 0x6d, 0x65, 0x6e, 0x74, 0x6f, 0x73, 0x66,
+  0x61, 0x63, 0x75, 0x6c, 0x74, 0x61, 0x64, 0x63, 0x72, 0xc3, 0xa9, 0x64, 0x69,
+  0x74, 0x6f, 0x64, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x73, 0x73, 0x75, 0x70,
+  0x75, 0x65, 0x73, 0x74, 0x6f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x65, 0x73,
+  0x73, 0x65, 0x67, 0x75, 0x6e, 0x64, 0x6f, 0x73, 0x70, 0x65, 0x71, 0x75, 0x65,
+  0xc3, 0xb1, 0x61, 0xd0, 0xb3, 0xd0, 0xbe, 0xd0, 0xb4, 0xd0, 0xb0, 0xd0, 0xb5,
+  0xd1, 0x81, 0xd0, 0xbb, 0xd0, 0xb8, 0xd0, 0xb5, 0xd1, 0x81, 0xd1, 0x82, 0xd1,
+  0x8c, 0xd0, 0xb1, 0xd1, 0x8b, 0xd0, 0xbb, 0xd0, 0xbe, 0xd0, 0xb1, 0xd1, 0x8b,
+  0xd1, 0x82, 0xd1, 0x8c, 0xd1, 0x8d, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xbc, 0xd0,
+  0x95, 0xd1, 0x81, 0xd0, 0xbb, 0xd0, 0xb8, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xb3,
+  0xd0, 0xbe, 0xd0, 0xbc, 0xd0, 0xb5, 0xd0, 0xbd, 0xd1, 0x8f, 0xd0, 0xb2, 0xd1,
+  0x81, 0xd0, 0xb5, 0xd1, 0x85, 0xd1, 0x8d, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xb9,
+  0xd0, 0xb4, 0xd0, 0xb0, 0xd0, 0xb6, 0xd0, 0xb5, 0xd0, 0xb1, 0xd1, 0x8b, 0xd0,
+  0xbb, 0xd0, 0xb8, 0xd0, 0xb3, 0xd0, 0xbe, 0xd0, 0xb4, 0xd1, 0x83, 0xd0, 0xb4,
+  0xd0, 0xb5, 0xd0, 0xbd, 0xd1, 0x8c, 0xd1, 0x8d, 0xd1, 0x82, 0xd0, 0xbe, 0xd1,
+  0x82, 0xd0, 0xb1, 0xd1, 0x8b, 0xd0, 0xbb, 0xd0, 0xb0, 0xd1, 0x81, 0xd0, 0xb5,
+  0xd0, 0xb1, 0xd1, 0x8f, 0xd0, 0xbe, 0xd0, 0xb4, 0xd0, 0xb8, 0xd0, 0xbd, 0xd1,
+  0x81, 0xd0, 0xb5, 0xd0, 0xb1, 0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xb0, 0xd0, 0xb4,
+  0xd0, 0xbe, 0xd1, 0x81, 0xd0, 0xb0, 0xd0, 0xb9, 0xd1, 0x82, 0xd1, 0x84, 0xd0,
+  0xbe, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xbd, 0xd0, 0xb5, 0xd0, 0xb3, 0xd0, 0xbe,
+  0xd1, 0x81, 0xd0, 0xb2, 0xd0, 0xbe, 0xd0, 0xb8, 0xd1, 0x81, 0xd0, 0xb2, 0xd0,
+  0xbe, 0xd0, 0xb9, 0xd0, 0xb8, 0xd0, 0xb3, 0xd1, 0x80, 0xd1, 0x8b, 0xd1, 0x82,
+  0xd0, 0xbe, 0xd0, 0xb6, 0xd0, 0xb5, 0xd0, 0xb2, 0xd1, 0x81, 0xd0, 0xb5, 0xd0,
+  0xbc, 0xd1, 0x81, 0xd0, 0xb2, 0xd0, 0xbe, 0xd1, 0x8e, 0xd0, 0xbb, 0xd0, 0xb8,
+  0xd1, 0x88, 0xd1, 0x8c, 0xd1, 0x8d, 0xd1, 0x82, 0xd0, 0xb8, 0xd1, 0x85, 0xd0,
+  0xbf, 0xd0, 0xbe, 0xd0, 0xba, 0xd0, 0xb0, 0xd0, 0xb4, 0xd0, 0xbd, 0xd0, 0xb5,
+  0xd0, 0xb9, 0xd0, 0xb4, 0xd0, 0xbe, 0xd0, 0xbc, 0xd0, 0xb0, 0xd0, 0xbc, 0xd0,
+  0xb8, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xbb, 0xd0, 0xb8, 0xd0, 0xb1, 0xd0, 0xbe,
+  0xd1, 0x82, 0xd0, 0xb5, 0xd0, 0xbc, 0xd1, 0x83, 0xd1, 0x85, 0xd0, 0xbe, 0xd1,
+  0x82, 0xd1, 0x8f, 0xd0, 0xb4, 0xd0, 0xb2, 0xd1, 0x83, 0xd1, 0x85, 0xd1, 0x81,
+  0xd0, 0xb5, 0xd1, 0x82, 0xd0, 0xb8, 0xd0, 0xbb, 0xd1, 0x8e, 0xd0, 0xb4, 0xd0,
+  0xb8, 0xd0, 0xb4, 0xd0, 0xb5, 0xd0, 0xbb, 0xd0, 0xbe, 0xd0, 0xbc, 0xd0, 0xb8,
+  0xd1, 0x80, 0xd0, 0xb5, 0xd1, 0x82, 0xd0, 0xb5, 0xd0, 0xb1, 0xd1, 0x8f, 0xd1,
+  0x81, 0xd0, 0xb2, 0xd0, 0xbe, 0xd0, 0xb5, 0xd0, 0xb2, 0xd0, 0xb8, 0xd0, 0xb4,
+  0xd0, 0xb5, 0xd1, 0x87, 0xd0, 0xb5, 0xd0, 0xb3, 0xd0, 0xbe, 0xd1, 0x8d, 0xd1,
+  0x82, 0xd0, 0xb8, 0xd0, 0xbc, 0xd1, 0x81, 0xd1, 0x87, 0xd0, 0xb5, 0xd1, 0x82,
+  0xd1, 0x82, 0xd0, 0xb5, 0xd0, 0xbc, 0xd1, 0x8b, 0xd1, 0x86, 0xd0, 0xb5, 0xd0,
+  0xbd, 0xd1, 0x8b, 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb0, 0xd0, 0xbb, 0xd0, 0xb2,
+  0xd0, 0xb5, 0xd0, 0xb4, 0xd1, 0x8c, 0xd1, 0x82, 0xd0, 0xb5, 0xd0, 0xbc, 0xd0,
+  0xb5, 0xd0, 0xb2, 0xd0, 0xbe, 0xd0, 0xb4, 0xd1, 0x8b, 0xd1, 0x82, 0xd0, 0xb5,
+  0xd0, 0xb1, 0xd0, 0xb5, 0xd0, 0xb2, 0xd1, 0x8b, 0xd1, 0x88, 0xd0, 0xb5, 0xd0,
+  0xbd, 0xd0, 0xb0, 0xd0, 0xbc, 0xd0, 0xb8, 0xd1, 0x82, 0xd0, 0xb8, 0xd0, 0xbf,
+  0xd0, 0xb0, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xbc, 0xd1, 0x83, 0xd0, 0xbf, 0xd1,
+  0x80, 0xd0, 0xb0, 0xd0, 0xb2, 0xd0, 0xbb, 0xd0, 0xb8, 0xd1, 0x86, 0xd0, 0xb0,
+  0xd0, 0xbe, 0xd0, 0xb4, 0xd0, 0xbd, 0xd0, 0xb0, 0xd0, 0xb3, 0xd0, 0xbe, 0xd0,
+  0xb4, 0xd1, 0x8b, 0xd0, 0xb7, 0xd0, 0xbd, 0xd0, 0xb0, 0xd1, 0x8e, 0xd0, 0xbc,
+  0xd0, 0xbe, 0xd0, 0xb3, 0xd1, 0x83, 0xd0, 0xb4, 0xd1, 0x80, 0xd1, 0x83, 0xd0,
+  0xb3, 0xd0, 0xb2, 0xd1, 0x81, 0xd0, 0xb5, 0xd0, 0xb9, 0xd0, 0xb8, 0xd0, 0xb4,
+  0xd0, 0xb5, 0xd1, 0x82, 0xd0, 0xba, 0xd0, 0xb8, 0xd0, 0xbd, 0xd0, 0xbe, 0xd0,
+  0xbe, 0xd0, 0xb4, 0xd0, 0xbd, 0xd0, 0xbe, 0xd0, 0xb4, 0xd0, 0xb5, 0xd0, 0xbb,
+  0xd0, 0xb0, 0xd0, 0xb4, 0xd0, 0xb5, 0xd0, 0xbb, 0xd0, 0xb5, 0xd1, 0x81, 0xd1,
+  0x80, 0xd0, 0xbe, 0xd0, 0xba, 0xd0, 0xb8, 0xd1, 0x8e, 0xd0, 0xbd, 0xd1, 0x8f,
+  0xd0, 0xb2, 0xd0, 0xb5, 0xd1, 0x81, 0xd1, 0x8c, 0xd0, 0x95, 0xd1, 0x81, 0xd1,
+  0x82, 0xd1, 0x8c, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xb7, 0xd0, 0xb0, 0xd0, 0xbd,
+  0xd0, 0xb0, 0xd1, 0x88, 0xd0, 0xb8, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x84, 0xd9,
+  0x87, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xaa, 0xd9, 0x8a, 0xd8, 0xac, 0xd9, 0x85,
+  0xd9, 0x8a, 0xd8, 0xb9, 0xd8, 0xae, 0xd8, 0xa7, 0xd8, 0xb5, 0xd8, 0xa9, 0xd8,
+  0xa7, 0xd9, 0x84, 0xd8, 0xb0, 0xd9, 0x8a, 0xd8, 0xb9, 0xd9, 0x84, 0xd9, 0x8a,
+  0xd9, 0x87, 0xd8, 0xac, 0xd8, 0xaf, 0xd9, 0x8a, 0xd8, 0xaf, 0xd8, 0xa7, 0xd9,
+  0x84, 0xd8, 0xa2, 0xd9, 0x86, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb1, 0xd8, 0xaf,
+  0xd8, 0xaa, 0xd8, 0xad, 0xd9, 0x83, 0xd9, 0x85, 0xd8, 0xb5, 0xd9, 0x81, 0xd8,
+  0xad, 0xd8, 0xa9, 0xd9, 0x83, 0xd8, 0xa7, 0xd9, 0x86, 0xd8, 0xaa, 0xd8, 0xa7,
+  0xd9, 0x84, 0xd9, 0x84, 0xd9, 0x8a, 0xd9, 0x8a, 0xd9, 0x83, 0xd9, 0x88, 0xd9,
+  0x86, 0xd8, 0xb4, 0xd8, 0xa8, 0xd9, 0x83, 0xd8, 0xa9, 0xd9, 0x81, 0xd9, 0x8a,
+  0xd9, 0x87, 0xd8, 0xa7, 0xd8, 0xa8, 0xd9, 0x86, 0xd8, 0xa7, 0xd8, 0xaa, 0xd8,
+  0xad, 0xd9, 0x88, 0xd8, 0xa7, 0xd8, 0xa1, 0xd8, 0xa3, 0xd9, 0x83, 0xd8, 0xab,
+  0xd8, 0xb1, 0xd8, 0xae, 0xd9, 0x84, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa7, 0xd9,
+  0x84, 0xd8, 0xad, 0xd8, 0xa8, 0xd8, 0xaf, 0xd9, 0x84, 0xd9, 0x8a, 0xd9, 0x84,
+  0xd8, 0xaf, 0xd8, 0xb1, 0xd9, 0x88, 0xd8, 0xb3, 0xd8, 0xa7, 0xd8, 0xb6, 0xd8,
+  0xba, 0xd8, 0xb7, 0xd8, 0xaa, 0xd9, 0x83, 0xd9, 0x88, 0xd9, 0x86, 0xd9, 0x87,
+  0xd9, 0x86, 0xd8, 0xa7, 0xd9, 0x83, 0xd8, 0xb3, 0xd8, 0xa7, 0xd8, 0xad, 0xd8,
+  0xa9, 0xd9, 0x86, 0xd8, 0xa7, 0xd8, 0xaf, 0xd9, 0x8a, 0xd8, 0xa7, 0xd9, 0x84,
+  0xd8, 0xb7, 0xd8, 0xa8, 0xd8, 0xb9, 0xd9, 0x84, 0xd9, 0x8a, 0xd9, 0x83, 0xd8,
+  0xb4, 0xd9, 0x83, 0xd8, 0xb1, 0xd8, 0xa7, 0xd9, 0x8a, 0xd9, 0x85, 0xd9, 0x83,
+  0xd9, 0x86, 0xd9, 0x85, 0xd9, 0x86, 0xd9, 0x87, 0xd8, 0xa7, 0xd8, 0xb4, 0xd8,
+  0xb1, 0xd9, 0x83, 0xd8, 0xa9, 0xd8, 0xb1, 0xd8, 0xa6, 0xd9, 0x8a, 0xd8, 0xb3,
+  0xd9, 0x86, 0xd8, 0xb4, 0xd9, 0x8a, 0xd8, 0xb7, 0xd9, 0x85, 0xd8, 0xa7, 0xd8,
+  0xb0, 0xd8, 0xa7, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x81, 0xd9, 0x86, 0xd8, 0xb4,
+  0xd8, 0xa8, 0xd8, 0xa7, 0xd8, 0xa8, 0xd8, 0xaa, 0xd8, 0xb9, 0xd8, 0xa8, 0xd8,
+  0xb1, 0xd8, 0xb1, 0xd8, 0xad, 0xd9, 0x85, 0xd8, 0xa9, 0xd9, 0x83, 0xd8, 0xa7,
+  0xd9, 0x81, 0xd8, 0xa9, 0xd9, 0x8a, 0xd9, 0x82, 0xd9, 0x88, 0xd9, 0x84, 0xd9,
+  0x85, 0xd8, 0xb1, 0xd9, 0x83, 0xd8, 0xb2, 0xd9, 0x83, 0xd9, 0x84, 0xd9, 0x85,
+  0xd8, 0xa9, 0xd8, 0xa3, 0xd8, 0xad, 0xd9, 0x85, 0xd8, 0xaf, 0xd9, 0x82, 0xd9,
+  0x84, 0xd8, 0xa8, 0xd9, 0x8a, 0xd9, 0x8a, 0xd8, 0xb9, 0xd9, 0x86, 0xd9, 0x8a,
+  0xd8, 0xb5, 0xd9, 0x88, 0xd8, 0xb1, 0xd8, 0xa9, 0xd8, 0xb7, 0xd8, 0xb1, 0xd9,
+  0x8a, 0xd9, 0x82, 0xd8, 0xb4, 0xd8, 0xa7, 0xd8, 0xb1, 0xd9, 0x83, 0xd8, 0xac,
+  0xd9, 0x88, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa3, 0xd8, 0xae, 0xd8, 0xb1, 0xd9,
+  0x89, 0xd9, 0x85, 0xd8, 0xb9, 0xd9, 0x86, 0xd8, 0xa7, 0xd8, 0xa7, 0xd8, 0xa8,
+  0xd8, 0xad, 0xd8, 0xab, 0xd8, 0xb9, 0xd8, 0xb1, 0xd9, 0x88, 0xd8, 0xb6, 0xd8,
+  0xa8, 0xd8, 0xb4, 0xd9, 0x83, 0xd9, 0x84, 0xd9, 0x85, 0xd8, 0xb3, 0xd8, 0xac,
+  0xd9, 0x84, 0xd8, 0xa8, 0xd9, 0x86, 0xd8, 0xa7, 0xd9, 0x86, 0xd8, 0xae, 0xd8,
+  0xa7, 0xd9, 0x84, 0xd8, 0xaf, 0xd9, 0x83, 0xd8, 0xaa, 0xd8, 0xa7, 0xd8, 0xa8,
+  0xd9, 0x83, 0xd9, 0x84, 0xd9, 0x8a, 0xd8, 0xa9, 0xd8, 0xa8, 0xd8, 0xaf, 0xd9,
+  0x88, 0xd9, 0x86, 0xd8, 0xa3, 0xd9, 0x8a, 0xd8, 0xb6, 0xd8, 0xa7, 0xd9, 0x8a,
+  0xd9, 0x88, 0xd8, 0xac, 0xd8, 0xaf, 0xd9, 0x81, 0xd8, 0xb1, 0xd9, 0x8a, 0xd9,
+  0x82, 0xd9, 0x83, 0xd8, 0xaa, 0xd8, 0xa8, 0xd8, 0xaa, 0xd8, 0xa3, 0xd9, 0x81,
+  0xd8, 0xb6, 0xd9, 0x84, 0xd9, 0x85, 0xd8, 0xb7, 0xd8, 0xa8, 0xd8, 0xae, 0xd8,
+  0xa7, 0xd9, 0x83, 0xd8, 0xab, 0xd8, 0xb1, 0xd8, 0xa8, 0xd8, 0xa7, 0xd8, 0xb1,
+  0xd9, 0x83, 0xd8, 0xa7, 0xd9, 0x81, 0xd8, 0xb6, 0xd9, 0x84, 0xd8, 0xa7, 0xd8,
+  0xad, 0xd9, 0x84, 0xd9, 0x89, 0xd9, 0x86, 0xd9, 0x81, 0xd8, 0xb3, 0xd9, 0x87,
+  0xd8, 0xa3, 0xd9, 0x8a, 0xd8, 0xa7, 0xd9, 0x85, 0xd8, 0xb1, 0xd8, 0xaf, 0xd9,
+  0x88, 0xd8, 0xaf, 0xd8, 0xa3, 0xd9, 0x86, 0xd9, 0x87, 0xd8, 0xa7, 0xd8, 0xaf,
+  0xd9, 0x8a, 0xd9, 0x86, 0xd8, 0xa7, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa7, 0xd9,
+  0x86, 0xd9, 0x85, 0xd8, 0xb9, 0xd8, 0xb1, 0xd8, 0xb6, 0xd8, 0xaa, 0xd8, 0xb9,
+  0xd9, 0x84, 0xd9, 0x85, 0xd8, 0xaf, 0xd8, 0xa7, 0xd8, 0xae, 0xd9, 0x84, 0xd9,
+  0x85, 0xd9, 0x85, 0xd9, 0x83, 0xd9, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02,
+  0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00,
+  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x07, 0x06, 0x05, 0x04, 0x03,
+  0x02, 0x01, 0x00, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0f, 0x0e,
+  0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
+  0x17, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x18, 0x19, 0x1a, 0x1b,
+  0x1c, 0x1d, 0x1e, 0x1f, 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0xff,
+  0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
+  0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
+  0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+  0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0xff, 0x00,
+  0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00,
+  0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00,
+  0x07, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x63, 0x6f, 0x75,
+  0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f,
+  0x6e, 0x73, 0x65, 0x71, 0x75, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x63, 0x6f,
+  0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61,
+  0x62, 0x6c, 0x65, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x44,
+  0x54, 0x44, 0x2f, 0x78, 0x68, 0x74, 0x6d, 0x6c, 0x6d, 0x61, 0x72, 0x6b, 0x65,
+  0x74, 0x69, 0x6e, 0x67, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65,
+  0x73, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x63, 0x6f, 0x6e, 0x74,
+  0x61, 0x69, 0x6e, 0x65, 0x72, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f,
+  0x6e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x61, 0x64, 0x76,
+  0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,
+  0x65, 0x72, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x3c, 0x2f,
+  0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x3e, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61,
+  0x6c, 0x69, 0x61, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73,
+  0x69, 0x74, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x75, 0x74, 0x68, 0x6f,
+  0x72, 0x69, 0x74, 0x79, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67,
+  0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x69, 0x6c, 0x79, 0x6f, 0x70, 0x65, 0x72,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67,
+  0x65, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x64, 0x61, 0x6e, 0x6f,
+  0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,
+  0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x63, 0x6f,
+  0x6d, 0x70, 0x61, 0x6e, 0x69, 0x65, 0x73, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74,
+  0x75, 0x72, 0x65, 0x61, 0x67, 0x72, 0x65, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22,
+  0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x70, 0x6f, 0x74, 0x65, 0x6e,
+  0x74, 0x69, 0x61, 0x6c, 0x65, 0x64, 0x75, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+  0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x73, 0x65, 0x63, 0x6f,
+  0x6e, 0x64, 0x61, 0x72, 0x79, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68,
+  0x74, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x73, 0x65, 0x78, 0x63,
+  0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69,
+  0x6f, 0x6e, 0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0x0d, 0x0a, 0x73, 0x74,
+  0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x74,
+  0x69, 0x6f, 0x6e, 0x42, 0x69, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x79, 0x7d,
+  0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x73, 0x6f, 0x6c, 0x75, 0x74,
+  0x69, 0x6f, 0x6e, 0x73, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x74, 0x65, 0x6d, 0x70,
+  0x6c, 0x61, 0x74, 0x65, 0x73, 0x64, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x6f, 0x75,
+  0x73, 0x73, 0x61, 0x74, 0x65, 0x6c, 0x6c, 0x69, 0x74, 0x65, 0x64, 0x6f, 0x63,
+  0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68,
+  0x65, 0x72, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x70, 0x72,
+  0x6f, 0x74, 0x6f, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x66, 0x6c, 0x75, 0x65,
+  0x6e, 0x63, 0x65, 0x26, 0x72, 0x61, 0x71, 0x75, 0x6f, 0x3b, 0x3c, 0x2f, 0x65,
+  0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72,
+  0x61, 0x6c, 0x6c, 0x79, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d,
+  0x62, 0x65, 0x61, 0x75, 0x74, 0x69, 0x66, 0x75, 0x6c, 0x74, 0x72, 0x61, 0x6e,
+  0x73, 0x70, 0x6f, 0x72, 0x74, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x65,
+  0x64, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x70, 0x72, 0x6f,
+  0x6d, 0x69, 0x6e, 0x65, 0x6e, 0x74, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x20, 0x74,
+  0x68, 0x65, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x4e, 0x61,
+  0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x2e, 0x66, 0x6f, 0x63, 0x75, 0x73,
+  0x28, 0x29, 0x3b, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d,
+  0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6e, 0x6e, 0x6f, 0x75,
+  0x6e, 0x63, 0x65, 0x64, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x0a,
+  0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x6c, 0x65, 0x73, 0x73,
+  0x20, 0x74, 0x68, 0x61, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x6e, 0x73, 0x69, 0x76,
+  0x65, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x66, 0x72, 0x61,
+  0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x74, 0x65, 0x72, 0x72, 0x69, 0x74, 0x6f,
+  0x72, 0x79, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x63, 0x75,
+  0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e,
+  0x61, 0x6d, 0x65, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x69, 0x73, 0x6d, 0x74,
+  0x72, 0x61, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x65, 0x6c, 0x73, 0x65, 0x77,
+  0x68, 0x65, 0x72, 0x65, 0x41, 0x6c, 0x65, 0x78, 0x61, 0x6e, 0x64, 0x65, 0x72,
+  0x61, 0x70, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x64, 0x6d, 0x61, 0x74, 0x65,
+  0x72, 0x69, 0x61, 0x6c, 0x73, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73,
+  0x74, 0x6d, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x61, 0x66, 0x66,
+  0x69, 0x6c, 0x69, 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f,
+  0x6e, 0x3e, 0x74, 0x72, 0x65, 0x61, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x64, 0x69,
+  0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x2f, 0x64, 0x65, 0x66, 0x61, 0x75,
+  0x6c, 0x74, 0x2e, 0x50, 0x72, 0x65, 0x73, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x6f,
+  0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x3d, 0x22, 0x62, 0x69, 0x6f, 0x67, 0x72,
+  0x61, 0x70, 0x68, 0x79, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x77, 0x69, 0x73, 0x65,
+  0x70, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x65, 0x6e, 0x74, 0x46, 0x72, 0x61, 0x6e,
+  0xc3, 0xa7, 0x61, 0x69, 0x73, 0x48, 0x6f, 0x6c, 0x6c, 0x79, 0x77, 0x6f, 0x6f,
+  0x64, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x74, 0x61,
+  0x6e, 0x64, 0x61, 0x72, 0x64, 0x73, 0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65,
+  0x3e, 0x0a, 0x72, 0x65, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65,
+  0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72,
+  0x72, 0x65, 0x64, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x6f,
+  0x70, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x42, 0x75, 0x73, 0x69, 0x6e,
+  0x65, 0x73, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x75, 0x73, 0x69, 0x6f, 0x6e,
+  0x3e, 0x0a, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x70, 0x72, 0x65, 0x73,
+  0x65, 0x6e, 0x74, 0x65, 0x64, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x65,
+  0x64, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x77, 0x6f, 0x72,
+  0x6c, 0x64, 0x77, 0x69, 0x64, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61,
+  0x63, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x6e, 0x65,
+  0x77, 0x73, 0x70, 0x61, 0x70, 0x65, 0x72, 0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c,
+  0x65, 0x3e, 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x6c,
+  0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x73, 0x73, 0x65, 0x6e,
+  0x74, 0x69, 0x61, 0x6c, 0x66, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x69, 0x61, 0x6c,
+  0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x63, 0x74, 0x69,
+  0x6f, 0x6e, 0x3d, 0x22, 0x2f, 0x61, 0x62, 0x61, 0x6e, 0x64, 0x6f, 0x6e, 0x65,
+  0x64, 0x45, 0x64, 0x75, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x70, 0x61, 0x72,
+  0x73, 0x65, 0x49, 0x6e, 0x74, 0x28, 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69,
+  0x74, 0x79, 0x75, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x3c, 0x2f,
+  0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x0a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69,
+  0x6f, 0x6e, 0x73, 0x4e, 0x6f, 0x74, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x65,
+  0x66, 0x66, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x65, 0x72, 0x66, 0x6f,
+  0x72, 0x6d, 0x65, 0x64, 0x74, 0x77, 0x6f, 0x20, 0x79, 0x65, 0x61, 0x72, 0x73,
+  0x53, 0x69, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72,
+  0x65, 0x66, 0x6f, 0x72, 0x65, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x22,
+  0x3e, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x69, 0x6e, 0x63,
+  0x72, 0x65, 0x61, 0x73, 0x65, 0x64, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x20,
+  0x6f, 0x66, 0x70, 0x65, 0x72, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x74, 0x72,
+  0x79, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x73,
+  0x61, 0x72, 0x79, 0x70, 0x6f, 0x72, 0x74, 0x72, 0x61, 0x79, 0x65, 0x64, 0x65,
+  0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6c, 0x69, 0x7a, 0x61,
+  0x62, 0x65, 0x74, 0x68, 0x3c, 0x2f, 0x69, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x3e,
+  0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x69, 0x6e, 0x73, 0x75,
+  0x72, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68,
+  0x3b, 0x6c, 0x65, 0x67, 0x65, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x47, 0x65, 0x6f,
+  0x67, 0x72, 0x61, 0x70, 0x68, 0x79, 0x63, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61,
+  0x74, 0x65, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x65, 0x73, 0x6f,
+  0x6d, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
+  0x65, 0x73, 0x2e, 0x69, 0x6e, 0x68, 0x65, 0x72, 0x69, 0x74, 0x65, 0x64, 0x3c,
+  0x2f, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x3e, 0x43, 0x6f, 0x6d, 0x6d, 0x75,
+  0x6e, 0x69, 0x74, 0x79, 0x72, 0x65, 0x6c, 0x69, 0x67, 0x69, 0x6f, 0x75, 0x73,
+  0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x6d, 0x6d,
+  0x69, 0x74, 0x74, 0x65, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67,
+  0x73, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x6e, 0x6f, 0x20,
+  0x6c, 0x6f, 0x6e, 0x67, 0x65, 0x72, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x6e, 0x69,
+  0x6e, 0x67, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x63, 0x61,
+  0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65,
+  0x6e, 0x63, 0x79, 0x74, 0x79, 0x70, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x69,
+  0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74,
+  0x69, 0x76, 0x65, 0x3b, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67,
+  0x70, 0x72, 0x65, 0x73, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x69, 0x74,
+  0x69, 0x61, 0x6c, 0x6c, 0x79, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x69, 0x71, 0x75,
+  0x65, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x69, 0x74, 0x20,
+  0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x65, 0x78, 0x69, 0x73, 0x74, 0x65, 0x6e,
+  0x63, 0x65, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x65, 0x74, 0x68,
+  0x69, 0x73, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x68,
+  0x6f, 0x6e, 0x65, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x70,
+  0x72, 0x61, 0x63, 0x74, 0x69, 0x63, 0x65, 0x73, 0x61, 0x64, 0x76, 0x61, 0x6e,
+  0x74, 0x61, 0x67, 0x65, 0x29, 0x3b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20,
+  0x46, 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x70, 0x72, 0x6f, 0x76,
+  0x69, 0x64, 0x69, 0x6e, 0x67, 0x64, 0x65, 0x6d, 0x6f, 0x63, 0x72, 0x61, 0x63,
+  0x79, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x74,
+  0x65, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x73, 0x75, 0x66, 0x66, 0x65, 0x72, 0x69,
+  0x6e, 0x67, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x63, 0x6f,
+  0x6d, 0x70, 0x75, 0x74, 0x65, 0x72, 0x73, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74,
+  0x69, 0x6f, 0x6e, 0x70, 0x72, 0x61, 0x63, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x73,
+  0x61, 0x69, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x69, 0x74, 0x20, 0x6d, 0x61,
+  0x79, 0x20, 0x62, 0x65, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x3c, 0x2f,
+  0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x63, 0x68, 0x65,
+  0x64, 0x75, 0x6c, 0x65, 0x64, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64,
+  0x73, 0x3c, 0x2f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x3e, 0x0a, 0x73, 0x75, 0x73,
+  0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a,
+  0x20, 0x30, 0x73, 0x70, 0x69, 0x72, 0x69, 0x74, 0x75, 0x61, 0x6c, 0x3c, 0x2f,
+  0x68, 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x0a, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73,
+  0x6f, 0x66, 0x74, 0x67, 0x72, 0x61, 0x64, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x64,
+  0x69, 0x73, 0x63, 0x75, 0x73, 0x73, 0x65, 0x64, 0x68, 0x65, 0x20, 0x62, 0x65,
+  0x63, 0x61, 0x6d, 0x65, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x76, 0x65,
+  0x6a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x6a, 0x73, 0x68, 0x6f, 0x75, 0x73,
+  0x65, 0x68, 0x6f, 0x6c, 0x64, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65,
+  0x64, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x64, 0x6c, 0x69, 0x74,
+  0x65, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x64, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79,
+  0x65, 0x64, 0x75, 0x70, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x76, 0x61,
+  0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e,
+  0x69, 0x6e, 0x67, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x63,
+  0x65, 0x6e, 0x74, 0x75, 0x72, 0x69, 0x65, 0x73, 0x4a, 0x61, 0x70, 0x61, 0x6e,
+  0x65, 0x73, 0x65, 0x20, 0x61, 0x6d, 0x6f, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65,
+  0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x61, 0x6c, 0x67, 0x6f,
+  0x72, 0x69, 0x74, 0x68, 0x6d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74,
+  0x73, 0x72, 0x65, 0x62, 0x65, 0x6c, 0x6c, 0x69, 0x6f, 0x6e, 0x75, 0x6e, 0x64,
+  0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x6f, 0x75, 0x72, 0x61,
+  0x67, 0x65, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x61, 0x62, 0x6c, 0x65, 0x69, 0x6e,
+  0x76, 0x6f, 0x6c, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74,
+  0x69, 0x76, 0x65, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x70,
+  0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x6c, 0x74, 0x68,
+  0x6f, 0x75, 0x67, 0x68, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x69, 0x6e, 0x67,
+  0x63, 0x6f, 0x6e, 0x64, 0x75, 0x63, 0x74, 0x65, 0x64, 0x29, 0x2c, 0x20, 0x77,
+  0x68, 0x69, 0x63, 0x68, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65,
+  0x64, 0x2d, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x3e, 0x46, 0x65, 0x62,
+  0x72, 0x75, 0x61, 0x72, 0x79, 0x20, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x6f, 0x75,
+  0x73, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x3a, 0x63, 0x6f,
+  0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65,
+  0x6e, 0x74, 0x73, 0x65, 0x78, 0x63, 0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x74, 0x63,
+  0x6f, 0x6c, 0x73, 0x70, 0x61, 0x6e, 0x3d, 0x22, 0x74, 0x65, 0x63, 0x68, 0x6e,
+  0x69, 0x63, 0x61, 0x6c, 0x6e, 0x65, 0x61, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x20, 0x73, 0x6f, 0x75, 0x72,
+  0x63, 0x65, 0x20, 0x6f, 0x66, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65,
+  0x64, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x20, 0x46, 0x61,
+  0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c,
+  0x65, 0x20, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x65, 0x6c,
+  0x65, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x73,
+  0x69, 0x76, 0x65, 0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0x0a, 0x09, 0x73,
+  0x70, 0x6f, 0x6e, 0x73, 0x6f, 0x72, 0x65, 0x64, 0x64, 0x6f, 0x63, 0x75, 0x6d,
+  0x65, 0x6e, 0x74, 0x2e, 0x6f, 0x72, 0x20, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b,
+  0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x74, 0x68, 0x6f, 0x73,
+  0x65, 0x20, 0x77, 0x68, 0x6f, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+  0x73, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x64, 0x69, 0x66,
+  0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74,
+  0x65, 0x64, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x63, 0x6f,
+  0x6e, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74,
+  0x69, 0x6e, 0x67, 0x22, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x2e,
+  0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x63, 0x6c, 0x61, 0x73, 0x73,
+  0x69, 0x63, 0x61, 0x6c, 0x63, 0x6f, 0x61, 0x6c, 0x69, 0x74, 0x69, 0x6f, 0x6e,
+  0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x64, 0x65, 0x63, 0x69,
+  0x73, 0x69, 0x6f, 0x6e, 0x73, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61, 0x6e,
+  0x74, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x65, 0x76, 0x6f,
+  0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65,
+  0x72, 0x22, 0x65, 0x6e, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x74, 0x6f, 0x61, 0x6c,
+  0x6f, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65,
+  0x72, 0x65, 0x64, 0x2d, 0x2d, 0x3e, 0x0d, 0x0a, 0x3c, 0x21, 0x2d, 0x2d, 0x41,
+  0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x65,
+  0x63, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x20,
+  0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x3c, 0x66, 0x75, 0x72, 0x6e,
+  0x69, 0x74, 0x75, 0x72, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74,
+  0x20, 0x20, 0x6f, 0x6e, 0x62, 0x6c, 0x75, 0x72, 0x3d, 0x22, 0x73, 0x75, 0x73,
+  0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65,
+  0x6e, 0x74, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x4d, 0x6f,
+  0x72, 0x65, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x61, 0x62, 0x6f, 0x6c, 0x69, 0x73,
+  0x68, 0x65, 0x64, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x77,
+  0x65, 0x72, 0x65, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x65, 0x6d, 0x6f, 0x74, 0x69,
+  0x6f, 0x6e, 0x61, 0x6c, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79,
+  0x6e, 0x61, 0x72, 0x72, 0x61, 0x74, 0x69, 0x76, 0x65, 0x61, 0x64, 0x76, 0x6f,
+  0x63, 0x61, 0x74, 0x65, 0x73, 0x70, 0x78, 0x3b, 0x62, 0x6f, 0x72, 0x64, 0x65,
+  0x72, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x64, 0x69, 0x72,
+  0x3d, 0x22, 0x6c, 0x74, 0x72, 0x22, 0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65,
+  0x65, 0x73, 0x72, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x20, 0x73,
+  0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73,
+  0x73, 0x6f, 0x72, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x73, 0x64,
+  0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x53, 0x65, 0x70, 0x74, 0x65,
+  0x6d, 0x62, 0x65, 0x72, 0x61, 0x64, 0x64, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x28,
+  0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x20, 0x73, 0x75, 0x67, 0x67,
+  0x65, 0x73, 0x74, 0x65, 0x64, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x61, 0x74, 0x65,
+  0x72, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x65, 0x6c, 0x61,
+  0x62, 0x6f, 0x72, 0x61, 0x74, 0x65, 0x53, 0x6f, 0x6d, 0x65, 0x74, 0x69, 0x6d,
+  0x65, 0x73, 0x49, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x65, 0x63, 0x65,
+  0x72, 0x74, 0x61, 0x69, 0x6e, 0x6c, 0x79, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c,
+  0x6c, 0x65, 0x64, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x73, 0x4a,
+  0x65, 0x72, 0x75, 0x73, 0x61, 0x6c, 0x65, 0x6d, 0x74, 0x68, 0x65, 0x79, 0x20,
+  0x68, 0x61, 0x76, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x69, 0x6e, 0x67,
+  0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x76,
+  0x69, 0x6e, 0x63, 0x65, 0x73, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0x74, 0x65,
+  0x65, 0x61, 0x72, 0x62, 0x69, 0x74, 0x72, 0x61, 0x72, 0x79, 0x72, 0x65, 0x63,
+  0x6f, 0x67, 0x6e, 0x69, 0x7a, 0x65, 0x77, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x20,
+  0x74, 0x6f, 0x70, 0x78, 0x3b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x74, 0x68,
+  0x65, 0x6f, 0x72, 0x79, 0x20, 0x6f, 0x66, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69,
+  0x6f, 0x75, 0x72, 0x57, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x65, 0x65,
+  0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x62, 0x65, 0x67, 0x61, 0x6e,
+  0x20, 0x74, 0x6f, 0x20, 0x69, 0x74, 0x20, 0x62, 0x65, 0x63, 0x61, 0x6d, 0x65,
+  0x6d, 0x61, 0x67, 0x6e, 0x69, 0x74, 0x75, 0x64, 0x65, 0x6d, 0x75, 0x73, 0x74,
+  0x20, 0x68, 0x61, 0x76, 0x65, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61,
+  0x6e, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x65, 0x78, 0x74,
+  0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x61,
+  0x72, 0x79, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x6f, 0x63,
+  0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62,
+  0x6c, 0x65, 0x73, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x70,
+  0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x3c, 0x2f, 0x6c, 0x61, 0x62,
+  0x65, 0x6c, 0x3e, 0x3c, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f,
+  0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x6b, 0x69, 0x6e, 0x64,
+  0x73, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x6f, 0x63, 0x69, 0x65, 0x74, 0x69, 0x65,
+  0x73, 0x61, 0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x69, 0x64, 0x65, 0x20, 0x2d, 0x2d,
+  0x26, 0x67, 0x74, 0x3b, 0x0a, 0x0a, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x77, 0x65,
+  0x73, 0x74, 0x74, 0x68, 0x65, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x72, 0x61,
+  0x64, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x6d, 0x61, 0x79, 0x20, 0x68, 0x61,
+  0x76, 0x65, 0x20, 0x75, 0x6e, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x28, 0x73,
+  0x70, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x22, 0x20, 0x68, 0x72, 0x65,
+  0x66, 0x3d, 0x22, 0x2f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x65,
+  0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x65,
+  0x20, 0x66, 0x72, 0x6f, 0x6d, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72,
+  0x79, 0x62, 0x75, 0x72, 0x69, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x61, 0x20, 0x73,
+  0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x74, 0x68, 0x65, 0x79, 0x20, 0x77, 0x65,
+  0x72, 0x65, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0x3c, 0x2f, 0x4e, 0x6f,
+  0x72, 0x77, 0x65, 0x67, 0x69, 0x61, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66,
+  0x69, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x69, 0x6e, 0x67, 0x70,
+  0x61, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20,
+  0x44, 0x61, 0x74, 0x65, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x79,
+  0x66, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x41, 0x66, 0x74, 0x65,
+  0x72, 0x20, 0x74, 0x68, 0x65, 0x65, 0x71, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+  0x73, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x72, 0x65, 0x67,
+  0x75, 0x6c, 0x61, 0x72, 0x6c, 0x79, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70,
+  0x65, 0x72, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6c, 0x69,
+  0x6e, 0x6b, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x70, 0x68, 0x65, 0x6e, 0x6f, 0x6d,
+  0x65, 0x6e, 0x61, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x20, 0x6f, 0x66, 0x74,
+  0x6f, 0x6f, 0x6c, 0x74, 0x69, 0x70, 0x22, 0x3e, 0x73, 0x75, 0x62, 0x73, 0x74,
+  0x61, 0x6e, 0x63, 0x65, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63,
+  0x61, 0x73, 0x70, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x66, 0x41, 0x6d, 0x6f, 0x6e,
+  0x67, 0x20, 0x74, 0x68, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65,
+  0x64, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x73, 0x41, 0x69, 0x72,
+  0x20, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20,
+  0x6f, 0x66, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x69, 0x6d,
+  0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x6d, 0x61, 0x6b, 0x69, 0x6e, 0x67,
+  0x20, 0x69, 0x74, 0x70, 0x61, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x63,
+  0x6f, 0x6e, 0x71, 0x75, 0x65, 0x72, 0x65, 0x64, 0x61, 0x72, 0x65, 0x20, 0x73,
+  0x74, 0x69, 0x6c, 0x6c, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x75, 0x72, 0x65,
+  0x67, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x20, 0x6f, 0x66, 0x68, 0x65, 0x61, 0x64,
+  0x65, 0x64, 0x20, 0x62, 0x79, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x61, 0x6e,
+  0x20, 0x64, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x6d, 0x6f, 0x6c,
+  0x65, 0x63, 0x75, 0x6c, 0x65, 0x73, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x69,
+  0x73, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x74,
+  0x74, 0x72, 0x61, 0x63, 0x74, 0x65, 0x64, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x68,
+  0x6f, 0x6f, 0x64, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x64, 0x64,
+  0x65, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x73, 0x69, 0x6e, 0x67, 0x61,
+  0x70, 0x6f, 0x72, 0x65, 0x64, 0x65, 0x67, 0x72, 0x65, 0x65, 0x20, 0x6f, 0x66,
+  0x66, 0x61, 0x74, 0x68, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x63, 0x6f, 0x6e, 0x66,
+  0x6c, 0x69, 0x63, 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x70, 0x3e,
+  0x0a, 0x63, 0x61, 0x6d, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x77, 0x65, 0x72,
+  0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x6e, 0x6f, 0x74, 0x65, 0x20, 0x74, 0x68,
+  0x61, 0x74, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x69, 0x6e, 0x67, 0x45, 0x78,
+  0x65, 0x63, 0x75, 0x74, 0x69, 0x76, 0x65, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x6d,
+  0x6f, 0x72, 0x65, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x6f, 0x63,
+  0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x74,
+  0x69, 0x63, 0x61, 0x6c, 0x6d, 0x75, 0x73, 0x69, 0x63, 0x69, 0x61, 0x6e, 0x73,
+  0x64, 0x65, 0x6c, 0x69, 0x63, 0x69, 0x6f, 0x75, 0x73, 0x70, 0x72, 0x69, 0x73,
+  0x6f, 0x6e, 0x65, 0x72, 0x73, 0x61, 0x64, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x6f,
+  0x66, 0x55, 0x54, 0x46, 0x2d, 0x38, 0x22, 0x20, 0x2f, 0x3e, 0x3c, 0x21, 0x5b,
+  0x43, 0x44, 0x41, 0x54, 0x41, 0x5b, 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x74, 0x61,
+  0x63, 0x74, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x65, 0x72, 0x6e, 0x20, 0x62, 0x67,
+  0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x22, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73,
+  0x20, 0x6f, 0x66, 0x2e, 0x20, 0x49, 0x74, 0x20, 0x77, 0x61, 0x73, 0x20, 0x69,
+  0x6e, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x70, 0x65, 0x72, 0x6d, 0x69,
+  0x74, 0x74, 0x65, 0x64, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e,
+  0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x6f, 0x66, 0x66, 0x69,
+  0x63, 0x69, 0x61, 0x6c, 0x73, 0x73, 0x65, 0x72, 0x69, 0x6f, 0x75, 0x73, 0x6c,
+  0x79, 0x2d, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x69, 0x6e, 0x69,
+  0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x69,
+  0x6e, 0x67, 0x6c, 0x6f, 0x6e, 0x67, 0x2d, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e,
+  0x66, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x75, 0x63, 0x68, 0x20, 0x74,
+  0x68, 0x61, 0x74, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x6d,
+  0x61, 0x72, 0x6b, 0x65, 0x64, 0x20, 0x62, 0x79, 0x3c, 0x2f, 0x62, 0x75, 0x74,
+  0x74, 0x6f, 0x6e, 0x3e, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+  0x62, 0x75, 0x74, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x69, 0x6e, 0x63, 0x72,
+  0x65, 0x61, 0x73, 0x65, 0x73, 0x64, 0x6f, 0x77, 0x6e, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x64, 0x65, 0x70,
+  0x65, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x2d, 0x2d, 0x3e, 0x0a, 0x3c, 0x21, 0x2d,
+  0x2d, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x57, 0x69,
+  0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x73,
+  0x20, 0x6f, 0x66, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x77,
+  0x61, 0x73, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x56, 0x65, 0x6e, 0x65, 0x7a,
+  0x75, 0x65, 0x6c, 0x61, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x6c, 0x79,
+  0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x70, 0x65, 0x72, 0x73,
+  0x6f, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x69,
+  0x63, 0x66, 0x61, 0x76, 0x6f, 0x75, 0x72, 0x20, 0x6f, 0x66, 0x69, 0x6e, 0x76,
+  0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x6b, 0x69, 0x70, 0x65, 0x64,
+  0x69, 0x61, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x65, 0x6e, 0x74, 0x76, 0x69,
+  0x72, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20,
+  0x77, 0x61, 0x73, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x6c, 0x65, 0x43,
+  0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74,
+  0x69, 0x63, 0x61, 0x6c, 0x73, 0x68, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x61, 0x74,
+  0x70, 0x72, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x76, 0x65, 0x61, 0x77, 0x61, 0x79,
+  0x20, 0x66, 0x72, 0x6f, 0x6d, 0x6d, 0x6f, 0x6c, 0x65, 0x63, 0x75, 0x6c, 0x61,
+  0x72, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x65, 0x6c, 0x79, 0x64, 0x69, 0x73,
+  0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x55, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74,
+  0x68, 0x65, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x3e, 0x26,
+  0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, 0x2f, 0x49, 0x74, 0x20, 0x69, 0x73, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x77,
+  0x69, 0x6c, 0x6c, 0x20, 0x68, 0x61, 0x76, 0x65, 0x6f, 0x72, 0x67, 0x61, 0x6e,
+  0x69, 0x73, 0x6d, 0x73, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65,
+  0x46, 0x72, 0x69, 0x65, 0x64, 0x72, 0x69, 0x63, 0x68, 0x77, 0x61, 0x73, 0x20,
+  0x66, 0x69, 0x72, 0x73, 0x74, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79,
+  0x20, 0x66, 0x61, 0x63, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x66, 0x6f, 0x72,
+  0x6d, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x69,
+  0x6e, 0x67, 0x54, 0x65, 0x63, 0x68, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x70, 0x68,
+  0x79, 0x73, 0x69, 0x63, 0x69, 0x73, 0x74, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x73,
+  0x20, 0x69, 0x6e, 0x6e, 0x61, 0x76, 0x69, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x73,
+  0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x73, 0x70, 0x61, 0x6e, 0x20,
+  0x69, 0x64, 0x3d, 0x22, 0x73, 0x6f, 0x75, 0x67, 0x68, 0x74, 0x20, 0x74, 0x6f,
+  0x62, 0x65, 0x6c, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x65, 0x73, 0x75, 0x72, 0x76,
+  0x69, 0x76, 0x69, 0x6e, 0x67, 0x7d, 0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65,
+  0x3e, 0x68, 0x69, 0x73, 0x20, 0x64, 0x65, 0x61, 0x74, 0x68, 0x61, 0x73, 0x20,
+  0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x64, 0x20,
+  0x62, 0x79, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x65, 0x78,
+  0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20,
+  0x74, 0x68, 0x65, 0x77, 0x61, 0x73, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x61,
+  0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x6c, 0x65, 0x76, 0x65, 0x6c,
+  0x73, 0x20, 0x6f, 0x66, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66,
+  0x4f, 0x66, 0x66, 0x69, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x64, 0x69, 0x73, 0x6d,
+  0x69, 0x73, 0x73, 0x65, 0x64, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x69, 0x73,
+  0x74, 0x72, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x65, 0x73, 0x64, 0x75, 0x70,
+  0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x73, 0x69,
+  0x76, 0x65, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x61, 0x6c,
+  0x6c, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x67, 0x61, 0x6c, 0x6c, 0x65, 0x72,
+  0x69, 0x65, 0x73, 0x7b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x70,
+  0x65, 0x6f, 0x70, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x72, 0x65, 0x67, 0x69, 0x6f,
+  0x6e, 0x20, 0x6f, 0x66, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73,
+  0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x69, 0x6d, 0x67, 0x20,
+  0x61, 0x6c, 0x74, 0x3d, 0x22, 0x69, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x72,
+  0x6e, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x6d, 0x65, 0x74,
+  0x68, 0x6f, 0x64, 0x20, 0x6f, 0x66, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69,
+  0x6e, 0x67, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x6e, 0x65,
+  0x65, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x74, 0x68, 0x65, 0x20, 0x47, 0x72,
+  0x65, 0x61, 0x74, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x73,
+  0x65, 0x65, 0x6d, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x76, 0x69, 0x65, 0x77, 0x65,
+  0x64, 0x20, 0x61, 0x73, 0x69, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x20, 0x6f, 0x6e,
+  0x69, 0x64, 0x65, 0x61, 0x20, 0x74, 0x68, 0x61, 0x74, 0x74, 0x68, 0x65, 0x20,
+  0x57, 0x6f, 0x72, 0x6c, 0x64, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x6f,
+  0x66, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x68, 0x65,
+  0x73, 0x65, 0x20, 0x61, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74,
+  0x22, 0x3e, 0x63, 0x61, 0x72, 0x65, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x6d, 0x61,
+  0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65,
+  0x20, 0x6f, 0x66, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x61,
+  0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x70, 0x72, 0x65, 0x64, 0x69,
+  0x63, 0x74, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70,
+  0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x72, 0x69, 0x67, 0x68,
+  0x74, 0x22, 0x3e, 0x0d, 0x0a, 0x72, 0x65, 0x73, 0x69, 0x64, 0x65, 0x6e, 0x63,
+  0x65, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x63, 0x6f, 0x6e,
+  0x74, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x61, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x74,
+  0x65, 0x6e, 0x20, 0x20, 0x7d, 0x29, 0x28, 0x29, 0x3b, 0x0d, 0x0a, 0x70, 0x72,
+  0x6f, 0x62, 0x61, 0x62, 0x6c, 0x79, 0x20, 0x50, 0x72, 0x6f, 0x66, 0x65, 0x73,
+  0x73, 0x6f, 0x72, 0x2d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x20, 0x72,
+  0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x65, 0x64, 0x73, 0x61, 0x79, 0x73, 0x20,
+  0x74, 0x68, 0x61, 0x74, 0x68, 0x61, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65,
+  0x70, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x48, 0x75, 0x6e, 0x67,
+  0x61, 0x72, 0x69, 0x61, 0x6e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x6f,
+  0x66, 0x73, 0x65, 0x72, 0x76, 0x65, 0x73, 0x20, 0x61, 0x73, 0x55, 0x6e, 0x69,
+  0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69,
+  0x6f, 0x6e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x66, 0x6f,
+  0x72, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x69, 0x6e, 0x66, 0x65, 0x63, 0x74,
+  0x69, 0x6f, 0x6e, 0x61, 0x67, 0x72, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x68,
+  0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x70, 0x6f, 0x70, 0x75, 0x6c,
+  0x61, 0x72, 0x22, 0x3e, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x20, 0x6f, 0x6e,
+  0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x65, 0x6c, 0x65, 0x63,
+  0x74, 0x6f, 0x72, 0x61, 0x6c, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x6f,
+  0x66, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x74,
+  0x75, 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65,
+  0x63, 0x74, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x69, 0x61, 0x6e, 0x70, 0x72,
+  0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x6c, 0x69, 0x76, 0x69, 0x6e, 0x67,
+  0x20, 0x69, 0x6e, 0x65, 0x61, 0x73, 0x69, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x70,
+  0x72, 0x6f, 0x66, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x0a, 0x26, 0x6c, 0x74, 0x3b,
+  0x21, 0x2d, 0x2d, 0x20, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x66,
+  0x61, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x77, 0x61, 0x73, 0x20,
+  0x74, 0x61, 0x6b, 0x65, 0x6e, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68,
+  0x65, 0x74, 0x6f, 0x6f, 0x6b, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x62, 0x65, 0x6c,
+  0x69, 0x65, 0x66, 0x20, 0x69, 0x6e, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x61,
+  0x6e, 0x73, 0x61, 0x73, 0x20, 0x66, 0x61, 0x72, 0x20, 0x61, 0x73, 0x70, 0x72,
+  0x65, 0x76, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x77,
+  0x69, 0x74, 0x68, 0x61, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x3c,
+  0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x43, 0x68, 0x72, 0x69, 0x73,
+  0x74, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x64,
+  0x0a, 0x0a, 0x49, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x61, 0x63, 0x6b,
+  0x20, 0x69, 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x72, 0x74, 0x68, 0x65, 0x61, 0x73,
+  0x74, 0x6d, 0x61, 0x67, 0x61, 0x7a, 0x69, 0x6e, 0x65, 0x73, 0x3e, 0x3c, 0x73,
+  0x74, 0x72, 0x6f, 0x6e, 0x67, 0x3e, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74,
+  0x65, 0x65, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x67, 0x72,
+  0x6f, 0x75, 0x70, 0x73, 0x20, 0x6f, 0x66, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64,
+  0x20, 0x69, 0x6e, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x61,
+  0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x69, 0x74, 0x73, 0x20, 0x66,
+  0x69, 0x72, 0x73, 0x74, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x6f, 0x77, 0x6e,
+  0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x61, 0x6e, 0x20, 0x6f,
+  0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x72, 0x69, 0x62, 0x62, 0x65, 0x61,
+  0x6e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x65, 0x64, 0x69, 0x73,
+  0x74, 0x72, 0x69, 0x63, 0x74, 0x73, 0x77, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x73,
+  0x69, 0x6e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x3b, 0x20,
+  0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x69, 0x6e, 0x68, 0x61, 0x62, 0x69,
+  0x74, 0x65, 0x64, 0x53, 0x6f, 0x63, 0x69, 0x61, 0x6c, 0x69, 0x73, 0x74, 0x4a,
+  0x61, 0x6e, 0x75, 0x61, 0x72, 0x79, 0x20, 0x31, 0x3c, 0x2f, 0x66, 0x6f, 0x6f,
+  0x74, 0x65, 0x72, 0x3e, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x6c, 0x79,
+  0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x74, 0x68, 0x65, 0x20,
+  0x73, 0x61, 0x6d, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63,
+  0x20, 0x62, 0x75, 0x73, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x20, 0x54, 0x68, 0x65,
+  0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68,
+  0x3b, 0x20, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x20, 0x74, 0x6f, 0x64, 0x65,
+  0x61, 0x6c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x20,
+  0x74, 0x68, 0x65, 0x75, 0x73, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x63,
+  0x6f, 0x6e, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x69, 0x6e, 0x64, 0x65, 0x78,
+  0x2e, 0x70, 0x68, 0x70, 0x61, 0x73, 0x20, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b,
+  0x65, 0x6e, 0x67, 0x61, 0x67, 0x65, 0x20, 0x69, 0x6e, 0x72, 0x65, 0x63, 0x65,
+  0x6e, 0x74, 0x6c, 0x79, 0x2c, 0x66, 0x65, 0x77, 0x20, 0x79, 0x65, 0x61, 0x72,
+  0x73, 0x77, 0x65, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x0a, 0x3c, 0x68,
+  0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x20,
+  0x62, 0x79, 0x61, 0x72, 0x65, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x63, 0x69,
+  0x74, 0x69, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73,
+  0x6b, 0x65, 0x79, 0x63, 0x6f, 0x6e, 0x64, 0x65, 0x6d, 0x6e, 0x65, 0x64, 0x61,
+  0x6c, 0x73, 0x6f, 0x20, 0x68, 0x61, 0x76, 0x65, 0x73, 0x65, 0x72, 0x76, 0x69,
+  0x63, 0x65, 0x73, 0x2c, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x20, 0x6f, 0x66,
+  0x53, 0x63, 0x68, 0x6f, 0x6f, 0x6c, 0x20, 0x6f, 0x66, 0x63, 0x6f, 0x6e, 0x76,
+  0x65, 0x72, 0x74, 0x65, 0x64, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x6f,
+  0x66, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x6d, 0x69, 0x6e,
+  0x69, 0x73, 0x74, 0x65, 0x72, 0x73, 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63,
+  0x74, 0x3e, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20,
+  0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e,
+  0x63, 0x65, 0x73, 0x61, 0x64, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x54,
+  0x68, 0x65, 0x79, 0x20, 0x77, 0x65, 0x72, 0x65, 0x61, 0x6e, 0x79, 0x20, 0x6f,
+  0x74, 0x68, 0x65, 0x72, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3d,
+  0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x75, 0x63, 0x68,
+  0x20, 0x6d, 0x6f, 0x72, 0x65, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x65,
+  0x64, 0x77, 0x61, 0x73, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x6f, 0x72, 0x69,
+  0x67, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x20, 0x74, 0x79, 0x70, 0x69, 0x63,
+  0x61, 0x6c, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x79, 0x65, 0x6e,
+  0x67, 0x69, 0x6e, 0x65, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20,
+  0x6e, 0x6f, 0x74, 0x72, 0x65, 0x73, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x73, 0x77,
+  0x65, 0x64, 0x6e, 0x65, 0x73, 0x64, 0x61, 0x79, 0x74, 0x68, 0x65, 0x20, 0x74,
+  0x68, 0x69, 0x72, 0x64, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73,
+  0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x79, 0x20, 0x32, 0x77, 0x68, 0x61, 0x74,
+  0x20, 0x74, 0x68, 0x65, 0x79, 0x61, 0x20, 0x63, 0x65, 0x72, 0x74, 0x61, 0x69,
+  0x6e, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x70, 0x72, 0x6f,
+  0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x68,
+  0x69, 0x73, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x63, 0x6f,
+  0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69,
+  0x76, 0x3e, 0x0a, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x64,
+  0x65, 0x70, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x6e, 0x73, 0x65, 0x61, 0x72, 0x63,
+  0x68, 0x22, 0x3e, 0x0a, 0x70, 0x69, 0x65, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x66,
+  0x63, 0x6f, 0x6d, 0x70, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x66, 0x65,
+  0x72, 0x65, 0x6e, 0x63, 0x65, 0x74, 0x65, 0x6e, 0x6e, 0x65, 0x73, 0x73, 0x65,
+  0x65, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x68, 0x61, 0x73, 0x20, 0x76, 0x65,
+  0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e,
+  0x20, 0x3c, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x3e, 0x67, 0x69,
+  0x76, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72,
+  0x69, 0x61, 0x6e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x22, 0x3e, 0x70,
+  0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x30, 0x76, 0x69, 0x65, 0x77, 0x20,
+  0x74, 0x68, 0x61, 0x74, 0x74, 0x6f, 0x67, 0x65, 0x74, 0x68, 0x65, 0x72, 0x2c,
+  0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x77, 0x61, 0x73, 0x20,
+  0x66, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x20, 0x6f,
+  0x66, 0x61, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x6f, 0x6e, 0x63, 0x68, 0x69,
+  0x6c, 0x64, 0x72, 0x65, 0x6e, 0x2c, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x20,
+  0x6f, 0x66, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x70, 0x6f,
+  0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x61, 0x6c, 0x6c, 0x65, 0x67, 0x65,
+  0x64, 0x6c, 0x79, 0x43, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x61, 0x6e, 0x64, 0x77,
+  0x61, 0x73, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x20, 0x61,
+  0x66, 0x74, 0x65, 0x72, 0x61, 0x72, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e,
+  0x77, 0x61, 0x73, 0x20, 0x73, 0x74, 0x69, 0x6c, 0x6c, 0x73, 0x63, 0x72, 0x6f,
+  0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x6f,
+  0x66, 0x6d, 0x61, 0x6b, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x75, 0x63,
+  0x68, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
+  0x6e, 0x73, 0x2e, 0x0a, 0x0a, 0x41, 0x66, 0x74, 0x65, 0x72, 0x20, 0x2c, 0x20,
+  0x62, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x4d, 0x75, 0x73, 0x65, 0x75, 0x6d,
+  0x20, 0x6f, 0x66, 0x6c, 0x6f, 0x75, 0x69, 0x73, 0x69, 0x61, 0x6e, 0x61, 0x28,
+  0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x69, 0x6e, 0x6e, 0x65,
+  0x73, 0x6f, 0x74, 0x61, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x73,
+  0x61, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x6f, 0x6d, 0x69,
+  0x6e, 0x69, 0x63, 0x61, 0x6e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x6f,
+  0x66, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x64, 0x65, 0x66,
+  0x65, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x30, 0x30, 0x70, 0x78, 0x7c, 0x72, 0x69,
+  0x67, 0x68, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x6d, 0x6f,
+  0x75, 0x73, 0x65, 0x6f, 0x76, 0x65, 0x72, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c,
+  0x65, 0x3d, 0x22, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x28,
+  0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x74, 0x69,
+  0x6e, 0x75, 0x65, 0x73, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x69, 0x73, 0x63, 0x6f,
+  0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68,
+  0x6f, 0x75, 0x74, 0x20, 0x61, 0x77, 0x69, 0x74, 0x68, 0x20, 0x73, 0x6f, 0x6d,
+  0x65, 0x77, 0x68, 0x6f, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x61, 0x20, 0x66,
+  0x6f, 0x72, 0x6d, 0x20, 0x6f, 0x66, 0x61, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20,
+  0x6f, 0x66, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x69, 0x74, 0x6b, 0x6e,
+  0x6f, 0x77, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69,
+  0x63, 0x65, 0x73, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61,
+  0x6e, 0x64, 0x20, 0x6f, 0x66, 0x74, 0x65, 0x6e, 0x6d, 0x65, 0x61, 0x73, 0x75,
+  0x72, 0x69, 0x6e, 0x67, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73,
+  0x70, 0x61, 0x70, 0x65, 0x72, 0x62, 0x61, 0x63, 0x6b, 0x76, 0x61, 0x6c, 0x75,
+  0x65, 0x73, 0x20, 0x6f, 0x66, 0x0d, 0x0a, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65,
+  0x3e, 0x3d, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x64, 0x65, 0x74,
+  0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x65, 0x72, 0x26, 0x71, 0x75, 0x6f, 0x74,
+  0x3b, 0x20, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x20, 0x62, 0x79, 0x61, 0x6e,
+  0x64, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x3c, 0x2f, 0x63, 0x65, 0x6e, 0x74,
+  0x65, 0x72, 0x3e, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x74,
+  0x68, 0x65, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x70, 0x6f, 0x77, 0x65, 0x72,
+  0x20, 0x61, 0x6e, 0x64, 0x6f, 0x66, 0x20, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b,
+  0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x3c, 0x61, 0x20, 0x68,
+  0x72, 0x65, 0x66, 0x3d, 0x22, 0x79, 0x3a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65,
+  0x3b, 0x43, 0x68, 0x75, 0x72, 0x63, 0x68, 0x20, 0x6f, 0x66, 0x74, 0x68, 0x65,
+  0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x76, 0x65, 0x72, 0x79, 0x20, 0x68, 0x69,
+  0x67, 0x68, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x2d, 0x68,
+  0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+  0x74, 0x3d, 0x22, 0x2f, 0x63, 0x67, 0x69, 0x2d, 0x62, 0x69, 0x6e, 0x2f, 0x74,
+  0x6f, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x61, 0x66, 0x72, 0x69, 0x6b,
+  0x61, 0x61, 0x6e, 0x73, 0x65, 0x73, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x74, 0x6f,
+  0x66, 0x72, 0x61, 0x6e, 0xc3, 0xa7, 0x61, 0x69, 0x73, 0x6c, 0x61, 0x74, 0x76,
+  0x69, 0x65, 0xc5, 0xa1, 0x75, 0x6c, 0x69, 0x65, 0x74, 0x75, 0x76, 0x69, 0xc5,
+  0xb3, 0xc4, 0x8c, 0x65, 0xc5, 0xa1, 0x74, 0x69, 0x6e, 0x61, 0xc4, 0x8d, 0x65,
+  0xc5, 0xa1, 0x74, 0x69, 0x6e, 0x61, 0xe0, 0xb9, 0x84, 0xe0, 0xb8, 0x97, 0xe0,
+  0xb8, 0xa2, 0xe6, 0x97, 0xa5, 0xe6, 0x9c, 0xac, 0xe8, 0xaa, 0x9e, 0xe7, 0xae,
+  0x80, 0xe4, 0xbd, 0x93, 0xe5, 0xad, 0x97, 0xe7, 0xb9, 0x81, 0xe9, 0xab, 0x94,
+  0xe5, 0xad, 0x97, 0xed, 0x95, 0x9c, 0xea, 0xb5, 0xad, 0xec, 0x96, 0xb4, 0xe4,
+  0xb8, 0xba, 0xe4, 0xbb, 0x80, 0xe4, 0xb9, 0x88, 0xe8, 0xae, 0xa1, 0xe7, 0xae,
+  0x97, 0xe6, 0x9c, 0xba, 0xe7, 0xac, 0x94, 0xe8, 0xae, 0xb0, 0xe6, 0x9c, 0xac,
+  0xe8, 0xa8, 0x8e, 0xe8, 0xab, 0x96, 0xe5, 0x8d, 0x80, 0xe6, 0x9c, 0x8d, 0xe5,
+  0x8a, 0xa1, 0xe5, 0x99, 0xa8, 0xe4, 0xba, 0x92, 0xe8, 0x81, 0x94, 0xe7, 0xbd,
+  0x91, 0xe6, 0x88, 0xbf, 0xe5, 0x9c, 0xb0, 0xe4, 0xba, 0xa7, 0xe4, 0xbf, 0xb1,
+  0xe4, 0xb9, 0x90, 0xe9, 0x83, 0xa8, 0xe5, 0x87, 0xba, 0xe7, 0x89, 0x88, 0xe7,
+  0xa4, 0xbe, 0xe6, 0x8e, 0x92, 0xe8, 0xa1, 0x8c, 0xe6, 0xa6, 0x9c, 0xe9, 0x83,
+  0xa8, 0xe8, 0x90, 0xbd, 0xe6, 0xa0, 0xbc, 0xe8, 0xbf, 0x9b, 0xe4, 0xb8, 0x80,
+  0xe6, 0xad, 0xa5, 0xe6, 0x94, 0xaf, 0xe4, 0xbb, 0x98, 0xe5, 0xae, 0x9d, 0xe9,
+  0xaa, 0x8c, 0xe8, 0xaf, 0x81, 0xe7, 0xa0, 0x81, 0xe5, 0xa7, 0x94, 0xe5, 0x91,
+  0x98, 0xe4, 0xbc, 0x9a, 0xe6, 0x95, 0xb0, 0xe6, 0x8d, 0xae, 0xe5, 0xba, 0x93,
+  0xe6, 0xb6, 0x88, 0xe8, 0xb4, 0xb9, 0xe8, 0x80, 0x85, 0xe5, 0x8a, 0x9e, 0xe5,
+  0x85, 0xac, 0xe5, 0xae, 0xa4, 0xe8, 0xae, 0xa8, 0xe8, 0xae, 0xba, 0xe5, 0x8c,
+  0xba, 0xe6, 0xb7, 0xb1, 0xe5, 0x9c, 0xb3, 0xe5, 0xb8, 0x82, 0xe6, 0x92, 0xad,
+  0xe6, 0x94, 0xbe, 0xe5, 0x99, 0xa8, 0xe5, 0x8c, 0x97, 0xe4, 0xba, 0xac, 0xe5,
+  0xb8, 0x82, 0xe5, 0xa4, 0xa7, 0xe5, 0xad, 0xa6, 0xe7, 0x94, 0x9f, 0xe8, 0xb6,
+  0x8a, 0xe6, 0x9d, 0xa5, 0xe8, 0xb6, 0x8a, 0xe7, 0xae, 0xa1, 0xe7, 0x90, 0x86,
+  0xe5, 0x91, 0x98, 0xe4, 0xbf, 0xa1, 0xe6, 0x81, 0xaf, 0xe7, 0xbd, 0x91, 0x73,
+  0x65, 0x72, 0x76, 0x69, 0x63, 0x69, 0x6f, 0x73, 0x61, 0x72, 0x74, 0xc3, 0xad,
+  0x63, 0x75, 0x6c, 0x6f, 0x61, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61,
+  0x62, 0x61, 0x72, 0x63, 0x65, 0x6c, 0x6f, 0x6e, 0x61, 0x63, 0x75, 0x61, 0x6c,
+  0x71, 0x75, 0x69, 0x65, 0x72, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x64,
+  0x6f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x6f, 0x73, 0x70, 0x6f, 0x6c,
+  0xc3, 0xad, 0x74, 0x69, 0x63, 0x61, 0x72, 0x65, 0x73, 0x70, 0x75, 0x65, 0x73,
+  0x74, 0x61, 0x77, 0x69, 0x6b, 0x69, 0x70, 0x65, 0x64, 0x69, 0x61, 0x73, 0x69,
+  0x67, 0x75, 0x69, 0x65, 0x6e, 0x74, 0x65, 0x62, 0xc3, 0xba, 0x73, 0x71, 0x75,
+  0x65, 0x64, 0x61, 0x63, 0x6f, 0x6d, 0x75, 0x6e, 0x69, 0x64, 0x61, 0x64, 0x73,
+  0x65, 0x67, 0x75, 0x72, 0x69, 0x64, 0x61, 0x64, 0x70, 0x72, 0x69, 0x6e, 0x63,
+  0x69, 0x70, 0x61, 0x6c, 0x70, 0x72, 0x65, 0x67, 0x75, 0x6e, 0x74, 0x61, 0x73,
+  0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x69, 0x64, 0x6f, 0x72, 0x65, 0x73, 0x70,
+  0x6f, 0x6e, 0x64, 0x65, 0x72, 0x76, 0x65, 0x6e, 0x65, 0x7a, 0x75, 0x65, 0x6c,
+  0x61, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x61, 0x73, 0x64, 0x69, 0x63,
+  0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x72, 0x65, 0x6c, 0x61, 0x63, 0x69, 0xc3,
+  0xb3, 0x6e, 0x6e, 0x6f, 0x76, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x73, 0x69,
+  0x6d, 0x69, 0x6c, 0x61, 0x72, 0x65, 0x73, 0x70, 0x72, 0x6f, 0x79, 0x65, 0x63,
+  0x74, 0x6f, 0x73, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x61, 0x73, 0x69,
+  0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x6f, 0x61, 0x63, 0x74, 0x69, 0x76,
+  0x69, 0x64, 0x61, 0x64, 0x65, 0x6e, 0x63, 0x75, 0x65, 0x6e, 0x74, 0x72, 0x61,
+  0x65, 0x63, 0x6f, 0x6e, 0x6f, 0x6d, 0xc3, 0xad, 0x61, 0x69, 0x6d, 0xc3, 0xa1,
+  0x67, 0x65, 0x6e, 0x65, 0x73, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x61,
+  0x72, 0x64, 0x65, 0x73, 0x63, 0x61, 0x72, 0x67, 0x61, 0x72, 0x6e, 0x65, 0x63,
+  0x65, 0x73, 0x61, 0x72, 0x69, 0x6f, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x69, 0xc3,
+  0xb3, 0x6e, 0x74, 0x65, 0x6c, 0xc3, 0xa9, 0x66, 0x6f, 0x6e, 0x6f, 0x63, 0x6f,
+  0x6d, 0x69, 0x73, 0x69, 0xc3, 0xb3, 0x6e, 0x63, 0x61, 0x6e, 0x63, 0x69, 0x6f,
+  0x6e, 0x65, 0x73, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x64, 0x61, 0x64, 0x65,
+  0x6e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x72, 0x61, 0x6e, 0xc3, 0xa1, 0x6c,
+  0x69, 0x73, 0x69, 0x73, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x6f, 0x73,
+  0x74, 0xc3, 0xa9, 0x72, 0x6d, 0x69, 0x6e, 0x6f, 0x73, 0x70, 0x72, 0x6f, 0x76,
+  0x69, 0x6e, 0x63, 0x69, 0x61, 0x65, 0x74, 0x69, 0x71, 0x75, 0x65, 0x74, 0x61,
+  0x73, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x6f, 0x73, 0x66, 0x75, 0x6e,
+  0x63, 0x69, 0x6f, 0x6e, 0x65, 0x73, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x61,
+  0x64, 0x6f, 0x63, 0x61, 0x72, 0xc3, 0xa1, 0x63, 0x74, 0x65, 0x72, 0x70, 0x72,
+  0x6f, 0x70, 0x69, 0x65, 0x64, 0x61, 0x64, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69,
+  0x70, 0x69, 0x6f, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x69, 0x64, 0x61, 0x64, 0x6d,
+  0x75, 0x6e, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x63, 0x72, 0x65, 0x61, 0x63,
+  0x69, 0xc3, 0xb3, 0x6e, 0x64, 0x65, 0x73, 0x63, 0x61, 0x72, 0x67, 0x61, 0x73,
+  0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x69, 0x61, 0x63, 0x6f, 0x6d, 0x65,
+  0x72, 0x63, 0x69, 0x61, 0x6c, 0x6f, 0x70, 0x69, 0x6e, 0x69, 0x6f, 0x6e, 0x65,
+  0x73, 0x65, 0x6a, 0x65, 0x72, 0x63, 0x69, 0x63, 0x69, 0x6f, 0x65, 0x64, 0x69,
+  0x74, 0x6f, 0x72, 0x69, 0x61, 0x6c, 0x73, 0x61, 0x6c, 0x61, 0x6d, 0x61, 0x6e,
+  0x63, 0x61, 0x67, 0x6f, 0x6e, 0x7a, 0xc3, 0xa1, 0x6c, 0x65, 0x7a, 0x64, 0x6f,
+  0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x6f, 0x70, 0x65, 0x6c, 0xc3, 0xad, 0x63,
+  0x75, 0x6c, 0x61, 0x72, 0x65, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x65, 0x73, 0x67,
+  0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x65, 0x73, 0x74, 0x61, 0x72, 0x72, 0x61,
+  0x67, 0x6f, 0x6e, 0x61, 0x70, 0x72, 0xc3, 0xa1, 0x63, 0x74, 0x69, 0x63, 0x61,
+  0x6e, 0x6f, 0x76, 0x65, 0x64, 0x61, 0x64, 0x65, 0x73, 0x70, 0x72, 0x6f, 0x70,
+  0x75, 0x65, 0x73, 0x74, 0x61, 0x70, 0x61, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x65,
+  0x73, 0x74, 0xc3, 0xa9, 0x63, 0x6e, 0x69, 0x63, 0x61, 0x73, 0x6f, 0x62, 0x6a,
+  0x65, 0x74, 0x69, 0x76, 0x6f, 0x73, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74,
+  0x6f, 0x73, 0xe0, 0xa4, 0xae, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x82, 0xe0, 0xa4,
+  0xb2, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x8f, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x88,
+  0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xbe, 0xe0,
+  0xa4, 0xb8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa5, 0xe0, 0xa4, 0x8f, 0xe0, 0xa4,
+  0xb5, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x87,
+  0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x88, 0xe0, 0xa4, 0x95, 0xe0,
+  0xa5, 0x81, 0xe0, 0xa4, 0x9b, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4,
+  0xbe, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0x95,
+  0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xad, 0xe0,
+  0xa5, 0x80, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0x8f, 0xe0, 0xa4,
+  0xb0, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xae, 0xe0, 0xa5, 0x88,
+  0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa8, 0xe0,
+  0xa4, 0xac, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa4, 0x64, 0x69, 0x70, 0x6c, 0x6f,
+  0x64, 0x6f, 0x63, 0x73, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xaf,
+  0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xa8, 0xe0,
+  0xa4, 0xbe, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4,
+  0xbe, 0xe0, 0xa4, 0xab, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x94,
+  0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xb0, 0xe0,
+  0xa4, 0xb9, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x97, 0xe0, 0xa4,
+  0xb9, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0x86, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xbe,
+  0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa6, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb6, 0xe0,
+  0xa4, 0xb9, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0x88, 0xe0, 0xa4, 0x96, 0xe0, 0xa5,
+  0x87, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0xbf,
+  0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xb5, 0xe0,
+  0xa5, 0x87, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x80, 0xe0, 0xa4,
+  0xa8, 0xe0, 0xa4, 0xac, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x9a, 0xe0, 0xa4, 0xae,
+  0xe0, 0xa5, 0x8c, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xbe, 0xe0,
+  0xa4, 0xb2, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x96, 0xe0, 0xa4,
+  0x9c, 0xe0, 0xa5, 0x89, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xa6,
+  0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xa5, 0xe0, 0xa4, 0xbe, 0xe0,
+  0xa4, 0xa8, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xb6, 0xe0, 0xa4,
+  0xb9, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x85, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0x97,
+  0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xad, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xa8, 0xe0,
+  0xa4, 0x97, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4,
+  0xb8, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0x95,
+  0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x8f, 0xe0, 0xa4, 0x89, 0xe0, 0xa4, 0xb8, 0xe0,
+  0xa5, 0x87, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xaf, 0xe0, 0xa5, 0x80, 0xe0, 0xa4,
+  0xb9, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0x81, 0xe0, 0xa4, 0x86, 0xe0, 0xa4, 0x97,
+  0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x9f, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xae, 0xe0,
+  0xa4, 0x96, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0x95, 0xe0, 0xa4,
+  0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x85, 0xe0, 0xa4, 0xad, 0xe0, 0xa5, 0x80,
+  0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xaf, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xa4, 0xe0,
+  0xa5, 0x81, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xb5, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4,
+  0x9f, 0xe0, 0xa4, 0xa6, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x85,
+  0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x90, 0xe0, 0xa4, 0xb8, 0xe0,
+  0xa5, 0x87, 0xe0, 0xa4, 0xae, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4,
+  0xb2, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xbe,
+  0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0x8a, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xb0, 0xe0,
+  0xa4, 0x9a, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x90, 0xe0, 0xa4,
+  0xb8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa6, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb0,
+  0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xa6, 0xe0,
+  0xa4, 0xbf, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0x82, 0xe0, 0xa4,
+  0xa6, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb9,
+  0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xbe, 0xe0,
+  0xa4, 0x96, 0xe0, 0xa4, 0x9c, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4,
+  0xac, 0xe0, 0xa4, 0x9f, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbf,
+  0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0x87, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x87, 0xe0,
+  0xa4, 0x86, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4,
+  0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0xb2,
+  0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x89, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xad, 0xe0,
+  0xa4, 0xbe, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x87, 0xe0, 0xa4,
+  0xb2, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xb0,
+  0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0x97, 0xe0,
+  0xa5, 0x87, 0xe0, 0xa4, 0xaa, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4,
+  0xb9, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa5, 0xe0, 0xa4, 0x87, 0xe0, 0xa4, 0xb8,
+  0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x80, 0xe0,
+  0xa4, 0x95, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa0, 0xe0, 0xa5,
+  0x80, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x81,
+  0xe0, 0xa4, 0xa6, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa4, 0xe0,
+  0xa4, 0xb9, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4,
+  0xa4, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0x86,
+  0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xbe, 0xe0,
+  0xa4, 0x95, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8c, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4,
+  0xb6, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xa6, 0xe0, 0xa5, 0x87,
+  0xe0, 0xa4, 0x96, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x80, 0xe0,
+  0xa4, 0xb0, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0x96, 0xe0, 0xa5,
+  0x81, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0x97, 0xe0, 0xa5, 0x80,
+  0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x65, 0x78, 0x70,
+  0x65, 0x72, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c,
+  0x65, 0x3e, 0x0d, 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74,
+  0x20, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x63, 0x6f,
+  0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x65, 0x76, 0x65, 0x72, 0x79,
+  0x74, 0x68, 0x69, 0x6e, 0x67, 0x3c, 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+  0x3d, 0x22, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x62,
+  0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3c, 0x61, 0x20, 0x63,
+  0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d,
+  0x65, 0x6e, 0x74, 0x26, 0x63, 0x6f, 0x70, 0x79, 0x3b, 0x20, 0x32, 0x30, 0x31,
+  0x6a, 0x61, 0x76, 0x61, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x63, 0x68, 0x61,
+  0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x62, 0x72, 0x65, 0x61, 0x64, 0x63,
+  0x72, 0x75, 0x6d, 0x62, 0x74, 0x68, 0x65, 0x6d, 0x73, 0x65, 0x6c, 0x76, 0x65,
+  0x73, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x67, 0x6f,
+  0x76, 0x65, 0x72, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x6c, 0x69, 0x66,
+  0x6f, 0x72, 0x6e, 0x69, 0x61, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x69,
+  0x65, 0x73, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x4e,
+  0x61, 0x76, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x6e,
+  0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74,
+  0x69, 0x6f, 0x6e, 0x6e, 0x61, 0x76, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+  0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x3c, 0x2f, 0x74,
+  0x69, 0x74, 0x6c, 0x65, 0x3e, 0x3c, 0x6d, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x62,
+  0x6f, 0x78, 0x22, 0x20, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x69, 0x71, 0x75, 0x65,
+  0x73, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x70,
+  0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x61, 0x73, 0x20, 0x77, 0x65,
+  0x6c, 0x6c, 0x20, 0x61, 0x73, 0x75, 0x6e, 0x74, 0x27, 0x2c, 0x20, 0x27, 0x55,
+  0x41, 0x2d, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x6f,
+  0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x6c, 0x65,
+  0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61,
+  0x74, 0x65, 0x64, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e,
+  0x6e, 0x61, 0x76, 0x69, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x20, 0x3d, 0x20,
+  0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x69, 0x6d, 0x70, 0x72, 0x65, 0x73,
+  0x73, 0x69, 0x6f, 0x6e, 0x26, 0x6c, 0x74, 0x3b, 0x62, 0x72, 0x26, 0x67, 0x74,
+  0x3b, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x70, 0x6f,
+  0x70, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x67, 0x63, 0x6f, 0x6c,
+  0x6f, 0x72, 0x3d, 0x22, 0x23, 0x65, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c,
+  0x6c, 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x70,
+  0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x6e, 0x65, 0x77, 0x73,
+  0x6c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+  0x69, 0x65, 0x73, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e,
+  0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x54, 0x65, 0x63,
+  0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x50, 0x61, 0x72, 0x6c, 0x69, 0x61,
+  0x6d, 0x65, 0x6e, 0x74, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x69, 0x73, 0x6f,
+  0x6e, 0x75, 0x6c, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x2e, 0x69,
+  0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x22, 0x63, 0x6f, 0x6e, 0x63, 0x6c,
+  0x75, 0x73, 0x69, 0x6f, 0x6e, 0x64, 0x69, 0x73, 0x63, 0x75, 0x73, 0x73, 0x69,
+  0x6f, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x62,
+  0x69, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x76, 0x6f,
+  0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69,
+  0x6e, 0x65, 0x72, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x74, 0x6f, 0x6f, 0x64,
+  0x6e, 0x6f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, 0x70, 0x65, 0x72,
+  0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x61, 0x63, 0x68, 0x20, 0x6f,
+  0x74, 0x68, 0x65, 0x72, 0x61, 0x74, 0x6d, 0x6f, 0x73, 0x70, 0x68, 0x65, 0x72,
+  0x65, 0x20, 0x6f, 0x6e, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x3d, 0x22, 0x3c, 0x66,
+  0x6f, 0x72, 0x6d, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x70, 0x72, 0x6f, 0x63, 0x65,
+  0x73, 0x73, 0x69, 0x6e, 0x67, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x76, 0x61, 0x6c,
+  0x75, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43,
+  0x6f, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x75, 0x62, 0x73,
+  0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x77, 0x65, 0x6c, 0x6c, 0x2d, 0x6b, 0x6e,
+  0x6f, 0x77, 0x6e, 0x76, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+  0x72, 0x65, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x70, 0x68, 0x65,
+  0x6e, 0x6f, 0x6d, 0x65, 0x6e, 0x6f, 0x6e, 0x64, 0x69, 0x73, 0x63, 0x69, 0x70,
+  0x6c, 0x69, 0x6e, 0x65, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x70, 0x6e, 0x67, 0x22,
+  0x20, 0x28, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x62, 0x6f,
+  0x75, 0x6e, 0x64, 0x61, 0x72, 0x69, 0x65, 0x73, 0x65, 0x78, 0x70, 0x72, 0x65,
+  0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65,
+  0x6e, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x6f,
+  0x75, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x65, 0x6e, 0x74, 0x65,
+  0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x28, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73,
+  0x3a, 0x22, 0x20, 0x75, 0x6e, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x28, 0x22,
+  0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x20, 0x64, 0x65, 0x6d,
+  0x6f, 0x63, 0x72, 0x61, 0x74, 0x69, 0x63, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65,
+  0x66, 0x3d, 0x22, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x22, 0x3e,
+  0x0a, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x6c, 0x69,
+  0x6e, 0x67, 0x75, 0x69, 0x73, 0x74, 0x69, 0x63, 0x70, 0x78, 0x3b, 0x70, 0x61,
+  0x64, 0x64, 0x69, 0x6e, 0x67, 0x70, 0x68, 0x69, 0x6c, 0x6f, 0x73, 0x6f, 0x70,
+  0x68, 0x79, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x75,
+  0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x69, 0x74, 0x79, 0x66, 0x61, 0x63, 0x69,
+  0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69,
+  0x7a, 0x65, 0x64, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+  0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x6d, 0x61, 0x69,
+  0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x76, 0x6f, 0x63, 0x61, 0x62, 0x75,
+  0x6c, 0x61, 0x72, 0x79, 0x68, 0x79, 0x70, 0x6f, 0x74, 0x68, 0x65, 0x73, 0x69,
+  0x73, 0x2e, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x28, 0x29, 0x3b, 0x26, 0x61,
+  0x6d, 0x70, 0x3b, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x61, 0x6e, 0x6e, 0x6f, 0x74,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x65, 0x68, 0x69, 0x6e, 0x64, 0x20, 0x74,
+  0x68, 0x65, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x70,
+  0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x72, 0x22, 0x61, 0x73, 0x73, 0x75,
+  0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75,
+  0x63, 0x65, 0x64, 0x63, 0x6f, 0x72, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+  0x73, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x69, 0x73, 0x74, 0x73, 0x65, 0x78, 0x70,
+  0x6c, 0x69, 0x63, 0x69, 0x74, 0x6c, 0x79, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61,
+  0x64, 0x20, 0x6f, 0x66, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
+  0x73, 0x20, 0x6f, 0x6e, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x3d, 0x22, 0x63, 0x6f,
+  0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x65, 0x64, 0x64, 0x65, 0x70, 0x61, 0x72,
+  0x74, 0x6d, 0x65, 0x6e, 0x74, 0x6f, 0x63, 0x63, 0x75, 0x70, 0x61, 0x74, 0x69,
+  0x6f, 0x6e, 0x73, 0x6f, 0x6f, 0x6e, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x69,
+  0x6e, 0x76, 0x65, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x70, 0x72, 0x6f, 0x6e,
+  0x6f, 0x75, 0x6e, 0x63, 0x65, 0x64, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66,
+  0x69, 0x65, 0x64, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74,
+  0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x67, 0x65, 0x6f,
+  0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x22, 0x20, 0x68, 0x65, 0x69, 0x67,
+  0x68, 0x74, 0x3d, 0x22, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, 0x3d,
+  0x22, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x64, 0x65,
+  0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x65,
+  0x72, 0x65, 0x6e, 0x63, 0x65, 0x70, 0x75, 0x6e, 0x69, 0x73, 0x68, 0x6d, 0x65,
+  0x6e, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x72,
+  0x65, 0x73, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x61, 0x64, 0x61, 0x70,
+  0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x6f, 0x70, 0x70, 0x6f, 0x73, 0x69, 0x74,
+  0x69, 0x6f, 0x6e, 0x77, 0x65, 0x6c, 0x6c, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e,
+  0x73, 0x75, 0x70, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x64, 0x65, 0x74,
+  0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x68, 0x31, 0x20, 0x63, 0x6c, 0x61,
+  0x73, 0x73, 0x3d, 0x22, 0x30, 0x70, 0x78, 0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69,
+  0x6e, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x73, 0x74,
+  0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x63, 0x65, 0x6c, 0x65, 0x62,
+  0x72, 0x61, 0x74, 0x65, 0x64, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6d, 0x65,
+  0x6e, 0x74, 0x0a, 0x0a, 0x44, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x64,
+  0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x73, 0x61, 0x72, 0x74, 0x69,
+  0x66, 0x69, 0x63, 0x69, 0x61, 0x6c, 0x65, 0x71, 0x75, 0x69, 0x76, 0x61, 0x6c,
+  0x65, 0x6e, 0x74, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64,
+  0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x74, 0x74,
+  0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20,
+  0x69, 0x64, 0x3d, 0x22, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x77, 0x65, 0x72,
+  0x65, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x62, 0x65,
+  0x79, 0x6f, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x67, 0x69, 0x73,
+  0x74, 0x65, 0x72, 0x65, 0x64, 0x6a, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x69,
+  0x73, 0x74, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x61,
+  0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6c, 0x61, 0x6e, 0x67,
+  0x3d, 0x22, 0x65, 0x6e, 0x22, 0x20, 0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65,
+  0x3e, 0x0d, 0x0a, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x3b, 0x20,
+  0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x65, 0x78, 0x74,
+  0x72, 0x65, 0x6d, 0x65, 0x6c, 0x79, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x74,
+  0x72, 0x65, 0x61, 0x6d, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x3e,
+  0x20, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x65, 0x6d,
+  0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x74, 0x61, 0x62,
+  0x6c, 0x65, 0x3e, 0x0d, 0x0a, 0x20, 0x63, 0x6f, 0x6c, 0x73, 0x70, 0x61, 0x6e,
+  0x3d, 0x22, 0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0x0a, 0x20, 0x20, 0x63,
+  0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6f, 0x75,
+  0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x2f, 0x70, 0x3e, 0x3c, 0x2f, 0x64,
+  0x69, 0x76, 0x3e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64,
+  0x22, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x22, 0x65, 0x6e, 0x50, 0x6f, 0x72,
+  0x74, 0x75, 0x67, 0x75, 0x65, 0x73, 0x65, 0x73, 0x75, 0x62, 0x73, 0x74, 0x69,
+  0x74, 0x75, 0x74, 0x65, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61,
+  0x6c, 0x69, 0x6d, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x6d, 0x75,
+  0x6c, 0x74, 0x69, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x61, 0x6c, 0x6d, 0x6f, 0x73,
+  0x74, 0x20, 0x61, 0x6c, 0x6c, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64,
+  0x20, 0x23, 0x61, 0x70, 0x61, 0x72, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x73,
+  0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x74, 0x6f, 0x69, 0x6e, 0x20, 0x45,
+  0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x69,
+  0x7a, 0x65, 0x64, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x66, 0x6f, 0x72,
+  0x67, 0x75, 0x69, 0x64, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x6f, 0x72, 0x69,
+  0x67, 0x69, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x72, 0x65, 0x6d, 0x61, 0x72, 0x6b,
+  0x61, 0x62, 0x6c, 0x65, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e,
+  0x64, 0x68, 0x32, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x3c, 0x61,
+  0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x28, 0x69, 0x6e, 0x63, 0x6c,
+  0x75, 0x64, 0x69, 0x6e, 0x67, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65,
+  0x72, 0x73, 0x70, 0x72, 0x6f, 0x68, 0x69, 0x62, 0x69, 0x74, 0x65, 0x64, 0x3d,
+  0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x64, 0x69, 0x63, 0x74,
+  0x69, 0x6f, 0x6e, 0x61, 0x72, 0x79, 0x70, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74,
+  0x69, 0x6f, 0x6e, 0x72, 0x65, 0x76, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e,
+  0x66, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x70, 0x78, 0x3b,
+  0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73,
+  0x73, 0x66, 0x75, 0x6c, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72,
+  0x73, 0x6d, 0x69, 0x6c, 0x6c, 0x65, 0x6e, 0x6e, 0x69, 0x75, 0x6d, 0x68, 0x69,
+  0x73, 0x20, 0x66, 0x61, 0x74, 0x68, 0x65, 0x72, 0x74, 0x68, 0x65, 0x20, 0x26,
+  0x71, 0x75, 0x6f, 0x74, 0x3b, 0x6e, 0x6f, 0x2d, 0x72, 0x65, 0x70, 0x65, 0x61,
+  0x74, 0x3b, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x69, 0x61, 0x6c, 0x69,
+  0x6e, 0x64, 0x75, 0x73, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x65, 0x6e, 0x63, 0x6f,
+  0x75, 0x72, 0x61, 0x67, 0x65, 0x64, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x20,
+  0x6f, 0x66, 0x20, 0x75, 0x6e, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x69, 0x61, 0x6c,
+  0x65, 0x66, 0x66, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x66,
+  0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69,
+  0x6e, 0x61, 0x74, 0x65, 0x64, 0x69, 0x73, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x65,
+  0x72, 0x65, 0x78, 0x70, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x65,
+  0x76, 0x65, 0x6c, 0x6f, 0x70, 0x69, 0x6e, 0x67, 0x63, 0x61, 0x6c, 0x63, 0x75,
+  0x6c, 0x61, 0x74, 0x65, 0x64, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x66, 0x69,
+  0x65, 0x64, 0x6c, 0x65, 0x67, 0x69, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x73,
+  0x75, 0x62, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x30, 0x22, 0x20, 0x63,
+  0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74,
+  0x65, 0x6c, 0x79, 0x69, 0x6c, 0x6c, 0x75, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65,
+  0x66, 0x69, 0x76, 0x65, 0x20, 0x79, 0x65, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x73,
+  0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73,
+  0x68, 0x69, 0x6e, 0x67, 0x31, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d,
+  0x22, 0x70, 0x73, 0x79, 0x63, 0x68, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x63, 0x6f,
+  0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x65,
+  0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x62, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x20,
+  0x6f, 0x66, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x6a,
+  0x6f, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x73, 0x74, 0x72, 0x75,
+  0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75,
+  0x73, 0x6c, 0x79, 0x3e, 0x3c, 0x2f, 0x69, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x3e,
+  0x6f, 0x6e, 0x63, 0x65, 0x20, 0x61, 0x67, 0x61, 0x69, 0x6e, 0x62, 0x75, 0x74,
+  0x20, 0x72, 0x61, 0x74, 0x68, 0x65, 0x72, 0x69, 0x6d, 0x6d, 0x69, 0x67, 0x72,
+  0x61, 0x6e, 0x74, 0x73, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x75, 0x72, 0x73, 0x65,
+  0x2c, 0x61, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x6f, 0x66, 0x4c, 0x69,
+  0x74, 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x55, 0x6e, 0x6c, 0x69, 0x6b,
+  0x65, 0x20, 0x74, 0x68, 0x65, 0x3c, 0x2f, 0x61, 0x3e, 0x26, 0x6e, 0x62, 0x73,
+  0x70, 0x3b, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69,
+  0x74, 0x20, 0x77, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x43, 0x6f, 0x6e, 0x76,
+  0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x6f, 0x62,
+  0x69, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x61, 0x6e, 0x74,
+  0x61, 0x67, 0x67, 0x72, 0x65, 0x73, 0x73, 0x69, 0x76, 0x65, 0x61, 0x66, 0x74,
+  0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x69, 0x6d, 0x69, 0x6c, 0x61,
+  0x72, 0x6c, 0x79, 0x2c, 0x22, 0x20, 0x2f, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76,
+  0x3e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0d, 0x0a,
+  0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x76, 0x69, 0x73, 0x69, 0x62,
+  0x69, 0x6c, 0x69, 0x74, 0x79, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x20,
+  0x6f, 0x66, 0x76, 0x6f, 0x6c, 0x75, 0x6e, 0x74, 0x65, 0x65, 0x72, 0x73, 0x61,
+  0x74, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x75, 0x6e, 0x64, 0x65,
+  0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x74, 0x65,
+  0x6e, 0x65, 0x64, 0x2a, 0x3c, 0x21, 0x5b, 0x43, 0x44, 0x41, 0x54, 0x41, 0x5b,
+  0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x69, 0x6e, 0x20,
+  0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61,
+  0x74, 0x74, 0x65, 0x72, 0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0x0a, 0x3c,
+  0x2f, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x27, 0x69, 0x20,
+  0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x64, 0x69, 0x66, 0x66, 0x65,
+  0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x65, 0x76, 0x6f, 0x74, 0x65, 0x64, 0x20,
+  0x74, 0x6f, 0x74, 0x72, 0x61, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x73,
+  0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x66, 0x6f, 0x72, 0x75, 0x6c, 0x74, 0x69,
+  0x6d, 0x61, 0x74, 0x65, 0x6c, 0x79, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d,
+  0x65, 0x6e, 0x74, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73,
+  0x73, 0x6f, 0x2d, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x7d, 0x0a, 0x3c,
+  0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61,
+  0x74, 0x69, 0x6f, 0x6e, 0x65, 0x6d, 0x70, 0x68, 0x61, 0x73, 0x69, 0x7a, 0x65,
+  0x64, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x3c, 0x2f,
+  0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x73, 0x75, 0x63, 0x63, 0x65,
+  0x73, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x77, 0x69,
+  0x74, 0x68, 0x4d, 0x65, 0x61, 0x6e, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x2c, 0x69,
+  0x6e, 0x64, 0x75, 0x73, 0x74, 0x72, 0x69, 0x65, 0x73, 0x3c, 0x2f, 0x61, 0x3e,
+  0x3c, 0x62, 0x72, 0x20, 0x2f, 0x3e, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x63,
+  0x6f, 0x6d, 0x65, 0x61, 0x73, 0x70, 0x65, 0x63, 0x74, 0x73, 0x20, 0x6f, 0x66,
+  0x54, 0x65, 0x6c, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x75, 0x66,
+  0x66, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x62, 0x61, 0x73, 0x6b, 0x65, 0x74,
+  0x62, 0x61, 0x6c, 0x6c, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x73, 0x69, 0x64, 0x65,
+  0x73, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x69, 0x6e, 0x67, 0x61, 0x6e,
+  0x20, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x3c, 0x69, 0x6d, 0x67, 0x20,
+  0x61, 0x6c, 0x74, 0x3d, 0x22, 0x61, 0x64, 0x76, 0x65, 0x6e, 0x74, 0x75, 0x72,
+  0x65, 0x73, 0x68, 0x69, 0x73, 0x20, 0x6d, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x6d,
+  0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e,
+  0x63, 0x69, 0x70, 0x6c, 0x65, 0x73, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75,
+  0x6c, 0x61, 0x72, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x72, 0x79,
+  0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x64, 0x65, 0x63,
+  0x69, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x22, 0x3e, 0x3c, 0x73, 0x74, 0x72,
+  0x6f, 0x6e, 0x67, 0x3e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x72,
+  0x73, 0x4a, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x6f, 0x66, 0x64, 0x69,
+  0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x66, 0x61, 0x63, 0x69, 0x6c,
+  0x69, 0x74, 0x61, 0x74, 0x65, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x61, 0x62,
+  0x6c, 0x65, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x2e, 0x63, 0x73, 0x73, 0x22, 0x09,
+  0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x6e, 0x6f,
+  0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69,
+  0x67, 0x68, 0x74, 0x73, 0x69, 0x74, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+  0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x68, 0x61, 0x76, 0x65, 0x62, 0x75, 0x73,
+  0x69, 0x6e, 0x65, 0x73, 0x73, 0x65, 0x73, 0x44, 0x69, 0x63, 0x74, 0x69, 0x6f,
+  0x6e, 0x61, 0x72, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+  0x73, 0x6f, 0x66, 0x74, 0x65, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x64, 0x70, 0x65,
+  0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x20, 0x4a, 0x61,
+  0x6e, 0x75, 0x61, 0x72, 0x79, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x69, 0x73, 0x69,
+  0x6e, 0x67, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x0a, 0x09, 0x64,
+  0x69, 0x70, 0x6c, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x63, 0x6f, 0x6e, 0x74,
+  0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d,
+  0x69, 0x6e, 0x67, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73,
+  0x6d, 0x61, 0x79, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x63, 0x6f, 0x6e,
+  0x63, 0x65, 0x70, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x6e, 0x63, 0x6c, 0x69,
+  0x63, 0x6b, 0x3d, 0x22, 0x49, 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x73,
+  0x6f, 0x66, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x6d, 0x61,
+  0x6b, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x4c, 0x75, 0x78, 0x65, 0x6d,
+  0x62, 0x6f, 0x75, 0x72, 0x67, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e,
+  0x61, 0x6c, 0x61, 0x72, 0x65, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x65,
+  0x6e, 0x67, 0x61, 0x67, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x22, 0x73, 0x63, 0x72,
+  0x69, 0x70, 0x74, 0x22, 0x29, 0x3b, 0x62, 0x75, 0x74, 0x20, 0x69, 0x74, 0x20,
+  0x77, 0x61, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x6f, 0x6e, 0x69, 0x63,
+  0x6f, 0x6e, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x3d, 0x22, 0x0a, 0x3c, 0x21,
+  0x2d, 0x2d, 0x20, 0x45, 0x6e, 0x64, 0x20, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72,
+  0x69, 0x63, 0x61, 0x6c, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x69, 0x61, 0x6c, 0x6c,
+  0x79, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x6f,
+  0x70, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x75, 0x6e, 0x6c, 0x69, 0x6b,
+  0x65, 0x20, 0x74, 0x68, 0x65, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69,
+  0x61, 0x6e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x72,
+  0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x0a, 0x3c, 0x2f, 0x68,
+  0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69,
+  0x73, 0x65, 0x64, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65,
+  0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x41, 0x6c, 0x65,
+  0x78, 0x61, 0x6e, 0x64, 0x72, 0x69, 0x61, 0x72, 0x65, 0x74, 0x69, 0x72, 0x65,
+  0x6d, 0x65, 0x6e, 0x74, 0x41, 0x64, 0x76, 0x65, 0x6e, 0x74, 0x75, 0x72, 0x65,
+  0x73, 0x66, 0x6f, 0x75, 0x72, 0x20, 0x79, 0x65, 0x61, 0x72, 0x73, 0x0a, 0x0a,
+  0x26, 0x6c, 0x74, 0x3b, 0x21, 0x2d, 0x2d, 0x20, 0x69, 0x6e, 0x63, 0x72, 0x65,
+  0x61, 0x73, 0x69, 0x6e, 0x67, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x69,
+  0x6f, 0x6e, 0x68, 0x33, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6f,
+  0x72, 0x69, 0x67, 0x69, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x6f, 0x62, 0x6c, 0x69,
+  0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x72, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x74,
+  0x69, 0x6f, 0x6e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x65, 0x64,
+  0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x64, 0x76,
+  0x61, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x73, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x61, 0x6e,
+  0x73, 0x3c, 0x62, 0x61, 0x73, 0x65, 0x20, 0x68, 0x72, 0x65, 0x66, 0x72, 0x65,
+  0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x6c, 0x79, 0x77, 0x69, 0x6c, 0x6c, 0x69,
+  0x6e, 0x67, 0x20, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x61, 0x62,
+  0x6c, 0x65, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x6e,
+  0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x66, 0x75, 0x6e, 0x63,
+  0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x69, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x20,
+  0x74, 0x68, 0x65, 0x72, 0x65, 0x76, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+  0x65, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x73, 0x20, 0x66,
+  0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72,
+  0x69, 0x7a, 0x65, 0x64, 0x72, 0x65, 0x66, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74,
+  0x6f, 0x74, 0x61, 0x6b, 0x65, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x61, 0x75,
+  0x74, 0x6f, 0x6e, 0x6f, 0x6d, 0x6f, 0x75, 0x73, 0x63, 0x6f, 0x6d, 0x70, 0x72,
+  0x6f, 0x6d, 0x69, 0x73, 0x65, 0x70, 0x6f, 0x6c, 0x69, 0x74, 0x69, 0x63, 0x61,
+  0x6c, 0x20, 0x72, 0x65, 0x73, 0x74, 0x61, 0x75, 0x72, 0x61, 0x6e, 0x74, 0x74,
+  0x77, 0x6f, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x46, 0x65, 0x62, 0x72,
+  0x75, 0x61, 0x72, 0x79, 0x20, 0x32, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79,
+  0x20, 0x6f, 0x66, 0x73, 0x77, 0x66, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e,
+  0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x6e, 0x65, 0x61,
+  0x72, 0x6c, 0x79, 0x20, 0x61, 0x6c, 0x6c, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65,
+  0x6e, 0x20, 0x62, 0x79, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77,
+  0x73, 0x22, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x31, 0x77, 0x69,
+  0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x66, 0x6c, 0x6f, 0x61, 0x74,
+  0x3a, 0x6c, 0x65, 0x66, 0x74, 0x69, 0x73, 0x20, 0x75, 0x73, 0x75, 0x61, 0x6c,
+  0x6c, 0x79, 0x63, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x6e,
+  0x65, 0x77, 0x73, 0x70, 0x61, 0x70, 0x65, 0x72, 0x73, 0x6d, 0x79, 0x73, 0x74,
+  0x65, 0x72, 0x69, 0x6f, 0x75, 0x73, 0x44, 0x65, 0x70, 0x61, 0x72, 0x74, 0x6d,
+  0x65, 0x6e, 0x74, 0x62, 0x65, 0x73, 0x74, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e,
+  0x70, 0x61, 0x72, 0x6c, 0x69, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x75, 0x70,
+  0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x6e,
+  0x69, 0x65, 0x6e, 0x74, 0x72, 0x65, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x65,
+  0x64, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x79,
+  0x73, 0x74, 0x65, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x68, 0x61, 0x73, 0x20, 0x6c,
+  0x65, 0x64, 0x20, 0x74, 0x6f, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x6e,
+  0x64, 0x61, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x69,
+  0x6e, 0x66, 0x6c, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x63, 0x65, 0x72, 0x65,
+  0x6d, 0x6f, 0x6e, 0x69, 0x61, 0x6c, 0x70, 0x72, 0x6f, 0x63, 0x6c, 0x61, 0x69,
+  0x6d, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+  0x6c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x53, 0x63, 0x69,
+  0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d,
+  0x22, 0x6e, 0x6f, 0x2d, 0x74, 0x72, 0x61, 0x64, 0x65, 0x6d, 0x61, 0x72, 0x6b,
+  0x73, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x77, 0x69,
+  0x64, 0x65, 0x73, 0x70, 0x72, 0x65, 0x61, 0x64, 0x4c, 0x69, 0x62, 0x65, 0x72,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x6f, 0x6f, 0x6b, 0x20, 0x70, 0x6c, 0x61,
+  0x63, 0x65, 0x64, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x61,
+  0x73, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x61, 0x73, 0x69, 0x6d, 0x70, 0x72,
+  0x69, 0x73, 0x6f, 0x6e, 0x65, 0x64, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f,
+  0x6e, 0x61, 0x6c, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x6d,
+  0x4c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x4e, 0x6f, 0x76,
+  0x65, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x32, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74,
+  0x69, 0x6f, 0x6e, 0x73, 0x49, 0x6e, 0x64, 0x75, 0x73, 0x74, 0x72, 0x69, 0x61,
+  0x6c, 0x76, 0x61, 0x72, 0x69, 0x65, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x66, 0x6c,
+  0x6f, 0x61, 0x74, 0x3a, 0x20, 0x6c, 0x65, 0x66, 0x44, 0x75, 0x72, 0x69, 0x6e,
+  0x67, 0x20, 0x74, 0x68, 0x65, 0x61, 0x73, 0x73, 0x65, 0x73, 0x73, 0x6d, 0x65,
+  0x6e, 0x74, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x64,
+  0x65, 0x61, 0x6c, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74,
+  0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x72, 0x65,
+  0x6e, 0x63, 0x65, 0x2f, 0x75, 0x6c, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e,
+  0x63, 0x6c, 0x65, 0x61, 0x72, 0x66, 0x69, 0x78, 0x22, 0x3e, 0x74, 0x68, 0x65,
+  0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x6d, 0x61, 0x6e, 0x79, 0x20, 0x79,
+  0x65, 0x61, 0x72, 0x73, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x77, 0x65, 0x72,
+  0x65, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x2c, 0x73, 0x79,
+  0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+  0x6e, 0x74, 0x22, 0x3e, 0x0a, 0x70, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x61, 0x62,
+  0x6c, 0x79, 0x68, 0x69, 0x73, 0x20, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x75,
+  0x73, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x75, 0x6e, 0x65, 0x78,
+  0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69,
+  0x6e, 0x67, 0x20, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x64,
+  0x61, 0x20, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x75, 0x6e, 0x64,
+  0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x22, 0x62, 0x65, 0x6c, 0x6f, 0x6e, 0x67,
+  0x73, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x20, 0x66, 0x72, 0x6f,
+  0x6d, 0x69, 0x6e, 0x20, 0x4f, 0x63, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x70, 0x6f,
+  0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x73, 0x61, 0x69, 0x64, 0x20,
+  0x74, 0x6f, 0x20, 0x62, 0x65, 0x72, 0x65, 0x6c, 0x69, 0x67, 0x69, 0x6f, 0x75,
+  0x73, 0x20, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+  0x72, 0x6f, 0x77, 0x73, 0x70, 0x61, 0x6e, 0x3d, 0x22, 0x6f, 0x6e, 0x6c, 0x79,
+  0x20, 0x61, 0x20, 0x66, 0x65, 0x77, 0x6d, 0x65, 0x61, 0x6e, 0x74, 0x20, 0x74,
+  0x68, 0x61, 0x74, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65,
+  0x2d, 0x2d, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x3c, 0x66, 0x69,
+  0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x3e, 0x41, 0x72, 0x63, 0x68, 0x62, 0x69,
+  0x73, 0x68, 0x6f, 0x70, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6e,
+  0x6f, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x73, 0x65, 0x64, 0x61, 0x70,
+  0x70, 0x72, 0x6f, 0x61, 0x63, 0x68, 0x65, 0x73, 0x70, 0x72, 0x69, 0x76, 0x69,
+  0x6c, 0x65, 0x67, 0x65, 0x73, 0x6e, 0x6f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+  0x3e, 0x0a, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x6d,
+  0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, 0x45, 0x61, 0x73, 0x74,
+  0x65, 0x72, 0x20, 0x65, 0x67, 0x67, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69,
+  0x73, 0x6d, 0x73, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65,
+  0x50, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6c,
+  0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74,
+  0x65, 0x64, 0x22, 0x3e, 0x6e, 0x6f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e,
+  0x0d, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x70, 0x68, 0x70, 0x61, 0x72,
+  0x72, 0x69, 0x76, 0x61, 0x6c, 0x20, 0x6f, 0x66, 0x2d, 0x6a, 0x73, 0x73, 0x64,
+  0x6b, 0x27, 0x29, 0x29, 0x3b, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x20,
+  0x74, 0x6f, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x63,
+  0x61, 0x73, 0x75, 0x61, 0x6c, 0x74, 0x69, 0x65, 0x73, 0x63, 0x6f, 0x6d, 0x70,
+  0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x69,
+  0x61, 0x6e, 0x73, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x20,
+  0x61, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x70, 0x72, 0x6f,
+  0x63, 0x65, 0x64, 0x75, 0x72, 0x65, 0x73, 0x6d, 0x69, 0x67, 0x68, 0x74, 0x20,
+  0x68, 0x61, 0x76, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f,
+  0x6e, 0x69, 0x74, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x73, 0x50, 0x68,
+  0x69, 0x6c, 0x6f, 0x73, 0x6f, 0x70, 0x68, 0x79, 0x66, 0x72, 0x69, 0x65, 0x6e,
+  0x64, 0x73, 0x68, 0x69, 0x70, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20,
+  0x74, 0x6f, 0x67, 0x69, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x74,
+  0x6f, 0x77, 0x61, 0x72, 0x64, 0x20, 0x74, 0x68, 0x65, 0x67, 0x75, 0x61, 0x72,
+  0x61, 0x6e, 0x74, 0x65, 0x65, 0x64, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e,
+  0x74, 0x65, 0x64, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30, 0x30, 0x30,
+  0x76, 0x69, 0x64, 0x65, 0x6f, 0x20, 0x67, 0x61, 0x6d, 0x65, 0x63, 0x6f, 0x6d,
+  0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63,
+  0x74, 0x69, 0x6e, 0x67, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x74, 0x68,
+  0x65, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x73, 0x61,
+  0x6e, 0x73, 0x2d, 0x73, 0x65, 0x72, 0x69, 0x66, 0x6f, 0x6e, 0x6b, 0x65, 0x79,
+  0x70, 0x72, 0x65, 0x73, 0x73, 0x3b, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e,
+  0x67, 0x3a, 0x48, 0x65, 0x20, 0x77, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x75,
+  0x6e, 0x64, 0x65, 0x72, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x74, 0x79, 0x70, 0x69,
+  0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x73, 0x72, 0x63, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+  0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, 0x76, 0x65, 0x73, 0x69, 0x6e,
+  0x63, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64,
+  0x20, 0x62, 0x65, 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e,
+  0x67, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x75, 0x73,
+  0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6c, 0x6f, 0x77, 0x65, 0x72,
+  0x20, 0x74, 0x68, 0x61, 0x6e, 0x73, 0x68, 0x6f, 0x77, 0x73, 0x20, 0x74, 0x68,
+  0x61, 0x74, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x0a, 0x09, 0x09, 0x63,
+  0x6f, 0x6d, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x63, 0x6f, 0x6e, 0x74,
+  0x69, 0x6e, 0x75, 0x6f, 0x75, 0x73, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74,
+  0x69, 0x65, 0x73, 0x61, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x6f, 0x6d, 0x65, 0x72,
+  0x68, 0x65, 0x20, 0x64, 0x69, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x64, 0x75, 0x65,
+  0x20, 0x74, 0x6f, 0x20, 0x69, 0x74, 0x73, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65,
+  0x64, 0x20, 0x74, 0x6f, 0x61, 0x6e, 0x20, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67,
+  0x65, 0x65, 0x66, 0x66, 0x6f, 0x72, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x74, 0x68,
+  0x65, 0x20, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x61, 0x74, 0x74, 0x65, 0x6d,
+  0x70, 0x74, 0x20, 0x74, 0x6f, 0x54, 0x68, 0x65, 0x72, 0x65, 0x66, 0x6f, 0x72,
+  0x65, 0x2c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52,
+  0x65, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x6e, 0x77, 0x61, 0x73, 0x20,
+  0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x45, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x6f,
+  0x6e, 0x69, 0x63, 0x6b, 0x69, 0x6c, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73,
+  0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x73, 0x70, 0x75, 0x62,
+  0x6c, 0x69, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f,
+  0x72, 0x6d, 0x65, 0x72, 0x69, 0x6e, 0x64, 0x69, 0x67, 0x65, 0x6e, 0x6f, 0x75,
+  0x73, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x73, 0x75,
+  0x62, 0x73, 0x69, 0x64, 0x69, 0x61, 0x72, 0x79, 0x63, 0x6f, 0x6e, 0x73, 0x70,
+  0x69, 0x72, 0x61, 0x63, 0x79, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20,
+  0x6f, 0x66, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x61,
+  0x66, 0x66, 0x6f, 0x72, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x75, 0x62, 0x73,
+  0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x20,
+  0x66, 0x6f, 0x72, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e,
+  0x69, 0x74, 0x65, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x61, 0x62, 0x73,
+  0x6f, 0x6c, 0x75, 0x74, 0x65, 0x6c, 0x79, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x73,
+  0x65, 0x64, 0x6c, 0x79, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20,
+  0x61, 0x61, 0x74, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x74, 0x72,
+  0x61, 0x76, 0x65, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x65, 0x70, 0x61, 0x72,
+  0x61, 0x74, 0x65, 0x6c, 0x79, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x65, 0x73, 0x20,
+  0x6f, 0x6e, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x61,
+  0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x66, 0x6f, 0x75, 0x6e,
+  0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x68,
+  0x65, 0x65, 0x74, 0x6d, 0x61, 0x6e, 0x75, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+  0x73, 0x74, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x6f,
+  0x2d, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x28, 0x73, 0x6f, 0x6d, 0x65, 0x74,
+  0x69, 0x6d, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x69, 0x61,
+  0x6c, 0x69, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x75, 0x6e,
+  0x64, 0x65, 0x72, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x71, 0x75, 0x61, 0x72, 0x74,
+  0x65, 0x72, 0x20, 0x6f, 0x66, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70,
+  0x6c, 0x65, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x69,
+  0x6e, 0x64, 0x65, 0x78, 0x2e, 0x70, 0x68, 0x70, 0x3f, 0x3c, 0x2f, 0x62, 0x75,
+  0x74, 0x74, 0x6f, 0x6e, 0x3e, 0x0a, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74,
+  0x61, 0x67, 0x65, 0x62, 0x65, 0x73, 0x74, 0x2d, 0x6b, 0x6e, 0x6f, 0x77, 0x6e,
+  0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x22, 0x20, 0x64,
+  0x69, 0x72, 0x3d, 0x22, 0x6c, 0x74, 0x72, 0x4c, 0x69, 0x65, 0x75, 0x74, 0x65,
+  0x6e, 0x61, 0x6e, 0x74, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d,
+  0x22, 0x74, 0x68, 0x65, 0x79, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x61, 0x62,
+  0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x6d, 0x61, 0x64, 0x65, 0x20,
+  0x75, 0x70, 0x20, 0x6f, 0x66, 0x6e, 0x6f, 0x74, 0x65, 0x64, 0x20, 0x74, 0x68,
+  0x61, 0x74, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x61,
+  0x72, 0x67, 0x75, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x74, 0x6f, 0x20, 0x61,
+  0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65,
+  0x6e, 0x27, 0x73, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x20, 0x6f, 0x66,
+  0x66, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x62, 0x61, 0x73,
+  0x65, 0x64, 0x20, 0x75, 0x70, 0x6f, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65,
+  0x67, 0x69, 0x6f, 0x6e, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f,
+  0x66, 0x70, 0x61, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x73, 0x70, 0x6f,
+  0x73, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x0a, 0x49, 0x6e,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x74,
+  0x68, 0x65, 0x61, 0x66, 0x74, 0x65, 0x72, 0x77, 0x61, 0x72, 0x64, 0x73, 0x63,
+  0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x61, 0x63, 0x72, 0x6f,
+  0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x69,
+  0x66, 0x69, 0x63, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x2e,
+  0x63, 0x61, 0x70, 0x69, 0x74, 0x61, 0x6c, 0x69, 0x73, 0x6d, 0x69, 0x6e, 0x20,
+  0x47, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2d,
+  0x77, 0x69, 0x6e, 0x67, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65,
+  0x6d, 0x53, 0x6f, 0x63, 0x69, 0x65, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x70, 0x6f,
+  0x6c, 0x69, 0x74, 0x69, 0x63, 0x69, 0x61, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63,
+  0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x77, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x6e, 0x20,
+  0x74, 0x6f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x20, 0x6f, 0x66, 0x20,
+  0x4e, 0x65, 0x77, 0x20, 0x59, 0x6f, 0x72, 0x6b, 0x20, 0x61, 0x70, 0x61, 0x72,
+  0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74,
+  0x69, 0x6f, 0x6e, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65,
+  0x75, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x68, 0x69, 0x73,
+  0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x68, 0x61, 0x64, 0x20, 0x62, 0x65,
+  0x65, 0x6e, 0x20, 0x61, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x76,
+  0x65, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74,
+  0x74, 0x65, 0x6e, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x65, 0x6e, 0x74, 0x65,
+  0x72, 0x20, 0x66, 0x6f, 0x72, 0x70, 0x72, 0x6f, 0x6d, 0x69, 0x6e, 0x65, 0x6e,
+  0x63, 0x65, 0x72, 0x65, 0x61, 0x64, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73,
+  0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x69, 0x65, 0x73, 0x62, 0x75, 0x74, 0x20,
+  0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x61, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74,
+  0x20, 0x6f, 0x66, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x65,
+  0x63, 0x6c, 0x61, 0x69, 0x6d, 0x20, 0x74, 0x68, 0x61, 0x74, 0x6c, 0x61, 0x62,
+  0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74,
+  0x69, 0x62, 0x6c, 0x65, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x20, 0x6f,
+  0x66, 0x2c, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x61, 0x73, 0x20, 0x62, 0x65,
+  0x67, 0x61, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x75, 0x73, 0x69, 0x6e, 0x67,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69,
+  0x64, 0x65, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x66,
+  0x72, 0x6f, 0x6d, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x2f, 0x22, 0x20, 0x63,
+  0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x67, 0x65, 0x6f, 0x6c, 0x6f, 0x67, 0x69,
+  0x63, 0x61, 0x6c, 0x73, 0x65, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x6f, 0x66,
+  0x64, 0x65, 0x6c, 0x69, 0x62, 0x65, 0x72, 0x61, 0x74, 0x65, 0x69, 0x6d, 0x70,
+  0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x20,
+  0x74, 0x68, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b,
+  0x20, 0x76, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x74, 0x6f, 0x70, 0x74, 0x68,
+  0x65, 0x20, 0x47, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x6f, 0x75, 0x74, 0x73, 0x69,
+  0x64, 0x65, 0x20, 0x6f, 0x66, 0x6e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74,
+  0x65, 0x64, 0x68, 0x69, 0x73, 0x20, 0x63, 0x61, 0x72, 0x65, 0x65, 0x72, 0x73,
+  0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x3d, 0x22,
+  0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x77, 0x61, 0x73, 0x20, 0x63, 0x61, 0x6c,
+  0x6c, 0x65, 0x64, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x72, 0x74, 0x68,
+  0x72, 0x65, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x6f, 0x74, 0x68,
+  0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e,
+  0x74, 0x69, 0x6f, 0x6e, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x65, 0x64, 0x75, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x63, 0x6f,
+  0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x61, 0x63, 0x63, 0x75, 0x72,
+  0x61, 0x74, 0x65, 0x6c, 0x79, 0x77, 0x65, 0x72, 0x65, 0x20, 0x62, 0x75, 0x69,
+  0x6c, 0x74, 0x77, 0x61, 0x73, 0x20, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x61,
+  0x67, 0x72, 0x65, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x6d, 0x75, 0x63, 0x68,
+  0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x44, 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20,
+  0x74, 0x68, 0x65, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x31, 0x30, 0x30,
+  0x73, 0x6f, 0x6d, 0x65, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x4b, 0x69, 0x6e,
+  0x67, 0x64, 0x6f, 0x6d, 0x20, 0x6f, 0x66, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e,
+  0x74, 0x69, 0x72, 0x65, 0x66, 0x61, 0x6d, 0x6f, 0x75, 0x73, 0x20, 0x66, 0x6f,
+  0x72, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x62,
+  0x6a, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x73, 0x74, 0x68, 0x65, 0x20, 0x46,
+  0x72, 0x65, 0x6e, 0x63, 0x68, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x20, 0x61,
+  0x6e, 0x64, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x64, 0x22, 0x3e, 0x69,
+  0x73, 0x20, 0x73, 0x61, 0x69, 0x64, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x75,
+  0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
+  0x64, 0x75, 0x6d, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x74, 0x65, 0x6e,
+  0x61, 0x20, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x2d, 0x3e, 0x0a,
+  0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x20, 0x4f, 0x66, 0x66, 0x69, 0x63,
+  0x69, 0x61, 0x6c, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x77, 0x69, 0x64, 0x65,
+  0x2e, 0x61, 0x72, 0x69, 0x61, 0x2d, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x74, 0x68,
+  0x65, 0x20, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x74, 0x61, 0x6e, 0x64, 0x20, 0x69,
+  0x74, 0x20, 0x77, 0x61, 0x73, 0x64, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
+  0x3d, 0x22, 0x6c, 0x6f, 0x6f, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x74, 0x62,
+  0x65, 0x6e, 0x65, 0x66, 0x69, 0x63, 0x69, 0x61, 0x6c, 0x61, 0x72, 0x65, 0x20,
+  0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,
+  0x69, 0x6e, 0x67, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x6c, 0x79,
+  0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x72, 0x6e, 0x77, 0x6f, 0x72,
+  0x6b, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65,
+  0x64, 0x20, 0x74, 0x6f, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x69, 0x6e, 0x6e, 0x6f, 0x76, 0x61, 0x74, 0x69, 0x76, 0x65, 0x3c, 0x2f,
+  0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x73, 0x6f, 0x75, 0x6e, 0x64,
+  0x74, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x6f,
+  0x72, 0x6d, 0x74, 0x65, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x69,
+  0x6e, 0x70, 0x75, 0x74, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6f, 0x70, 0x65, 0x6e,
+  0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63,
+  0x74, 0x65, 0x64, 0x61, 0x64, 0x6f, 0x70, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79,
+  0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x74, 0x68, 0x65,
+  0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x61, 0x6e, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64,
+  0x73, 0x20, 0x6f, 0x66, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x20, 0x6f,
+  0x66, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x69, 0x61, 0x6e, 0x20, 0x76, 0x65,
+  0x72, 0x79, 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x61, 0x75, 0x74, 0x6f, 0x6d,
+  0x6f, 0x74, 0x69, 0x76, 0x65, 0x62, 0x79, 0x20, 0x66, 0x61, 0x72, 0x20, 0x74,
+  0x68, 0x65, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x70,
+  0x75, 0x72, 0x73, 0x75, 0x69, 0x74, 0x20, 0x6f, 0x66, 0x66, 0x6f, 0x6c, 0x6c,
+  0x6f, 0x77, 0x20, 0x74, 0x68, 0x65, 0x62, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x74,
+  0x20, 0x74, 0x6f, 0x69, 0x6e, 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x61, 0x6e, 0x64,
+  0x61, 0x67, 0x72, 0x65, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x61, 0x63, 0x63,
+  0x75, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x66, 0x63, 0x6f, 0x6d, 0x65, 0x73, 0x20,
+  0x66, 0x72, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x69, 0x6e,
+  0x67, 0x64, 0x69, 0x76, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x68, 0x69,
+  0x73, 0x20, 0x6f, 0x72, 0x20, 0x68, 0x65, 0x72, 0x74, 0x72, 0x65, 0x6d, 0x65,
+  0x6e, 0x64, 0x6f, 0x75, 0x73, 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x20,
+  0x6f, 0x66, 0x63, 0x6f, 0x6e, 0x63, 0x65, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x30,
+  0x20, 0x31, 0x65, 0x6d, 0x20, 0x31, 0x65, 0x6d, 0x3b, 0x42, 0x61, 0x73, 0x6b,
+  0x65, 0x74, 0x62, 0x61, 0x6c, 0x6c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x2e,
+  0x63, 0x73, 0x73, 0x61, 0x6e, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x69, 0x65, 0x72,
+  0x65, 0x76, 0x65, 0x6e, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x2f, 0x22, 0x20,
+  0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69,
+  0x6e, 0x64, 0x65, 0x78, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68,
+  0x65, 0x70, 0x69, 0x74, 0x74, 0x73, 0x62, 0x75, 0x72, 0x67, 0x68, 0x63, 0x6f,
+  0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x0d, 0x3c, 0x73, 0x63, 0x72, 0x69,
+  0x70, 0x74, 0x3e, 0x28, 0x66, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x6f,
+  0x75, 0x74, 0x68, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x3c,
+  0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x0d, 0x0a, 0x20, 0x6f, 0x63, 0x63, 0x61,
+  0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65,
+  0x20, 0x69, 0x74, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f,
+  0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x3e, 0x3c, 0x2f,
+  0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
+  0x64, 0x20, 0x62, 0x79, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79,
+  0x2c, 0x20, 0x62, 0x67, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x22, 0x74, 0x61,
+  0x62, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3d, 0x22, 0x64, 0x69, 0x73, 0x61, 0x73,
+  0x74, 0x72, 0x6f, 0x75, 0x73, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63,
+  0x73, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x3e,
+  0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x3c, 0x2f, 0x73, 0x74,
+  0x79, 0x6c, 0x65, 0x3e, 0x0a, 0x3c, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20,
+  0x66, 0x6f, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64,
+  0x2e, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x22, 0x2f, 0x2f, 0x76, 0x69, 0x6f,
+  0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70,
+  0x6f, 0x69, 0x6e, 0x74, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x6c,
+  0x79, 0x69, 0x73, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x72, 0x65,
+  0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x64, 0x20, 0x66, 0x72, 0x6f,
+  0x6d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e,
+  0x64, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x75, 0xc3, 0xaa, 0x73, 0xd7,
+  0xa2, 0xd7, 0x91, 0xd7, 0xa8, 0xd7, 0x99, 0xd7, 0xaa, 0xd9, 0x81, 0xd8, 0xa7,
+  0xd8, 0xb1, 0xd8, 0xb3, 0xdb, 0x8c, 0x64, 0x65, 0x73, 0x61, 0x72, 0x72, 0x6f,
+  0x6c, 0x6c, 0x6f, 0x63, 0x6f, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x72, 0x69, 0x6f,
+  0x65, 0x64, 0x75, 0x63, 0x61, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x73, 0x65, 0x70,
+  0x74, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74,
+  0x72, 0x61, 0x64, 0x6f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x63, 0x69, 0xc3, 0xb3,
+  0x6e, 0x75, 0x62, 0x69, 0x63, 0x61, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x70, 0x75,
+  0x62, 0x6c, 0x69, 0x63, 0x69, 0x64, 0x61, 0x64, 0x72, 0x65, 0x73, 0x70, 0x75,
+  0x65, 0x73, 0x74, 0x61, 0x73, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x61, 0x64,
+  0x6f, 0x73, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x65, 0x72,
+  0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x64, 0x6f, 0x73, 0x61, 0x72, 0x74, 0xc3,
+  0xad, 0x63, 0x75, 0x6c, 0x6f, 0x73, 0x64, 0x69, 0x66, 0x65, 0x72, 0x65, 0x6e,
+  0x74, 0x65, 0x73, 0x73, 0x69, 0x67, 0x75, 0x69, 0x65, 0x6e, 0x74, 0x65, 0x73,
+  0x72, 0x65, 0x70, 0xc3, 0xba, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x69, 0x74,
+  0x75, 0x61, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74,
+  0x65, 0x72, 0x69, 0x6f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x63, 0x69, 0x64, 0x61,
+  0x64, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69, 0x6f, 0x66, 0x6f,
+  0x72, 0x6d, 0x61, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x70, 0x6f, 0x62, 0x6c, 0x61,
+  0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x70, 0x72, 0x65, 0x73, 0x69, 0x64, 0x65, 0x6e,
+  0x74, 0x65, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x69, 0x64, 0x6f, 0x73, 0x61,
+  0x63, 0x63, 0x65, 0x73, 0x6f, 0x72, 0x69, 0x6f, 0x73, 0x74, 0x65, 0x63, 0x68,
+  0x6e, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61,
+  0x6c, 0x65, 0x73, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0xc3, 0xad, 0x61,
+  0x65, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x65, 0x73, 0x64, 0x69, 0x73,
+  0x70, 0x6f, 0x6e, 0x69, 0x62, 0x6c, 0x65, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c,
+  0x69, 0x64, 0x61, 0x64, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x69,
+  0x61, 0x76, 0x61, 0x6c, 0x6c, 0x61, 0x64, 0x6f, 0x6c, 0x69, 0x64, 0x62, 0x69,
+  0x62, 0x6c, 0x69, 0x6f, 0x74, 0x65, 0x63, 0x61, 0x72, 0x65, 0x6c, 0x61, 0x63,
+  0x69, 0x6f, 0x6e, 0x65, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x6e, 0x64, 0x61, 0x72,
+  0x69, 0x6f, 0x70, 0x6f, 0x6c, 0xc3, 0xad, 0x74, 0x69, 0x63, 0x61, 0x73, 0x61,
+  0x6e, 0x74, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x65, 0x73, 0x64, 0x6f, 0x63, 0x75,
+  0x6d, 0x65, 0x6e, 0x74, 0x6f, 0x73, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x61, 0x6c,
+  0x65, 0x7a, 0x61, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x65, 0x73,
+  0x64, 0x69, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x69, 0x61, 0x65, 0x63, 0x6f,
+  0x6e, 0xc3, 0xb3, 0x6d, 0x69, 0x63, 0x61, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70,
+  0x6f, 0x72, 0x74, 0x65, 0x72, 0x6f, 0x64, 0x72, 0xc3, 0xad, 0x67, 0x75, 0x65,
+  0x7a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x72, 0x65, 0x6e,
+  0x63, 0x75, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6e, 0x64, 0x69, 0x73, 0x63, 0x75,
+  0x73, 0x69, 0xc3, 0xb3, 0x6e, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75,
+  0x72, 0x61, 0x66, 0x75, 0x6e, 0x64, 0x61, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x66,
+  0x72, 0x65, 0x63, 0x75, 0x65, 0x6e, 0x74, 0x65, 0x73, 0x70, 0x65, 0x72, 0x6d,
+  0x61, 0x6e, 0x65, 0x6e, 0x74, 0x65, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x6d, 0x65,
+  0x6e, 0x74, 0x65, 0xd0, 0xbc, 0xd0, 0xbe, 0xd0, 0xb6, 0xd0, 0xbd, 0xd0, 0xbe,
+  0xd0, 0xb1, 0xd1, 0x83, 0xd0, 0xb4, 0xd0, 0xb5, 0xd1, 0x82, 0xd0, 0xbc, 0xd0,
+  0xbe, 0xd0, 0xb6, 0xd0, 0xb5, 0xd1, 0x82, 0xd0, 0xb2, 0xd1, 0x80, 0xd0, 0xb5,
+  0xd0, 0xbc, 0xd1, 0x8f, 0xd1, 0x82, 0xd0, 0xb0, 0xd0, 0xba, 0xd0, 0xb6, 0xd0,
+  0xb5, 0xd1, 0x87, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xb1, 0xd1, 0x8b, 0xd0, 0xb1,
+  0xd0, 0xbe, 0xd0, 0xbb, 0xd0, 0xb5, 0xd0, 0xb5, 0xd0, 0xbe, 0xd1, 0x87, 0xd0,
+  0xb5, 0xd0, 0xbd, 0xd1, 0x8c, 0xd1, 0x8d, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xb3,
+  0xd0, 0xbe, 0xd0, 0xba, 0xd0, 0xbe, 0xd0, 0xb3, 0xd0, 0xb4, 0xd0, 0xb0, 0xd0,
+  0xbf, 0xd0, 0xbe, 0xd1, 0x81, 0xd0, 0xbb, 0xd0, 0xb5, 0xd0, 0xb2, 0xd1, 0x81,
+  0xd0, 0xb5, 0xd0, 0xb3, 0xd0, 0xbe, 0xd1, 0x81, 0xd0, 0xb0, 0xd0, 0xb9, 0xd1,
+  0x82, 0xd0, 0xb5, 0xd1, 0x87, 0xd0, 0xb5, 0xd1, 0x80, 0xd0, 0xb5, 0xd0, 0xb7,
+  0xd0, 0xbc, 0xd0, 0xbe, 0xd0, 0xb3, 0xd1, 0x83, 0xd1, 0x82, 0xd1, 0x81, 0xd0,
+  0xb0, 0xd0, 0xb9, 0xd1, 0x82, 0xd0, 0xb0, 0xd0, 0xb6, 0xd0, 0xb8, 0xd0, 0xb7,
+  0xd0, 0xbd, 0xd0, 0xb8, 0xd0, 0xbc, 0xd0, 0xb5, 0xd0, 0xb6, 0xd0, 0xb4, 0xd1,
+  0x83, 0xd0, 0xb1, 0xd1, 0x83, 0xd0, 0xb4, 0xd1, 0x83, 0xd1, 0x82, 0xd0, 0x9f,
+  0xd0, 0xbe, 0xd0, 0xb8, 0xd1, 0x81, 0xd0, 0xba, 0xd0, 0xb7, 0xd0, 0xb4, 0xd0,
+  0xb5, 0xd1, 0x81, 0xd1, 0x8c, 0xd0, 0xb2, 0xd0, 0xb8, 0xd0, 0xb4, 0xd0, 0xb5,
+  0xd0, 0xbe, 0xd1, 0x81, 0xd0, 0xb2, 0xd1, 0x8f, 0xd0, 0xb7, 0xd0, 0xb8, 0xd0,
+  0xbd, 0xd1, 0x83, 0xd0, 0xb6, 0xd0, 0xbd, 0xd0, 0xbe, 0xd1, 0x81, 0xd0, 0xb2,
+  0xd0, 0xbe, 0xd0, 0xb5, 0xd0, 0xb9, 0xd0, 0xbb, 0xd1, 0x8e, 0xd0, 0xb4, 0xd0,
+  0xb5, 0xd0, 0xb9, 0xd0, 0xbf, 0xd0, 0xbe, 0xd1, 0x80, 0xd0, 0xbd, 0xd0, 0xbe,
+  0xd0, 0xbc, 0xd0, 0xbd, 0xd0, 0xbe, 0xd0, 0xb3, 0xd0, 0xbe, 0xd0, 0xb4, 0xd0,
+  0xb5, 0xd1, 0x82, 0xd0, 0xb5, 0xd0, 0xb9, 0xd1, 0x81, 0xd0, 0xb2, 0xd0, 0xbe,
+  0xd0, 0xb8, 0xd1, 0x85, 0xd0, 0xbf, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xb2, 0xd0,
+  0xb0, 0xd1, 0x82, 0xd0, 0xb0, 0xd0, 0xba, 0xd0, 0xbe, 0xd0, 0xb9, 0xd0, 0xbc,
+  0xd0, 0xb5, 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xb8, 0xd0, 0xbc, 0xd0,
+  0xb5, 0xd0, 0xb5, 0xd1, 0x82, 0xd0, 0xb6, 0xd0, 0xb8, 0xd0, 0xb7, 0xd0, 0xbd,
+  0xd1, 0x8c, 0xd0, 0xbe, 0xd0, 0xb4, 0xd0, 0xbd, 0xd0, 0xbe, 0xd0, 0xb9, 0xd0,
+  0xbb, 0xd1, 0x83, 0xd1, 0x87, 0xd1, 0x88, 0xd0, 0xb5, 0xd0, 0xbf, 0xd0, 0xb5,
+  0xd1, 0x80, 0xd0, 0xb5, 0xd0, 0xb4, 0xd1, 0x87, 0xd0, 0xb0, 0xd1, 0x81, 0xd1,
+  0x82, 0xd0, 0xb8, 0xd1, 0x87, 0xd0, 0xb0, 0xd1, 0x81, 0xd1, 0x82, 0xd1, 0x8c,
+  0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xb1, 0xd0, 0xbe, 0xd1, 0x82, 0xd0, 0xbd, 0xd0,
+  0xbe, 0xd0, 0xb2, 0xd1, 0x8b, 0xd1, 0x85, 0xd0, 0xbf, 0xd1, 0x80, 0xd0, 0xb0,
+  0xd0, 0xb2, 0xd0, 0xbe, 0xd1, 0x81, 0xd0, 0xbe, 0xd0, 0xb1, 0xd0, 0xbe, 0xd0,
+  0xb9, 0xd0, 0xbf, 0xd0, 0xbe, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xbc, 0xd0, 0xbc,
+  0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xb5, 0xd0, 0xb5, 0xd1, 0x87, 0xd0, 0xb8, 0xd1,
+  0x81, 0xd0, 0xbb, 0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xbe, 0xd0, 0xb2, 0xd1, 0x8b,
+  0xd0, 0xb5, 0xd1, 0x83, 0xd1, 0x81, 0xd0, 0xbb, 0xd1, 0x83, 0xd0, 0xb3, 0xd0,
+  0xbe, 0xd0, 0xba, 0xd0, 0xbe, 0xd0, 0xbb, 0xd0, 0xbe, 0xd0, 0xbd, 0xd0, 0xb0,
+  0xd0, 0xb7, 0xd0, 0xb0, 0xd0, 0xb4, 0xd1, 0x82, 0xd0, 0xb0, 0xd0, 0xba, 0xd0,
+  0xbe, 0xd0, 0xb5, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xb3, 0xd0, 0xb4, 0xd0, 0xb0,
+  0xd0, 0xbf, 0xd0, 0xbe, 0xd1, 0x87, 0xd1, 0x82, 0xd0, 0xb8, 0xd0, 0x9f, 0xd0,
+  0xbe, 0xd1, 0x81, 0xd0, 0xbb, 0xd0, 0xb5, 0xd1, 0x82, 0xd0, 0xb0, 0xd0, 0xba,
+  0xd0, 0xb8, 0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xbe, 0xd0, 0xb2, 0xd1, 0x8b, 0xd0,
+  0xb9, 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xb8, 0xd1, 0x82, 0xd1, 0x82,
+  0xd0, 0xb0, 0xd0, 0xba, 0xd0, 0xb8, 0xd1, 0x85, 0xd1, 0x81, 0xd1, 0x80, 0xd0,
+  0xb0, 0xd0, 0xb7, 0xd1, 0x83, 0xd0, 0xa1, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xba,
+  0xd1, 0x82, 0xd1, 0x84, 0xd0, 0xbe, 0xd1, 0x80, 0xd1, 0x83, 0xd0, 0xbc, 0xd0,
+  0x9a, 0xd0, 0xbe, 0xd0, 0xb3, 0xd0, 0xb4, 0xd0, 0xb0, 0xd0, 0xba, 0xd0, 0xbd,
+  0xd0, 0xb8, 0xd0, 0xb3, 0xd0, 0xb8, 0xd1, 0x81, 0xd0, 0xbb, 0xd0, 0xbe, 0xd0,
+  0xb2, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xb0, 0xd1, 0x88, 0xd0, 0xb5, 0xd0, 0xb9,
+  0xd0, 0xbd, 0xd0, 0xb0, 0xd0, 0xb9, 0xd1, 0x82, 0xd0, 0xb8, 0xd1, 0x81, 0xd0,
+  0xb2, 0xd0, 0xbe, 0xd0, 0xb8, 0xd0, 0xbc, 0xd1, 0x81, 0xd0, 0xb2, 0xd1, 0x8f,
+  0xd0, 0xb7, 0xd1, 0x8c, 0xd0, 0xbb, 0xd1, 0x8e, 0xd0, 0xb1, 0xd0, 0xbe, 0xd0,
+  0xb9, 0xd1, 0x87, 0xd0, 0xb0, 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xbe, 0xd1, 0x81,
+  0xd1, 0x80, 0xd0, 0xb5, 0xd0, 0xb4, 0xd0, 0xb8, 0xd0, 0x9a, 0xd1, 0x80, 0xd0,
+  0xbe, 0xd0, 0xbc, 0xd0, 0xb5, 0xd0, 0xa4, 0xd0, 0xbe, 0xd1, 0x80, 0xd1, 0x83,
+  0xd0, 0xbc, 0xd1, 0x80, 0xd1, 0x8b, 0xd0, 0xbd, 0xd0, 0xba, 0xd0, 0xb5, 0xd1,
+  0x81, 0xd1, 0x82, 0xd0, 0xb0, 0xd0, 0xbb, 0xd0, 0xb8, 0xd0, 0xbf, 0xd0, 0xbe,
+  0xd0, 0xb8, 0xd1, 0x81, 0xd0, 0xba, 0xd1, 0x82, 0xd1, 0x8b, 0xd1, 0x81, 0xd1,
+  0x8f, 0xd1, 0x87, 0xd0, 0xbc, 0xd0, 0xb5, 0xd1, 0x81, 0xd1, 0x8f, 0xd1, 0x86,
+  0xd1, 0x86, 0xd0, 0xb5, 0xd0, 0xbd, 0xd1, 0x82, 0xd1, 0x80, 0xd1, 0x82, 0xd1,
+  0x80, 0xd1, 0x83, 0xd0, 0xb4, 0xd0, 0xb0, 0xd1, 0x81, 0xd0, 0xb0, 0xd0, 0xbc,
+  0xd1, 0x8b, 0xd1, 0x85, 0xd1, 0x80, 0xd1, 0x8b, 0xd0, 0xbd, 0xd0, 0xba, 0xd0,
+  0xb0, 0xd0, 0x9d, 0xd0, 0xbe, 0xd0, 0xb2, 0xd1, 0x8b, 0xd0, 0xb9, 0xd1, 0x87,
+  0xd0, 0xb0, 0xd1, 0x81, 0xd0, 0xbe, 0xd0, 0xb2, 0xd0, 0xbc, 0xd0, 0xb5, 0xd1,
+  0x81, 0xd1, 0x82, 0xd0, 0xb0, 0xd1, 0x84, 0xd0, 0xb8, 0xd0, 0xbb, 0xd1, 0x8c,
+  0xd0, 0xbc, 0xd0, 0xbc, 0xd0, 0xb0, 0xd1, 0x80, 0xd1, 0x82, 0xd0, 0xb0, 0xd1,
+  0x81, 0xd1, 0x82, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xbc, 0xd0, 0xb5,
+  0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb5, 0xd1, 0x82, 0xd0, 0xb5, 0xd0, 0xba, 0xd1,
+  0x81, 0xd1, 0x82, 0xd0, 0xbd, 0xd0, 0xb0, 0xd1, 0x88, 0xd0, 0xb8, 0xd1, 0x85,
+  0xd0, 0xbc, 0xd0, 0xb8, 0xd0, 0xbd, 0xd1, 0x83, 0xd1, 0x82, 0xd0, 0xb8, 0xd0,
+  0xbc, 0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xb8, 0xd0, 0xb8, 0xd0, 0xbc, 0xd0, 0xb5,
+  0xd1, 0x8e, 0xd1, 0x82, 0xd0, 0xbd, 0xd0, 0xbe, 0xd0, 0xbc, 0xd0, 0xb5, 0xd1,
+  0x80, 0xd0, 0xb3, 0xd0, 0xbe, 0xd1, 0x80, 0xd0, 0xbe, 0xd0, 0xb4, 0xd1, 0x81,
+  0xd0, 0xb0, 0xd0, 0xbc, 0xd0, 0xbe, 0xd0, 0xbc, 0xd1, 0x8d, 0xd1, 0x82, 0xd0,
+  0xbe, 0xd0, 0xbc, 0xd1, 0x83, 0xd0, 0xba, 0xd0, 0xbe, 0xd0, 0xbd, 0xd1, 0x86,
+  0xd0, 0xb5, 0xd1, 0x81, 0xd0, 0xb2, 0xd0, 0xbe, 0xd0, 0xb5, 0xd0, 0xbc, 0xd0,
+  0xba, 0xd0, 0xb0, 0xd0, 0xba, 0xd0, 0xbe, 0xd0, 0xb9, 0xd0, 0x90, 0xd1, 0x80,
+  0xd1, 0x85, 0xd0, 0xb8, 0xd0, 0xb2, 0xd9, 0x85, 0xd9, 0x86, 0xd8, 0xaa, 0xd8,
+  0xaf, 0xd9, 0x89, 0xd8, 0xa5, 0xd8, 0xb1, 0xd8, 0xb3, 0xd8, 0xa7, 0xd9, 0x84,
+  0xd8, 0xb1, 0xd8, 0xb3, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9,
+  0x84, 0xd8, 0xb9, 0xd8, 0xa7, 0xd9, 0x85, 0xd9, 0x83, 0xd8, 0xaa, 0xd8, 0xa8,
+  0xd9, 0x87, 0xd8, 0xa7, 0xd8, 0xa8, 0xd8, 0xb1, 0xd8, 0xa7, 0xd9, 0x85, 0xd8,
+  0xac, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x8a, 0xd9, 0x88, 0xd9, 0x85, 0xd8, 0xa7,
+  0xd9, 0x84, 0xd8, 0xb5, 0xd9, 0x88, 0xd8, 0xb1, 0xd8, 0xac, 0xd8, 0xaf, 0xd9,
+  0x8a, 0xd8, 0xaf, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb9, 0xd8, 0xb6,
+  0xd9, 0x88, 0xd8, 0xa5, 0xd8, 0xb6, 0xd8, 0xa7, 0xd9, 0x81, 0xd8, 0xa9, 0xd8,
+  0xa7, 0xd9, 0x84, 0xd9, 0x82, 0xd8, 0xb3, 0xd9, 0x85, 0xd8, 0xa7, 0xd9, 0x84,
+  0xd8, 0xb9, 0xd8, 0xa7, 0xd8, 0xa8, 0xd8, 0xaa, 0xd8, 0xad, 0xd9, 0x85, 0xd9,
+  0x8a, 0xd9, 0x84, 0xd9, 0x85, 0xd9, 0x84, 0xd9, 0x81, 0xd8, 0xa7, 0xd8, 0xaa,
+  0xd9, 0x85, 0xd9, 0x84, 0xd8, 0xaa, 0xd9, 0x82, 0xd9, 0x89, 0xd8, 0xaa, 0xd8,
+  0xb9, 0xd8, 0xaf, 0xd9, 0x8a, 0xd9, 0x84, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb4,
+  0xd8, 0xb9, 0xd8, 0xb1, 0xd8, 0xa3, 0xd8, 0xae, 0xd8, 0xa8, 0xd8, 0xa7, 0xd8,
+  0xb1, 0xd8, 0xaa, 0xd8, 0xb7, 0xd9, 0x88, 0xd9, 0x8a, 0xd8, 0xb1, 0xd8, 0xb9,
+  0xd9, 0x84, 0xd9, 0x8a, 0xd9, 0x83, 0xd9, 0x85, 0xd8, 0xa5, 0xd8, 0xb1, 0xd9,
+  0x81, 0xd8, 0xa7, 0xd9, 0x82, 0xd8, 0xb7, 0xd9, 0x84, 0xd8, 0xa8, 0xd8, 0xa7,
+  0xd8, 0xaa, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x84, 0xd8, 0xba, 0xd8, 0xa9, 0xd8,
+  0xaa, 0xd8, 0xb1, 0xd8, 0xaa, 0xd9, 0x8a, 0xd8, 0xa8, 0xd8, 0xa7, 0xd9, 0x84,
+  0xd9, 0x86, 0xd8, 0xa7, 0xd8, 0xb3, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb4, 0xd9,
+  0x8a, 0xd8, 0xae, 0xd9, 0x85, 0xd9, 0x86, 0xd8, 0xaa, 0xd8, 0xaf, 0xd9, 0x8a,
+  0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb9, 0xd8, 0xb1, 0xd8, 0xa8, 0xd8, 0xa7, 0xd9,
+  0x84, 0xd9, 0x82, 0xd8, 0xb5, 0xd8, 0xb5, 0xd8, 0xa7, 0xd9, 0x81, 0xd9, 0x84,
+  0xd8, 0xa7, 0xd9, 0x85, 0xd8, 0xb9, 0xd9, 0x84, 0xd9, 0x8a, 0xd9, 0x87, 0xd8,
+  0xa7, 0xd8, 0xaa, 0xd8, 0xad, 0xd8, 0xaf, 0xd9, 0x8a, 0xd8, 0xab, 0xd8, 0xa7,
+  0xd9, 0x84, 0xd9, 0x84, 0xd9, 0x87, 0xd9, 0x85, 0xd8, 0xa7, 0xd9, 0x84, 0xd8,
+  0xb9, 0xd9, 0x85, 0xd9, 0x84, 0xd9, 0x85, 0xd9, 0x83, 0xd8, 0xaa, 0xd8, 0xa8,
+  0xd8, 0xa9, 0xd9, 0x8a, 0xd9, 0x85, 0xd9, 0x83, 0xd9, 0x86, 0xd9, 0x83, 0xd8,
+  0xa7, 0xd9, 0x84, 0xd8, 0xb7, 0xd9, 0x81, 0xd9, 0x84, 0xd9, 0x81, 0xd9, 0x8a,
+  0xd8, 0xaf, 0xd9, 0x8a, 0xd9, 0x88, 0xd8, 0xa5, 0xd8, 0xaf, 0xd8, 0xa7, 0xd8,
+  0xb1, 0xd8, 0xa9, 0xd8, 0xaa, 0xd8, 0xa7, 0xd8, 0xb1, 0xd9, 0x8a, 0xd8, 0xae,
+  0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb5, 0xd8, 0xad, 0xd8, 0xa9, 0xd8, 0xaa, 0xd8,
+  0xb3, 0xd8, 0xac, 0xd9, 0x8a, 0xd9, 0x84, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x88,
+  0xd9, 0x82, 0xd8, 0xaa, 0xd8, 0xb9, 0xd9, 0x86, 0xd8, 0xaf, 0xd9, 0x85, 0xd8,
+  0xa7, 0xd9, 0x85, 0xd8, 0xaf, 0xd9, 0x8a, 0xd9, 0x86, 0xd8, 0xa9, 0xd8, 0xaa,
+  0xd8, 0xb5, 0xd9, 0x85, 0xd9, 0x8a, 0xd9, 0x85, 0xd8, 0xa3, 0xd8, 0xb1, 0xd8,
+  0xb4, 0xd9, 0x8a, 0xd9, 0x81, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb0, 0xd9, 0x8a,
+  0xd9, 0x86, 0xd8, 0xb9, 0xd8, 0xb1, 0xd8, 0xa8, 0xd9, 0x8a, 0xd8, 0xa9, 0xd8,
+  0xa8, 0xd9, 0x88, 0xd8, 0xa7, 0xd8, 0xa8, 0xd8, 0xa9, 0xd8, 0xa3, 0xd9, 0x84,
+  0xd8, 0xb9, 0xd8, 0xa7, 0xd8, 0xa8, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb3, 0xd9,
+  0x81, 0xd8, 0xb1, 0xd9, 0x85, 0xd8, 0xb4, 0xd8, 0xa7, 0xd9, 0x83, 0xd9, 0x84,
+  0xd8, 0xaa, 0xd8, 0xb9, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x89, 0xd8, 0xa7, 0xd9,
+  0x84, 0xd8, 0xa3, 0xd9, 0x88, 0xd9, 0x84, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb3,
+  0xd9, 0x86, 0xd8, 0xa9, 0xd8, 0xac, 0xd8, 0xa7, 0xd9, 0x85, 0xd8, 0xb9, 0xd8,
+  0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb5, 0xd8, 0xad, 0xd9, 0x81, 0xd8, 0xa7,
+  0xd9, 0x84, 0xd8, 0xaf, 0xd9, 0x8a, 0xd9, 0x86, 0xd9, 0x83, 0xd9, 0x84, 0xd9,
+  0x85, 0xd8, 0xa7, 0xd8, 0xaa, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xae, 0xd8, 0xa7,
+  0xd8, 0xb5, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd9, 0x84, 0xd9, 0x81, 0xd8,
+  0xa3, 0xd8, 0xb9, 0xd8, 0xb6, 0xd8, 0xa7, 0xd8, 0xa1, 0xd9, 0x83, 0xd8, 0xaa,
+  0xd8, 0xa7, 0xd8, 0xa8, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xae, 0xd9,
+  0x8a, 0xd8, 0xb1, 0xd8, 0xb1, 0xd8, 0xb3, 0xd8, 0xa7, 0xd8, 0xa6, 0xd9, 0x84,
+  0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x82, 0xd9, 0x84, 0xd8, 0xa8, 0xd8, 0xa7, 0xd9,
+  0x84, 0xd8, 0xa3, 0xd8, 0xaf, 0xd8, 0xa8, 0xd9, 0x85, 0xd9, 0x82, 0xd8, 0xa7,
+  0xd8, 0xb7, 0xd8, 0xb9, 0xd9, 0x85, 0xd8, 0xb1, 0xd8, 0xa7, 0xd8, 0xb3, 0xd9,
+  0x84, 0xd9, 0x85, 0xd9, 0x86, 0xd8, 0xb7, 0xd9, 0x82, 0xd8, 0xa9, 0xd8, 0xa7,
+  0xd9, 0x84, 0xd9, 0x83, 0xd8, 0xaa, 0xd8, 0xa8, 0xd8, 0xa7, 0xd9, 0x84, 0xd8,
+  0xb1, 0xd8, 0xac, 0xd9, 0x84, 0xd8, 0xa7, 0xd8, 0xb4, 0xd8, 0xaa, 0xd8, 0xb1,
+  0xd9, 0x83, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x82, 0xd8, 0xaf, 0xd9, 0x85, 0xd9,
+  0x8a, 0xd8, 0xb9, 0xd8, 0xb7, 0xd9, 0x8a, 0xd9, 0x83, 0x73, 0x42, 0x79, 0x54,
+  0x61, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x2e, 0x6a, 0x70, 0x67, 0x22, 0x20,
+  0x61, 0x6c, 0x74, 0x3d, 0x22, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69,
+  0x64, 0x20, 0x23, 0x2e, 0x67, 0x69, 0x66, 0x22, 0x20, 0x61, 0x6c, 0x74, 0x3d,
+  0x22, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x69,
+  0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x70, 0x70,
+  0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6f, 0x6e, 0x63,
+  0x6c, 0x69, 0x63, 0x6b, 0x3d, 0x22, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69,
+  0x73, 0x68, 0x65, 0x64, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x69,
+  0x6e, 0x67, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x20, 0x61, 0x6c, 0x74, 0x3d, 0x22,
+  0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x70, 0x65,
+  0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x61, 0x70, 0x70, 0x72,
+  0x6f, 0x70, 0x72, 0x69, 0x61, 0x74, 0x65, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x6d,
+  0x64, 0x61, 0x73, 0x68, 0x3b, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74,
+  0x65, 0x6c, 0x79, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x3e, 0x3c,
+  0x2f, 0x72, 0x61, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x74,
+  0x65, 0x6d, 0x70, 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x64, 0x65, 0x76,
+  0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x63, 0x6f, 0x6d, 0x70, 0x65,
+  0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f,
+  0x6c, 0x64, 0x65, 0x72, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74,
+  0x79, 0x3a, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e,
+  0x30, 0x22, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x22, 0x65, 0x76,
+  0x65, 0x6e, 0x20, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x72, 0x65, 0x70, 0x6c,
+  0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74,
+  0x69, 0x6f, 0x6e, 0x3c, 0x75, 0x6c, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d,
+  0x22, 0x41, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x69,
+  0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x73, 0x70, 0x65, 0x72,
+  0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x73, 0x65, 0x74, 0x54, 0x69,
+  0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, 0x75, 0x72, 0x6c, 0x28, 0x68, 0x74, 0x74,
+  0x70, 0x3a, 0x2f, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x65, 0x6d, 0x61, 0x74, 0x69,
+  0x63, 0x73, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x70, 0x3a,
+  0x65, 0x76, 0x65, 0x6e, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x64, 0x65,
+  0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x20, 0x6e, 0x6f,
+  0x2d, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63,
+  0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4a, 0x50, 0x47, 0x7c, 0x74, 0x68, 0x75,
+  0x6d, 0x62, 0x7c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74,
+  0x65, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x66,
+  0x6c, 0x6f, 0x61, 0x74, 0x3a, 0x6c, 0x65, 0x66, 0x74, 0x3b, 0x3c, 0x6c, 0x69,
+  0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x68, 0x75, 0x6e, 0x64, 0x72,
+  0x65, 0x64, 0x73, 0x20, 0x6f, 0x66, 0x0a, 0x0a, 0x48, 0x6f, 0x77, 0x65, 0x76,
+  0x65, 0x72, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69,
+  0x6f, 0x6e, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x3a, 0x62, 0x6f, 0x74, 0x68, 0x3b,
+  0x63, 0x6f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x77, 0x69,
+  0x74, 0x68, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x62, 0x65,
+  0x6c, 0x20, 0x66, 0x6f, 0x72, 0x3d, 0x22, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72,
+  0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c,
+  0x61, 0x6e, 0x64, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65,
+  0x64, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x79, 0x69,
+  0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x26, 0x6c, 0x74,
+  0x3b, 0x73, 0x75, 0x70, 0x26, 0x67, 0x74, 0x3b, 0x63, 0x6f, 0x6e, 0x74, 0x72,
+  0x6f, 0x76, 0x65, 0x72, 0x73, 0x79, 0x4e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6c,
+  0x61, 0x6e, 0x64, 0x73, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69,
+  0x76, 0x65, 0x6d, 0x61, 0x78, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3d, 0x22,
+  0x73, 0x77, 0x69, 0x74, 0x7a, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x44, 0x65,
+  0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x73, 0x73, 0x65,
+  0x6e, 0x74, 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x0a, 0x0a, 0x41, 0x6c, 0x74, 0x68,
+  0x6f, 0x75, 0x67, 0x68, 0x20, 0x3c, 0x2f, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72,
+  0x65, 0x61, 0x3e, 0x74, 0x68, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x62, 0x69, 0x72,
+  0x64, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x26,
+  0x61, 0x6d, 0x70, 0x3b, 0x6e, 0x64, 0x61, 0x73, 0x68, 0x3b, 0x73, 0x70, 0x65,
+  0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x75,
+  0x6e, 0x69, 0x74, 0x69, 0x65, 0x73, 0x6c, 0x65, 0x67, 0x69, 0x73, 0x6c, 0x61,
+  0x74, 0x69, 0x6f, 0x6e, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x6f, 0x6e, 0x69,
+  0x63, 0x73, 0x0a, 0x09, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22,
+  0x69, 0x6c, 0x6c, 0x75, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x64, 0x65, 0x6e,
+  0x67, 0x69, 0x6e, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x74, 0x65, 0x72, 0x72,
+  0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72,
+  0x69, 0x74, 0x69, 0x65, 0x73, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75,
+  0x74, 0x65, 0x64, 0x36, 0x22, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d,
+  0x22, 0x73, 0x61, 0x6e, 0x73, 0x2d, 0x73, 0x65, 0x72, 0x69, 0x66, 0x3b, 0x63,
+  0x61, 0x70, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x73,
+  0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x65, 0x64, 0x69, 0x6e, 0x74, 0x65, 0x72,
+  0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x6f, 0x6f, 0x6b, 0x69, 0x6e, 0x67,
+  0x20, 0x66, 0x6f, 0x72, 0x69, 0x74, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
+  0x62, 0x65, 0x41, 0x66, 0x67, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x74, 0x61, 0x6e,
+  0x77, 0x61, 0x73, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x61,
+  0x74, 0x68, 0x2e, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x73, 0x75, 0x72, 0x72,
+  0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x63, 0x61, 0x6e, 0x20, 0x61, 0x6c,
+  0x73, 0x6f, 0x20, 0x62, 0x65, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74,
+  0x69, 0x6f, 0x6e, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x63,
+  0x65, 0x65, 0x6e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x64, 0x3c,
+  0x68, 0x32, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6d, 0x6f, 0x72,
+  0x65, 0x20, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x20, 0x68, 0x61,
+  0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x69, 0x6e, 0x76, 0x61, 0x73, 0x69, 0x6f,
+  0x6e, 0x20, 0x6f, 0x66, 0x29, 0x2e, 0x67, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65,
+  0x28, 0x29, 0x66, 0x75, 0x6e, 0x64, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c,
+  0x44, 0x65, 0x73, 0x70, 0x69, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x22, 0x3e,
+  0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x69, 0x6e, 0x73, 0x70,
+  0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x65, 0x78, 0x61, 0x6d, 0x69, 0x6e,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74,
+  0x69, 0x6f, 0x6e, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x6e, 0x61, 0x74, 0x69, 0x6f,
+  0x6e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x3c,
+  0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x76, 0x65, 0x72,
+  0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x69, 0x6e, 0x73, 0x74, 0x72,
+  0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x20, 0x3d, 0x20, 0x27, 0x68, 0x74, 0x74, 0x70, 0x3a,
+  0x2f, 0x2f, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+  0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x20, 0x2e, 0x73,
+  0x75, 0x62, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x65, 0x61, 0x63, 0x68,
+  0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69,
+  0x6d, 0x65, 0x6e, 0x74, 0x73, 0x69, 0x6e, 0x66, 0x6c, 0x75, 0x65, 0x6e, 0x74,
+  0x69, 0x61, 0x6c, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f,
+  0x6e, 0x6d, 0x61, 0x6e, 0x79, 0x20, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x64,
+  0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d,
+  0x62, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x6f, 0x20, 0x6e, 0x6f,
+  0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x4d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x20,
+  0x45, 0x61, 0x73, 0x74, 0x3c, 0x6e, 0x6f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+  0x3e, 0x3c, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, 0x20,
+  0x70, 0x65, 0x72, 0x68, 0x61, 0x70, 0x73, 0x20, 0x74, 0x68, 0x65, 0x69, 0x6e,
+  0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x20, 0x44,
+  0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x61, 0x72, 0x72, 0x61, 0x6e, 0x67,
+  0x65, 0x6d, 0x65, 0x6e, 0x74, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x66, 0x61, 0x6d,
+  0x6f, 0x75, 0x73, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x6c, 0x69, 0x74,
+  0x79, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x6c,
+  0x69, 0x6d, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x65, 0x78, 0x63,
+  0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x73, 0x6f, 0x76, 0x65, 0x72,
+  0x65, 0x69, 0x67, 0x6e, 0x74, 0x79, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+  0x74, 0x22, 0x3e, 0x0a, 0x3c, 0x74, 0x64, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+  0x3d, 0x22, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64,
+  0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x20, 0x74, 0x6f, 0x64, 0x6f,
+  0x63, 0x74, 0x72, 0x69, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x6f, 0x63, 0x63, 0x75,
+  0x70, 0x69, 0x65, 0x64, 0x20, 0x62, 0x79, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e,
+  0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x52, 0x65, 0x6e, 0x61, 0x69, 0x73, 0x73, 0x61,
+  0x6e, 0x63, 0x65, 0x61, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f,
+  0x66, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x65,
+  0x78, 0x70, 0x6c, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x72, 0x65, 0x63,
+  0x6f, 0x67, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x70, 0x72, 0x65, 0x64, 0x65,
+  0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, 0x72,
+  0x63, 0x3d, 0x22, 0x2f, 0x3c, 0x68, 0x31, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+  0x3d, 0x22, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+  0x6d, 0x61, 0x79, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x62, 0x65, 0x73, 0x70,
+  0x65, 0x63, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x3c, 0x2f, 0x66, 0x69,
+  0x65, 0x6c, 0x64, 0x73, 0x65, 0x74, 0x3e, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65,
+  0x73, 0x73, 0x69, 0x76, 0x65, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x6f, 0x6e, 0x73,
+  0x20, 0x6f, 0x66, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61,
+  0x74, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61,
+  0x72, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x6e, 0x65,
+  0x20, 0x61, 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x2e, 0x70, 0x61, 0x72, 0x65,
+  0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x61, 0x67, 0x72, 0x69, 0x63, 0x75, 0x6c,
+  0x74, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69,
+  0x76, 0x65, 0x72, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x73,
+  0x74, 0x6f, 0x77, 0x61, 0x72, 0x64, 0x73, 0x20, 0x74, 0x68, 0x65, 0x4d, 0x6f,
+  0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x61, 0x6e, 0x79,
+  0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x28, 0x65, 0x73, 0x70, 0x65, 0x63,
+  0x69, 0x61, 0x6c, 0x6c, 0x79, 0x3c, 0x74, 0x64, 0x20, 0x77, 0x69, 0x64, 0x74,
+  0x68, 0x3d, 0x22, 0x3b, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x30, 0x30,
+  0x25, 0x69, 0x6e, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x3c,
+  0x68, 0x33, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x20, 0x6f, 0x6e,
+  0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x3d, 0x22, 0x29, 0x2e, 0x61, 0x64, 0x64,
+  0x43, 0x6c, 0x61, 0x73, 0x73, 0x28, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63,
+  0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x64, 0x61, 0x75, 0x67, 0x68, 0x74, 0x65, 0x72, 0x20, 0x6f, 0x66,
+  0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x62, 0x72,
+  0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x0d, 0x0a, 0x3c, 0x64,
+  0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61,
+  0x72, 0x67, 0x65, 0x73, 0x74, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74,
+  0x69, 0x6f, 0x6e, 0x72, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+  0x73, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x74,
+  0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x6f, 0x63,
+  0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x20, 0x6f, 0x72,
+  0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x22, 0x3e, 0x0a, 0x3c, 0x68, 0x65, 0x61,
+  0x64, 0x3e, 0x0a, 0x3c, 0x22, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d,
+  0x22, 0x31, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x3b,
+  0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x69, 0x6d, 0x70, 0x6c,
+  0x65, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65,
+  0x20, 0x73, 0x65, 0x65, 0x6e, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61,
+  0x73, 0x20, 0x61, 0x64, 0x65, 0x6d, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x74,
+  0x65, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x22, 0x3e, 0x63,
+  0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x74, 0x68, 0x65,
+  0x20, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x77, 0x61, 0x73, 0x20, 0x77,
+  0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x21, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74,
+  0x61, 0x6e, 0x74, 0x3b, 0x70, 0x78, 0x3b, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69,
+  0x6e, 0x2d, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x62, 0x79,
+  0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f,
+  0x6d, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x64, 0x75, 0x72, 0x69,
+  0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6d, 0x6d, 0x69, 0x67, 0x72,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x63, 0x61, 0x6c,
+  0x6c, 0x65, 0x64, 0x3c, 0x68, 0x34, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d,
+  0x22, 0x64, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x72,
+  0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x20, 0x62, 0x79, 0x67, 0x6f, 0x76,
+  0x65, 0x72, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x6c, 0x6f, 0x63, 0x61, 0x74,
+  0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x69, 0x6e, 0x20, 0x4e, 0x6f, 0x76, 0x65,
+  0x6d, 0x62, 0x65, 0x72, 0x77, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74,
+  0x68, 0x65, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e,
+  0x61, 0x63, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x63, 0x61,
+  0x6c, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x65, 0x72, 0x73,
+  0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69,
+  0x7a, 0x65, 0x3a, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x65, 0x64, 0x20, 0x69,
+  0x6e, 0x69, 0x6e, 0x76, 0x65, 0x73, 0x74, 0x69, 0x67, 0x61, 0x74, 0x65, 0x65,
+  0x78, 0x70, 0x65, 0x72, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x6d, 0x6f, 0x73,
+  0x74, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x6c, 0x79, 0x77, 0x69, 0x64, 0x65, 0x6c,
+  0x79, 0x20, 0x75, 0x73, 0x65, 0x64, 0x64, 0x69, 0x73, 0x63, 0x75, 0x73, 0x73,
+  0x69, 0x6f, 0x6e, 0x73, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x20,
+  0x6f, 0x66, 0x20, 0x28, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e,
+  0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x49, 0x74,
+  0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x69, 0x74, 0x20, 0x64,
+  0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61,
+  0x72, 0x79, 0x20, 0x74, 0x6f, 0x69, 0x6e, 0x68, 0x61, 0x62, 0x69, 0x74, 0x61,
+  0x6e, 0x74, 0x73, 0x69, 0x6d, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e,
+  0x74, 0x73, 0x63, 0x68, 0x6f, 0x6c, 0x61, 0x72, 0x73, 0x68, 0x69, 0x70, 0x63,
+  0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x73,
+  0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x20, 0x65,
+  0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20,
+  0x6d, 0x6f, 0x72, 0x65, 0x70, 0x78, 0x3b, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69,
+  0x6e, 0x67, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74,
+  0x61, 0x20, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x61, 0x72,
+  0x65, 0x20, 0x75, 0x73, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x72, 0x6f, 0x6c, 0x65,
+  0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f,
+  0x75, 0x73, 0x6c, 0x79, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69,
+  0x76, 0x65, 0x73, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6f,
+  0x66, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x63,
+  0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, 0x74, 0x61,
+  0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x63, 0x65, 0x72, 0x74, 0x69,
+  0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64,
+  0x69, 0x76, 0x3e, 0x0a, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64,
+  0x3d, 0x22, 0x68, 0x69, 0x67, 0x68, 0x20, 0x73, 0x63, 0x68, 0x6f, 0x6f, 0x6c,
+  0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x74, 0x6f, 0x63, 0x6f,
+  0x6d, 0x66, 0x6f, 0x72, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x61, 0x64, 0x6f, 0x70,
+  0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x74, 0x68, 0x72, 0x65, 0x65, 0x20,
+  0x79, 0x65, 0x61, 0x72, 0x73, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x75, 0x6e,
+  0x74, 0x72, 0x79, 0x69, 0x6e, 0x20, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72,
+  0x79, 0x73, 0x6f, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x70,
+  0x65, 0x6f, 0x70, 0x6c, 0x65, 0x20, 0x77, 0x68, 0x6f, 0x20, 0x70, 0x72, 0x6f,
+  0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x62, 0x79, 0x3c, 0x70, 0x61, 0x72, 0x61,
+  0x6d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65,
+  0x64, 0x20, 0x62, 0x79, 0x69, 0x6e, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20,
+  0x6f, 0x66, 0x61, 0x70, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x6d, 0x65, 0x6e, 0x74,
+  0x49, 0x53, 0x4f, 0x2d, 0x38, 0x38, 0x35, 0x39, 0x2d, 0x31, 0x22, 0x77, 0x61,
+  0x73, 0x20, 0x62, 0x6f, 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x68, 0x69, 0x73, 0x74,
+  0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64,
+  0x65, 0x64, 0x20, 0x61, 0x73, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x6d,
+  0x65, 0x6e, 0x74, 0x69, 0x73, 0x20, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f,
+  0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x3a,
+  0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x69, 0x67,
+  0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x6e, 0x74, 0x63, 0x65, 0x6c, 0x65, 0x62,
+  0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69,
+  0x74, 0x74, 0x65, 0x64, 0x2f, 0x6a, 0x73, 0x2f, 0x6a, 0x71, 0x75, 0x65, 0x72,
+  0x79, 0x2e, 0x69, 0x73, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x61, 0x73,
+  0x74, 0x68, 0x65, 0x6f, 0x72, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x74,
+  0x61, 0x62, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3d, 0x22, 0x69, 0x74, 0x20, 0x63,
+  0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x3c, 0x6e, 0x6f, 0x73, 0x63, 0x72,
+  0x69, 0x70, 0x74, 0x3e, 0x0a, 0x68, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x62,
+  0x65, 0x65, 0x6e, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a,
+  0x3c, 0x20, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x54, 0x68, 0x65, 0x20, 0x63,
+  0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x68, 0x65, 0x20,
+  0x68, 0x61, 0x64, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x64, 0x75,
+  0x63, 0x65, 0x64, 0x20, 0x62, 0x79, 0x70, 0x68, 0x69, 0x6c, 0x6f, 0x73, 0x6f,
+  0x70, 0x68, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74,
+  0x65, 0x64, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f,
+  0x61, 0x6d, 0x6f, 0x6e, 0x67, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x63, 0x6f,
+  0x6d, 0x70, 0x61, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x74, 0x6f, 0x20, 0x73,
+  0x61, 0x79, 0x20, 0x74, 0x68, 0x61, 0x74, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65,
+  0x65, 0x72, 0x69, 0x6e, 0x67, 0x61, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72,
+  0x65, 0x6e, 0x74, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x20, 0x74,
+  0x6f, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x62,
+  0x65, 0x6c, 0x69, 0x65, 0x66, 0x20, 0x74, 0x68, 0x61, 0x74, 0x70, 0x68, 0x6f,
+  0x74, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x73, 0x69, 0x64, 0x65, 0x6e, 0x74,
+  0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79,
+  0x20, 0x6f, 0x66, 0x20, 0x52, 0x65, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20,
+  0x6f, 0x66, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x73, 0x61, 0x72, 0x69, 0x6c, 0x79,
+  0x70, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x74, 0x65,
+  0x63, 0x68, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x6c, 0x65, 0x61, 0x76,
+  0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, 0x61,
+  0x63, 0x75, 0x6c, 0x61, 0x72, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+  0x20, 0x6f, 0x66, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x69, 0x63, 0x69, 0x74,
+  0x79, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72,
+  0x65, 0x73, 0x74, 0x61, 0x75, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x70, 0x61, 0x72,
+  0x74, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x65, 0x6d, 0x70, 0x68, 0x61,
+  0x73, 0x69, 0x73, 0x20, 0x6f, 0x6e, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x72, 0x65,
+  0x63, 0x65, 0x6e, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x20, 0x77, 0x69, 0x74,
+  0x68, 0x20, 0x73, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x61, 0x74,
+  0x66, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x64, 0x65,
+  0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x69, 0x74, 0x20, 0x69,
+  0x73, 0x20, 0x6f, 0x66, 0x74, 0x65, 0x6e, 0x22, 0x3e, 0x3c, 0x2f, 0x69, 0x66,
+  0x72, 0x61, 0x6d, 0x65, 0x3e, 0x61, 0x73, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f,
+  0x77, 0x73, 0x3a, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74,
+  0x68, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x74, 0x68, 0x65, 0x63,
+  0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x70, 0x6f, 0x69,
+  0x6e, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x6f, 0x70, 0x70, 0x6f, 0x72,
+  0x74, 0x75, 0x6e, 0x69, 0x74, 0x79, 0x76, 0x69, 0x65, 0x77, 0x20, 0x6f, 0x66,
+  0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65,
+  0x6e, 0x74, 0x64, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66,
+  0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x68, 0x65,
+  0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x73, 0x65, 0x74, 0x49,
+  0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x70,
+  0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x69, 0x6e, 0x20, 0x4e, 0x65, 0x77, 0x20, 0x59,
+  0x6f, 0x72, 0x6b, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c,
+  0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x0a,
+  0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x69, 0x6e, 0x63,
+  0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x65, 0x3b, 0x3c, 0x2f, 0x73, 0x63,
+  0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x45,
+  0x76, 0x65, 0x6e, 0x74, 0x62, 0x65, 0x63, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x22, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22, 0x5f,
+  0x63, 0x61, 0x72, 0x72, 0x69, 0x65, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x53, 0x6f,
+  0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x73, 0x63, 0x69, 0x65,
+  0x6e, 0x63, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x74, 0x68, 0x65, 0x20, 0x74, 0x69,
+  0x6d, 0x65, 0x20, 0x6f, 0x66, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65,
+  0x72, 0x22, 0x3e, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e,
+  0x67, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x68, 0x65, 0x72, 0x4d,
+  0x75, 0x63, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x77, 0x72, 0x69,
+  0x74, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x6f, 0x66, 0x22, 0x20, 0x68, 0x65, 0x69,
+  0x67, 0x68, 0x74, 0x3d, 0x22, 0x32, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66,
+  0x20, 0x74, 0x68, 0x65, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f,
+  0x66, 0x20, 0x6d, 0x69, 0x78, 0x74, 0x75, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x20,
+  0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x45, 0x78,
+  0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x65, 0x64, 0x75, 0x63,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x63, 0x6f, 0x6d, 0x70, 0x65, 0x74,
+  0x69, 0x74, 0x69, 0x76, 0x65, 0x20, 0x6f, 0x6e, 0x73, 0x75, 0x62, 0x6d, 0x69,
+  0x74, 0x3d, 0x22, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x6f,
+  0x66, 0x64, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2f,
+  0x44, 0x54, 0x44, 0x20, 0x58, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x72, 0x65, 0x6c,
+  0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x74, 0x65, 0x6e, 0x64, 0x65,
+  0x6e, 0x63, 0x79, 0x20, 0x74, 0x6f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63,
+  0x65, 0x20, 0x6f, 0x66, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x77, 0x6f, 0x75,
+  0x6c, 0x64, 0x64, 0x65, 0x73, 0x70, 0x69, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65,
+  0x73, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x20, 0x6c, 0x65,
+  0x67, 0x69, 0x73, 0x6c, 0x61, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x69, 0x6e, 0x6e,
+  0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x61, 0x6c, 0x6c, 0x65, 0x67, 0x61,
+  0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x67, 0x72, 0x69, 0x63, 0x75, 0x6c, 0x74,
+  0x75, 0x72, 0x65, 0x77, 0x61, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69,
+  0x6e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x61, 0x63, 0x68, 0x20, 0x74, 0x6f, 0x69,
+  0x6e, 0x74, 0x65, 0x6c, 0x6c, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x79, 0x65, 0x61,
+  0x72, 0x73, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x2c, 0x73, 0x61, 0x6e, 0x73,
+  0x2d, 0x73, 0x65, 0x72, 0x69, 0x66, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69,
+  0x6e, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e,
+  0x63, 0x65, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x73,
+  0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x66, 0x6f,
+  0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x61, 0x62, 0x62, 0x72,
+  0x65, 0x76, 0x69, 0x61, 0x74, 0x65, 0x64, 0x68, 0x69, 0x67, 0x68, 0x65, 0x72,
+  0x20, 0x74, 0x68, 0x61, 0x6e, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c,
+  0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x66, 0x73,
+  0x75, 0x70, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x63, 0x6c, 0x61,
+  0x69, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x61, 0x74, 0x74, 0x72, 0x69,
+  0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69,
+  0x7a, 0x65, 0x3a, 0x31, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20,
+  0x6f, 0x66, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x20,
+  0x68, 0x69, 0x73, 0x20, 0x62, 0x72, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x61, 0x74,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x61, 0x6e, 0x6e, 0x69,
+  0x76, 0x65, 0x72, 0x73, 0x61, 0x72, 0x79, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e,
+  0x65, 0x64, 0x20, 0x62, 0x79, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20,
+  0x74, 0x6f, 0x20, 0x75, 0x6c, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x6c, 0x79,
+  0x20, 0x69, 0x6e, 0x6e, 0x6f, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x69,
+  0x74, 0x20, 0x69, 0x73, 0x20, 0x73, 0x74, 0x69, 0x6c, 0x6c, 0x63, 0x61, 0x6e,
+  0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x62, 0x65, 0x64, 0x65, 0x66, 0x69, 0x6e,
+  0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x74, 0x6f, 0x47, 0x4d, 0x54, 0x53, 0x74,
+  0x72, 0x69, 0x6e, 0x67, 0x41, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20,
+  0x6f, 0x66, 0x69, 0x6d, 0x67, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22,
+  0x45, 0x76, 0x65, 0x6e, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x2c, 0x77, 0x61,
+  0x73, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x6f, 0x63, 0x63, 0x75,
+  0x72, 0x72, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x69, 0x67, 0x68, 0x62,
+  0x6f, 0x72, 0x69, 0x6e, 0x67, 0x64, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x75,
+  0x69, 0x73, 0x68, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x68, 0x65, 0x20, 0x77, 0x61,
+  0x73, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x69, 0x6e, 0x67, 0x74,
+  0x65, 0x72, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x61, 0x6c, 0x4d, 0x61, 0x6e,
+  0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x61, 0x72, 0x67, 0x75, 0x65,
+  0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x61, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72,
+  0x69, 0x63, 0x61, 0x6e, 0x63, 0x6f, 0x6e, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20,
+  0x6f, 0x66, 0x77, 0x69, 0x64, 0x65, 0x73, 0x70, 0x72, 0x65, 0x61, 0x64, 0x20,
+  0x77, 0x65, 0x72, 0x65, 0x20, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x73, 0x63,
+  0x72, 0x65, 0x65, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x49, 0x6e, 0x20, 0x6f,
+  0x72, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74,
+  0x65, 0x64, 0x20, 0x74, 0x6f, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x61,
+  0x6e, 0x74, 0x73, 0x61, 0x72, 0x65, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65,
+  0x64, 0x6c, 0x65, 0x67, 0x69, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x67,
+  0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x62, 0x61,
+  0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x6d, 0x6f, 0x73, 0x74, 0x20,
+  0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x79, 0x65, 0x61, 0x72, 0x73, 0x20, 0x61,
+  0x66, 0x74, 0x65, 0x72, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20,
+  0x6e, 0x6f, 0x74, 0x68, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x65, 0x73, 0x74,
+  0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x74, 0x68,
+  0x65, 0x79, 0x20, 0x64, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x67, 0x75,
+  0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x73, 0x68, 0x6f, 0x77, 0x65, 0x64,
+  0x20, 0x74, 0x68, 0x61, 0x74, 0x70, 0x72, 0x65, 0x64, 0x6f, 0x6d, 0x69, 0x6e,
+  0x61, 0x6e, 0x74, 0x74, 0x68, 0x65, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61,
+  0x6c, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x63,
+  0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x68, 0x6f,
+  0x72, 0x74, 0x2d, 0x6c, 0x69, 0x76, 0x65, 0x64, 0x3c, 0x2f, 0x73, 0x70, 0x61,
+  0x6e, 0x3e, 0x3c, 0x2f, 0x61, 0x3e, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20,
+  0x75, 0x73, 0x65, 0x64, 0x76, 0x65, 0x72, 0x79, 0x20, 0x6c, 0x69, 0x74, 0x74,
+  0x6c, 0x65, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x68, 0x61, 0x64, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x69, 0x6e,
+  0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x63, 0x6f, 0x6d, 0x6d,
+  0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, 0x65, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72,
+  0x65, 0x73, 0x20, 0x6f, 0x66, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6d, 0x65,
+  0x6e, 0x74, 0x2c, 0x3c, 0x2f, 0x6e, 0x6f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+  0x3e, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x22,
+  0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x22, 0x33, 0x49, 0x6e, 0x64,
+  0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x70, 0x6f, 0x70, 0x75, 0x6c,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x2d, 0x73,
+  0x63, 0x61, 0x6c, 0x65, 0x2e, 0x20, 0x41, 0x6c, 0x74, 0x68, 0x6f, 0x75, 0x67,
+  0x68, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65,
+  0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x70, 0x6f,
+  0x73, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x73, 0x74, 0x61, 0x72,
+  0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x74, 0x77, 0x6f, 0x20, 0x6f, 0x72,
+  0x20, 0x6d, 0x6f, 0x72, 0x65, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69,
+  0x6f, 0x6e, 0x73, 0x73, 0x75, 0x62, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74,
+  0x65, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x68,
+  0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x3c, 0x2f, 0x6f,
+  0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x0d, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x69,
+  0x6e, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x6e, 0x61,
+  0x74, 0x69, 0x6e, 0x67, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x20,
+  0x62, 0x65, 0x70, 0x72, 0x61, 0x63, 0x74, 0x69, 0x63, 0x65, 0x20, 0x6f, 0x66,
+  0x69, 0x6e, 0x20, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x73, 0x69,
+  0x74, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x65, 0x6e, 0x73, 0x75,
+  0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x74, 0x6f, 0x20, 0x63, 0x72, 0x65,
+  0x61, 0x74, 0x65, 0x20, 0x61, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x73, 0x73, 0x69,
+  0x70, 0x70, 0x69, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x6c,
+  0x79, 0x6f, 0x75, 0x74, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x62,
+  0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x77, 0x68, 0x61,
+  0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x77, 0x73, 0x69, 0x74, 0x75, 0x61,
+  0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6e, 0x61,
+  0x6d, 0x65, 0x3d, 0x22, 0x54, 0x72, 0x61, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e,
+  0x61, 0x6c, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+  0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x68,
+  0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6f, 0x66, 0x61, 0x74, 0x6d, 0x6f,
+  0x73, 0x70, 0x68, 0x65, 0x72, 0x69, 0x63, 0x69, 0x64, 0x65, 0x6f, 0x6c, 0x6f,
+  0x67, 0x69, 0x63, 0x61, 0x6c, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69,
+  0x73, 0x65, 0x73, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6e,
+  0x67, 0x65, 0x61, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72,
+  0x65, 0x6d, 0x6e, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x70, 0x6c, 0x75,
+  0x67, 0x69, 0x6e, 0x73, 0x70, 0x61, 0x67, 0x65, 0x2f, 0x69, 0x6e, 0x64, 0x65,
+  0x78, 0x2e, 0x70, 0x68, 0x70, 0x3f, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x65,
+  0x64, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d,
+  0x65, 0x64, 0x48, 0x65, 0x20, 0x77, 0x61, 0x73, 0x20, 0x61, 0x6c, 0x73, 0x6f,
+  0x77, 0x61, 0x73, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x73, 0x74,
+  0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x20, 0x66,
+  0x61, 0x76, 0x6f, 0x72, 0x20, 0x6f, 0x66, 0x4d, 0x69, 0x6e, 0x69, 0x73, 0x74,
+  0x72, 0x79, 0x20, 0x6f, 0x66, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+  0x20, 0x6f, 0x66, 0x66, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f,
+  0x6e, 0x69, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x3c,
+  0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x54, 0x68, 0x69,
+  0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x61, 0x20, 0x68,
+  0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72,
+  0x69, 0x7a, 0x65, 0x64, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x20,
+  0x69, 0x6e, 0x61, 0x72, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f,
+  0x61, 0x6e, 0x64, 0x20, 0x73, 0x65, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x6d, 0x61,
+  0x64, 0x65, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x65, 0x6d,
+  0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x6c, 0x69, 0x6b, 0x65, 0x6c, 0x79,
+  0x20, 0x74, 0x68, 0x61, 0x74, 0x50, 0x61, 0x6c, 0x65, 0x73, 0x74, 0x69, 0x6e,
+  0x69, 0x61, 0x6e, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x20, 0x61, 0x66, 0x74, 0x65,
+  0x72, 0x69, 0x74, 0x20, 0x68, 0x61, 0x64, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x6d,
+  0x6f, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x74, 0x6f, 0x20,
+  0x72, 0x65, 0x66, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x62, 0x75, 0x74, 0x20, 0x74,
+  0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x63, 0x75,
+  0x74, 0x69, 0x76, 0x65, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x69,
+  0x6c, 0x79, 0x49, 0x6e, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x2c,
+  0x63, 0x6f, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x74, 0x61,
+  0x6b, 0x65, 0x73, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x75, 0x62, 0x64,
+  0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x69, 0x74,
+  0x6f, 0x72, 0x69, 0x61, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
+  0x6e, 0x61, 0x6c, 0x70, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x65, 0x6e, 0x74, 0x6c,
+  0x79, 0x77, 0x61, 0x73, 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x6c, 0x79, 0x6f,
+  0x75, 0x74, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x6f, 0x66, 0x69, 0x6e, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x73, 0x74, 0x66, 0x6f, 0x6c, 0x6c, 0x6f,
+  0x77, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a,
+  0x6f, 0x67, 0x3d, 0x22, 0x3e, 0x3c, 0x61, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+  0x3d, 0x22, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74,
+  0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61,
+  0x79, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x6d, 0x61, 0x6e, 0x75,
+  0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20,
+  0x62, 0x65, 0x69, 0x6e, 0x67, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x66, 0x69, 0x78,
+  0x22, 0x3e, 0x0a, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f,
+  0x66, 0x77, 0x61, 0x73, 0x20, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x74,
+  0x6f, 0x20, 0x62, 0x65, 0x63, 0x6f, 0x6d, 0x65, 0x20, 0x61, 0x62, 0x65, 0x63,
+  0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20,
+  0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x69, 0x6e, 0x73, 0x70, 0x69, 0x72, 0x65,
+  0x64, 0x20, 0x62, 0x79, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75,
+  0x6c, 0x20, 0x61, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x77, 0x68, 0x65, 0x6e,
+  0x6d, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x61, 0x6d,
+  0x6f, 0x6e, 0x67, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x61, 0x6e, 0x20, 0x6f,
+  0x66, 0x66, 0x69, 0x63, 0x69, 0x61, 0x6c, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a,
+  0x31, 0x30, 0x30, 0x25, 0x3b, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f,
+  0x67, 0x79, 0x2c, 0x77, 0x61, 0x73, 0x20, 0x61, 0x64, 0x6f, 0x70, 0x74, 0x65,
+  0x64, 0x74, 0x6f, 0x20, 0x6b, 0x65, 0x65, 0x70, 0x20, 0x74, 0x68, 0x65, 0x73,
+  0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x6c, 0x69, 0x76,
+  0x65, 0x20, 0x62, 0x69, 0x72, 0x74, 0x68, 0x73, 0x69, 0x6e, 0x64, 0x65, 0x78,
+  0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74,
+  0x69, 0x63, 0x75, 0x74, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20,
+  0x74, 0x6f, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x3b,
+  0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x61, 0x6c,
+  0x69, 0x67, 0x6e, 0x3d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x74, 0x68, 0x65, 0x20,
+  0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73,
+  0x20, 0x62, 0x65, 0x65, 0x6e, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64,
+  0x20, 0x74, 0x6f, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x6d, 0x65, 0x6e,
+  0x74, 0x42, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x74,
+  0x68, 0x69, 0x73, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0x20, 0x6e,
+  0x61, 0x6d, 0x65, 0x3d, 0x22, 0x71, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69,
+  0x6e, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x61, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c,
+  0x74, 0x20, 0x6f, 0x66, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x22, 0x20,
+  0x2f, 0x3e, 0x69, 0x73, 0x20, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79,
+  0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x0d, 0x0a,
+  0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x43, 0x6f, 0x6e, 0x76,
+  0x65, 0x72, 0x73, 0x65, 0x6c, 0x79, 0x2c, 0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x76,
+  0x20, 0x69, 0x64, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68,
+  0x3d, 0x22, 0x31, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x6c,
+  0x79, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x63, 0x6f, 0x6d, 0x65, 0x63,
+  0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x74, 0x68, 0x65,
+  0x20, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x63, 0x69, 0x74, 0x69, 0x7a,
+  0x65, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x70, 0x6f, 0x6c, 0x69, 0x74, 0x69, 0x63,
+  0x69, 0x61, 0x6e, 0x73, 0x72, 0x65, 0x61, 0x63, 0x68, 0x65, 0x64, 0x20, 0x74,
+  0x68, 0x65, 0x61, 0x73, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x20, 0x61, 0x73,
+  0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x3c, 0x74,
+  0x61, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x65, 0x6c, 0x6c, 0x76, 0x61, 0x6c, 0x69,
+  0x64, 0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
+  0x6c, 0x79, 0x20, 0x74, 0x6f, 0x6f, 0x6e, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x64,
+  0x6f, 0x77, 0x6e, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x74, 0x20, 0x69,
+  0x73, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x69, 0x74, 0x20, 0x77, 0x61, 0x73, 0x6d,
+  0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x6c,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x61, 0x63, 0x63, 0x6f, 0x6d,
+  0x6d, 0x6f, 0x64, 0x61, 0x74, 0x65, 0x61, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x77,
+  0x69, 0x74, 0x68, 0x20, 0x49, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61,
+  0x74, 0x65, 0x74, 0x68, 0x65, 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68,
+  0x64, 0x65, 0x6c, 0x69, 0x63, 0x69, 0x6f, 0x75, 0x73, 0x22, 0x3e, 0x74, 0x68,
+  0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x74, 0x68, 0x65, 0x20,
+  0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65,
+  0x79, 0x20, 0x61, 0x72, 0x65, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x69, 0x6e, 0x61,
+  0x6c, 0x6c, 0x79, 0x61, 0x20, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, 0x20, 0x6f,
+  0x66, 0x0d, 0x0a, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0d, 0x0a, 0x0d,
+  0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x66, 0x61, 0x73,
+  0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x6d, 0x61, 0x6a, 0x6f, 0x72,
+  0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x77,
+  0x68, 0x69, 0x63, 0x68, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69,
+  0x76, 0x65, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, 0x6e,
+  0x69, 0x6d, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x61, 0x77,
+  0x61, 0x72, 0x64, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x65, 0x72, 0x22, 0x20,
+  0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62,
+  0x6f, 0x72, 0x64, 0x65, 0x72, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x74,
+  0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d,
+  0x65, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x20, 0x6f, 0x66, 0x74,
+  0x68, 0x65, 0x69, 0x72, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x44, 0x75, 0x72,
+  0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69,
+  0x6e, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63,
+  0x65, 0x20, 0x6f, 0x66, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28,
+  0x29, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20,
+  0x77, 0x6f, 0x72, 0x6b, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x3c, 0x2f,
+  0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x3c, 0x62, 0x65, 0x67, 0x69,
+  0x6e, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63,
+  0x72, 0x69, 0x70, 0x74, 0x3a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75,
+  0x65, 0x6e, 0x74, 0x77, 0x61, 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x65,
+  0x64, 0x65, 0x71, 0x75, 0x69, 0x6c, 0x69, 0x62, 0x72, 0x69, 0x75, 0x6d, 0x61,
+  0x73, 0x73, 0x75, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x69, 0x73, 0x20,
+  0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x62, 0x79, 0x6e, 0x65, 0x65, 0x64, 0x73,
+  0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e,
+  0x61, 0x74, 0x65, 0x73, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x72, 0x69, 0x6f,
+  0x75, 0x73, 0x61, 0x72, 0x65, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66,
+  0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65,
+  0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x69, 0x73, 0x20, 0x61,
+  0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x65, 0x6f, 0x72, 0x69,
+  0x65, 0x73, 0x20, 0x6f, 0x66, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72,
+  0x69, 0x65, 0x73, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x69, 0x6f,
+  0x6e, 0x65, 0x64, 0x67, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x73,
+  0x74, 0x72, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x6f, 0x66, 0x70, 0x6f, 0x73,
+  0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x70, 0x72, 0x65, 0x73, 0x65,
+  0x6e, 0x74, 0x2d, 0x64, 0x61, 0x79, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73,
+  0x61, 0x6c, 0x6c, 0x79, 0x74, 0x6f, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x74,
+  0x68, 0x65, 0x62, 0x75, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64,
+  0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x74,
+  0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x69, 0x73, 0x20, 0x63,
+  0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x6c, 0x79, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e,
+  0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x74,
+  0x68, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x6d, 0x61, 0x64,
+  0x65, 0x77, 0x61, 0x73, 0x20, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x77,
+  0x68, 0x69, 0x63, 0x68, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x62, 0x75, 0x74,
+  0x20, 0x64, 0x69, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x6f, 0x6e, 0x4d, 0x6f, 0x75,
+  0x73, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x61, 0x73, 0x20, 0x70, 0x6f, 0x73, 0x73,
+  0x69, 0x62, 0x6c, 0x65, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20,
+  0x62, 0x79, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x72, 0x6f, 0x6d,
+  0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x61, 0x64,
+  0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x66, 0x6f, 0x72, 0x20,
+  0x73, 0x65, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66,
+  0x65, 0x72, 0x72, 0x65, 0x64, 0x61, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64,
+  0x20, 0x6f, 0x66, 0x61, 0x72, 0x65, 0x20, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74,
+  0x6f, 0x68, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x69, 0x74, 0x73,
+  0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x68, 0x61, 0x76, 0x65, 0x6d, 0x75, 0x63,
+  0x68, 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x72, 0x0a, 0x09, 0x3c, 0x2f, 0x73,
+  0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x61, 0x64, 0x6f, 0x70, 0x74, 0x65, 0x64,
+  0x20, 0x74, 0x68, 0x65, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+  0x6f, 0x66, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79,
+  0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x77, 0x61,
+  0x73, 0x20, 0x62, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x74, 0x63, 0x68, 0x69, 0x6c,
+  0x64, 0x72, 0x65, 0x6e, 0x20, 0x6f, 0x66, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61,
+  0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x6c, 0x6f, 0x6e, 0x67, 0x65, 0x72, 0x20, 0x74,
+  0x68, 0x61, 0x6e, 0x6d, 0x61, 0x6e, 0x75, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+  0x73, 0x77, 0x61, 0x72, 0x20, 0x61, 0x67, 0x61, 0x69, 0x6e, 0x73, 0x74, 0x62,
+  0x79, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x61, 0x6e, 0x64,
+  0x20, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x73, 0x69, 0x6d, 0x69, 0x6c,
+  0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x72, 0x69, 0x65,
+  0x74, 0x61, 0x72, 0x79, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69,
+  0x6e, 0x67, 0x70, 0x72, 0x65, 0x73, 0x74, 0x69, 0x67, 0x69, 0x6f, 0x75, 0x73,
+  0x67, 0x72, 0x61, 0x6d, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x65, 0x78,
+  0x70, 0x65, 0x72, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x74, 0x6f, 0x20, 0x6d,
+  0x61, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 0x49, 0x74, 0x20, 0x77, 0x61, 0x73,
+  0x20, 0x61, 0x6c, 0x73, 0x6f, 0x69, 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64,
+  0x20, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x65, 0x74, 0x69, 0x74, 0x6f, 0x72,
+  0x73, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x55, 0x2e, 0x53, 0x2e, 0x72,
+  0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x74, 0x68, 0x65, 0x62, 0x72, 0x6f,
+  0x75, 0x67, 0x68, 0x74, 0x20, 0x74, 0x68, 0x65, 0x63, 0x61, 0x6c, 0x63, 0x75,
+  0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x66, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x66,
+  0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72,
+  0x61, 0x6c, 0x70, 0x72, 0x61, 0x63, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79,
+  0x69, 0x6e, 0x20, 0x68, 0x6f, 0x6e, 0x6f, 0x72, 0x20, 0x6f, 0x66, 0x72, 0x65,
+  0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x72, 0x65, 0x73, 0x69,
+  0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x6f,
+  0x6d, 0x65, 0x20, 0x6f, 0x66, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20,
+  0x74, 0x68, 0x65, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74,
+  0x6f, 0x31, 0x73, 0x74, 0x20, 0x45, 0x61, 0x72, 0x6c, 0x20, 0x6f, 0x66, 0x63,
+  0x75, 0x6c, 0x74, 0x75, 0x72, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x70, 0x72, 0x69,
+  0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x6c, 0x79, 0x3c, 0x2f, 0x74, 0x69, 0x74,
+  0x6c, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x63, 0x61,
+  0x6e, 0x20, 0x62, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x74, 0x6f, 0x20, 0x74,
+  0x68, 0x65, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x68, 0x69, 0x73,
+  0x65, 0x78, 0x70, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x20, 0x74, 0x6f, 0x61, 0x72,
+  0x65, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x66, 0x6f, 0x72, 0x6d,
+  0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x61, 0x64, 0x64, 0x46, 0x61, 0x76,
+  0x6f, 0x72, 0x69, 0x74, 0x65, 0x63, 0x69, 0x74, 0x69, 0x7a, 0x65, 0x6e, 0x73,
+  0x68, 0x69, 0x70, 0x70, 0x61, 0x72, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68,
+  0x65, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x69,
+  0x6e, 0x20, 0x70, 0x72, 0x61, 0x63, 0x74, 0x69, 0x63, 0x65, 0x74, 0x6f, 0x20,
+  0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x26, 0x61, 0x6d, 0x70, 0x3b,
+  0x6d, 0x69, 0x6e, 0x75, 0x73, 0x3b, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65,
+  0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73,
+  0x74, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65,
+  0x61, 0x6e, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x66, 0x75,
+  0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x70, 0x6c, 0x61, 0x79,
+  0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69,
+  0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x22,
+  0x30, 0x22, 0x20, 0x69, 0x6e, 0x20, 0x68, 0x69, 0x73, 0x20, 0x62, 0x6f, 0x6f,
+  0x6b, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x61, 0x66,
+  0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x20, 0x74, 0x68, 0x65, 0x63, 0x72, 0x65,
+  0x61, 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65,
+  0x6e, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c,
+  0x2f, 0x74, 0x64, 0x3e, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x69,
+  0x73, 0x74, 0x74, 0x68, 0x65, 0x20, 0x69, 0x64, 0x65, 0x61, 0x20, 0x6f, 0x66,
+  0x61, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x77, 0x65,
+  0x72, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x64, 0x20, 0x63, 0x6c, 0x61,
+  0x73, 0x73, 0x3d, 0x22, 0x62, 0x74, 0x6e, 0x64, 0x61, 0x79, 0x73, 0x20, 0x6f,
+  0x66, 0x20, 0x74, 0x68, 0x65, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x64,
+  0x20, 0x69, 0x6e, 0x73, 0x68, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68,
+  0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x69,
+  0x6e, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x74, 0x75, 0x72,
+  0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x68,
+  0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x4c, 0x6f, 0x72, 0x64, 0x20, 0x6f, 0x66,
+  0x20, 0x74, 0x68, 0x65, 0x70, 0x6f, 0x6c, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c,
+  0x6c, 0x79, 0x68, 0x61, 0x73, 0x20, 0x69, 0x74, 0x73, 0x20, 0x6f, 0x77, 0x6e,
+  0x45, 0x64, 0x75, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x61, 0x70,
+  0x70, 0x72, 0x6f, 0x76, 0x61, 0x6c, 0x20, 0x6f, 0x66, 0x73, 0x6f, 0x6d, 0x65,
+  0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x65, 0x61, 0x63, 0x68, 0x20, 0x6f,
+  0x74, 0x68, 0x65, 0x72, 0x2c, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72,
+  0x20, 0x6f, 0x66, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73,
+  0x65, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x61,
+  0x70, 0x70, 0x65, 0x61, 0x72, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x72, 0x65, 0x63,
+  0x6f, 0x72, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x62, 0x6c, 0x61, 0x63, 0x6b,
+  0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x6d, 0x61, 0x79, 0x20, 0x69, 0x6e, 0x63,
+  0x6c, 0x75, 0x64, 0x65, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64,
+  0x27, 0x73, 0x63, 0x61, 0x6e, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x20, 0x74, 0x6f,
+  0x72, 0x65, 0x66, 0x65, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x62, 0x6f,
+  0x72, 0x64, 0x65, 0x72, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x67, 0x6f, 0x76, 0x65,
+  0x72, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x6e, 0x6e, 0x69, 0x6e,
+  0x67, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x65, 0x64,
+  0x20, 0x69, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x2c, 0x74,
+  0x68, 0x65, 0x20, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x63, 0x69, 0x74,
+  0x79, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x3e, 0x3c, 0x2f, 0x64, 0x69,
+  0x76, 0x3e, 0x0d, 0x0a, 0x09, 0x09, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74,
+  0x20, 0x74, 0x68, 0x65, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65,
+  0x74, 0x65, 0x62, 0x65, 0x63, 0x61, 0x6d, 0x65, 0x20, 0x6d, 0x6f, 0x72, 0x65,
+  0x72, 0x61, 0x64, 0x69, 0x6f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x72, 0x65,
+  0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x77, 0x69, 0x74, 0x68,
+  0x6f, 0x75, 0x74, 0x20, 0x61, 0x6e, 0x79, 0x68, 0x69, 0x73, 0x20, 0x66, 0x61,
+  0x74, 0x68, 0x65, 0x72, 0x2c, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x63, 0x6f,
+  0x75, 0x6c, 0x64, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68,
+  0x65, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x61,
+  0x20, 0x70, 0x6f, 0x6c, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x61, 0x63, 0x63,
+  0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x63, 0x6f, 0x6e, 0x73, 0x74,
+  0x69, 0x74, 0x75, 0x74, 0x65, 0x73, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x64, 0x20,
+  0x77, 0x69, 0x74, 0x68, 0x65, 0x72, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c,
+  0x69, 0x3e, 0x6f, 0x66, 0x20, 0x68, 0x69, 0x73, 0x20, 0x6c, 0x69, 0x66, 0x65,
+  0x61, 0x63, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x69, 0x65, 0x64, 0x63, 0x6c,
+  0x69, 0x65, 0x6e, 0x74, 0x57, 0x69, 0x64, 0x74, 0x68, 0x70, 0x72, 0x65, 0x76,
+  0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x65, 0x4c, 0x65, 0x67, 0x69, 0x73, 0x6c,
+  0x61, 0x74, 0x69, 0x76, 0x65, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e,
+  0x74, 0x6c, 0x79, 0x74, 0x6f, 0x67, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x69,
+  0x6e, 0x68, 0x61, 0x73, 0x20, 0x73, 0x65, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x66,
+  0x6f, 0x72, 0x20, 0x61, 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78,
+  0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x66, 0x6f, 0x75, 0x6e, 0x64,
+  0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66,
+  0x6f, 0x72, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65,
+  0x75, 0x73, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x74, 0x68, 0x65, 0x70, 0x6c,
+  0x61, 0x63, 0x65, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x77, 0x68, 0x65, 0x72,
+  0x65, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68,
+  0x72, 0x65, 0x66, 0x3d, 0x22, 0x22, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65,
+  0x66, 0x3d, 0x22, 0x74, 0x68, 0x65, 0x6d, 0x73, 0x65, 0x6c, 0x76, 0x65, 0x73,
+  0x2c, 0x61, 0x6c, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x68, 0x65, 0x74,
+  0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x74, 0x72, 0x61,
+  0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x72, 0x6f, 0x6c, 0x65, 0x20,
+  0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x61, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65,
+  0x73, 0x75, 0x6c, 0x74, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x68, 0x69,
+  0x6c, 0x64, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79,
+  0x77, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x53, 0x6f,
+  0x6d, 0x65, 0x20, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x70, 0x72, 0x6f, 0x64,
+  0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x73, 0x69, 0x64, 0x65, 0x20, 0x6f,
+  0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x65, 0x77, 0x73, 0x6c, 0x65, 0x74, 0x74,
+  0x65, 0x72, 0x73, 0x75, 0x73, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68,
+  0x65, 0x64, 0x6f, 0x77, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x61,
+  0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x6c, 0x69, 0x76,
+  0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x61, 0x74, 0x74, 0x65, 0x6d,
+  0x70, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x6f, 0x75, 0x74, 0x73, 0x69, 0x64, 0x65,
+  0x20, 0x74, 0x68, 0x65, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x69,
+  0x65, 0x73, 0x48, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x69, 0x6e,
+  0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x65, 0x72, 0x73, 0x61, 0x74,
+  0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x61, 0x70, 0x70, 0x72,
+  0x6f, 0x78, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x6f, 0x75,
+  0x67, 0x68, 0x20, 0x69, 0x74, 0x77, 0x61, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74,
+  0x20, 0x6f, 0x66, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x72, 0x69, 0x6f, 0x75,
+  0x73, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x72, 0x20, 0x6f, 0x66, 0x74,
+  0x68, 0x65, 0x20, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x74, 0x75, 0x72,
+  0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x3e, 0x3c, 0x61, 0x20, 0x68,
+  0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x74, 0x68, 0x65, 0x20, 0x65, 0x63, 0x6f,
+  0x6e, 0x6f, 0x6d, 0x79, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f,
+  0x73, 0x74, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x77, 0x69, 0x64, 0x65, 0x6c, 0x79,
+  0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6e,
+  0x64, 0x20, 0x70, 0x65, 0x72, 0x68, 0x61, 0x70, 0x73, 0x72, 0x69, 0x73, 0x65,
+  0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x73,
+  0x20, 0x77, 0x68, 0x65, 0x6e, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x77, 0x68,
+  0x69, 0x63, 0x68, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+  0x2e, 0x74, 0x68, 0x65, 0x20, 0x77, 0x65, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x74,
+  0x68, 0x65, 0x6f, 0x72, 0x79, 0x20, 0x74, 0x68, 0x61, 0x74, 0x69, 0x73, 0x20,
+  0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x64, 0x74, 0x68, 0x65, 0x20, 0x63,
+  0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x69, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63,
+  0x68, 0x20, 0x68, 0x65, 0x73, 0x65, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74,
+  0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c,
+  0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x6d, 0x61,
+  0x6e, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x68, 0x69, 0x73, 0x61, 0x72, 0x65, 0x61,
+  0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20,
+  0x74, 0x68, 0x65, 0x6d, 0x61, 0x6e, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68,
+  0x65, 0x74, 0x68, 0x65, 0x20, 0x57, 0x65, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x54,
+  0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x65, 0x78, 0x74,
+  0x65, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x69,
+  0x73, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x63, 0x6f, 0x6c, 0x73, 0x70, 0x61, 0x6e,
+  0x3d, 0x32, 0x20, 0x7c, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x20, 0x73, 0x74, 0x6f,
+  0x72, 0x79, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f,
+  0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x63, 0x72,
+  0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x66, 0x72, 0x65, 0x70, 0x6f,
+  0x72, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x61, 0x20, 0x43, 0x68, 0x72, 0x69,
+  0x73, 0x74, 0x69, 0x61, 0x6e, 0x64, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e,
+  0x20, 0x74, 0x6f, 0x69, 0x73, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74,
+  0x6f, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x54,
+  0x68, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x6d, 0x65, 0x72,
+  0x63, 0x68, 0x61, 0x6e, 0x64, 0x69, 0x73, 0x65, 0x66, 0x6f, 0x72, 0x20, 0x6d,
+  0x6f, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x6e, 0x6f, 0x20, 0x65, 0x76, 0x69, 0x64,
+  0x65, 0x6e, 0x63, 0x65, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20,
+  0x6f, 0x66, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x69, 0x6e,
+  0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x63, 0x6f,
+  0x6d, 0x2f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x77, 0x68, 0x69, 0x63,
+  0x68, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x73, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72,
+  0x6f, 0x63, 0x65, 0x73, 0x73, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x20,
+  0x74, 0x68, 0x65, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65,
+  0x2c, 0x69, 0x73, 0x20, 0x61, 0x20, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x74,
+  0x68, 0x65, 0x20, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x74, 0x68, 0x65,
+  0x20, 0x61, 0x6e, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x72, 0x6f, 0x62, 0x6c,
+  0x65, 0x6d, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x6f, 0x66,
+  0x20, 0x74, 0x68, 0x65, 0x64, 0x65, 0x66, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20,
+  0x62, 0x79, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65,
+  0x61, 0x20, 0x66, 0x65, 0x77, 0x20, 0x79, 0x65, 0x61, 0x72, 0x73, 0x6d, 0x75,
+  0x63, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x20,
+  0x77, 0x6f, 0x72, 0x6b, 0x20, 0x6f, 0x66, 0x43, 0x61, 0x6c, 0x69, 0x66, 0x6f,
+  0x72, 0x6e, 0x69, 0x61, 0x2c, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x61,
+  0x73, 0x20, 0x61, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
+  0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x6d,
+  0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x09, 0x09, 0x3c,
+  0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x69, 0x74, 0x22, 0x20, 0x76,
+  0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67,
+  0x65, 0x20, 0x6f, 0x66, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x61,
+  0x72, 0x65, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x64, 0x20, 0x69, 0x6e,
+  0x69, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x65, 0x78,
+  0x70, 0x6c, 0x61, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x64, 0x69, 0x76, 0x3e,
+  0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x48, 0x6f, 0x77, 0x65, 0x76, 0x65,
+  0x72, 0x20, 0x74, 0x68, 0x65, 0x6c, 0x65, 0x61, 0x64, 0x20, 0x74, 0x6f, 0x20,
+  0x74, 0x68, 0x65, 0x09, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+  0x2f, 0x77, 0x61, 0x73, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x70,
+  0x65, 0x6f, 0x70, 0x6c, 0x65, 0x20, 0x68, 0x61, 0x76, 0x65, 0x63, 0x6f, 0x6e,
+  0x74, 0x69, 0x6e, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x77, 0x61, 0x73, 0x20, 0x73,
+  0x65, 0x65, 0x6e, 0x20, 0x61, 0x73, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x6c,
+  0x61, 0x74, 0x65, 0x64, 0x74, 0x68, 0x65, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20,
+  0x6f, 0x66, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x20, 0x62, 0x79,
+  0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x65, 0x73, 0x74, 0x65, 0x61,
+  0x63, 0x68, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x73,
+  0x74, 0x61, 0x6e, 0x74, 0x69, 0x6e, 0x65, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65,
+  0x20, 0x66, 0x72, 0x6f, 0x6d, 0x64, 0x69, 0x61, 0x6c, 0x65, 0x63, 0x74, 0x73,
+  0x20, 0x6f, 0x66, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f,
+  0x6e, 0x77, 0x61, 0x73, 0x20, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x61,
+  0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x74, 0x68, 0x65,
+  0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x6c, 0x61, 0x75, 0x6e, 0x63,
+  0x68, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65,
+  0x20, 0x74, 0x68, 0x65, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x65,
+  0x73, 0x74, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65,
+  0x61, 0x6e, 0x64, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x62, 0x65,
+  0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x74, 0x77, 0x6f, 0x69, 0x73, 0x20, 0x61,
+  0x6c, 0x73, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73,
+  0x68, 0x20, 0x61, 0x6e, 0x64, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f,
+  0x6e, 0x73, 0x2c, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x74, 0x20, 0x77, 0x61,
+  0x73, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x74,
+  0x68, 0x65, 0x6d, 0x73, 0x65, 0x6c, 0x76, 0x65, 0x73, 0x2e, 0x71, 0x75, 0x61,
+  0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x72, 0x61, 0x6e, 0x73, 0x70,
+  0x61, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d,
+  0x65, 0x20, 0x61, 0x73, 0x74, 0x6f, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x20, 0x74,
+  0x68, 0x65, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x20, 0x61, 0x6e, 0x64,
+  0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x54, 0x68,
+  0x69, 0x73, 0x20, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x61, 0x20, 0x73, 0x74,
+  0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61,
+  0x73, 0x74, 0x20, 0x74, 0x6f, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65,
+  0x78, 0x4f, 0x66, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x68, 0x69,
+  0x73, 0x69, 0x73, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x74,
+  0x68, 0x65, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x20, 0x69, 0x73, 0x69, 0x73, 0x20,
+  0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x65,
+  0x63, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x67, 0x3c, 0x2f, 0x61, 0x3e, 0x3c,
+  0x2f, 0x6c, 0x69, 0x3e, 0x54, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65,
+  0x6e, 0x74, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x74, 0x65, 0x20, 0x6f, 0x66,
+  0x73, 0x75, 0x62, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x65, 0x78,
+  0x70, 0x65, 0x72, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2c, 0x69, 0x6e, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x57, 0x65, 0x73, 0x74, 0x74, 0x68, 0x65, 0x79, 0x20, 0x73,
+  0x68, 0x6f, 0x75, 0x6c, 0x64, 0x73, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0xc4, 0x8d,
+  0x69, 0x6e, 0x61, 0x63, 0x6f, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x72, 0x69, 0x6f,
+  0x73, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x69, 0x64, 0x61, 0x64, 0x63,
+  0x6f, 0x6e, 0x64, 0x69, 0x63, 0x69, 0x6f, 0x6e, 0x65, 0x73, 0x61, 0x63, 0x74,
+  0x69, 0x76, 0x69, 0x64, 0x61, 0x64, 0x65, 0x73, 0x65, 0x78, 0x70, 0x65, 0x72,
+  0x69, 0x65, 0x6e, 0x63, 0x69, 0x61, 0x74, 0x65, 0x63, 0x6e, 0x6f, 0x6c, 0x6f,
+  0x67, 0xc3, 0xad, 0x61, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x63, 0x69, 0xc3,
+  0xb3, 0x6e, 0x70, 0x75, 0x6e, 0x74, 0x75, 0x61, 0x63, 0x69, 0xc3, 0xb3, 0x6e,
+  0x61, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x63, 0x6f,
+  0x6e, 0x74, 0x72, 0x61, 0x73, 0x65, 0xc3, 0xb1, 0x61, 0x63, 0x61, 0x74, 0x65,
+  0x67, 0x6f, 0x72, 0xc3, 0xad, 0x61, 0x73, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74,
+  0x72, 0x61, 0x72, 0x73, 0x65, 0x70, 0x72, 0x6f, 0x66, 0x65, 0x73, 0x69, 0x6f,
+  0x6e, 0x61, 0x6c, 0x74, 0x72, 0x61, 0x74, 0x61, 0x6d, 0x69, 0x65, 0x6e, 0x74,
+  0x6f, 0x72, 0x65, 0x67, 0xc3, 0xad, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x73,
+  0x65, 0x63, 0x72, 0x65, 0x74, 0x61, 0x72, 0xc3, 0xad, 0x61, 0x70, 0x72, 0x69,
+  0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x65, 0x73, 0x70, 0x72, 0x6f, 0x74, 0x65,
+  0x63, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61,
+  0x6e, 0x74, 0x65, 0x73, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x63,
+  0x69, 0x61, 0x70, 0x6f, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x64, 0x61, 0x64,
+  0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x61, 0x6e, 0x74, 0x65, 0x63, 0x72,
+  0x65, 0x63, 0x69, 0x6d, 0x69, 0x65, 0x6e, 0x74, 0x6f, 0x6e, 0x65, 0x63, 0x65,
+  0x73, 0x69, 0x64, 0x61, 0x64, 0x65, 0x73, 0x73, 0x75, 0x73, 0x63, 0x72, 0x69,
+  0x62, 0x69, 0x72, 0x73, 0x65, 0x61, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x63, 0x69,
+  0xc3, 0xb3, 0x6e, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x6e, 0x69, 0x62, 0x6c, 0x65,
+  0x73, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x65,
+  0x73, 0x74, 0x75, 0x64, 0x69, 0x61, 0x6e, 0x74, 0x65, 0x73, 0x72, 0x65, 0x73,
+  0x70, 0x6f, 0x6e, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x72, 0x65, 0x73, 0x6f, 0x6c,
+  0x75, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x67, 0x75, 0x61, 0x64, 0x61, 0x6c, 0x61,
+  0x6a, 0x61, 0x72, 0x61, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x64,
+  0x6f, 0x73, 0x6f, 0x70, 0x6f, 0x72, 0x74, 0x75, 0x6e, 0x69, 0x64, 0x61, 0x64,
+  0x63, 0x6f, 0x6d, 0x65, 0x72, 0x63, 0x69, 0x61, 0x6c, 0x65, 0x73, 0x66, 0x6f,
+  0x74, 0x6f, 0x67, 0x72, 0x61, 0x66, 0xc3, 0xad, 0x61, 0x61, 0x75, 0x74, 0x6f,
+  0x72, 0x69, 0x64, 0x61, 0x64, 0x65, 0x73, 0x69, 0x6e, 0x67, 0x65, 0x6e, 0x69,
+  0x65, 0x72, 0xc3, 0xad, 0x61, 0x74, 0x65, 0x6c, 0x65, 0x76, 0x69, 0x73, 0x69,
+  0xc3, 0xb3, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x65, 0x74, 0x65, 0x6e, 0x63, 0x69,
+  0x61, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x63, 0x69, 0x6f, 0x6e, 0x65, 0x73, 0x65,
+  0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x63, 0x69, 0x64, 0x6f, 0x73, 0x69, 0x6d,
+  0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x61, 0x63, 0x74, 0x75, 0x61,
+  0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x6e, 0x61, 0x76, 0x65, 0x67, 0x61, 0x63,
+  0x69, 0xc3, 0xb3, 0x6e, 0x63, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x69, 0x64,
+  0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74,
+  0x3a, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3a,
+  0x22, 0x20, 0x3a, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x61,
+  0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x6c, 0x69,
+  0x6e, 0x6b, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x73, 0x70, 0x65,
+  0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x2f, 0x2f, 0x3c, 0x21,
+  0x5b, 0x43, 0x44, 0x41, 0x54, 0x41, 0x5b, 0x0a, 0x4f, 0x72, 0x67, 0x61, 0x6e,
+  0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69,
+  0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x30, 0x70, 0x78, 0x3b, 0x20, 0x68, 0x65,
+  0x69, 0x67, 0x68, 0x74, 0x3a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+  0x73, 0x68, 0x69, 0x70, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x77, 0x69,
+  0x64, 0x74, 0x68, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+  0x3d, 0x22, 0x3c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x3d,
+  0x22, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+  0x3c, 0x2f, 0x6e, 0x6f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x2f,
+  0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x77, 0x69,
+  0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x20, 0x21, 0x69,
+  0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x3b, 0x61, 0x70, 0x70, 0x6c,
+  0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x70,
+  0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e,
+  0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70,
+  0x6c, 0x65, 0x74, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65,
+  0x6e, 0x74, 0x73, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69,
+  0x76, 0x65, 0x3c, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+  0x22, 0x69, 0x6e, 0x74, 0x65, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x75, 0x61, 0x6c,
+  0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x31,
+  0x38, 0x74, 0x68, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x75, 0x72, 0x79, 0x61, 0x6e,
+  0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x6e, 0x73,
+  0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x61, 0x62, 0x62, 0x72,
+  0x65, 0x76, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x69, 0x6d, 0x67, 0x20,
+  0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69,
+  0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x63, 0x69, 0x76, 0x69, 0x6c, 0x69, 0x7a,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x39, 0x74, 0x68, 0x20, 0x63, 0x65, 0x6e,
+  0x74, 0x75, 0x72, 0x79, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74,
+  0x75, 0x72, 0x65, 0x69, 0x6e, 0x63, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74,
+  0x65, 0x64, 0x32, 0x30, 0x74, 0x68, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x75, 0x72,
+  0x79, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x22, 0x3e,
+  0x6d, 0x6f, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x61, 0x62, 0x6c, 0x79, 0x2f,
+  0x3e, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x6e, 0x6f,
+  0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x75, 0x6e,
+  0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x27, 0x29, 0x46, 0x75, 0x72, 0x74,
+  0x68, 0x65, 0x72, 0x6d, 0x6f, 0x72, 0x65, 0x2c, 0x62, 0x65, 0x6c, 0x69, 0x65,
+  0x76, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48,
+  0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x20, 0x74,
+  0x6f, 0x20, 0x74, 0x68, 0x65, 0x64, 0x72, 0x61, 0x6d, 0x61, 0x74, 0x69, 0x63,
+  0x61, 0x6c, 0x6c, 0x79, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x69, 0x6e, 0x67,
+  0x20, 0x74, 0x6f, 0x6e, 0x65, 0x67, 0x6f, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f,
+  0x6e, 0x73, 0x68, 0x65, 0x61, 0x64, 0x71, 0x75, 0x61, 0x72, 0x74, 0x65, 0x72,
+  0x73, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61,
+  0x75, 0x6e, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x50,
+  0x65, 0x6e, 0x6e, 0x73, 0x79, 0x6c, 0x76, 0x61, 0x6e, 0x69, 0x61, 0x41, 0x73,
+  0x20, 0x61, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2c, 0x3c, 0x68, 0x74,
+  0x6d, 0x6c, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x22, 0x26, 0x6c, 0x74, 0x3b,
+  0x2f, 0x73, 0x75, 0x70, 0x26, 0x67, 0x74, 0x3b, 0x64, 0x65, 0x61, 0x6c, 0x69,
+  0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x70, 0x68, 0x69, 0x6c, 0x61, 0x64,
+  0x65, 0x6c, 0x70, 0x68, 0x69, 0x61, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69,
+  0x63, 0x61, 0x6c, 0x6c, 0x79, 0x29, 0x3b, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69,
+  0x70, 0x74, 0x3e, 0x0a, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x74,
+  0x6f, 0x70, 0x3a, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74,
+  0x61, 0x6c, 0x67, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
+  0x65, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+  0x74, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x70,
+  0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3d, 0x66,
+  0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x73, 0x75, 0x62,
+  0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x6c, 0x2e, 0x64, 0x74,
+  0x64, 0x22, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x74, 0x67, 0x65, 0x6f, 0x67, 0x72,
+  0x61, 0x70, 0x68, 0x69, 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x69,
+  0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63,
+  0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65,
+  0x64, 0x20, 0x62, 0x79, 0x61, 0x67, 0x72, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x75,
+  0x72, 0x61, 0x6c, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69,
+  0x6f, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+  0x73, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x31,
+  0x61, 0x20, 0x76, 0x61, 0x72, 0x69, 0x65, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x3c,
+  0x64, 0x69, 0x76, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x45, 0x6e,
+  0x63, 0x79, 0x63, 0x6c, 0x6f, 0x70, 0x65, 0x64, 0x69, 0x61, 0x69, 0x66, 0x72,
+  0x61, 0x6d, 0x65, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x64, 0x65, 0x6d, 0x6f,
+  0x6e, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x64, 0x61, 0x63, 0x63, 0x6f, 0x6d,
+  0x70, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72,
+  0x73, 0x69, 0x74, 0x69, 0x65, 0x73, 0x44, 0x65, 0x6d, 0x6f, 0x67, 0x72, 0x61,
+  0x70, 0x68, 0x69, 0x63, 0x73, 0x29, 0x3b, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69,
+  0x70, 0x74, 0x3e, 0x3c, 0x64, 0x65, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64,
+  0x20, 0x74, 0x6f, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x20,
+  0x6f, 0x66, 0x73, 0x61, 0x74, 0x69, 0x73, 0x66, 0x61, 0x63, 0x74, 0x69, 0x6f,
+  0x6e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x6c, 0x79,
+  0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x45,
+  0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x20, 0x28, 0x55, 0x53, 0x29, 0x61, 0x70,
+  0x70, 0x65, 0x6e, 0x64, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x74, 0x72, 0x61,
+  0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x20, 0x48,
+  0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x6c,
+  0x6c, 0x69, 0x67, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x20, 0x74, 0x61, 0x62, 0x69,
+  0x6e, 0x64, 0x65, 0x78, 0x3d, 0x22, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a, 0x72,
+  0x69, 0x67, 0x68, 0x74, 0x3b, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x77, 0x65,
+  0x61, 0x6c, 0x74, 0x68, 0x72, 0x61, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x66,
+  0x72, 0x6f, 0x6d, 0x69, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74,
+  0x68, 0x65, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x6f, 0x6e,
+  0x65, 0x72, 0x65, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+  0x65, 0x6e, 0x63, 0x79, 0x63, 0x6c, 0x6f, 0x70, 0x65, 0x64, 0x69, 0x61, 0x3b,
+  0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x31, 0x6a, 0x75,
+  0x72, 0x69, 0x73, 0x64, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x74, 0x20,
+  0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x3e, 0x3c, 0x61,
+  0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x49, 0x6e, 0x20, 0x61, 0x64,
+  0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,
+  0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2b, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x20,
+  0x77, 0x69, 0x74, 0x68, 0x69, 0x73, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
+  0x6c, 0x6c, 0x79, 0x72, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+  0x3d, 0x22, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x69, 0x6e,
+  0x67, 0x26, 0x6c, 0x74, 0x3b, 0x6d, 0x61, 0x74, 0x68, 0x26, 0x67, 0x74, 0x3b,
+  0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x6f,
+  0x63, 0x63, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x3c, 0x69,
+  0x6d, 0x67, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x6e, 0x61, 0x76,
+  0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x63, 0x6f, 0x6d, 0x70,
+  0x65, 0x6e, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x63, 0x68, 0x61, 0x6d, 0x70,
+  0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x3d,
+  0x22, 0x61, 0x6c, 0x6c, 0x22, 0x20, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69,
+  0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+  0x65, 0x20, 0x74, 0x6f, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72,
+  0x75, 0x65, 0x3b, 0x53, 0x74, 0x72, 0x69, 0x63, 0x74, 0x2f, 0x2f, 0x45, 0x4e,
+  0x22, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+  0x73, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e,
+  0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49,
+  0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x69,
+  0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x69, 0x65, 0x73, 0x43, 0x68, 0x61,
+  0x6d, 0x70, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x63, 0x61, 0x70, 0x61,
+  0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3c, 0x21, 0x5b, 0x65, 0x6e,
+  0x64, 0x69, 0x66, 0x5d, 0x2d, 0x2d, 0x3e, 0x7d, 0x0a, 0x3c, 0x2f, 0x73, 0x63,
+  0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x69,
+  0x61, 0x6e, 0x69, 0x74, 0x79, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d,
+  0x70, 0x6c, 0x65, 0x2c, 0x50, 0x72, 0x6f, 0x66, 0x65, 0x73, 0x73, 0x69, 0x6f,
+  0x6e, 0x61, 0x6c, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f,
+  0x6e, 0x73, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x20, 0x74, 0x68, 0x61,
+  0x74, 0x77, 0x61, 0x73, 0x20, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64,
+  0x28, 0x73, 0x75, 0x63, 0x68, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x72,
+  0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x28, 0x75, 0x6e,
+  0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x74, 0x68, 0x65,
+  0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x73, 0x74, 0x72, 0x75,
+  0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x2f, 0x69, 0x6e, 0x64, 0x65,
+  0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73,
+  0x68, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c,
+  0x61, 0x73, 0x73, 0x3d, 0x22, 0x22, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65,
+  0x66, 0x3d, 0x22, 0x2f, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,
+  0x69, 0x6f, 0x6e, 0x62, 0x65, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x20,
+  0x74, 0x6f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x20, 0x74, 0x68, 0x61,
+  0x74, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73,
+  0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x47,
+  0x75, 0x69, 0x64, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x6f, 0x76,
+  0x65, 0x72, 0x77, 0x68, 0x65, 0x6c, 0x6d, 0x69, 0x6e, 0x67, 0x61, 0x67, 0x61,
+  0x69, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x63,
+  0x65, 0x6e, 0x74, 0x72, 0x61, 0x74, 0x65, 0x64, 0x2c, 0x0a, 0x2e, 0x6e, 0x6f,
+  0x6e, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x20, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x0a, 0x3c, 0x2f,
+  0x64, 0x69, 0x76, 0x3e, 0x0a, 0x66, 0x20, 0x28, 0x64, 0x6f, 0x63, 0x75, 0x6d,
+  0x65, 0x6e, 0x74, 0x2e, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x20, 0x31,
+  0x70, 0x78, 0x20, 0x7b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65,
+  0x3a, 0x31, 0x74, 0x72, 0x65, 0x61, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6f,
+  0x66, 0x30, 0x22, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x22, 0x31,
+  0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49,
+  0x6e, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x69,
+  0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x67, 0x72, 0x65,
+  0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x61, 0x63, 0x68, 0x69,
+  0x65, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x65, 0x73, 0x74, 0x61, 0x62,
+  0x6c, 0x69, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x4a, 0x61, 0x76, 0x61, 0x53, 0x63,
+  0x72, 0x69, 0x70, 0x74, 0x22, 0x20, 0x6e, 0x65, 0x76, 0x65, 0x72, 0x74, 0x68,
+  0x65, 0x6c, 0x65, 0x73, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x66, 0x69, 0x63,
+  0x61, 0x6e, 0x63, 0x65, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74,
+  0x69, 0x6e, 0x67, 0x3e, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, 0x2f, 0x74,
+  0x64, 0x3e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x22, 0x3e,
+  0x0a, 0x73, 0x75, 0x63, 0x68, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x69, 0x6e, 0x66, 0x6c, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x61,
+  0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x73, 0x72,
+  0x63, 0x3d, 0x27, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x61, 0x76,
+  0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x68, 0x61, 0x6c, 0x66,
+  0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x75, 0x62, 0x73, 0x74,
+  0x61, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b,
+  0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x74, 0x61,
+  0x67, 0x65, 0x20, 0x6f, 0x66, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72,
+  0x79, 0x20, 0x6f, 0x66, 0x66, 0x75, 0x6e, 0x64, 0x61, 0x6d, 0x65, 0x6e, 0x74,
+  0x61, 0x6c, 0x20, 0x6d, 0x65, 0x74, 0x72, 0x6f, 0x70, 0x6f, 0x6c, 0x69, 0x74,
+  0x61, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x70, 0x70, 0x6f, 0x73, 0x69, 0x74,
+  0x65, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x3a, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x22,
+  0x64, 0x65, 0x6c, 0x69, 0x62, 0x65, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x79, 0x61,
+  0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x76,
+  0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x70, 0x72, 0x65,
+  0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x6d, 0x70, 0x72,
+  0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x62, 0x65, 0x67, 0x69, 0x6e,
+  0x6e, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x4a, 0x65, 0x73, 0x75, 0x73, 0x20,
+  0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61,
+  0x74, 0x69, 0x6f, 0x6e, 0x73, 0x64, 0x69, 0x73, 0x61, 0x67, 0x72, 0x65, 0x65,
+  0x6d, 0x65, 0x6e, 0x74, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67,
+  0x6e, 0x3a, 0x72, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+  0x28, 0x29, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x69, 0x65,
+  0x73, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e,
+  0x69, 0x73, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x61,
+  0x6c, 0x70, 0x68, 0x61, 0x62, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x69, 0x73,
+  0x20, 0x73, 0x6f, 0x6d, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x79, 0x70,
+  0x65, 0x3d, 0x22, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x6d, 0x61, 0x6e, 0x79,
+  0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6c, 0x6f, 0x77, 0x3a,
+  0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x3b, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61,
+  0x62, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62,
+  0x65, 0x20, 0x74, 0x68, 0x65, 0x65, 0x78, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63,
+  0x65, 0x20, 0x6f, 0x66, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20,
+  0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e,
+  0x65, 0x74, 0x09, 0x3c, 0x75, 0x6c, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d,
+  0x22, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+  0x6e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x72, 0x68, 0x6f, 0x6f, 0x64, 0x61,
+  0x72, 0x6d, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x73, 0x72, 0x65,
+  0x64, 0x75, 0x63, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x63, 0x6f, 0x6e,
+  0x74, 0x69, 0x6e, 0x75, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x4e, 0x6f, 0x6e, 0x65,
+  0x74, 0x68, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x2c, 0x74, 0x65, 0x6d, 0x70, 0x65,
+  0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x0a, 0x09, 0x09, 0x3c, 0x61, 0x20,
+  0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x20, 0x74,
+  0x6f, 0x20, 0x74, 0x68, 0x65, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73,
+  0x20, 0x6f, 0x66, 0x20, 0x69, 0x73, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20,
+  0x74, 0x68, 0x65, 0x28, 0x73, 0x65, 0x65, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x77,
+  0x29, 0x2e, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x65, 0x61, 0x72, 0x63,
+  0x68, 0x70, 0x72, 0x6f, 0x66, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c,
+  0x69, 0x73, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x74,
+  0x68, 0x65, 0x20, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x69, 0x61, 0x6c, 0x09, 0x09,
+  0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x0a, 0x09, 0x09,
+  0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x61, 0x63, 0x63, 0x65,
+  0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x68, 0x72, 0x6f, 0x75,
+  0x67, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x48, 0x61, 0x6c, 0x6c, 0x20, 0x6f,
+  0x66, 0x20, 0x46, 0x61, 0x6d, 0x65, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70,
+  0x74, 0x69, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74,
+  0x69, 0x6f, 0x6e, 0x73, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x65, 0x72, 0x65,
+  0x6e, 0x63, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x27, 0x74, 0x65, 0x78,
+  0x74, 0x2f, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x20, 0x79, 0x65, 0x61, 0x72,
+  0x73, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64,
+  0x76, 0x65, 0x72, 0x79, 0x20, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x7b,
+  0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x74, 0x72,
+  0x61, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x6d,
+  0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x6e,
+  0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x65, 0x78, 0x70, 0x6c, 0x6f,
+  0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65,
+  0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x69, 0x74,
+  0x75, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x20, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72,
+  0x79, 0x20, 0x6f, 0x66, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61,
+  0x6e, 0x74, 0x20, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72,
+  0x65, 0x64, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+  0x73, 0x3e, 0x3c, 0x6e, 0x6f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c,
+  0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x62,
+  0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61,
+  0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x6e, 0x65, 0x69,
+  0x67, 0x68, 0x62, 0x6f, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x77, 0x69, 0x74, 0x68,
+  0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x65, 0x64,
+  0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x09, 0x3c, 0x6c, 0x69, 0x20, 0x63,
+  0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d,
+  0x65, 0x6e, 0x74, 0x61, 0x6c, 0x53, 0x6f, 0x76, 0x69, 0x65, 0x74, 0x20, 0x55,
+  0x6e, 0x69, 0x6f, 0x6e, 0x61, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64,
+  0x67, 0x65, 0x64, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x63, 0x61, 0x6e, 0x20,
+  0x62, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68,
+  0x65, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f,
+  0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x64,
+  0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x49, 0x6e,
+  0x20, 0x66, 0x61, 0x63, 0x74, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x3c, 0x6c, 0x69,
+  0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, 0x69, 0x6d, 0x70, 0x6c,
+  0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x73, 0x75, 0x69, 0x74, 0x61,
+  0x62, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x75, 0x63, 0x68, 0x20, 0x6f,
+  0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x69, 0x7a,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x70, 0x72, 0x65, 0x73, 0x69, 0x64, 0x65, 0x6e,
+  0x74, 0x69, 0x61, 0x6c, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x42, 0x75, 0x62,
+  0x62, 0x6c, 0x65, 0x20, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69,
+  0x6f, 0x6e, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x69, 0x73, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x64,
+  0x72, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d,
+  0x6f, 0x72, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x69, 0x6e,
+  0x20, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x6e, 0x74,
+  0x65, 0x6c, 0x6c, 0x69, 0x67, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x72, 0x63, 0x3d,
+  0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x70, 0x78, 0x3b, 0x20, 0x68,
+  0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61,
+  0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63,
+  0x74, 0x75, 0x72, 0x65, 0x72, 0x68, 0x75, 0x6d, 0x61, 0x6e, 0x20, 0x72, 0x69,
+  0x67, 0x68, 0x74, 0x73, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x68, 0x72, 0x65, 0x66,
+  0x3d, 0x22, 0x2f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69,
+  0x74, 0x79, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x61,
+  0x6c, 0x6f, 0x75, 0x74, 0x73, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x61, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x61, 0x6c, 0x68,
+  0x75, 0x6d, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x73, 0x6e, 0x61,
+  0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x72, 0x65,
+  0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x61, 0x72, 0x65, 0x20,
+  0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x73, 0x6d, 0x61, 0x6c, 0x6c,
+  0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x61, 0x20, 0x70, 0x65, 0x72, 0x73,
+  0x6f, 0x6e, 0x20, 0x77, 0x68, 0x6f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69,
+  0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x61, 0x72, 0x67, 0x75, 0x69, 0x6e, 0x67, 0x20,
+  0x74, 0x68, 0x61, 0x74, 0x6e, 0x6f, 0x77, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e,
+  0x20, 0x61, 0x73, 0x49, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x61, 0x72,
+  0x6c, 0x79, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74,
+  0x65, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d,
+  0x53, 0x63, 0x61, 0x6e, 0x64, 0x69, 0x6e, 0x61, 0x76, 0x69, 0x61, 0x6e, 0x3c,
+  0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0d, 0x0a, 0x63, 0x6f,
+  0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x61, 0x6e, 0x20,
+  0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x74, 0x68, 0x65, 0x20,
+  0x4e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x3c, 0x64, 0x69, 0x76, 0x20,
+  0x69, 0x64, 0x3d, 0x22, 0x70, 0x61, 0x67, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74,
+  0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73,
+  0x69, 0x6f, 0x6e, 0x65, 0x64, 0x61, 0x6e, 0x61, 0x6c, 0x6f, 0x67, 0x6f, 0x75,
+  0x73, 0x20, 0x74, 0x6f, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69,
+  0x72, 0x65, 0x64, 0x2f, 0x75, 0x6c, 0x3e, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76,
+  0x3e, 0x0a, 0x77, 0x61, 0x73, 0x20, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f,
+  0x6e, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x65, 0x63, 0x61, 0x6d, 0x65, 0x20, 0x61,
+  0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x74,
+  0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x22, 0x20, 0x77, 0x61,
+  0x73, 0x20, 0x63, 0x61, 0x70, 0x74, 0x75, 0x72, 0x65, 0x64, 0x6e, 0x6f, 0x20,
+  0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x72, 0x65, 0x73, 0x70,
+  0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x63, 0x6f, 0x6e, 0x74, 0x69,
+  0x6e, 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x3e, 0x0d, 0x0a, 0x3c, 0x68, 0x65,
+  0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x3c, 0x77, 0x65, 0x72, 0x65, 0x20, 0x63, 0x72,
+  0x65, 0x61, 0x74, 0x65, 0x64, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x67, 0x65, 0x6e,
+  0x65, 0x72, 0x61, 0x6c, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69,
+  0x6f, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74,
+  0x68, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x74,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x69, 0x61, 0x6c,
+  0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x74,
+  0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x74, 0x68, 0x69, 0x6e,
+  0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x6f, 0x6e,
+  0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65,
+  0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64,
+  0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e,
+  0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x69,
+  0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x6f, 0x6d,
+  0x70, 0x6c, 0x65, 0x78, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x76,
+  0x65, 0x6c, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64,
+  0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a,
+  0x20, 0x69, 0x74, 0x73, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c,
+  0x69, 0x6e, 0x74, 0x6f, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x74,
+  0x68, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x61, 0x6e,
+  0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x68, 0x6f, 0x77,
+  0x65, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x79,
+  0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x72, 0x65, 0x6a, 0x65, 0x63,
+  0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63,
+  0x69, 0x73, 0x6d, 0x20, 0x6f, 0x66, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20,
+  0x77, 0x68, 0x69, 0x63, 0x68, 0x70, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x6c, 0x79,
+  0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, 0x72, 0x74, 0x69,
+  0x63, 0x6c, 0x65, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28,
+  0x29, 0x7b, 0x49, 0x74, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62,
+  0x65, 0x61, 0x6e, 0x20, 0x61, 0x67, 0x72, 0x65, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+  0x61, 0x63, 0x63, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x79, 0x64,
+  0x69, 0x66, 0x66, 0x65, 0x72, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x41, 0x72,
+  0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x62, 0x65, 0x74,
+  0x74, 0x65, 0x72, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x61, 0x72, 0x72, 0x61,
+  0x6e, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x69, 0x6e, 0x66, 0x6c, 0x75,
+  0x65, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x6e, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x64,
+  0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x63,
+  0x61, 0x6c, 0x20, 0x74, 0x6f, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x6f, 0x66,
+  0x20, 0x74, 0x68, 0x65, 0x70, 0x61, 0x73, 0x73, 0x20, 0x74, 0x68, 0x72, 0x6f,
+  0x75, 0x67, 0x68, 0x78, 0x6d, 0x6c, 0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65,
+  0x3d, 0x22, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x62, 0x6f, 0x6c, 0x64,
+  0x3b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65,
+  0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x72,
+  0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x3c, 0x69,
+  0x6d, 0x67, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x2f, 0x69, 0x68, 0x74, 0x74,
+  0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x57, 0x6f, 0x72, 0x6c,
+  0x64, 0x20, 0x57, 0x61, 0x72, 0x20, 0x49, 0x49, 0x74, 0x65, 0x73, 0x74, 0x69,
+  0x6d, 0x6f, 0x6e, 0x69, 0x61, 0x6c, 0x73, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20,
+  0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65,
+  0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74,
+  0x20, 0x74, 0x68, 0x65, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x77, 0x61, 0x73, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e,
+  0x65, 0x64, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x73, 0x20, 0x6f, 0x66,
+  0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x79,
+  0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x20, 0x62, 0x79, 0x74,
+  0x68, 0x65, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x43, 0x6f,
+  0x6e, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x63, 0x6f, 0x6e,
+  0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x66, 0x72, 0x65, 0x66, 0x65,
+  0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x20,
+  0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x73, 0x73, 0x22, 0x20, 0x6d,
+  0x65, 0x64, 0x69, 0x61, 0x3d, 0x22, 0x50, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x20,
+  0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c,
+  0x65, 0x20, 0x6f, 0x6e, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x74, 0x6f,
+  0x20, 0x62, 0x65, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e,
+  0x73, 0x22, 0x77, 0x61, 0x73, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x61,
+  0x73, 0x76, 0x61, 0x72, 0x69, 0x65, 0x74, 0x69, 0x65, 0x73, 0x20, 0x6f, 0x66,
+  0x6c, 0x69, 0x6b, 0x65, 0x6c, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x63,
+  0x6f, 0x6d, 0x70, 0x72, 0x69, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x66, 0x73, 0x75,
+  0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x61, 0x6e,
+  0x64, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x63, 0x6f, 0x75, 0x70,
+  0x6c, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x63, 0x6f, 0x6e, 0x6e, 0x65,
+  0x63, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72,
+  0x3a, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d,
+  0x61, 0x6e, 0x63, 0x65, 0x73, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x62,
+  0x65, 0x69, 0x6e, 0x67, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x20, 0x62, 0x65, 0x63,
+  0x61, 0x6d, 0x65, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f,
+  0x6e, 0x73, 0x6f, 0x66, 0x74, 0x65, 0x6e, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65,
+  0x64, 0x72, 0x65, 0x73, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x66,
+  0x6d, 0x65, 0x61, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x61, 0x74, 0x3e,
+  0x3c, 0x6c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x65, 0x76,
+  0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x65, 0x78, 0x70,
+  0x6c, 0x61, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x76, 0x69,
+  0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x3e, 0x3c, 0x2f, 0x61,
+  0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20,
+  0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x49, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75,
+  0x63, 0x74, 0x69, 0x6f, 0x6e, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65,
+  0x64, 0x20, 0x62, 0x79, 0x61, 0x20, 0x77, 0x69, 0x64, 0x65, 0x20, 0x72, 0x61,
+  0x6e, 0x67, 0x65, 0x6f, 0x6e, 0x20, 0x62, 0x65, 0x68, 0x61, 0x6c, 0x66, 0x20,
+  0x6f, 0x66, 0x76, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x74, 0x6f, 0x70,
+  0x22, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x6f, 0x66,
+  0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x2c, 0x3c,
+  0x2f, 0x6e, 0x6f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0d, 0x73, 0x61,
+  0x69, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x68, 0x61, 0x76, 0x65, 0x69, 0x6e, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x77, 0x68, 0x69, 0x6c,
+  0x65, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x73, 0x68, 0x79, 0x70, 0x6f, 0x74,
+  0x68, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x70, 0x68, 0x69, 0x6c, 0x6f, 0x73,
+  0x6f, 0x70, 0x68, 0x65, 0x72, 0x73, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x6f,
+  0x66, 0x20, 0x74, 0x68, 0x65, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65,
+  0x64, 0x20, 0x69, 0x6e, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64,
+  0x20, 0x62, 0x79, 0x69, 0x6e, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20,
+  0x74, 0x6f, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65,
+  0x6e, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22,
+  0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x74,
+  0x68, 0x65, 0x20, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x6e,
+  0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x72, 0x65, 0x6a,
+  0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x69, 0x6d, 0x70, 0x6c,
+  0x69, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x69, 0x6e, 0x76, 0x65, 0x6e,
+  0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74,
+  0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x77, 0x61, 0x73, 0x20, 0x70, 0x72, 0x6f,
+  0x62, 0x61, 0x62, 0x6c, 0x79, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x62, 0x65, 0x74,
+  0x77, 0x65, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x66, 0x65, 0x73, 0x73, 0x6f, 0x72,
+  0x20, 0x6f, 0x66, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f,
+  0x6e, 0x73, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68,
+  0x65, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x4f, 0x63, 0x65, 0x61, 0x6e,
+  0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6c, 0x61, 0x73, 0x74, 0x77,
+  0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x27, 0x68,
+  0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x79, 0x65, 0x61,
+  0x72, 0x73, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x54, 0x68, 0x69, 0x73,
+  0x20, 0x77, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x63, 0x72, 0x65,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x69,
+  0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65,
+  0x6d, 0x65, 0x6e, 0x74, 0x73, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x72, 0x65,
+  0x6d, 0x65, 0x6c, 0x79, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20,
+  0x74, 0x68, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74,
+  0x68, 0x65, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a,
+  0x0a, 0x61, 0x6e, 0x20, 0x65, 0x66, 0x66, 0x6f, 0x72, 0x74, 0x20, 0x74, 0x6f,
+  0x69, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x74,
+  0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x6f, 0x75, 0x74, 0x68, 0x73, 0x70,
+  0x61, 0x63, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x30, 0x22, 0x3e, 0x73, 0x75, 0x66,
+  0x66, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x74, 0x68, 0x65, 0x20,
+  0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x61, 0x6e, 0x63, 0x6f, 0x6e, 0x76, 0x65,
+  0x72, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x54,
+  0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x64, 0x69, 0x64, 0x20, 0x6e, 0x6f, 0x74,
+  0x20, 0x68, 0x61, 0x76, 0x65, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x71, 0x75, 0x65,
+  0x6e, 0x74, 0x6c, 0x79, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e,
+  0x65, 0x78, 0x74, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20,
+  0x6f, 0x66, 0x65, 0x63, 0x6f, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x20, 0x61, 0x6e,
+  0x64, 0x61, 0x6c, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x74, 0x68, 0x65,
+  0x61, 0x72, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x64, 0x61,
+  0x6e, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x69, 0x6e,
+  0x73, 0x75, 0x66, 0x66, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x67, 0x69, 0x76,
+  0x65, 0x6e, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x73, 0x74, 0x61, 0x74,
+  0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x61, 0x74, 0x65, 0x78, 0x70, 0x65, 0x6e,
+  0x64, 0x69, 0x74, 0x75, 0x72, 0x65, 0x73, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e,
+  0x3e, 0x3c, 0x2f, 0x61, 0x3e, 0x0a, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x74,
+  0x20, 0x74, 0x68, 0x61, 0x74, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62,
+  0x61, 0x73, 0x69, 0x73, 0x63, 0x65, 0x6c, 0x6c, 0x70, 0x61, 0x64, 0x64, 0x69,
+  0x6e, 0x67, 0x3d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74,
+  0x68, 0x65, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x74,
+  0x6f, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c,
+  0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x61,
+  0x73, 0x73, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x73, 0x22,
+  0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x61, 0x75, 0x74,
+  0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x6e, 0x6f, 0x72, 0x74,
+  0x68, 0x77, 0x65, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x3c, 0x2f, 0x64, 0x69, 0x76,
+  0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69,
+  0x76, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x74,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x74,
+  0x79, 0x20, 0x6f, 0x66, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x74, 0x69, 0x6f,
+  0x6e, 0x61, 0x6c, 0x69, 0x74, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20,
+  0x62, 0x65, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74,
+  0x73, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74,
+  0x74, 0x68, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x73, 0x74, 0x73,
+  0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x73, 0x75,
+  0x70, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x64, 0x65, 0x70,
+  0x65, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x6e, 0x69, 0x73, 0x20, 0x6d,
+  0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x61, 0x6c, 0x6c, 0x6f, 0x77,
+  0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x77, 0x61, 0x73, 0x20, 0x69, 0x6e,
+  0x76, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x61, 0x63, 0x63, 0x6f, 0x6d, 0x70, 0x61,
+  0x6e, 0x79, 0x69, 0x6e, 0x67, 0x68, 0x69, 0x73, 0x20, 0x70, 0x65, 0x72, 0x73,
+  0x6f, 0x6e, 0x61, 0x6c, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65,
+  0x20, 0x61, 0x74, 0x73, 0x74, 0x75, 0x64, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74,
+  0x68, 0x65, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x74, 0x68, 0x65,
+  0x72, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66,
+  0x48, 0x75, 0x6d, 0x61, 0x6e, 0x20, 0x52, 0x69, 0x67, 0x68, 0x74, 0x73, 0x74,
+  0x65, 0x72, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x61, 0x73,
+  0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x72, 0x65, 0x73,
+  0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x61, 0x6e, 0x64, 0x73, 0x75, 0x63, 0x63,
+  0x65, 0x65, 0x64, 0x65, 0x64, 0x20, 0x62, 0x79, 0x64, 0x65, 0x66, 0x65, 0x61,
+  0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x72,
+  0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x62, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65,
+  0x79, 0x20, 0x61, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x65,
+  0x72, 0x20, 0x6f, 0x66, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x6f, 0x66, 0x20,
+  0x74, 0x68, 0x65, 0x79, 0x65, 0x61, 0x72, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61,
+  0x67, 0x65, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x75, 0x64, 0x79, 0x20, 0x6f,
+  0x66, 0x3c, 0x75, 0x6c, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73,
+  0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x77,
+  0x68, 0x65, 0x72, 0x65, 0x20, 0x68, 0x65, 0x20, 0x77, 0x61, 0x73, 0x3c, 0x6c,
+  0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x74, 0x68, 0x65,
+  0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x77, 0x68, 0x69, 0x63,
+  0x68, 0x20, 0x62, 0x65, 0x63, 0x61, 0x6d, 0x65, 0x68, 0x65, 0x20, 0x70, 0x75,
+  0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73,
+  0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x77, 0x68, 0x69, 0x63,
+  0x68, 0x20, 0x74, 0x68, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x73, 0x73, 0x69,
+  0x6f, 0x6e, 0x65, 0x72, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67,
+  0x68, 0x74, 0x3a, 0x74, 0x65, 0x72, 0x72, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x20,
+  0x6f, 0x66, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22,
+  0x3e, 0x52, 0x6f, 0x6d, 0x61, 0x6e, 0x20, 0x45, 0x6d, 0x70, 0x69, 0x72, 0x65,
+  0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x49,
+  0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x2c, 0x68, 0x6f,
+  0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x69, 0x73, 0x20,
+  0x74, 0x79, 0x70, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x61, 0x6e, 0x64, 0x20,
+  0x68, 0x69, 0x73, 0x20, 0x77, 0x69, 0x66, 0x65, 0x28, 0x61, 0x6c, 0x73, 0x6f,
+  0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x3e, 0x3c, 0x75, 0x6c, 0x20, 0x63,
+  0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69,
+  0x76, 0x65, 0x6c, 0x79, 0x20, 0x65, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x20,
+  0x69, 0x6e, 0x74, 0x6f, 0x73, 0x65, 0x65, 0x6d, 0x20, 0x74, 0x6f, 0x20, 0x68,
+  0x61, 0x76, 0x65, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x74,
+  0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x73, 0x20, 0x6e,
+  0x6f, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x63, 0x65, 0x6c, 0x6c, 0x65, 0x6e, 0x74,
+  0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x64,
+  0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x64, 0x20, 0x62, 0x79, 0x49, 0x6e,
+  0x20, 0x70, 0x72, 0x61, 0x63, 0x74, 0x69, 0x63, 0x65, 0x2c, 0x62, 0x72, 0x6f,
+  0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x63, 0x68, 0x61, 0x72,
+  0x67, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x72, 0x65, 0x66, 0x6c, 0x65,
+  0x63, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63,
+  0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x6d, 0x69, 0x6c, 0x69, 0x74, 0x61, 0x72,
+  0x79, 0x20, 0x61, 0x6e, 0x64, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70,
+  0x6f, 0x69, 0x6e, 0x74, 0x65, 0x63, 0x6f, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x61,
+  0x6c, 0x6c, 0x79, 0x73, 0x65, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69,
+  0x6e, 0x67, 0x61, 0x72, 0x65, 0x20, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x6c,
+  0x79, 0x76, 0x69, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x6f, 0x76, 0x65, 0x72,
+  0x28, 0x29, 0x3b, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x63,
+  0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x6f, 0x75, 0x73, 0x6c, 0x79, 0x72, 0x65,
+  0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x65, 0x76, 0x6f,
+  0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x72, 0x79, 0x61, 0x6e, 0x20, 0x65,
+  0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x6e, 0x6f, 0x72, 0x74, 0x68,
+  0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63,
+  0x68, 0x20, 0x77, 0x61, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x20, 0x6f,
+  0x66, 0x20, 0x74, 0x68, 0x65, 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72,
+  0x77, 0x69, 0x73, 0x65, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d,
+  0x20, 0x6f, 0x66, 0x68, 0x61, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65,
+  0x65, 0x6e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62,
+  0x79, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
+  0x70, 0x65, 0x72, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x69,
+  0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x64, 0x65,
+  0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x65, 0x6e, 0x74,
+  0x65, 0x72, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x74, 0x68, 0x65, 0x20,
+  0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x63, 0x6f, 0x6e, 0x73, 0x69,
+  0x73, 0x74, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x61, 0x72, 0x65, 0x20, 0x6b, 0x6e,
+  0x6f, 0x77, 0x6e, 0x20, 0x61, 0x73, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x65,
+  0x6c, 0x64, 0x20, 0x6f, 0x66, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x79, 0x70,
+  0x65, 0x20, 0x6f, 0x66, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x74, 0x6f, 0x20,
+  0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x20,
+  0x6f, 0x66, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x74, 0x68,
+  0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x66,
+  0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x74, 0x68, 0x64,
+  0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x61, 0x72,
+  0x65, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x63, 0x6f, 0x72,
+  0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x77, 0x61, 0x73, 0x20,
+  0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6f, 0x6e, 0x65, 0x20, 0x6f,
+  0x66, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x70,
+  0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x73, 0x75, 0x63, 0x63, 0x65, 0x65, 0x64,
+  0x65, 0x64, 0x20, 0x69, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20,
+  0x66, 0x72, 0x6f, 0x6d, 0x69, 0x6e, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72,
+  0x65, 0x6e, 0x74, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x20,
+  0x62, 0x79, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x66, 0x6f,
+  0x72, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x20, 0x6f, 0x66,
+  0x61, 0x6e, 0x64, 0x20, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x79, 0x73,
+  0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x69, 0x7a, 0x65, 0x64, 0x72, 0x65,
+  0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x65, 0x78, 0x74, 0x77, 0x61, 0x73,
+  0x20, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x72, 0x65, 0x63, 0x65,
+  0x69, 0x76, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x61, 0x73, 0x73, 0x75, 0x6d,
+  0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x61, 0x72, 0x65, 0x61, 0x73, 0x20,
+  0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x69,
+  0x6c, 0x79, 0x20, 0x69, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x62, 0x61, 0x73, 0x69,
+  0x73, 0x20, 0x6f, 0x66, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65,
+  0x6e, 0x73, 0x65, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x66,
+  0x6f, 0x72, 0x64, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x65, 0x64, 0x20, 0x62,
+  0x79, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x74, 0x77, 0x6f,
+  0x77, 0x61, 0x73, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x63,
+  0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x53, 0x65,
+  0x63, 0x72, 0x65, 0x74, 0x61, 0x72, 0x79, 0x20, 0x6f, 0x66, 0x61, 0x70, 0x70,
+  0x65, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x6d, 0x61, 0x72, 0x67,
+  0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x31, 0x2f, 0x5e, 0x5c, 0x73, 0x2b,
+  0x7c, 0x5c, 0x73, 0x2b, 0x24, 0x2f, 0x67, 0x65, 0x29, 0x7b, 0x74, 0x68, 0x72,
+  0x6f, 0x77, 0x20, 0x65, 0x7d, 0x3b, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61,
+  0x72, 0x74, 0x20, 0x6f, 0x66, 0x74, 0x77, 0x6f, 0x20, 0x73, 0x65, 0x70, 0x61,
+  0x72, 0x61, 0x74, 0x65, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x20,
+  0x61, 0x6e, 0x64, 0x77, 0x68, 0x6f, 0x20, 0x68, 0x61, 0x64, 0x20, 0x62, 0x65,
+  0x65, 0x6e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f,
+  0x66, 0x64, 0x65, 0x61, 0x74, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65,
+  0x72, 0x65, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x09,
+  0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x70, 0x72,
+  0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x65,
+  0x20, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x6f, 0x66, 0x63, 0x6f, 0x6d, 0x70,
+  0x65, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x67, 0x6c, 0x69,
+  0x73, 0x68, 0x20, 0x28, 0x55, 0x4b, 0x29, 0x65, 0x6e, 0x67, 0x6c, 0x69, 0x73,
+  0x68, 0x20, 0x28, 0x55, 0x53, 0x29, 0xd0, 0x9c, 0xd0, 0xbe, 0xd0, 0xbd, 0xd0,
+  0xb3, 0xd0, 0xbe, 0xd0, 0xbb, 0xd0, 0xa1, 0xd1, 0x80, 0xd0, 0xbf, 0xd1, 0x81,
+  0xd0, 0xba, 0xd0, 0xb8, 0xd1, 0x81, 0xd1, 0x80, 0xd0, 0xbf, 0xd1, 0x81, 0xd0,
+  0xba, 0xd0, 0xb8, 0xd1, 0x81, 0xd1, 0x80, 0xd0, 0xbf, 0xd1, 0x81, 0xd0, 0xba,
+  0xd0, 0xbe, 0xd9, 0x84, 0xd8, 0xb9, 0xd8, 0xb1, 0xd8, 0xa8, 0xd9, 0x8a, 0xd8,
+  0xa9, 0xe6, 0xad, 0xa3, 0xe9, 0xab, 0x94, 0xe4, 0xb8, 0xad, 0xe6, 0x96, 0x87,
+  0xe7, 0xae, 0x80, 0xe4, 0xbd, 0x93, 0xe4, 0xb8, 0xad, 0xe6, 0x96, 0x87, 0xe7,
+  0xb9, 0x81, 0xe4, 0xbd, 0x93, 0xe4, 0xb8, 0xad, 0xe6, 0x96, 0x87, 0xe6, 0x9c,
+  0x89, 0xe9, 0x99, 0x90, 0xe5, 0x85, 0xac, 0xe5, 0x8f, 0xb8, 0xe4, 0xba, 0xba,
+  0xe6, 0xb0, 0x91, 0xe6, 0x94, 0xbf, 0xe5, 0xba, 0x9c, 0xe9, 0x98, 0xbf, 0xe9,
+  0x87, 0x8c, 0xe5, 0xb7, 0xb4, 0xe5, 0xb7, 0xb4, 0xe7, 0xa4, 0xbe, 0xe4, 0xbc,
+  0x9a, 0xe4, 0xb8, 0xbb, 0xe4, 0xb9, 0x89, 0xe6, 0x93, 0x8d, 0xe4, 0xbd, 0x9c,
+  0xe7, 0xb3, 0xbb, 0xe7, 0xbb, 0x9f, 0xe6, 0x94, 0xbf, 0xe7, 0xad, 0x96, 0xe6,
+  0xb3, 0x95, 0xe8, 0xa7, 0x84, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x63,
+  0x69, 0xc3, 0xb3, 0x6e, 0x68, 0x65, 0x72, 0x72, 0x61, 0x6d, 0x69, 0x65, 0x6e,
+  0x74, 0x61, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0xc3, 0xb3, 0x6e, 0x69,
+  0x63, 0x6f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x63, 0x69, 0xc3, 0xb3,
+  0x6e, 0x63, 0x6c, 0x61, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x64, 0x6f, 0x73,
+  0x63, 0x6f, 0x6e, 0x6f, 0x63, 0x69, 0x6d, 0x69, 0x65, 0x6e, 0x74, 0x6f, 0x70,
+  0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x72, 0x65,
+  0x6c, 0x61, 0x63, 0x69, 0x6f, 0x6e, 0x61, 0x64, 0x61, 0x73, 0x69, 0x6e, 0x66,
+  0x6f, 0x72, 0x6d, 0xc3, 0xa1, 0x74, 0x69, 0x63, 0x61, 0x72, 0x65, 0x6c, 0x61,
+  0x63, 0x69, 0x6f, 0x6e, 0x61, 0x64, 0x6f, 0x73, 0x64, 0x65, 0x70, 0x61, 0x72,
+  0x74, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x6f, 0x74, 0x72, 0x61, 0x62, 0x61, 0x6a,
+  0x61, 0x64, 0x6f, 0x72, 0x65, 0x73, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x61,
+  0x6d, 0x65, 0x6e, 0x74, 0x65, 0x61, 0x79, 0x75, 0x6e, 0x74, 0x61, 0x6d, 0x69,
+  0x65, 0x6e, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x63, 0x61, 0x64, 0x6f, 0x4c, 0x69,
+  0x62, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x74, 0xc3, 0xa1, 0x63, 0x74, 0x65, 0x6e,
+  0x6f, 0x73, 0x68, 0x61, 0x62, 0x69, 0x74, 0x61, 0x63, 0x69, 0x6f, 0x6e, 0x65,
+  0x73, 0x63, 0x75, 0x6d, 0x70, 0x6c, 0x69, 0x6d, 0x69, 0x65, 0x6e, 0x74, 0x6f,
+  0x72, 0x65, 0x73, 0x74, 0x61, 0x75, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x73, 0x64,
+  0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x63, 0x6f,
+  0x6e, 0x73, 0x65, 0x63, 0x75, 0x65, 0x6e, 0x63, 0x69, 0x61, 0x65, 0x6c, 0x65,
+  0x63, 0x74, 0x72, 0xc3, 0xb3, 0x6e, 0x69, 0x63, 0x61, 0x61, 0x70, 0x6c, 0x69,
+  0x63, 0x61, 0x63, 0x69, 0x6f, 0x6e, 0x65, 0x73, 0x64, 0x65, 0x73, 0x63, 0x6f,
+  0x6e, 0x65, 0x63, 0x74, 0x61, 0x64, 0x6f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c,
+  0x61, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x72, 0x65, 0x61, 0x6c, 0x69, 0x7a, 0x61,
+  0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x63,
+  0x69, 0xc3, 0xb3, 0x6e, 0x65, 0x6e, 0x63, 0x69, 0x63, 0x6c, 0x6f, 0x70, 0x65,
+  0x64, 0x69, 0x61, 0x65, 0x6e, 0x66, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x61, 0x64,
+  0x65, 0x73, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x6f,
+  0x73, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x65, 0x6e, 0x63, 0x69, 0x61, 0x73,
+  0x69, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x70,
+  0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x65, 0x73, 0x73, 0x75,
+  0x62, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x61, 0xd1, 0x82, 0xd0,
+  0xbe, 0xd0, 0xbb, 0xd1, 0x8c, 0xd0, 0xba, 0xd0, 0xbe, 0xd0, 0xa0, 0xd0, 0xbe,
+  0xd1, 0x81, 0xd1, 0x81, 0xd0, 0xb8, 0xd0, 0xb8, 0xd1, 0x80, 0xd0, 0xb0, 0xd0,
+  0xb1, 0xd0, 0xbe, 0xd1, 0x82, 0xd1, 0x8b, 0xd0, 0xb1, 0xd0, 0xbe, 0xd0, 0xbb,
+  0xd1, 0x8c, 0xd1, 0x88, 0xd0, 0xb5, 0xd0, 0xbf, 0xd1, 0x80, 0xd0, 0xbe, 0xd1,
+  0x81, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xbc, 0xd0, 0xbe, 0xd0, 0xb6, 0xd0, 0xb5,
+  0xd1, 0x82, 0xd0, 0xb5, 0xd0, 0xb4, 0xd1, 0x80, 0xd1, 0x83, 0xd0, 0xb3, 0xd0,
+  0xb8, 0xd1, 0x85, 0xd1, 0x81, 0xd0, 0xbb, 0xd1, 0x83, 0xd1, 0x87, 0xd0, 0xb0,
+  0xd0, 0xb5, 0xd1, 0x81, 0xd0, 0xb5, 0xd0, 0xb9, 0xd1, 0x87, 0xd0, 0xb0, 0xd1,
+  0x81, 0xd0, 0xb2, 0xd1, 0x81, 0xd0, 0xb5, 0xd0, 0xb3, 0xd0, 0xb4, 0xd0, 0xb0,
+  0xd0, 0xa0, 0xd0, 0xbe, 0xd1, 0x81, 0xd1, 0x81, 0xd0, 0xb8, 0xd1, 0x8f, 0xd0,
+  0x9c, 0xd0, 0xbe, 0xd1, 0x81, 0xd0, 0xba, 0xd0, 0xb2, 0xd0, 0xb5, 0xd0, 0xb4,
+  0xd1, 0x80, 0xd1, 0x83, 0xd0, 0xb3, 0xd0, 0xb8, 0xd0, 0xb5, 0xd0, 0xb3, 0xd0,
+  0xbe, 0xd1, 0x80, 0xd0, 0xbe, 0xd0, 0xb4, 0xd0, 0xb0, 0xd0, 0xb2, 0xd0, 0xbe,
+  0xd0, 0xbf, 0xd1, 0x80, 0xd0, 0xbe, 0xd1, 0x81, 0xd0, 0xb4, 0xd0, 0xb0, 0xd0,
+  0xbd, 0xd0, 0xbd, 0xd1, 0x8b, 0xd1, 0x85, 0xd0, 0xb4, 0xd0, 0xbe, 0xd0, 0xbb,
+  0xd0, 0xb6, 0xd0, 0xbd, 0xd1, 0x8b, 0xd0, 0xb8, 0xd0, 0xbc, 0xd0, 0xb5, 0xd0,
+  0xbd, 0xd0, 0xbd, 0xd0, 0xbe, 0xd0, 0x9c, 0xd0, 0xbe, 0xd1, 0x81, 0xd0, 0xba,
+  0xd0, 0xb2, 0xd1, 0x8b, 0xd1, 0x80, 0xd1, 0x83, 0xd0, 0xb1, 0xd0, 0xbb, 0xd0,
+  0xb5, 0xd0, 0xb9, 0xd0, 0x9c, 0xd0, 0xbe, 0xd1, 0x81, 0xd0, 0xba, 0xd0, 0xb2,
+  0xd0, 0xb0, 0xd1, 0x81, 0xd1, 0x82, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xbd, 0xd1,
+  0x8b, 0xd0, 0xbd, 0xd0, 0xb8, 0xd1, 0x87, 0xd0, 0xb5, 0xd0, 0xb3, 0xd0, 0xbe,
+  0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xb1, 0xd0, 0xbe, 0xd1, 0x82, 0xd0, 0xb5, 0xd0,
+  0xb4, 0xd0, 0xbe, 0xd0, 0xbb, 0xd0, 0xb6, 0xd0, 0xb5, 0xd0, 0xbd, 0xd1, 0x83,
+  0xd1, 0x81, 0xd0, 0xbb, 0xd1, 0x83, 0xd0, 0xb3, 0xd0, 0xb8, 0xd1, 0x82, 0xd0,
+  0xb5, 0xd0, 0xbf, 0xd0, 0xb5, 0xd1, 0x80, 0xd1, 0x8c, 0xd0, 0x9e, 0xd0, 0xb4,
+  0xd0, 0xbd, 0xd0, 0xb0, 0xd0, 0xba, 0xd0, 0xbe, 0xd0, 0xbf, 0xd0, 0xbe, 0xd1,
+  0x82, 0xd0, 0xbe, 0xd0, 0xbc, 0xd1, 0x83, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xb1,
+  0xd0, 0xbe, 0xd1, 0x82, 0xd1, 0x83, 0xd0, 0xb0, 0xd0, 0xbf, 0xd1, 0x80, 0xd0,
+  0xb5, 0xd0, 0xbb, 0xd1, 0x8f, 0xd0, 0xb2, 0xd0, 0xbe, 0xd0, 0xbe, 0xd0, 0xb1,
+  0xd1, 0x89, 0xd0, 0xb5, 0xd0, 0xbe, 0xd0, 0xb4, 0xd0, 0xbd, 0xd0, 0xbe, 0xd0,
+  0xb3, 0xd0, 0xbe, 0xd1, 0x81, 0xd0, 0xb2, 0xd0, 0xbe, 0xd0, 0xb5, 0xd0, 0xb3,
+  0xd0, 0xbe, 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb0, 0xd1, 0x82, 0xd1, 0x8c, 0xd0,
+  0xb8, 0xd0, 0xb4, 0xd1, 0x80, 0xd1, 0x83, 0xd0, 0xb3, 0xd0, 0xbe, 0xd0, 0xb9,
+  0xd1, 0x84, 0xd0, 0xbe, 0xd1, 0x80, 0xd1, 0x83, 0xd0, 0xbc, 0xd0, 0xb5, 0xd1,
+  0x85, 0xd0, 0xbe, 0xd1, 0x80, 0xd0, 0xbe, 0xd1, 0x88, 0xd0, 0xbe, 0xd0, 0xbf,
+  0xd1, 0x80, 0xd0, 0xbe, 0xd1, 0x82, 0xd0, 0xb8, 0xd0, 0xb2, 0xd1, 0x81, 0xd1,
+  0x81, 0xd1, 0x8b, 0xd0, 0xbb, 0xd0, 0xba, 0xd0, 0xb0, 0xd0, 0xba, 0xd0, 0xb0,
+  0xd0, 0xb6, 0xd0, 0xb4, 0xd1, 0x8b, 0xd0, 0xb9, 0xd0, 0xb2, 0xd0, 0xbb, 0xd0,
+  0xb0, 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb8, 0xd0, 0xb3, 0xd1, 0x80, 0xd1, 0x83,
+  0xd0, 0xbf, 0xd0, 0xbf, 0xd1, 0x8b, 0xd0, 0xb2, 0xd0, 0xbc, 0xd0, 0xb5, 0xd1,
+  0x81, 0xd1, 0x82, 0xd0, 0xb5, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xb1, 0xd0, 0xbe,
+  0xd1, 0x82, 0xd0, 0xb0, 0xd1, 0x81, 0xd0, 0xba, 0xd0, 0xb0, 0xd0, 0xb7, 0xd0,
+  0xb0, 0xd0, 0xbb, 0xd0, 0xbf, 0xd0, 0xb5, 0xd1, 0x80, 0xd0, 0xb2, 0xd1, 0x8b,
+  0xd0, 0xb9, 0xd0, 0xb4, 0xd0, 0xb5, 0xd0, 0xbb, 0xd0, 0xb0, 0xd1, 0x82, 0xd1,
+  0x8c, 0xd0, 0xb4, 0xd0, 0xb5, 0xd0, 0xbd, 0xd1, 0x8c, 0xd0, 0xb3, 0xd0, 0xb8,
+  0xd0, 0xbf, 0xd0, 0xb5, 0xd1, 0x80, 0xd0, 0xb8, 0xd0, 0xbe, 0xd0, 0xb4, 0xd0,
+  0xb1, 0xd0, 0xb8, 0xd0, 0xb7, 0xd0, 0xbd, 0xd0, 0xb5, 0xd1, 0x81, 0xd0, 0xbe,
+  0xd1, 0x81, 0xd0, 0xbd, 0xd0, 0xbe, 0xd0, 0xb2, 0xd0, 0xb5, 0xd0, 0xbc, 0xd0,
+  0xbe, 0xd0, 0xbc, 0xd0, 0xb5, 0xd0, 0xbd, 0xd1, 0x82, 0xd0, 0xba, 0xd1, 0x83,
+  0xd0, 0xbf, 0xd0, 0xb8, 0xd1, 0x82, 0xd1, 0x8c, 0xd0, 0xb4, 0xd0, 0xbe, 0xd0,
+  0xbb, 0xd0, 0xb6, 0xd0, 0xbd, 0xd0, 0xb0, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xbc,
+  0xd0, 0xba, 0xd0, 0xb0, 0xd1, 0x85, 0xd0, 0xbd, 0xd0, 0xb0, 0xd1, 0x87, 0xd0,
+  0xb0, 0xd0, 0xbb, 0xd0, 0xbe, 0xd0, 0xa0, 0xd0, 0xb0, 0xd0, 0xb1, 0xd0, 0xbe,
+  0xd1, 0x82, 0xd0, 0xb0, 0xd0, 0xa2, 0xd0, 0xbe, 0xd0, 0xbb, 0xd1, 0x8c, 0xd0,
+  0xba, 0xd0, 0xbe, 0xd1, 0x81, 0xd0, 0xbe, 0xd0, 0xb2, 0xd1, 0x81, 0xd0, 0xb5,
+  0xd0, 0xbc, 0xd0, 0xb2, 0xd1, 0x82, 0xd0, 0xbe, 0xd1, 0x80, 0xd0, 0xbe, 0xd0,
+  0xb9, 0xd0, 0xbd, 0xd0, 0xb0, 0xd1, 0x87, 0xd0, 0xb0, 0xd0, 0xbb, 0xd0, 0xb0,
+  0xd1, 0x81, 0xd0, 0xbf, 0xd0, 0xb8, 0xd1, 0x81, 0xd0, 0xbe, 0xd0, 0xba, 0xd1,
+  0x81, 0xd0, 0xbb, 0xd1, 0x83, 0xd0, 0xb6, 0xd0, 0xb1, 0xd1, 0x8b, 0xd1, 0x81,
+  0xd0, 0xb8, 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb5, 0xd0, 0xbc, 0xd0, 0xbf, 0xd0,
+  0xb5, 0xd1, 0x87, 0xd0, 0xb0, 0xd1, 0x82, 0xd0, 0xb8, 0xd0, 0xbd, 0xd0, 0xbe,
+  0xd0, 0xb2, 0xd0, 0xbe, 0xd0, 0xb3, 0xd0, 0xbe, 0xd0, 0xbf, 0xd0, 0xbe, 0xd0,
+  0xbc, 0xd0, 0xbe, 0xd1, 0x89, 0xd0, 0xb8, 0xd1, 0x81, 0xd0, 0xb0, 0xd0, 0xb9,
+  0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xb2, 0xd0, 0xbf, 0xd0, 0xbe, 0xd1, 0x87, 0xd0,
+  0xb5, 0xd0, 0xbc, 0xd1, 0x83, 0xd0, 0xbf, 0xd0, 0xbe, 0xd0, 0xbc, 0xd0, 0xbe,
+  0xd1, 0x89, 0xd1, 0x8c, 0xd0, 0xb4, 0xd0, 0xbe, 0xd0, 0xbb, 0xd0, 0xb6, 0xd0,
+  0xbd, 0xd0, 0xbe, 0xd1, 0x81, 0xd1, 0x81, 0xd1, 0x8b, 0xd0, 0xbb, 0xd0, 0xba,
+  0xd0, 0xb8, 0xd0, 0xb1, 0xd1, 0x8b, 0xd1, 0x81, 0xd1, 0x82, 0xd1, 0x80, 0xd0,
+  0xbe, 0xd0, 0xb4, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xbd, 0xd1, 0x8b, 0xd0, 0xb5,
+  0xd0, 0xbc, 0xd0, 0xbd, 0xd0, 0xbe, 0xd0, 0xb3, 0xd0, 0xb8, 0xd0, 0xb5, 0xd0,
+  0xbf, 0xd1, 0x80, 0xd0, 0xbe, 0xd0, 0xb5, 0xd0, 0xba, 0xd1, 0x82, 0xd0, 0xa1,
+  0xd0, 0xb5, 0xd0, 0xb9, 0xd1, 0x87, 0xd0, 0xb0, 0xd1, 0x81, 0xd0, 0xbc, 0xd0,
+  0xbe, 0xd0, 0xb4, 0xd0, 0xb5, 0xd0, 0xbb, 0xd0, 0xb8, 0xd1, 0x82, 0xd0, 0xb0,
+  0xd0, 0xba, 0xd0, 0xbe, 0xd0, 0xb3, 0xd0, 0xbe, 0xd0, 0xbe, 0xd0, 0xbd, 0xd0,
+  0xbb, 0xd0, 0xb0, 0xd0, 0xb9, 0xd0, 0xbd, 0xd0, 0xb3, 0xd0, 0xbe, 0xd1, 0x80,
+  0xd0, 0xbe, 0xd0, 0xb4, 0xd0, 0xb5, 0xd0, 0xb2, 0xd0, 0xb5, 0xd1, 0x80, 0xd1,
+  0x81, 0xd0, 0xb8, 0xd1, 0x8f, 0xd1, 0x81, 0xd1, 0x82, 0xd1, 0x80, 0xd0, 0xb0,
+  0xd0, 0xbd, 0xd0, 0xb5, 0xd1, 0x84, 0xd0, 0xb8, 0xd0, 0xbb, 0xd1, 0x8c, 0xd0,
+  0xbc, 0xd1, 0x8b, 0xd1, 0x83, 0xd1, 0x80, 0xd0, 0xbe, 0xd0, 0xb2, 0xd0, 0xbd,
+  0xd1, 0x8f, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xb7, 0xd0, 0xbd, 0xd1, 0x8b, 0xd1,
+  0x85, 0xd0, 0xb8, 0xd1, 0x81, 0xd0, 0xba, 0xd0, 0xb0, 0xd1, 0x82, 0xd1, 0x8c,
+  0xd0, 0xbd, 0xd0, 0xb5, 0xd0, 0xb4, 0xd0, 0xb5, 0xd0, 0xbb, 0xd1, 0x8e, 0xd1,
+  0x8f, 0xd0, 0xbd, 0xd0, 0xb2, 0xd0, 0xb0, 0xd1, 0x80, 0xd1, 0x8f, 0xd0, 0xbc,
+  0xd0, 0xb5, 0xd0, 0xbd, 0xd1, 0x8c, 0xd1, 0x88, 0xd0, 0xb5, 0xd0, 0xbc, 0xd0,
+  0xbd, 0xd0, 0xbe, 0xd0, 0xb3, 0xd0, 0xb8, 0xd1, 0x85, 0xd0, 0xb4, 0xd0, 0xb0,
+  0xd0, 0xbd, 0xd0, 0xbd, 0xd0, 0xbe, 0xd0, 0xb9, 0xd0, 0xb7, 0xd0, 0xbd, 0xd0,
+  0xb0, 0xd1, 0x87, 0xd0, 0xb8, 0xd1, 0x82, 0xd0, 0xbd, 0xd0, 0xb5, 0xd0, 0xbb,
+  0xd1, 0x8c, 0xd0, 0xb7, 0xd1, 0x8f, 0xd1, 0x84, 0xd0, 0xbe, 0xd1, 0x80, 0xd1,
+  0x83, 0xd0, 0xbc, 0xd0, 0xb0, 0xd0, 0xa2, 0xd0, 0xb5, 0xd0, 0xbf, 0xd0, 0xb5,
+  0xd1, 0x80, 0xd1, 0x8c, 0xd0, 0xbc, 0xd0, 0xb5, 0xd1, 0x81, 0xd1, 0x8f, 0xd1,
+  0x86, 0xd0, 0xb0, 0xd0, 0xb7, 0xd0, 0xb0, 0xd1, 0x89, 0xd0, 0xb8, 0xd1, 0x82,
+  0xd1, 0x8b, 0xd0, 0x9b, 0xd1, 0x83, 0xd1, 0x87, 0xd1, 0x88, 0xd0, 0xb8, 0xd0,
+  0xb5, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x82,
+  0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x87, 0xe0,
+  0xa4, 0x85, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4,
+  0x95, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x95,
+  0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x85, 0xe0,
+  0xa4, 0xa8, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0x95, 0xe0, 0xa5,
+  0x8d, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xbe,
+  0xe0, 0xa4, 0x87, 0xe0, 0xa4, 0xa1, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xbe, 0xe0,
+  0xa4, 0xb0, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4,
+  0xb8, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xaf,
+  0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xb2, 0xe0,
+  0xa5, 0x87, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x82, 0xe0, 0xa4,
+  0xb9, 0xe0, 0xa4, 0xad, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa4,
+  0xe0, 0xa4, 0x85, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x80, 0xe0,
+  0xa4, 0xb5, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x87, 0xe0, 0xa4,
+  0xb8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x95,
+  0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xae, 0xe0,
+  0xa5, 0x87, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5,
+  0x8b, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x95,
+  0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xb9, 0xe0,
+  0xa5, 0x81, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4,
+  0x87, 0xe0, 0xa4, 0x9f, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x97,
+  0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa8, 0xe0,
+  0xa5, 0x87, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4,
+  0x9f, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xbe,
+  0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xbe, 0xe0,
+  0xa4, 0x89, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x87, 0xe0, 0xa4,
+  0xaf, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x81, 0xe0, 0xa4, 0xb8,
+  0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xad, 0xe0,
+  0xa4, 0xbe, 0xe0, 0xa4, 0xb7, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x86, 0xe0, 0xa4,
+  0xaa, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xbf,
+  0xe0, 0xa4, 0xaf, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb6, 0xe0, 0xa5, 0x81, 0xe0,
+  0xa4, 0xb0, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0x87, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4,
+  0x95, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x98, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x9f,
+  0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xae, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb0, 0xe0,
+  0xa5, 0x80, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4,
+  0xbe, 0xe0, 0xa4, 0xae, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xbe,
+  0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xb0, 0xe0,
+  0xa4, 0x85, 0xe0, 0xa4, 0xa7, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x95, 0xe0, 0xa4,
+  0x85, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb8,
+  0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xae, 0xe0,
+  0xa5, 0x81, 0xe0, 0xa4, 0x9d, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x95, 0xe0, 0xa4,
+  0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa3, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x8b,
+  0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xa1, 0xe0,
+  0xa4, 0xbc, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4,
+  0xbe, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x9f,
+  0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xb6, 0xe0, 0xa4, 0xac, 0xe0, 0xa5, 0x8d, 0xe0,
+  0xa4, 0xa6, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4,
+  0xbe, 0xe0, 0xa4, 0x9c, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xa8,
+  0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xbe, 0xe0,
+  0xa4, 0x95, 0xe0, 0xa5, 0x88, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4,
+  0x86, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb5,
+  0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xa6, 0xe0,
+  0xa5, 0x87, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xaa, 0xe0, 0xa5,
+  0x82, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xbe,
+  0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x89, 0xe0, 0xa4, 0xb8, 0xe0,
+  0xa4, 0x95, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4,
+  0x97, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xac, 0xe0, 0xa5, 0x88, 0xe0, 0xa4, 0xa0,
+  0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0x86, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0x95, 0xe0,
+  0xa5, 0x80, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4,
+  0xb7, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xb5,
+  0xe0, 0xa4, 0x86, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8b, 0xe0,
+  0xa4, 0x9c, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4,
+  0x9c, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb8,
+  0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xb9, 0xe0,
+  0xa4, 0xae, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x89, 0xe0, 0xa4,
+  0xa8, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xbe,
+  0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0xb0, 0xe0,
+  0xa5, 0x8d, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x82, 0xe0, 0xa4,
+  0x9a, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x82,
+  0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbe, 0xe0,
+  0xa4, 0xb2, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4,
+  0xbe, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x80,
+  0xe0, 0xa4, 0x9c, 0xe0, 0xa5, 0x88, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x87, 0xe0,
+  0xa4, 0xb5, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4,
+  0x9c, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa8,
+  0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x9c, 0xe0,
+  0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x98, 0xe0, 0xa4,
+  0xbe, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xbf,
+  0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x80, 0xe0,
+  0xa4, 0x9a, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4,
+  0x82, 0xe0, 0xa4, 0x9a, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x8d,
+  0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x97, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0x97, 0xe0,
+  0xa4, 0xb2, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5,
+  0x87, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xb0,
+  0xe0, 0xa4, 0x86, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x87, 0xe0,
+  0xa4, 0xb5, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4,
+  0x87, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb8,
+  0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xb0, 0xe0,
+  0xa4, 0xb9, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x87, 0xe0, 0xa4,
+  0xb8, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xb9,
+  0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xa1, 0xe0,
+  0xa4, 0xbc, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x98, 0xe0, 0xa4, 0x9f, 0xe0, 0xa4,
+  0xa8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xbe,
+  0xe0, 0xa4, 0xb6, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x82, 0xe0,
+  0xa4, 0x9a, 0xe0, 0xa4, 0xb6, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5,
+  0x80, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xa1, 0xe0, 0xa4, 0xbc, 0xe0, 0xa5, 0x80,
+  0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x87, 0xe0,
+  0xa4, 0xb8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x88, 0xe0, 0xa4, 0x9f, 0xe0, 0xa4,
+  0xb6, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0xb8,
+  0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x9c, 0xe0,
+  0xa4, 0xbe, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4,
+  0xbe, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0x9c,
+  0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0x9f, 0xe0,
+  0xa4, 0xa8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x96, 0xe0, 0xa4,
+  0xa8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xa1, 0xe0, 0xa4, 0xbc,
+  0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xb2, 0xe0,
+  0xa4, 0xbe, 0xe0, 0xa4, 0x89, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x95, 0xe0, 0xa5,
+  0x80, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xb2,
+  0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xbe, 0xe0,
+  0xa4, 0x96, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4,
+  0x85, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa5, 0xe0, 0xa4, 0x9c,
+  0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xa6, 0xe0,
+  0xa5, 0x87, 0xe0, 0xa4, 0x96, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4,
+  0xb9, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xbf,
+  0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xbf, 0xe0,
+  0xa4, 0xa8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xac, 0xe0, 0xa5, 0x88, 0xe0, 0xa4,
+  0x82, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x80,
+  0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xa8, 0xe0,
+  0xa4, 0xbe, 0xe0, 0xa4, 0xa6, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4,
+  0xbe, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x87,
+  0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xab, 0xe0, 0xa5, 0x80, 0xe0,
+  0xa4, 0x9c, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4,
+  0xa4, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xae,
+  0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xb5, 0xe0,
+  0xa4, 0xb9, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5,
+  0x8b, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xbc, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbf,
+  0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x86, 0xe0, 0xa4, 0xb0, 0xe0,
+  0xa5, 0x8b, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4,
+  0xa8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa6,
+  0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xa8, 0xe0,
+  0xa5, 0x87, 0xe0, 0xa4, 0x96, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4,
+  0xbe, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xac,
+  0xe0, 0xa4, 0x89, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbe, 0xe0,
+  0xa4, 0x9c, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xac, 0xe0, 0xa4,
+  0xaa, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xac,
+  0xe0, 0xa4, 0xa1, 0xe0, 0xa4, 0xbc, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb8, 0xe0,
+  0xa5, 0x8c, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb6, 0xe0, 0xa5,
+  0x87, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbf,
+  0xe0, 0xa4, 0xaf, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xb9, 0xe0,
+  0xa4, 0xbe, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x85, 0xe0, 0xa4, 0x95, 0xe0, 0xa4,
+  0xb8, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xbe,
+  0xe0, 0xa4, 0x8f, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xbe, 0xe0,
+  0xa4, 0x82, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa5, 0xe0, 0xa4,
+  0xb2, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x87,
+  0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x96, 0xe0, 0xa4, 0x95, 0xe0,
+  0xa4, 0xb5, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xb7, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4,
+  0x95, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xb8,
+  0xe0, 0xa4, 0xae, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xa5, 0xe0,
+  0xa4, 0xbe, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xbe, 0xd8, 0xaa, 0xd8, 0xb3, 0xd8,
+  0xaa, 0xd8, 0xb7, 0xd9, 0x8a, 0xd8, 0xb9, 0xd9, 0x85, 0xd8, 0xb4, 0xd8, 0xa7,
+  0xd8, 0xb1, 0xd9, 0x83, 0xd8, 0xa9, 0xd8, 0xa8, 0xd9, 0x88, 0xd8, 0xa7, 0xd8,
+  0xb3, 0xd8, 0xb7, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb5, 0xd9, 0x81,
+  0xd8, 0xad, 0xd8, 0xa9, 0xd9, 0x85, 0xd9, 0x88, 0xd8, 0xa7, 0xd8, 0xb6, 0xd9,
+  0x8a, 0xd8, 0xb9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xae, 0xd8, 0xa7, 0xd8, 0xb5,
+  0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd8, 0xb2, 0xd9, 0x8a, 0xd8,
+  0xaf, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb9, 0xd8, 0xa7, 0xd9, 0x85, 0xd8, 0xa9,
+  0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x83, 0xd8, 0xa7, 0xd8, 0xaa, 0xd8, 0xa8, 0xd8,
+  0xa7, 0xd9, 0x84, 0xd8, 0xb1, 0xd8, 0xaf, 0xd9, 0x88, 0xd8, 0xaf, 0xd8, 0xa8,
+  0xd8, 0xb1, 0xd9, 0x86, 0xd8, 0xa7, 0xd9, 0x85, 0xd8, 0xac, 0xd8, 0xa7, 0xd9,
+  0x84, 0xd8, 0xaf, 0xd9, 0x88, 0xd9, 0x84, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84,
+  0xd8, 0xb9, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd8, 0xa7, 0xd9, 0x84, 0xd9,
+  0x85, 0xd9, 0x88, 0xd9, 0x82, 0xd8, 0xb9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb9,
+  0xd8, 0xb1, 0xd8, 0xa8, 0xd9, 0x8a, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb3, 0xd8,
+  0xb1, 0xd9, 0x8a, 0xd8, 0xb9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xac, 0xd9, 0x88,
+  0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb0, 0xd9, 0x87, 0xd8,
+  0xa7, 0xd8, 0xa8, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xad, 0xd9, 0x8a, 0xd8, 0xa7,
+  0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xad, 0xd9, 0x82, 0xd9, 0x88, 0xd9,
+  0x82, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x83, 0xd8, 0xb1, 0xd9, 0x8a, 0xd9, 0x85,
+  0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb9, 0xd8, 0xb1, 0xd8, 0xa7, 0xd9, 0x82, 0xd9,
+  0x85, 0xd8, 0xad, 0xd9, 0x81, 0xd9, 0x88, 0xd8, 0xb8, 0xd8, 0xa9, 0xd8, 0xa7,
+  0xd9, 0x84, 0xd8, 0xab, 0xd8, 0xa7, 0xd9, 0x86, 0xd9, 0x8a, 0xd9, 0x85, 0xd8,
+  0xb4, 0xd8, 0xa7, 0xd9, 0x87, 0xd8, 0xaf, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84,
+  0xd9, 0x85, 0xd8, 0xb1, 0xd8, 0xa3, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd9,
+  0x82, 0xd8, 0xb1, 0xd8, 0xa2, 0xd9, 0x86, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb4,
+  0xd8, 0xa8, 0xd8, 0xa7, 0xd8, 0xa8, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xad, 0xd9,
+  0x88, 0xd8, 0xa7, 0xd8, 0xb1, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xac, 0xd8, 0xaf,
+  0xd9, 0x8a, 0xd8, 0xaf, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa3, 0xd8, 0xb3, 0xd8,
+  0xb1, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb9, 0xd9, 0x84, 0xd9, 0x88,
+  0xd9, 0x85, 0xd9, 0x85, 0xd8, 0xac, 0xd9, 0x85, 0xd9, 0x88, 0xd8, 0xb9, 0xd8,
+  0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb1, 0xd8, 0xad, 0xd9, 0x85, 0xd9, 0x86,
+  0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x86, 0xd9, 0x82, 0xd8, 0xa7, 0xd8, 0xb7, 0xd9,
+  0x81, 0xd9, 0x84, 0xd8, 0xb3, 0xd8, 0xb7, 0xd9, 0x8a, 0xd9, 0x86, 0xd8, 0xa7,
+  0xd9, 0x84, 0xd9, 0x83, 0xd9, 0x88, 0xd9, 0x8a, 0xd8, 0xaa, 0xd8, 0xa7, 0xd9,
+  0x84, 0xd8, 0xaf, 0xd9, 0x86, 0xd9, 0x8a, 0xd8, 0xa7, 0xd8, 0xa8, 0xd8, 0xb1,
+  0xd9, 0x83, 0xd8, 0xa7, 0xd8, 0xaa, 0xd9, 0x87, 0xd8, 0xa7, 0xd9, 0x84, 0xd8,
+  0xb1, 0xd9, 0x8a, 0xd8, 0xa7, 0xd8, 0xb6, 0xd8, 0xaa, 0xd8, 0xad, 0xd9, 0x8a,
+  0xd8, 0xa7, 0xd8, 0xaa, 0xd9, 0x8a, 0xd8, 0xa8, 0xd8, 0xaa, 0xd9, 0x88, 0xd9,
+  0x82, 0xd9, 0x8a, 0xd8, 0xaa, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa3, 0xd9, 0x88,
+  0xd9, 0x84, 0xd9, 0x89, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa8, 0xd8, 0xb1, 0xd9,
+  0x8a, 0xd8, 0xaf, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x83, 0xd9, 0x84, 0xd8, 0xa7,
+  0xd9, 0x85, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb1, 0xd8, 0xa7, 0xd8, 0xa8, 0xd8,
+  0xb7, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb4, 0xd8, 0xae, 0xd8, 0xb5, 0xd9, 0x8a,
+  0xd8, 0xb3, 0xd9, 0x8a, 0xd8, 0xa7, 0xd8, 0xb1, 0xd8, 0xa7, 0xd8, 0xaa, 0xd8,
+  0xa7, 0xd9, 0x84, 0xd8, 0xab, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xab, 0xd8, 0xa7,
+  0xd9, 0x84, 0xd8, 0xb5, 0xd9, 0x84, 0xd8, 0xa7, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9,
+  0x84, 0xd8, 0xad, 0xd8, 0xaf, 0xd9, 0x8a, 0xd8, 0xab, 0xd8, 0xa7, 0xd9, 0x84,
+  0xd8, 0xb2, 0xd9, 0x88, 0xd8, 0xa7, 0xd8, 0xb1, 0xd8, 0xa7, 0xd9, 0x84, 0xd8,
+  0xae, 0xd9, 0x84, 0xd9, 0x8a, 0xd8, 0xac, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xac,
+  0xd9, 0x85, 0xd9, 0x8a, 0xd8, 0xb9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb9, 0xd8,
+  0xa7, 0xd9, 0x85, 0xd9, 0x87, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xac, 0xd9, 0x85,
+  0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb3, 0xd8, 0xa7, 0xd8,
+  0xb9, 0xd8, 0xa9, 0xd9, 0x85, 0xd8, 0xb4, 0xd8, 0xa7, 0xd9, 0x87, 0xd8, 0xaf,
+  0xd9, 0x87, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb1, 0xd8, 0xa6, 0xd9, 0x8a, 0xd8,
+  0xb3, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xaf, 0xd8, 0xae, 0xd9, 0x88, 0xd9, 0x84,
+  0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x81, 0xd9, 0x86, 0xd9, 0x8a, 0xd8, 0xa9, 0xd8,
+  0xa7, 0xd9, 0x84, 0xd9, 0x83, 0xd8, 0xaa, 0xd8, 0xa7, 0xd8, 0xa8, 0xd8, 0xa7,
+  0xd9, 0x84, 0xd8, 0xaf, 0xd9, 0x88, 0xd8, 0xb1, 0xd9, 0x8a, 0xd8, 0xa7, 0xd9,
+  0x84, 0xd8, 0xaf, 0xd8, 0xb1, 0xd9, 0x88, 0xd8, 0xb3, 0xd8, 0xa7, 0xd8, 0xb3,
+  0xd8, 0xaa, 0xd8, 0xba, 0xd8, 0xb1, 0xd9, 0x82, 0xd8, 0xaa, 0xd8, 0xb5, 0xd8,
+  0xa7, 0xd9, 0x85, 0xd9, 0x8a, 0xd9, 0x85, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa8,
+  0xd9, 0x86, 0xd8, 0xa7, 0xd8, 0xaa, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb9, 0xd8,
+  0xb8, 0xd9, 0x8a, 0xd9, 0x85, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x74, 0x61, 0x69,
+  0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x74, 0x61,
+  0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74,
+  0x69, 0x6f, 0x6e, 0x28, 0x29, 0x2e, 0x6a, 0x70, 0x67, 0x22, 0x20, 0x77, 0x69,
+  0x64, 0x74, 0x68, 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x20, 0x77, 0x69,
+  0x64, 0x74, 0x68, 0x3d, 0x22, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x63, 0x6c,
+  0x61, 0x73, 0x73, 0x3d, 0x22, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e,
+  0x64, 0x6f, 0x6d, 0x28, 0x29, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6d, 0x70, 0x6f,
+  0x72, 0x61, 0x72, 0x79, 0x20, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x53,
+  0x74, 0x61, 0x74, 0x65, 0x73, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x73, 0x74,
+  0x61, 0x6e, 0x63, 0x65, 0x73, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x43,
+  0x68, 0x69, 0x6c, 0x64, 0x28, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61,
+  0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c,
+  0x61, 0x73, 0x73, 0x3d, 0x22, 0x22, 0x3e, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73,
+  0x72, 0x63, 0x3d, 0x22, 0x2f, 0x64, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x75,
+  0x69, 0x73, 0x68, 0x65, 0x64, 0x74, 0x68, 0x6f, 0x75, 0x73, 0x61, 0x6e, 0x64,
+  0x73, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x22, 0x3e, 0x3c,
+  0x2f, 0x64, 0x69, 0x76, 0x3e, 0x69, 0x6e, 0x76, 0x65, 0x73, 0x74, 0x69, 0x67,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x2e,
+  0x69, 0x63, 0x6f, 0x22, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x72,
+  0x69, 0x67, 0x68, 0x74, 0x3a, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x61, 0x73, 0x73, 0x61, 0x63, 0x68, 0x75,
+  0x73, 0x65, 0x74, 0x74, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x6f,
+  0x72, 0x64, 0x65, 0x72, 0x3d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74,
+  0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x6b, 0x6e, 0x6f,
+  0x77, 0x6e, 0x20, 0x61, 0x73, 0x70, 0x72, 0x6f, 0x6e, 0x75, 0x6e, 0x63, 0x69,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75,
+  0x6e, 0x64, 0x3a, 0x23, 0x66, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d,
+  0x6c, 0x65, 0x66, 0x74, 0x3a, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d,
+  0x70, 0x6c, 0x65, 0x2c, 0x20, 0x6d, 0x69, 0x73, 0x63, 0x65, 0x6c, 0x6c, 0x61,
+  0x6e, 0x65, 0x6f, 0x75, 0x73, 0x26, 0x6c, 0x74, 0x3b, 0x2f, 0x6d, 0x61, 0x74,
+  0x68, 0x26, 0x67, 0x74, 0x3b, 0x70, 0x73, 0x79, 0x63, 0x68, 0x6f, 0x6c, 0x6f,
+  0x67, 0x69, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69,
+  0x63, 0x75, 0x6c, 0x61, 0x72, 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, 0x20, 0x74,
+  0x79, 0x70, 0x65, 0x3d, 0x22, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x65, 0x74,
+  0x68, 0x6f, 0x64, 0x3d, 0x22, 0x61, 0x73, 0x20, 0x6f, 0x70, 0x70, 0x6f, 0x73,
+  0x65, 0x64, 0x20, 0x74, 0x6f, 0x53, 0x75, 0x70, 0x72, 0x65, 0x6d, 0x65, 0x20,
+  0x43, 0x6f, 0x75, 0x72, 0x74, 0x6f, 0x63, 0x63, 0x61, 0x73, 0x69, 0x6f, 0x6e,
+  0x61, 0x6c, 0x6c, 0x79, 0x20, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e,
+  0x61, 0x6c, 0x6c, 0x79, 0x2c, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x20, 0x41, 0x6d,
+  0x65, 0x72, 0x69, 0x63, 0x61, 0x70, 0x78, 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x67,
+  0x72, 0x6f, 0x75, 0x6e, 0x64, 0x6f, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x75, 0x6e,
+  0x69, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x74, 0x61, 0x69,
+  0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x74, 0x6f, 0x4c, 0x6f, 0x77, 0x65, 0x72,
+  0x43, 0x61, 0x73, 0x65, 0x28, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74,
+  0x75, 0x72, 0x69, 0x6e, 0x67, 0x70, 0x72, 0x6f, 0x66, 0x65, 0x73, 0x73, 0x69,
+  0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64,
+  0x20, 0x77, 0x69, 0x74, 0x68, 0x46, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x73, 0x74,
+  0x61, 0x6e, 0x63, 0x65, 0x2c, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x69,
+  0x6e, 0x67, 0x20, 0x6f, 0x66, 0x22, 0x20, 0x6d, 0x61, 0x78, 0x6c, 0x65, 0x6e,
+  0x67, 0x74, 0x68, 0x3d, 0x22, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66,
+  0x61, 0x6c, 0x73, 0x65, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x63, 0x69, 0x6f, 0x75,
+  0x73, 0x6e, 0x65, 0x73, 0x73, 0x4d, 0x65, 0x64, 0x69, 0x74, 0x65, 0x72, 0x72,
+  0x61, 0x6e, 0x65, 0x61, 0x6e, 0x65, 0x78, 0x74, 0x72, 0x61, 0x6f, 0x72, 0x64,
+  0x69, 0x6e, 0x61, 0x72, 0x79, 0x61, 0x73, 0x73, 0x61, 0x73, 0x73, 0x69, 0x6e,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x75, 0x62, 0x73, 0x65, 0x71, 0x75, 0x65,
+  0x6e, 0x74, 0x6c, 0x79, 0x20, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x74,
+  0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62,
+  0x65, 0x72, 0x20, 0x6f, 0x66, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x69, 0x67,
+  0x69, 0x6e, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65,
+  0x6e, 0x73, 0x69, 0x76, 0x65, 0x72, 0x65, 0x66, 0x65, 0x72, 0x73, 0x20, 0x74,
+  0x6f, 0x20, 0x74, 0x68, 0x65, 0x3c, 0x2f, 0x75, 0x6c, 0x3e, 0x0a, 0x3c, 0x2f,
+  0x64, 0x69, 0x76, 0x3e, 0x0a, 0x70, 0x68, 0x69, 0x6c, 0x6f, 0x73, 0x6f, 0x70,
+  0x68, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+  0x2e, 0x68, 0x72, 0x65, 0x66, 0x77, 0x61, 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c,
+  0x69, 0x73, 0x68, 0x65, 0x64, 0x53, 0x61, 0x6e, 0x20, 0x46, 0x72, 0x61, 0x6e,
+  0x63, 0x69, 0x73, 0x63, 0x6f, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,
+  0x6e, 0x28, 0x29, 0x7b, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d,
+  0x22, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x6f, 0x70, 0x68, 0x69, 0x73, 0x74, 0x69,
+  0x63, 0x61, 0x74, 0x65, 0x64, 0x6d, 0x61, 0x74, 0x68, 0x65, 0x6d, 0x61, 0x74,
+  0x69, 0x63, 0x61, 0x6c, 0x20, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a,
+  0x3c, 0x62, 0x6f, 0x64, 0x79, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x73,
+  0x20, 0x74, 0x68, 0x61, 0x74, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x63, 0x6f, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x72,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+  0x73, 0x68, 0x69, 0x70, 0x73, 0x6d, 0x61, 0x79, 0x20, 0x68, 0x61, 0x76, 0x65,
+  0x20, 0x62, 0x65, 0x65, 0x6e, 0x28, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61,
+  0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x54, 0x68, 0x69, 0x73, 0x20, 0x61, 0x72, 0x74,
+  0x69, 0x63, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20,
+  0x63, 0x61, 0x73, 0x65, 0x73, 0x70, 0x61, 0x72, 0x74, 0x73, 0x20, 0x6f, 0x66,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69,
+  0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x47, 0x72, 0x65, 0x61, 0x74, 0x20, 0x42, 0x72,
+  0x69, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x63, 0x65, 0x6c, 0x6c, 0x70, 0x61, 0x64,
+  0x64, 0x69, 0x6e, 0x67, 0x3d, 0x65, 0x71, 0x75, 0x69, 0x76, 0x61, 0x6c, 0x65,
+  0x6e, 0x74, 0x20, 0x74, 0x6f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c,
+  0x64, 0x65, 0x72, 0x3d, 0x22, 0x3b, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73,
+  0x69, 0x7a, 0x65, 0x3a, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x69, 0x66, 0x69, 0x63,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x65, 0x6c, 0x69, 0x65, 0x76, 0x65, 0x64,
+  0x20, 0x74, 0x68, 0x61, 0x74, 0x73, 0x75, 0x66, 0x66, 0x65, 0x72, 0x65, 0x64,
+  0x20, 0x66, 0x72, 0x6f, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x65,
+  0x64, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x6f,
+  0x66, 0x20, 0x74, 0x68, 0x65, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x20, 0x73,
+  0x72, 0x63, 0x3d, 0x22, 0x2f, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,
+  0x6e, 0x28, 0x29, 0x20, 0x7b, 0x61, 0x72, 0x65, 0x20, 0x61, 0x76, 0x61, 0x69,
+  0x6c, 0x61, 0x62, 0x6c, 0x65, 0x0a, 0x09, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20,
+  0x72, 0x65, 0x6c, 0x3d, 0x22, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x27, 0x68, 0x74,
+  0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74,
+  0x65, 0x64, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x69,
+  0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x22, 0x20, 0x61, 0x6c, 0x74, 0x3d, 0x22, 0x22,
+  0x20, 0x2f, 0x3e, 0x3c, 0x2f, 0x61, 0x72, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65,
+  0x72, 0x61, 0x6c, 0x6c, 0x79, 0x68, 0x61, 0x73, 0x20, 0x61, 0x6c, 0x73, 0x6f,
+  0x20, 0x62, 0x65, 0x65, 0x6e, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x70, 0x6f, 0x70,
+  0x75, 0x6c, 0x61, 0x72, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f,
+  0x6e, 0x64, 0x69, 0x6e, 0x67, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64,
+  0x20, 0x77, 0x69, 0x74, 0x68, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x62, 0x6f,
+  0x72, 0x64, 0x65, 0x72, 0x3a, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x73, 0x70,
+  0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x2e, 0x67, 0x69, 0x66, 0x22, 0x20, 0x77, 0x69,
+  0x64, 0x74, 0x68, 0x3d, 0x22, 0x3c, 0x69, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x20,
+  0x73, 0x72, 0x63, 0x3d, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x6c,
+  0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x62,
+  0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e,
+  0x67, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x6f, 0x67, 0x65, 0x74, 0x68, 0x65, 0x72,
+  0x20, 0x77, 0x69, 0x74, 0x68, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x78, 0x69, 0x6d,
+  0x61, 0x74, 0x65, 0x6c, 0x79, 0x70, 0x61, 0x72, 0x6c, 0x69, 0x61, 0x6d, 0x65,
+  0x6e, 0x74, 0x61, 0x72, 0x79, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x6e, 0x64,
+  0x20, 0x6d, 0x6f, 0x72, 0x65, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a,
+  0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x74, 0x72, 0x61, 0x64, 0x69, 0x74, 0x69, 0x6f,
+  0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x70, 0x72, 0x65, 0x64, 0x6f, 0x6d, 0x69, 0x6e,
+  0x61, 0x6e, 0x74, 0x6c, 0x79, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x7c, 0x26,
+  0x6e, 0x62, 0x73, 0x70, 0x3b, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, 0x2f,
+  0x73, 0x70, 0x61, 0x6e, 0x3e, 0x20, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x70, 0x61,
+  0x63, 0x69, 0x6e, 0x67, 0x3d, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x6e,
+  0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6f, 0x72, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74,
+  0x65, 0x6e, 0x74, 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x76, 0x65,
+  0x72, 0x73, 0x69, 0x61, 0x6c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+  0x3d, 0x22, 0x6f, 0x67, 0x3a, 0x2f, 0x78, 0x2d, 0x73, 0x68, 0x6f, 0x63, 0x6b,
+  0x77, 0x61, 0x76, 0x65, 0x2d, 0x64, 0x65, 0x6d, 0x6f, 0x6e, 0x73, 0x74, 0x72,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x75, 0x72, 0x72, 0x6f, 0x75, 0x6e, 0x64,
+  0x65, 0x64, 0x20, 0x62, 0x79, 0x4e, 0x65, 0x76, 0x65, 0x72, 0x74, 0x68, 0x65,
+  0x6c, 0x65, 0x73, 0x73, 0x2c, 0x77, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x66, 0x69, 0x72, 0x73, 0x74, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72,
+  0x61, 0x62, 0x6c, 0x65, 0x20, 0x41, 0x6c, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e,
+  0x6f, 0x74, 0x20, 0x62, 0x65, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x72, 0x74, 0x69,
+  0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x73, 0x74,
+  0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x61, 0x73,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x6c, 0x79, 0x20,
+  0x61, 0x66, 0x74, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x73, 0x74,
+  0x61, 0x6e, 0x63, 0x65, 0x2c, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65,
+  0x64, 0x20, 0x61, 0x73, 0x20, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c,
+  0x62, 0x6f, 0x64, 0x79, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67,
+  0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x69,
+  0x6e, 0x67, 0x6c, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x61, 0x63, 0x74,
+  0x20, 0x74, 0x68, 0x61, 0x74, 0x64, 0x69, 0x73, 0x63, 0x75, 0x73, 0x73, 0x69,
+  0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x6d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x20, 0x6f,
+  0x66, 0x20, 0x74, 0x68, 0x65, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x76,
+  0x69, 0x64, 0x75, 0x61, 0x6c, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c,
+  0x74, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x66,
+  0x20, 0x76, 0x69, 0x65, 0x77, 0x68, 0x6f, 0x6d, 0x6f, 0x73, 0x65, 0x78, 0x75,
+  0x61, 0x6c, 0x69, 0x74, 0x79, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x61, 0x6e,
+  0x63, 0x65, 0x20, 0x6f, 0x66, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c,
+  0x2f, 0x64, 0x69, 0x76, 0x3e, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74,
+  0x75, 0x72, 0x65, 0x72, 0x73, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x20, 0x6f,
+  0x66, 0x20, 0x74, 0x68, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x6c, 0x79,
+  0x20, 0x75, 0x73, 0x65, 0x64, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e,
+  0x63, 0x65, 0x20, 0x6f, 0x66, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61,
+  0x74, 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75,
+  0x6e, 0x64, 0x3a, 0x20, 0x23, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x6f,
+  0x66, 0x20, 0x74, 0x68, 0x65, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x66,
+  0x69, 0x63, 0x61, 0x6e, 0x74, 0x22, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72,
+  0x3d, 0x22, 0x30, 0x22, 0x3e, 0x72, 0x65, 0x76, 0x6f, 0x6c, 0x75, 0x74, 0x69,
+  0x6f, 0x6e, 0x61, 0x72, 0x79, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x6c,
+  0x65, 0x73, 0x20, 0x6f, 0x66, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69,
+  0x64, 0x65, 0x72, 0x65, 0x64, 0x77, 0x61, 0x73, 0x20, 0x64, 0x65, 0x76, 0x65,
+  0x6c, 0x6f, 0x70, 0x65, 0x64, 0x49, 0x6e, 0x64, 0x6f, 0x2d, 0x45, 0x75, 0x72,
+  0x6f, 0x70, 0x65, 0x61, 0x6e, 0x76, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62,
+  0x6c, 0x65, 0x20, 0x74, 0x6f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x6e, 0x65, 0x6e,
+  0x74, 0x73, 0x20, 0x6f, 0x66, 0x61, 0x72, 0x65, 0x20, 0x73, 0x6f, 0x6d, 0x65,
+  0x74, 0x69, 0x6d, 0x65, 0x73, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x72, 0x20, 0x74,
+  0x6f, 0x20, 0x74, 0x68, 0x65, 0x4e, 0x65, 0x77, 0x20, 0x59, 0x6f, 0x72, 0x6b,
+  0x20, 0x43, 0x69, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x73,
+  0x65, 0x61, 0x72, 0x63, 0x68, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
+  0x65, 0x64, 0x20, 0x74, 0x6f, 0x63, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x20, 0x6f,
+  0x66, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x61, 0x74, 0x68, 0x65, 0x6d, 0x61, 0x74,
+  0x69, 0x63, 0x69, 0x61, 0x6e, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65,
+  0x6e, 0x64, 0x20, 0x6f, 0x66, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65,
+  0x6e, 0x64, 0x20, 0x6f, 0x66, 0x22, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72,
+  0x3d, 0x22, 0x30, 0x22, 0x20, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f,
+  0x67, 0x69, 0x63, 0x61, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43,
+  0x6c, 0x61, 0x73, 0x73, 0x28, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x20, 0x6f,
+  0x66, 0x20, 0x74, 0x68, 0x65, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65,
+  0x20, 0x74, 0x68, 0x61, 0x74, 0x21, 0x5b, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x5d,
+  0x2d, 0x2d, 0x3e, 0x0d, 0x0a, 0x49, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74,
+  0x65, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x73,
+  0x69, 0x6e, 0x67, 0x6c, 0x65, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69,
+  0x76, 0x65, 0x6c, 0x79, 0x2e, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x72,
+  0x65, 0x66, 0x6f, 0x72, 0x65, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69,
+  0x65, 0x73, 0x20, 0x6f, 0x66, 0x69, 0x73, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74,
+  0x65, 0x64, 0x20, 0x69, 0x6e, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20,
+  0x77, 0x68, 0x69, 0x63, 0x68, 0x54, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73,
+  0x20, 0x61, 0x6c, 0x73, 0x6f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65,
+  0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e,
+  0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x6e, 0x64,
+  0x61, 0x73, 0x68, 0x3b, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65,
+  0x73, 0x20, 0x74, 0x68, 0x65, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x20, 0x6f,
+  0x66, 0x20, 0x74, 0x68, 0x65, 0x69, 0x6e, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64,
+  0x65, 0x6e, 0x74, 0x6c, 0x79, 0x65, 0x71, 0x75, 0x69, 0x70, 0x70, 0x65, 0x64,
+  0x20, 0x77, 0x69, 0x74, 0x68, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74,
+  0x20, 0x68, 0x61, 0x76, 0x65, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x61, 0x20, 0x68,
+  0x72, 0x65, 0x66, 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x66, 0x75, 0x73, 0x65, 0x64,
+  0x20, 0x77, 0x69, 0x74, 0x68, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x68, 0x72,
+  0x65, 0x66, 0x3d, 0x22, 0x2f, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61,
+  0x67, 0x65, 0x20, 0x6f, 0x66, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x20, 0x69,
+  0x6e, 0x20, 0x74, 0x68, 0x65, 0x54, 0x68, 0x65, 0x73, 0x65, 0x20, 0x69, 0x6e,
+  0x63, 0x6c, 0x75, 0x64, 0x65, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65,
+  0x73, 0x73, 0x20, 0x6f, 0x66, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65,
+  0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x26,
+  0x71, 0x75, 0x6f, 0x74, 0x3b, 0x73, 0x65, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x20,
+  0x74, 0x69, 0x6d, 0x65, 0x73, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e,
+  0x74, 0x20, 0x74, 0x68, 0x65, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, 0x2f,
+  0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x74, 0x20,
+  0x74, 0x6f, 0x20, 0x62, 0x65, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x69,
+  0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x69, 0x6c,
+  0x69, 0x74, 0x69, 0x65, 0x73, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61,
+  0x67, 0x65, 0x20, 0x6f, 0x66, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74,
+  0x6f, 0x20, 0x74, 0x68, 0x65, 0x61, 0x6e, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6d,
+  0x70, 0x74, 0x20, 0x74, 0x6f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69,
+  0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x6a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2f, 0x6a,
+  0x71, 0x75, 0x65, 0x72, 0x79, 0x74, 0x77, 0x6f, 0x20, 0x64, 0x69, 0x66, 0x66,
+  0x65, 0x72, 0x65, 0x6e, 0x74, 0x62, 0x65, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x74,
+  0x6f, 0x20, 0x74, 0x68, 0x65, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73,
+  0x68, 0x6d, 0x65, 0x6e, 0x74, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x69, 0x6e,
+  0x67, 0x20, 0x74, 0x68, 0x65, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+  0x69, 0x6f, 0x6e, 0x22, 0x20, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e,
+  0x65, 0x20, 0x74, 0x68, 0x65, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c,
+  0x65, 0x20, 0x66, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e,
+  0x67, 0x20, 0x74, 0x6f, 0x20, 0x77, 0x69, 0x64, 0x65, 0x20, 0x72, 0x61, 0x6e,
+  0x67, 0x65, 0x20, 0x6f, 0x66, 0x09, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c,
+  0x61, 0x73, 0x73, 0x3d, 0x22, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x6f, 0x6d,
+  0x6d, 0x6f, 0x6e, 0x6c, 0x79, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x73, 0x61,
+  0x74, 0x69, 0x6f, 0x6e, 0x73, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+  0x61, 0x6c, 0x69, 0x74, 0x79, 0x77, 0x61, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70,
+  0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x6d, 0x64,
+  0x61, 0x73, 0x68, 0x3b, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72,
+  0x61, 0x63, 0x74, 0x65, 0x72, 0x61, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74,
+  0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x73, 0x20,
+  0x74, 0x6f, 0x20, 0x62, 0x65, 0x66, 0x61, 0x63, 0x74, 0x20, 0x74, 0x68, 0x61,
+  0x74, 0x20, 0x74, 0x68, 0x65, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70,
+  0x6c, 0x65, 0x20, 0x6f, 0x66, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x66, 0x69, 0x63,
+  0x61, 0x6e, 0x74, 0x6c, 0x79, 0x6f, 0x6e, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x6f,
+  0x76, 0x65, 0x72, 0x3d, 0x22, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20,
+  0x74, 0x68, 0x65, 0x79, 0x20, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x3d, 0x20,
+  0x74, 0x72, 0x75, 0x65, 0x3b, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x73,
+  0x20, 0x77, 0x69, 0x74, 0x68, 0x73, 0x65, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x6f,
+  0x20, 0x68, 0x61, 0x76, 0x65, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75,
+  0x6c, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x68, 0x74,
+  0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x61, 0x72,
+  0x20, 0x77, 0x69, 0x74, 0x68, 0x70, 0x6f, 0x73, 0x73, 0x65, 0x73, 0x73, 0x69,
+  0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+  0x20, 0x28, 0x29, 0x20, 0x7b, 0x74, 0x6f, 0x6f, 0x6b, 0x20, 0x70, 0x6c, 0x61,
+  0x63, 0x65, 0x20, 0x69, 0x6e, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x6f, 0x6d, 0x65,
+  0x74, 0x69, 0x6d, 0x65, 0x73, 0x73, 0x75, 0x62, 0x73, 0x74, 0x61, 0x6e, 0x74,
+  0x69, 0x61, 0x6c, 0x6c, 0x79, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f,
+  0x73, 0x70, 0x61, 0x6e, 0x3e, 0x69, 0x73, 0x20, 0x6f, 0x66, 0x74, 0x65, 0x6e,
+  0x20, 0x75, 0x73, 0x65, 0x64, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x74,
+  0x74, 0x65, 0x6d, 0x70, 0x74, 0x67, 0x72, 0x65, 0x61, 0x74, 0x20, 0x64, 0x65,
+  0x61, 0x6c, 0x20, 0x6f, 0x66, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d,
+  0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66,
+  0x75, 0x6c, 0x6c, 0x79, 0x20, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x6c,
+  0x79, 0x20, 0x61, 0x6c, 0x6c, 0x32, 0x30, 0x74, 0x68, 0x20, 0x63, 0x65, 0x6e,
+  0x74, 0x75, 0x72, 0x79, 0x2c, 0x70, 0x72, 0x6f, 0x66, 0x65, 0x73, 0x73, 0x69,
+  0x6f, 0x6e, 0x61, 0x6c, 0x73, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x73, 0x61, 0x72,
+  0x79, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e,
+  0x65, 0x64, 0x20, 0x62, 0x79, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62,
+  0x69, 0x6c, 0x69, 0x74, 0x79, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20,
+  0x69, 0x74, 0x20, 0x69, 0x73, 0x44, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61,
+  0x72, 0x79, 0x20, 0x6f, 0x66, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61,
+  0x74, 0x69, 0x6f, 0x6e, 0x73, 0x54, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c,
+  0x6f, 0x77, 0x69, 0x6e, 0x67, 0x6d, 0x61, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65,
+  0x72, 0x20, 0x74, 0x6f, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x65, 0x71, 0x75, 0x65,
+  0x6e, 0x74, 0x6c, 0x79, 0x2c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74,
+  0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x61, 0x6c, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68,
+  0x20, 0x73, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x6f, 0x75,
+  0x6c, 0x64, 0x20, 0x62, 0x65, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x27, 0x73, 0x20,
+  0x66, 0x69, 0x72, 0x73, 0x74, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69,
+  0x65, 0x64, 0x20, 0x61, 0x73, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x20, 0x6f,
+  0x66, 0x20, 0x74, 0x68, 0x65, 0x28, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75,
+  0x6c, 0x61, 0x72, 0x6c, 0x79, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x6c,
+  0x65, 0x66, 0x74, 0x22, 0x20, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6d,
+  0x6d, 0x6f, 0x6e, 0x6c, 0x79, 0x62, 0x61, 0x73, 0x69, 0x73, 0x20, 0x66, 0x6f,
+  0x72, 0x20, 0x74, 0x68, 0x65, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69,
+  0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75,
+  0x74, 0x69, 0x6f, 0x6e, 0x73, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x69,
+  0x74, 0x79, 0x20, 0x6f, 0x66, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x6f,
+  0x66, 0x20, 0x74, 0x68, 0x65, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x64, 0x75, 0x63,
+  0x65, 0x20, 0x74, 0x68, 0x65, 0x6a, 0x75, 0x72, 0x69, 0x73, 0x64, 0x69, 0x63,
+  0x74, 0x69, 0x6f, 0x6e, 0x73, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x78, 0x69, 0x6d,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x6d, 0x6f, 0x75, 0x73, 0x65,
+  0x6f, 0x75, 0x74, 0x3d, 0x22, 0x4e, 0x65, 0x77, 0x20, 0x54, 0x65, 0x73, 0x74,
+  0x61, 0x6d, 0x65, 0x6e, 0x74, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69,
+  0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c,
+  0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x55,
+  0x6e, 0x69, 0x74, 0x65, 0x64, 0x66, 0x69, 0x6c, 0x6d, 0x20, 0x64, 0x69, 0x72,
+  0x65, 0x63, 0x74, 0x6f, 0x72, 0x2d, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x2e,
+  0x64, 0x74, 0x64, 0x22, 0x3e, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e,
+  0x20, 0x75, 0x73, 0x65, 0x64, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74,
+  0x6f, 0x20, 0x74, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68,
+  0x20, 0x74, 0x68, 0x69, 0x73, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x69,
+  0x6e, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x20,
+  0x6f, 0x74, 0x68, 0x65, 0x72, 0x62, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x72,
+  0x65, 0x20, 0x61, 0x72, 0x65, 0x75, 0x6e, 0x70, 0x72, 0x65, 0x63, 0x65, 0x64,
+  0x65, 0x6e, 0x74, 0x65, 0x64, 0x69, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c,
+  0x61, 0x72, 0x20, 0x74, 0x6f, 0x65, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c,
+  0x6c, 0x79, 0x20, 0x69, 0x6e, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20,
+  0x62, 0x6f, 0x6c, 0x64, 0x3b, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65,
+  0x64, 0x20, 0x74, 0x68, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x61, 0x74,
+  0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65,
+  0x20, 0x74, 0x68, 0x61, 0x74, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74,
+  0x65, 0x64, 0x20, 0x74, 0x6f, 0x09, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6e,
+  0x61, 0x6d, 0x65, 0x3d, 0x22, 0x61, 0x72, 0x65, 0x20, 0x74, 0x79, 0x70, 0x69,
+  0x63, 0x61, 0x6c, 0x6c, 0x79, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74,
+  0x20, 0x77, 0x69, 0x74, 0x68, 0x48, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x6e, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70,
+  0x6c, 0x65, 0x20, 0x6f, 0x66, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x64,
+  0x20, 0x77, 0x69, 0x74, 0x68, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x69,
+  0x65, 0x73, 0x20, 0x6f, 0x66, 0x72, 0x61, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74,
+  0x68, 0x61, 0x6e, 0x20, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x6c, 0x6c,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x73, 0x61, 0x72,
+  0x79, 0x20, 0x66, 0x6f, 0x72, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64,
+  0x20, 0x74, 0x68, 0x61, 0x74, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x70, 0x6f, 0x6c, 0x69, 0x74, 0x69, 0x63, 0x61,
+  0x6c, 0x20, 0x61, 0x6e, 0x64, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x26, 0x6e,
+  0x62, 0x73, 0x70, 0x3b, 0x3c, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+  0x65, 0x73, 0x20, 0x74, 0x6f, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65,
+  0x20, 0x79, 0x65, 0x61, 0x72, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6d, 0x65,
+  0x6e, 0x74, 0x20, 0x6f, 0x66, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
+  0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x68, 0x61, 0x76, 0x65, 0x20, 0x6e, 0x6f, 0x74,
+  0x20, 0x62, 0x65, 0x65, 0x6e, 0x73, 0x65, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x20,
+  0x79, 0x65, 0x61, 0x72, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65,
+  0x6e, 0x74, 0x20, 0x74, 0x6f, 0x09, 0x09, 0x3c, 0x75, 0x6c, 0x20, 0x63, 0x6c,
+  0x61, 0x73, 0x73, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x75, 0x61, 0x6c, 0x69, 0x7a,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x39, 0x74, 0x68, 0x20, 0x63, 0x65, 0x6e,
+  0x74, 0x75, 0x72, 0x79, 0x2c, 0x70, 0x72, 0x61, 0x63, 0x74, 0x69, 0x74, 0x69,
+  0x6f, 0x6e, 0x65, 0x72, 0x73, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x65, 0x20,
+  0x77, 0x6f, 0x75, 0x6c, 0x64, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x74,
+  0x69, 0x6e, 0x75, 0x65, 0x64, 0x6f, 0x63, 0x63, 0x75, 0x70, 0x61, 0x74, 0x69,
+  0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x69, 0x73, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e,
+  0x65, 0x64, 0x20, 0x61, 0x73, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x65, 0x20, 0x6f,
+  0x66, 0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x61, 0x6d, 0x6f, 0x75,
+  0x6e, 0x74, 0x20, 0x6f, 0x66, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x73, 0x74,
+  0x79, 0x6c, 0x65, 0x3d, 0x22, 0x65, 0x71, 0x75, 0x69, 0x76, 0x61, 0x6c, 0x65,
+  0x6e, 0x74, 0x20, 0x6f, 0x66, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e,
+  0x74, 0x69, 0x61, 0x74, 0x65, 0x62, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x74, 0x20,
+  0x61, 0x62, 0x6f, 0x75, 0x74, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c,
+  0x65, 0x66, 0x74, 0x3a, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69,
+  0x63, 0x61, 0x6c, 0x6c, 0x79, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x74, 0x20,
+  0x6f, 0x66, 0x20, 0x61, 0x73, 0x53, 0x6f, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20,
+  0x74, 0x68, 0x65, 0x73, 0x65, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c,
+  0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x63, 0x6c,
+  0x61, 0x73, 0x73, 0x3d, 0x22, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x64,
+  0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f,
+  0x66, 0x20, 0x74, 0x68, 0x65, 0x65, 0x64, 0x75, 0x63, 0x61, 0x74, 0x69, 0x6f,
+  0x6e, 0x20, 0x61, 0x6e, 0x64, 0x69, 0x6e, 0x66, 0x6c, 0x75, 0x65, 0x6e, 0x63,
+  0x65, 0x64, 0x20, 0x62, 0x79, 0x72, 0x65, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69,
+  0x6f, 0x6e, 0x20, 0x61, 0x73, 0x0a, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6e,
+  0x61, 0x6d, 0x65, 0x3d, 0x22, 0x61, 0x63, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x64,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c,
+  0x2f, 0x64, 0x69, 0x76, 0x3e, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x20, 0x70, 0x61,
+  0x72, 0x74, 0x20, 0x6f, 0x66, 0x49, 0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74,
+  0x65, 0x20, 0x66, 0x6f, 0x72, 0x74, 0x68, 0x65, 0x20, 0x73, 0x6f, 0x2d, 0x63,
+  0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x61, 0x67, 0x61, 0x69, 0x6e, 0x73, 0x74,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x49, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20,
+  0x63, 0x61, 0x73, 0x65, 0x2c, 0x77, 0x61, 0x73, 0x20, 0x61, 0x70, 0x70, 0x6f,
+  0x69, 0x6e, 0x74, 0x65, 0x64, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x20,
+  0x74, 0x6f, 0x20, 0x62, 0x65, 0x48, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c,
+  0x20, 0x74, 0x68, 0x69, 0x73, 0x44, 0x65, 0x70, 0x61, 0x72, 0x74, 0x6d, 0x65,
+  0x6e, 0x74, 0x20, 0x6f, 0x66, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x6d, 0x61,
+  0x69, 0x6e, 0x69, 0x6e, 0x67, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x20, 0x6f,
+  0x6e, 0x20, 0x74, 0x68, 0x65, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c,
+  0x61, 0x72, 0x6c, 0x79, 0x20, 0x64, 0x65, 0x61, 0x6c, 0x20, 0x77, 0x69, 0x74,
+  0x68, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x73, 0x74,
+  0x79, 0x6c, 0x65, 0x3d, 0x22, 0x61, 0x6c, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x61,
+  0x6c, 0x77, 0x61, 0x79, 0x73, 0x61, 0x72, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72,
+  0x65, 0x6e, 0x74, 0x6c, 0x79, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69,
+  0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x70, 0x68, 0x69, 0x6c, 0x6f, 0x73, 0x6f, 0x70,
+  0x68, 0x79, 0x20, 0x6f, 0x66, 0x66, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65,
+  0x20, 0x74, 0x68, 0x61, 0x6e, 0x63, 0x69, 0x76, 0x69, 0x6c, 0x69, 0x7a, 0x61,
+  0x74, 0x69, 0x6f, 0x6e, 0x73, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69,
+  0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64,
+  0x49, 0x6e, 0x64, 0x65, 0x78, 0x63, 0x61, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x75,
+  0x6c, 0x74, 0x20, 0x69, 0x6e, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d,
+  0x22, 0x22, 0x20, 0x2f, 0x3e, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x72, 0x75,
+  0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x2f, 0x3e, 0x3c, 0x2f, 0x61, 0x3e, 0x3c,
+  0x2f, 0x64, 0x69, 0x76, 0x3e, 0x4d, 0x61, 0x6e, 0x79, 0x20, 0x6f, 0x66, 0x20,
+  0x74, 0x68, 0x65, 0x73, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x64, 0x20, 0x62,
+  0x79, 0x20, 0x74, 0x68, 0x65, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x55,
+  0x6e, 0x69, 0x74, 0x65, 0x64, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61,
+  0x73, 0x73, 0x3d, 0x22, 0x6d, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x74,
+  0x72, 0x61, 0x63, 0x65, 0x64, 0x69, 0x73, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74,
+  0x65, 0x64, 0x20, 0x74, 0x6f, 0x62, 0x65, 0x63, 0x61, 0x6d, 0x65, 0x20, 0x6f,
+  0x6e, 0x65, 0x20, 0x6f, 0x66, 0x69, 0x73, 0x20, 0x66, 0x72, 0x65, 0x71, 0x75,
+  0x65, 0x6e, 0x74, 0x6c, 0x79, 0x6c, 0x69, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x69,
+  0x6e, 0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x6f, 0x72, 0x65, 0x74, 0x69,
+  0x63, 0x61, 0x6c, 0x6c, 0x79, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e,
+  0x67, 0x20, 0x74, 0x68, 0x65, 0x52, 0x65, 0x76, 0x6f, 0x6c, 0x75, 0x74, 0x69,
+  0x6f, 0x6e, 0x61, 0x72, 0x79, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6d, 0x65,
+  0x6e, 0x74, 0x20, 0x69, 0x6e, 0x69, 0x73, 0x20, 0x64, 0x65, 0x74, 0x65, 0x72,
+  0x6d, 0x69, 0x6e, 0x65, 0x64, 0x74, 0x68, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x69,
+  0x74, 0x69, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63,
+  0x65, 0x64, 0x20, 0x69, 0x6e, 0x73, 0x75, 0x66, 0x66, 0x69, 0x63, 0x69, 0x65,
+  0x6e, 0x74, 0x20, 0x74, 0x6f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+  0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x20, 0x73, 0x74,
+  0x6f, 0x72, 0x69, 0x65, 0x73, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69,
+  0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x61, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x77, 0x68,
+  0x65, 0x74, 0x68, 0x65, 0x72, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x66, 0x6f,
+  0x72, 0x20, 0x69, 0x74, 0x73, 0x77, 0x61, 0x73, 0x20, 0x69, 0x6e, 0x69, 0x74,
+  0x69, 0x61, 0x6c, 0x6c, 0x79, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a,
+  0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78,
+  0x61, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x69, 0x6e,
+  0x63, 0x69, 0x70, 0x61, 0x6c, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x73,
+  0x20, 0x6f, 0x66, 0x20, 0x61, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x7a,
+  0x65, 0x64, 0x20, 0x61, 0x73, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3c, 0x2f,
+  0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x61, 0x20, 0x73, 0x75, 0x62, 0x73, 0x74, 0x61,
+  0x6e, 0x74, 0x69, 0x61, 0x6c, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72,
+  0x75, 0x63, 0x74, 0x65, 0x64, 0x68, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20,
+  0x73, 0x74, 0x61, 0x74, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x74, 0x61, 0x6e,
+  0x63, 0x65, 0x20, 0x74, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x67, 0x72, 0x61,
+  0x64, 0x75, 0x61, 0x74, 0x65, 0x54, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72,
+  0x65, 0x20, 0x74, 0x77, 0x6f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74,
+  0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x61, 0x72, 0x65, 0x20, 0x64, 0x65, 0x73, 0x63,
+  0x72, 0x69, 0x62, 0x65, 0x64, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f,
+  0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x61,
+  0x73, 0x20, 0x74, 0x68, 0x65, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x68,
+  0x65, 0x61, 0x64, 0x65, 0x72, 0x6f, 0x70, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69,
+  0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x66, 0x75, 0x6e, 0x64, 0x61, 0x6d, 0x65, 0x6e,
+  0x74, 0x61, 0x6c, 0x6c, 0x79, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65,
+  0x64, 0x20, 0x74, 0x68, 0x65, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x6f, 0x74, 0x68, 0x65, 0x72, 0x61, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65,
+  0x20, 0x77, 0x69, 0x74, 0x68, 0x77, 0x61, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x63,
+  0x65, 0x64, 0x20, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69,
+  0x76, 0x65, 0x6c, 0x79, 0x2c, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x6f, 0x6c, 0x69,
+  0x74, 0x69, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f,
+  0x72, 0x74, 0x20, 0x6f, 0x66, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x20, 0x69,
+  0x6e, 0x20, 0x74, 0x68, 0x65, 0x32, 0x30, 0x74, 0x68, 0x20, 0x63, 0x65, 0x6e,
+  0x74, 0x75, 0x72, 0x79, 0x2e, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x75, 0x62, 0x6c,
+  0x69, 0x73, 0x68, 0x65, 0x64, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72,
+  0x74, 0x62, 0x65, 0x61, 0x74, 0x74, 0x6f, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72,
+  0x73, 0x74, 0x61, 0x6e, 0x64, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x73,
+  0x74, 0x61, 0x74, 0x65, 0x73, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d,
+  0x65, 0x6e, 0x74, 0x61, 0x6c, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x68, 0x61,
+  0x6c, 0x66, 0x20, 0x6f, 0x66, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65,
+  0x73, 0x20, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63,
+  0x74, 0x75, 0x72, 0x61, 0x6c, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69,
+  0x64, 0x65, 0x72, 0x65, 0x64, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65,
+  0x72, 0x69, 0x7a, 0x65, 0x64, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x49, 0x6e, 0x74,
+  0x65, 0x72, 0x76, 0x61, 0x6c, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74,
+  0x61, 0x74, 0x69, 0x76, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69,
+  0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x77, 0x61, 0x73, 0x20, 0x73, 0x75, 0x63, 0x63,
+  0x65, 0x65, 0x64, 0x65, 0x64, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x72,
+  0x65, 0x20, 0x61, 0x72, 0x65, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x71,
+  0x75, 0x65, 0x6e, 0x63, 0x65, 0x74, 0x68, 0x65, 0x20, 0x50, 0x72, 0x65, 0x73,
+  0x69, 0x64, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x69, 0x6e, 0x63,
+  0x6c, 0x75, 0x64, 0x65, 0x64, 0x66, 0x72, 0x65, 0x65, 0x20, 0x73, 0x6f, 0x66,
+  0x74, 0x77, 0x61, 0x72, 0x65, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69,
+  0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65,
+  0x64, 0x20, 0x74, 0x68, 0x65, 0x77, 0x61, 0x73, 0x20, 0x64, 0x65, 0x73, 0x74,
+  0x72, 0x6f, 0x79, 0x65, 0x64, 0x61, 0x77, 0x61, 0x79, 0x20, 0x66, 0x72, 0x6f,
+  0x6d, 0x20, 0x74, 0x68, 0x65, 0x3b, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69,
+  0x70, 0x74, 0x3e, 0x0a, 0x3c, 0x61, 0x6c, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68,
+  0x20, 0x74, 0x68, 0x65, 0x79, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64,
+  0x20, 0x62, 0x79, 0x20, 0x61, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x70, 0x6f, 0x77,
+  0x65, 0x72, 0x66, 0x75, 0x6c, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x65, 0x64,
+  0x20, 0x69, 0x6e, 0x20, 0x61, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x69,
+  0x74, 0x79, 0x20, 0x6f, 0x66, 0x48, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c,
+  0x20, 0x6d, 0x61, 0x6e, 0x79, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x73,
+  0x69, 0x64, 0x65, 0x6e, 0x74, 0x48, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c,
+  0x20, 0x73, 0x6f, 0x6d, 0x65, 0x69, 0x73, 0x20, 0x74, 0x68, 0x6f, 0x75, 0x67,
+  0x68, 0x74, 0x20, 0x74, 0x6f, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x65, 0x6e, 0x64, 0x77, 0x61, 0x73, 0x20, 0x61, 0x6e, 0x6e, 0x6f,
+  0x75, 0x6e, 0x63, 0x65, 0x64, 0x61, 0x72, 0x65, 0x20, 0x69, 0x6d, 0x70, 0x6f,
+  0x72, 0x74, 0x61, 0x6e, 0x74, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x69, 0x6e, 0x63,
+  0x6c, 0x75, 0x64, 0x65, 0x73, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20,
+  0x74, 0x79, 0x70, 0x65, 0x3d, 0x74, 0x68, 0x65, 0x20, 0x63, 0x65, 0x6e, 0x74,
+  0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x44, 0x4f, 0x20, 0x4e, 0x4f, 0x54, 0x20,
+  0x41, 0x4c, 0x54, 0x45, 0x52, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20,
+  0x72, 0x65, 0x66, 0x65, 0x72, 0x74, 0x68, 0x65, 0x6d, 0x65, 0x73, 0x2f, 0x3f,
+  0x73, 0x6f, 0x72, 0x74, 0x3d, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x64,
+  0x20, 0x62, 0x65, 0x65, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x62, 0x61, 0x73, 0x69,
+  0x73, 0x20, 0x66, 0x6f, 0x72, 0x68, 0x61, 0x73, 0x20, 0x64, 0x65, 0x76, 0x65,
+  0x6c, 0x6f, 0x70, 0x65, 0x64, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73,
+  0x75, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x61, 0x74,
+  0x69, 0x76, 0x65, 0x6c, 0x79, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65,
+  0x64, 0x20, 0x74, 0x68, 0x65, 0x73, 0x75, 0x63, 0x68, 0x20, 0x61, 0x73, 0x20,
+  0x74, 0x68, 0x6f, 0x73, 0x65, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75,
+  0x6c, 0x74, 0x69, 0x6e, 0x67, 0x69, 0x73, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x73,
+  0x73, 0x69, 0x62, 0x6c, 0x65, 0x76, 0x61, 0x72, 0x69, 0x6f, 0x75, 0x73, 0x20,
+  0x6f, 0x74, 0x68, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x41, 0x66,
+  0x72, 0x69, 0x63, 0x61, 0x6e, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x73, 0x61, 0x6d, 0x65, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76,
+  0x65, 0x6e, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68,
+  0x20, 0x63, 0x61, 0x73, 0x65, 0x3b, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61,
+  0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72,
+  0x65, 0x20, 0x61, 0x6e, 0x64, 0x3b, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72,
+  0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x69, 0x6e,
+  0x67, 0x20, 0x74, 0x68, 0x65, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65,
+  0x64, 0x20, 0x74, 0x68, 0x65, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20,
+  0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6d,
+  0x61, 0x72, 0x67, 0x69, 0x6e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e,
+  0x67, 0x20, 0x74, 0x68, 0x65, 0x62, 0x61, 0x68, 0x61, 0x73, 0x61, 0x20, 0x4d,
+  0x65, 0x6c, 0x61, 0x79, 0x75, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x20, 0x62, 0x6f,
+  0x6b, 0x6d, 0xc3, 0xa5, 0x6c, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x20, 0x6e, 0x79,
+  0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x73, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0xc5, 0xa1,
+  0xc4, 0x8d, 0x69, 0x6e, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x63,
+  0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x63, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x63, 0x61,
+  0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x63, 0x6f, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61,
+  0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63,
+  0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63,
+  0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x64, 0x69, 0x73, 0x61, 0x6d, 0x62, 0x69,
+  0x67, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e,
+  0x4e, 0x61, 0x6d, 0x65, 0x27, 0x2c, 0x20, 0x27, 0x61, 0x64, 0x6d, 0x69, 0x6e,
+  0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x69, 0x6d, 0x75,
+  0x6c, 0x74, 0x61, 0x6e, 0x65, 0x6f, 0x75, 0x73, 0x6c, 0x79, 0x74, 0x72, 0x61,
+  0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e,
+  0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x6d,
+  0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a,
+  0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74,
+  0x79, 0x3c, 0x21, 0x5b, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x5d, 0x2d, 0x2d, 0x3e,
+  0x0a, 0x3c, 0x2f, 0x3e, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6e, 0x61, 0x6d,
+  0x65, 0x3d, 0x22, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61,
+  0x74, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75,
+  0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e,
+  0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d,
+  0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64,
+  0x3e, 0x0a, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x3d, 0x68, 0x74, 0x74, 0x70,
+  0x25, 0x33, 0x41, 0x25, 0x32, 0x46, 0x25, 0x32, 0x46, 0x3c, 0x66, 0x6f, 0x72,
+  0x6d, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3d, 0x22, 0x6d, 0x65, 0x74,
+  0x68, 0x6f, 0x64, 0x3d, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x20, 0x2f, 0x66,
+  0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x2e, 0x69, 0x63, 0x6f, 0x22, 0x20, 0x7d,
+  0x29, 0x3b, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a,
+  0x2e, 0x73, 0x65, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65,
+  0x28, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69,
+  0x6f, 0x6e, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79,
+  0x28, 0x29, 0x3b, 0x3c, 0x21, 0x5b, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x5d, 0x2d,
+  0x2d, 0x3e, 0x0d, 0x0a, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x62,
+  0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x55, 0x6e, 0x66, 0x6f, 0x72, 0x74, 0x75, 0x6e,
+  0x61, 0x74, 0x65, 0x6c, 0x79, 0x2c, 0x22, 0x3e, 0x26, 0x6e, 0x62, 0x73, 0x70,
+  0x3b, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x2f, 0x66, 0x61, 0x76, 0x69, 0x63,
+  0x6f, 0x6e, 0x2e, 0x69, 0x63, 0x6f, 0x22, 0x3e, 0x3d, 0x27, 0x73, 0x74, 0x79,
+  0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x27, 0x20, 0x69, 0x64, 0x65, 0x6e,
+  0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x66,
+  0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x3c, 0x6c,
+  0x69, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x61,
+  0x6e, 0x20, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65,
+  0x61, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x6f,
+  0x66, 0x70, 0x74, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+  0x3e, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x73, 0x75, 0x62, 0x6d, 0x69,
+  0x74, 0x22, 0x20, 0x0a, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+  0x28, 0x29, 0x20, 0x7b, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x61, 0x63, 0x74,
+  0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f,
+  0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x73,
+  0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x73, 0x74, 0x79, 0x6c,
+  0x65, 0x2e, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x20, 0x41, 0x63, 0x63,
+  0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x68, 0x69, 0x64,
+  0x64, 0x65, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x61, 0x6c,
+  0x6f, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x64,
+  0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x2e,
+  0x61, 0x70, 0x70, 0x72, 0x6f, 0x78, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x6c, 0x79,
+  0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
+  0x6e, 0x73, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f,
+  0x6e, 0x3d, 0x22, 0x6d, 0x65, 0x61, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x26, 0x71,
+  0x75, 0x6f, 0x74, 0x3b, 0x2d, 0x2d, 0x3c, 0x21, 0x5b, 0x65, 0x6e, 0x64, 0x69,
+  0x66, 0x5d, 0x2d, 0x2d, 0x3e, 0x50, 0x72, 0x69, 0x6d, 0x65, 0x20, 0x4d, 0x69,
+  0x6e, 0x69, 0x73, 0x74, 0x65, 0x72, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,
+  0x65, 0x72, 0x69, 0x73, 0x74, 0x69, 0x63, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c,
+  0x61, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x74, 0x68, 0x65, 0x20, 0x68,
+  0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x6e, 0x6d,
+  0x6f, 0x75, 0x73, 0x65, 0x6f, 0x76, 0x65, 0x72, 0x3d, 0x22, 0x74, 0x68, 0x65,
+  0x20, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x68, 0x72,
+  0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77,
+  0x61, 0x73, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x6c, 0x79,
+  0x77, 0x61, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65,
+  0x64, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69,
+  0x6f, 0x6e, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74,
+  0x69, 0x76, 0x65, 0x61, 0x72, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64,
+  0x65, 0x72, 0x65, 0x64, 0x3c, 0x21, 0x5b, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x5d,
+  0x2d, 0x2d, 0x3e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x73, 0x20,
+  0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73,
+  0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x6f, 0x6e,
+  0x74, 0x72, 0x61, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x6c, 0x61, 0x63,
+  0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x3d, 0x22, 0x69, 0x6e, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x69, 0x6e, 0x74,
+  0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x63, 0x6f,
+  0x6e, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x73,
+  0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d,
+  0x3a, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20,
+  0x7b, 0x42, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74,
+  0x68, 0x65, 0x2d, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x2e, 0x64, 0x74, 0x64,
+  0x22, 0x3e, 0x0a, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x6c, 0x61,
+  0x73, 0x73, 0x3d, 0x22, 0x61, 0x63, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x69,
+  0x65, 0x64, 0x20, 0x62, 0x79, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20,
+  0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+  0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x2f, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65,
+  0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70,
+  0x65, 0x6f, 0x70, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x61,
+  0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x73, 0x29, 0x3b,
+  0x20, 0x6a, 0x73, 0x2e, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x69, 0x64, 0x22, 0x20,
+  0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x31, 0x30, 0x30, 0x25, 0x22, 0x72,
+  0x65, 0x67, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x52, 0x6f, 0x6d, 0x61, 0x6e, 0x20, 0x43, 0x61, 0x74, 0x68, 0x6f, 0x6c, 0x69,
+  0x63, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65,
+  0x6e, 0x74, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x2e, 0x67, 0x69, 0x66, 0x22, 0x20, 0x77, 0x69, 0x64, 0x74,
+  0x68, 0x3d, 0x22, 0x31, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f,
+  0x77, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x69, 0x73, 0x63, 0x72, 0x69, 0x6d, 0x69,
+  0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x72, 0x63, 0x68, 0x61, 0x65, 0x6f,
+  0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x70, 0x72, 0x69, 0x6d, 0x65, 0x20,
+  0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x6a, 0x73, 0x22, 0x3e,
+  0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x63, 0x6f, 0x6d, 0x62,
+  0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x61,
+  0x72, 0x67, 0x69, 0x6e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x63, 0x72,
+  0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x77,
+  0x2e, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x28,
+  0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72,
+  0x3e, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f,
+  0x2f, 0x61, 0x49, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c,
+  0x61, 0x72, 0x2c, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x6c, 0x65,
+  0x66, 0x74, 0x22, 0x20, 0x43, 0x7a, 0x65, 0x63, 0x68, 0x20, 0x52, 0x65, 0x70,
+  0x75, 0x62, 0x6c, 0x69, 0x63, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x4b,
+  0x69, 0x6e, 0x67, 0x64, 0x6f, 0x6d, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70,
+  0x6f, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x6c, 0x75,
+  0x64, 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x2e, 0x68, 0x74, 0x6d, 0x6c,
+  0x22, 0x20, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3d, 0x22, 0x28, 0x66, 0x75, 0x6e,
+  0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x63, 0x6f, 0x6d,
+  0x65, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x61, 0x70,
+  0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x3c,
+  0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73,
+  0x62, 0x65, 0x6c, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62,
+  0x65, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x27, 0x73, 0x63, 0x72, 0x69, 0x70,
+  0x74, 0x27, 0x3c, 0x2f, 0x61, 0x3e, 0x0a, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x0a,
+  0x3c, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65,
+  0x72, 0x65, 0x6e, 0x74, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c,
+  0x61, 0x73, 0x73, 0x3d, 0x22, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76,
+  0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x28, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x6b,
+  0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x61, 0x73, 0x09, 0x3c, 0x6c, 0x69, 0x3e, 0x3c,
+  0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x3e, 0x3c, 0x69, 0x6e, 0x70,
+  0x75, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x73, 0x65, 0x70, 0x61,
+  0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x72, 0x65, 0x66,
+  0x65, 0x72, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x73, 0x20, 0x76,
+  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x22, 0x3e, 0x66,
+  0x6f, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65,
+  0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f,
+  0x20, 0x63, 0x61, 0x72, 0x62, 0x6f, 0x6e, 0x20, 0x64, 0x69, 0x6f, 0x78, 0x69,
+  0x64, 0x65, 0x0a, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73,
+  0x73, 0x3d, 0x22, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x65, 0x61,
+  0x72, 0x63, 0x68, 0x2d, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, 0x2f,
+  0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x6f, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x75, 0x6e,
+  0x69, 0x74, 0x79, 0x20, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69,
+  0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64,
+  0x3e, 0x0d, 0x0a, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x73, 0x74, 0x79, 0x6c,
+  0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x54, 0x69, 0xe1, 0xba,
+  0xbf, 0x6e, 0x67, 0x20, 0x56, 0x69, 0xe1, 0xbb, 0x87, 0x74, 0x63, 0x68, 0x61,
+  0x6e, 0x67, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x62, 0x6f,
+  0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x30,
+  0x22, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3d, 0x22, 0x30, 0x22, 0x20,
+  0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e,
+  0x3c, 0x77, 0x61, 0x73, 0x20, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72,
+  0x65, 0x64, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78,
+  0x74, 0x22, 0x20, 0x29, 0x3b, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70,
+  0x74, 0x3e, 0x0a, 0x0a, 0x44, 0x65, 0x70, 0x61, 0x72, 0x74, 0x6d, 0x65, 0x6e,
+  0x74, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x63, 0x63, 0x6c, 0x65, 0x73, 0x69, 0x61,
+  0x73, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x68,
+  0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74,
+  0x69, 0x6e, 0x67, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x3c, 0x2f, 0x62, 0x6f, 0x64,
+  0x79, 0x3e, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x68, 0x61, 0x73, 0x20,
+  0x6e, 0x65, 0x76, 0x65, 0x72, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x74, 0x68, 0x65,
+  0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x69, 0x6e,
+  0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x74, 0x6f, 0x61,
+  0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20,
+  0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20,
+  0x69, 0x77, 0x61, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72,
+  0x65, 0x64, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20,
+  0x74, 0x68, 0x65, 0x22, 0x20, 0x2f, 0x3e, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f,
+  0x64, 0x69, 0x76, 0x3e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f,
+  0x6e, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x65,
+  0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+  0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74,
+  0x2d, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x74, 0x6f, 0x20, 0x62, 0x65,
+  0x20, 0x63, 0x6f, 0x6e, 0x66, 0x75, 0x73, 0x65, 0x64, 0x6d, 0x65, 0x6d, 0x62,
+  0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x64,
+  0x64, 0x69, 0x6e, 0x67, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x74, 0x72,
+  0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x69,
+  0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+  0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x27, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
+  0x2f, 0x77, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x6e,
+  0x6f, 0x74, 0x54, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61,
+  0x6c, 0x73, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20,
+  0x6d, 0x61, 0x6e, 0x79, 0x61, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x20, 0x6e,
+  0x75, 0x6d, 0x62, 0x65, 0x72, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x70, 0x61,
+  0x72, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x69, 0x6d, 0x70, 0x6f, 0x73, 0x73, 0x69,
+  0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+  0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x6c, 0x6f, 0x63, 0x61, 0x74,
+  0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x2e, 0x20, 0x48, 0x6f,
+  0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x61, 0x6e, 0x64,
+  0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x41, 0x74,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x62,
+  0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x74, 0x73,
+  0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68,
+  0x65, 0x3c, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+  0x3d, 0x22, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3d, 0x22, 0x70, 0x6f,
+  0x73, 0x74, 0x22, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x70, 0x6f, 0x73, 0x73,
+  0x69, 0x62, 0x6c, 0x65, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x6c, 0x69, 0x6b, 0x65,
+  0x6c, 0x79, 0x20, 0x74, 0x6f, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x63, 0x72, 0x65,
+  0x61, 0x73, 0x65, 0x20, 0x69, 0x6e, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x6c,
+  0x73, 0x6f, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73,
+  0x70, 0x6f, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x61, 0x6e, 0x6e, 0x6f, 0x75,
+  0x6e, 0x63, 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x61, 0x6c, 0x69, 0x67,
+  0x6e, 0x3d, 0x22, 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x6d, 0x61, 0x6e,
+  0x79, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x66, 0x6f,
+  0x72, 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x20, 0x79, 0x65, 0x61, 0x72, 0x73, 0x65,
+  0x61, 0x72, 0x6c, 0x69, 0x65, 0x73, 0x74, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e,
+  0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x69, 0x74, 0x20, 0x77, 0x61,
+  0x73, 0x70, 0x74, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+  0x3e, 0x0d, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x74, 0x6f,
+  0x70, 0x22, 0x20, 0x69, 0x6e, 0x68, 0x61, 0x62, 0x69, 0x74, 0x61, 0x6e, 0x74,
+  0x73, 0x20, 0x6f, 0x66, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67,
+  0x20, 0x79, 0x65, 0x61, 0x72, 0x0d, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63,
+  0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x6f, 0x6e,
+  0x20, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f,
+  0x76, 0x65, 0x72, 0x73, 0x69, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x65,
+  0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x61, 0x72, 0x67, 0x75,
+  0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x67, 0x6f, 0x76,
+  0x65, 0x72, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x61, 0x20,
+  0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x74,
+  0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f,
+  0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x63, 0x6f, 0x6c, 0x6f,
+  0x72, 0x3a, 0x61, 0x6c, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x74, 0x68,
+  0x65, 0x72, 0x65, 0x62, 0x65, 0x73, 0x74, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e,
+  0x20, 0x66, 0x6f, 0x72, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x22, 0x20, 0x6e,
+  0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69,
+  0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68,
+  0x61, 0x6e, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x67, 0x6e,
+  0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x43, 0x6f, 0x75, 0x6e, 0x63,
+  0x69, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x65, 0x64, 0x69, 0x74,
+  0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x20, 0x3c,
+  0x6d, 0x65, 0x74, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x45, 0x6e,
+  0x74, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x61,
+  0x77, 0x61, 0x79, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x3b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74,
+  0x3a, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20,
+  0x6f, 0x66, 0x69, 0x6e, 0x76, 0x65, 0x73, 0x74, 0x69, 0x67, 0x61, 0x74, 0x69,
+  0x6f, 0x6e, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20,
+  0x77, 0x69, 0x74, 0x68, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x20,
+  0x6f, 0x74, 0x68, 0x65, 0x72, 0x61, 0x6c, 0x74, 0x68, 0x6f, 0x75, 0x67, 0x68,
+  0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x6e, 0x69,
+  0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x3c, 0x73, 0x70, 0x61, 0x6e,
+  0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x64, 0x65, 0x73, 0x63, 0x65,
+  0x6e, 0x64, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x3c, 0x73, 0x70, 0x61,
+  0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x20, 0x61, 0x6c,
+  0x69, 0x67, 0x6e, 0x3d, 0x22, 0x72, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3c, 0x2f,
+  0x68, 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x61,
+  0x73, 0x70, 0x65, 0x63, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65,
+  0x68, 0x61, 0x73, 0x20, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x20, 0x62, 0x65, 0x65,
+  0x6e, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x61, 0x6e, 0x20, 0x55, 0x6e, 0x69,
+  0x6f, 0x6e, 0x72, 0x65, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x63, 0x65, 0x6e, 0x74,
+  0x20, 0x6f, 0x66, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x69,
+  0x63, 0x75, 0x6c, 0x74, 0x56, 0x69, 0x63, 0x65, 0x20, 0x50, 0x72, 0x65, 0x73,
+  0x69, 0x64, 0x65, 0x6e, 0x74, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74,
+  0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x20,
+  0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x69,
+  0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x66, 0x6f, 0x6e, 0x74, 0x2d,
+  0x73, 0x69, 0x7a, 0x65, 0x3a, 0x31, 0x31, 0x70, 0x78, 0x65, 0x78, 0x70, 0x6c,
+  0x61, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x74, 0x68, 0x65,
+  0x20, 0x63, 0x6f, 0x6e, 0x63, 0x65, 0x70, 0x74, 0x20, 0x6f, 0x66, 0x77, 0x72,
+  0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x09,
+  0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22,
+  0x69, 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x72, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x20,
+  0x74, 0x6f, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x72, 0x6f, 0x75,
+  0x6e, 0x64, 0x73, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x63, 0x6f, 0x6e, 0x74,
+  0x61, 0x69, 0x6e, 0x73, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20,
+  0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61,
+  0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20,
+  0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6f, 0x75, 0x74, 0x73, 0x69,
+  0x64, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x73, 0x75, 0x70, 0x70,
+  0x6f, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x3c, 0x69, 0x6e,
+  0x70, 0x75, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x3c, 0x73,
+  0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x28,
+  0x4d, 0x61, 0x74, 0x68, 0x2e, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x28, 0x29,
+  0x6d, 0x6f, 0x73, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x6d, 0x69, 0x6e, 0x65, 0x6e,
+  0x74, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+  0x6f, 0x66, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x6e, 0x6f,
+  0x70, 0x6c, 0x65, 0x77, 0x65, 0x72, 0x65, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69,
+  0x73, 0x68, 0x65, 0x64, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73,
+  0x73, 0x3d, 0x22, 0x73, 0x65, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x73, 0x20,
+  0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x31, 0x22, 0x20, 0x68, 0x65, 0x69, 0x67,
+  0x68, 0x74, 0x3d, 0x22, 0x31, 0x22, 0x20, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x69,
+  0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x77, 0x68, 0x69, 0x63, 0x68,
+  0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x77, 0x68, 0x69, 0x63,
+  0x68, 0x20, 0x68, 0x61, 0x64, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x64, 0x65, 0x73,
+  0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x74, 0x68,
+  0x65, 0x20, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0a,
+  0x09, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22,
+  0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x6f,
+  0x66, 0x73, 0x6f, 0x6d, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x20, 0x75, 0x73,
+  0x65, 0x64, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x68,
+  0x61, 0x76, 0x65, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66,
+  0x20, 0x74, 0x68, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x20,
+  0x74, 0x6f, 0x20, 0x62, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x20,
+  0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22,
+  0x63, 0x6c, 0x65, 0x61, 0x72, 0x3a, 0x62, 0x0d, 0x0a, 0x3c, 0x2f, 0x73, 0x63,
+  0x72, 0x69, 0x70, 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x77, 0x61, 0x73, 0x20, 0x66,
+  0x6f, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x69, 0x6e, 0x74, 0x65,
+  0x72, 0x76, 0x69, 0x65, 0x77, 0x20, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x69, 0x64,
+  0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x63, 0x61,
+  0x70, 0x69, 0x74, 0x61, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x0d,
+  0x0a, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x73,
+  0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68,
+  0x65, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68,
+  0x61, 0x74, 0x78, 0x4d, 0x4c, 0x48, 0x74, 0x74, 0x70, 0x52, 0x65, 0x71, 0x75,
+  0x65, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x75, 0x62, 0x73, 0x65, 0x71,
+  0x75, 0x65, 0x6e, 0x74, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x6c, 0x61,
+  0x72, 0x67, 0x65, 0x73, 0x74, 0x76, 0x65, 0x72, 0x79, 0x20, 0x69, 0x6d, 0x70,
+  0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69,
+  0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x73, 0x75, 0x72, 0x66, 0x61, 0x63,
+  0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x61, 0x70, 0x70, 0x6c, 0x69,
+  0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x66, 0x6f, 0x72, 0x65,
+  0x69, 0x67, 0x6e, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x73, 0x65,
+  0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x65, 0x73,
+  0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x69,
+  0x73, 0x20, 0x62, 0x65, 0x6c, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x74, 0x6f,
+  0x49, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74,
+  0x6f, 0x6d, 0x65, 0x61, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74,
+  0x68, 0x65, 0x69, 0x73, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x20, 0x61, 0x66,
+  0x74, 0x65, 0x72, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74,
+  0x20, 0x74, 0x68, 0x65, 0x69, 0x73, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73,
+  0x65, 0x6e, 0x74, 0x65, 0x64, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74,
+  0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x65, 0x66,
+  0x66, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69,
+  0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72,
+  0x20, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x68, 0x65, 0x20, 0x72,
+  0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x3c, 0x73, 0x70,
+  0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, 0x70, 0x65,
+  0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x28,
+  0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0d,
+  0x69, 0x66, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69,
+  0x66, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74,
+  0x68, 0x65, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20,
+  0x74, 0x68, 0x65, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20,
+  0x77, 0x69, 0x74, 0x68, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x4e, 0x61,
+  0x74, 0x69, 0x6f, 0x6e, 0x73, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x68,
+  0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74,
+  0x68, 0x61, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x79, 0x70, 0x65, 0x22, 0x20, 0x63,
+  0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x41, 0x73, 0x73, 0x6f, 0x63,
+  0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x0a, 0x3c, 0x2f, 0x68,
+  0x65, 0x61, 0x64, 0x3e, 0x0a, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x6c, 0x6f, 0x63,
+  0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x69, 0x73,
+  0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x28,
+  0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65,
+  0x63, 0x6f, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+  0x73, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75,
+  0x61, 0x6c, 0x61, 0x6d, 0x6f, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d,
+  0x6f, 0x73, 0x74, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6f,
+  0x74, 0x68, 0x65, 0x72, 0x2f, 0x3e, 0x0a, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20,
+  0x72, 0x65, 0x6c, 0x3d, 0x22, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20,
+  0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x74, 0x68, 0x65, 0x20, 0x70, 0x75, 0x72,
+  0x70, 0x6f, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x74, 0x68, 0x65, 0x20, 0x61, 0x62,
+  0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x74, 0x6f, 0x3b, 0x63, 0x6f, 0x6c, 0x6f,
+  0x72, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x7d, 0x0a, 0x2e, 0x0a, 0x3c, 0x73, 0x70,
+  0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x68, 0x65,
+  0x20, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x66, 0x64, 0x65,
+  0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x3e,
+  0x0d, 0x0a, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22,
+  0x63, 0x6c, 0x61, 0x69, 0x6d, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68,
+  0x65, 0x68, 0x61, 0x76, 0x65, 0x20, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70,
+  0x65, 0x64, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x64, 0x74,
+  0x68, 0x3d, 0x22, 0x63, 0x65, 0x6c, 0x65, 0x62, 0x72, 0x61, 0x74, 0x69, 0x6f,
+  0x6e, 0x20, 0x6f, 0x66, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x69, 0x73, 0x74, 0x69,
+  0x6e, 0x67, 0x75, 0x69, 0x73, 0x68, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63,
+  0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x62, 0x74, 0x61, 0x6b, 0x65, 0x73, 0x20,
+  0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x75, 0x6e, 0x64, 0x65, 0x72,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x6f, 0x74, 0x65,
+  0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x3e, 0x3c, 0x21,
+  0x5b, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x5d, 0x2d, 0x2d, 0x3e, 0x0a, 0x73, 0x74,
+  0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x69,
+  0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65,
+  0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x64, 0x20, 0x74, 0x68,
+  0x65, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20,
+  0x6f, 0x66, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x69, 0x6e, 0x67, 0x20,
+  0x74, 0x68, 0x65, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+  0x73, 0x20, 0x69, 0x6e, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64,
+  0x20, 0x74, 0x68, 0x61, 0x74, 0x65, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c,
+  0x6c, 0x79, 0x20, 0x74, 0x68, 0x65, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64,
+  0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x77, 0x61, 0x73, 0x20, 0x65, 0x76,
+  0x65, 0x6e, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x74, 0x68, 0x72, 0x6f, 0x75,
+  0x67, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x68, 0x69, 0x73, 0x74, 0x68, 0x65, 0x20,
+  0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x6f, 0x6d,
+  0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x61, 0x74, 0x73, 0x70,
+  0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x2f, 0x73,
+  0x69, 0x67, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x6e, 0x74, 0x6c, 0x79, 0x20,
+  0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0d, 0x0a, 0x0d,
+  0x0a, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x61,
+  0x6c, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20,
+  0x74, 0x68, 0x65, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20,
+  0x75, 0x73, 0x65, 0x64, 0x65, 0x73, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x6c,
+  0x79, 0x20, 0x66, 0x6f, 0x72, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x74, 0x61,
+  0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x69, 0x73, 0x20, 0x65, 0x73, 0x73, 0x65,
+  0x6e, 0x74, 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x77, 0x65, 0x72, 0x65, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x69, 0x73, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x73, 0x74, 0x68, 0x61, 0x76, 0x65,
+  0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x22, 0x20, 0x73,
+  0x72, 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x69, 0x6e,
+  0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x20, 0x61, 0x73, 0x73,
+  0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x6f, 0x66,
+  0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x6e, 0x6f, 0x22,
+  0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x20,
+  0x6f, 0x66, 0x49, 0x49, 0x2c, 0x20, 0x48, 0x6f, 0x6c, 0x79, 0x20, 0x52, 0x6f,
+  0x6d, 0x61, 0x6e, 0x69, 0x73, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65,
+  0x64, 0x20, 0x74, 0x6f, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x69,
+  0x72, 0x20, 0x6f, 0x77, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20,
+  0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x74, 0x72, 0x61, 0x64, 0x69, 0x74, 0x69,
+  0x6f, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x64,
+  0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x61, 0x72, 0x65, 0x20, 0x6f,
+  0x66, 0x74, 0x65, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x64, 0x74, 0x6f, 0x20, 0x65,
+  0x6e, 0x73, 0x75, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x61, 0x67, 0x72,
+  0x65, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x63, 0x6f,
+  0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x61,
+  0x72, 0x65, 0x20, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x6c, 0x79,
+  0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f,
+  0x6e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x69, 0x73, 0x20, 0x74,
+  0x68, 0x65, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69,
+  0x6e, 0x20, 0x61, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x3c,
+  0x2f, 0x75, 0x6c, 0x3e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66,
+  0x6f, 0x6f, 0x74, 0x65, 0x72, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x73, 0x70, 0x65,
+  0x63, 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x62,
+  0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x20, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e,
+  0x3e, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x77, 0x68, 0x69, 0x63, 0x68,
+  0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x3e, 0x0a, 0x3c, 0x6d,
+  0x65, 0x74, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x6f, 0x6e,
+  0x73, 0x69, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x63, 0x61,
+  0x72, 0x72, 0x69, 0x65, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x62, 0x79, 0x48,
+  0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73,
+  0x62, 0x65, 0x63, 0x61, 0x6d, 0x65, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f,
+  0x66, 0x69, 0x6e, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+  0x74, 0x6f, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x69, 0x6e, 0x20,
+  0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x70, 0x69, 0x74, 0x61,
+  0x6c, 0x20, 0x6f, 0x66, 0x77, 0x61, 0x73, 0x20, 0x6f, 0x66, 0x66, 0x69, 0x63,
+  0x69, 0x61, 0x6c, 0x6c, 0x79, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x68, 0x61,
+  0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x48, 0x69, 0x73,
+  0x74, 0x6f, 0x72, 0x79, 0x20, 0x6f, 0x66, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e,
+  0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x64, 0x69, 0x66, 0x66, 0x65,
+  0x72, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x74, 0x6f, 0x20, 0x73,
+  0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, 0x73, 0x75, 0x67,
+  0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x69, 0x6e,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20,
+  0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22,
+  0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f,
+  0x6e, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x68,
+  0x69, 0x73, 0x63, 0x6f, 0x6e, 0x63, 0x65, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x77,
+  0x69, 0x74, 0x68, 0x74, 0x68, 0x65, 0x20, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72,
+  0x73, 0x69, 0x74, 0x79, 0x6f, 0x70, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x20, 0x74,
+  0x6f, 0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74,
+  0x65, 0x78, 0x74, 0x20, 0x6f, 0x66, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63,
+  0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x70, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20,
+  0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x71, 0x22, 0x09, 0x09, 0x3c, 0x64, 0x69,
+  0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x74, 0x68, 0x65, 0x20,
+  0x73, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x72, 0x65, 0x70,
+  0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x6d, 0x61,
+  0x74, 0x68, 0x65, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x69, 0x61, 0x6e, 0x73, 0x65,
+  0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65,
+  0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x65,
+  0x6e, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d,
+  0x22, 0x63, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x68, 0x65, 0x61,
+  0x64, 0x65, 0x72, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75,
+  0x6c, 0x61, 0x72, 0x2c, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x64,
+  0x20, 0x69, 0x6e, 0x74, 0x6f, 0x29, 0x3b, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72,
+  0x69, 0x70, 0x74, 0x3e, 0x0a, 0x3c, 0x70, 0x68, 0x69, 0x6c, 0x6f, 0x73, 0x6f,
+  0x70, 0x68, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x72, 0x70, 0x73, 0x6b, 0x6f,
+  0x68, 0x72, 0x76, 0x61, 0x74, 0x73, 0x6b, 0x69, 0x74, 0x69, 0xe1, 0xba, 0xbf,
+  0x6e, 0x67, 0x20, 0x56, 0x69, 0xe1, 0xbb, 0x87, 0x74, 0xd0, 0xa0, 0xd1, 0x83,
+  0xd1, 0x81, 0xd1, 0x81, 0xd0, 0xba, 0xd0, 0xb8, 0xd0, 0xb9, 0xd1, 0x80, 0xd1,
+  0x83, 0xd1, 0x81, 0xd1, 0x81, 0xd0, 0xba, 0xd0, 0xb8, 0xd0, 0xb9, 0x69, 0x6e,
+  0x76, 0x65, 0x73, 0x74, 0x69, 0x67, 0x61, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x70,
+  0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x63, 0x69, 0xc3, 0xb3, 0x6e,
+  0xd0, 0xba, 0xd0, 0xbe, 0xd1, 0x82, 0xd0, 0xbe, 0xd1, 0x80, 0xd1, 0x8b, 0xd0,
+  0xb5, 0xd0, 0xbe, 0xd0, 0xb1, 0xd0, 0xbb, 0xd0, 0xb0, 0xd1, 0x81, 0xd1, 0x82,
+  0xd0, 0xb8, 0xd0, 0xba, 0xd0, 0xbe, 0xd1, 0x82, 0xd0, 0xbe, 0xd1, 0x80, 0xd1,
+  0x8b, 0xd0, 0xb9, 0xd1, 0x87, 0xd0, 0xb5, 0xd0, 0xbb, 0xd0, 0xbe, 0xd0, 0xb2,
+  0xd0, 0xb5, 0xd0, 0xba, 0xd1, 0x81, 0xd0, 0xb8, 0xd1, 0x81, 0xd1, 0x82, 0xd0,
+  0xb5, 0xd0, 0xbc, 0xd1, 0x8b, 0xd0, 0x9d, 0xd0, 0xbe, 0xd0, 0xb2, 0xd0, 0xbe,
+  0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb8, 0xd0, 0xba, 0xd0, 0xbe, 0xd1, 0x82, 0xd0,
+  0xbe, 0xd1, 0x80, 0xd1, 0x8b, 0xd1, 0x85, 0xd0, 0xbe, 0xd0, 0xb1, 0xd0, 0xbb,
+  0xd0, 0xb0, 0xd1, 0x81, 0xd1, 0x82, 0xd1, 0x8c, 0xd0, 0xb2, 0xd1, 0x80, 0xd0,
+  0xb5, 0xd0, 0xbc, 0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xb8, 0xd0, 0xba, 0xd0, 0xbe,
+  0xd1, 0x82, 0xd0, 0xbe, 0xd1, 0x80, 0xd0, 0xb0, 0xd1, 0x8f, 0xd1, 0x81, 0xd0,
+  0xb5, 0xd0, 0xb3, 0xd0, 0xbe, 0xd0, 0xb4, 0xd0, 0xbd, 0xd1, 0x8f, 0xd1, 0x81,
+  0xd0, 0xba, 0xd0, 0xb0, 0xd1, 0x87, 0xd0, 0xb0, 0xd1, 0x82, 0xd1, 0x8c, 0xd0,
+  0xbd, 0xd0, 0xbe, 0xd0, 0xb2, 0xd0, 0xbe, 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb8,
+  0xd0, 0xa3, 0xd0, 0xba, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xb8, 0xd0, 0xbd, 0xd1,
+  0x8b, 0xd0, 0xb2, 0xd0, 0xbe, 0xd0, 0xbf, 0xd1, 0x80, 0xd0, 0xbe, 0xd1, 0x81,
+  0xd1, 0x8b, 0xd0, 0xba, 0xd0, 0xbe, 0xd1, 0x82, 0xd0, 0xbe, 0xd1, 0x80, 0xd0,
+  0xbe, 0xd0, 0xb9, 0xd1, 0x81, 0xd0, 0xb4, 0xd0, 0xb5, 0xd0, 0xbb, 0xd0, 0xb0,
+  0xd1, 0x82, 0xd1, 0x8c, 0xd0, 0xbf, 0xd0, 0xbe, 0xd0, 0xbc, 0xd0, 0xbe, 0xd1,
+  0x89, 0xd1, 0x8c, 0xd1, 0x8e, 0xd1, 0x81, 0xd1, 0x80, 0xd0, 0xb5, 0xd0, 0xb4,
+  0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb2, 0xd0, 0xbe, 0xd0, 0xb1, 0xd1, 0x80, 0xd0,
+  0xb0, 0xd0, 0xb7, 0xd0, 0xbe, 0xd0, 0xbc, 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xbe,
+  0xd1, 0x80, 0xd0, 0xbe, 0xd0, 0xbd, 0xd1, 0x8b, 0xd1, 0x83, 0xd1, 0x87, 0xd0,
+  0xb0, 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb8, 0xd0, 0xb5, 0xd1, 0x82, 0xd0, 0xb5,
+  0xd1, 0x87, 0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xb8, 0xd0, 0xb5, 0xd0, 0x93, 0xd0,
+  0xbb, 0xd0, 0xb0, 0xd0, 0xb2, 0xd0, 0xbd, 0xd0, 0xb0, 0xd1, 0x8f, 0xd0, 0xb8,
+  0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xbe, 0xd1, 0x80, 0xd0, 0xb8, 0xd0, 0xb8, 0xd1,
+  0x81, 0xd0, 0xb8, 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb5, 0xd0, 0xbc, 0xd0, 0xb0,
+  0xd1, 0x80, 0xd0, 0xb5, 0xd1, 0x88, 0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xb8, 0xd1,
+  0x8f, 0xd0, 0xa1, 0xd0, 0xba, 0xd0, 0xb0, 0xd1, 0x87, 0xd0, 0xb0, 0xd1, 0x82,
+  0xd1, 0x8c, 0xd0, 0xbf, 0xd0, 0xbe, 0xd1, 0x8d, 0xd1, 0x82, 0xd0, 0xbe, 0xd0,
+  0xbc, 0xd1, 0x83, 0xd1, 0x81, 0xd0, 0xbb, 0xd0, 0xb5, 0xd0, 0xb4, 0xd1, 0x83,
+  0xd0, 0xb5, 0xd1, 0x82, 0xd1, 0x81, 0xd0, 0xba, 0xd0, 0xb0, 0xd0, 0xb7, 0xd0,
+  0xb0, 0xd1, 0x82, 0xd1, 0x8c, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xb2, 0xd0, 0xb0,
+  0xd1, 0x80, 0xd0, 0xbe, 0xd0, 0xb2, 0xd0, 0xba, 0xd0, 0xbe, 0xd0, 0xbd, 0xd0,
+  0xb5, 0xd1, 0x87, 0xd0, 0xbd, 0xd0, 0xbe, 0xd1, 0x80, 0xd0, 0xb5, 0xd1, 0x88,
+  0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xb8, 0xd0, 0xb5, 0xd0, 0xba, 0xd0, 0xbe, 0xd1,
+  0x82, 0xd0, 0xbe, 0xd1, 0x80, 0xd0, 0xbe, 0xd0, 0xb5, 0xd0, 0xbe, 0xd1, 0x80,
+  0xd0, 0xb3, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xbe, 0xd0, 0xb2, 0xd0, 0xba, 0xd0,
+  0xbe, 0xd1, 0x82, 0xd0, 0xbe, 0xd1, 0x80, 0xd0, 0xbe, 0xd0, 0xbc, 0xd0, 0xa0,
+  0xd0, 0xb5, 0xd0, 0xba, 0xd0, 0xbb, 0xd0, 0xb0, 0xd0, 0xbc, 0xd0, 0xb0, 0xd8,
+  0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd9, 0x86, 0xd8, 0xaa, 0xd8, 0xaf, 0xd9, 0x89,
+  0xd9, 0x85, 0xd9, 0x86, 0xd8, 0xaa, 0xd8, 0xaf, 0xd9, 0x8a, 0xd8, 0xa7, 0xd8,
+  0xaa, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd9, 0x88, 0xd8, 0xb6, 0xd9, 0x88,
+  0xd8, 0xb9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa8, 0xd8, 0xb1, 0xd8, 0xa7, 0xd9,
+  0x85, 0xd8, 0xac, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd9, 0x88, 0xd8, 0xa7,
+  0xd9, 0x82, 0xd8, 0xb9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb1, 0xd8, 0xb3, 0xd8,
+  0xa7, 0xd8, 0xa6, 0xd9, 0x84, 0xd9, 0x85, 0xd8, 0xb4, 0xd8, 0xa7, 0xd8, 0xb1,
+  0xd9, 0x83, 0xd8, 0xa7, 0xd8, 0xaa, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa3, 0xd8,
+  0xb9, 0xd8, 0xb6, 0xd8, 0xa7, 0xd8, 0xa1, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb1,
+  0xd9, 0x8a, 0xd8, 0xa7, 0xd8, 0xb6, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8,
+  0xaa, 0xd8, 0xb5, 0xd9, 0x85, 0xd9, 0x8a, 0xd9, 0x85, 0xd8, 0xa7, 0xd9, 0x84,
+  0xd8, 0xa7, 0xd8, 0xb9, 0xd8, 0xb6, 0xd8, 0xa7, 0xd8, 0xa1, 0xd8, 0xa7, 0xd9,
+  0x84, 0xd9, 0x86, 0xd8, 0xaa, 0xd8, 0xa7, 0xd8, 0xa6, 0xd8, 0xac, 0xd8, 0xa7,
+  0xd9, 0x84, 0xd8, 0xa3, 0xd9, 0x84, 0xd8, 0xb9, 0xd8, 0xa7, 0xd8, 0xa8, 0xd8,
+  0xa7, 0xd9, 0x84, 0xd8, 0xaa, 0xd8, 0xb3, 0xd8, 0xac, 0xd9, 0x8a, 0xd9, 0x84,
+  0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa3, 0xd9, 0x82, 0xd8, 0xb3, 0xd8, 0xa7, 0xd9,
+  0x85, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb6, 0xd8, 0xba, 0xd8, 0xb7, 0xd8, 0xa7,
+  0xd8, 0xaa, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x81, 0xd9, 0x8a, 0xd8, 0xaf, 0xd9,
+  0x8a, 0xd9, 0x88, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xaa, 0xd8, 0xb1, 0xd8, 0xad,
+  0xd9, 0x8a, 0xd8, 0xa8, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xac, 0xd8, 0xaf, 0xd9,
+  0x8a, 0xd8, 0xaf, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xaa, 0xd8, 0xb9,
+  0xd9, 0x84, 0xd9, 0x8a, 0xd9, 0x85, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa3, 0xd8,
+  0xae, 0xd8, 0xa8, 0xd8, 0xa7, 0xd8, 0xb1, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa7,
+  0xd9, 0x81, 0xd9, 0x84, 0xd8, 0xa7, 0xd9, 0x85, 0xd8, 0xa7, 0xd9, 0x84, 0xd8,
+  0xa3, 0xd9, 0x81, 0xd9, 0x84, 0xd8, 0xa7, 0xd9, 0x85, 0xd8, 0xa7, 0xd9, 0x84,
+  0xd8, 0xaa, 0xd8, 0xa7, 0xd8, 0xb1, 0xd9, 0x8a, 0xd8, 0xae, 0xd8, 0xa7, 0xd9,
+  0x84, 0xd8, 0xaa, 0xd9, 0x82, 0xd9, 0x86, 0xd9, 0x8a, 0xd8, 0xa9, 0xd8, 0xa7,
+  0xd9, 0x84, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb9, 0xd8, 0xa7, 0xd8, 0xa8, 0xd8,
+  0xa7, 0xd9, 0x84, 0xd8, 0xae, 0xd9, 0x88, 0xd8, 0xa7, 0xd8, 0xb7, 0xd8, 0xb1,
+  0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd8, 0xac, 0xd8, 0xaa, 0xd9, 0x85, 0xd8,
+  0xb9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xaf, 0xd9, 0x8a, 0xd9, 0x83, 0xd9, 0x88,
+  0xd8, 0xb1, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb3, 0xd9, 0x8a, 0xd8, 0xa7, 0xd8,
+  0xad, 0xd8, 0xa9, 0xd8, 0xb9, 0xd8, 0xa8, 0xd8, 0xaf, 0xd8, 0xa7, 0xd9, 0x84,
+  0xd9, 0x84, 0xd9, 0x87, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xaa, 0xd8, 0xb1, 0xd8,
+  0xa8, 0xd9, 0x8a, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb1, 0xd9, 0x88,
+  0xd8, 0xa7, 0xd8, 0xa8, 0xd8, 0xb7, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa3, 0xd8,
+  0xaf, 0xd8, 0xa8, 0xd9, 0x8a, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa7,
+  0xd8, 0xae, 0xd8, 0xa8, 0xd8, 0xa7, 0xd8, 0xb1, 0xd8, 0xa7, 0xd9, 0x84, 0xd9,
+  0x85, 0xd8, 0xaa, 0xd8, 0xad, 0xd8, 0xaf, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84,
+  0xd8, 0xa7, 0xd8, 0xba, 0xd8, 0xa7, 0xd9, 0x86, 0xd9, 0x8a, 0x63, 0x75, 0x72,
+  0x73, 0x6f, 0x72, 0x3a, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x3c,
+  0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x0a, 0x3c, 0x6d, 0x65, 0x74, 0x61,
+  0x20, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70,
+  0x3a, 0x2f, 0x2f, 0x22, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c,
+  0x61, 0x73, 0x73, 0x3d, 0x22, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20,
+  0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77,
+  0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74,
+  0x69, 0x63, 0x61, 0x6c, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x2f, 0x61,
+  0x3e, 0x20, 0x7c, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+  0x3c, 0x21, 0x64, 0x6f, 0x63, 0x74, 0x79, 0x70, 0x65, 0x20, 0x68, 0x74, 0x6d,
+  0x6c, 0x3e, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x3d, 0x22, 0x73, 0x63, 0x72, 0x65,
+  0x65, 0x6e, 0x22, 0x20, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76,
+  0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e,
+  0x2e, 0x69, 0x63, 0x6f, 0x22, 0x20, 0x2f, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x64,
+  0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, 0x68, 0x61,
+  0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22,
+  0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3d, 0x22, 0x67, 0x65, 0x74, 0x22,
+  0x20, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, 0x2f, 0x68, 0x74, 0x6d,
+  0x6c, 0x3e, 0x0a, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x20, 0x69,
+  0x63, 0x6f, 0x6e, 0x22, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74,
+  0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e,
+  0x67, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x72, 0x65, 0x70, 0x72,
+  0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x73, 0x73, 0x75,
+  0x62, 0x6d, 0x69, 0x74, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22,
+  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72,
+  0x22, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x6f, 0x75, 0x74, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x66,
+  0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76,
+  0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x75, 0x62, 0x6d, 0x69,
+  0x74, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6f, 0x6e, 0x65,
+  0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x73, 0x74, 0x20,
+  0x76, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x22, 0x3e,
+  0x3c, 0x77, 0x61, 0x73, 0x20, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73,
+  0x68, 0x65, 0x64, 0x29, 0x3b, 0x0d, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69,
+  0x70, 0x74, 0x3e, 0x0d, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66,
+  0x61, 0x6c, 0x73, 0x65, 0x3b, 0x22, 0x3e, 0x29, 0x2e, 0x73, 0x74, 0x79, 0x6c,
+  0x65, 0x2e, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x62, 0x65, 0x63, 0x61,
+  0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f,
+  0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65,
+  0x3c, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d,
+  0x22, 0x2f, 0x7d, 0x62, 0x6f, 0x64, 0x79, 0x7b, 0x6d, 0x61, 0x72, 0x67, 0x69,
+  0x6e, 0x3a, 0x30, 0x3b, 0x45, 0x6e, 0x63, 0x79, 0x63, 0x6c, 0x6f, 0x70, 0x65,
+  0x64, 0x69, 0x61, 0x20, 0x6f, 0x66, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
+  0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x2e, 0x63, 0x72, 0x65, 0x61,
+  0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x6e, 0x61, 0x6d,
+  0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x3c,
+  0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a,
+  0x0a, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69,
+  0x76, 0x65, 0x20, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, 0x2f,
+  0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x20,
+  0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x22, 0x3e, 0x3c, 0x69, 0x6e, 0x70,
+  0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x70, 0x6f, 0x72, 0x74,
+  0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x73,
+  0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66,
+  0x3d, 0x22, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74,
+  0x72, 0x69, 0x65, 0x73, 0x22, 0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63,
+  0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e,
+  0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x49, 0x6e, 0x20, 0x6f, 0x74,
+  0x68, 0x65, 0x72, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x2c, 0x64, 0x69, 0x73,
+  0x70, 0x6c, 0x61, 0x79, 0x3a, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x63,
+  0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+  0x20, 0x6f, 0x66, 0x2f, 0x3e, 0x0a, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6e,
+  0x61, 0x6d, 0x65, 0x3d, 0x22, 0x61, 0x73, 0x20, 0x77, 0x65, 0x6c, 0x6c, 0x20,
+  0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x65, 0x63,
+  0x65, 0x6e, 0x74, 0x20, 0x79, 0x65, 0x61, 0x72, 0x73, 0x0d, 0x0a, 0x09, 0x3c,
+  0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x3c, 0x2f,
+  0x64, 0x69, 0x76, 0x3e, 0x0a, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a,
+  0x69, 0x6e, 0x73, 0x70, 0x69, 0x72, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74,
+  0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c,
+  0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x62, 0x65, 0x63, 0x61, 0x6d, 0x65, 0x20,
+  0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x73, 0x74, 0x79, 0x6c,
+  0x65, 0x3d, 0x22, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x2e, 0x6a, 0x73,
+  0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, 0x20,
+  0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c,
+  0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62,
+  0x65, 0x65, 0x6e, 0x47, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x20, 0x6c, 0x61, 0x6e,
+  0x67, 0x75, 0x61, 0x67, 0x65, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22,
+  0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e,
+  0x69, 0x73, 0x74, 0x20, 0x50, 0x61, 0x72, 0x74, 0x79, 0x63, 0x6f, 0x6e, 0x73,
+  0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x62, 0x6f,
+  0x72, 0x64, 0x65, 0x72, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x63, 0x65, 0x6c, 0x6c,
+  0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74,
+  0x3d, 0x22, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74,
+  0x79, 0x20, 0x6f, 0x66, 0x22, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22,
+  0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64,
+  0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x6e, 0x79, 0x20,
+  0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x4f, 0x72, 0x74,
+  0x68, 0x6f, 0x64, 0x6f, 0x78, 0x20, 0x43, 0x68, 0x75, 0x72, 0x63, 0x68, 0x73,
+  0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x2f, 0x3e, 0x0a, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c,
+  0x3d, 0x22, 0x73, 0x77, 0x61, 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x20, 0x68, 0x69,
+  0x73, 0x20, 0x64, 0x65, 0x61, 0x74, 0x68, 0x7d, 0x29, 0x28, 0x29, 0x3b, 0x0a,
+  0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x6f, 0x74, 0x68, 0x65,
+  0x72, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x73, 0x63, 0x6f,
+  0x6d, 0x70, 0x61, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65,
+  0x70, 0x6f, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74,
+  0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x4e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6c,
+  0x61, 0x6e, 0x64, 0x73, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x73, 0x74, 0x20,
+  0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f,
+  0x75, 0x6e, 0x64, 0x3a, 0x75, 0x72, 0x6c, 0x28, 0x61, 0x72, 0x67, 0x75, 0x65,
+  0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x73, 0x63, 0x72,
+  0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x6e, 0x6f, 0x22, 0x20, 0x69,
+  0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68,
+  0x65, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
+  0x61, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f,
+  0x66, 0x20, 0x74, 0x68, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65,
+  0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72,
+  0x61, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x64, 0x65, 0x76, 0x65,
+  0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x66, 0x72,
+  0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x75, 0x73, 0x65, 0x64,
+  0x61, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+  0x6f, 0x66, 0x76, 0x65, 0x72, 0x79, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61,
+  0x72, 0x20, 0x74, 0x6f, 0x73, 0x75, 0x72, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x69,
+  0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
+  0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x61, 0x6c, 0x69, 0x67, 0x6e,
+  0x3d, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x77, 0x6f, 0x75,
+  0x6c, 0x64, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x69,
+  0x6d, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+  0x3d, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20,
+  0x74, 0x68, 0x65, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67,
+  0x20, 0x74, 0x68, 0x61, 0x74, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66,
+  0x6f, 0x72, 0x6d, 0x20, 0x6f, 0x66, 0x20, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76,
+  0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x69, 0x73, 0x20, 0x64,
+  0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x6e, 0x61,
+  0x6d, 0x65, 0x64, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65,
+  0x49, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+  0x74, 0x6f, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+  0x73, 0x20, 0x6f, 0x6e, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x77,
+  0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20,
+  0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63,
+  0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x6d, 0x6f, 0x73,
+  0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x69,
+  0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6e,
+  0x64, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20,
+  0x74, 0x68, 0x65, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, 0x65, 0x20, 0x6f,
+  0x66, 0x20, 0x74, 0x68, 0x65, 0x54, 0x68, 0x69, 0x73, 0x20, 0x6d, 0x65, 0x61,
+  0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e,
+  0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x77, 0x61, 0x73, 0x20,
+  0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x20, 0x62, 0x79, 0x61, 0x6e,
+  0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65,
+  0x69, 0x6e, 0x73, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66,
+  0x6f, 0x72, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x65, 0x64, 0x20, 0x61, 0x73,
+  0x20, 0x74, 0x68, 0x65, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x73, 0x75, 0x63, 0x63,
+  0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x61,
+  0x73, 0x20, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x61, 0x20, 0x63, 0x6f, 0x6d,
+  0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x48, 0x69, 0x73,
+  0x74, 0x6f, 0x72, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77,
+  0x65, 0x72, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x65,
+  0x64, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20,
+  0x74, 0x68, 0x65, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72,
+  0x65, 0x64, 0x20, 0x74, 0x6f, 0x55, 0x6e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
+  0x64, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3e, 0x0a, 0x09, 0x3c, 0x64, 0x69,
+  0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x73,
+  0x69, 0x73, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x73, 0x74,
+  0x6f, 0x70, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+  0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74,
+  0x68, 0x65, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74,
+  0x79, 0x20, 0x6f, 0x66, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x73, 0x20, 0x74,
+  0x6f, 0x20, 0x68, 0x61, 0x76, 0x65, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x6f,
+  0x6d, 0x61, 0x67, 0x6e, 0x65, 0x74, 0x69, 0x63, 0x65, 0x6e, 0x61, 0x62, 0x6c,
+  0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x28, 0x66, 0x75, 0x6e,
+  0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x49,
+  0x74, 0x20, 0x69, 0x73, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e,
+  0x74, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, 0x2f, 0x64,
+  0x69, 0x76, 0x3e, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29,
+  0x7b, 0x76, 0x61, 0x72, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65,
+  0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x61, 0x73, 0x20, 0x61, 0x20, 0x72,
+  0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x46, 0x6f,
+  0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e,
+  0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3d, 0x22, 0x70, 0x6f, 0x73, 0x74,
+  0x22, 0x20, 0x77, 0x61, 0x73, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65,
+  0x64, 0x20, 0x62, 0x79, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x6d, 0x64, 0x61, 0x73,
+  0x68, 0x3b, 0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70,
+  0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x6a, 0x73, 0x22, 0x3e, 0x3c,
+  0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0d, 0x0a, 0x75, 0x6c, 0x3e,
+  0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x61,
+  0x66, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x61, 0x74,
+  0x68, 0x77, 0x69, 0x74, 0x68, 0x20, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74,
+  0x20, 0x74, 0x6f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x70, 0x61, 0x64,
+  0x64, 0x69, 0x6e, 0x67, 0x3a, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69,
+  0x63, 0x75, 0x6c, 0x61, 0x72, 0x6c, 0x79, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61,
+  0x79, 0x3a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x3b, 0x20, 0x74, 0x79, 0x70,
+  0x65, 0x3d, 0x22, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x22, 0x20, 0x69, 0x73,
+  0x20, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f,
+  0xe4, 0xb8, 0xad, 0xe6, 0x96, 0x87, 0x20, 0x28, 0xe7, 0xae, 0x80, 0xe4, 0xbd,
+  0x93, 0x29, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x61, 0x62, 0x69, 0x6c,
+  0x69, 0x64, 0x61, 0x64, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74, 0x72,
+  0x61, 0x63, 0x69, 0xc3, 0xb3, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61,
+  0x63, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x65, 0x73, 0x63, 0x6f, 0x72, 0x72, 0x65,
+  0x73, 0x70, 0x6f, 0x6e, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x65, 0xe0, 0xa4, 0x89,
+  0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xaf, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x97, 0xe0,
+  0xa4, 0xaa, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4,
+  0xb5, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0,
+  0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x97, 0xe0,
+  0xa5, 0x8b, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x9a, 0xe0, 0xa5, 0x81, 0xe0, 0xa4,
+  0xa8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x87,
+  0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xb8, 0xe0,
+  0xa4, 0xb0, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4,
+  0xaa, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xb8,
+  0xe0, 0xa4, 0x96, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x9c, 0xe0, 0xa5, 0x87, 0xe0,
+  0xa4, 0x82, 0xe0, 0xa4, 0x9a, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4,
+  0xbf, 0xe0, 0xa4, 0x8f, 0xe0, 0xa4, 0xad, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x9c,
+  0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xb6, 0xe0, 0xa4, 0xbe, 0xe0,
+  0xa4, 0xae, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4,
+  0xae, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x9c,
+  0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa3, 0xe0,
+  0xa4, 0xac, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5,
+  0x87, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbe,
+  0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xac, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb2, 0xe0,
+  0xa5, 0x89, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4,
+  0xb2, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xb9,
+  0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaa, 0xe0,
+  0xa5, 0x83, 0xe0, 0xa4, 0xb7, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa0, 0xe0, 0xa4,
+  0xac, 0xe0, 0xa4, 0xa2, 0xe0, 0xa4, 0xbc, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x87,
+  0xe0, 0xa4, 0xad, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xaa, 0xe0,
+  0xa4, 0xbe, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4,
+  0xbf, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0x9f, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb0,
+  0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0x96, 0xe0, 0xa4, 0xbf, 0xe0,
+  0xa4, 0xb2, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xab, 0xe0, 0xa4, 0xa6, 0xe0, 0xa5,
+  0x8c, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xae,
+  0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x87, 0xe0,
+  0xa4, 0xae, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4,
+  0xa8, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xbe,
+  0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x95, 0xe0,
+  0xa4, 0xbe, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4,
+  0xaf, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x9a, 0xe0, 0xa4, 0xbe,
+  0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xaa, 0xe0,
+  0xa4, 0xb9, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0x81, 0xe0, 0xa4, 0x9a, 0xe0, 0xa4,
+  0xac, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xbe,
+  0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbe, 0xe0,
+  0xa4, 0xa6, 0xe0, 0xa4, 0xa6, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x96, 0xe0, 0xa4,
+  0xa8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x9b,
+  0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbf, 0xe0,
+  0xa4, 0xb6, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb7, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4,
+  0xbe, 0xe0, 0xa4, 0x9c, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0x89,
+  0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xb0, 0xe0,
+  0xa4, 0xae, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xac, 0xe0, 0xa4,
+  0x88, 0xe0, 0xa4, 0xa6, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x8b,
+  0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x89, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0x95, 0xe0,
+  0xa4, 0xb0, 0xe0, 0xa4, 0xa3, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xa2, 0xe0, 0xa4,
+  0xbc, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x8d,
+  0xe0, 0xa4, 0xa5, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xab, 0xe0,
+  0xa4, 0xbf, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xae, 0xe0, 0xa4,
+  0xae, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0x96, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xaf,
+  0xe0, 0xa4, 0x85, 0xe0, 0xa4, 0x9a, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0x9b, 0xe0,
+  0xa4, 0xbe, 0xe0, 0xa4, 0x9b, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0x9f, 0xe0, 0xa4,
+  0xa4, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x97,
+  0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xbe, 0xe0,
+  0xa4, 0x8f, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4,
+  0xbf, 0xe0, 0xa4, 0xad, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0x98,
+  0xe0, 0xa4, 0xa3, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0x9f, 0xe0, 0xa5, 0x87, 0xe0,
+  0xa4, 0xa6, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5,
+  0x87, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x8b,
+  0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x8d, 0xe0,
+  0xa4, 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4,
+  0x95, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xbe,
+  0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xa7, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xb5, 0xe0,
+  0xa4, 0xbf, 0xe0, 0xa4, 0xb6, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4,
+  0xb0, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x82,
+  0xe0, 0xa4, 0xa6, 0xe0, 0xa5, 0x88, 0xe0, 0xa4, 0x9f, 0xe0, 0xa5, 0x8d, 0xe0,
+  0xa4, 0xb8, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4,
+  0xb6, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xae,
+  0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x85, 0xe0, 0xa4, 0xa6, 0xe0,
+  0xa4, 0xbe, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xac, 0xe0, 0xa4,
+  0xbf, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xaa,
+  0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0xb7, 0xe0,
+  0xa4, 0xb9, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xa6, 0xe0, 0xa5,
+  0x80, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x8d,
+  0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbf, 0xe0,
+  0xa4, 0xa4, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x81, 0xe0, 0xa4,
+  0xaa, 0xe0, 0xa4, 0xaf, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x8d,
+  0xe0, 0xa4, 0xa5, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0x95, 0xe0,
+  0xa4, 0xb0, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0xa1, 0xe0, 0xa4, 0xbc, 0xe0, 0xa4,
+  0xae, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa4,
+  0xe0, 0xa4, 0xaf, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xa8, 0xe0,
+  0xa4, 0xbe, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x83, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4,
+  0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaa, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0xb8,
+  0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0x9f, 0xe0, 0xa4, 0x98, 0xe0, 0xa4, 0xb0, 0xe0,
+  0xa5, 0x87, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0x95, 0xe0, 0xa4,
+  0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xb5,
+  0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x9a, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0,
+  0xa4, 0xb8, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0x9a, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4,
+  0xbe, 0xe0, 0xa4, 0xae, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x8d,
+  0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xa6, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x96, 0xe0,
+  0xa5, 0x87, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xae, 0xe0, 0xa5,
+  0x87, 0xe0, 0xa4, 0xb6, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x8d,
+  0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x82, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xae, 0xe0,
+  0xa5, 0x88, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x87, 0xe0, 0xa4,
+  0xa4, 0xe0, 0xa5, 0x88, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0,
+  0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x95, 0xe0,
+  0xa5, 0x87, 0x72, 0x73, 0x73, 0x2b, 0x78, 0x6d, 0x6c, 0x22, 0x20, 0x74, 0x69,
+  0x74, 0x6c, 0x65, 0x3d, 0x22, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x63,
+  0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x74, 0x69, 0x74, 0x6c, 0x65,
+  0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x61, 0x74,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x69, 0x6d,
+  0x65, 0x2e, 0x6a, 0x73, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70,
+  0x74, 0x3e, 0x0a, 0x3c, 0x22, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3d,
+  0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x20, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e,
+  0x3e, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x76, 0x65, 0x72,
+  0x74, 0x69, 0x63, 0x61, 0x6c, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x74,
+  0x2f, 0x6a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x6d, 0x69, 0x6e, 0x2e, 0x6a,
+  0x73, 0x22, 0x3e, 0x2e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x28, 0x66, 0x75, 0x6e,
+  0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d,
+  0x22, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x7d, 0x29, 0x28, 0x29,
+  0x3b, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x3c,
+  0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66,
+  0x3d, 0x22, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74,
+  0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x29, 0x3b, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72,
+  0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x3b, 0x74, 0x65, 0x78, 0x74, 0x2d,
+  0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x73,
+  0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x6e, 0x6f, 0x22,
+  0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6c, 0x61,
+  0x70, 0x73, 0x65, 0x3a, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65,
+  0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x42, 0x61, 0x68, 0x61, 0x73, 0x61,
+  0x20, 0x49, 0x6e, 0x64, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0x45, 0x6e, 0x67,
+  0x6c, 0x69, 0x73, 0x68, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65,
+  0x3c, 0x74, 0x65, 0x78, 0x74, 0x20, 0x78, 0x6d, 0x6c, 0x3a, 0x73, 0x70, 0x61,
+  0x63, 0x65, 0x3d, 0x2e, 0x67, 0x69, 0x66, 0x22, 0x20, 0x62, 0x6f, 0x72, 0x64,
+  0x65, 0x72, 0x3d, 0x22, 0x30, 0x22, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e,
+  0x0a, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x6f, 0x76, 0x65, 0x72,
+  0x66, 0x6c, 0x6f, 0x77, 0x3a, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x3b, 0x69,
+  0x6d, 0x67, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a,
+  0x2f, 0x2f, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73,
+  0x74, 0x65, 0x6e, 0x65, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69,
+  0x62, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x2e, 0x6a, 0x73, 0x22,
+  0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x2f, 0x66,
+  0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x2e, 0x69, 0x63, 0x6f, 0x22, 0x20, 0x2f,
+  0x3e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x79,
+  0x73, 0x74, 0x65, 0x6d, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22,
+  0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x31, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74,
+  0x3d, 0x22, 0x5f, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x22, 0x3e, 0x53, 0x74, 0x61,
+  0x74, 0x65, 0x20, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x69, 0x74, 0x79,
+  0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x6c, 0x65,
+  0x66, 0x74, 0x3b, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e,
+  0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x2c, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75,
+  0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x72, 0x6f, 0x75,
+  0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x29,
+  0x3b, 0x0d, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0d,
+  0x0a, 0x3c, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x68, 0x65,
+  0x69, 0x67, 0x68, 0x74, 0x3a, 0x3b, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f,
+  0x77, 0x3a, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x6d, 0x6f, 0x72, 0x65, 0x20,
+  0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6e,
+  0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61,
+  0x6c, 0x61, 0x20, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65,
+  0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x3c, 0x2f, 0x64,
+  0x69, 0x76, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a,
+  0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x20, 0x6e, 0x6f, 0x6e, 0x65,
+  0x3b, 0x22, 0x3e, 0x22, 0x20, 0x2f, 0x3e, 0x0a, 0x3c, 0x6c, 0x69, 0x6e, 0x6b,
+  0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x0a, 0x20, 0x20, 0x28, 0x66, 0x75, 0x6e,
+  0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x74, 0x68, 0x65, 0x20,
+  0x31, 0x35, 0x74, 0x68, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x75, 0x72, 0x79, 0x2e,
+  0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c,
+  0x74, 0x28, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65,
+  0x72, 0x20, 0x6f, 0x66, 0x20, 0x42, 0x79, 0x7a, 0x61, 0x6e, 0x74, 0x69, 0x6e,
+  0x65, 0x20, 0x45, 0x6d, 0x70, 0x69, 0x72, 0x65, 0x2e, 0x6a, 0x70, 0x67, 0x7c,
+  0x74, 0x68, 0x75, 0x6d, 0x62, 0x7c, 0x6c, 0x65, 0x66, 0x74, 0x7c, 0x76, 0x61,
+  0x73, 0x74, 0x20, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x6f,
+  0x66, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x63,
+  0x65, 0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72,
+  0x73, 0x69, 0x74, 0x79, 0x20, 0x50, 0x72, 0x65, 0x73, 0x73, 0x64, 0x6f, 0x6d,
+  0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65,
+  0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x20,
+  0x57, 0x61, 0x72, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69,
+  0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22,
+  0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x74, 0x68, 0x65, 0x20,
+  0x72, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63,
+  0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x20,
+  0x62, 0x79, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x6e, 0x6f, 0x66, 0x6f, 0x6c,
+  0x6c, 0x6f, 0x77, 0x22, 0x3e, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x73, 0x20,
+  0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x72, 0x61, 0x74, 0x68, 0x65,
+  0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x20,
+  0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f,
+  0x66, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68,
+  0x3a, 0x31, 0x30, 0x30, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x2d, 0x73,
+  0x70, 0x65, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74,
+  0x65, 0x72, 0x20, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x62, 0x6f, 0x72,
+  0x64, 0x65, 0x72, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x61, 0x6c, 0x74, 0x3d, 0x22,
+  0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x65,
+  0x20, 0x6f, 0x66, 0x44, 0x65, 0x6d, 0x6f, 0x63, 0x72, 0x61, 0x74, 0x69, 0x63,
+  0x20, 0x50, 0x61, 0x72, 0x74, 0x79, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65,
+  0x3d, 0x22, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x46, 0x6f, 0x72, 0x20,
+  0x74, 0x68, 0x69, 0x73, 0x20, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x2c, 0x2e,
+  0x6a, 0x73, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e,
+  0x0a, 0x09, 0x73, 0x42, 0x79, 0x54, 0x61, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x28,
+  0x73, 0x29, 0x5b, 0x30, 0x5d, 0x6a, 0x73, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x63,
+  0x72, 0x69, 0x70, 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x2e, 0x6a, 0x73, 0x22, 0x3e,
+  0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0d, 0x0a, 0x6c, 0x69,
+  0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x69, 0x63, 0x6f, 0x6e, 0x22,
+  0x20, 0x27, 0x20, 0x61, 0x6c, 0x74, 0x3d, 0x27, 0x27, 0x20, 0x63, 0x6c, 0x61,
+  0x73, 0x73, 0x3d, 0x27, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+  0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,
+  0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x2f, 0x61,
+  0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e,
+  0x2f, 0x70, 0x61, 0x67, 0x65, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x70, 0x61, 0x67,
+  0x65, 0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+  0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x62, 0x65, 0x63, 0x61, 0x6d, 0x65, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x62, 0x61, 0x68, 0x61,
+  0x73, 0x61, 0x20, 0x49, 0x6e, 0x64, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0x65,
+  0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x20, 0x28, 0x73, 0x69, 0x6d, 0x70, 0x6c,
+  0x65, 0x29, 0xce, 0x95, 0xce, 0xbb, 0xce, 0xbb, 0xce, 0xb7, 0xce, 0xbd, 0xce,
+  0xb9, 0xce, 0xba, 0xce, 0xac, 0xd1, 0x85, 0xd1, 0x80, 0xd0, 0xb2, 0xd0, 0xb0,
+  0xd1, 0x82, 0xd1, 0x81, 0xd0, 0xba, 0xd0, 0xb8, 0xd0, 0xba, 0xd0, 0xbe, 0xd0,
+  0xbc, 0xd0, 0xbf, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xb8, 0xd0, 0xb8, 0xd1, 0x8f,
+  0xd0, 0xb2, 0xd0, 0xbb, 0xd1, 0x8f, 0xd0, 0xb5, 0xd1, 0x82, 0xd1, 0x81, 0xd1,
+  0x8f, 0xd0, 0x94, 0xd0, 0xbe, 0xd0, 0xb1, 0xd0, 0xb0, 0xd0, 0xb2, 0xd0, 0xb8,
+  0xd1, 0x82, 0xd1, 0x8c, 0xd1, 0x87, 0xd0, 0xb5, 0xd0, 0xbb, 0xd0, 0xbe, 0xd0,
+  0xb2, 0xd0, 0xb5, 0xd0, 0xba, 0xd0, 0xb0, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xb7,
+  0xd0, 0xb2, 0xd0, 0xb8, 0xd1, 0x82, 0xd0, 0xb8, 0xd1, 0x8f, 0xd0, 0x98, 0xd0,
+  0xbd, 0xd1, 0x82, 0xd0, 0xb5, 0xd1, 0x80, 0xd0, 0xbd, 0xd0, 0xb5, 0xd1, 0x82,
+  0xd0, 0x9e, 0xd1, 0x82, 0xd0, 0xb2, 0xd0, 0xb5, 0xd1, 0x82, 0xd0, 0xb8, 0xd1,
+  0x82, 0xd1, 0x8c, 0xd0, 0xbd, 0xd0, 0xb0, 0xd0, 0xbf, 0xd1, 0x80, 0xd0, 0xb8,
+  0xd0, 0xbc, 0xd0, 0xb5, 0xd1, 0x80, 0xd0, 0xb8, 0xd0, 0xbd, 0xd1, 0x82, 0xd0,
+  0xb5, 0xd1, 0x80, 0xd0, 0xbd, 0xd0, 0xb5, 0xd1, 0x82, 0xd0, 0xba, 0xd0, 0xbe,
+  0xd1, 0x82, 0xd0, 0xbe, 0xd1, 0x80, 0xd0, 0xbe, 0xd0, 0xb3, 0xd0, 0xbe, 0xd1,
+  0x81, 0xd1, 0x82, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xb8, 0xd1, 0x86,
+  0xd1, 0x8b, 0xd0, 0xba, 0xd0, 0xb0, 0xd1, 0x87, 0xd0, 0xb5, 0xd1, 0x81, 0xd1,
+  0x82, 0xd0, 0xb2, 0xd0, 0xb5, 0xd1, 0x83, 0xd1, 0x81, 0xd0, 0xbb, 0xd0, 0xbe,
+  0xd0, 0xb2, 0xd0, 0xb8, 0xd1, 0x8f, 0xd1, 0x85, 0xd0, 0xbf, 0xd1, 0x80, 0xd0,
+  0xbe, 0xd0, 0xb1, 0xd0, 0xbb, 0xd0, 0xb5, 0xd0, 0xbc, 0xd1, 0x8b, 0xd0, 0xbf,
+  0xd0, 0xbe, 0xd0, 0xbb, 0xd1, 0x83, 0xd1, 0x87, 0xd0, 0xb8, 0xd1, 0x82, 0xd1,
+  0x8c, 0xd1, 0x8f, 0xd0, 0xb2, 0xd0, 0xbb, 0xd1, 0x8f, 0xd1, 0x8e, 0xd1, 0x82,
+  0xd1, 0x81, 0xd1, 0x8f, 0xd0, 0xbd, 0xd0, 0xb0, 0xd0, 0xb8, 0xd0, 0xb1, 0xd0,
+  0xbe, 0xd0, 0xbb, 0xd0, 0xb5, 0xd0, 0xb5, 0xd0, 0xba, 0xd0, 0xbe, 0xd0, 0xbc,
+  0xd0, 0xbf, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xb8, 0xd1, 0x8f, 0xd0, 0xb2, 0xd0,
+  0xbd, 0xd0, 0xb8, 0xd0, 0xbc, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xb8, 0xd0, 0xb5,
+  0xd1, 0x81, 0xd1, 0x80, 0xd0, 0xb5, 0xd0, 0xb4, 0xd1, 0x81, 0xd1, 0x82, 0xd0,
+  0xb2, 0xd0, 0xb0, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd9, 0x88, 0xd8, 0xa7,
+  0xd8, 0xb6, 0xd9, 0x8a, 0xd8, 0xb9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb1, 0xd8,
+  0xa6, 0xd9, 0x8a, 0xd8, 0xb3, 0xd9, 0x8a, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84,
+  0xd8, 0xa7, 0xd9, 0x86, 0xd8, 0xaa, 0xd9, 0x82, 0xd8, 0xa7, 0xd9, 0x84, 0xd9,
+  0x85, 0xd8, 0xb4, 0xd8, 0xa7, 0xd8, 0xb1, 0xd9, 0x83, 0xd8, 0xa7, 0xd8, 0xaa,
+  0xd9, 0x83, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb3, 0xd9, 0x8a, 0xd8, 0xa7, 0xd8,
+  0xb1, 0xd8, 0xa7, 0xd8, 0xaa, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd9, 0x83,
+  0xd8, 0xaa, 0xd9, 0x88, 0xd8, 0xa8, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8,
+  0xb3, 0xd8, 0xb9, 0xd9, 0x88, 0xd8, 0xaf, 0xd9, 0x8a, 0xd8, 0xa9, 0xd8, 0xa7,
+  0xd8, 0xad, 0xd8, 0xb5, 0xd8, 0xa7, 0xd8, 0xa6, 0xd9, 0x8a, 0xd8, 0xa7, 0xd8,
+  0xaa, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb9, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85,
+  0xd9, 0x8a, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb5, 0xd9, 0x88, 0xd8,
+  0xaa, 0xd9, 0x8a, 0xd8, 0xa7, 0xd8, 0xaa, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa7,
+  0xd9, 0x86, 0xd8, 0xaa, 0xd8, 0xb1, 0xd9, 0x86, 0xd8, 0xaa, 0xd8, 0xa7, 0xd9,
+  0x84, 0xd8, 0xaa, 0xd8, 0xb5, 0xd8, 0xa7, 0xd9, 0x85, 0xd9, 0x8a, 0xd9, 0x85,
+  0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa5, 0xd8, 0xb3, 0xd9, 0x84, 0xd8, 0xa7, 0xd9,
+  0x85, 0xd9, 0x8a, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd8, 0xb4, 0xd8, 0xa7,
+  0xd8, 0xb1, 0xd9, 0x83, 0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd8,
+  0xb1, 0xd8, 0xa6, 0xd9, 0x8a, 0xd8, 0xa7, 0xd8, 0xaa, 0x72, 0x6f, 0x62, 0x6f,
+  0x74, 0x73, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22,
+  0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x66, 0x6f, 0x6f, 0x74,
+  0x65, 0x72, 0x22, 0x3e, 0x74, 0x68, 0x65, 0x20, 0x55, 0x6e, 0x69, 0x74, 0x65,
+  0x64, 0x20, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x3c, 0x69, 0x6d, 0x67, 0x20,
+  0x73, 0x72, 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x2e,
+  0x6a, 0x70, 0x67, 0x7c, 0x72, 0x69, 0x67, 0x68, 0x74, 0x7c, 0x74, 0x68, 0x75,
+  0x6d, 0x62, 0x7c, 0x2e, 0x6a, 0x73, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72,
+  0x69, 0x70, 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69,
+  0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x66, 0x72,
+  0x61, 0x6d, 0x65, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3d, 0x22, 0x30, 0x22,
+  0x20, 0x73, 0x22, 0x20, 0x2f, 0x3e, 0x0a, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20,
+  0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64,
+  0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x66, 0x6f, 0x6e,
+  0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x62, 0x6f, 0x6c, 0x64,
+  0x3b, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x26,
+  0x71, 0x75, 0x6f, 0x74, 0x3b, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e,
+  0x67, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x67,
+  0x69, 0x6e, 0x3a, 0x30, 0x3b, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a,
+  0x22, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x6e, 0x6f, 0x66, 0x6f, 0x6c, 0x6c,
+  0x6f, 0x77, 0x22, 0x20, 0x50, 0x72, 0x65, 0x73, 0x69, 0x64, 0x65, 0x6e, 0x74,
+  0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x77, 0x65, 0x6e, 0x74,
+  0x69, 0x65, 0x74, 0x68, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x75, 0x72, 0x79, 0x65,
+  0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x70,
+  0x61, 0x67, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x20, 0x45,
+  0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x61, 0x2e, 0x61, 0x73, 0x79, 0x6e,
+  0x63, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x0d, 0x0a, 0x69, 0x6e,
+  0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f,
+  0x75, 0x74, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x68, 0x65,
+  0x61, 0x64, 0x65, 0x72, 0x22, 0x3e, 0x22, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f,
+  0x6e, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x3c, 0x61, 0x20,
+  0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f,
+  0x2f, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x63, 0x6f, 0x6e,
+  0x74, 0x65, 0x6e, 0x74, 0x22, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0d, 0x0a,
+  0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0d, 0x0a, 0x3c, 0x64, 0x65, 0x72, 0x69,
+  0x76, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x27, 0x68, 0x74, 0x74,
+  0x70, 0x3a, 0x2f, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67,
+  0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x0a, 0x3c, 0x2f, 0x62, 0x6f,
+  0x64, 0x79, 0x3e, 0x0a, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x73,
+  0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69,
+  0x7a, 0x65, 0x3a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x6c, 0x61, 0x6e,
+  0x67, 0x75, 0x61, 0x67, 0x65, 0x3d, 0x22, 0x41, 0x72, 0x69, 0x61, 0x6c, 0x2c,
+  0x20, 0x48, 0x65, 0x6c, 0x76, 0x65, 0x74, 0x69, 0x63, 0x61, 0x2c, 0x3c, 0x2f,
+  0x61, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+  0x3d, 0x22, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x3c, 0x73,
+  0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x74, 0x69, 0x63,
+  0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x74, 0x64, 0x3e,
+  0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e,
+  0x3c, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
+  0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65,
+  0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x72, 0x65, 0x6c, 0x3d,
+  0x22, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, 0x20,
+  0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x77, 0x72, 0x69, 0x74,
+  0x65, 0x28, 0x27, 0x3c, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x22,
+  0x75, 0x74, 0x66, 0x2d, 0x38, 0x22, 0x3e, 0x0a, 0x62, 0x65, 0x67, 0x69, 0x6e,
+  0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72,
+  0x65, 0x76, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20,
+  0x74, 0x68, 0x65, 0x74, 0x65, 0x6c, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e,
+  0x20, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x22, 0x20, 0x72, 0x65, 0x6c, 0x3d,
+  0x22, 0x6e, 0x6f, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x22, 0x3e, 0x20, 0x74,
+  0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22, 0x5f, 0x62, 0x6c, 0x61, 0x6e, 0x6b,
+  0x22, 0x3e, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68,
+  0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x68, 0x74, 0x74, 0x70, 0x25, 0x33, 0x41,
+  0x25, 0x32, 0x46, 0x25, 0x32, 0x46, 0x77, 0x77, 0x77, 0x2e, 0x6d, 0x61, 0x6e,
+  0x69, 0x66, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f,
+  0x66, 0x50, 0x72, 0x69, 0x6d, 0x65, 0x20, 0x4d, 0x69, 0x6e, 0x69, 0x73, 0x74,
+  0x65, 0x72, 0x20, 0x6f, 0x66, 0x69, 0x6e, 0x66, 0x6c, 0x75, 0x65, 0x6e, 0x63,
+  0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x63, 0x6c, 0x61, 0x73,
+  0x73, 0x3d, 0x22, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x66, 0x69, 0x78, 0x22, 0x3e,
+  0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e,
+  0x0d, 0x0a, 0x0d, 0x0a, 0x74, 0x68, 0x72, 0x65, 0x65, 0x2d, 0x64, 0x69, 0x6d,
+  0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x43, 0x68, 0x75, 0x72, 0x63,
+  0x68, 0x20, 0x6f, 0x66, 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x61, 0x6e, 0x64, 0x6f,
+  0x66, 0x20, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x20, 0x43, 0x61, 0x72, 0x6f, 0x6c,
+  0x69, 0x6e, 0x61, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x20, 0x6b, 0x69, 0x6c,
+  0x6f, 0x6d, 0x65, 0x74, 0x72, 0x65, 0x73, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76,
+  0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x64, 0x69,
+  0x73, 0x74, 0x69, 0x6e, 0x63, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74,
+  0x68, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x6b, 0x6e,
+  0x6f, 0x77, 0x6e, 0x20, 0x61, 0x73, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x74, 0x69,
+  0x63, 0x20, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x62, 0x65, 0x74, 0x64, 0x65, 0x63,
+  0x6c, 0x61, 0x72, 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68,
+  0x65, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x62,
+  0x79, 0x20, 0x74, 0x68, 0x65, 0x42, 0x65, 0x6e, 0x6a, 0x61, 0x6d, 0x69, 0x6e,
+  0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x6c, 0x69, 0x6e, 0x72, 0x6f, 0x6c, 0x65,
+  0x2d, 0x70, 0x6c, 0x61, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x67, 0x61, 0x6d, 0x65,
+  0x74, 0x68, 0x65, 0x20, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x69, 0x74,
+  0x79, 0x20, 0x6f, 0x66, 0x69, 0x6e, 0x20, 0x57, 0x65, 0x73, 0x74, 0x65, 0x72,
+  0x6e, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x70, 0x65, 0x72, 0x73, 0x6f,
+  0x6e, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x72, 0x50,
+  0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x47, 0x75, 0x74, 0x65, 0x6e, 0x62,
+  0x65, 0x72, 0x67, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x6c, 0x65, 0x73, 0x73,
+  0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65,
+  0x65, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x74, 0x6f,
+  0x67, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74,
+  0x68, 0x65, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x3c, 0x6c, 0x69, 0x20, 0x63,
+  0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x69, 0x6e, 0x20, 0x73, 0x6f, 0x6d, 0x65,
+  0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x6d, 0x69, 0x6e,
+  0x2e, 0x6a, 0x73, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+  0x3e, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x6f, 0x70, 0x75, 0x6c,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x69, 0x61, 0x6c,
+  0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3c, 0x69, 0x6d, 0x67,
+  0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2f,
+  0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x79,
+  0x20, 0x74, 0x68, 0x65, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x20, 0x72,
+  0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x63, 0x6c, 0x61, 0x73, 0x73,
+  0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x63,
+  0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65,
+  0x72, 0x65, 0x64, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x20, 0x6d, 0x65,
+  0x63, 0x68, 0x61, 0x6e, 0x69, 0x63, 0x73, 0x4e, 0x65, 0x76, 0x65, 0x72, 0x74,
+  0x68, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x69,
+  0x6c, 0x6c, 0x69, 0x6f, 0x6e, 0x20, 0x79, 0x65, 0x61, 0x72, 0x73, 0x20, 0x61,
+  0x67, 0x6f, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f,
+  0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0d, 0xce, 0x95, 0xce, 0xbb, 0xce, 0xbb, 0xce,
+  0xb7, 0xce, 0xbd, 0xce, 0xb9, 0xce, 0xba, 0xce, 0xac, 0x0a, 0x74, 0x61, 0x6b,
+  0x65, 0x20, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x20, 0x6f,
+  0x66, 0x61, 0x6e, 0x64, 0x2c, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x69,
+  0x6e, 0x67, 0x20, 0x74, 0x6f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
+  0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x4d, 0x69, 0x63, 0x72,
+  0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73,
+  0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x63, 0x65, 0x6e,
+  0x74, 0x75, 0x72, 0x79, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x64, 0x69, 0x76, 0x20, 0x63,
+  0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73,
+  0x68, 0x6f, 0x72, 0x74, 0x6c, 0x79, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20,
+  0x74, 0x68, 0x65, 0x6e, 0x6f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x78,
+  0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x20, 0x6f,
+  0x66, 0x20, 0x74, 0x68, 0x6f, 0x75, 0x73, 0x61, 0x6e, 0x64, 0x73, 0x73, 0x65,
+  0x76, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65,
+  0x6e, 0x74, 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2e, 0x72, 0x65, 0x61, 0x63, 0x68, 0x69, 0x6e,
+  0x67, 0x20, 0x6d, 0x69, 0x6c, 0x69, 0x74, 0x61, 0x72, 0x79, 0x69, 0x73, 0x6f,
+  0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68,
+  0x65, 0x6f, 0x70, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74,
+  0x6f, 0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x4f, 0x6c, 0x64, 0x20,
+  0x54, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x66, 0x72, 0x69,
+  0x63, 0x61, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x73,
+  0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f,
+  0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x20,
+  0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x6f,
+  0x70, 0x6f, 0x6c, 0x69, 0x74, 0x61, 0x6e, 0x20, 0x61, 0x72, 0x65, 0x61, 0x6d,
+  0x61, 0x6b, 0x65, 0x73, 0x20, 0x69, 0x74, 0x20, 0x70, 0x6f, 0x73, 0x73, 0x69,
+  0x62, 0x6c, 0x65, 0x61, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67,
+  0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x61, 0x72, 0x67, 0x75, 0x61, 0x62,
+  0x6c, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x73, 0x74, 0x74, 0x79,
+  0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22,
+  0x3e, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61,
+  0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x41, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x69,
+  0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x65, 0x3d,
+  0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, 0x20, 0x2f, 0x3e,
+  0x0a, 0x63, 0x6f, 0x69, 0x6e, 0x63, 0x69, 0x64, 0x65, 0x20, 0x77, 0x69, 0x74,
+  0x68, 0x20, 0x74, 0x68, 0x65, 0x74, 0x77, 0x6f, 0x2d, 0x74, 0x68, 0x69, 0x72,
+  0x64, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x44, 0x75, 0x72, 0x69,
+  0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x2c,
+  0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x65,
+  0x72, 0x69, 0x6f, 0x64, 0x61, 0x6e, 0x6e, 0x6f, 0x75, 0x6e, 0x63, 0x65, 0x64,
+  0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x69,
+  0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x61,
+  0x6e, 0x64, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x72, 0x65, 0x63, 0x65, 0x6e,
+  0x74, 0x6c, 0x79, 0x62, 0x65, 0x6c, 0x69, 0x65, 0x76, 0x65, 0x64, 0x20, 0x74,
+  0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x63, 0x6f, 0x6e, 0x73, 0x63, 0x69,
+  0x6f, 0x75, 0x73, 0x6e, 0x65, 0x73, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x66, 0x6f,
+  0x72, 0x6d, 0x65, 0x72, 0x6c, 0x79, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20,
+  0x61, 0x73, 0x73, 0x75, 0x72, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x20,
+  0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x61,
+  0x70, 0x70, 0x65, 0x61, 0x72, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x6f, 0x63, 0x63,
+  0x61, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x75, 0x73, 0x65,
+  0x64, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x61, 0x62, 0x73,
+  0x6f, 0x6c, 0x75, 0x74, 0x65, 0x3b, 0x22, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65,
+  0x74, 0x3d, 0x22, 0x5f, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x22, 0x20, 0x70, 0x6f,
+  0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69,
+  0x76, 0x65, 0x3b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e,
+  0x3a, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x6a, 0x61, 0x78, 0x2f, 0x6c,
+  0x69, 0x62, 0x73, 0x2f, 0x6a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2f, 0x31, 0x2e,
+  0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f,
+  0x6c, 0x6f, 0x72, 0x3a, 0x23, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x61, 0x70,
+  0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x61, 0x6e, 0x67,
+  0x75, 0x61, 0x67, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+  0x3d, 0x22, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d,
+  0x65, 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x50, 0x72, 0x69, 0x76, 0x61, 0x63,
+  0x79, 0x20, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x3c, 0x2f, 0x61, 0x3e, 0x65,
+  0x28, 0x22, 0x25, 0x33, 0x43, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x73,
+  0x72, 0x63, 0x3d, 0x27, 0x22, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d,
+  0x22, 0x5f, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x22, 0x3e, 0x4f, 0x6e, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x68, 0x61, 0x6e, 0x64,
+  0x2c, 0x2e, 0x6a, 0x70, 0x67, 0x7c, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x7c, 0x72,
+  0x69, 0x67, 0x68, 0x74, 0x7c, 0x32, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c,
+  0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x3c, 0x64,
+  0x69, 0x76, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x66, 0x6c, 0x6f,
+  0x61, 0x74, 0x3a, 0x6e, 0x69, 0x6e, 0x65, 0x74, 0x65, 0x65, 0x6e, 0x74, 0x68,
+  0x20, 0x63, 0x65, 0x6e, 0x74, 0x75, 0x72, 0x79, 0x3c, 0x2f, 0x62, 0x6f, 0x64,
+  0x79, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0d, 0x0a,
+  0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74,
+  0x70, 0x3a, 0x2f, 0x2f, 0x73, 0x3b, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c,
+  0x69, 0x67, 0x6e, 0x3a, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x6f, 0x6e,
+  0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x62, 0x6f, 0x6c,
+  0x64, 0x3b, 0x20, 0x41, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x20,
+  0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72,
+  0x65, 0x6e, 0x63, 0x65, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x22,
+  0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3d,
+  0x22, 0x30, 0x22, 0x20, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22,
+  0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x6c, 0x69, 0x6e, 0x6b,
+  0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
+  0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e,
+  0x64, 0x74, 0x64, 0x22, 0x3e, 0x0a, 0x64, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x20,
+  0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x3c, 0x2f,
+  0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x3c, 0x2f, 0x74, 0x61, 0x62,
+  0x6c, 0x65, 0x3e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x6c, 0x79, 0x20, 0x72, 0x65,
+  0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x66, 0x6f, 0x72, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65,
+  0x3b, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a,
+  0x62, 0x6f, 0x6c, 0x64, 0x3b, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79,
+  0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x3c, 0x73, 0x70,
+  0x61, 0x6e, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x66, 0x6f, 0x6e,
+  0x74, 0x2d, 0x6f, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x79, 0x73, 0x74, 0x61, 0x74,
+  0x65, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x09, 0x3c, 0x64, 0x69, 0x76, 0x20,
+  0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x64,
+  0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74,
+  0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d,
+  0x70, 0x6c, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x20, 0x77, 0x69,
+  0x64, 0x65, 0x20, 0x76, 0x61, 0x72, 0x69, 0x65, 0x74, 0x79, 0x20, 0x6f, 0x66,
+  0x20, 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x68, 0x74,
+  0x6d, 0x6c, 0x3e, 0x0d, 0x0a, 0x3c, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x26,
+  0x6e, 0x62, 0x73, 0x70, 0x3b, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x22, 0x3e,
+  0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70,
+  0x3a, 0x2f, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x66, 0x6c, 0x6f,
+  0x61, 0x74, 0x3a, 0x6c, 0x65, 0x66, 0x74, 0x3b, 0x63, 0x6f, 0x6e, 0x63, 0x65,
+  0x72, 0x6e, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65,
+  0x3d, 0x68, 0x74, 0x74, 0x70, 0x25, 0x33, 0x41, 0x25, 0x32, 0x46, 0x25, 0x32,
+  0x46, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x20, 0x70, 0x6f, 0x70, 0x75, 0x6c,
+  0x61, 0x72, 0x20, 0x63, 0x75, 0x6c, 0x74, 0x75, 0x72, 0x65, 0x74, 0x79, 0x70,
+  0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, 0x20,
+  0x2f, 0x3e, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x70, 0x6f, 0x73, 0x73, 0x69,
+  0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x48, 0x61, 0x72, 0x76, 0x61, 0x72,
+  0x64, 0x20, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x69, 0x74, 0x79, 0x74,
+  0x79, 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, 0x20, 0x68, 0x72, 0x65,
+  0x66, 0x3d, 0x22, 0x2f, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20,
+  0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x4f, 0x78, 0x66, 0x6f,
+  0x72, 0x64, 0x20, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x69, 0x74, 0x79,
+  0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6b, 0x65, 0x79, 0x77, 0x6f,
+  0x72, 0x64, 0x73, 0x22, 0x20, 0x63, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22,
+  0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x74, 0x68,
+  0x65, 0x20, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x4b, 0x69, 0x6e, 0x67,
+  0x64, 0x6f, 0x6d, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x67, 0x6f,
+  0x76, 0x65, 0x72, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x3c, 0x64, 0x69, 0x76, 0x20,
+  0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e,
+  0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+  0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x3c, 0x64, 0x69,
+  0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x68, 0x65, 0x61, 0x64,
+  0x65, 0x72, 0x2e, 0x6d, 0x69, 0x6e, 0x2e, 0x6a, 0x73, 0x22, 0x3e, 0x3c, 0x2f,
+  0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75,
+  0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x73,
+  0x6c, 0x69, 0x67, 0x68, 0x74, 0x6c, 0x79, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65,
+  0x72, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64,
+  0x61, 0x6e, 0x63, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x74, 0x65, 0x6c, 0x65,
+  0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+  0x73, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68,
+  0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x6c, 0x79,
+  0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x61, 0x66, 0x74, 0x65, 0x72, 0x65, 0x73,
+  0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x61, 0x6e, 0x20, 0x63,
+  0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x48, 0x6f, 0x77, 0x65, 0x76,
+  0x65, 0x72, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65,
+  0x73, 0x72, 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x73,
+  0x74, 0x61, 0x74, 0x69, 0x63, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65,
+  0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x22, 0x20, 0x73,
+  0x72, 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77,
+  0x77, 0x2e, 0x61, 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x20, 0x6e, 0x75, 0x6d,
+  0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x54, 0x65, 0x6c, 0x65, 0x63, 0x6f,
+  0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22,
+  0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x6e, 0x6f, 0x66, 0x6f, 0x6c, 0x6c, 0x6f,
+  0x77, 0x22, 0x20, 0x74, 0x48, 0x6f, 0x6c, 0x79, 0x20, 0x52, 0x6f, 0x6d, 0x61,
+  0x6e, 0x20, 0x45, 0x6d, 0x70, 0x65, 0x72, 0x6f, 0x72, 0x61, 0x6c, 0x6d, 0x6f,
+  0x73, 0x74, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x6c,
+  0x79, 0x22, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3d, 0x22, 0x30, 0x22,
+  0x20, 0x61, 0x6c, 0x74, 0x3d, 0x22, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x61,
+  0x72, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x53, 0x74, 0x61, 0x74, 0x65, 0x63, 0x75,
+  0x6c, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x20,
+  0x74, 0x68, 0x65, 0x43, 0x49, 0x41, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x20,
+  0x46, 0x61, 0x63, 0x74, 0x62, 0x6f, 0x6f, 0x6b, 0x74, 0x68, 0x65, 0x20, 0x6d,
+  0x6f, 0x73, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74,
+  0x61, 0x6e, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x72, 0x79, 0x20, 0x6f,
+  0x66, 0x20, 0x74, 0x68, 0x65, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x62,
+  0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x3c, 0x6c, 0x69,
+  0x3e, 0x3c, 0x65, 0x6d, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d,
+  0x22, 0x2f, 0x74, 0x68, 0x65, 0x20, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69,
+  0x63, 0x20, 0x4f, 0x63, 0x65, 0x61, 0x6e, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74,
+  0x6c, 0x79, 0x20, 0x73, 0x70, 0x65, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x2c, 0x73,
+  0x68, 0x6f, 0x72, 0x74, 0x6c, 0x79, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65,
+  0x20, 0x74, 0x68, 0x65, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74,
+  0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x74, 0x68, 0x65, 0x20,
+  0x4f, 0x74, 0x74, 0x6f, 0x6d, 0x61, 0x6e, 0x20, 0x45, 0x6d, 0x70, 0x69, 0x72,
+  0x65, 0x3e, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x68,
+  0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x41, 0x6e, 0x20, 0x49, 0x6e, 0x74, 0x72,
+  0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x63, 0x6f,
+  0x6e, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20,
+  0x74, 0x68, 0x65, 0x64, 0x65, 0x70, 0x61, 0x72, 0x74, 0x75, 0x72, 0x65, 0x20,
+  0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x65,
+  0x64, 0x65, 0x72, 0x61, 0x74, 0x65, 0x20, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73,
+  0x69, 0x6e, 0x64, 0x69, 0x67, 0x65, 0x6e, 0x6f, 0x75, 0x73, 0x20, 0x70, 0x65,
+  0x6f, 0x70, 0x6c, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x65, 0x64, 0x69,
+  0x6e, 0x67, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x69, 0x6e, 0x66,
+  0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x20, 0x74,
+  0x68, 0x65, 0x74, 0x68, 0x65, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x20, 0x68, 0x61,
+  0x76, 0x65, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76,
+  0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x64,
+  0x69, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74,
+  0x68, 0x72, 0x65, 0x65, 0x61, 0x64, 0x6a, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x20,
+  0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x69, 0x73, 0x20, 0x72,
+  0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x6f,
+  0x72, 0x64, 0x69, 0x73, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+  0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f,
+  0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x77, 0x69,
+  0x64, 0x65, 0x6c, 0x79, 0x20, 0x72, 0x65, 0x67, 0x61, 0x72, 0x64, 0x65, 0x64,
+  0x20, 0x61, 0x73, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6d,
+  0x70, 0x6f, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x66, 0x6f, 0x75, 0x6e, 0x64,
+  0x69, 0x6e, 0x67, 0x20, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66,
+  0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x52, 0x65, 0x70,
+  0x75, 0x62, 0x6c, 0x69, 0x63, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x6c,
+  0x79, 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x74, 0x68, 0x65,
+  0x20, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20,
+  0x6f, 0x66, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x61, 0x76,
+  0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20,
+  0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x72,
+  0x65, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66,
+  0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72,
+  0x61, 0x6c, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x69, 0x73, 0x20, 0x61,
+  0x6c, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x72, 0x65, 0x6c,
+  0x79, 0x70, 0x61, 0x73, 0x73, 0x65, 0x73, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x75,
+  0x67, 0x68, 0x20, 0x74, 0x68, 0x65, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65,
+  0x6e, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x63, 0x6f,
+  0x6d, 0x70, 0x75, 0x74, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x69,
+  0x64, 0x65, 0x6f, 0x47, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x69, 0x63, 0x20, 0x6c,
+  0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x73, 0x20, 0x61, 0x63, 0x63, 0x6f,
+  0x72, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x72, 0x6f,
+  0x6d, 0x20, 0x74, 0x68, 0x65, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x6c, 0x79, 0x20,
+  0x61, 0x66, 0x74, 0x65, 0x72, 0x77, 0x61, 0x72, 0x64, 0x73, 0x68, 0x72, 0x65,
+  0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77,
+  0x77, 0x2e, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x20, 0x64, 0x65, 0x76, 0x65,
+  0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x20,
+  0x6f, 0x66, 0x20, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x3c,
+  0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73, 0x65,
+  0x61, 0x72, 0x63, 0x68, 0x7c, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66,
+  0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x49, 0x6e, 0x20, 0x70,
+  0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x2c, 0x20, 0x74, 0x68,
+  0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x6f,
+  0x74, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68, 0x65,
+  0x72, 0x20, 0x73, 0x75, 0x62, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x74, 0x68,
+  0x6f, 0x75, 0x73, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x79, 0x65,
+  0x61, 0x72, 0x73, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f,
+  0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x3c, 0x2f, 0x64, 0x69, 0x76,
+  0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0d, 0x0a, 0x0d, 0x0a,
+  0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65,
+  0x78, 0x2e, 0x70, 0x68, 0x70, 0x77, 0x61, 0x73, 0x20, 0x65, 0x73, 0x74, 0x61,
+  0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x6d, 0x69, 0x6e,
+  0x2e, 0x6a, 0x73, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+  0x3e, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x65,
+  0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x61, 0x20, 0x73, 0x74, 0x72, 0x6f,
+  0x6e, 0x67, 0x20, 0x69, 0x6e, 0x66, 0x6c, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73,
+  0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d,
+  0x74, 0x6f, 0x70, 0x3a, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74,
+  0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x67, 0x72, 0x61, 0x64,
+  0x75, 0x61, 0x74, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68,
+  0x65, 0x54, 0x72, 0x61, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x6c,
+  0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+  0x28, 0x22, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x29, 0x3b, 0x48, 0x6f,
+  0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x20,
+  0x74, 0x68, 0x65, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x2f, 0x64, 0x69,
+  0x76, 0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x3b,
+  0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a,
+  0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x67,
+  0x61, 0x69, 0x6e, 0x73, 0x74, 0x30, 0x3b, 0x20, 0x76, 0x65, 0x72, 0x74, 0x69,
+  0x63, 0x61, 0x6c, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x55, 0x6e, 0x66,
+  0x6f, 0x72, 0x74, 0x75, 0x6e, 0x61, 0x74, 0x65, 0x6c, 0x79, 0x2c, 0x20, 0x74,
+  0x68, 0x65, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x69, 0x6d, 0x61, 0x67, 0x65,
+  0x2f, 0x78, 0x2d, 0x69, 0x63, 0x6f, 0x6e, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a,
+  0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x20,
+  0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x66,
+  0x69, 0x78, 0x22, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73,
+  0x73, 0x3d, 0x22, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x09, 0x09, 0x3c, 0x2f,
+  0x64, 0x69, 0x76, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e,
+  0x0a, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70,
+  0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0xd0, 0x91, 0xd1, 0x8a, 0xd0, 0xbb, 0xd0,
+  0xb3, 0xd0, 0xb0, 0xd1, 0x80, 0xd1, 0x81, 0xd0, 0xba, 0xd0, 0xb8, 0xd0, 0xb1,
+  0xd1, 0x8a, 0xd0, 0xbb, 0xd0, 0xb3, 0xd0, 0xb0, 0xd1, 0x80, 0xd1, 0x81, 0xd0,
+  0xba, 0xd0, 0xb8, 0xd0, 0xa4, 0xd0, 0xb5, 0xd0, 0xb4, 0xd0, 0xb5, 0xd1, 0x80,
+  0xd0, 0xb0, 0xd1, 0x86, 0xd0, 0xb8, 0xd0, 0xb8, 0xd0, 0xbd, 0xd0, 0xb5, 0xd1,
+  0x81, 0xd0, 0xba, 0xd0, 0xbe, 0xd0, 0xbb, 0xd1, 0x8c, 0xd0, 0xba, 0xd0, 0xbe,
+  0xd1, 0x81, 0xd0, 0xbe, 0xd0, 0xbe, 0xd0, 0xb1, 0xd1, 0x89, 0xd0, 0xb5, 0xd0,
+  0xbd, 0xd0, 0xb8, 0xd0, 0xb5, 0xd1, 0x81, 0xd0, 0xbe, 0xd0, 0xbe, 0xd0, 0xb1,
+  0xd1, 0x89, 0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xb8, 0xd1, 0x8f, 0xd0, 0xbf, 0xd1,
+  0x80, 0xd0, 0xbe, 0xd0, 0xb3, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xbc, 0xd0, 0xbc,
+  0xd1, 0x8b, 0xd0, 0x9e, 0xd1, 0x82, 0xd0, 0xbf, 0xd1, 0x80, 0xd0, 0xb0, 0xd0,
+  0xb2, 0xd0, 0xb8, 0xd1, 0x82, 0xd1, 0x8c, 0xd0, 0xb1, 0xd0, 0xb5, 0xd1, 0x81,
+  0xd0, 0xbf, 0xd0, 0xbb, 0xd0, 0xb0, 0xd1, 0x82, 0xd0, 0xbd, 0xd0, 0xbe, 0xd0,
+  0xbc, 0xd0, 0xb0, 0xd1, 0x82, 0xd0, 0xb5, 0xd1, 0x80, 0xd0, 0xb8, 0xd0, 0xb0,
+  0xd0, 0xbb, 0xd1, 0x8b, 0xd0, 0xbf, 0xd0, 0xbe, 0xd0, 0xb7, 0xd0, 0xb2, 0xd0,
+  0xbe, 0xd0, 0xbb, 0xd1, 0x8f, 0xd0, 0xb5, 0xd1, 0x82, 0xd0, 0xbf, 0xd0, 0xbe,
+  0xd1, 0x81, 0xd0, 0xbb, 0xd0, 0xb5, 0xd0, 0xb4, 0xd0, 0xbd, 0xd0, 0xb8, 0xd0,
+  0xb5, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xb7, 0xd0, 0xbb, 0xd0, 0xb8, 0xd1, 0x87,
+  0xd0, 0xbd, 0xd1, 0x8b, 0xd1, 0x85, 0xd0, 0xbf, 0xd1, 0x80, 0xd0, 0xbe, 0xd0,
+  0xb4, 0xd1, 0x83, 0xd0, 0xba, 0xd1, 0x86, 0xd0, 0xb8, 0xd0, 0xb8, 0xd0, 0xbf,
+  0xd1, 0x80, 0xd0, 0xbe, 0xd0, 0xb3, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xbc, 0xd0,
+  0xbc, 0xd0, 0xb0, 0xd0, 0xbf, 0xd0, 0xbe, 0xd0, 0xbb, 0xd0, 0xbd, 0xd0, 0xbe,
+  0xd1, 0x81, 0xd1, 0x82, 0xd1, 0x8c, 0xd1, 0x8e, 0xd0, 0xbd, 0xd0, 0xb0, 0xd1,
+  0x85, 0xd0, 0xbe, 0xd0, 0xb4, 0xd0, 0xb8, 0xd1, 0x82, 0xd1, 0x81, 0xd1, 0x8f,
+  0xd0, 0xb8, 0xd0, 0xb7, 0xd0, 0xb1, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0,
+  0xbd, 0xd0, 0xbe, 0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xb0, 0xd1, 0x81, 0xd0, 0xb5,
+  0xd0, 0xbb, 0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xb8, 0xd1, 0x8f, 0xd0, 0xb8, 0xd0,
+  0xb7, 0xd0, 0xbc, 0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xb8,
+  0xd1, 0x8f, 0xd0, 0xba, 0xd0, 0xb0, 0xd1, 0x82, 0xd0, 0xb5, 0xd0, 0xb3, 0xd0,
+  0xbe, 0xd1, 0x80, 0xd0, 0xb8, 0xd0, 0xb8, 0xd0, 0x90, 0xd0, 0xbb, 0xd0, 0xb5,
+  0xd0, 0xba, 0xd1, 0x81, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xb4, 0xd1, 0x80, 0xe0,
+  0xa4, 0xa6, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4,
+  0xb0, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xae, 0xe0, 0xa5, 0x88, 0xe0, 0xa4, 0xa8,
+  0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0x85, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xaa, 0xe0,
+  0xa5, 0x8d, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4,
+  0xa8, 0xe0, 0xa4, 0xad, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa4,
+  0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0x85, 0xe0, 0xa4, 0xa8, 0xe0,
+  0xa5, 0x81, 0xe0, 0xa4, 0xa6, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb6, 0xe0, 0xa4,
+  0xb9, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa6,
+  0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x87, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xa1, 0xe0,
+  0xa4, 0xbf, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4,
+  0xbf, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x80,
+  0xe0, 0xa4, 0x85, 0xe0, 0xa4, 0xa7, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x95, 0xe0,
+  0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xb5, 0xe0, 0xa5, 0x80, 0xe0, 0xa4,
+  0xa1, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xaf, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x9a,
+  0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x9f, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa0, 0xe0,
+  0xa5, 0x87, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4,
+  0x9a, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0x82,
+  0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb6, 0xe0, 0xa4, 0xa8, 0xe0,
+  0xa4, 0xa6, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4,
+  0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaa, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb0,
+  0xe0, 0xa4, 0xaf, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0x85, 0xe0,
+  0xa4, 0xa8, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4,
+  0xb0, 0xe0, 0xa4, 0x91, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xbe,
+  0xe0, 0xa4, 0x87, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xbe, 0xe0,
+  0xa4, 0xb0, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0x9f, 0xe0, 0xa5, 0x80, 0xe0, 0xa4,
+  0xb6, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x8b,
+  0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x95, 0xe0,
+  0xa4, 0xb8, 0xe0, 0xa4, 0xad, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xab, 0xe0, 0xa4,
+  0xbc, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x88, 0xe0, 0xa4, 0xb6,
+  0xe0, 0xa4, 0xb6, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa4, 0xe0,
+  0xa5, 0x87, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xaa, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4,
+  0xb0, 0xe0, 0xa4, 0xa6, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb6, 0xe0, 0xa4, 0xaa,
+  0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xaf, 0xe0,
+  0xa4, 0xb0, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x82, 0xe0, 0xa4,
+  0xa6, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x8d,
+  0xe0, 0xa4, 0xa5, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xbf, 0xe0,
+  0xa4, 0x89, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4,
+  0xbe, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0x89, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x8d,
+  0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x9a, 0xe0,
+  0xa4, 0xbf, 0xe0, 0xa4, 0x9f, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa0, 0xe0, 0xa4,
+  0xbe, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x8d,
+  0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x9c, 0xe0, 0xa5, 0x8d, 0xe0,
+  0xa4, 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4,
+  0xaa, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa8,
+  0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x9c, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0xa1, 0xe0,
+  0xa4, 0xbc, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x85, 0xe0, 0xa4,
+  0xa8, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa6,
+  0xe0, 0xa4, 0xb6, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x87, 0xe0,
+  0xa4, 0xa3, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xb6, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4,
+  0x95, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb7, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb8,
+  0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0,
+  0xa5, 0x80, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x97, 0xe0, 0xa5,
+  0x8d, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xb9, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xb0,
+  0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa3, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xae, 0xe0,
+  0xa4, 0xac, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4,
+  0x82, 0xe0, 0xa4, 0xa1, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0x9a, 0xe0, 0xa5, 0x8d,
+  0xe0, 0xa4, 0x9a, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x89, 0xe0,
+  0xa4, 0xaa, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xac, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4,
+  0xa7, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x8d,
+  0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x82, 0xe0,
+  0xa4, 0xaa, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0x95, 0xe0, 0xa4,
+  0x89, 0xe0, 0xa4, 0xae, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xae, 0xe0, 0xa5, 0x80,
+  0xe0, 0xa4, 0xa6, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa7, 0xe0,
+  0xa5, 0x8d, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4,
+  0xb9, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xbe,
+  0xe0, 0xa4, 0xb6, 0xe0, 0xa4, 0xac, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa6, 0xe0,
+  0xa5, 0x8b, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xae, 0xe0, 0xa5, 0x80, 0xe0, 0xa4,
+  0xa1, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x86,
+  0xe0, 0xa4, 0x88, 0xe0, 0xa4, 0xaa, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x8f, 0xe0,
+  0xa4, 0xb2, 0xe0, 0xa4, 0xae, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0xac, 0xe0, 0xa4,
+  0xbe, 0xe0, 0xa4, 0x87, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x82,
+  0xe0, 0xa4, 0x96, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xbe, 0xe0,
+  0xa4, 0x86, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x87, 0xe0, 0xa4,
+  0xb6, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0x85, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x81,
+  0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xa7, 0xe0, 0xa4, 0xac, 0xe0,
+  0xa4, 0xbe, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xbc, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4,
+  0xb0, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xb5, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xa8,
+  0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xaa, 0xe0, 0xa5, 0x8d, 0xe0,
+  0xa4, 0xb0, 0xe0, 0xa4, 0xae, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0x96, 0xe0, 0xa4,
+  0xaa, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xb6, 0xe0, 0xa5, 0x8d,
+  0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xaa, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xbf, 0xe0,
+  0xa4, 0xb5, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5,
+  0x81, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa8,
+  0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x8d, 0xe0,
+  0xa4, 0xa5, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0x86, 0xe0, 0xa4, 0xaf, 0xe0, 0xa5,
+  0x8b, 0xe0, 0xa4, 0x9c, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xb8,
+  0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbe, 0xe0,
+  0xa4, 0xb0, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd8, 0xb4, 0xd8, 0xa7, 0xd8,
+  0xb1, 0xd9, 0x83, 0xd8, 0xa7, 0xd8, 0xaa, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85,
+  0xd9, 0x86, 0xd8, 0xaa, 0xd8, 0xaf, 0xd9, 0x8a, 0xd8, 0xa7, 0xd8, 0xaa, 0xd8,
+  0xa7, 0xd9, 0x84, 0xd9, 0x83, 0xd9, 0x85, 0xd8, 0xa8, 0xd9, 0x8a, 0xd9, 0x88,
+  0xd8, 0xaa, 0xd8, 0xb1, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd8, 0xb4, 0xd8,
+  0xa7, 0xd9, 0x87, 0xd8, 0xaf, 0xd8, 0xa7, 0xd8, 0xaa, 0xd8, 0xb9, 0xd8, 0xaf,
+  0xd8, 0xaf, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb2, 0xd9, 0x88, 0xd8, 0xa7, 0xd8,
+  0xb1, 0xd8, 0xb9, 0xd8, 0xaf, 0xd8, 0xaf, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xb1,
+  0xd8, 0xaf, 0xd9, 0x88, 0xd8, 0xaf, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa5, 0xd8,
+  0xb3, 0xd9, 0x84, 0xd8, 0xa7, 0xd9, 0x85, 0xd9, 0x8a, 0xd8, 0xa9, 0xd8, 0xa7,
+  0xd9, 0x84, 0xd9, 0x81, 0xd9, 0x88, 0xd8, 0xaa, 0xd9, 0x88, 0xd8, 0xb4, 0xd9,
+  0x88, 0xd8, 0xa8, 0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd8, 0xb3, 0xd8, 0xa7,
+  0xd8, 0xa8, 0xd9, 0x82, 0xd8, 0xa7, 0xd8, 0xaa, 0xd8, 0xa7, 0xd9, 0x84, 0xd9,
+  0x85, 0xd8, 0xb9, 0xd9, 0x84, 0xd9, 0x88, 0xd9, 0x85, 0xd8, 0xa7, 0xd8, 0xaa,
+  0xd8, 0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd8, 0xb3, 0xd9, 0x84, 0xd8, 0xb3, 0xd9,
+  0x84, 0xd8, 0xa7, 0xd8, 0xaa, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xac, 0xd8, 0xb1,
+  0xd8, 0xa7, 0xd9, 0x81, 0xd9, 0x8a, 0xd9, 0x83, 0xd8, 0xb3, 0xd8, 0xa7, 0xd9,
+  0x84, 0xd8, 0xa7, 0xd8, 0xb3, 0xd9, 0x84, 0xd8, 0xa7, 0xd9, 0x85, 0xd9, 0x8a,
+  0xd8, 0xa9, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa7, 0xd8, 0xaa, 0xd8, 0xb5, 0xd8,
+  0xa7, 0xd9, 0x84, 0xd8, 0xa7, 0xd8, 0xaa, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72,
+  0x64, 0x73, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22,
+  0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x78,
+  0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x3c, 0x61, 0x20, 0x74, 0x61, 0x72, 0x67,
+  0x65, 0x74, 0x3d, 0x22, 0x5f, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x22, 0x20, 0x74,
+  0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x20, 0x63, 0x68, 0x61,
+  0x72, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74,
+  0x3d, 0x22, 0x5f, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x22, 0x3e, 0x3c, 0x74, 0x61,
+  0x62, 0x6c, 0x65, 0x20, 0x63, 0x65, 0x6c, 0x6c, 0x70, 0x61, 0x64, 0x64, 0x69,
+  0x6e, 0x67, 0x3d, 0x22, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x6c,
+  0x65, 0x74, 0x65, 0x3d, 0x22, 0x6f, 0x66, 0x66, 0x22, 0x20, 0x74, 0x65, 0x78,
+  0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x20, 0x63, 0x65, 0x6e, 0x74,
+  0x65, 0x72, 0x3b, 0x74, 0x6f, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x76, 0x65,
+  0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x79, 0x20, 0x62, 0x61, 0x63, 0x6b,
+  0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a,
+  0x20, 0x23, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74,
+  0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x2f, 0x64, 0x69, 0x76, 0x3e,
+  0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x69, 0x64,
+  0x3d, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x23, 0x22, 0x20,
+  0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x22, 0x3e, 0x3c, 0x69, 0x6d, 0x67,
+  0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
+  0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x68,
+  0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70,
+  0x74, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3d, 0x22, 0x2f,
+  0x2f, 0x45, 0x4e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
+  0x77, 0x77, 0x77, 0x2e, 0x77, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x55, 0x52,
+  0x49, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x28, 0x22, 0x20,
+  0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72,
+  0x69, 0x70, 0x74, 0x3a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73,
+  0x73, 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x64, 0x6f, 0x63,
+  0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x27,
+  0x3c, 0x73, 0x63, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20,
+  0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x3b, 0x73, 0x63, 0x72, 0x69,
+  0x70, 0x74, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a,
+  0x2f, 0x2f, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x72,
+  0x67, 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x2e, 0x6d, 0x69, 0x6e, 0x2e,
+  0x6a, 0x73, 0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e,
+  0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20,
+  0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67,
+  0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x78, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x20,
+  0x0a, 0x0d, 0x0a, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0d, 0x0a, 0x3c,
+  0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x64, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x63,
+  0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x2f,
+  0x22, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22, 0x5f, 0x62, 0x6c,
+  0x61, 0x6e, 0x6b, 0x22, 0x3e, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x68, 0x72,
+  0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x65, 0x6e,
+  0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x75, 0x74, 0x66, 0x2d, 0x38,
+  0x22, 0x3f, 0x3e, 0x0a, 0x77, 0x2e, 0x61, 0x64, 0x64, 0x45, 0x76, 0x65, 0x6e,
+  0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x3f, 0x61, 0x63, 0x74,
+  0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
+  0x77, 0x77, 0x2e, 0x69, 0x63, 0x6f, 0x6e, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66,
+  0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x20, 0x73, 0x74, 0x79,
+  0x6c, 0x65, 0x3d, 0x22, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e,
+  0x64, 0x3a, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f,
+  0x63, 0x73, 0x73, 0x22, 0x20, 0x2f, 0x3e, 0x0a, 0x6d, 0x65, 0x74, 0x61, 0x20,
+  0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3d, 0x22, 0x6f, 0x67, 0x3a,
+  0x74, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d,
+  0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65,
+  0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a,
+  0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65,
+  0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x68, 0x65,
+  0x65, 0x74, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x68,
+  0x74, 0x6d, 0x6c, 0x3b, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d,
+  0x75, 0x74, 0x66, 0x2d, 0x38, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69,
+  0x64, 0x65, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x74, 0x61,
+  0x62, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x31, 0x30,
+  0x30, 0x25, 0x22, 0x20, 0x49, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69,
+  0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e,
+  0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+  0x73, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x64, 0x65, 0x76, 0x65,
+  0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x49, 0x74, 0x20, 0x69, 0x73, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72,
+  0x74, 0x61, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x3c, 0x2f, 0x73, 0x63, 0x72,
+  0x69, 0x70, 0x74, 0x3e, 0x0a, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+  0x20, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x66, 0x6f, 0x6e, 0x74,
+  0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x31, 0x3e, 0x3c, 0x2f, 0x73, 0x70, 0x61,
+  0x6e, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x69, 0x64, 0x3d, 0x67, 0x62,
+  0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x43, 0x6f,
+  0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, 0x72,
+  0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x69, 0x6d, 0x45,
+  0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x61, 0x64, 0x65, 0x6d, 0x79, 0x20,
+  0x6f, 0x66, 0x20, 0x53, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x64, 0x69,
+  0x76, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x64, 0x69, 0x73, 0x70,
+  0x6c, 0x61, 0x79, 0x3a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74,
+  0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x2e, 0x67, 0x65,
+  0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28,
+  0x69, 0x64, 0x29, 0x69, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x6a, 0x75, 0x6e, 0x63,
+  0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x45, 0x6c, 0x65, 0x6d,
+  0x65, 0x6e, 0x74, 0x28, 0x27, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x27, 0x29,
+  0x3b, 0x20, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65,
+  0x72, 0x74, 0x79, 0x3d, 0x22, 0x6f, 0x67, 0x3a, 0xd0, 0x91, 0xd1, 0x8a, 0xd0,
+  0xbb, 0xd0, 0xb3, 0xd0, 0xb0, 0xd1, 0x80, 0xd1, 0x81, 0xd0, 0xba, 0xd0, 0xb8,
+  0x0a, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22,
+  0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x3e, 0x50, 0x72, 0x69, 0x76, 0x61,
+  0x63, 0x79, 0x20, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x3c, 0x2f, 0x61, 0x3e,
+  0x61, 0x64, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20,
+  0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x53,
+  0x69, 0x6e, 0x67, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73,
+  0x74, 0x79, 0x6c, 0x65, 0x3d, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x6d, 0x61,
+  0x72, 0x67, 0x69, 0x6e, 0x3a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f,
+  0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x3e, 0x3c,
+  0x69, 0x6d, 0x67, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70,
+  0x3a, 0x2f, 0x2f, 0x69, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x26, 0x71,
+  0x75, 0x6f, 0x74, 0x3b, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a, 0x72, 0x65, 0x66,
+  0x65, 0x72, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x73, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x70, 0x6f, 0x70, 0x75,
+  0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x69, 0x6e, 0x20, 0x57,
+  0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x2c, 0x20, 0x44, 0x2e,
+  0x43, 0x2e, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x62, 0x61, 0x63,
+  0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x61, 0x6d, 0x6f, 0x6e, 0x67,
+  0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73,
+  0x2c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+  0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63,
+  0x69, 0x70, 0x61, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65,
+  0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74,
+  0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66,
+  0x69, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x66,
+  0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72,
+  0x61, 0x63, 0x74, 0x65, 0x72, 0x20, 0x4f, 0x78, 0x66, 0x6f, 0x72, 0x64, 0x20,
+  0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x69, 0x74, 0x79, 0x20, 0x6d, 0x69,
+  0x73, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x69, 0x6e,
+  0x67, 0x20, 0x6f, 0x66, 0x54, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65,
+  0x2c, 0x20, 0x68, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c, 0x73, 0x74, 0x79,
+  0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66,
+  0x3d, 0x22, 0x2f, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x62, 0x69, 0x61, 0x20, 0x55,
+  0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x69, 0x74, 0x79, 0x65, 0x78, 0x70, 0x61,
+  0x6e, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75,
+  0x64, 0x65, 0x75, 0x73, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x72, 0x65, 0x66,
+  0x65, 0x72, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x69, 0x6e, 0x64, 0x69, 0x63,
+  0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68,
+  0x65, 0x68, 0x61, 0x76, 0x65, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74,
+  0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x61, 0x66, 0x66, 0x69, 0x6c, 0x69,
+  0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65,
+  0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62,
+  0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20,
+  0x6f, 0x66, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x3e,
+  0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x3c, 0x2f, 0x74,
+  0x61, 0x62, 0x6c, 0x65, 0x3e, 0x52, 0x65, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63,
+  0x20, 0x6f, 0x66, 0x20, 0x49, 0x72, 0x65, 0x6c, 0x61, 0x6e, 0x64, 0x0a, 0x3c,
+  0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x3c, 0x73, 0x63, 0x72,
+  0x69, 0x70, 0x74, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x69, 0x6e, 0x66, 0x6c, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x63, 0x6f, 0x6e,
+  0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20,
+  0x74, 0x68, 0x65, 0x4f, 0x66, 0x66, 0x69, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x77,
+  0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x20, 0x6f, 0x66, 0x68, 0x65, 0x61, 0x64,
+  0x71, 0x75, 0x61, 0x72, 0x74, 0x65, 0x72, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74,
+  0x68, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x61, 0x72,
+  0x6f, 0x75, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x69, 0x6d, 0x70, 0x6c, 0x69,
+  0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68,
+  0x65, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x64, 0x65,
+  0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x64, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61,
+  0x6c, 0x20, 0x52, 0x65, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x6f, 0x66,
+  0x62, 0x65, 0x63, 0x61, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x61,
+  0x73, 0x69, 0x6e, 0x67, 0x6c, 0x79, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x4e,
+  0x6f, 0x74, 0x65, 0x2c, 0x20, 0x68, 0x6f, 0x77, 0x65, 0x76, 0x65, 0x72, 0x2c,
+  0x20, 0x74, 0x68, 0x61, 0x74, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20,
+  0x74, 0x6f, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x61,
+  0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x6f, 0x66,
+  0x20, 0x74, 0x68, 0x65, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x61, 0x6e, 0x63,
+  0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x70, 0x61, 0x72,
+  0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20,
+  0x74, 0x68, 0x65, 0x66, 0x75, 0x72, 0x74, 0x68, 0x65, 0x72, 0x20, 0x64, 0x65,
+  0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x75, 0x6e, 0x64, 0x65,
+  0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+  0x6f, 0x6e, 0x69, 0x73, 0x20, 0x6f, 0x66, 0x74, 0x65, 0x6e, 0x20, 0x63, 0x6f,
+  0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x65, 0x64, 0x68, 0x69, 0x73, 0x20, 0x79,
+  0x6f, 0x75, 0x6e, 0x67, 0x65, 0x72, 0x20, 0x62, 0x72, 0x6f, 0x74, 0x68, 0x65,
+  0x72, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0x3c, 0x2f,
+  0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x74, 0x74, 0x70,
+  0x2d, 0x65, 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x58, 0x2d, 0x55, 0x41, 0x2d,
+  0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x70,
+  0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x6f, 0x66, 0x20, 0x42, 0x72, 0x69, 0x74,
+  0x69, 0x73, 0x68, 0x20, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x62, 0x69, 0x61, 0x68,
+  0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x63, 0x72, 0x69, 0x74, 0x69,
+  0x63, 0x69, 0x7a, 0x65, 0x64, 0x28, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x71, 0x75,
+  0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74,
+  0x20, 0x74, 0x68, 0x65, 0x70, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74,
+  0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x74, 0x68, 0x65, 0x30, 0x22, 0x20,
+  0x63, 0x65, 0x6c, 0x6c, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x22,
+  0x30, 0x22, 0x20, 0x74, 0x68, 0x6f, 0x75, 0x73, 0x61, 0x6e, 0x64, 0x73, 0x20,
+  0x6f, 0x66, 0x20, 0x70, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x72, 0x65, 0x64, 0x69,
+  0x72, 0x65, 0x63, 0x74, 0x73, 0x20, 0x68, 0x65, 0x72, 0x65, 0x2e, 0x20, 0x46,
+  0x6f, 0x72, 0x68, 0x61, 0x76, 0x65, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72,
+  0x65, 0x6e, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x25, 0x33, 0x45, 0x25, 0x33,
+  0x43, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x25, 0x33, 0x45, 0x22, 0x29,
+  0x29, 0x3b, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74,
+  0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x3c, 0x6c, 0x69, 0x3e,
+  0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70,
+  0x3a, 0x2f, 0x2f, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22,
+  0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x74, 0x65, 0x78,
+  0x74, 0x2d, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a,
+  0x6e, 0x6f, 0x6e, 0x65, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x64, 0x69,
+  0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x20, 0x6e, 0x6f, 0x6e, 0x65, 0x3c, 0x6d,
+  0x65, 0x74, 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, 0x65, 0x71, 0x75, 0x69,
+  0x76, 0x3d, 0x22, 0x58, 0x2d, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x61, 0x74, 0x65,
+  0x28, 0x29, 0x2e, 0x67, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x28, 0x29, 0x20,
+  0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x78,
+  0x2d, 0x69, 0x63, 0x6f, 0x6e, 0x22, 0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e,
+  0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22,
+  0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3d, 0x22, 0x6a, 0x61, 0x76,
+  0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77,
+  0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x68, 0x72, 0x65,
+  0x66, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x6a, 0x61, 0x76,
+  0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a, 0x2d, 0x2d, 0x3e, 0x0d, 0x0a,
+  0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d,
+  0x22, 0x74, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x27, 0x68, 0x74,
+  0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x68, 0x6f, 0x72, 0x74,
+  0x63, 0x75, 0x74, 0x20, 0x69, 0x63, 0x6f, 0x6e, 0x22, 0x20, 0x68, 0x72, 0x65,
+  0x66, 0x3d, 0x22, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0d, 0x0a, 0x3c, 0x64,
+  0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x3c, 0x73, 0x63,
+  0x72, 0x69, 0x70, 0x74, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74,
+  0x70, 0x3a, 0x2f, 0x2f, 0x22, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x73, 0x74,
+  0x79, 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, 0x20, 0x74, 0x3c, 0x2f,
+  0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20,
+  0x74, 0x79, 0x70, 0x65, 0x3d, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68,
+  0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x20,
+  0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72,
+  0x65, 0x6e, 0x63, 0x79, 0x3d, 0x22, 0x58, 0x2d, 0x55, 0x41, 0x2d, 0x43, 0x6f,
+  0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e,
+  0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20,
+  0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72,
+  0x69, 0x70, 0x74, 0x3e, 0x0d, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+  0x20, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x3c, 0x2f, 0x75,
+  0x6c, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x61, 0x73, 0x73, 0x6f, 0x63,
+  0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x69, 0x6e, 0x67,
+  0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3c, 0x2f, 0x61, 0x3e,
+  0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70,
+  0x3a, 0x2f, 0x2f, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x3c,
+  0x6c, 0x69, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x6f, 0x72,
+  0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x68, 0x74, 0x74,
+  0x70, 0x3a, 0x2f, 0x2f, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x73, 0x74, 0x79, 0x6c,
+  0x65, 0x3d, 0x22, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x74, 0x79,
+  0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x6e, 0x61, 0x6d,
+  0x65, 0x3d, 0x22, 0x71, 0x22, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77,
+  0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x31, 0x30, 0x30, 0x25, 0x22, 0x20, 0x62,
+  0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x70, 0x6f, 0x73,
+  0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x22, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65,
+  0x72, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22,
+  0x72, 0x65, 0x6c, 0x3d, 0x22, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74,
+  0x20, 0x69, 0x63, 0x6f, 0x6e, 0x22, 0x20, 0x68, 0x36, 0x3e, 0x3c, 0x75, 0x6c,
+  0x3e, 0x3c, 0x6c, 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d,
+  0x22, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x68, 0x74, 0x74, 0x70,
+  0x2d, 0x65, 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x63, 0x73, 0x73, 0x22, 0x20,
+  0x6d, 0x65, 0x64, 0x69, 0x61, 0x3d, 0x22, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e,
+  0x22, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65,
+  0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x22, 0x20, 0x74, 0x79,
+  0x70, 0x65, 0x3d, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69,
+  0x6f, 0x6e, 0x2f, 0x22, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3d, 0x22, 0x62,
+  0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x68, 0x74, 0x6d,
+  0x6c, 0x3b, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x75, 0x74,
+  0x66, 0x2d, 0x38, 0x22, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x74, 0x72, 0x61,
+  0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x3d, 0x22, 0x73, 0x74,
+  0x79, 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, 0x20, 0x74, 0x79, 0x70,
+  0x65, 0x3d, 0x22, 0x74, 0x65, 0x0d, 0x0a, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20,
+  0x68, 0x74, 0x74, 0x70, 0x2d, 0x65, 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x3e,
+  0x3c, 0x2f, 0x73, 0x70, 0x61, 0x6e, 0x3e, 0x3c, 0x73, 0x70, 0x61, 0x6e, 0x20,
+  0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x63, 0x65, 0x6c,
+  0x6c, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x30, 0x22, 0x3e,
+  0x3b, 0x0a, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0a, 0x3c,
+  0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x74, 0x69,
+  0x6d, 0x65, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x68,
+  0x65, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6e, 0x65, 0x63,
+  0x65, 0x73, 0x73, 0x61, 0x72, 0x69, 0x6c, 0x79, 0x46, 0x6f, 0x72, 0x20, 0x6d,
+  0x6f, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69,
+  0x6f, 0x6e, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x65, 0x67, 0x69,
+  0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x3c, 0x21, 0x44, 0x4f,
+  0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x3c, 0x68,
+  0x74, 0x6d, 0x6c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72,
+  0x6c, 0x79, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x79, 0x70,
+  0x65, 0x3d, 0x22, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x22, 0x20, 0x6e, 0x61,
+  0x6d, 0x65, 0x3d, 0x22, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70,
+  0x74, 0x3a, 0x76, 0x6f, 0x69, 0x64, 0x28, 0x30, 0x29, 0x3b, 0x22, 0x65, 0x66,
+  0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x20, 0x6f,
+  0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d,
+  0x70, 0x6c, 0x65, 0x74, 0x65, 0x3d, 0x22, 0x6f, 0x66, 0x66, 0x22, 0x20, 0x67,
+  0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x73,
+  0x69, 0x64, 0x65, 0x72, 0x65, 0x64, 0x3e, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74,
+  0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20,
+  0x22, 0x3e, 0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0d, 0x0a,
+  0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67,
+  0x68, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6c,
+  0x64, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x20, 0x6d, 0x69, 0x73, 0x63, 0x6f,
+  0x6e, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x73, 0x73, 0x6f, 0x63,
+  0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74,
+  0x68, 0x65, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x2f, 0x64, 0x69,
+  0x76, 0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x64, 0x75, 0x72, 0x69,
+  0x6e, 0x67, 0x20, 0x68, 0x69, 0x73, 0x20, 0x6c, 0x69, 0x66, 0x65, 0x74, 0x69,
+  0x6d, 0x65, 0x2c, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64,
+  0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x74, 0x79, 0x70,
+  0x65, 0x3d, 0x22, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x78, 0x2d, 0x69, 0x63,
+  0x6f, 0x6e, 0x22, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x61,
+  0x73, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x64, 0x69,
+  0x70, 0x6c, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x20, 0x72, 0x65, 0x6c, 0x61,
+  0x74, 0x69, 0x6f, 0x6e, 0x73, 0x61, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x74, 0x65,
+  0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x65, 0x64, 0x6d,
+  0x65, 0x74, 0x61, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x22,
+  0x75, 0x74, 0x66, 0x2d, 0x38, 0x22, 0x20, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74,
+  0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20,
+  0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x63, 0x6c,
+  0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x22, 0x3e, 0x3c, 0x69, 0x6d, 0x67,
+  0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
+  0x69, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f,
+  0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x74, 0x68, 0x65, 0x20, 0x65,
+  0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x20,
+  0x6f, 0x66, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x64, 0x69,
+  0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x26, 0x61, 0x6d, 0x70,
+  0x3b, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x26, 0x61, 0x6d, 0x70, 0x3b, 0x6e, 0x62,
+  0x73, 0x70, 0x3b, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69,
+  0x6e, 0x65, 0x20, 0x77, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x71, 0x75, 0x69,
+  0x74, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20,
+  0x66, 0x72, 0x6f, 0x6d, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x64, 0x69,
+  0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65,
+  0x6e, 0x20, 0x74, 0x68, 0x65, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75,
+  0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x63,
+  0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65,
+  0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x77, 0x69, 0x64, 0x65, 0x6c, 0x79, 0x20,
+  0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f,
+  0x77, 0x61, 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x77, 0x69, 0x74, 0x68, 0x20, 0x76,
+  0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x67, 0x72, 0x65, 0x65,
+  0x73, 0x68, 0x61, 0x76, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x75, 0x6c, 0x61,
+  0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x28, 0x64, 0x6f, 0x63, 0x75,
+  0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65,
+  0x6e, 0x74, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69,
+  0x6e, 0x67, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6f, 0x72, 0x69, 0x67,
+  0x69, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f,
+  0x70, 0x65, 0x64, 0x65, 0x74, 0x61, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65,
+  0x74, 0x3d, 0x22, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x22, 0x3e, 0x20, 0x74, 0x79,
+  0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22,
+  0x20, 0x2f, 0x3e, 0x0a, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x68, 0x61, 0x6e,
+  0x67, 0x65, 0x61, 0x62, 0x6c, 0x79, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6d, 0x6f,
+  0x72, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x6c, 0x79, 0x20, 0x72, 0x65,
+  0x6c, 0x61, 0x74, 0x65, 0x64, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x61,
+  0x6e, 0x64, 0x20, 0x70, 0x6f, 0x6c, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x74,
+  0x68, 0x61, 0x74, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6f, 0x74, 0x68,
+  0x65, 0x72, 0x77, 0x69, 0x73, 0x65, 0x70, 0x65, 0x72, 0x70, 0x65, 0x6e, 0x64,
+  0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65,
+  0x73, 0x74, 0x79, 0x6c, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74,
+  0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22,
+  0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+  0x22, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x20, 0x72, 0x65, 0x73,
+  0x69, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x76, 0x65, 0x6c,
+  0x6f, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x69,
+  0x65, 0x73, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x72, 0x20, 0x70, 0x72,
+  0x6f, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x65, 0x63, 0x6f, 0x6e,
+  0x6f, 0x6d, 0x69, 0x63, 0x20, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x6d,
+  0x65, 0x6e, 0x74, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74,
+  0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x66, 0x6f, 0x72,
+  0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61,
+  0x74, 0x69, 0x6f, 0x6e, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x76, 0x65, 0x72, 0x61,
+  0x6c, 0x20, 0x6f, 0x63, 0x63, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x70, 0x6f,
+  0x72, 0x74, 0x75, 0x67, 0x75, 0xc3, 0xaa, 0x73, 0x20, 0x28, 0x45, 0x75, 0x72,
+  0x6f, 0x70, 0x65, 0x75, 0x29, 0xd0, 0xa3, 0xd0, 0xba, 0xd1, 0x80, 0xd0, 0xb0,
+  0xd1, 0x97, 0xd0, 0xbd, 0xd1, 0x81, 0xd1, 0x8c, 0xd0, 0xba, 0xd0, 0xb0, 0xd1,
+  0x83, 0xd0, 0xba, 0xd1, 0x80, 0xd0, 0xb0, 0xd1, 0x97, 0xd0, 0xbd, 0xd1, 0x81,
+  0xd1, 0x8c, 0xd0, 0xba, 0xd0, 0xb0, 0xd0, 0xa0, 0xd0, 0xbe, 0xd1, 0x81, 0xd1,
+  0x81, 0xd0, 0xb8, 0xd0, 0xb9, 0xd1, 0x81, 0xd0, 0xba, 0xd0, 0xbe, 0xd0, 0xb9,
+  0xd0, 0xbc, 0xd0, 0xb0, 0xd1, 0x82, 0xd0, 0xb5, 0xd1, 0x80, 0xd0, 0xb8, 0xd0,
+  0xb0, 0xd0, 0xbb, 0xd0, 0xbe, 0xd0, 0xb2, 0xd0, 0xb8, 0xd0, 0xbd, 0xd1, 0x84,
+  0xd0, 0xbe, 0xd1, 0x80, 0xd0, 0xbc, 0xd0, 0xb0, 0xd1, 0x86, 0xd0, 0xb8, 0xd0,
+  0xb8, 0xd1, 0x83, 0xd0, 0xbf, 0xd1, 0x80, 0xd0, 0xb0, 0xd0, 0xb2, 0xd0, 0xbb,
+  0xd0, 0xb5, 0xd0, 0xbd, 0xd0, 0xb8, 0xd1, 0x8f, 0xd0, 0xbd, 0xd0, 0xb5, 0xd0,
+  0xbe, 0xd0, 0xb1, 0xd1, 0x85, 0xd0, 0xbe, 0xd0, 0xb4, 0xd0, 0xb8, 0xd0, 0xbc,
+  0xd0, 0xbe, 0xd0, 0xb8, 0xd0, 0xbd, 0xd1, 0x84, 0xd0, 0xbe, 0xd1, 0x80, 0xd0,
+  0xbc, 0xd0, 0xb0, 0xd1, 0x86, 0xd0, 0xb8, 0xd1, 0x8f, 0xd0, 0x98, 0xd0, 0xbd,
+  0xd1, 0x84, 0xd0, 0xbe, 0xd1, 0x80, 0xd0, 0xbc, 0xd0, 0xb0, 0xd1, 0x86, 0xd0,
+  0xb8, 0xd1, 0x8f, 0xd0, 0xa0, 0xd0, 0xb5, 0xd1, 0x81, 0xd0, 0xbf, 0xd1, 0x83,
+  0xd0, 0xb1, 0xd0, 0xbb, 0xd0, 0xb8, 0xd0, 0xba, 0xd0, 0xb8, 0xd0, 0xba, 0xd0,
+  0xbe, 0xd0, 0xbb, 0xd0, 0xb8, 0xd1, 0x87, 0xd0, 0xb5, 0xd1, 0x81, 0xd1, 0x82,
+  0xd0, 0xb2, 0xd0, 0xbe, 0xd0, 0xb8, 0xd0, 0xbd, 0xd1, 0x84, 0xd0, 0xbe, 0xd1,
+  0x80, 0xd0, 0xbc, 0xd0, 0xb0, 0xd1, 0x86, 0xd0, 0xb8, 0xd1, 0x8e, 0xd1, 0x82,
+  0xd0, 0xb5, 0xd1, 0x80, 0xd1, 0x80, 0xd0, 0xb8, 0xd1, 0x82, 0xd0, 0xbe, 0xd1,
+  0x80, 0xd0, 0xb8, 0xd0, 0xb8, 0xd0, 0xb4, 0xd0, 0xbe, 0xd1, 0x81, 0xd1, 0x82,
+  0xd0, 0xb0, 0xd1, 0x82, 0xd0, 0xbe, 0xd1, 0x87, 0xd0, 0xbd, 0xd0, 0xbe, 0xd8,
+  0xa7, 0xd9, 0x84, 0xd9, 0x85, 0xd8, 0xaa, 0xd9, 0x88, 0xd8, 0xa7, 0xd8, 0xac,
+  0xd8, 0xaf, 0xd9, 0x88, 0xd9, 0x86, 0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa7, 0xd8,
+  0xb4, 0xd8, 0xaa, 0xd8, 0xb1, 0xd8, 0xa7, 0xd9, 0x83, 0xd8, 0xa7, 0xd8, 0xaa,
+  0xd8, 0xa7, 0xd9, 0x84, 0xd8, 0xa7, 0xd9, 0x82, 0xd8, 0xaa, 0xd8, 0xb1, 0xd8,
+  0xa7, 0xd8, 0xad, 0xd8, 0xa7, 0xd8, 0xaa, 0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x20,
+  0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x55, 0x54, 0x46, 0x2d, 0x38,
+  0x22, 0x20, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28,
+  0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x64, 0x69, 0x73,
+  0x70, 0x6c, 0x61, 0x79, 0x3a, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x62,
+  0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74,
+  0x79, 0x70, 0x65, 0x3d, 0x22, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x22, 0x20,
+  0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x27, 0x74, 0x65, 0x78, 0x74, 0x2f,
+  0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x3c, 0x69, 0x6d, 0x67, 0x20,
+  0x73, 0x72, 0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
+  0x77, 0x77, 0x2e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
+  0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x73, 0x68,
+  0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x20, 0x69, 0x63, 0x6f, 0x6e, 0x22, 0x20,
+  0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x22, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x63,
+  0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x3d, 0x22, 0x6f, 0x66, 0x66, 0x22,
+  0x20, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x64,
+  0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x3c, 0x2f, 0x61, 0x3e,
+  0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x0a, 0x3c, 0x6c, 0x69, 0x20, 0x63, 0x6c, 0x61,
+  0x73, 0x73, 0x3d, 0x22, 0x63, 0x73, 0x73, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65,
+  0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, 0x20, 0x3c,
+  0x66, 0x6f, 0x72, 0x6d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22,
+  0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73,
+  0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a,
+  0x2f, 0x2f, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x61,
+  0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x22, 0x20, 0x0d, 0x0a, 0x3c,
+  0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22,
+  0x74, 0x65, 0x78, 0x74, 0x2f, 0x20, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b,
+  0x3d, 0x22, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3a,
+  0x28, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x61, 0x74, 0x65, 0x29, 0x2e, 0x67, 0x65,
+  0x74, 0x54, 0x69, 0x6d, 0x65, 0x28, 0x29, 0x7d, 0x68, 0x65, 0x69, 0x67, 0x68,
+  0x74, 0x3d, 0x22, 0x31, 0x22, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22,
+  0x31, 0x22, 0x20, 0x50, 0x65, 0x6f, 0x70, 0x6c, 0x65, 0x27, 0x73, 0x20, 0x52,
+  0x65, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x6f, 0x66, 0x20, 0x20, 0x3c,
+  0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a,
+  0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x64, 0x65,
+  0x63, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x75, 0x6e, 0x64, 0x65,
+  0x72, 0x74, 0x68, 0x65, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x6e, 0x69, 0x6e,
+  0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x2f, 0x64, 0x69,
+  0x76, 0x3e, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x2f, 0x64,
+  0x69, 0x76, 0x3e, 0x0a, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68,
+  0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c,
+  0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f,
+  0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x23, 0x76, 0x69, 0x65, 0x77, 0x70,
+  0x6f, 0x72, 0x74, 0x7b, 0x6d, 0x69, 0x6e, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68,
+  0x74, 0x3a, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x73, 0x72,
+  0x63, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6f, 0x70, 0x74,
+  0x69, 0x6f, 0x6e, 0x3e, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76,
+  0x61, 0x6c, 0x75, 0x65, 0x3d, 0x6f, 0x66, 0x74, 0x65, 0x6e, 0x20, 0x72, 0x65,
+  0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x73, 0x20,
+  0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x0a, 0x3c, 0x6f, 0x70, 0x74,
+  0x69, 0x6f, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x3c, 0x21, 0x44, 0x4f, 0x43,
+  0x54, 0x59, 0x50, 0x45, 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x3c, 0x21,
+  0x2d, 0x2d, 0x5b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f,
+  0x6e, 0x61, 0x6c, 0x20, 0x41, 0x69, 0x72, 0x70, 0x6f, 0x72, 0x74, 0x3e, 0x0a,
+  0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70,
+  0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x61, 0x20,
+  0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
+  0x77, 0xe0, 0xb8, 0xa0, 0xe0, 0xb8, 0xb2, 0xe0, 0xb8, 0xa9, 0xe0, 0xb8, 0xb2,
+  0xe0, 0xb9, 0x84, 0xe0, 0xb8, 0x97, 0xe0, 0xb8, 0xa2, 0xe1, 0x83, 0xa5, 0xe1,
+  0x83, 0x90, 0xe1, 0x83, 0xa0, 0xe1, 0x83, 0x97, 0xe1, 0x83, 0xa3, 0xe1, 0x83,
+  0x9a, 0xe1, 0x83, 0x98, 0xe6, 0xad, 0xa3, 0xe9, 0xab, 0x94, 0xe4, 0xb8, 0xad,
+  0xe6, 0x96, 0x87, 0x20, 0x28, 0xe7, 0xb9, 0x81, 0xe9, 0xab, 0x94, 0x29, 0xe0,
+  0xa4, 0xa8, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4,
+  0xa6, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb6, 0xe0, 0xa4, 0xa1, 0xe0, 0xa4, 0xbe,
+  0xe0, 0xa4, 0x89, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xb2, 0xe0, 0xa5, 0x8b, 0xe0,
+  0xa4, 0xa1, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb7, 0xe0, 0xa5,
+  0x87, 0xe0, 0xa4, 0xa4, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x9c,
+  0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbe, 0xe0,
+  0xa4, 0xb0, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x82, 0xe0, 0xa4,
+  0xac, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xa7, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa4,
+  0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa5, 0xe0, 0xa4, 0xbe, 0xe0,
+  0xa4, 0xaa, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5,
+  0x8d, 0xe0, 0xa4, 0xb5, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbe,
+  0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xb8, 0xe0,
+  0xa5, 0x8d, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa3, 0xe0, 0xa4,
+  0xb8, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0x97, 0xe0, 0xa5, 0x8d,
+  0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x9a, 0xe0, 0xa4, 0xbf, 0xe0,
+  0xa4, 0x9f, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa0, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4,
+  0x82, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x9c, 0xe0, 0xa5, 0x8d,
+  0xe0, 0xa4, 0x9e, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0x85, 0xe0,
+  0xa4, 0xae, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4,
+  0x95, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xad,
+  0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa8, 0xe0,
+  0xa4, 0x97, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xa1, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4,
+  0xaf, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x81, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8d,
+  0xe0, 0xa4, 0xaf, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x95, 0xe0,
+  0xa4, 0xbf, 0xe0, 0xa4, 0xb8, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4,
+  0x95, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb7, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaa,
+  0xe0, 0xa4, 0xb9, 0xe0, 0xa5, 0x81, 0xe0, 0xa4, 0x81, 0xe0, 0xa4, 0x9a, 0xe0,
+  0xa4, 0xa4, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xaa, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4,
+  0xb0, 0xe0, 0xa4, 0xac, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xa7, 0xe0, 0xa4, 0xa8,
+  0xe0, 0xa4, 0x9f, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xaa, 0xe0, 0xa5, 0x8d, 0xe0,
+  0xa4, 0xaa, 0xe0, 0xa4, 0xa3, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0x95, 0xe0, 0xa5,
+  0x8d, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x87,
+  0xe0, 0xa4, 0x9f, 0xe0, 0xa4, 0xaa, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb0, 0xe0,
+  0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xad, 0xe0, 0xa4,
+  0xaa, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaa,
+  0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbe, 0xe0,
+  0xa4, 0xb2, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4,
+  0x82, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xab, 0xe0, 0xa4, 0xbc, 0xe0, 0xa5, 0x8d,
+  0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xa8, 0xe0,
+  0xa4, 0xbf, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xae, 0xe0, 0xa4,
+  0xbe, 0xe0, 0xa4, 0xa3, 0xe0, 0xa4, 0xb2, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xae,
+  0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x9f, 0xe0, 0xa5, 0x87, 0xe0, 0xa4, 0xa1, 0x64,
+  0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x63,
+  0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d,
+  0x65, 0x6e, 0x74, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
+  0x70, 0x72, 0x6f, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65,
+  0x6e, 0x74, 0x73, 0x42, 0x79, 0x54, 0x61, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x28,
+  0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x68, 0x74, 0x6d,
+  0x6c, 0x3e, 0x0a, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x20, 0x3c, 0x6d, 0x65, 0x74,
+  0x61, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x75, 0x74,
+  0x66, 0x2d, 0x38, 0x22, 0x3e, 0x3a, 0x75, 0x72, 0x6c, 0x22, 0x20, 0x63, 0x6f,
+  0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
+  0x2f, 0x2e, 0x63, 0x73, 0x73, 0x22, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x73,
+  0x74, 0x79, 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, 0x73, 0x74, 0x79,
+  0x6c, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74,
+  0x2f, 0x63, 0x73, 0x73, 0x22, 0x3e, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74,
+  0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66,
+  0x3d, 0x22, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39,
+  0x2f, 0x78, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x20, 0x78, 0x6d, 0x6c, 0x74, 0x79,
+  0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61,
+  0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f,
+  0x64, 0x3d, 0x22, 0x67, 0x65, 0x74, 0x22, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f,
+  0x6e, 0x3d, 0x22, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22,
+  0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, 0x20, 0x20,
+  0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65,
+  0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x74, 0x79, 0x70, 0x65, 0x3d,
+  0x22, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x78, 0x2d, 0x69, 0x63, 0x6f, 0x6e,
+  0x22, 0x20, 0x2f, 0x3e, 0x63, 0x65, 0x6c, 0x6c, 0x70, 0x61, 0x64, 0x64, 0x69,
+  0x6e, 0x67, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x70,
+  0x2e, 0x63, 0x73, 0x73, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74,
+  0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, 0x20, 0x3c, 0x2f, 0x61, 0x3e,
+  0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x3c, 0x6c, 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x68,
+  0x72, 0x65, 0x66, 0x3d, 0x22, 0x22, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d,
+  0x22, 0x31, 0x22, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x22, 0x31,
+  0x22, 0x22, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68,
+  0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x74, 0x79,
+  0x6c, 0x65, 0x3d, 0x22, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x6e,
+  0x6f, 0x6e, 0x65, 0x3b, 0x22, 0x3e, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61,
+  0x74, 0x65, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x61, 0x70, 0x70,
+  0x6c, 0x69, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, 0x2f, 0x44, 0x54, 0x44,
+  0x20, 0x58, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x65, 0x6c,
+  0x6c, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x30, 0x22, 0x20,
+  0x63, 0x65, 0x6c, 0x6c, 0x70, 0x61, 0x64, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d,
+  0x22, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75,
+  0x65, 0x3d, 0x22, 0x2f, 0x61, 0x3e, 0x26, 0x6e, 0x62, 0x73, 0x70, 0x3b, 0x3c,
+  0x73, 0x70, 0x61, 0x6e, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x3d, 0x22, 0x73, 0x0a,
+  0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22,
+  0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x22, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75,
+  0x61, 0x67, 0x65, 0x3d, 0x22, 0x4a, 0x61, 0x76, 0x61, 0x53, 0x63, 0x72, 0x69,
+  0x70, 0x74, 0x22, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74,
+  0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42,
+  0x67, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x70, 0x61,
+  0x63, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x79, 0x70, 0x65, 0x3d,
+  0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, 0x20, 0x6d, 0x65,
+  0x64, 0x69, 0x61, 0x3d, 0x22, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x27, 0x74, 0x65,
+  0x78, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+  0x27, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x63,
+  0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x79, 0x70, 0x65,
+  0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, 0x20, 0x72,
+  0x65, 0x6c, 0x3d, 0x22, 0x73, 0x74, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74,
+  0x3d, 0x22, 0x31, 0x22, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x31,
+  0x22, 0x20, 0x3d, 0x27, 0x2b, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x55, 0x52,
+  0x49, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x28, 0x3c, 0x6c,
+  0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x61, 0x6c, 0x74, 0x65,
+  0x72, 0x6e, 0x61, 0x74, 0x65, 0x22, 0x20, 0x0a, 0x62, 0x6f, 0x64, 0x79, 0x2c,
+  0x20, 0x74, 0x72, 0x2c, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2c, 0x20, 0x74,
+  0x65, 0x78, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+  0x22, 0x72, 0x6f, 0x62, 0x6f, 0x74, 0x73, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x6d,
+  0x65, 0x74, 0x68, 0x6f, 0x64, 0x3d, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x22, 0x20,
+  0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x3e, 0x0a, 0x3c, 0x61, 0x20,
+  0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
+  0x77, 0x77, 0x77, 0x2e, 0x63, 0x73, 0x73, 0x22, 0x20, 0x72, 0x65, 0x6c, 0x3d,
+  0x22, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, 0x20,
+  0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c,
+  0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x6c, 0x61, 0x6e, 0x67,
+  0x75, 0x61, 0x67, 0x65, 0x3d, 0x22, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72,
+  0x69, 0x70, 0x74, 0x22, 0x3e, 0x61, 0x72, 0x69, 0x61, 0x2d, 0x68, 0x69, 0x64,
+  0x64, 0x65, 0x6e, 0x3d, 0x22, 0x74, 0x72, 0x75, 0x65, 0x22, 0x3e, 0xc2, 0xb7,
+  0x3c, 0x72, 0x69, 0x70, 0x74, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22,
+  0x74, 0x65, 0x78, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x6c, 0x3d, 0x30,
+  0x3b, 0x7d, 0x29, 0x28, 0x29, 0x3b, 0x0a, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74,
+  0x69, 0x6f, 0x6e, 0x28, 0x29, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f,
+  0x75, 0x6e, 0x64, 0x2d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x75, 0x72,
+  0x6c, 0x28, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x6c, 0x69, 0x3e, 0x3c, 0x6c, 0x69,
+  0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x09, 0x09,
+  0x3c, 0x6c, 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22,
+  0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x20,
+  0x61, 0x72, 0x69, 0x61, 0x2d, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x3d, 0x22,
+  0x74, 0x72, 0x75, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d,
+  0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6c,
+  0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3d, 0x22, 0x6a, 0x61, 0x76, 0x61,
+  0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x20, 0x2f, 0x6f, 0x70, 0x74, 0x69,
+  0x6f, 0x6e, 0x3e, 0x0a, 0x3c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76,
+  0x61, 0x6c, 0x75, 0x65, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x3c, 0x2f, 0x64, 0x69,
+  0x76, 0x3e, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d,
+  0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x20, 0x61, 0x72, 0x69, 0x61, 0x2d, 0x68,
+  0x69, 0x64, 0x64, 0x65, 0x6e, 0x3d, 0x22, 0x74, 0x72, 0x65, 0x3d, 0x28, 0x6e,
+  0x65, 0x77, 0x20, 0x44, 0x61, 0x74, 0x65, 0x29, 0x2e, 0x67, 0x65, 0x74, 0x54,
+  0x69, 0x6d, 0x65, 0x28, 0x29, 0x70, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x75, 0xc3,
+  0xaa, 0x73, 0x20, 0x28, 0x64, 0x6f, 0x20, 0x42, 0x72, 0x61, 0x73, 0x69, 0x6c,
+  0x29, 0xd0, 0xbe, 0xd1, 0x80, 0xd0, 0xb3, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xb8,
+  0xd0, 0xb7, 0xd0, 0xb0, 0xd1, 0x86, 0xd0, 0xb8, 0xd0, 0xb8, 0xd0, 0xb2, 0xd0,
+  0xbe, 0xd0, 0xb7, 0xd0, 0xbc, 0xd0, 0xbe, 0xd0, 0xb6, 0xd0, 0xbd, 0xd0, 0xbe,
+  0xd1, 0x81, 0xd1, 0x82, 0xd1, 0x8c, 0xd0, 0xbe, 0xd0, 0xb1, 0xd1, 0x80, 0xd0,
+  0xb0, 0xd0, 0xb7, 0xd0, 0xbe, 0xd0, 0xb2, 0xd0, 0xb0, 0xd0, 0xbd, 0xd0, 0xb8,
+  0xd1, 0x8f, 0xd1, 0x80, 0xd0, 0xb5, 0xd0, 0xb3, 0xd0, 0xb8, 0xd1, 0x81, 0xd1,
+  0x82, 0xd1, 0x80, 0xd0, 0xb0, 0xd1, 0x86, 0xd0, 0xb8, 0xd0, 0xb8, 0xd0, 0xb2,
+  0xd0, 0xbe, 0xd0, 0xb7, 0xd0, 0xbc, 0xd0, 0xbe, 0xd0, 0xb6, 0xd0, 0xbd, 0xd0,
+  0xbe, 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb8, 0xd0, 0xbe, 0xd0, 0xb1, 0xd1, 0x8f,
+  0xd0, 0xb7, 0xd0, 0xb0, 0xd1, 0x82, 0xd0, 0xb5, 0xd0, 0xbb, 0xd1, 0x8c, 0xd0,
+  0xbd, 0xd0, 0xb0, 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20,
+  0x68, 0x74, 0x6d, 0x6c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x20, 0x22,
+  0x6e, 0x74, 0x2d, 0x54, 0x79, 0x70, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74,
+  0x65, 0x6e, 0x74, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x3c, 0x6d, 0x65,
+  0x74, 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, 0x65, 0x71, 0x75, 0x69, 0x76,
+  0x3d, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74,
+  0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x45, 0x4e, 0x22, 0x20, 0x22, 0x68,
+  0x74, 0x74, 0x70, 0x3a, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x20, 0x78, 0x6d, 0x6c,
+  0x6e, 0x73, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77,
+  0x77, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, 0x2f, 0x44, 0x54, 0x44, 0x20,
+  0x58, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x54, 0x44, 0x54,
+  0x44, 0x2f, 0x78, 0x68, 0x74, 0x6d, 0x6c, 0x31, 0x2d, 0x74, 0x72, 0x61, 0x6e,
+  0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x77, 0x77, 0x77,
+  0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x78, 0x68,
+  0x74, 0x6d, 0x6c, 0x31, 0x2f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x27, 0x74, 0x65,
+  0x78, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+  0x27, 0x3b, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+  0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x70,
+  0x61, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x69, 0x6e, 0x73,
+  0x65, 0x72, 0x74, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x3c, 0x69, 0x6e, 0x70,
+  0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x68, 0x69, 0x64, 0x64,
+  0x65, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6a, 0x73, 0x22, 0x20, 0x74, 0x79, 0x70,
+  0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73,
+  0x63, 0x72, 0x69, 0x28, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x29,
+  0x2e, 0x72, 0x65, 0x61, 0x64, 0x79, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69,
+  0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22,
+  0x74, 0x65, 0x78, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x69, 0x6d, 0x61,
+  0x67, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22,
+  0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x55, 0x41, 0x2d, 0x43, 0x6f, 0x6d,
+  0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74,
+  0x65, 0x6e, 0x74, 0x3d, 0x74, 0x6d, 0x6c, 0x3b, 0x20, 0x63, 0x68, 0x61, 0x72,
+  0x73, 0x65, 0x74, 0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x22, 0x20, 0x2f, 0x3e,
+  0x0a, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x73, 0x68,
+  0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x20, 0x69, 0x63, 0x6f, 0x6e, 0x3c, 0x6c,
+  0x69, 0x6e, 0x6b, 0x20, 0x72, 0x65, 0x6c, 0x3d, 0x22, 0x73, 0x74, 0x79, 0x6c,
+  0x65, 0x73, 0x68, 0x65, 0x65, 0x74, 0x22, 0x20, 0x3c, 0x2f, 0x73, 0x63, 0x72,
+  0x69, 0x70, 0x74, 0x3e, 0x0a, 0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20,
+  0x74, 0x79, 0x70, 0x65, 0x3d, 0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
+  0x6e, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d,
+  0x65, 0x6e, 0x3c, 0x61, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3d, 0x22,
+  0x5f, 0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d,
+  0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74,
+  0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, 0x69, 0x6e, 0x70, 0x75,
+  0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22,
+  0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x61, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x20,
+  0x3d, 0x20, 0x27, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73,
+  0x63, 0x72, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d,
+  0x22, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+  0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74,
+  0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x22, 0x20, 0x2f, 0x3e, 0x64, 0x74, 0x64,
+  0x22, 0x3e, 0x0a, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x20, 0x78, 0x6d, 0x6c, 0x6e,
+  0x73, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43,
+  0x2f, 0x2f, 0x44, 0x54, 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x34, 0x2e,
+  0x30, 0x31, 0x20, 0x54, 0x65, 0x6e, 0x74, 0x73, 0x42, 0x79, 0x54, 0x61, 0x67,
+  0x4e, 0x61, 0x6d, 0x65, 0x28, 0x27, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x27,
+  0x29, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22,
+  0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x3c, 0x73,
+  0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74,
+  0x65, 0x78, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x22, 0x20, 0x73, 0x74,
+  0x79, 0x6c, 0x65, 0x3d, 0x22, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a,
+  0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x22, 0x3e, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
+  0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+  0x42, 0x79, 0x49, 0x64, 0x28, 0x3d, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e,
+  0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6c, 0x65, 0x6d, 0x65,
+  0x6e, 0x74, 0x28, 0x27, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x27, 0x74, 0x65,
+  0x78, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+  0x27, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22,
+  0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x64,
+  0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42,
+  0x79, 0x54, 0x61, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x73, 0x6e, 0x69, 0x63,
+  0x61, 0x6c, 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74,
+  0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x43, 0x2f, 0x2f, 0x44, 0x54,
+  0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x34, 0x2e, 0x30, 0x31, 0x20, 0x54,
+  0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x3c, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x20,
+  0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73,
+  0x73, 0x22, 0x3e, 0x0a, 0x0a, 0x3c, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x20, 0x74,
+  0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73,
+  0x22, 0x3e, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2e, 0x64, 0x74, 0x64, 0x22, 0x3e,
+  0x0a, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3d,
+  0x68, 0x74, 0x74, 0x70, 0x2d, 0x65, 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x43,
+  0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x54, 0x79, 0x70, 0x65, 0x64, 0x69,
+  0x6e, 0x67, 0x3d, 0x22, 0x30, 0x22, 0x20, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x70,
+  0x61, 0x63, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x30, 0x22, 0x68, 0x74, 0x6d, 0x6c,
+  0x3b, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x75, 0x74, 0x66,
+  0x2d, 0x38, 0x22, 0x20, 0x2f, 0x3e, 0x0a, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65,
+  0x3d, 0x22, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x6e, 0x6f, 0x6e,
+  0x65, 0x3b, 0x22, 0x3e, 0x3c, 0x3c, 0x6c, 0x69, 0x3e, 0x3c, 0x61, 0x20, 0x68,
+  0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
+  0x77, 0x77, 0x2e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x27, 0x74, 0x65, 0x78,
+  0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x27,
+  0x3e, 0xd0, 0xb4, 0xd0, 0xb5, 0xd1, 0x8f, 0xd1, 0x82, 0xd0, 0xb5, 0xd0, 0xbb,
+  0xd1, 0x8c, 0xd0, 0xbd, 0xd0, 0xbe, 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb8, 0xd1,
+  0x81, 0xd0, 0xbe, 0xd0, 0xbe, 0xd1, 0x82, 0xd0, 0xb2, 0xd0, 0xb5, 0xd1, 0x82,
+  0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb2, 0xd0, 0xb8, 0xd0, 0xb8, 0xd0, 0xbf, 0xd1,
+  0x80, 0xd0, 0xbe, 0xd0, 0xb8, 0xd0, 0xb7, 0xd0, 0xb2, 0xd0, 0xbe, 0xd0, 0xb4,
+  0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb2, 0xd0, 0xb0, 0xd0, 0xb1, 0xd0, 0xb5, 0xd0,
+  0xb7, 0xd0, 0xbe, 0xd0, 0xbf, 0xd0, 0xb0, 0xd1, 0x81, 0xd0, 0xbd, 0xd0, 0xbe,
+  0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xb8, 0xe0, 0xa4, 0xaa, 0xe0, 0xa5, 0x81, 0xe0,
+  0xa4, 0xb8, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4,
+  0x95, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0x82,
+  0xe0, 0xa4, 0x97, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb0, 0xe0, 0xa5, 0x87, 0xe0,
+  0xa4, 0xb8, 0xe0, 0xa4, 0x89, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4,
+  0xb9, 0xe0, 0xa5, 0x8b, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0xa8, 0xe0, 0xa5, 0x87,
+  0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa7, 0xe0, 0xa4, 0xbe, 0xe0,
+  0xa4, 0xa8, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xad, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4,
+  0xab, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb8,
+  0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0x82, 0xe0, 0xa4, 0x97, 0xe0, 0xa4, 0xb8, 0xe0,
+  0xa5, 0x81, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4,
+  0xb7, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x89,
+  0xe0, 0xa4, 0xaa, 0xe0, 0xa5, 0x80, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xbe, 0xe0,
+  0xa4, 0x87, 0xe0, 0xa4, 0x9f, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbf, 0xe0, 0xa4,
+  0x9c, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0x9e, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xaa,
+  0xe0, 0xa4, 0xa8, 0xe0, 0xa4, 0x95, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4, 0xb0, 0xe0,
+  0xa5, 0x8d, 0xe0, 0xa4, 0xb0, 0xe0, 0xa4, 0xb5, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4,
+  0x88, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0x95, 0xe0, 0xa5, 0x8d, 0xe0, 0xa4, 0xb0,
+  0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xaf, 0xe0, 0xa4, 0xa4, 0xe0, 0xa4, 0xbe,
+};
+
+#if defined(__cplusplus) || defined(c_plusplus)
+}    /* extern "C" */
+#endif
diff --git a/third_party/brotli/enc/dictionary.h b/third_party/brotli/enc/dictionary.h
new file mode 100644
index 0000000..c9c6362
--- /dev/null
+++ b/third_party/brotli/enc/dictionary.h
@@ -0,0 +1,41 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Collection of static dictionary words.
+
+#ifndef BROTLI_ENC_DICTIONARY_H_
+#define BROTLI_ENC_DICTIONARY_H_
+
+#include "./types.h"
+
+// No namespace, use same identifier as for the C decoder.
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+
+extern const uint8_t kBrotliDictionary[122784];
+
+static const uint32_t kBrotliDictionaryOffsetsByLength[] = {
+     0,     0,     0,     0,     0,  4096,  9216, 21504, 35840, 44032,
+ 53248, 63488, 74752, 87040, 93696, 100864, 104704, 106752, 108928, 113536,
+ 115968, 118528, 119872, 121280, 122016,
+};
+
+static const uint8_t kBrotliDictionarySizeBitsByLength[] = {
+  0,  0,  0,  0, 10, 10, 11, 11, 10, 10,
+ 10, 10, 10,  9,  9,  8,  7,  7,  8,  7,
+  7,  6,  6,  5,  5,
+};
+
+static const int kBrotliMinDictionaryWordLength = 4;
+static const int kBrotliMaxDictionaryWordLength = 24;
+
+#if defined(__cplusplus) || defined(c_plusplus)
+}    /* extern "C" */
+#endif
+
+#endif  // BROTLI_ENC_DICTIONARY_H_
diff --git a/third_party/brotli/enc/dictionary_hash.h b/third_party/brotli/enc/dictionary_hash.h
new file mode 100644
index 0000000..afbb1f1
--- /dev/null
+++ b/third_party/brotli/enc/dictionary_hash.h
@@ -0,0 +1,4117 @@
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Hash table on the 4-byte prefixes of static dictionary words.
+
+#ifndef BROTLI_ENC_DICTIONARY_HASH_H_
+#define BROTLI_ENC_DICTIONARY_HASH_H_
+
+#include "./types.h"
+
+namespace brotli {
+
+static const uint16_t kStaticDictionaryHash[] = {
+  0x7d48, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x5564, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x9e26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb2e6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x050c, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x1364, 0x0116, 0x5ca5, 0x0000, 0x4e04,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x084e, 0x3ee6, 0x0000, 0x0000,
+  0x0000, 0x3865, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x6867, 0x08cd, 0x0000, 0x0000, 0x4364, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0e26,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x59c8, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x4107, 0x0000, 0x85c7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xbd66, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x09cf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x4c4c, 0x0000, 0x0000, 0x5dc4,
+  0x0000, 0x0000, 0x0000, 0x2664, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x7885, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7ce6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x50aa, 0x0964,
+  0x0000, 0x5125, 0x068d, 0x2347, 0x0000, 0x1904, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xcaa7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x1a69, 0x1c26, 0x0000, 0x0000, 0x55e8, 0x59c7, 0x0000, 0x0000,
+  0x0dc9, 0x0000, 0x0748, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x2b26, 0x0000, 0x0000, 0x25a9, 0x0000, 0x0000, 0x0000,
+  0x196b, 0x0000, 0x0000, 0x9046, 0x5448, 0xf3a7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2066,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9f67,
+  0x0000, 0x0000, 0x0000, 0x99e6, 0x1fc8, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x22ab, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x1f05, 0x0000, 0x0000, 0x6409, 0x0000, 0x0000, 0x0000,
+  0x03a8, 0x0e84, 0x0c8d, 0x3d47, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xcd27, 0x0000, 0x43e5, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0528, 0x16a5, 0x0000, 0x5225, 0x0000, 0x0000, 0x1948, 0x0327,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x34e9, 0x0000, 0x0000, 0x0000, 0x0e28, 0x0000,
+  0x0000, 0x0000, 0x73ea, 0x7864, 0x0000, 0x7a05, 0x0000, 0x19c4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xfa46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5706, 0x0000, 0x9246,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x1c48, 0x01a7, 0x0000, 0x6024,
+  0x54c9, 0x44e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0729, 0x0000, 0x0000, 0x0000, 0x0148, 0x1785, 0x0000, 0x0000,
+  0x0000, 0x4e06, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xf2a7, 0x1052, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x2f44, 0x21a9, 0x0000, 0x0000, 0x4204, 0x0000, 0x8f46,
+  0x0000, 0x0000, 0x0000, 0x8a26, 0x0000, 0xca06, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5206, 0x0000, 0xf286,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x15a6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x3925, 0x2ac8, 0x6547, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x4d89, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x78e8, 0x0be6, 0x37ea, 0x32c6, 0x0000, 0x0000, 0x0000, 0x3ba4,
+  0x0000, 0x9e86, 0x7608, 0xf2a6, 0x0000, 0x0000, 0x0000, 0x4ea4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2ee5, 0x0000, 0x0000,
+  0x0000, 0xcc86, 0x0000, 0x0000, 0x0000, 0x0000, 0x60ca, 0x0000,
+  0x002c, 0x8147, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6704,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0ec5, 0x0000, 0x0000,
+  0x4608, 0x2507, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x7e29, 0x6fc5, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xb846, 0x2dcb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x09e8, 0xd767, 0x0000, 0x0000,
+  0x190a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xdbe6, 0x2e8a, 0x0000, 0x0211, 0x0000, 0x75e8, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x2045, 0x0000, 0x0000, 0x7088, 0xe5e6, 0x5869, 0x03c5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xfa87, 0x0000, 0x0000, 0x014b, 0x0e64,
+  0x0000, 0x0645, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x410a, 0x0025, 0x0000, 0x5c46,
+  0x0c48, 0x3c45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x57ab, 0x0045, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x45a8, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x2b69, 0x0000, 0x0000, 0x0000, 0x0000, 0x4785, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6806,
+  0x0000, 0x0000, 0x63a8, 0x6527, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4205,
+  0x0000, 0x0000, 0x0000, 0x6ba6, 0x0000, 0x0000, 0x24ca, 0x0000,
+  0x0000, 0x0000, 0x0db4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x9466, 0x2449, 0x2145, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x062a, 0x0644, 0x5d88, 0x0000, 0x0000, 0x3a44,
+  0x31ed, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x2f49, 0x0000, 0x40e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5364,
+  0x2be8, 0x70c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x168c, 0x0000, 0x0000, 0x6ca4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2084,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x416c, 0x0485, 0x0000, 0x0000, 0x496a, 0x3fc4,
+  0x652a, 0x03a7, 0x208d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x4746, 0x0000, 0x46a6, 0x0000, 0xb706,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0153, 0x0000,
+  0x0000, 0x6264, 0x31ec, 0x2f86, 0x1909, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x4084, 0x0000, 0x6984, 0x6eeb, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x058c, 0x0000, 0x0000, 0x0000,
+  0x2628, 0xcee7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x624b, 0x0144, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xfde6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x5585, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb906,
+  0x0000, 0x0000, 0x0000, 0x0366, 0x0000, 0x0000, 0x0000, 0x3166,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x65a4, 0x3fe8, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0711, 0x0000, 0x0000, 0x0000,
+  0x19c9, 0x3e06, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x71a4,
+  0x0000, 0x6f64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x55e4, 0x0000, 0x0000, 0x0000, 0xa7c6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x140d, 0x0526, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd6c6,
+  0x6148, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xc946, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0e65, 0x0000, 0x0000, 0x0000, 0x0000, 0x274e, 0x24c4,
+  0x0000, 0x0000, 0x0000, 0x7ae4, 0x164c, 0x1825, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x15c7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x6a08, 0xe086, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x1bac, 0x0000, 0x55e9, 0xcf86, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x20cd, 0x0000, 0x0000, 0x1665, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0844, 0x0000, 0x60a6, 0x0000, 0x2c07,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x046d, 0x0000, 0x1309, 0x0000, 0x0000, 0x95a6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x460c, 0x0000, 0x0000, 0x4685, 0x0000, 0x0000,
+  0x0000, 0x63a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x4586, 0x0000, 0x6666, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x59e8, 0x4407, 0x4fa8, 0x00a4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0ca7, 0x0000, 0xb427, 0x0000, 0x0000,
+  0x0000, 0x6fa4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x1dc5, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xa206, 0x0000, 0x0000, 0x7928, 0xd826,
+  0x2748, 0x0784, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8f06,
+  0x0000, 0x8f67, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x36aa, 0xe7a7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6785, 0x0000, 0x1607,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3649, 0x04e5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x13e7, 0x0000, 0x0000,
+  0x0000, 0x70c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x21c6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x6429, 0x4584, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x3404, 0x026c, 0x18a5, 0x2e2b, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0388, 0x0447,
+  0x0000, 0x5ea5, 0x0000, 0x0000, 0x7048, 0xc227, 0x0000, 0x5a25,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x7e88, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x89c7, 0x0000, 0x7044, 0x16ea, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x1109, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x1eed, 0x22a5, 0x0000, 0x0000, 0x0000, 0x3664, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xa3e6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x1a6e, 0x36a5, 0x0000, 0x0000, 0x0000, 0x0387,
+  0x0000, 0x0000, 0x5dca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfb86,
+  0x0000, 0x57c4, 0x0000, 0x6505, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x5c68, 0x14c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x59e9, 0x1545, 0x3e89, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xbb86, 0x28e9, 0x0000, 0x0000, 0x3844,
+  0x0000, 0x0000, 0x0000, 0xa4c7, 0x0000, 0x0000, 0x0000, 0xc846,
+  0x0000, 0x0000, 0x296a, 0x5e44, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xab06, 0x0000, 0x0000, 0x45aa, 0x0000, 0x0000, 0x0000,
+  0x63e8, 0x6a45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x718a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0272, 0x07c4, 0x396c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe146,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xaea6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0f08, 0x1dc7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xa586, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x4b48, 0x1924, 0x0000, 0x0000,
+  0x1488, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4ce5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9b67, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x7908, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x6e46, 0x0000, 0x0000, 0x0000, 0x7164, 0x292a, 0x0c85,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x1604, 0x0348, 0x0127, 0x0000, 0x0000,
+  0x2128, 0x2006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x5064, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0fea, 0x4c46,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x79a8, 0xfa26, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x414c, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x452a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc5c6,
+  0x0000, 0xc547, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6366, 0x0000, 0x0000,
+  0x0000, 0x3607, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0a88, 0x0fc7, 0x0000, 0x0000, 0x0000, 0x0000, 0x62c8, 0x0000,
+  0x2f2c, 0x0806, 0x0000, 0xbf26, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x4249, 0xe827, 0x436b, 0x8a07, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x7a2b, 0x0000, 0x0000, 0x0000, 0x0449, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0308, 0x0347, 0x0000, 0x0000, 0x72ca, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x16e8, 0x2f66, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6305, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf007,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x6066, 0x0000, 0x0000, 0x0000, 0xf767, 0x0000, 0x70a4,
+  0x1fce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x118e, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x3708, 0x04a4, 0x0000, 0x3f84, 0x0000, 0x0000,
+  0x0000, 0x4025, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0114, 0x0000, 0x0000, 0x42a4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e0c, 0x7305,
+  0x0000, 0x8307, 0x0000, 0x1325, 0x0000, 0x0000, 0x30ea, 0x0000,
+  0x0000, 0xf407, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0fce, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x5006, 0x0000, 0x3c64, 0x08a9, 0xca07, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x5bc7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x3c0a, 0x0000, 0x3de9, 0x0000, 0x3b09, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d44,
+  0x1ca9, 0x0000, 0x0000, 0x0000, 0x0000, 0x7686, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7e2b, 0x5d84,
+  0x0000, 0x4566, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x1828, 0x0000, 0x51a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7b04, 0x0000, 0x0000,
+  0x0000, 0x1585, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0a6d, 0xc406, 0x0000, 0x0000, 0x300b, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1489, 0x6e07,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x2de6, 0x0f32, 0x0000, 0x0000, 0x6784,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc0a6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2ae5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x4629, 0x0727, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x73c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x6769, 0x0000,
+  0x1848, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02c7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x700b, 0x9c27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc9c6,
+  0x0000, 0x0000, 0x0000, 0x6b87, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x788b, 0x0cc4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7064, 0x0000, 0x4724,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x6368, 0xffa6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0d09, 0x0686, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x4b84, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x6168, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0413, 0x0000, 0x0000, 0x0000, 0x0000, 0x3dc6, 0x0000, 0x54a6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f87,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x7ec6, 0x0000, 0x77a6, 0x0000, 0x0000, 0x4eca, 0x26c6,
+  0x0000, 0x0000, 0x0000, 0x4747, 0x0000, 0x0000, 0x3828, 0x0000,
+  0x0808, 0x4327, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x1e84, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x57ca, 0xce46, 0x0634, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x2a49, 0x0000, 0x0000, 0x0000, 0x0000, 0x9fe6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7005, 0x0000, 0x0000,
+  0x1652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6509, 0x56e6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x4368, 0x8ba7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x202c, 0x0000,
+  0x7d6c, 0x0000, 0x0000, 0x0000, 0x002b, 0x3806, 0x0000, 0x4085,
+  0x0000, 0x0000, 0x780c, 0x0000, 0x0fac, 0x0085, 0x0000, 0x9e87,
+  0x03cb, 0x5d86, 0x0000, 0x0000, 0x6a8b, 0x0000, 0x0000, 0x0000,
+  0x00cc, 0x0000, 0x0000, 0x6a04, 0x1d8c, 0xad27, 0x6bc8, 0xe266,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x5748, 0x6465, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c44, 0x7c0b, 0x0000,
+  0x0000, 0x6dc6, 0x0000, 0xe6e7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x2fe5, 0x0000, 0xaf86, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x7b48, 0x0000, 0x2b6a, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x4a09, 0x4787, 0x0000, 0xb067, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x080b, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4bc7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4a6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x578b, 0x5d87, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x2daa, 0x0000, 0x0000, 0x0fe5, 0x0000, 0x0000,
+  0x0a6c, 0x18c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x6c0a, 0x06e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ac8, 0xdb06,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8547, 0x0000, 0x5f85,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x556b, 0x0000, 0x44ca, 0x26a6,
+  0x0000, 0x0000, 0x6d48, 0x9786, 0x0000, 0x0000, 0x0000, 0xaa86,
+  0x0000, 0x7b47, 0x2faa, 0x5a66, 0x0000, 0x0000, 0x0000, 0xc4a7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8026, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xc2e7, 0x0000, 0x0000, 0x0000, 0x0000, 0x3daa, 0x10a7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x128a, 0x0ee6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x4328, 0x01c5, 0x43ab, 0x0000,
+  0x4f68, 0x0fc4, 0x0000, 0x0000, 0x0000, 0x3de4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x6ba9, 0x7cc4, 0x7e28, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x2ceb, 0x2e06, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x260a, 0xc527, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x8a66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7426,
+  0x0000, 0x0000, 0x0000, 0x8ec7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x2429, 0x15e6, 0x0000, 0x3605, 0x0000, 0x1b67, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6227, 0x0000, 0x0000, 0x4a6b, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0a0c, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x7465, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa566,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x244d, 0x0000, 0x45e8, 0xdae6,
+  0x0fed, 0x0000, 0x0000, 0x0000, 0x74cb, 0x91e7, 0x0000, 0x7867,
+  0x0000, 0x2086, 0x0000, 0x0000, 0x0000, 0x47a6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4889, 0xd326,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x9186, 0x0000, 0x0000, 0x7ac9, 0xf046, 0x0000, 0x07e6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6325, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0865, 0x62c9, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x30e4,
+  0x3769, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x21e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8e86, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x2a89, 0x2587, 0x0000, 0x7027, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x6f4a, 0x0000, 0x0000, 0x0000, 0x0000, 0x6645, 0x282b, 0x06a5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x3a84, 0x0000, 0x1e67, 0x0000, 0x6cc6, 0x0000, 0x0000,
+  0x0000, 0xdca6, 0x0f34, 0x0000, 0x0000, 0x0000, 0x168a, 0x40c7,
+  0x0000, 0x66c5, 0x346e, 0x4f44, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7046, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x38c8, 0x0486, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x64c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa5c6, 0x0000, 0x0d04,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x2087, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x43c9, 0x05a7,
+  0x0000, 0x0000, 0x20eb, 0xbd86, 0x054f, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x3a8a, 0x0000, 0x7da8, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x240e, 0x0ae7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x3ec9, 0x7b87, 0x10ad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x11a7, 0x0000, 0x0000, 0x6d08, 0xe646, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20a9, 0x4d64,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x17a8, 0x1ec5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x54c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x23a8, 0x0465,
+  0x0000, 0x40a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x438c, 0x1ac6, 0x5368, 0x0000,
+  0x094c, 0x0000, 0x0000, 0x0fa7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x5f25, 0x106a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x29a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa747, 0x0bce, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x3825, 0x0000, 0x50c5, 0x0ce8, 0x0ac7,
+  0x502a, 0xfd87, 0x0000, 0x0000, 0x0000, 0x0026, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x6ca6, 0x0af2, 0x22a6, 0x0eae, 0x04e7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x754b, 0x2526,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x45c8, 0x3a07, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x5b6c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc906,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb2a6,
+  0x0000, 0x0000, 0x5bab, 0x7e47, 0x0000, 0x0000, 0x2a4a, 0xcf07,
+  0x0000, 0x0000, 0x0000, 0x81c6, 0x7a68, 0xfb46, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7da6, 0x0000, 0x0000,
+  0x0f33, 0x0000, 0x0000, 0x0000, 0x1b69, 0x0285, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x6d0b, 0xb407, 0x0000, 0x0000,
+  0x0000, 0x5567, 0x0000, 0x85c6, 0x0000, 0x0000, 0x414b, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x36e4, 0x53a8, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9ba6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x9846, 0x0000, 0x0000, 0x4468, 0x1d24,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x3c44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x6ec4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6365, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2e67,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4dc7, 0x0000, 0x4e27,
+  0x0000, 0x0000, 0x0000, 0x2a67, 0x03af, 0x0000, 0x0000, 0x2a45,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x104a, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x266c, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xff87, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x2689, 0x6046, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x9e47, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x3204, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x564b, 0x5c67, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7bc6, 0x0000, 0x0000,
+  0x0000, 0xe4e7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4ca4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f65, 0x0000, 0x6dc4,
+  0x0000, 0x0000, 0x0000, 0x7a24, 0x0000, 0x0c84, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x39e6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x4deb, 0x27c6, 0x0000, 0x0000,
+  0x2508, 0x39e5, 0x112e, 0x0000, 0x0000, 0x38c4, 0x0000, 0x0000,
+  0x0000, 0xbee7, 0x0751, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x024d, 0x0605, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x5b25, 0x0000, 0x0000, 0x0000, 0x3745, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0510, 0x3826, 0x0000, 0x6aa4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x1c6c, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xba66, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x142c, 0x06e5,
+  0x0000, 0x3845, 0x0000, 0x92c6, 0x07ca, 0x0000, 0x19ec, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6ca7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0a08, 0x1aa4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x2c48, 0x6687, 0x0000, 0x0000, 0x5d68, 0x0000, 0x0000, 0x0000,
+  0x7748, 0x0000, 0x0000, 0x8626, 0x0000, 0x4587, 0x0000, 0x0000,
+  0x0000, 0x5685, 0x0000, 0x17e6, 0x0000, 0x6484, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x67e8, 0x1446,
+  0x0000, 0x0000, 0x0476, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x9a67, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x9a46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0c0d, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x12b2, 0x0000, 0x0000, 0x0000,
+  0x70c9, 0x1984, 0x0000, 0x0000, 0x6828, 0x0000, 0x23e9, 0x2dc7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7c08, 0xfc86,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x2c85, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6206, 0x0000, 0x0000, 0x46e9, 0x4ec7,
+  0x0000, 0x0000, 0x0000, 0x4366, 0x0000, 0x0000, 0x036e, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x5e66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x65cb, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x7b68, 0x0000, 0x0000, 0x1fe7,
+  0x5f2a, 0x1844, 0x0000, 0x87c6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x7f08, 0x0000, 0x0000, 0xae87, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x4645, 0x21e9, 0x7226, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x280b, 0x1326, 0x05ac, 0x3b67,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5926,
+  0x0000, 0x28e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x4b89, 0x4506, 0x006b, 0x2ce6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x6aa9, 0x0a05, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xfc06, 0x00c8, 0x6ee5, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x79e8, 0x0000, 0x782a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x7289, 0xec66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0c89, 0x0ca5,
+  0x30ca, 0x5887, 0x0000, 0x0000, 0x0000, 0x4965, 0x7ae8, 0x4007,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x50a6, 0x0000, 0x0000, 0x0000, 0x6a66,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e44, 0x1188, 0x1b27,
+  0x0000, 0x0000, 0x0000, 0xb506, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7125, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x5068, 0x0d27, 0x0000, 0x6306,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0716, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x42e5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xda87,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e45, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0b71, 0x0000, 0x0000, 0xc3a6, 0x0000, 0x0b66,
+  0x630c, 0x7564, 0x0073, 0x2e46, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0bf0, 0x0000, 0x0000, 0x0000, 0x0000, 0x44e7, 0x00ef, 0x4d67,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x8fc6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x53e7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f04, 0x2e0a, 0x12a4,
+  0x0000, 0x0000, 0x0d28, 0x8dc7, 0x0000, 0x7ae7, 0x0000, 0x0000,
+  0x3949, 0x03e4, 0x0000, 0x5066, 0x0000, 0x0000, 0x0000, 0x2704,
+  0x0000, 0x5c85, 0x0000, 0x0000, 0x0000, 0xcd47, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1d84, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0767, 0x088a, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x6c6b, 0x6367, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x794c, 0xf726, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x8f86, 0x0000, 0x60e4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7948, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x532a, 0x08e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x676b, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x3be4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0c68, 0x4be7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xf506, 0x0000, 0x0000, 0x0000, 0x6324,
+  0x0000, 0x0000, 0x6ceb, 0x0524, 0x0000, 0x0000, 0x1e2c, 0x0bc7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x1a29, 0x0000, 0x0000, 0xbb26,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0c45, 0x0000, 0x0000, 0x0000, 0x39e4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x246e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7b05, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x19a6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x19a9, 0x0544, 0x0000, 0x6426, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x4f64, 0x0000, 0x0000, 0x42ab, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2e64, 0x0000, 0xa046,
+  0x0000, 0x0000, 0x0000, 0x6725, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2ca7, 0x6de9, 0x3a66,
+  0x0000, 0x27a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x7386, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a28, 0xe066,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x6fea, 0xe0e6, 0x056b, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xe387, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x41a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0dc6,
+  0x0000, 0x3da5, 0x0000, 0x15c4, 0x3428, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x48e9, 0x5ba7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x3c2d, 0x1ae5, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x3ba8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x2685, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x2528, 0x0fc5, 0x0000, 0x0000, 0x2d2b, 0xc1e7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6ce8, 0xe1e6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa367, 0x0000, 0x55a4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x63a5,
+  0x0000, 0x6b46, 0x0000, 0x46a5, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x364a, 0x1f84, 0x6749, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x62e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x3faa, 0x1ce5,
+  0x164a, 0x4b27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0570, 0xc6e7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xd267, 0x0000, 0x0000, 0x0000, 0x0000, 0x05ab, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x8c07, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x4589, 0x3dc5, 0x0000, 0x31c4,
+  0x0000, 0x0000, 0x0000, 0x80c7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x150d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x79a7, 0x0000, 0x5044,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xc9e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x2f4d, 0x4a47, 0x0000, 0x88a7, 0x0000, 0x54e4,
+  0x0e10, 0x0000, 0x0000, 0x0000, 0x0000, 0xba86, 0x4388, 0xabc7,
+  0x5949, 0xb9c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x6728, 0xbce6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7706, 0x0000, 0x0000,
+  0x5c08, 0x11e5, 0x0000, 0x5784, 0x0000, 0xc086, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xc2a7, 0x0000, 0x0000, 0x0000, 0x6b85, 0x7bcb, 0x0007,
+  0x0000, 0x0000, 0x64eb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x1069, 0x4065, 0x0000, 0x50c4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0ea9, 0x5b07, 0x3f88, 0x0f26, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x2caa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x1da5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xdf07, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5924,
+  0x2b8a, 0xc006, 0x0000, 0x5c47, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x3645, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x2dca, 0xeaa7, 0x04ea, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x4884, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x6d29, 0x0000, 0x0000, 0x0000, 0x0000, 0x1567,
+  0x0000, 0x4e26, 0x44c8, 0x0d67, 0x2aec, 0x75e4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6005, 0x000e, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x63e4, 0x0000, 0x0000,
+  0x0000, 0x6fc4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xd127, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8386,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2206,
+  0x0000, 0x3724, 0x0000, 0x0000, 0x0074, 0x0124, 0x0000, 0x0000,
+  0x0000, 0x93c7, 0x0000, 0xa846, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x5548, 0x0000, 0x0000, 0x7d86,
+  0x030f, 0x0000, 0x0000, 0x7906, 0x0000, 0x0000, 0x0000, 0x0044,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x172c, 0x0000,
+  0x0000, 0x0000, 0x4849, 0x3b47, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0e2e, 0x4245, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x4585, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0208, 0xa4a6, 0x0000, 0x0000, 0x0c32, 0x0000, 0x0000, 0x0000,
+  0x57ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x6f86, 0x0000, 0x0000, 0x0000, 0xc466, 0x0000, 0x0000,
+  0x3549, 0x1746, 0x0000, 0x89a6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x7529, 0x4924, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x508b, 0x2467,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x5da9, 0x0000, 0x1449, 0x0000,
+  0x0000, 0x2fa4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x5f46, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x4e89, 0x02a5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72eb, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x4f2a, 0x0000, 0x0000, 0x0000, 0x0000, 0x2987, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xba27,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x6804, 0x31c8, 0x0000, 0x50a8, 0x0000, 0x0000, 0x0000,
+  0x01b0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0286, 0x0000, 0x6404, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xf926, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x6028, 0x0000, 0x0000, 0x0000, 0x532b, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb246,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x078b, 0x0000, 0x0000, 0x0000,
+  0x5029, 0xea47, 0x0000, 0x5086, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xdba7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x7527, 0x0000, 0xce87, 0x0000, 0x51c6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41e7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x1c45, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xb9c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x28a6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa826, 0x0000, 0x0000,
+  0x0b72, 0x0000, 0x3288, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x79a5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9307,
+  0x0000, 0x44a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x7a08, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x02b0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0670, 0x0000, 0x0000, 0x0000, 0x0000, 0x2747, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0092, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x18c9, 0x00c7, 0x0000, 0x88a6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xde07, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbf06,
+  0x0000, 0x3464, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0989, 0x1144, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x4fcc, 0x03a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xb147, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5c6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x428c, 0x02e5, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6bc5, 0x0000, 0x0000, 0x764a, 0x4a06,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x08c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x6589, 0x0000, 0x0000, 0x0000,
+  0x098b, 0x0000, 0x0000, 0x7b86, 0x0000, 0x3746, 0x0000, 0x0000,
+  0x0000, 0x7007, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x3c68, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5a6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0ef3, 0x0000, 0x0000, 0x0000,
+  0x0eac, 0x0000, 0x26a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x4a8a, 0x7a07, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6004, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x40c4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6be9, 0x0000,
+  0x0000, 0x0000, 0x0310, 0x1227, 0x7f8c, 0x0000, 0x0000, 0xf806,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5246,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0d4c, 0xe466, 0x0000, 0x7e45, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x48ca, 0x0ae5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2164,
+  0x0000, 0x0000, 0x0000, 0x57e5, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x3e09, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c27,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x1f2a, 0x4624, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x5f04, 0x0000, 0x0000, 0x1349, 0x0000,
+  0x0000, 0x0000, 0x1fe8, 0x0000, 0x346c, 0x2864, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x2e04, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4148, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x44e8, 0x4647,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0b89, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x238c, 0x41a6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x77cb, 0x0000, 0x0000, 0x4a45,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00cd, 0x3be6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07b1, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6688, 0xcd26,
+  0x0000, 0xc286, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x25c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1286,
+  0x0000, 0x0000, 0x5489, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xd146, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x164b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0bca, 0x30a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0b68, 0x0106,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0e09, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d66, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xda47, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0307, 0x0000, 0xa906, 0x13ca, 0xbf47,
+  0x0000, 0x0000, 0x59ca, 0x1045, 0x230b, 0xaf26, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xf347, 0x0110, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xc8e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x6e4a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3425, 0x0000, 0x0000,
+  0x0000, 0xc7a7, 0x4f29, 0x3625, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0249, 0x1d46,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x5508, 0xf3c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x1f2b, 0x00a6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x9806, 0x0000, 0xdda6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x3fa8, 0x1687, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x7d44, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x7464, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x5d6c, 0x75e7, 0x0000, 0xe5a7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5026, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x2309, 0x0000, 0x0000, 0x0000, 0x00b7, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x090a, 0x4425, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5cc4,
+  0x0000, 0x0000, 0x1fcb, 0x12e7, 0x6d0a, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x7326, 0x0000, 0x0000, 0x40a8, 0x6827, 0x0000, 0xd207,
+  0x0000, 0x0000, 0x3688, 0x1f67, 0x4908, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x030e, 0x3e85, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x1872, 0xdde6, 0x4048, 0x30a7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ce4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x248b, 0x0000, 0x0000, 0x0000,
+  0x1c69, 0xa067, 0x60cc, 0xe1a6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0eec, 0x0a25,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7229, 0xeec6,
+  0x0000, 0x0000, 0x0000, 0xe447, 0x3d4b, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9146, 0x5788, 0x03c7,
+  0x0000, 0x0000, 0x0000, 0x5a26, 0x68ea, 0x0000, 0x0000, 0x0000,
+  0x4d29, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x1528, 0x3586, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xce06, 0x4faa, 0x96a7, 0x0000, 0x0000, 0x0000, 0xc787,
+  0x0000, 0x0000, 0x0088, 0x2144, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6bc4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0213, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x22e8, 0x13a7, 0x30e8, 0x4b86,
+  0x0000, 0x0000, 0x592b, 0x7627, 0x6daa, 0x79a4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x6b69, 0x46e4, 0x4e88, 0xe6c7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x5f45, 0x0000, 0x0000, 0x17ed, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x2545, 0x0000, 0x0000, 0x5fe9, 0x71a7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6364, 0x0000, 0x0000,
+  0x25ab, 0x0000, 0x0000, 0xf647, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9a86, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x508c, 0x2e27, 0x01f3, 0x0000,
+  0x1408, 0x08e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb4e6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x5bea, 0x9ce6, 0x0988, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b46, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x692a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6886, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xcac7, 0x0000, 0x0000, 0x5bec, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xc826, 0x6489, 0xadc6, 0x314e, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0c06, 0x0000, 0x2425, 0x0000, 0x0000,
+  0x0468, 0x5607, 0x0000, 0x0000, 0x0000, 0x5366, 0x0000, 0x4024,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe46,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5804, 0x0000, 0xbe86,
+  0x0000, 0x86c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x2645, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x35e5, 0x0000, 0x9587, 0x0000, 0x0000, 0x06ca, 0x0000,
+  0x01e9, 0xb507, 0x0000, 0xb146, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7166, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x184c, 0xdce6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6905, 0x0000, 0x7086, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xb386, 0x0000, 0x0000, 0x0000, 0x0000, 0x5049, 0xc307,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0bcb, 0x3046,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x67cb, 0x3407, 0x0000, 0x0000, 0x028d, 0x5b67,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x572c, 0x0000, 0x0000, 0x52c4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6ba4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6ce6, 0x53eb, 0x6c05,
+  0x0000, 0x7405, 0x00ed, 0x0000, 0x2988, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x83e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x7b4b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0588, 0x0987,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x258b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x15eb, 0x40c5, 0x67e9, 0x8a86, 0x0000, 0x0000,
+  0x0000, 0x6884, 0x0000, 0xe787, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6968, 0xe186,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x1eca, 0x0000, 0x0000, 0x0000, 0x4c48, 0x1945, 0x0000, 0x0000,
+  0x0489, 0x0000, 0x0000, 0x0000, 0x1e08, 0x51c7, 0x01a9, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x30e7,
+  0x0000, 0x3266, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x096b, 0x0000, 0x2dcd, 0x65e6,
+  0x0000, 0x0000, 0x4ee9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x2b25, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x7707, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5425,
+  0x0475, 0x52c6, 0x0000, 0x23e4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x00b8, 0x0445, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x12ea, 0x0000, 0x3568, 0x0000,
+  0x0000, 0x2fc6, 0x0000, 0x0000, 0x0000, 0x2924, 0x0000, 0x0000,
+  0x22e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x7144, 0x0000, 0x0000, 0x2dc8, 0x6966,
+  0x0000, 0xb466, 0x0000, 0xab87, 0x7c0a, 0x0000, 0x0488, 0x0f64,
+  0x0000, 0x5124, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5fe5,
+  0x0000, 0x7f46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x7c65, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0906, 0x2e0c, 0x0000, 0x0000, 0xa827,
+  0x0000, 0x0000, 0x0000, 0x49a5, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf886, 0x0000, 0x0000,
+  0x1b88, 0x43a6, 0x0000, 0x0000, 0x0000, 0x55c5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x040f, 0x1887,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2fa5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb586,
+  0x0000, 0x0000, 0x0018, 0x4d07, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x99a7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x5369, 0x0f06, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x8f47, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2c04, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x24a6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x74e6, 0x0000, 0x8346, 0x0000, 0x1264, 0x0b0c, 0x0000,
+  0x0000, 0x7367, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x74c5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0e4f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x2aa8, 0x1bc7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x24a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4fa4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90e6, 0x0000, 0x0000,
+  0x0000, 0x69e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x5569, 0x0000, 0x6c69, 0x7606, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xe227, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x3168, 0x1546, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x4d48, 0x42e4, 0x0000, 0xcb27, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x02f6, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6144,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x05c4, 0x0000, 0xfe07,
+  0x0000, 0x0000, 0x04b5, 0xb647, 0x0000, 0x7547, 0x2d69, 0x0446,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x274a, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f27, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x39c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x41a8, 0x0000,
+  0x0000, 0x02e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5484, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x3e48, 0x5aa7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x00f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x60a7, 0x0000, 0x0000,
+  0x0000, 0x1484, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x7509, 0x48e4, 0x526b, 0xb6c7, 0x0000, 0x1b85,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x646b, 0x0000, 0x0000, 0x4404,
+  0x0ef4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x16ab, 0x1605, 0x0000, 0x9507,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeac7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0355, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7607, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2225, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6ae6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x00ab, 0x0fe6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x5e09, 0x1cc6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0888, 0x1445,
+  0x0000, 0x51c4, 0x0609, 0x1384, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1e04, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x18a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x786a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6b47, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5488, 0xf747,
+  0x0000, 0x0000, 0x0ccb, 0x7987, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x2d24, 0x0000, 0x39a4, 0x0000, 0x0000,
+  0x0000, 0x3b04, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x5d6a, 0x7126, 0x0000, 0x0000, 0x0000, 0x1365, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x27e8, 0x1467, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6a06, 0x0000, 0x0000, 0x0495, 0x4ee6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdd26, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x1204, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2e2e, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4569, 0x1ee6,
+  0x0000, 0x0000, 0x7c88, 0x0000, 0x0000, 0x17a7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x230a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x41c8, 0x5d47, 0x0000, 0x0000,
+  0x2b2b, 0x0000, 0x0000, 0x0000, 0x7f28, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x516a, 0x3585, 0x0000, 0x0000,
+  0x0000, 0x9147, 0x1ccd, 0x28e7, 0x444a, 0x6304, 0x0000, 0x0000,
+  0x0000, 0x9666, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x5405, 0x17aa, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0c65, 0x0000, 0x0000, 0x0000, 0x2547,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4568, 0x31a4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90a6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x31cc, 0xbe67, 0x0000, 0x2dc6, 0x0000, 0x0000, 0x626a, 0x0000,
+  0x0000, 0x0000, 0x2349, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x13a4, 0x0000, 0x75a6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xa707, 0x0000, 0x0000, 0x0e88, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6266, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x154a, 0x1405,
+  0x0000, 0xe2e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c44,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x5624, 0x0000, 0x0000, 0x0000, 0x0000, 0x6689, 0x0000,
+  0x3e4b, 0x0d84, 0x0000, 0x0000, 0x0000, 0x8be6, 0x0000, 0x0000,
+  0x0000, 0x1e85, 0x4c2c, 0x7da7, 0x0000, 0x48a5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6fe4, 0x0000, 0x0000, 0x0000, 0xed47,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x73c4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x4344, 0x3e0d, 0x24c6, 0x25aa, 0x0000,
+  0x0000, 0x0000, 0x0251, 0x0000, 0x0000, 0x5ea4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x9de6, 0x0000, 0x6684, 0x0000, 0x5a45,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xfd86, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0f8b, 0xea67, 0x0000, 0x0000, 0x0000, 0x6e27, 0x0000, 0x0000,
+  0x0000, 0xa886, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x71e6, 0x0000, 0x7744, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x33c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x40a5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6604, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x5929, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0429, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x4a29, 0x12c5, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x4526, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0d8c, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x3487, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xde27, 0x0000, 0x0000,
+  0x06f0, 0x3da4, 0x0000, 0x0000, 0x0a2b, 0x0000, 0x2828, 0x7a86,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d48, 0x0e07,
+  0x0000, 0x0944, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x4e24, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x2f28, 0x0206, 0x0000, 0x0000, 0x07a8, 0x2327, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x1c0a, 0x80e7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0669, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x1a6c, 0x26a5, 0x01ea, 0x0fa5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x62aa, 0x15a5, 0x0000, 0x36e5, 0x0132, 0x5107, 0x0000, 0x0000,
+  0x24ce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x2ec9, 0x0104, 0x0000, 0x8967, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x47e5, 0x0000, 0x0000, 0x0000, 0x40c6,
+  0x0000, 0x0000, 0x0000, 0x57c6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0ae8, 0x0000, 0x0000, 0x0000, 0x36ca, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x3a0a, 0x0f45, 0x0000, 0x0000, 0x0000, 0xe147, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x3e6b, 0x0000, 0x0000, 0x0000,
+  0x0aea, 0x3b87, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x6904, 0x236e, 0x0000, 0x0000, 0x0000, 0x0000, 0xca86,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c2b, 0x9107,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b05,
+  0x286e, 0x2e86, 0x0000, 0x0000, 0x0000, 0x0000, 0x3aeb, 0x5a44,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x00a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x3baa, 0xa307, 0x0000, 0xddc6,
+  0x0000, 0x0000, 0x0b09, 0x0000, 0x36c9, 0x0185, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x53ea, 0x7ca6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4fe8, 0x02c6,
+  0x0000, 0x0000, 0x61c8, 0x5525, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7eab, 0x5304,
+  0x0000, 0x75c6, 0x0000, 0xa8a6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x2c8b, 0x0000, 0x0000, 0x0405, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x1aec, 0x2424, 0x0000, 0xf6e6, 0x0da8, 0x3846,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x5828, 0x0000, 0x0000, 0x5305, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9ac7, 0x0000, 0x0000,
+  0x27cd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7809, 0xea06,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0ce9, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x1dec, 0x6127, 0x0000, 0x0346, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x2eed, 0x33c4, 0x0000, 0x0227, 0x0000, 0x0000, 0x0000, 0xa8c7,
+  0x0000, 0x7767, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x6eea, 0x7804, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5889, 0x58c5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x72e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x3eca, 0x2306,
+  0x00f5, 0x05a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x6128, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x3344, 0x0000, 0x8ac7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x33cb, 0x2aa5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x6267, 0x0000, 0x0000, 0x0000, 0x3684, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd567, 0x4ca9, 0x2f26,
+  0x0c0b, 0x0000, 0x0000, 0x0000, 0x0000, 0x3864, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x5506, 0x0000, 0x3c67, 0x728a, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7526, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c65,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0a53, 0x0000, 0x0000, 0x52e7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x1012, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x87e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x3ee7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0129, 0x0e24, 0x0d0a, 0x2884, 0x0000, 0x3987, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x74e4, 0x57c9, 0x3647,
+  0x3ca9, 0x7ec7, 0x76aa, 0x34e4, 0x0000, 0x7087, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfc46, 0x47cc, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x96c6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x04d4, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x7fc6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x11ee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfda7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x4168, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x4e25, 0x0000, 0x0000, 0x3528, 0x04a7,
+  0x0000, 0x0000, 0x0000, 0xf2e7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x5fa4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x44eb, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x1504, 0x0000, 0x0000, 0x7e48, 0x0000, 0x0000, 0xf946,
+  0x0000, 0x0000, 0x0000, 0x0b67, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x428a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeb87,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x1e0a, 0x01e6, 0x0000, 0x0000, 0x0000, 0x9966, 0x0000, 0xbfc6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x310b, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x51e7, 0x4649, 0x3167, 0x0000, 0x0000,
+  0x0000, 0x3ea4, 0x7f68, 0x0000, 0x0000, 0x0000, 0x0000, 0x3fa6,
+  0x216b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8966, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x768a, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x39cd, 0x0e44, 0x0000, 0x0000,
+  0x204c, 0x3286, 0x0000, 0xd6a6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0a48, 0x84a7, 0x0000, 0x5a87, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x8da6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x7fac, 0x6926, 0x0000, 0x7fa4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d09, 0x2ea7,
+  0x04b6, 0x0000, 0x0000, 0x0000, 0x0000, 0x4684, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x4026, 0x0000, 0x0000, 0x0000, 0x6724,
+  0x0000, 0x0000, 0x7069, 0x0000, 0x0000, 0x6146, 0x0000, 0x0000,
+  0x0198, 0xb127, 0x0000, 0x8b87, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0e4a, 0x4426, 0x0000, 0x00a5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1807, 0x0000, 0x0000,
+  0x5f68, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x5e6a, 0x5ee5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x2e47, 0x0000, 0x9aa7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x254d, 0x0ae4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x03f2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x65c7, 0x7bec, 0x0000, 0x5ea9, 0x0724, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4384,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x4c08, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7ec4, 0x0000, 0x0000,
+  0x0000, 0x70c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x4528, 0xd087,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x45e4, 0x0792, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x3fea, 0x0000, 0x0000, 0x5465, 0x0000, 0x0000, 0x138b, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x58a5, 0x0000, 0x5746,
+  0x0000, 0x0000, 0x0000, 0xda26, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5945, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x19c8, 0x0107,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6104,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x9f07, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8466,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x32c8, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x7664, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x150a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6cc4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x454c, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6205, 0x7188, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x3188, 0x2cc6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0054, 0x1c87,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x69a4, 0x01c9, 0x0000, 0x598c, 0xe386,
+  0x4a48, 0x0000, 0x0a2e, 0xb287, 0x0000, 0x1425, 0x0000, 0x61c4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0811, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x7cca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8266,
+  0x0000, 0xbb06, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x61ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x6629, 0x8b46, 0x0000, 0xe2c7, 0x77cc, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6584, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x1168, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x1d88, 0x5067, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9286, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa746,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x06c5, 0x0000, 0x0000, 0x0000, 0x2004,
+  0x0000, 0x0000, 0x2be9, 0x0000, 0x776c, 0xeba6, 0x0000, 0x3aa5,
+  0x0000, 0x0000, 0x0000, 0x9ec6, 0x0000, 0x5d04, 0x0000, 0x2726,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x324a, 0x7927, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0648, 0x0000, 0x0000, 0x0000, 0x0000, 0x4784, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x69ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x1f08, 0x0566, 0x0000, 0x2e25, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x5fc5, 0x0000, 0x2d65, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x54c6, 0x0000, 0x0000, 0x332c, 0x2046, 0x0a54, 0x1f25,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0409, 0x3125, 0x0000, 0x6285,
+  0x0000, 0x0000, 0x0000, 0xa026, 0x3fad, 0xf607, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x04ef, 0x2466, 0x0000, 0x0000, 0x0000, 0x49a6,
+  0x0000, 0x0000, 0x06cd, 0x8467, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x6709, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7da5, 0x0000, 0xc7c7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72e4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x068a, 0x1086,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2906, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x15a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0833, 0xb066, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x374d, 0x0000, 0x694b, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x42c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x69aa, 0x1a46,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x6f8a, 0x0000, 0x0000, 0x1be6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x4228, 0x0000, 0x0000, 0x0000, 0x64e9, 0x0000, 0x112f, 0x1b44,
+  0x0000, 0xb486, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2986,
+  0x52ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x098e, 0xbda7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3445, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c28, 0x2f67,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x12a6, 0x024a, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5cc7,
+  0x2608, 0x11c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x63e9, 0x73a7, 0x186a, 0x0665, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x5608, 0x0000, 0x0000, 0x0000, 0x0000, 0x5724, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9226, 0x5dec, 0x0000,
+  0x0000, 0x0000, 0x388a, 0x7427, 0x0000, 0x1ba5, 0x0000, 0xb3a6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x7768, 0x9c67, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x1806, 0x0000, 0x1084, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6c27, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x5fe4, 0x5409, 0x0546, 0x0000, 0x0000,
+  0x0000, 0x8347, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x2e08, 0x0586, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x4744, 0x03ac, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x1c66, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x4145, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xbf27, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x5c6c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xd066, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x108c, 0x3fe6, 0x0000, 0x1146, 0x1a09, 0x7f84, 0x0000, 0x0000,
+  0x02e8, 0x46a4, 0x0000, 0x2b06, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x7344, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x1e06, 0x0000, 0x0000, 0x33e9, 0x1566, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x3248, 0x0000, 0x0000, 0x5e46, 0x03ed, 0x5984, 0x0000, 0x7ac5,
+  0x5b68, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x6f08, 0x0000, 0x0000, 0x0000, 0x646a, 0x69e5, 0x0000, 0x0000,
+  0x66e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6226,
+  0x0000, 0x0000, 0x0058, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x4288, 0x0000, 0x0000, 0x5527, 0x0000, 0x0000,
+  0x274c, 0x0000, 0x3008, 0x5584, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5129, 0x37e7,
+  0x0000, 0xe346, 0x7de8, 0x0000, 0x282a, 0x0000, 0x0849, 0x2d07,
+  0x0000, 0x0000, 0x0000, 0x3025, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x7084, 0x0928, 0x1fc5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x5568, 0xf4e7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0ad3, 0x0000, 0x0000, 0x5aa4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x1886, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x67e5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x5a68, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x7c48, 0x4e66, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f88, 0x0846,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x19aa, 0x0484, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x76c6, 0x0000, 0x0000,
+  0x0000, 0x6ee4, 0x0df4, 0x0000, 0x0000, 0x67e7, 0x308a, 0x14a6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1367, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x618a, 0x5e67, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x7049, 0x1246, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x05a4, 0x00ec, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4be4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x082c, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0b0b, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x4da9, 0x4b04, 0x0000, 0x2de5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4626,
+  0x0000, 0x45e6, 0x0000, 0x4926, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x23e6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5406,
+  0x13a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x5947, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x3906, 0x0000, 0x73a5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0269, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xb826, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0e2b, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x08b1, 0x39e7, 0x0000, 0x0000,
+  0x0a4d, 0x1826, 0x004e, 0x3ae6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x4f28, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8f87,
+  0x102c, 0xae07, 0x43c8, 0x6467, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x36c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d64,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1da4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0827, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x466c, 0x0000, 0x0000, 0x0000, 0x012c, 0x3784, 0x0000, 0x0000,
+  0x056a, 0x9d87, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x796a, 0x0000, 0x0000, 0x5766, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x8b86, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x67a4,
+  0x1e4c, 0x0000, 0x0000, 0x4a26, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x1928, 0x0487, 0x1c0c, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb2c6, 0x0000, 0xe1c6,
+  0x0000, 0x4164, 0x0000, 0x0000, 0x1a92, 0xec26, 0x0000, 0x0000,
+  0x0000, 0x6766, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xff66,
+  0x110a, 0x1e46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x2388, 0x1287, 0x014e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x9c26, 0x0000, 0x0000, 0x0000, 0x64e4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0bd3, 0x0000, 0x0000, 0x0000, 0x3dc8, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbcc7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x3f28, 0xa347, 0x0000, 0x0000, 0x5f8a, 0x2185, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x3004, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd4e7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x13e9, 0x7884, 0x48e8, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x4064, 0x0000, 0x0000, 0x6ac9, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x8c66, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x1104, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xdec6, 0x0000, 0x0000, 0x0589, 0xa0e7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x5b85, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x2728, 0x54e7, 0x0000, 0x0000, 0x278e, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x4a66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x5e29, 0x1266, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x112a, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x33c5, 0x0000, 0xdc47, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4ae6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xdaa6, 0x0000, 0x0000, 0x0000, 0xcb66, 0x0000, 0x3d04,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a64, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x548c, 0x0000, 0x0000, 0xcce7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x22c6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0c2c, 0x0000,
+  0x01d0, 0x87a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x61ab, 0x3087, 0x0000, 0x6a24, 0x0768, 0x1ca7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x8b66, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0d90, 0x0000, 0x0000, 0x0000, 0x0000, 0x5786, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb0c6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5284, 0x5c2a, 0x8167,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x412c, 0x5647,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x220a, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xda06,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x100d, 0x5ba4,
+  0x0000, 0x0000, 0x22aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0093, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x7508, 0xf7a6, 0x0516, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x60e6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2647,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7a65,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c65, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x1645, 0x0000, 0x0000, 0x0000, 0xf626,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5306,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x30c4,
+  0x0000, 0x0000, 0x0000, 0xbcc6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3da7,
+  0x0000, 0x0000, 0x04b2, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a86,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0c0e, 0xc027,
+  0x0000, 0x0000, 0x150b, 0x3b25, 0x0000, 0x0000, 0x0000, 0x0d25,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x4e6c, 0x36c5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0178, 0x9d06, 0x0000, 0x0000, 0x0000, 0xcb47, 0x0000, 0x6164,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0328, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x2684, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x5ca7, 0x0000, 0x53e4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x5128, 0x12c7, 0x0000, 0x0000, 0x0c69, 0x4126, 0x0000, 0x0000,
+  0x006e, 0x2a65, 0x0000, 0x0000, 0x0000, 0x43e6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa9c6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1d4c, 0x1366,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcb86,
+  0x0000, 0x5fc4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x67a7,
+  0x0000, 0x0000, 0x0000, 0xb4a7, 0x0000, 0x0000, 0x0000, 0x3cc5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x004c, 0xcc67, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x45ca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb6a6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x4ae5, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xac06, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0ba9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x37e6,
+  0x0000, 0x0000, 0x084d, 0xb307, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x266e, 0x0000, 0x33ab, 0x4c24, 0x0000, 0x0000,
+  0x0000, 0x7444, 0x0000, 0x0000, 0x0000, 0x0000, 0x02ae, 0x7565,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7845, 0x008b, 0x5165,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x01f6, 0x4865, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x4aa7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x7aa4, 0x0000, 0x0000, 0x0000, 0x4424, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc2c6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x640a, 0x0226, 0x0000, 0x0000,
+  0x0231, 0x0000, 0x716a, 0x0000, 0x0000, 0x0000, 0x0dc8, 0x0000,
+  0x0000, 0x0000, 0x06b3, 0x3945, 0x0012, 0xf7e7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x376a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x738a, 0xe686, 0x0000, 0x9a06,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x08ca, 0x40e4, 0x0000, 0x7c24,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x01ce, 0x4247,
+  0x0000, 0x7165, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ba6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x06e8, 0x0000, 0x1789, 0x4266, 0x070c, 0x0000, 0x0000, 0xd3a6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x372c, 0x0000, 0x180a, 0x7406, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x1e24, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbea7, 0x0000, 0x2064,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x4005, 0x172d, 0x0000, 0x3a09, 0xc867,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x8b27, 0x2389, 0x5a07, 0x0000, 0x0000,
+  0x5a48, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x01b6, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0097, 0x2426,
+  0x056e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd3c7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x182b, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x3327, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x268a, 0x0000,
+  0x0000, 0xe8e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x62c6, 0x0000, 0x0000, 0x5d28, 0x7d45,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x2427, 0x088b, 0x3ba6, 0x01b5, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c25,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x2de4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4206,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x56c4, 0x0749, 0x4487, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x55ec, 0x0000, 0x0000, 0x0000, 0x0000, 0xdaa7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x7d8a, 0x52a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x37a9, 0x0000, 0x0000, 0x0000, 0x0954, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x1aa7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6846,
+  0x0000, 0x0000, 0x17ab, 0xd107, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xc186, 0x180f, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x040c, 0x5de4, 0x0000, 0x09c5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x440b, 0xc847, 0x0d31, 0x3b26,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x138f, 0xf3a6,
+  0x0000, 0xde67, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f66, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03ae, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x6e67, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x3d06, 0x0000, 0x4d25, 0x0000, 0x0000, 0x064b, 0x0000,
+  0x56cb, 0xbdc7, 0x6229, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4444,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x02d1, 0x0000, 0x0000, 0x0000, 0x0000, 0x7f06,
+  0x0000, 0x0000, 0x0000, 0x4825, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x1708, 0x74e7, 0x0e49, 0x5a06, 0x0000, 0x0000,
+  0x0c8e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0070, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0be8, 0x01c7, 0x0000, 0x7924, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x5ae6, 0x0000, 0x7fa5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x94c6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x1324, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x63c5, 0x0000, 0x4964, 0x0000, 0x0000,
+  0x56e8, 0x0547, 0x0000, 0xf126, 0x11ac, 0x77a5, 0x0000, 0x3a27,
+  0x00f2, 0x7187, 0x0000, 0x0000, 0x3848, 0x1285, 0x0000, 0x0000,
+  0x0000, 0x91c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1faa, 0x0000,
+  0x7d6b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x05c9, 0x0000, 0x0000, 0x6de4,
+  0x0000, 0x64c6, 0x0000, 0xe987, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xe6c6, 0x0000, 0x0000, 0x0000, 0x5b46, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x78a7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x3f48, 0x0000, 0x0000, 0x0000, 0x014f, 0x0000,
+  0x0000, 0x0000, 0x02ca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x780a, 0x2506, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4966, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0297, 0x0000, 0x0000, 0x0000, 0x040a, 0x7ac7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x75a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x3665,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08e8, 0x3466,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x560c, 0x5c87,
+  0x0bc9, 0x2b27, 0x0000, 0x0000, 0x54ea, 0x48c6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7626, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x4369, 0x0000, 0x5588, 0xf927, 0x0000, 0x0000,
+  0x0000, 0x5266, 0x0000, 0x48e6, 0x0000, 0x6464, 0x0000, 0x5805,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18c5, 0x16a8, 0x2b67,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x3c27, 0x32aa, 0x1965, 0x0000, 0x0000,
+  0x0c6b, 0x6746, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x3d86, 0x0000, 0x3306, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x008e, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x5324, 0x2ba9, 0x1127, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x4c8b, 0x9ec7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x2e65, 0x0000, 0x0000, 0x0000, 0x6747, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x02b7, 0xbfe6, 0x6b4b, 0x2ec4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x26e9, 0x0000, 0x0000, 0x0000,
+  0x7bea, 0xf606, 0x0000, 0x0000, 0x0000, 0x0000, 0x3dc9, 0xcde6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6026, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x5046, 0x0000, 0x0000, 0x13aa, 0x0f66, 0x0000, 0x0000,
+  0x0000, 0xb367, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x09f4, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xb226, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0d4d, 0x3126, 0x3ccb, 0xd347, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x5e8a, 0x1705, 0x0000, 0x0000, 0x0000, 0xacc6,
+  0x0000, 0x0000, 0x0000, 0x15e5, 0x0000, 0xbaa6, 0x0000, 0x7de6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x1b66, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x4068, 0x0c67, 0x0000, 0x6a65, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x9fc6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x7d04, 0x7aca, 0x0000, 0x5f48, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x71ca, 0xe366,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x714a, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xd846, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9426, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x050a, 0x0000,
+  0x0000, 0x0000, 0x1269, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x514c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x070b, 0x03c6, 0x0000, 0x4524, 0x0000, 0x0000, 0x028e, 0x4aa5,
+  0x0000, 0xc9c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x28e6,
+  0x0630, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x09ca, 0x0000, 0x0000, 0x6247, 0x10cf, 0x0000, 0x0000, 0x0000,
+  0x018b, 0x3e07, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0548, 0x1987, 0x0000, 0x4cc4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1272, 0x1ee5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x75c8, 0x0000, 0x0000, 0xfce6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0869, 0x23a5,
+  0x0000, 0x0000, 0x0117, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa3a6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0530, 0x4286,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd387,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x06ef, 0xd507, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x7b88, 0x0000, 0x0000, 0x0000, 0x1bee, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0730, 0x8c67,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdc87, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbe6,
+  0x0000, 0x0000, 0x0000, 0xc7e6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x1026, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x42c4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x000c, 0x3f06, 0x4dab, 0x9c07, 0x2829, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xaea7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x372d, 0x0967, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x6929, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x56ac, 0x0000,
+  0x514a, 0x2745, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7224,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e0a, 0x0000,
+  0x3b68, 0x0000, 0x0000, 0x7f05, 0x1668, 0x4b47, 0x0dea, 0x2926,
+  0x0000, 0x0000, 0x0000, 0xe907, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x69cc, 0xec06, 0x0000, 0x0000, 0x6189, 0x0000, 0x0000, 0x0000,
+  0x0a4c, 0x0000, 0x0000, 0x0000, 0x0000, 0x66a5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x7784, 0x0e0a, 0x0000, 0x0000, 0x0000, 0x20aa, 0x38e5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2a29, 0x3026,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1712, 0xe926,
+  0x0000, 0x0000, 0x5a29, 0x0205, 0x0000, 0x3cc4, 0x0000, 0x0000,
+  0x0000, 0x2126, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4da5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1d49, 0x0000,
+  0x0000, 0x65e5, 0x0000, 0x0000, 0x5ce8, 0xf867, 0x19a8, 0x18a6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x2746, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x1b6a, 0x3886, 0x49aa, 0x0000, 0x1609, 0x29a4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ac6, 0x05eb, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x6c08, 0x0000, 0x0000, 0x2586, 0x0000, 0x9aa6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xd2a6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x00e8, 0x10e7, 0x3169, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x4ee7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x686a, 0x0000, 0x0000, 0x0000, 0x4bc8, 0x3967, 0x0000, 0x7a66,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c85, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x13c8, 0x2e84,
+  0x0000, 0x6ac5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xba87, 0x0000, 0x0000, 0x0000, 0x6826, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd967, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x1865, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x5b48, 0xf9a7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07b6, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2148, 0x5de5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x66a7,
+  0x0000, 0x0000, 0x0000, 0x5966, 0x0000, 0x0000, 0x0000, 0x6c86,
+  0x0000, 0x77e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x83a7, 0x0000, 0x0000,
+  0x0000, 0x76c5, 0x0000, 0x8726, 0x0000, 0xc767, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0774, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x05e7, 0x5589, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc8c6, 0x0000, 0x6126,
+  0x0000, 0x7f87, 0x0000, 0x0000, 0x0000, 0x88c7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2bc4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x1e4e, 0xe287, 0x0000, 0x0000,
+  0x0000, 0x78e5, 0x0000, 0x0000, 0x0016, 0x3b24, 0x23ca, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x63c4, 0x4ea8, 0x1bc4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x402b, 0x2a25, 0x264d, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1248, 0x0000,
+  0x0000, 0xcdc7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3a24,
+  0x0000, 0x0000, 0x0000, 0x41a4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x256a, 0x14a7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x8506, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x4a84, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x1dcb, 0xd9a7, 0x0000, 0x9a27, 0x386e, 0xe406, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x5ba9, 0x3de5, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x9686, 0x0000, 0x0000, 0x0000, 0x45e5, 0x2aaa, 0x0000,
+  0x1c08, 0x02a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0c29, 0xb4c7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x5b26, 0x0000, 0x0000, 0x46a8, 0x5ae4,
+  0x0000, 0xf386, 0x0000, 0x0000, 0x0000, 0x40e5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9526,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x62cc, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x2868, 0x0047, 0x192e, 0x0000, 0x0000, 0x0765, 0x0000, 0x0000,
+  0x0452, 0x0000, 0x7008, 0x7824, 0x0000, 0xa0a6, 0x0000, 0x0000,
+  0x05d4, 0x0000, 0x3bed, 0x0000, 0x0000, 0x0000, 0x0000, 0x44a7,
+  0x0000, 0x52e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x61e4,
+  0x0828, 0x5544, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0166,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4144, 0x0000, 0x0000,
+  0x0000, 0x0684, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2fe4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0fee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x31a9, 0x1847,
+  0x0000, 0x0000, 0x4f69, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x79e4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0e94, 0x0000, 0x066e, 0x0000, 0x0000, 0x6b44, 0x0000, 0x8666,
+  0x42e8, 0x3805, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4c47,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x17e8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2167,
+  0x542a, 0x27e4, 0x0bcc, 0x0b87, 0x0000, 0x44e6, 0x0000, 0x0000,
+  0x1b49, 0xafc7, 0x08aa, 0x2005, 0x0000, 0x0000, 0x7708, 0xf786,
+  0x0000, 0x6824, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x04f1, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a32, 0x0000,
+  0x0000, 0x0000, 0x2c0e, 0x4f47, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x4d44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0931, 0x2a64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x152d, 0x5ee4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8667,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c48, 0x5126,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x3048, 0x2a05, 0x0000, 0x0000, 0x0000, 0x8166, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x7385, 0x0000, 0x0927, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xf667, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xa807, 0x0000, 0x3ea6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x05c8, 0x63e5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2287,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6045,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x13c7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xb306, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0337, 0x0000,
+  0x0000, 0xfa27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3bc4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0b6c, 0xb6a7,
+  0x1a68, 0x4b44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x8586, 0x0000, 0x0000, 0x0f89, 0x46e5,
+  0x0000, 0x0000, 0x0000, 0x7dc7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5be4, 0x658a, 0x0000,
+  0x0000, 0x2867, 0x0000, 0x0000, 0x0000, 0x2605, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1284,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x4165, 0x0000, 0x0000, 0x1212, 0x5b47, 0x0000, 0x0000,
+  0x7aa8, 0x0000, 0x0000, 0x0de5, 0x0000, 0x0000, 0x108a, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f46, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x3785, 0x0000, 0xdf67, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x00f0, 0x0000, 0x0000, 0x0000, 0x0000, 0xff26, 0x7488, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x7525, 0x0000, 0x7c66, 0x0000, 0x0000, 0x1fea, 0x0000,
+  0x0000, 0x1145, 0x6bea, 0x78a4, 0x0000, 0x0000, 0x4eec, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xae46, 0x0216, 0x5184, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x7026, 0x0000, 0x2825, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x7347, 0x0000, 0x4d65, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x698c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xcf66, 0x0000, 0x8987, 0x0000, 0x0000, 0x0000, 0x92a6,
+  0x0000, 0xf146, 0x2188, 0x1f65, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x30c8, 0x58e5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d06, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e05,
+  0x0000, 0x0000, 0x0000, 0xf9c7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ca6,
+  0x0000, 0x0000, 0x0000, 0x4a44, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2184,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4665,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0050, 0x04e6, 0x0000, 0x0000, 0x0000, 0xa686, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f86, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x084c, 0x6387,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x41e9, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0c46, 0x0000, 0x0000, 0x480b, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0f4d, 0x0000, 0x2289, 0x04a6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x50a5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x2444, 0x0000, 0x0000, 0x5f4a, 0xa187, 0x0000, 0x0000,
+  0x0000, 0xa467, 0x0000, 0xf466, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1a48, 0x1067,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x63ab, 0x0000, 0x04cf, 0x0000,
+  0x0176, 0x3d07, 0x0000, 0x7504, 0x0000, 0x3726, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x4a67, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x7be6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x51a4,
+  0x0000, 0x4167, 0x0000, 0x0000, 0x0000, 0x70e6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0a12, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x360e, 0x0000, 0x0000, 0x2744,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x1d08, 0xab07, 0x42c9, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0369, 0x0000, 0x0000, 0x0000,
+  0x018e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x210b, 0x5c07, 0x0000, 0xcf26, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ba6, 0x0000, 0x0fe7,
+  0x0000, 0x0000, 0x0000, 0x9706, 0x0000, 0xa1c6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x2d88, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0fab, 0xa6c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x6309, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x6a29, 0x5764, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7904,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xb4c6, 0x0f88, 0x31a7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5025,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0fe8, 0x2b46, 0x0000, 0x0000,
+  0x40a9, 0x0965, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0a6e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x80e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xb7c6, 0x0000, 0x7745, 0x0000, 0x0000, 0x2b2a, 0x2606,
+  0x3349, 0x0000, 0x0000, 0x0000, 0x0000, 0x5bc6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xe3c6, 0x0000, 0x0000, 0x0000, 0xe0c7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x01c6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x142b, 0xe927, 0x08ac, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7346, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x43a4, 0x0000, 0x4e65, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x14c7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a26,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x59a5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b08, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x51c5, 0x0000, 0x0000,
+  0x178a, 0x2226, 0x0000, 0x0000, 0x0000, 0x43e4, 0x0000, 0x3347,
+  0x0aed, 0x0000, 0x0000, 0x75a4, 0x0000, 0x0000, 0x174b, 0x1f44,
+  0x0000, 0xdf26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa766,
+  0x39c8, 0x7827, 0x0000, 0x6184, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4225, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x3b48, 0x9f87, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0314, 0x7685, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x522c, 0x5e26, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x75ab, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x5845, 0x7b2b, 0x68a5, 0x0000, 0xe8a7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2488, 0x74a7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x5fe7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x5024, 0x0000, 0x0000, 0x0000, 0x9a26, 0x0e51, 0x0000,
+  0x6e69, 0x0000, 0x224a, 0xfb06, 0x0000, 0xe046, 0x23ac, 0x0000,
+  0x0000, 0x4764, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x66e8, 0x7805, 0x020c, 0x4d27,
+  0x0000, 0x35e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x46eb, 0x0000, 0x3229, 0x0000,
+  0x004a, 0x61a6, 0x350b, 0x0425, 0x0000, 0xfac7, 0x0000, 0x0000,
+  0x2248, 0x0000, 0x0000, 0xeb47, 0x0000, 0x6344, 0x0000, 0x0000,
+  0x0000, 0xe707, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x3808, 0x05e6, 0x0000, 0x0000, 0x0000, 0x95e6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3429, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x24e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x7f65, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d84,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x3a0b, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x1a06, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x374a, 0x0000, 0x744a, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x4088, 0x0886, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x8d06, 0x0d0c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6265, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x3d68, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x58e6, 0x0000, 0x0000, 0x0130, 0x0000,
+  0x0cab, 0x3725, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x140a, 0x3187, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x54e5, 0x28c9, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8d07,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c26, 0x0000, 0xe087,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x2a48, 0x47c4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x8906, 0x3d6a, 0x32a7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x8727, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xd187, 0x0000, 0x96e6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x7929, 0x2c45, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x4ac8, 0x0000, 0x2529, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xdd87, 0x5dea, 0x0000, 0x04ad, 0x0000,
+  0x0000, 0xe486, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x2026, 0x17e9, 0x48c4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x62ca, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x05ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x382a, 0x2646, 0x7e6b, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x2569, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x68a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x014a, 0x2925, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa506,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x13d2, 0x5224,
+  0x0000, 0x94e7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x00f8, 0x0000, 0x79c8, 0xf266, 0x0000, 0xd027, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x010f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x2408, 0x0845, 0x0000, 0x0000, 0x0000, 0x0000, 0x3dca, 0x15e7,
+  0x0000, 0xcd66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x4748, 0x5dc5, 0x59ea, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x01ab, 0x0000, 0x0000, 0x9be6, 0x0000, 0x0000,
+  0x1ba8, 0x2c87, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x56cc, 0xe226, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3364, 0x0000, 0x0585,
+  0x03ef, 0x0000, 0x0000, 0x0000, 0x0000, 0x53a7, 0x0000, 0x5427,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xa2e6, 0x580a, 0x2565, 0x0000, 0x0000, 0x0000, 0x2266,
+  0x0000, 0x0000, 0x1b08, 0xdc27, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa4e7,
+  0x0000, 0x0000, 0x358c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4045, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x062e, 0x06e4, 0x0cd2, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d85, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x2f6b, 0x0000, 0x732a, 0x7964, 0x0689, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9d46, 0x0000, 0x0000,
+  0x0000, 0x8446, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5204,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1207, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xaba7, 0x014d, 0x4ba7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x68c5, 0x0000, 0x7e85, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x1348, 0x2da7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2a85,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6546, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x3deb, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20a8, 0x0000,
+  0x42ea, 0x1f06, 0x0000, 0x2cc4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x46e6, 0x37a8, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x5726, 0x0000, 0x0000, 0x0000, 0xa706, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72aa, 0x15c6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7985, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2be4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x23c4, 0x0000, 0x0000, 0x0709, 0x36c7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3c6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c44, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x792a, 0xffe6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x6646, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x6c45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xb766, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7984,
+  0x0000, 0x2c66, 0x0000, 0x0000, 0x0000, 0x0e85, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x2168, 0x17a6, 0x0d0b, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xc9a6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0e86, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6ec6, 0x0000, 0x0ac4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x05b6, 0x0000, 0x0000, 0x6be6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xf426, 0x384a, 0xdda7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x2fae, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x8ec6, 0x0000, 0x94a6, 0x0000, 0x0000, 0x0000, 0x52e5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x69c5,
+  0x0000, 0x0000, 0x420a, 0x0000, 0x312b, 0x2f45, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x28ae, 0x7067, 0x5509, 0xeb07,
+  0x0000, 0xdd46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5104,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x172b, 0x14e7,
+  0x0000, 0xffc6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x1f29, 0xcda7, 0x0000, 0x1304, 0x0000, 0x0000, 0x0000, 0xd8a7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7dc5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x3485, 0x0000, 0x0000, 0x0000, 0x6807,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2be5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x00d1, 0x0505, 0x0000, 0x0000, 0x0788, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xa946, 0x5d29, 0x5a84, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6088, 0xf3e7,
+  0x226b, 0x0d87, 0x4fe9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x3e88, 0xdbc7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xebc6, 0x58e9, 0x19a5, 0x0000, 0x0000, 0x78a8, 0x6c26,
+  0x0000, 0x0000, 0x0000, 0x42c5, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x5669, 0x0000, 0x0000, 0x0000, 0x1da9, 0x3766, 0x0000, 0x6dc7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb046, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x7c64, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x4844, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e2a, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x66c4,
+  0x0000, 0x7365, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7384, 0x0000, 0x0000,
+  0x0000, 0x5325, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeda7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x76c7, 0x3e4d, 0x0ba5,
+  0x0000, 0x0000, 0x0000, 0xb567, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x5d67, 0x6789, 0x6286, 0x320b, 0x1707, 0x0000, 0x18c7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x7c47, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x4ce8, 0x2805, 0x0000, 0x0000,
+  0x0000, 0x7a45, 0x6969, 0x7124, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x6a48, 0x79c4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x00d8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x3fa4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2227,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1926, 0x0000, 0x0000,
+  0x0000, 0x8227, 0x0000, 0x0000, 0x0000, 0x8206, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x56a5,
+  0x1d4b, 0x60c6, 0x0000, 0x2a04, 0x0000, 0xaee7, 0x02d4, 0x0000,
+  0x64a8, 0x6445, 0x6129, 0x14e5, 0x62a9, 0x0000, 0x0000, 0xd526,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0147, 0x01b7, 0x0165, 0x0000, 0x0000,
+  0x1988, 0x2104, 0x0000, 0x0000, 0x070a, 0x0000, 0x0000, 0xefa6,
+  0x0000, 0x3ac5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x95c7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x7eeb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5965,
+  0x0000, 0x0000, 0x7d49, 0x0000, 0x0000, 0x0000, 0x254a, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c64,
+  0x0000, 0x0000, 0x5a88, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6007,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8546, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x086e, 0x0000, 0x15d2, 0x7684, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x5f84, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0969, 0x1126, 0x0000, 0x5e84, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x7e08, 0x6944, 0x506b, 0x0000, 0x0000, 0x0000,
+  0x086b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x10e8, 0x66a4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c0c, 0x0000,
+  0x30aa, 0x2c67, 0x0000, 0x0000, 0x624a, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xff86, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x80c6, 0x0000, 0x0000, 0x0000, 0x8766, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x9946, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x2c88, 0x27e6, 0x010a, 0x30a4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b45,
+  0x0000, 0x0000, 0x0000, 0x3564, 0x0000, 0x33a6, 0x0000, 0x5b44,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2ea5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x63e7,
+  0x0000, 0x0000, 0x0000, 0xe027, 0x0000, 0x0000, 0x0000, 0x2844,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0b31, 0x2447, 0x004b, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x5404, 0x576c, 0xe886, 0x0000, 0x0000, 0x0000, 0x5c25,
+  0x0000, 0x0000, 0x0000, 0xc986, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1225,
+  0x0f8c, 0x6e87, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3064,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x54e6, 0x0000, 0x44c7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa327, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4804, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x55c6, 0x0000, 0x4be6,
+  0x0000, 0x0000, 0x04b4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0ca8, 0xd7c7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x77c4, 0x0000, 0x0000, 0x0000, 0x70e5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x126c, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x2dea, 0x0000, 0x0000, 0x0000, 0x0000, 0x5646, 0x0000, 0x5824,
+  0x222d, 0x0000, 0x0000, 0x6ee7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0b46,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7186,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9da6,
+  0x0000, 0x0000, 0x3e2c, 0x9a66, 0x0000, 0x35a7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x710a, 0x0000, 0x0197, 0x0fa6, 0x0000, 0x0000,
+  0x0000, 0x6924, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b86,
+  0x7648, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x600a, 0x0000, 0x6049, 0x1406, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x21ec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x59eb, 0x0000, 0x5769, 0x48a7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6bc9, 0x2607,
+  0x0000, 0x4ee4, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e08, 0xbd27,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7aa7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3644, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x44c6, 0x0000, 0x0000, 0x3b8a, 0x7447,
+  0x670a, 0x4525, 0x0000, 0x0000, 0x3888, 0x0000, 0x12e8, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6084, 0x0000, 0x2485,
+  0x10ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x3f09, 0x0000, 0x0000, 0x8826, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x61e7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x19cb, 0x3127,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x1d09, 0x7204, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7a26,
+  0x0000, 0x0000, 0x5988, 0x0c47, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x5ba5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x026a, 0x0000, 0x0000, 0x0000, 0x0000, 0x5385,
+  0x0000, 0x2d04, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x520c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0138, 0x5ac7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0909, 0x0000,
+  0x0000, 0x9ea6, 0x0000, 0x0000, 0x39e9, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xb5c7, 0x0000, 0xa0e6, 0x1ead, 0x0000,
+  0x7ba8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0d69, 0x1487, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x84a6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0048, 0x3c85, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x8ce6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x3984, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7484,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4986,
+  0x4e28, 0x0000, 0x0000, 0x0000, 0x0000, 0x0986, 0x0b88, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0d0e, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x5f64, 0x0000, 0x4dc4, 0x0000, 0x0000,
+  0x0000, 0x1fa5, 0x0000, 0x4447, 0x0000, 0x0000, 0x0dca, 0x0000,
+  0x200a, 0x7287, 0x0000, 0x0000, 0x046c, 0x1a85, 0x0000, 0x0000,
+  0x5d49, 0x0000, 0x0000, 0x0000, 0x12ca, 0x0000, 0x0000, 0xb746,
+  0x0000, 0x0000, 0x0000, 0xa266, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbdc6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x99a6, 0x0000, 0x0000, 0x0000, 0x6605,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x13ec, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x5bc8, 0x6ca5, 0x0fcd, 0xd686,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1949, 0x1d04,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x1a88, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0de8, 0x7d67, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd606,
+  0x0000, 0x0000, 0x1b0e, 0x0000, 0x0000, 0x0000, 0x0000, 0x4086,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5146, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0731, 0x0c66, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x258c, 0x47c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x7fe8, 0x0000,
+  0x0000, 0x25c7, 0x0000, 0xe9e7, 0x0000, 0x5b04, 0x1f89, 0x0000,
+  0x0000, 0x39a6, 0x0000, 0x0000, 0x0000, 0x2866, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x60e8, 0x39a7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x158b, 0x0000, 0x0000, 0x3a04,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0932, 0x5ae7, 0x0000, 0x7fe4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x4828, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x81a6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x230c, 0x54a5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x63e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x13e8, 0x0000,
+  0x37cb, 0xd847, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x3164, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x122b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0295, 0x0000, 0x0000, 0x3546, 0x4c0a, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x7a29, 0x0000, 0x1f4a, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0c8b, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7c6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b85, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x4a4a, 0x0985, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x37e8, 0x0000, 0x0000, 0x0000, 0x0000, 0x41c4, 0x0000, 0x0000,
+  0x01d7, 0x8c87, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1787, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d49, 0x25a7,
+  0x0000, 0x0000, 0x0000, 0xd9e7, 0x0000, 0x1644, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d04,
+  0x0000, 0x67e6, 0x0000, 0x0000, 0x1a0b, 0x1946, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf446, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x408a, 0x6d07, 0x0000, 0x0000, 0x2729, 0x1c04,
+  0x0000, 0x0000, 0x030b, 0x0000, 0x0168, 0x4445, 0x0000, 0x0000,
+  0x0000, 0xf227, 0x1e48, 0x1e25, 0x05d6, 0x0000, 0x0000, 0x0000,
+  0x67c9, 0x9f26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x6726, 0x28ea, 0x7dc4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xc587, 0x4089, 0x2dc4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xd906, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1e6, 0x0000, 0x6744,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x116b, 0x2966, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x2407, 0x0000, 0x7286, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xec07, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xb7e6, 0x0000, 0xc446, 0x0000, 0x3144, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf167, 0x0000, 0xd6e7,
+  0x0000, 0x5244, 0x1c8d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x2ec8, 0x0000, 0x0000, 0x0000, 0x0000, 0x5be7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x286b, 0x3e46, 0x0000, 0x84e7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x1369, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7145, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x8e66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0d8a, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x4d04, 0x70c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x5688, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x66e6,
+  0x0000, 0x0000, 0x0000, 0x2624, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x5526, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x000d, 0x1ac5, 0x7d88, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x02ee, 0x0000, 0x0000, 0xd4e6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb467,
+  0x0000, 0x0000, 0x0271, 0x5946, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x080d, 0x5c24, 0x0000, 0x0000, 0x2b29, 0xdbc6, 0x0000, 0x0000,
+  0x486a, 0x05e5, 0x0000, 0x0000, 0x436a, 0x1165, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x308d, 0x0000, 0x0000, 0x0000, 0x0000, 0x1fa6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1f8a, 0x0000,
+  0x5d2c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x3f08, 0x0d64, 0x0000, 0x6ce4,
+  0x0000, 0x0000, 0x0000, 0x1ca4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x70e4, 0x0000, 0x0000, 0x08ec, 0x0000, 0x0000, 0x44a5,
+  0x00c9, 0x05e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x7a85, 0x6c28, 0x5825, 0x0000, 0x0000,
+  0x0000, 0x1427, 0x0000, 0x0000, 0x0000, 0x0000, 0x11e8, 0xa667,
+  0x0000, 0x0000, 0x0000, 0xad86, 0x042c, 0x5a85, 0x0000, 0x0000,
+  0x0000, 0x0265, 0x0000, 0x0000, 0x0000, 0x3165, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x69c4, 0x1a4c, 0x0000, 0x0000, 0x0000,
+  0x0f49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x56e4, 0x7528, 0x3e27, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x59c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xc5a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x1429, 0x0626, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x4aa4, 0x0000, 0x0000, 0x0000, 0x88c6,
+  0x0000, 0x0000, 0x0000, 0x6564, 0x718b, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb7e7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x054c, 0xf1e7, 0x0000, 0x0000, 0x0000, 0xfbc7,
+  0x084a, 0xfae7, 0x0000, 0x0000, 0x494b, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x038b, 0x86a7,
+  0x0000, 0x0000, 0x0000, 0x98a6, 0x0000, 0x0000, 0x07cb, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xdcc6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0336, 0x0000,
+  0x3e6a, 0xad87, 0x0000, 0x0000, 0x0c28, 0x0145, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x3c25, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x04a9, 0x10c6,
+  0x1368, 0x3cc7, 0x0000, 0xb446, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x49e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x26c8, 0x92a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x3329, 0x9087,
+  0x0000, 0x0000, 0x0000, 0x3c46, 0x0000, 0x0000, 0x20e8, 0x73c7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6486, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x9e27, 0x0000, 0x33e4, 0x0000, 0x2b85,
+  0x0000, 0x0000, 0x0000, 0x7e84, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x14b2, 0xe166, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x3304, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x2029, 0xa526, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8e46,
+  0x0000, 0x0000, 0x0000, 0x1f24, 0x0000, 0x0000, 0x0000, 0x4805,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x1cee, 0x0000, 0x0000, 0x0000,
+  0x2409, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x3629, 0xb9e7, 0x472c, 0xd1c7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0aec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x616c, 0x4347, 0x0000, 0x0000, 0x0000, 0x33a5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x3de8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x17ea, 0x06c7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x4248, 0x46e7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xb986, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x65e9, 0x4c26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c86,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x7089, 0x0000, 0x0000, 0x0000, 0x0000, 0xa6e7,
+  0x0000, 0xd786, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5005, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xe4e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b44,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x89e6, 0x0000, 0xbc07, 0x51ec, 0x8146, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x2625, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9a87, 0x0000, 0x0000,
+  0x35a8, 0x1b26, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c6a, 0x22c7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5886,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe606, 0x1d2c, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfc26,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xba06, 0x0000, 0x0000,
+  0x0000, 0xc6c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe106,
+  0x0390, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x05a9, 0x0000, 0x0491, 0x0000, 0x02ce, 0xb447,
+  0x2f48, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbc66,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x04eb, 0x0000, 0x0000, 0x83c6, 0x5aa8, 0xf467,
+  0x0000, 0xfe86, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x700c, 0xe9e6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x64a9, 0x0000, 0x0000, 0x0000, 0x0000, 0xffc7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x022b, 0x5905, 0x0000, 0x4d24, 0x06e9, 0x2806,
+  0x21e8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x37aa, 0x0000, 0x170b, 0x0ce7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5269, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5486, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x2a2b, 0x0000, 0x0000, 0x0000,
+  0x3f4c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x696a, 0x09a5,
+  0x0000, 0x3944, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb187,
+  0x2fca, 0x0da6, 0x11cb, 0x2946, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0af1, 0x0000, 0x0000, 0x0000, 0x3d8b, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9ae6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1a6b, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x8326, 0x0000, 0x2827, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xf827, 0x0000, 0x0000, 0x0f48, 0x0000,
+  0x0000, 0x1d44, 0x0000, 0x0000, 0x0000, 0x8946, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x44a8, 0x1fa7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4149, 0x1066,
+  0x0000, 0x0000, 0x12ae, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x3f64, 0x0000, 0x0000, 0x0000, 0x0000, 0x6569, 0x4ec6,
+  0x0000, 0x0000, 0x0000, 0x2ae4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x3804, 0x49ea, 0x38e7, 0x0000, 0xaca7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x47e6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x92e6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x51a6, 0x0000, 0x0000,
+  0x0000, 0xdc26, 0x0000, 0x95c6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x252a, 0x8ce7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x54c4, 0x0000, 0x0000, 0x1492, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x046e, 0x0000, 0x05ad, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0f2a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0fa4, 0x0000, 0x0000, 0x0000, 0xcac6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a24, 0x1228, 0x0000,
+  0x0000, 0x0000, 0x794b, 0x6307, 0x0000, 0x0000, 0x0000, 0x5964,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf9e7, 0x0000, 0x0000,
+  0x0948, 0x4265, 0x0000, 0x0000, 0x0830, 0x0000, 0x0000, 0x0000,
+  0x0d2d, 0x1b86, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x7806, 0x0000, 0x0000, 0x0000, 0x0000, 0x0014, 0x0000,
+  0x358b, 0x0266, 0x0000, 0x0000, 0x3228, 0x0c07, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xc766, 0x0e91, 0x0000, 0x7fa8, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x5dc8, 0xf527, 0x0000, 0x0000,
+  0x1289, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x096e, 0x0000,
+  0x0000, 0xace6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x6169, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x4ac4, 0x0000, 0x3507, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x98c6, 0x0000, 0x0000, 0x0000, 0x6d84,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x10a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x1768, 0x0000,
+  0x0108, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x35ab, 0x0000, 0x55a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1088, 0x3b06,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x7546, 0x0000, 0x0000, 0x6d49, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x60c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0b92, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x67c4,
+  0x57a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3548, 0x2bc5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b69, 0x0766,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x24ad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x3727, 0x1468, 0x0087, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x64c4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x1d2e, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xf947, 0x0000, 0xd966, 0x0000, 0x0000, 0x3128, 0x0000,
+  0x05f4, 0x81c7, 0x0000, 0x0000, 0x0000, 0x26a7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x2d68, 0x0000, 0x0000, 0x0000,
+  0x15ee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x5348, 0x0000, 0x0000, 0xd167, 0x0000, 0xc806, 0x0000, 0x0000,
+  0x0000, 0x6507, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2304, 0x06cc, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x34a4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x1f27, 0x0000, 0x0000, 0x0cea, 0x1fc6,
+  0x0000, 0x20c5, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x64a6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbc6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x53e5, 0x7988, 0x7ba4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f24, 0x0000, 0x0000,
+  0x0000, 0xacc7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x60e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x308c, 0x1947, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x020d, 0x4606, 0x0000, 0x0000, 0x0000, 0x6927,
+  0x0000, 0x0000, 0x46c8, 0x0000, 0x0000, 0x0000, 0x7548, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x7205, 0x0000, 0x0000, 0x0000, 0xaa27, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x4d4b, 0x1d85, 0x0000, 0xe7c6,
+  0x0000, 0x0000, 0x27c8, 0x17c5, 0x0000, 0xac07, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2ba7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x76e8, 0xf686, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x2b09, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6a44, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x71c6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x026e, 0x0000,
+  0x146a, 0x0aa7, 0x0000, 0x3ce4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x122a, 0x0000, 0x0a73, 0x0000, 0x0000, 0x7ea4,
+  0x0000, 0x0000, 0x0000, 0xf047, 0x0000, 0x0000, 0x152b, 0x45a5,
+  0x084b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9527,
+  0x0a50, 0x0000, 0x2c0a, 0x38c5, 0x0732, 0x0000, 0x0000, 0xa6a7,
+  0x3189, 0x0d66, 0x0000, 0x2e45, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1985, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xd546, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x3148, 0x9687, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7de5,
+  0x0000, 0x0000, 0x0000, 0xd407, 0x0000, 0xbde6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x7aa9, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x8606, 0x0000, 0x0000, 0x0000, 0x5904, 0x0000, 0xcba6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b06,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x9ee6, 0x0000, 0x0000, 0x0000, 0xc907,
+  0x0217, 0x0000, 0x0000, 0x0000, 0x0000, 0x3ca5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x1328, 0x0365, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xf8e6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x068e, 0x0000, 0x02b4, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x6668, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72ab, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6207, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x10ef, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x38ca, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x6a89, 0xd6e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a87,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7704, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x470a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x3809, 0x0000, 0x0000, 0x0000, 0x0868, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xe446, 0x522a, 0x0000, 0x5b2b, 0x5346,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x53a4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3245,
+  0x0000, 0x0000, 0x130b, 0x0000, 0x0000, 0x0000, 0x0000, 0x7207,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0668, 0x2807,
+  0x0000, 0x37a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x268b, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x304b, 0x0000, 0x0000, 0x1de5,
+  0x0000, 0x0000, 0x1048, 0x0a67, 0x0000, 0x11e4, 0x0000, 0x2b87,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x77c6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1a44, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x35c4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x00ea, 0x1aa5, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6427, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7506, 0x0000, 0x0d85,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x6ea4, 0x496b, 0x1b65, 0x31ca, 0x2d87, 0x0000, 0x91a7,
+  0x0000, 0x0000, 0x2ac9, 0x1e26, 0x25e9, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb5c6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x1fc9, 0x4644, 0x0000, 0x6244, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1c7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x3da8, 0x1b06, 0x0000, 0x0000, 0x0000, 0x0000, 0x1b6b, 0x2aa7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x104b, 0xd8c7, 0x134c, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x57a8, 0x4b85,
+  0x0000, 0x0000, 0x6de8, 0x0000, 0x1869, 0x5345, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xd0a6, 0x0000, 0x0000, 0x0000, 0xdfe6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x9987, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4de4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x63c7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0a8a, 0x0f47, 0x0000, 0x0000,
+  0x0000, 0x68a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x7ea8, 0x0000, 0x0000, 0x4826, 0x0000, 0x0000, 0x0000, 0x3986,
+  0x748a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x03e8, 0x1065, 0x0000, 0x0000,
+  0x0000, 0x4ba6, 0x0000, 0x0000, 0x0000, 0x9bc6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0889, 0x22c5, 0x14a8, 0x2665, 0x61a8, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0426, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x8b26, 0x0000, 0x0000, 0x5a08, 0xf427, 0x196a, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3529, 0x28c6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x1e2b, 0xa487, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x3405, 0x0000, 0x0000, 0x0000, 0xa286, 0x0000, 0x69e7,
+  0x0000, 0x0000, 0x52ca, 0x2cc5, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x68e8, 0xe3e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x51cc, 0xbe46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x146b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x274d, 0x7a44,
+  0x0000, 0x0000, 0x0000, 0x4b24, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x7645, 0x3648, 0x0000, 0x0000, 0x0000, 0x324c, 0x3367,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x01ac, 0xb767, 0x334e, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x3c66, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x54a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08c9, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xafa7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0d89, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x6124, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d65,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x088e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x3f24, 0x0000, 0x28c5, 0x0000, 0x0000,
+  0x148f, 0x4e86, 0x51ca, 0x0000, 0x0000, 0x0000, 0x04a8, 0x0406,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x5389, 0x1306, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x48a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x058e, 0x0fc6,
+  0x0b2a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xbf66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x196c, 0x91e6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x4269, 0x9a07, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x75e6, 0x0000, 0x53c5, 0x1ceb, 0x6e04,
+  0x0000, 0xca26, 0x0000, 0x0000, 0x0000, 0xf4a7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x79e6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x1e47, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x34a5, 0x0000, 0x0000, 0x01c8, 0x6845,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x3a2a, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x6849, 0x5606, 0x33a9, 0x6ae4, 0x0000, 0x0000,
+  0x0000, 0x49c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0e4b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x05a8, 0x1525,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x18c4, 0x0000, 0x0000, 0x46ab, 0x4925,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5666, 0x0000, 0x0000,
+  0x0000, 0x4a25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x7227, 0x0e8c, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xaa06, 0x0000, 0x0000, 0x0000, 0x6444, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x5429, 0x2686, 0x0000, 0x58a4,
+  0x7dc9, 0xece6, 0x0000, 0x1c84, 0x0000, 0x0000, 0x0000, 0xe607,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x4c04, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc4a6, 0x0000, 0xfee7,
+  0x1108, 0x4386, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x7024, 0x0000, 0x0000, 0x7549, 0xeac6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb7a6,
+  0x0000, 0x7ce5, 0x0000, 0x2564, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x4845, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x3905, 0x0000, 0x0000, 0x0000, 0xd1e7, 0x146c, 0x56a7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0612, 0x5e64,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x2a4b, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x8866, 0x0000, 0x0000, 0x0000, 0x0000, 0x56ec, 0x0000,
+  0x0000, 0xb707, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x79e7,
+  0x0000, 0x0000, 0x29ed, 0x0000, 0x0000, 0xf766, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x21a8, 0xc3c7, 0x4ec9, 0x3186, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xe2e7, 0x4f4a, 0x0005, 0x0000, 0x0000, 0x78c8, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0128, 0x3386,
+  0x0000, 0x77c7, 0x0000, 0x0000, 0x4868, 0x2fc4, 0x0000, 0x1a84,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x78aa, 0x5524, 0x0000, 0x0000,
+  0x020e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x51e5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0871, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x5de6, 0x0000, 0x0000, 0x0000, 0x0000, 0x34e8, 0x1ce6,
+  0x0000, 0x0000, 0x7f0a, 0x2585, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0c88, 0x1da6, 0x0000, 0x0000, 0x0000, 0xab46, 0x0000, 0x0000,
+  0x0000, 0x9707, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9866,
+  0x102e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18e5,
+  0x0000, 0x0000, 0x356c, 0x0000, 0x0000, 0x0000, 0x0000, 0x76a6,
+  0x5328, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5907, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x9446, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x24ec, 0x2706,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x12e9, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x4984, 0x0098, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x33cc, 0x0d06, 0x0000, 0x0000, 0x5eaa, 0x20e6,
+  0x0000, 0x4625, 0x0000, 0x0000, 0x0000, 0x2804, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x1c24, 0x0000, 0x0000, 0x0000, 0x0000, 0x04b1, 0x6627,
+  0x0000, 0x79c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfd46,
+  0x106b, 0x1d65, 0x0209, 0x0000, 0x49c8, 0x90a7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1baa, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x118a, 0x30c7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x8f07, 0x0000, 0x0000, 0x0000, 0x3a06,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x198b, 0x32e5, 0x25e8, 0x9847,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x00a8, 0x28a5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x018a, 0x6407, 0x0000, 0xdee7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x3f0d, 0x4da6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x7306, 0x0000, 0x2f04, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x1b46, 0x488c, 0x0000, 0x6008, 0x38c7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0010, 0x0000, 0x548a, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x1486, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0656, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0f0d, 0x23a6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x1c49, 0x2ae6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x03b6, 0x0000, 0x0000, 0xe286,
+  0x0000, 0x0000, 0x0115, 0x0000, 0x0000, 0x0000, 0x02b6, 0x8ca7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa5e6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x47e9, 0xc7c6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6fe6, 0x0000, 0x0000,
+  0x0000, 0x77e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdbe7,
+  0x15a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x2146, 0x20ae, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xb266, 0x0000, 0x0000, 0x2588, 0x8126, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x4906, 0x0000, 0x0000, 0x0000, 0x0000, 0x0688, 0x5bc5,
+  0x0000, 0x0000, 0x1b2b, 0x1de7, 0x0000, 0x8d26, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b88, 0x0287,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x3446, 0x0000, 0x0000, 0x0000, 0x4ca5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x4f04, 0x0000, 0x0000, 0x0aa8, 0x7b07, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x71a8, 0x56c5, 0x00eb, 0x8aa7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x14e4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x2308, 0x07c5, 0x0000, 0x0000, 0x042a, 0x0000,
+  0x0000, 0x2ce4, 0x174d, 0x7a87, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4927,
+  0x0000, 0x0000, 0x0000, 0x1a65, 0x0000, 0x0000, 0x2a0d, 0x1226,
+  0x0000, 0x8d46, 0x0000, 0x6d27, 0x0000, 0x0000, 0x6908, 0x20e4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x7284, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x136f, 0x0000, 0x0000, 0x0000,
+  0x39aa, 0x0c27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa987,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a24,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xae06, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0fd3, 0x0000, 0x0000, 0x0000, 0x0000, 0x9366,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1444, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x5fa6, 0x0000, 0x1765, 0x0000, 0xa0c7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x4f66, 0x0000, 0x0000, 0x02eb, 0x1ae4, 0x0000, 0x0000,
+  0x0000, 0xa346, 0x0000, 0x0000, 0x0c2d, 0x5987, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x5228, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x2566, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x10ce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x524c, 0x8746,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfa47, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x682b, 0x1f07, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xcec6, 0x0000, 0x0000, 0x426a, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4f46, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6aa5,
+  0x47ab, 0x1f26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x41ea, 0x0000, 0x0000, 0x0000, 0x0000, 0xb166,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0288, 0x0627,
+  0x0000, 0x0000, 0x0000, 0x7c05, 0x0000, 0x0000, 0x0000, 0x5b05,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x3e28, 0xc567, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x07c9, 0x2186, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x9626, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x3dea, 0x1827, 0x0000, 0x0000, 0x0000, 0x0000, 0x0d4a, 0x0000,
+  0x0000, 0x6b66, 0x0000, 0x0000, 0x02ed, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x65a9, 0x73a6, 0x0000, 0x0000,
+  0x1be8, 0x4ca6, 0x7728, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x5344, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x53c4, 0x0000, 0x0000,
+  0x0509, 0x1b07, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x206b, 0x0000, 0x0000, 0x0000, 0x370a, 0x8b47, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0949, 0x3b66,
+  0x0000, 0x0000, 0x178c, 0x1164, 0x0000, 0x63a4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc486, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x04f5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc746,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2446,
+  0x0000, 0x1d05, 0x0000, 0x0000, 0x6ee9, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x4128, 0x01c4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ca6,
+  0x0000, 0x0000, 0x0000, 0x7c06, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0df0, 0x0000, 0x0000, 0x3524,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x62a7, 0x0000, 0x0000,
+  0x0000, 0xc726, 0x0000, 0xdd06, 0x0000, 0x0000, 0x1d2b, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x75e5, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x7764, 0x1c28, 0x1ea5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x1e2e, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xf2e6, 0x0000, 0x0000, 0x0000, 0xa086, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x58a7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x4548, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc386, 0x0000, 0x0000,
+  0x0000, 0x3764, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x230e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x5b24, 0x0000, 0x0000, 0x0000, 0x2b84, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ec6, 0x6a09, 0x2544,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x67a9, 0xb1c6,
+  0x17ae, 0x0f27, 0x0000, 0x0000, 0x4f09, 0x6587, 0x0000, 0x0000,
+  0x458b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x368a, 0x1584,
+  0x424b, 0x6985, 0x1d0d, 0x7b06, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x126a, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4325,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b64, 0x0000, 0x0000,
+  0x6949, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xa167, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb946,
+  0x4c8c, 0x3105, 0x0000, 0x0000, 0x0000, 0x20c6, 0x03ee, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x5e24, 0x44a9, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x5705, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x6844, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6064,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7325, 0x0000, 0x0000,
+  0x0000, 0x5445, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x2688, 0x3786, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x64ab, 0x1686, 0x0000, 0x0000,
+  0x22cd, 0x21e7, 0x0000, 0x0000, 0x1acd, 0x3f26, 0x0000, 0x97e7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3068, 0x21e6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcda6, 0x054a, 0x0b86,
+  0x0000, 0x3964, 0x0000, 0x0000, 0x294c, 0xc2a6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0e2a, 0x0246,
+  0x0000, 0x0000, 0x0000, 0xd9c6, 0x0000, 0x0000, 0x0000, 0x78a5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x16c6, 0x0000, 0x0000,
+  0x082a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x79a6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x2907, 0x0000, 0x0000, 0x4989, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xdf46, 0x0000, 0x0000, 0x7848, 0xf826, 0x0000, 0x0000,
+  0x0000, 0x2687, 0x3f8b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x4988, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x4cc5, 0x632c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x244c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8e06, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x6388, 0x59e7, 0x0000, 0x0000, 0x28c8, 0x1a45, 0x0000, 0x0000,
+  0x0000, 0x57a4, 0x5ec9, 0x3b05, 0x0000, 0x0000, 0x0000, 0xf367,
+  0x22ca, 0x86e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x3e29, 0x0527, 0x0000, 0x0000, 0x4f48, 0x05c5, 0x7828, 0x0000,
+  0x6548, 0x4184, 0x0000, 0x0000, 0x042d, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x4285, 0x0000, 0x7ca5, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa2a6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xa246, 0x0000, 0x53e6, 0x0000, 0x0000,
+  0x0000, 0x2644, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x56ab, 0xe3e7, 0x0000, 0x0000,
+  0x0000, 0x5ee7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf187,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0b11, 0x16c5,
+  0x0000, 0x0000, 0x0000, 0xf587, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4124,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3509, 0x6b27,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x53e8, 0x2905, 0x0000, 0x4224,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5986, 0x0000, 0xbca6,
+  0x0a0e, 0x0866, 0x0000, 0x0000, 0x0000, 0x0000, 0x0769, 0x11a6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x61e8, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbb46,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x2aee, 0x35c7, 0x6469, 0x93e7,
+  0x54a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa9a6, 0x06b0, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x49c6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x2927, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x3aa4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x398e, 0x0000, 0x0000, 0xd9e6,
+  0x0000, 0x0000, 0x7868, 0x2a86, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xc866, 0x0000, 0x0000, 0x1f4c, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x50c8, 0x1b45, 0x0000, 0xe047, 0x000b, 0x0000,
+  0x0000, 0x4765, 0x0000, 0x38e4, 0x0000, 0x0000, 0x0000, 0x7e86,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x4aa9, 0x1426, 0x0000, 0x2ba4,
+  0x0000, 0x4186, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x284b, 0x3606,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x28aa, 0x1be5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x46c4, 0x0000, 0x0000,
+  0x0000, 0xae47, 0x3c2b, 0x3686, 0x0000, 0x0604, 0x3928, 0x4c45,
+  0x5e89, 0x4d45, 0x0000, 0x0000, 0x0000, 0x5e65, 0x0000, 0x9827,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18a4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x4408, 0x3d85, 0x0d6e, 0x33c7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x7de4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x00b0, 0x0000, 0x0000, 0xc586, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x5424, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xe666, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x14a4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x6529, 0x6ea6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x3e49, 0x0000, 0x0000, 0x0000,
+  0x264c, 0x0125, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x36a4, 0x5a2a, 0x1245, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1626,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xac26,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1905, 0x0000, 0x77e4,
+  0x0000, 0x0000, 0x0000, 0xf106, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xb366, 0x0000, 0x3c26, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x11ca, 0x0a84, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x7ee5, 0x0000, 0x0000, 0x0000, 0x2764,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ee9, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5906,
+  0x0000, 0x0000, 0x0000, 0xd746, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x1bc8, 0x0000, 0x7b2a, 0xb0c7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9f27,
+  0x434a, 0x5847, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0e6f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdea7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x35e7, 0x0c2a, 0x5327, 0x0549, 0x1da7,
+  0x0000, 0x0000, 0x0000, 0x2107, 0x0000, 0x0000, 0x1aa8, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x38e9, 0x0000,
+  0x0000, 0x0000, 0x7148, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x4e0b, 0x0000, 0x47c8, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x2c44, 0x0000, 0x0000, 0x0000, 0xc2c7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x088f, 0x1d67, 0x5a6c, 0xe2a6,
+  0x0000, 0x0000, 0x0000, 0x77a7, 0x0000, 0x67c5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x02f2, 0x0000, 0x0000, 0x3e05, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4466, 0x1de9, 0x0b05,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xa3c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0a09, 0x8687, 0x0000, 0x0000, 0x0ece, 0x0000,
+  0x0000, 0x0000, 0x3beb, 0x2247, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e24,
+  0x0000, 0x0000, 0x53ab, 0x20a7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x01a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x62e6,
+  0x1f48, 0x5047, 0x0000, 0x0000, 0x0000, 0xb2a7, 0x756a, 0x76a4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6644, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x7ac8, 0x2947, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x442a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7666,
+  0x0000, 0x9486, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7104,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xab86, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x56a4, 0x2f2b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x56e7, 0x0000, 0x0000, 0x592a, 0x3047, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x1009, 0xc4e7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x350d, 0x6fa7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x7108, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4509, 0x2846,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0389, 0xe206, 0x062c, 0x0000, 0x0000, 0x0000, 0x0000, 0xe506,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x34a7, 0x0000, 0x0000, 0x3749, 0x33e6, 0x0000, 0x0000,
+  0x242b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x19ce, 0x0dc4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x19a7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0277, 0xc067,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa786, 0x0000, 0x9547,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x44ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xd706, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x27e5, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0e14, 0x9387, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x78e6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf287,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x5be8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x702b, 0x1085, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x04ca, 0x68c4, 0x0000, 0x0000, 0x0000, 0x2f65, 0x1b48, 0x0105,
+  0x528a, 0x7f24, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0ded, 0x3066, 0x50e9, 0x6da7, 0x0000, 0x0000, 0x06aa, 0x62c7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x394e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7746,
+  0x0000, 0x0000, 0x0000, 0x3147, 0x0000, 0xaae6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e44, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb027, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x04c8, 0x0f87,
+  0x2aca, 0x18e7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x5a8c, 0x4e84, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x6488, 0x2147, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x1a07, 0x0000, 0x09e6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x5ca8, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4bc6,
+  0x0000, 0xbac6, 0x66a9, 0xc226, 0x0000, 0x0000, 0x10ec, 0x32a5,
+  0x0000, 0x0000, 0x1648, 0x0c86, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x3c24, 0x0000, 0x0000, 0x0000, 0xac46, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x62e5, 0x0428, 0x9967, 0x6b29, 0x0000,
+  0x3a68, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x37e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0acb, 0x1004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x4968, 0x0000, 0x0000, 0x0000, 0x568a, 0x7f47, 0x0000, 0x1864,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc146,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x5586, 0x0000, 0x0000, 0x2b28, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2da5, 0x0000, 0xd266,
+  0x0000, 0x0000, 0x3b0a, 0x0000, 0x362e, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0397, 0x0000, 0x0000, 0x0000,
+  0x7cac, 0x0000, 0x582a, 0x0065, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1ca5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0cc8, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c46,
+  0x7fc8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x06f6, 0x0000, 0x0e68, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x74a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x57c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xd806, 0x0352, 0x3c84, 0x0000, 0x0000, 0x0000, 0x1727,
+  0x4d4a, 0x3426, 0x0000, 0x6466, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9dc6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4f24, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x3be7, 0x20ca, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x67c6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x034b, 0x08c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x1b2f, 0x0000, 0x5008, 0x0666, 0x0000, 0x0000,
+  0x2d0d, 0xc647, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5187,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5fc7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x2548, 0x5c27, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x51e9, 0x1bc5,
+  0x7149, 0x0000, 0x0000, 0x7ea6, 0x7be8, 0xfb26, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x3eea, 0x0000, 0x0000, 0x0000, 0x1b12, 0x1345,
+  0x0000, 0x0000, 0x0000, 0x5985, 0x0000, 0x6987, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x4da8, 0x1f86, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x5d89, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0cee, 0x0000, 0x0057, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4807, 0x0000, 0x0000,
+  0x0000, 0x5106, 0x0000, 0x0000, 0x0000, 0x2965, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x4f0c, 0x0000, 0x0000, 0x0000, 0x40c8, 0x0d65,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x6a69, 0x0000, 0x0000, 0x0000, 0x0000, 0x3f04, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x00f4, 0x6e65, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x7345, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0b69, 0x7c25, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x1908, 0x1064, 0x0158, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x2da9, 0xb327, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x038a, 0x0ce5, 0x0000, 0x0000, 0x63c8, 0x7ea5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x04ec, 0xf0a7, 0x0000, 0x6aa6, 0x0000, 0x0000, 0x21ea, 0x40e6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x2a4e, 0x0000, 0x0000, 0x2584,
+  0x3ac9, 0x3465, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x6889, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf226,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3124, 0x0000, 0x0000,
+  0x2ca8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x57eb, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3065, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0968, 0x5885, 0x38ab, 0xa8e7,
+  0x0000, 0x25e4, 0x0000, 0x0000, 0x608a, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5da4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x8526, 0x0000, 0x0000, 0x59ab, 0x1c46,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f45, 0x35ee, 0x4e46,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x584a, 0x0000, 0x0000, 0x0000,
+  0x066d, 0x5744, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6786, 0x0000, 0x0000,
+  0x022a, 0x0000, 0x0000, 0x0000, 0x0000, 0xf127, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a86,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0373, 0x6ce7,
+  0x3e4c, 0x0000, 0x0caa, 0xe026, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x366a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x78ca, 0x0000, 0x1029, 0xcd87, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x7ca7, 0x3ec8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x66e4,
+  0x0000, 0xf0e7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0c49, 0xdb87,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0118, 0x0000, 0x140b, 0x82c7,
+  0x0000, 0x3d87, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x1028, 0x05a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x2c28, 0x45c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6225,
+  0x0000, 0x0000, 0x0000, 0x8f26, 0x17a9, 0x0000, 0x0000, 0x0000,
+  0x0357, 0x2c25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfd06,
+  0x0000, 0x0000, 0x0000, 0x4bc5, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0410, 0x6ae7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xfb66, 0x0000, 0x0000, 0x00b2, 0x0084,
+  0x0000, 0x0000, 0x39ab, 0x5f87, 0x0000, 0x0000, 0x0000, 0xb526,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb4a6,
+  0x0000, 0x0000, 0x0000, 0x9206, 0x0000, 0x0000, 0x0000, 0x1d26,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x1fe6, 0x0000, 0x0000, 0x1b09, 0x0000, 0x0000, 0x0000,
+  0x23cb, 0x0000, 0x0000, 0x0000, 0x0077, 0x0000, 0x0000, 0x0000,
+  0x5a6a, 0x4304, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x23a7,
+  0x0000, 0x0000, 0x0000, 0x4607, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x5644, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9bc7,
+  0x0000, 0x0000, 0x07f3, 0x0000, 0x042b, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x410c, 0xe8c7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x4ecb, 0x0000, 0x0000, 0x0000, 0x0000, 0x4545, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x7d25, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x37c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xa426, 0x0000, 0x0000, 0x68a9, 0x4f86, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x22cb, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c84,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x7e4a, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x99e7, 0x0000, 0x2604, 0x0000, 0x3f47,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0356, 0x0000,
+  0x0ba8, 0xb007, 0x634a, 0x6964, 0x580b, 0x0000, 0x23ad, 0x0e45,
+  0x3ca8, 0x7047, 0x1229, 0x0000, 0x0268, 0xfe67, 0x0000, 0x0000,
+  0x0000, 0xf1a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xd807, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x5d48, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x7c68, 0xf586, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc1c6,
+  0x0000, 0x6d46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7f44,
+  0x0000, 0x0000, 0x0000, 0x65c4, 0x0fcb, 0x0000, 0x0000, 0x9e06,
+  0x0000, 0x0000, 0x65c8, 0x7765, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x7aa6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x7268, 0x0705, 0x0000, 0x0000,
+  0x0c94, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x4fcb, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c45,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x5ec5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x8b07, 0x0000, 0x0000, 0x1ace, 0x0000,
+  0x0000, 0x0000, 0x10a9, 0x0000, 0x188d, 0x1507, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x9006, 0x0000, 0x9ba7, 0x0000, 0x0000,
+  0x4348, 0x1526, 0x6cea, 0xe306, 0x0000, 0x0000, 0x33a8, 0x10a6,
+  0x0000, 0x0000, 0x0000, 0x7a46, 0x0000, 0x0000, 0x056c, 0x0ba6,
+  0x2e69, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41c5,
+  0x0329, 0x0000, 0x5e4c, 0x29e4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x16cb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x04e8, 0x4b25, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x16a4, 0x2e48, 0x0000,
+  0x0000, 0xce86, 0x2cc8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x160d, 0x23c6, 0x0000, 0x6287,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x98e6, 0x6188, 0x1fc7,
+  0x7d68, 0x7006, 0x0000, 0x0000, 0x0000, 0xb4e7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x5d0c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0fd2, 0x0000,
+  0x052b, 0x6284, 0x0000, 0x0000, 0x0000, 0x4ea5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x24a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3484, 0x04ae, 0xed86,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x43cc, 0xc447, 0x77a8, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2ea8, 0x03e7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0faa, 0x28a4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x286a, 0x0000, 0x0000, 0xc166,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9807, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x18cf, 0xee26, 0x4ea9, 0x01e7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x028f, 0x0966,
+  0x43eb, 0xa927, 0x0000, 0x0000, 0x0000, 0x42a7, 0x0000, 0x0000,
+  0x00d5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4345,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x2a44, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0171, 0x0006, 0x0000, 0x0000, 0x238a, 0x5265, 0x0000, 0x7ba5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x6a07, 0x0000, 0x0000, 0x3f6a, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1784, 0x7beb, 0x6e85,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0790, 0x77e7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xcea6, 0x0000, 0x0000, 0x7348, 0x2a27,
+  0x0000, 0x4fc4, 0x0000, 0x0000, 0x3e8a, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x14cc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3447, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x5f08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9fa6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x6048, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x1e6a, 0x0b24, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xae86, 0x0000, 0x4605,
+  0x0000, 0x0000, 0x0069, 0xcf46, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x494a, 0x0000, 0x0000, 0x9ee7,
+  0x0000, 0x0000, 0x0000, 0x3f25, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x4fa6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf366, 0x052a, 0x37a7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0728, 0x17a4, 0x0000, 0x0000, 0x2e6a, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x4504, 0x0000, 0x6e66, 0x0000, 0x7366, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x6d67, 0x0000, 0x0000, 0x0000, 0xdf87, 0x0631, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x52aa, 0x0000, 0x0000, 0xf327, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6346, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x8de6, 0x0000, 0x0000, 0x0000, 0x5d25,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a85,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3345,
+  0x0000, 0x7a04, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x57e6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x176a, 0x2845,
+  0x0000, 0x0000, 0x0000, 0x1c65, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x4609, 0x0000, 0x03f3, 0xae67, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x3a47, 0x0000, 0x0000, 0x0000, 0x0000, 0x506a, 0x14e6,
+  0x0000, 0x0000, 0x0000, 0xb286, 0x0000, 0x3385, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8bc6,
+  0x4648, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x200b, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdd66, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x94c7, 0x1089, 0x0000, 0x084f, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x27a4, 0x0000, 0x0000, 0x0000, 0x07e5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb866, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2404, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x4c09, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x9926, 0x0000, 0x94a7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb786, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x5626, 0x0f0a, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0037, 0x0000, 0x292e, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x1c47, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xe7e7, 0x0000, 0x0000, 0x39a9, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xa847, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0aa6,
+  0x0000, 0x0000, 0x256e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9266, 0x0000, 0x0000,
+  0x0000, 0x7a84, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x4fa9, 0x22e5, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x24a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x4209, 0x0225,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x00b6, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0616, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4b2a, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6165, 0x0000, 0x1884,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa546, 0x5c2b, 0x5e04,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3387,
+  0x180e, 0x0a07, 0x0000, 0x0000, 0x010c, 0xb7c7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d24,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6866, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x2008, 0x04c6, 0x7b4a, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0b6a, 0x2027,
+  0x22c8, 0x71e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x5da8, 0x12e4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x7baa, 0x0000, 0x0000, 0x7bc5, 0x0000, 0x0000, 0x0b49, 0x1845,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3525, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x60c4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x50cc, 0x6764,
+  0x5e0b, 0x0000, 0x0000, 0x0000, 0x52c9, 0x0000, 0x02cb, 0x02a7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0bea, 0x1de6,
+  0x0000, 0x0000, 0x0000, 0x35e6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x000f, 0x6d45, 0x0000, 0x0000, 0x212b, 0x0826, 0x0000, 0x0000,
+  0x0000, 0xa8c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xebe7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6524, 0x0000, 0x5704,
+  0x0000, 0x8646, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4ec5, 0x0000, 0x0000,
+  0x6448, 0x0000, 0x0000, 0x0000, 0x0713, 0x6107, 0x0000, 0x7944,
+  0x0000, 0x0000, 0x63a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x320a, 0x0000, 0x0000, 0xf3e6, 0x0000, 0x0000, 0x052d, 0x0000,
+  0x016c, 0x0ec6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x1f6a, 0x4ce7, 0x0000, 0x0000, 0x0000, 0x8287,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x1c25, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2e44, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0d0d, 0x0607, 0x1a2a, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x7446, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa0c6, 0x0000, 0x5ee6,
+  0x0000, 0x0f04, 0x3029, 0x0000, 0x0000, 0x0000, 0x35aa, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6685,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18ea, 0x0000,
+  0x0157, 0x12e6, 0x0000, 0x0000, 0x0000, 0x5f26, 0x2da8, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x05d1, 0x87c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x016b, 0xcb06,
+  0x0756, 0x2b05, 0x0000, 0x0000, 0x7e09, 0xe986, 0x0000, 0x0000,
+  0x0000, 0x6f05, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x58e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x3709, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x7249, 0xef26, 0x0000, 0x77c5, 0x0000, 0x6ea7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x69e4, 0x228b, 0x0000, 0x25c9, 0x0824,
+  0x0000, 0x0000, 0x0000, 0x3fc7, 0x0000, 0xbd47, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x130c, 0x2464, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x234b, 0x49a4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x1044, 0x0000, 0x0000, 0x39eb, 0x0545, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x2e85, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5505, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7a28, 0xf9a6,
+  0x0000, 0x0000, 0x0000, 0x6544, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xadc7, 0x0000, 0x0000,
+  0x0000, 0x5084, 0x0000, 0x0000, 0x6c6a, 0x7ac4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4387, 0x0000, 0x0f67,
+  0x0000, 0x0000, 0x0000, 0xf746, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x62a8, 0x4de6, 0x0000, 0xd766, 0x0000, 0x9886, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c07, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x6f06, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2568, 0xf967,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x628a, 0x1666,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x35e9, 0x1385,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xaba6, 0x04f6, 0x0a06, 0x188c, 0x0000,
+  0x0000, 0x3f66, 0x0000, 0x0000, 0x0000, 0x50c6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x97c7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x73cb, 0x0000, 0x0000, 0x0000, 0x0029, 0x0e47, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x37c4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3d46,
+  0x0000, 0x0000, 0x0000, 0x3d66, 0x0000, 0xc606, 0x0000, 0x0000,
+  0x3f68, 0x1f47, 0x0000, 0x0000, 0x0000, 0x13c4, 0x0149, 0x2d47,
+  0x0033, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x3309, 0x1c86, 0x6b8a, 0x3c06, 0x0000, 0x6166,
+  0x0000, 0x0000, 0x0000, 0x45a4, 0x0000, 0x0000, 0x11c8, 0x18a7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xba46, 0x0170, 0x2f47, 0x278a, 0x8426,
+  0x0000, 0x0000, 0x0257, 0x4866, 0x256b, 0xc147, 0x0000, 0x1624,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x3365, 0x0000, 0x0000, 0x0000, 0x0000, 0x5aea, 0x36e7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbf07, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x074f, 0x0000, 0x3c4a, 0x0000,
+  0x0000, 0x0000, 0x3f2e, 0xf406, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1e45,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7725,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x644b, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2445,
+  0x0000, 0x0000, 0x62eb, 0x0685, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0e04,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8086, 0x0000, 0x0000,
+  0x114a, 0x0000, 0x0000, 0x0000, 0x0000, 0xe267, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x74ca, 0xe3a6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x2e68, 0x04c4, 0x0000, 0x0000, 0x0000, 0xa207,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a65,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa646, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9ce7, 0x250c, 0x0da5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5286, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x21c9, 0x49e6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x8846, 0x0a29, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x30e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x1f28, 0x2847,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb086,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x41ca, 0x4f05, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x1d68, 0x1206, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x7586, 0x0000, 0x0000, 0x0000, 0x0687, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x26a8, 0x1885, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xef07, 0x0000, 0xa147, 0x0000, 0x55c4,
+  0x0000, 0x0000, 0x4e2a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x338b, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0565, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x016d, 0x78e7, 0x5ecc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x1b84, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x6d28, 0x0167, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6f47, 0x0000, 0x0000, 0x004d, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xddc7,
+  0x312a, 0x20e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x6649, 0x3907, 0x0000, 0x0000, 0x1f68, 0x1646, 0x3129, 0x0c25,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5446, 0x150c, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x13f2, 0xcce6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0773, 0x74c7, 0x0000, 0x17e4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x2b49, 0x14a5, 0x0000, 0x6da5, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x1008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xa227, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x148e, 0x0000, 0x0000, 0x0000, 0x01f7, 0x1087, 0x1e28, 0x8627,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x1c88, 0x2886, 0x06b6, 0x0000, 0x0000, 0x71c7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5bc9, 0x5827,
+  0x1b28, 0x0924, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x4f88, 0x30a5, 0x0000, 0xb026, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6fa6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x02a8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a2c, 0x0000,
+  0x0000, 0x0000, 0x77e8, 0x0000, 0x0000, 0x0000, 0x0000, 0xb326,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x15cc, 0x17a5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x02c8, 0x0046, 0x0000, 0x0000, 0x65eb, 0x2c47, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x352c, 0x0000, 0x3368, 0x0786, 0x01b3, 0xc967,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb8c6, 0x4a8b, 0x0000,
+  0x0000, 0x31c6, 0x0000, 0x0647, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x180b, 0x90e7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4a04, 0x1bea, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1ea8, 0x0807,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x22ce, 0x0000, 0x4b88, 0x0000,
+  0x0000, 0xbbc6, 0x212a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x26cc, 0xdc67, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1025, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa986,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x3f2d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x7d0b, 0x0000, 0x0000, 0x78c6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x68e6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x4fa5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x49c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x2305, 0x0000, 0x0000,
+  0x0000, 0xad46, 0x0000, 0x0000, 0x0000, 0x2325, 0x0000, 0x8507,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72a6, 0x0000, 0x0000,
+  0x01f5, 0x4567, 0x0000, 0x0000, 0x7ec9, 0xeb66, 0x0000, 0x0000,
+  0x0000, 0x78a6, 0x0000, 0x0000, 0x0ead, 0x0427, 0x0000, 0x0000,
+  0x0000, 0x6425, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6da4,
+  0x0000, 0x6706, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2da4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x60cb, 0x00e5, 0x0000, 0x35c6,
+  0x0000, 0x0000, 0x1cea, 0x2d05, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x66c9, 0x5c86, 0x0000, 0x0000,
+  0x7428, 0xb9a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a84, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0229, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x7d26, 0x0000, 0x0000, 0x0000, 0x0000, 0x046f, 0x67e4,
+  0x0000, 0x0000, 0x300c, 0x3927, 0x0000, 0x0000, 0x0000, 0xa8e6,
+  0x0000, 0x0367, 0x0000, 0x0000, 0x7b08, 0x0000, 0x2109, 0x4505,
+  0x0000, 0x3224, 0x0000, 0x0000, 0x0000, 0x58c6, 0x0000, 0x9766,
+  0x0000, 0x0000, 0x0177, 0x19a4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x00aa, 0x4867, 0x0000, 0x59a4, 0x0000, 0x0000, 0x7e68, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x64a4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x3d24, 0x0000, 0x0000, 0x0000, 0x8006, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f87,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x3b29, 0x0000, 0x0000, 0x0000,
+  0x526c, 0x6c06, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x130a, 0x6667, 0x0000, 0x0667, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1049, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x1ca8, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x5444, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6044, 0x068b, 0x09e5, 0x0000, 0x0000,
+  0x0000, 0xd046, 0x0000, 0x3326, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x1866, 0x0000, 0x5604, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x6f25, 0x15c8, 0x1404, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x6d06, 0x0000, 0x72c6, 0x4728, 0x2187, 0x0000, 0x0000,
+  0x0000, 0x9906, 0x0000, 0xaa26, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2ec5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x5b65, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x17cb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x194a, 0x3f45, 0x3789, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x6868, 0x0000, 0x0237, 0xbec7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x3ba7, 0x0000, 0x0000, 0x7c4a, 0xabc6, 0x0992, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2c68, 0x23e7,
+  0x0000, 0xada6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x38e8, 0x3005, 0x0000, 0x0000, 0x0000, 0x2105, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x7d28, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0386,
+  0x0000, 0x0000, 0x0000, 0x6a64, 0x15ec, 0x2ce7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x23ea, 0x5c84,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6b26, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x6669, 0xaf46, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x15cd, 0x1c05, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xce27, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x51e8, 0x47a4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x100b, 0x2be7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x72c5, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x55e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xbea6, 0x0000, 0x0000, 0x0000, 0x7e24,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2a84,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x6baa, 0x0000, 0x160b, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0c11, 0x7b25,
+  0x0000, 0x4ce4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xefe7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8d66,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1ee4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0368, 0x02e7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x04cd, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x7ee4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x8806, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc626,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x1c6a, 0x0000, 0x0000, 0x0000,
+  0x3bc8, 0x2d06, 0x0000, 0x0000, 0x0000, 0x0be7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x5768, 0x0000, 0x0000, 0x0000,
+  0x034e, 0x0000, 0x0000, 0x0000, 0x0000, 0x8be7, 0x0000, 0x0000,
+  0x0000, 0x5c64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x5ca9, 0x0864, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x3a08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x054e, 0x0000, 0x0c0a, 0x0000, 0x0000, 0x0000, 0x0350, 0x2ac5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1968, 0x0000,
+  0x0000, 0x3824, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x2009, 0x26e6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x5eca, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6765, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x48ac, 0x0805, 0x0000, 0x82e7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x2406, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xabe6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa3a7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2f0c, 0x0186,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1347, 0x0000, 0xbe06,
+  0x0000, 0xdb26, 0x0bec, 0x3ec6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x21a4, 0x2468, 0x95a7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x01f4, 0x0000, 0x0000, 0x0000, 0x0000, 0xa7a6, 0x0000, 0x7f26,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x6b2a, 0xe246, 0x42a8, 0x0000, 0x0000, 0xb5a6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x6888, 0x1a64, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0270, 0x0000, 0x1388, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x7e25, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x6686, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0017, 0x1c85, 0x0000, 0x0000, 0x0000, 0x8d67,
+  0x0000, 0x9f86, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a2a, 0xe006,
+  0x0000, 0x0000, 0x30a9, 0x2465, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41aa, 0x0000,
+  0x0000, 0x0000, 0x38ae, 0x0000, 0x0000, 0x0000, 0x0000, 0x5347,
+  0x0000, 0x0000, 0x0000, 0x34c4, 0x0011, 0x2c65, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x14ab, 0x0000, 0x2089, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c25, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcb26, 0x0000, 0x0000,
+  0x0000, 0x1d45, 0x0000, 0xace7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x2648, 0x0000, 0x0000, 0x0000,
+  0x644c, 0xf026, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x168d, 0x0000, 0x0000, 0x0000, 0x0000, 0xa407, 0x65c9, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x5865, 0x0000, 0x0000, 0x0000, 0xbaa7, 0x016a, 0x07a7,
+  0x5bac, 0x0000, 0x0000, 0x0000, 0x2aa9, 0x0000, 0x0000, 0x0000,
+  0x0c4e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x7ec8, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x11cf, 0x0cc6, 0x0000, 0x0000,
+  0x03d7, 0x0000, 0x0000, 0x66e7, 0x0000, 0x82a6, 0x0000, 0x0000,
+  0x0000, 0xf147, 0x0000, 0xbd06, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0ae6, 0x0000, 0x9b66, 0x1ea9, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0608, 0x0887,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0fc8, 0x09a7, 0x4e29, 0x7544, 0x0000, 0x0000, 0x2bea, 0x0000,
+  0x0000, 0x0000, 0x15ca, 0xd086, 0x0000, 0x5867, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x3265, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00d7, 0x0000,
+  0x0000, 0x2346, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0109, 0x0584, 0x0000, 0x0000, 0x2d6a, 0x0e67, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x4429, 0x5f27, 0x0000, 0x0000, 0x6869, 0x9cc6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x7448, 0xf206, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x51ac, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x2b08, 0x0000, 0x0000, 0xb966,
+  0x542b, 0x1726, 0x0000, 0x0000, 0x3988, 0x0ba7, 0x5e28, 0x3bc5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7f85, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0ce4, 0x0000, 0x0000,
+  0x0000, 0x3e64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x19ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0c04,
+  0x0000, 0x7907, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x006a, 0x0000, 0x0000, 0x0000, 0x0000, 0x31e7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x1c09, 0x4666, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x5806, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc2e6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x6ba8, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x7646, 0x29ac, 0x5d45, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x71c4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x5186, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xae26, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbd46, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x192a, 0x0000, 0x3fca, 0x59a7, 0x0000, 0x0000,
+  0x4208, 0x0000, 0x0000, 0x0000, 0x0000, 0x0284, 0x0000, 0x0000,
+  0x0000, 0x9c66, 0x0000, 0x0000, 0x0000, 0x9166, 0x0000, 0x0000,
+  0x0000, 0x2666, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8867,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x35a5, 0x0000, 0x0000, 0x0000, 0x6e24,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4da4, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c06, 0x0000, 0x2b86,
+  0x0000, 0x6c85, 0x0000, 0x0000, 0x0000, 0x0000, 0x3628, 0x0000,
+  0x0000, 0x0000, 0x606a, 0xbae7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x1aea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0f8d, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x06ec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0e13, 0x07c7, 0x0000, 0x6b04, 0x21cc, 0x0000,
+  0x4788, 0x0000, 0x0000, 0x0000, 0x0000, 0x7566, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2c06, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x50e4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0152, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x1b8a, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x3a0e, 0x0000, 0x0000, 0x0da4, 0x0000, 0x0000,
+  0x0000, 0xda46, 0x0000, 0x0000, 0x0000, 0x4066, 0x0000, 0x0000,
+  0x0000, 0x46c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x086a, 0x0504, 0x0000, 0x0000, 0x5a49, 0x7c07, 0x0000, 0x0000,
+  0x736b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8f27,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x4707, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x1ee9, 0x0000, 0x0000, 0x0000, 0x0000, 0x50a4,
+  0x0000, 0x0000, 0x290c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaa66,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa006, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x00f6, 0x0385, 0x2d09, 0x1447, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f86,
+  0x0000, 0x0000, 0x6829, 0x6bc6, 0x0000, 0x6b05, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x5c0a, 0x0b85, 0x0000, 0x0000,
+  0x7688, 0xf306, 0x0000, 0xb8e6, 0x07ea, 0x49c5, 0x0000, 0x0000,
+  0x0000, 0xbe26, 0x0000, 0x0000, 0x0000, 0x58a6, 0x0000, 0x0000,
+  0x07b4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x3c69, 0x0000, 0x0000, 0x0000, 0x0000, 0x97a6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x03b1, 0x7fc4, 0x0000, 0xd607,
+  0x0000, 0x3a46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5b64,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x156e, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x1e2a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x7888, 0xfaa6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8986, 0x0000, 0x0000,
+  0x0000, 0x7747, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xf4c7, 0x0000, 0x0000, 0x0448, 0x44a6,
+  0x7c4c, 0x0000, 0x0000, 0x3827, 0x1132, 0x6a47, 0x0000, 0x0000,
+  0x53c8, 0x1244, 0x0000, 0x0000, 0x0000, 0x0000, 0x40c9, 0x13e6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x12ed, 0x0000, 0x0000, 0x8066, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7aea, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x7c27, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x11aa, 0x3ea7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3885, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x1d28, 0x12a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x48cc, 0x0000, 0x0000, 0x0000, 0x6428, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08c4, 0x0000, 0x0000,
+  0x2e2a, 0x0000, 0x0490, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x198c, 0x5a27, 0x35ca, 0x1e27, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xe326, 0x0210, 0x86c6, 0x7faa, 0x0000, 0x0000, 0x32c5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08a6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xe4c7, 0x0000, 0x0000, 0x0000, 0x6707,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x6745, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x6609, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7d05, 0x59a8, 0xe6a7,
+  0x0000, 0x34e7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x3fc8, 0x0000, 0x0000, 0x8306, 0x0000, 0x0000,
+  0x0000, 0x4d46, 0x0000, 0x0000, 0x0000, 0x4104, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x7bc8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x2824, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x8de7, 0x0000, 0x0000, 0x7328, 0x0000,
+  0x0000, 0x0000, 0x0309, 0x31a5, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6b06, 0x0000, 0x0000, 0x0000, 0x1167,
+  0x234d, 0x7aa5, 0x0000, 0x2405, 0x0000, 0x0000, 0x0000, 0xec47,
+  0x5168, 0x0704, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x20ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4d28, 0xaf66,
+  0x0000, 0x96a6, 0x0000, 0x0000, 0x466b, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x29a6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x2e24, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4dc6, 0x0000, 0x0000,
+  0x0000, 0xafe6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e0a, 0x1407,
+  0x0000, 0x2d64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x4d69, 0x0000, 0x15cb, 0x2486,
+  0x0000, 0x0000, 0x520a, 0x4d06, 0x0000, 0x0000, 0x0000, 0x55a6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x50e7, 0x0000, 0x0000,
+  0x0000, 0x4ee5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9e66, 0x0000, 0x0000,
+  0x0000, 0xe0a6, 0x0000, 0x0000, 0x0000, 0xd287, 0x0000, 0x0000,
+  0x3aa9, 0x0000, 0x4268, 0x99c7, 0x092b, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x218c, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0cc9, 0x45c6, 0x0daa, 0x0825,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x4a68, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x2eca, 0xe507, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x020b, 0x0000, 0x32a9, 0x00c6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e25,
+  0x0000, 0xbae6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x11c5, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02af, 0x3a45,
+  0x02ec, 0x2025, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x09ac, 0x3287, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x5908, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x6b88, 0xe706, 0x0000, 0x0000, 0x518c, 0x4ea6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x01b8, 0x2f24, 0x0000, 0xe647,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xbba6, 0x0000, 0x0000, 0x0000, 0xee47, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x3d64, 0x1d4a, 0x1564, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x4eea, 0x9447, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x7469, 0x0000, 0x154b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc666, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5fa5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3505, 0x0000, 0x0000,
+  0x5948, 0x0000, 0x0000, 0x0000, 0x0000, 0x55a7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x23aa, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x35a4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08ea, 0x0247,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0e8e, 0x6787, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x242a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x5464, 0x0000, 0x0000, 0x0000, 0xb206,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x50e6, 0x0000, 0x0000,
+  0x0000, 0xa6c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x048b, 0x1a26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x2ac4, 0x0000, 0x0000, 0x0000, 0x7404, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xe5c7, 0x0ed4, 0x6b07, 0x51cb, 0x27c4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0013, 0x7267,
+  0x6fe9, 0x38c6, 0x0000, 0x0000, 0x402c, 0xb227, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x62ea, 0x0000, 0x132c, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6384, 0x71a9, 0x37a6,
+  0x2b2d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x4846, 0x0000, 0x0000, 0x0000, 0xad66, 0x0000, 0x0000,
+  0x0000, 0x4565, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x5fc8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x43a7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x6e06, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbc46,
+  0x0000, 0x0000, 0x7aeb, 0x0000, 0x6009, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x4904, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x5c2c, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x1c44, 0x03c8, 0x3545, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0eb3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x39c7, 0x0000, 0x0000, 0x0000, 0x3024, 0x0000, 0x31c5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x2b64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0fa9, 0x9d67,
+  0x5088, 0x1105, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x3aa7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaae7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x59e5, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xb1e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x5da6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x4448, 0x50a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x22ac, 0x0000, 0x0000, 0x9f66, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x38a6, 0x4308, 0x4564, 0x0000, 0x0000,
+  0x7b6a, 0x8a67, 0x0000, 0x0000, 0x0b4a, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b84, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2024, 0x0000, 0xdd07,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x85e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a66,
+  0x0000, 0x6864, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xfac6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x5709, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0be9, 0xd6c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0345, 0x0000, 0x44c4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x70a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x66c8, 0x0000, 0x0000, 0x0f46, 0x0000, 0x0000, 0x0000, 0x64e6,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20c7, 0x0000, 0x4d85,
+  0x4b28, 0x0444, 0x0000, 0x0000, 0x1549, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x4324, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x2985, 0x0000, 0x0000, 0x1a0f, 0xeea6,
+  0x16c8, 0x20a6, 0x0000, 0x0000, 0x0000, 0xd726, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x74a4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc926, 0x0000, 0x6fe7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6585,
+  0x0000, 0x0000, 0x75c9, 0xef86, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6147, 0x0000, 0x0000, 0x0000, 0x1124,
+  0x0000, 0xa446, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xcfa6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xc6e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x668b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1729, 0x0b25,
+  0x0000, 0x9106, 0x1ccc, 0x00c5, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x07eb, 0x03a6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xd986, 0x0000, 0x0000, 0x1628, 0x1547,
+  0x0000, 0xf526, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0b6b, 0x0000,
+  0x022c, 0x0587, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x21c5, 0x0000, 0x2505, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbe66, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x5eab, 0x00e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x424a, 0x4987, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6246,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4887, 0x4e68, 0x0b07,
+  0x37e9, 0x0726, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x69a8, 0x5be6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x03e5, 0x01ec, 0x0000, 0x398a, 0x4125, 0x018c, 0x3506,
+  0x0000, 0x0000, 0x0000, 0xa2c7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x4a65, 0x0000, 0x0000, 0x0000, 0x01a5,
+  0x4489, 0x0c26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xb807, 0x388b, 0xdce7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0e71, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc0e6, 0x0000, 0x8ae7,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0028, 0x0000, 0x2ce8, 0x3d05,
+  0x0000, 0x2166, 0x0000, 0x0000, 0x0000, 0xf7e6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9066, 0x0000, 0xc4e6,
+  0x0000, 0xb3c6, 0x03e9, 0x0000, 0x0000, 0x2f25, 0x0cb1, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x3b89, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfce7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xe587, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0470, 0x6965, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x4544, 0x0000, 0x0000, 0x0000, 0x4305, 0x4e2b, 0x19e5,
+  0x0000, 0xab67, 0x0000, 0x0000, 0x0000, 0x3504, 0x6228, 0x2a07,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x7004, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x036b, 0x5dc7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x1dcc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x2fec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x4b64, 0x5aaa, 0x0164, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3b84, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xc206, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x5504, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x366b, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb2e7, 0x0000, 0x0000,
+  0x01b4, 0x0e05, 0x0000, 0x0000, 0x2c8a, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf566,
+  0x0000, 0x0000, 0x0000, 0x9b86, 0x024c, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6c66, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0649, 0x5884, 0x092a, 0x4a07, 0x0000, 0x3ec4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x142a, 0x2b66,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x3ac8, 0x0424, 0x0000, 0x1ec7,
+  0x4768, 0x0146, 0x0000, 0x3a26, 0x4cc8, 0x0000, 0x1daa, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x030d, 0x0245, 0x0000, 0x3f46,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0436, 0x26a4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x1189, 0x0000, 0x0000, 0x0000, 0x0000, 0x8406,
+  0x0000, 0x0000, 0x0000, 0xd506, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x8186, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa466, 0x360a, 0x0ac5,
+  0x2108, 0x4185, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0d6a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0f6a, 0x73e4, 0x0000, 0x0000, 0x77aa, 0x8fa7, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6145, 0x0000, 0x3ec5, 0x1888, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xa406, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6ae5, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x05aa, 0xaf07,
+  0x0000, 0x0000, 0x0000, 0x7d64, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x8926, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x4428, 0x4c87, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x06cb, 0x0000, 0x0000, 0x0000, 0x0000, 0x1587, 0x0000, 0x0000,
+  0x0000, 0x80a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x4704, 0x0000, 0x0000, 0x0000, 0x5b84,
+  0x4d2a, 0x0000, 0x0000, 0x79c6, 0x0bcd, 0x7ba7, 0x5ba8, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xdfa7, 0x0000, 0x0000,
+  0x532c, 0xfbe7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x64ca, 0x23e5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc066,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x16cd, 0xc367, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3c87, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0xcae6, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x6dc8, 0xe526, 0x0000, 0xc426,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0bac, 0x0000, 0x5968, 0x7c44, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x07e4, 0x0000, 0x49e4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x5da5, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x446c, 0x2dc5, 0x0000, 0x0000, 0x0000, 0xda67, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0b27, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb6e6,
+  0x0000, 0x6086, 0x6faa, 0x0000, 0x0000, 0x0000, 0x0614, 0x0000,
+  0x0000, 0x75a5, 0x0000, 0x0000, 0x564a, 0xdf27, 0x0d4b, 0x3707,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0411, 0x0000, 0x2989, 0x1b04, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a85, 0x0000, 0x0000,
+  0x340a, 0x4687, 0x0000, 0x72c4, 0x0000, 0xdc86, 0x0000, 0x0000,
+  0x0078, 0x0000, 0x0000, 0x2245, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x3ea8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x6a6a, 0x5ce5, 0x0000, 0x0624, 0x0000, 0x6de6, 0x0000, 0x0000,
+  0x05e8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c24,
+  0x0000, 0x9646, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x05e9, 0x2205, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb5e6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x6f69, 0xeee7, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f24, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x32e4,
+  0x0000, 0x16e7, 0x0000, 0x0000, 0x3d4d, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x046b, 0x5b66, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6664, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x47e4, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x05b1, 0x6647, 0x0000, 0x0000, 0x09ab, 0x1bc6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x6a2c, 0xeb06, 0x0000, 0x0000, 0x0000, 0x4f26,
+  0x0000, 0xa386, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0aca, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6624, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e45, 0x0000, 0x0000,
+  0x0000, 0x7246, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x6c2a, 0x0000, 0x0000, 0x3544,
+  0x31e8, 0x0746, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x4349, 0x0cc7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x6d87, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x1169, 0x46c5, 0x0000, 0x07e7,
+  0x0192, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0068, 0x0e46,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x4808, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x74a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5686, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x5e0a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x2ee4, 0x0000, 0x7e66, 0x0000, 0x0000,
+  0x0c09, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x128d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2a28, 0x0707,
+  0x534a, 0x0000, 0x1ec8, 0x3145, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x36a9, 0x0000, 0x0000, 0x0000,
+  0x3f4a, 0x0000, 0x0000, 0x0000, 0x0000, 0x7d66, 0x0000, 0x9167,
+  0x0000, 0x2904, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x7d08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x5d08, 0x0ca4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ac5,
+  0x0000, 0x0000, 0x160a, 0x0000, 0x124c, 0x0126, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x68e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x1bec, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x1ed2, 0xf166, 0x03ab, 0x0000, 0x0000, 0xdd67,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x69c6, 0x00ca, 0x13a5,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x6d65, 0x0000, 0x0000, 0x3ba9, 0x60a5, 0x162c, 0x4fe4,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xda66,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x13cd, 0x6d26, 0x0000, 0x5264,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x30e5, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x5388, 0x6e64, 0x0000, 0x09c6, 0x4e8c, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0xb686, 0x0000, 0x7846, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x3985, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x044b, 0x18e4, 0x0000, 0x0000, 0x0000, 0x3086, 0x3b4e, 0x0000,
+  0x21eb, 0x0000, 0x29a9, 0x4c06, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0636, 0x0000, 0x7b8c, 0x0000, 0x5868, 0x4d26,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5e86,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc5e6, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x23ab, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2b07,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x406a, 0xd5a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x3289, 0x0000, 0x0000, 0x0000, 0x0000, 0x3e84,
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0885, 0x1b0b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x3d08, 0x2c26, 0x0000, 0x0000, 0x1629, 0x1d87,
+  0x0000, 0x0000, 0x394c, 0x3d44, 0x0000, 0x0000, 0x0000, 0x0000,
+  0x0000, 0x0000, 0x5e8c, 0xbc06, 0x0000, 0x5ea6, 0x0000, 0xd8e7,
+  0x0000, 0x0000, 0x0d88, 0x4ac5, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+}  // namespace brotli
+
+#endif  // BROTLI_ENC_DICTIONARY_HASH_H_
diff --git a/third_party/brotli/enc/encode.cc b/third_party/brotli/enc/encode.cc
new file mode 100644
index 0000000..3e1c79a
--- /dev/null
+++ b/third_party/brotli/enc/encode.cc
@@ -0,0 +1,1175 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Implementation of Brotli compressor.
+
+#include "./encode.h"
+
+#include <algorithm>
+#include <cstdlib>  /* free, malloc */
+#include <cstring>  /* memset */
+#include <limits>
+
+#include "./backward_references.h"
+#include "./bit_cost.h"
+#include "./block_splitter.h"
+#include "./brotli_bit_stream.h"
+#include "./cluster.h"
+#include "./context.h"
+#include "./metablock.h"
+#include "./transform.h"
+#include "./compress_fragment.h"
+#include "./compress_fragment_two_pass.h"
+#include "./entropy_encode.h"
+#include "./fast_log.h"
+#include "./hash.h"
+#include "./histogram.h"
+#include "./prefix.h"
+#include "./utf8_util.h"
+#include "./write_bits.h"
+
+namespace brotli {
+
+static const int kMinQualityForBlockSplit = 4;
+static const int kMinQualityForContextModeling = 5;
+static const int kMinQualityForOptimizeHistograms = 4;
+// For quality 2 there is no block splitting, so we buffer at most this much
+// literals and commands.
+static const size_t kMaxNumDelayedSymbols = 0x2fff;
+
+#define COPY_ARRAY(dst, src) memcpy(dst, src, sizeof(src));
+
+static void RecomputeDistancePrefixes(Command* cmds,
+                                      size_t num_commands,
+                                      uint32_t num_direct_distance_codes,
+                                      uint32_t distance_postfix_bits) {
+  if (num_direct_distance_codes == 0 && distance_postfix_bits == 0) {
+    return;
+  }
+  for (size_t i = 0; i < num_commands; ++i) {
+    Command* cmd = &cmds[i];
+    if (cmd->copy_len() && cmd->cmd_prefix_ >= 128) {
+      PrefixEncodeCopyDistance(cmd->DistanceCode(),
+                               num_direct_distance_codes,
+                               distance_postfix_bits,
+                               &cmd->dist_prefix_,
+                               &cmd->dist_extra_);
+    }
+  }
+}
+
+/* Wraps 64-bit input position to 32-bit ringbuffer position preserving
+   "not-a-first-lap" feature. */
+static uint32_t WrapPosition(uint64_t position) {
+  uint32_t result = static_cast<uint32_t>(position);
+  if (position > (1u << 30)) {
+    result = (result & ((1u << 30) - 1)) | (1u << 30);
+  }
+  return result;
+}
+
+uint8_t* BrotliCompressor::GetBrotliStorage(size_t size) {
+  if (storage_size_ < size) {
+    delete[] storage_;
+    storage_ = new uint8_t[size];
+    storage_size_ = size;
+  }
+  return storage_;
+}
+
+static size_t MaxHashTableSize(int quality) {
+  return quality == 0 ? 1 << 15 : 1 << 17;
+}
+
+static size_t HashTableSize(size_t max_table_size, size_t input_size) {
+  size_t htsize = 256;
+  while (htsize < max_table_size && htsize < input_size) {
+    htsize <<= 1;
+  }
+  return htsize;
+}
+
+int* BrotliCompressor::GetHashTable(int quality,
+                                    size_t input_size,
+                                    size_t* table_size) {
+  // Use smaller hash table when input.size() is smaller, since we
+  // fill the table, incurring O(hash table size) overhead for
+  // compression, and if the input is short, we won't need that
+  // many hash table entries anyway.
+  const size_t max_table_size = MaxHashTableSize(quality);
+  assert(max_table_size >= 256);
+  size_t htsize = HashTableSize(max_table_size, input_size);
+
+  int* table;
+  if (htsize <= sizeof(small_table_) / sizeof(small_table_[0])) {
+    table = small_table_;
+  } else {
+    if (large_table_ == NULL) {
+      large_table_ = new int[max_table_size];
+    }
+    table = large_table_;
+  }
+
+  *table_size = htsize;
+  memset(table, 0, htsize * sizeof(*table));
+  return table;
+}
+
+static void EncodeWindowBits(int lgwin, uint8_t* last_byte,
+                             uint8_t* last_byte_bits) {
+  if (lgwin == 16) {
+    *last_byte = 0;
+    *last_byte_bits = 1;
+  } else if (lgwin == 17) {
+    *last_byte = 1;
+    *last_byte_bits = 7;
+  } else if (lgwin > 17) {
+    *last_byte = static_cast<uint8_t>(((lgwin - 17) << 1) | 1);
+    *last_byte_bits = 4;
+  } else {
+    *last_byte = static_cast<uint8_t>(((lgwin - 8) << 4) | 1);
+    *last_byte_bits = 7;
+  }
+}
+
+// Initializes the command and distance prefix codes for the first block.
+static void InitCommandPrefixCodes(uint8_t cmd_depths[128],
+                                   uint16_t cmd_bits[128],
+                                   uint8_t cmd_code[512],
+                                   size_t* cmd_code_numbits) {
+  static const uint8_t kDefaultCommandDepths[128] = {
+    0, 4, 4, 5, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8,
+    0, 0, 0, 4, 4, 4, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7,
+    7, 7, 10, 10, 10, 10, 10, 10, 0, 4, 4, 5, 5, 5, 6, 6,
+    7, 8, 8, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+    5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4,
+    4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 7, 7, 7, 8, 10,
+    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  };
+  static const uint16_t kDefaultCommandBits[128] = {
+    0,   0,   8,   9,   3,  35,   7,   71,
+    39, 103,  23,  47, 175, 111, 239,   31,
+    0,   0,   0,   4,  12,   2,  10,    6,
+    13,  29,  11,  43,  27,  59,  87,   55,
+    15,  79, 319, 831, 191, 703, 447,  959,
+    0,  14,   1,  25,   5,  21,  19,   51,
+    119, 159,  95, 223, 479, 991,  63,  575,
+    127, 639, 383, 895, 255, 767, 511, 1023,
+    14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    27, 59, 7, 39, 23, 55, 30, 1, 17, 9, 25, 5, 0, 8, 4, 12,
+    2, 10, 6, 21, 13, 29, 3, 19, 11, 15, 47, 31, 95, 63, 127, 255,
+    767, 2815, 1791, 3839, 511, 2559, 1535, 3583, 1023, 3071, 2047, 4095,
+  };
+  COPY_ARRAY(cmd_depths, kDefaultCommandDepths);
+  COPY_ARRAY(cmd_bits, kDefaultCommandBits);
+
+  // Initialize the pre-compressed form of the command and distance prefix
+  // codes.
+  static const uint8_t kDefaultCommandCode[] = {
+    0xff, 0x77, 0xd5, 0xbf, 0xe7, 0xde, 0xea, 0x9e, 0x51, 0x5d, 0xde, 0xc6,
+    0x70, 0x57, 0xbc, 0x58, 0x58, 0x58, 0xd8, 0xd8, 0x58, 0xd5, 0xcb, 0x8c,
+    0xea, 0xe0, 0xc3, 0x87, 0x1f, 0x83, 0xc1, 0x60, 0x1c, 0x67, 0xb2, 0xaa,
+    0x06, 0x83, 0xc1, 0x60, 0x30, 0x18, 0xcc, 0xa1, 0xce, 0x88, 0x54, 0x94,
+    0x46, 0xe1, 0xb0, 0xd0, 0x4e, 0xb2, 0xf7, 0x04, 0x00,
+  };
+  static const int kDefaultCommandCodeNumBits = 448;
+  COPY_ARRAY(cmd_code, kDefaultCommandCode);
+  *cmd_code_numbits = kDefaultCommandCodeNumBits;
+}
+
+// Decide about the context map based on the ability of the prediction
+// ability of the previous byte UTF8-prefix on the next byte. The
+// prediction ability is calculated as shannon entropy. Here we need
+// shannon entropy instead of 'BitsEntropy' since the prefix will be
+// encoded with the remaining 6 bits of the following byte, and
+// BitsEntropy will assume that symbol to be stored alone using Huffman
+// coding.
+static void ChooseContextMap(int quality,
+                             uint32_t* bigram_histo,
+                             size_t* num_literal_contexts,
+                             const uint32_t** literal_context_map) {
+  uint32_t monogram_histo[3] = { 0 };
+  uint32_t two_prefix_histo[6] = { 0 };
+  size_t total = 0;
+  for (size_t i = 0; i < 9; ++i) {
+    total += bigram_histo[i];
+    monogram_histo[i % 3] += bigram_histo[i];
+    size_t j = i;
+    if (j >= 6) {
+      j -= 6;
+    }
+    two_prefix_histo[j] += bigram_histo[i];
+  }
+  size_t dummy;
+  double entropy1 = ShannonEntropy(monogram_histo, 3, &dummy);
+  double entropy2 = (ShannonEntropy(two_prefix_histo, 3, &dummy) +
+                     ShannonEntropy(two_prefix_histo + 3, 3, &dummy));
+  double entropy3 = 0;
+  for (size_t k = 0; k < 3; ++k) {
+    entropy3 += ShannonEntropy(bigram_histo + 3 * k, 3, &dummy);
+  }
+
+  assert(total != 0);
+  double scale = 1.0 / static_cast<double>(total);
+  entropy1 *= scale;
+  entropy2 *= scale;
+  entropy3 *= scale;
+
+  static const uint32_t kStaticContextMapContinuation[64] = {
+    1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  };
+  static const uint32_t kStaticContextMapSimpleUTF8[64] = {
+    0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  };
+  if (quality < 7) {
+    // 3 context models is a bit slower, don't use it at lower qualities.
+    entropy3 = entropy1 * 10;
+  }
+  // If expected savings by symbol are less than 0.2 bits, skip the
+  // context modeling -- in exchange for faster decoding speed.
+  if (entropy1 - entropy2 < 0.2 &&
+      entropy1 - entropy3 < 0.2) {
+    *num_literal_contexts = 1;
+  } else if (entropy2 - entropy3 < 0.02) {
+    *num_literal_contexts = 2;
+    *literal_context_map = kStaticContextMapSimpleUTF8;
+  } else {
+    *num_literal_contexts = 3;
+    *literal_context_map = kStaticContextMapContinuation;
+  }
+}
+
+static void DecideOverLiteralContextModeling(
+    const uint8_t* input,
+    size_t start_pos,
+    size_t length,
+    size_t mask,
+    int quality,
+    ContextType* literal_context_mode,
+    size_t* num_literal_contexts,
+    const uint32_t** literal_context_map) {
+  if (quality < kMinQualityForContextModeling || length < 64) {
+    return;
+  }
+  // Gather bigram data of the UTF8 byte prefixes. To make the analysis of
+  // UTF8 data faster we only examine 64 byte long strides at every 4kB
+  // intervals.
+  const size_t end_pos = start_pos + length;
+  uint32_t bigram_prefix_histo[9] = { 0 };
+  for (; start_pos + 64 <= end_pos; start_pos += 4096) {
+      static const int lut[4] = { 0, 0, 1, 2 };
+    const size_t stride_end_pos = start_pos + 64;
+    int prev = lut[input[start_pos & mask] >> 6] * 3;
+    for (size_t pos = start_pos + 1; pos < stride_end_pos; ++pos) {
+      const uint8_t literal = input[pos & mask];
+      ++bigram_prefix_histo[prev + lut[literal >> 6]];
+      prev = lut[literal >> 6] * 3;
+    }
+  }
+  *literal_context_mode = CONTEXT_UTF8;
+  ChooseContextMap(quality, &bigram_prefix_histo[0], num_literal_contexts,
+                   literal_context_map);
+}
+
+static bool ShouldCompress(const uint8_t* data,
+                           const size_t mask,
+                           const uint64_t last_flush_pos,
+                           const size_t bytes,
+                           const size_t num_literals,
+                           const size_t num_commands) {
+  if (num_commands < (bytes >> 8) + 2) {
+    if (num_literals > 0.99 * static_cast<double>(bytes)) {
+      uint32_t literal_histo[256] = { 0 };
+      static const uint32_t kSampleRate = 13;
+      static const double kMinEntropy = 7.92;
+      const double bit_cost_threshold =
+          static_cast<double>(bytes) * kMinEntropy / kSampleRate;
+      size_t t = (bytes + kSampleRate - 1) / kSampleRate;
+      uint32_t pos = static_cast<uint32_t>(last_flush_pos);
+      for (size_t i = 0; i < t; i++) {
+        ++literal_histo[data[pos & mask]];
+        pos += kSampleRate;
+      }
+      if (BitsEntropy(literal_histo, 256) > bit_cost_threshold) {
+        return false;
+      }
+    }
+  }
+  return true;
+}
+
+static void WriteMetaBlockInternal(const uint8_t* data,
+                                   const size_t mask,
+                                   const uint64_t last_flush_pos,
+                                   const size_t bytes,
+                                   const bool is_last,
+                                   const int quality,
+                                   const bool font_mode,
+                                   const uint8_t prev_byte,
+                                   const uint8_t prev_byte2,
+                                   const size_t num_literals,
+                                   const size_t num_commands,
+                                   Command* commands,
+                                   const int* saved_dist_cache,
+                                   int* dist_cache,
+                                   size_t* storage_ix,
+                                   uint8_t* storage) {
+  if (bytes == 0) {
+    // Write the ISLAST and ISEMPTY bits.
+    WriteBits(2, 3, storage_ix, storage);
+    *storage_ix = (*storage_ix + 7u) & ~7u;
+    return;
+  }
+
+  if (!ShouldCompress(data, mask, last_flush_pos, bytes,
+                      num_literals, num_commands)) {
+    // Restore the distance cache, as its last update by
+    // CreateBackwardReferences is now unused.
+    memcpy(dist_cache, saved_dist_cache, 4 * sizeof(dist_cache[0]));
+    StoreUncompressedMetaBlock(is_last, data,
+                               WrapPosition(last_flush_pos), mask, bytes,
+                               storage_ix, storage);
+    return;
+  }
+
+  const uint8_t last_byte = storage[0];
+  const uint8_t last_byte_bits = static_cast<uint8_t>(*storage_ix & 0xff);
+  uint32_t num_direct_distance_codes = 0;
+  uint32_t distance_postfix_bits = 0;
+  if (quality > 9 && font_mode) {
+    num_direct_distance_codes = 12;
+    distance_postfix_bits = 1;
+    RecomputeDistancePrefixes(commands,
+                              num_commands,
+                              num_direct_distance_codes,
+                              distance_postfix_bits);
+  }
+  if (quality == 2) {
+    StoreMetaBlockFast(data, WrapPosition(last_flush_pos),
+                       bytes, mask, is_last,
+                       commands, num_commands,
+                       storage_ix, storage);
+  } else if (quality < kMinQualityForBlockSplit) {
+    StoreMetaBlockTrivial(data, WrapPosition(last_flush_pos),
+                          bytes, mask, is_last,
+                          commands, num_commands,
+                          storage_ix, storage);
+  } else {
+    MetaBlockSplit mb;
+    ContextType literal_context_mode = CONTEXT_UTF8;
+    if (quality <= 9) {
+      size_t num_literal_contexts = 1;
+      const uint32_t* literal_context_map = NULL;
+      DecideOverLiteralContextModeling(data, WrapPosition(last_flush_pos),
+                                       bytes, mask,
+                                       quality,
+                                       &literal_context_mode,
+                                       &num_literal_contexts,
+                                       &literal_context_map);
+      if (literal_context_map == NULL) {
+        BuildMetaBlockGreedy(data, WrapPosition(last_flush_pos), mask,
+                             commands, num_commands, &mb);
+      } else {
+        BuildMetaBlockGreedyWithContexts(data, WrapPosition(last_flush_pos),
+                                         mask,
+                                         prev_byte, prev_byte2,
+                                         literal_context_mode,
+                                         num_literal_contexts,
+                                         literal_context_map,
+                                         commands, num_commands,
+                                         &mb);
+      }
+    } else {
+      if (!IsMostlyUTF8(data, WrapPosition(last_flush_pos), mask, bytes,
+                        kMinUTF8Ratio)) {
+        literal_context_mode = CONTEXT_SIGNED;
+      }
+      BuildMetaBlock(data, WrapPosition(last_flush_pos), mask,
+                     prev_byte, prev_byte2,
+                     commands, num_commands,
+                     literal_context_mode,
+                     &mb);
+    }
+    if (quality >= kMinQualityForOptimizeHistograms) {
+      OptimizeHistograms(num_direct_distance_codes,
+                         distance_postfix_bits,
+                         &mb);
+    }
+    StoreMetaBlock(data, WrapPosition(last_flush_pos), bytes, mask,
+                   prev_byte, prev_byte2,
+                   is_last,
+                   num_direct_distance_codes,
+                   distance_postfix_bits,
+                   literal_context_mode,
+                   commands, num_commands,
+                   mb,
+                   storage_ix, storage);
+  }
+  if (bytes + 4 < (*storage_ix >> 3)) {
+    // Restore the distance cache and last byte.
+    memcpy(dist_cache, saved_dist_cache, 4 * sizeof(dist_cache[0]));
+    storage[0] = last_byte;
+    *storage_ix = last_byte_bits;
+    StoreUncompressedMetaBlock(is_last, data,
+                               WrapPosition(last_flush_pos), mask,
+                               bytes, storage_ix, storage);
+  }
+}
+
+BrotliCompressor::BrotliCompressor(BrotliParams params)
+    : params_(params),
+      hashers_(new Hashers()),
+      input_pos_(0),
+      num_commands_(0),
+      num_literals_(0),
+      last_insert_len_(0),
+      last_flush_pos_(0),
+      last_processed_pos_(0),
+      prev_byte_(0),
+      prev_byte2_(0),
+      storage_size_(0),
+      storage_(0),
+      large_table_(NULL),
+      cmd_code_numbits_(0),
+      command_buf_(NULL),
+      literal_buf_(NULL) {
+  // Sanitize params.
+  params_.quality = std::max(0, params_.quality);
+  if (params_.lgwin < kMinWindowBits) {
+    params_.lgwin = kMinWindowBits;
+  } else if (params_.lgwin > kMaxWindowBits) {
+    params_.lgwin = kMaxWindowBits;
+  }
+  if (params_.quality <= 1) {
+    params_.lgblock = params_.lgwin;
+  } else if (params_.quality < kMinQualityForBlockSplit) {
+    params_.lgblock = 14;
+  } else if (params_.lgblock == 0) {
+    params_.lgblock = 16;
+    if (params_.quality >= 9 && params_.lgwin > params_.lgblock) {
+      params_.lgblock = std::min(18, params_.lgwin);
+    }
+  } else {
+    params_.lgblock = std::min(kMaxInputBlockBits,
+                               std::max(kMinInputBlockBits, params_.lgblock));
+  }
+
+  // Initialize input and literal cost ring buffers.
+  // We allocate at least lgwin + 1 bits for the ring buffer so that the newly
+  // added block fits there completely and we still get lgwin bits and at least
+  // read_block_size_bits + 1 bits because the copy tail length needs to be
+  // smaller than ringbuffer size.
+  int ringbuffer_bits = std::max(params_.lgwin + 1, params_.lgblock + 1);
+  ringbuffer_ = new RingBuffer(ringbuffer_bits, params_.lgblock);
+
+  commands_ = 0;
+  cmd_alloc_size_ = 0;
+
+  // Initialize last byte with stream header.
+  EncodeWindowBits(params_.lgwin, &last_byte_, &last_byte_bits_);
+
+  // Initialize distance cache.
+  dist_cache_[0] = 4;
+  dist_cache_[1] = 11;
+  dist_cache_[2] = 15;
+  dist_cache_[3] = 16;
+  // Save the state of the distance cache in case we need to restore it for
+  // emitting an uncompressed block.
+  memcpy(saved_dist_cache_, dist_cache_, sizeof(dist_cache_));
+
+  if (params_.quality == 0) {
+    InitCommandPrefixCodes(cmd_depths_, cmd_bits_,
+                           cmd_code_, &cmd_code_numbits_);
+  } else if (params_.quality == 1) {
+    command_buf_ = new uint32_t[kCompressFragmentTwoPassBlockSize];
+    literal_buf_ = new uint8_t[kCompressFragmentTwoPassBlockSize];
+  }
+
+  // Initialize hashers.
+  hash_type_ = std::min(10, params_.quality);
+  hashers_->Init(hash_type_);
+}
+
+BrotliCompressor::~BrotliCompressor(void) {
+  delete[] storage_;
+  free(commands_);
+  delete ringbuffer_;
+  delete hashers_;
+  delete[] large_table_;
+  delete[] command_buf_;
+  delete[] literal_buf_;
+}
+
+void BrotliCompressor::CopyInputToRingBuffer(const size_t input_size,
+                                             const uint8_t* input_buffer) {
+  ringbuffer_->Write(input_buffer, input_size);
+  input_pos_ += input_size;
+
+  // TL;DR: If needed, initialize 7 more bytes in the ring buffer to make the
+  // hashing not depend on uninitialized data. This makes compression
+  // deterministic and it prevents uninitialized memory warnings in Valgrind.
+  // Even without erasing, the output would be valid (but nondeterministic).
+  //
+  // Background information: The compressor stores short (at most 8 bytes)
+  // substrings of the input already read in a hash table, and detects
+  // repetitions by looking up such substrings in the hash table. If it
+  // can find a substring, it checks whether the substring is really there
+  // in the ring buffer (or it's just a hash collision). Should the hash
+  // table become corrupt, this check makes sure that the output is
+  // still valid, albeit the compression ratio would be bad.
+  //
+  // The compressor populates the hash table from the ring buffer as it's
+  // reading new bytes from the input. However, at the last few indexes of
+  // the ring buffer, there are not enough bytes to build full-length
+  // substrings from. Since the hash table always contains full-length
+  // substrings, we erase with dummy 0s here to make sure that those
+  // substrings will contain 0s at the end instead of uninitialized
+  // data.
+  //
+  // Please note that erasing is not necessary (because the
+  // memory region is already initialized since he ring buffer
+  // has a `tail' that holds a copy of the beginning,) so we
+  // skip erasing if we have already gone around at least once in
+  // the ring buffer.
+  size_t pos = ringbuffer_->position();
+  // Only clear during the first round of ringbuffer writes. On
+  // subsequent rounds data in the ringbuffer would be affected.
+  if (pos <= ringbuffer_->mask()) {
+    // This is the first time when the ring buffer is being written.
+    // We clear 7 bytes just after the bytes that have been copied from
+    // the input buffer.
+    //
+    // The ringbuffer has a "tail" that holds a copy of the beginning,
+    // but only once the ring buffer has been fully written once, i.e.,
+    // pos <= mask. For the first time, we need to write values
+    // in this tail (where index may be larger than mask), so that
+    // we have exactly defined behavior and don't read un-initialized
+    // memory. Due to performance reasons, hashing reads data using a
+    // LOAD64, which can go 7 bytes beyond the bytes written in the
+    // ringbuffer.
+    memset(ringbuffer_->start() + pos, 0, 7);
+  }
+}
+
+void BrotliCompressor::BrotliSetCustomDictionary(
+    const size_t size, const uint8_t* dict) {
+  CopyInputToRingBuffer(size, dict);
+  last_flush_pos_ = size;
+  last_processed_pos_ = size;
+  if (size > 0) {
+    prev_byte_ = dict[size - 1];
+  }
+  if (size > 1) {
+    prev_byte2_ = dict[size - 2];
+  }
+  hashers_->PrependCustomDictionary(hash_type_, params_.lgwin, size, dict);
+}
+
+bool BrotliCompressor::WriteBrotliData(const bool is_last,
+                                       const bool force_flush,
+                                       size_t* out_size,
+                                       uint8_t** output) {
+  const uint64_t delta = input_pos_ - last_processed_pos_;
+  const uint8_t* data = ringbuffer_->start();
+  const uint32_t mask = ringbuffer_->mask();
+
+  if (delta > input_block_size()) {
+    return false;
+  }
+  const uint32_t bytes = static_cast<uint32_t>(delta);
+
+  if (params_.quality <= 1) {
+    if (delta == 0 && !is_last) {
+      // We have no new input data and we don't have to finish the stream, so
+      // nothing to do.
+      *out_size = 0;
+      return true;
+    }
+    const size_t max_out_size = 2 * bytes + 500;
+    uint8_t* storage = GetBrotliStorage(max_out_size);
+    storage[0] = last_byte_;
+    size_t storage_ix = last_byte_bits_;
+    size_t table_size;
+    int* table = GetHashTable(params_.quality, bytes, &table_size);
+    if (params_.quality == 0) {
+      BrotliCompressFragmentFast(
+          &data[WrapPosition(last_processed_pos_) & mask],
+          bytes, is_last,
+          table, table_size,
+          cmd_depths_, cmd_bits_,
+          &cmd_code_numbits_, cmd_code_,
+          &storage_ix, storage);
+    } else {
+      BrotliCompressFragmentTwoPass(
+          &data[WrapPosition(last_processed_pos_) & mask],
+          bytes, is_last,
+          command_buf_, literal_buf_,
+          table, table_size,
+          &storage_ix, storage);
+    }
+    last_byte_ = storage[storage_ix >> 3];
+    last_byte_bits_ = storage_ix & 7u;
+    last_processed_pos_ = input_pos_;
+    *output = &storage[0];
+    *out_size = storage_ix >> 3;
+    return true;
+  }
+
+  // Theoretical max number of commands is 1 per 2 bytes.
+  size_t newsize = num_commands_ + bytes / 2 + 1;
+  if (newsize > cmd_alloc_size_) {
+    // Reserve a bit more memory to allow merging with a next block
+    // without realloc: that would impact speed.
+    newsize += (bytes / 4) + 16;
+    cmd_alloc_size_ = newsize;
+    commands_ =
+        static_cast<Command*>(realloc(commands_, sizeof(Command) * newsize));
+  }
+
+  CreateBackwardReferences(bytes, WrapPosition(last_processed_pos_),
+                           is_last, data, mask,
+                           params_.quality,
+                           params_.lgwin,
+                           hashers_,
+                           hash_type_,
+                           dist_cache_,
+                           &last_insert_len_,
+                           &commands_[num_commands_],
+                           &num_commands_,
+                           &num_literals_);
+
+  size_t max_length = std::min<size_t>(mask + 1, 1u << kMaxInputBlockBits);
+  const size_t max_literals = max_length / 8;
+  const size_t max_commands = max_length / 8;
+  if (!is_last && !force_flush &&
+      (params_.quality >= kMinQualityForBlockSplit ||
+       (num_literals_ + num_commands_ < kMaxNumDelayedSymbols)) &&
+      num_literals_ < max_literals &&
+      num_commands_ < max_commands &&
+      input_pos_ + input_block_size() <= last_flush_pos_ + max_length) {
+    // Merge with next input block. Everything will happen later.
+    last_processed_pos_ = input_pos_;
+    *out_size = 0;
+    return true;
+  }
+
+  // Create the last insert-only command.
+  if (last_insert_len_ > 0) {
+    brotli::Command cmd(last_insert_len_);
+    commands_[num_commands_++] = cmd;
+    num_literals_ += last_insert_len_;
+    last_insert_len_ = 0;
+  }
+
+  if (!is_last && input_pos_ == last_flush_pos_) {
+    // We have no new input data and we don't have to finish the stream, so
+    // nothing to do.
+    *out_size = 0;
+    return true;
+  }
+  assert(input_pos_ >= last_flush_pos_);
+  assert(input_pos_ > last_flush_pos_ || is_last);
+  assert(input_pos_ - last_flush_pos_ <= 1u << 24);
+  const uint32_t metablock_size =
+      static_cast<uint32_t>(input_pos_ - last_flush_pos_);
+  const size_t max_out_size = 2 * metablock_size + 500;
+  uint8_t* storage = GetBrotliStorage(max_out_size);
+  storage[0] = last_byte_;
+  size_t storage_ix = last_byte_bits_;
+  bool font_mode = params_.mode == BrotliParams::MODE_FONT;
+  WriteMetaBlockInternal(
+      data, mask, last_flush_pos_, metablock_size, is_last, params_.quality,
+      font_mode, prev_byte_, prev_byte2_, num_literals_, num_commands_,
+      commands_, saved_dist_cache_, dist_cache_, &storage_ix, storage);
+  last_byte_ = storage[storage_ix >> 3];
+  last_byte_bits_ = storage_ix & 7u;
+  last_flush_pos_ = input_pos_;
+  last_processed_pos_ = input_pos_;
+  if (last_flush_pos_ > 0) {
+    prev_byte_ = data[(static_cast<uint32_t>(last_flush_pos_) - 1) & mask];
+  }
+  if (last_flush_pos_ > 1) {
+    prev_byte2_ = data[(static_cast<uint32_t>(last_flush_pos_) - 2) & mask];
+  }
+  num_commands_ = 0;
+  num_literals_ = 0;
+  // Save the state of the distance cache in case we need to restore it for
+  // emitting an uncompressed block.
+  memcpy(saved_dist_cache_, dist_cache_, sizeof(dist_cache_));
+  *output = &storage[0];
+  *out_size = storage_ix >> 3;
+  return true;
+}
+
+bool BrotliCompressor::WriteMetaBlock(const size_t input_size,
+                                      const uint8_t* input_buffer,
+                                      const bool is_last,
+                                      size_t* encoded_size,
+                                      uint8_t* encoded_buffer) {
+  CopyInputToRingBuffer(input_size, input_buffer);
+  size_t out_size = 0;
+  uint8_t* output;
+  if (!WriteBrotliData(is_last, /* force_flush = */ true, &out_size, &output) ||
+      out_size > *encoded_size) {
+    return false;
+  }
+  if (out_size > 0) {
+    memcpy(encoded_buffer, output, out_size);
+  }
+  *encoded_size = out_size;
+  return true;
+}
+
+bool BrotliCompressor::WriteMetadata(const size_t input_size,
+                                     const uint8_t* input_buffer,
+                                     const bool is_last,
+                                     size_t* encoded_size,
+                                     uint8_t* encoded_buffer) {
+  if (input_size > (1 << 24) || input_size + 6 > *encoded_size) {
+    return false;
+  }
+  uint64_t hdr_buffer_data[2];
+  uint8_t* hdr_buffer = reinterpret_cast<uint8_t*>(&hdr_buffer_data[0]);
+  size_t storage_ix = last_byte_bits_;
+  hdr_buffer[0] = last_byte_;
+  WriteBits(1, 0, &storage_ix, hdr_buffer);
+  WriteBits(2, 3, &storage_ix, hdr_buffer);
+  WriteBits(1, 0, &storage_ix, hdr_buffer);
+  if (input_size == 0) {
+    WriteBits(2, 0, &storage_ix, hdr_buffer);
+    *encoded_size = (storage_ix + 7u) >> 3;
+    memcpy(encoded_buffer, hdr_buffer, *encoded_size);
+  } else {
+    uint32_t nbits = (input_size == 1) ? 0 : (Log2FloorNonZero(
+        static_cast<uint32_t>(input_size) - 1) + 1);
+    uint32_t nbytes = (nbits + 7) / 8;
+    WriteBits(2, nbytes, &storage_ix, hdr_buffer);
+    WriteBits(8 * nbytes, input_size - 1, &storage_ix, hdr_buffer);
+    size_t hdr_size = (storage_ix + 7u) >> 3;
+    memcpy(encoded_buffer, hdr_buffer, hdr_size);
+    memcpy(&encoded_buffer[hdr_size], input_buffer, input_size);
+    *encoded_size = hdr_size + input_size;
+  }
+  if (is_last) {
+    encoded_buffer[(*encoded_size)++] = 3;
+  }
+  last_byte_ = 0;
+  last_byte_bits_ = 0;
+  return true;
+}
+
+bool BrotliCompressor::FinishStream(
+    size_t* encoded_size, uint8_t* encoded_buffer) {
+  return WriteMetaBlock(0, NULL, true, encoded_size, encoded_buffer);
+}
+
+static int BrotliCompressBufferQuality10(int lgwin,
+                                         size_t input_size,
+                                         const uint8_t* input_buffer,
+                                         size_t* encoded_size,
+                                         uint8_t* encoded_buffer) {
+  const size_t mask = std::numeric_limits<size_t>::max() >> 1;
+  assert(input_size <= mask + 1);
+  const size_t max_backward_limit = (1 << lgwin) - 16;
+  int dist_cache[4] = { 4, 11, 15, 16 };
+  int saved_dist_cache[4] = { 4, 11, 15, 16 };
+  int ok = 1;
+  const size_t max_out_size = *encoded_size;
+  size_t total_out_size = 0;
+  uint8_t last_byte;
+  uint8_t last_byte_bits;
+  EncodeWindowBits(lgwin, &last_byte, &last_byte_bits);
+
+  Hashers::H10* hasher = new Hashers::H10;
+  const size_t hasher_eff_size = std::min(input_size, max_backward_limit + 16);
+  hasher->Init(lgwin, 0, hasher_eff_size, true);
+
+  const int lgblock = std::min(18, lgwin);
+  const int lgmetablock = std::min(24, lgwin + 1);
+  const size_t max_block_size = static_cast<size_t>(1) << lgblock;
+  const size_t max_metablock_size = static_cast<size_t>(1) << lgmetablock;
+  const size_t max_literals_per_metablock = max_metablock_size / 8;
+  const size_t max_commands_per_metablock = max_metablock_size / 8;
+  size_t metablock_start = 0;
+  uint8_t prev_byte = 0;
+  uint8_t prev_byte2 = 0;
+  while (ok && metablock_start < input_size) {
+    const size_t metablock_end =
+        std::min(input_size, metablock_start + max_metablock_size);
+    const size_t expected_num_commands =
+        (metablock_end - metablock_start) / 12 + 16;
+    Command* commands = 0;
+    size_t num_commands = 0;
+    size_t last_insert_len = 0;
+    size_t num_literals = 0;
+    size_t metablock_size = 0;
+    size_t cmd_alloc_size = 0;
+
+    for (size_t block_start = metablock_start; block_start < metablock_end; ) {
+      size_t block_size = std::min(metablock_end - block_start, max_block_size);
+      ZopfliNode* nodes = new ZopfliNode[block_size + 1];
+      std::vector<uint32_t> path;
+      hasher->StitchToPreviousBlock(block_size, block_start,
+                                    input_buffer, mask);
+      ZopfliComputeShortestPath(block_size, block_start, input_buffer, mask,
+                                max_backward_limit, dist_cache,
+                                hasher, nodes, &path);
+      // We allocate a command buffer in the first iteration of this loop that
+      // will be likely big enough for the whole metablock, so that for most
+      // inputs we will not have to reallocate in later iterations. We do the
+      // allocation here and not before the loop, because if the input is small,
+      // this will be allocated after the zopfli cost model is freed, so this
+      // will not increase peak memory usage.
+      // TODO: If the first allocation is too small, increase command
+      // buffer size exponentially.
+      size_t new_cmd_alloc_size = std::max(expected_num_commands,
+                                           num_commands + path.size() + 1);
+      if (cmd_alloc_size != new_cmd_alloc_size) {
+        cmd_alloc_size = new_cmd_alloc_size;
+        commands = static_cast<Command*>(
+            realloc(commands, cmd_alloc_size * sizeof(Command)));
+      }
+      ZopfliCreateCommands(block_size, block_start, max_backward_limit, path,
+                           &nodes[0], dist_cache, &last_insert_len,
+                           &commands[num_commands], &num_literals);
+      num_commands += path.size();
+      block_start += block_size;
+      metablock_size += block_size;
+      delete[] nodes;
+      if (num_literals > max_literals_per_metablock ||
+          num_commands > max_commands_per_metablock) {
+        break;
+      }
+    }
+
+    if (last_insert_len > 0) {
+      Command cmd(last_insert_len);
+      commands[num_commands++] = cmd;
+      num_literals += last_insert_len;
+    }
+
+    const bool is_last = (metablock_start + metablock_size == input_size);
+    uint8_t* storage = NULL;
+    size_t storage_ix = last_byte_bits;
+
+    if (metablock_size == 0) {
+      // Write the ISLAST and ISEMPTY bits.
+      storage = new uint8_t[16];
+      storage[0] = last_byte;
+      WriteBits(2, 3, &storage_ix, storage);
+      storage_ix = (storage_ix + 7u) & ~7u;
+    } else if (!ShouldCompress(input_buffer, mask, metablock_start,
+                               metablock_size, num_literals, num_commands)) {
+      // Restore the distance cache, as its last update by
+      // CreateBackwardReferences is now unused.
+      memcpy(dist_cache, saved_dist_cache, 4 * sizeof(dist_cache[0]));
+      storage = new uint8_t[metablock_size + 16];
+      storage[0] = last_byte;
+      StoreUncompressedMetaBlock(is_last, input_buffer,
+                                 metablock_start, mask, metablock_size,
+                                 &storage_ix, storage);
+    } else {
+      uint32_t num_direct_distance_codes = 0;
+      uint32_t distance_postfix_bits = 0;
+      MetaBlockSplit mb;
+      ContextType literal_context_mode = CONTEXT_UTF8;
+      if (!IsMostlyUTF8(
+              input_buffer, metablock_start, mask, metablock_size,
+              kMinUTF8Ratio)) {
+        literal_context_mode = CONTEXT_SIGNED;
+      }
+      BuildMetaBlock(input_buffer, metablock_start, mask,
+                     prev_byte, prev_byte2,
+                     commands, num_commands,
+                     literal_context_mode,
+                     &mb);
+      OptimizeHistograms(num_direct_distance_codes,
+                         distance_postfix_bits,
+                         &mb);
+      const size_t max_out_metablock_size = 2 * metablock_size + 500;
+      storage = new uint8_t[max_out_metablock_size];
+      storage[0] = last_byte;
+      StoreMetaBlock(input_buffer, metablock_start, metablock_size, mask,
+                     prev_byte, prev_byte2,
+                     is_last,
+                     num_direct_distance_codes,
+                     distance_postfix_bits,
+                     literal_context_mode,
+                     commands, num_commands,
+                     mb,
+                     &storage_ix, storage);
+      if (metablock_size + 4 < (storage_ix >> 3)) {
+        // Restore the distance cache and last byte.
+        memcpy(dist_cache, saved_dist_cache, 4 * sizeof(dist_cache[0]));
+        storage[0] = last_byte;
+        storage_ix = last_byte_bits;
+        StoreUncompressedMetaBlock(is_last, input_buffer,
+                                   metablock_start, mask,
+                                   metablock_size, &storage_ix, storage);
+      }
+    }
+    last_byte = storage[storage_ix >> 3];
+    last_byte_bits = storage_ix & 7u;
+    metablock_start += metablock_size;
+    prev_byte = input_buffer[metablock_start - 1];
+    prev_byte2 = input_buffer[metablock_start - 2];
+    // Save the state of the distance cache in case we need to restore it for
+    // emitting an uncompressed block.
+    memcpy(saved_dist_cache, dist_cache, 4 * sizeof(dist_cache[0]));
+
+    const size_t out_size = storage_ix >> 3;
+    total_out_size += out_size;
+    if (total_out_size <= max_out_size) {
+      memcpy(encoded_buffer, storage, out_size);
+      encoded_buffer += out_size;
+    } else {
+      ok = 0;
+    }
+    delete[] storage;
+    free(commands);
+  }
+
+  *encoded_size = total_out_size;
+  delete hasher;
+  return ok;
+}
+
+int BrotliCompressBuffer(BrotliParams params,
+                         size_t input_size,
+                         const uint8_t* input_buffer,
+                         size_t* encoded_size,
+                         uint8_t* encoded_buffer) {
+  if (*encoded_size == 0) {
+    // Output buffer needs at least one byte.
+    return 0;
+  }
+  if (input_size == 0) {
+    // Handle the special case of empty input.
+    *encoded_size = 1;
+    *encoded_buffer = 6;
+    return 1;
+  }
+  if (params.quality == 10) {
+    // TODO: Implement this direct path for all quality levels.
+    const int lgwin = std::min(24, std::max(16, params.lgwin));
+    return BrotliCompressBufferQuality10(lgwin, input_size, input_buffer,
+                                         encoded_size, encoded_buffer);
+  }
+  BrotliMemIn in(input_buffer, input_size);
+  BrotliMemOut out(encoded_buffer, *encoded_size);
+  if (!BrotliCompress(params, &in, &out)) {
+    return 0;
+  }
+  *encoded_size = out.position();
+  return 1;
+}
+
+static bool BrotliInIsFinished(BrotliIn* r) {
+  size_t read_bytes;
+  return r->Read(0, &read_bytes) == NULL;
+}
+
+static const uint8_t* BrotliInReadAndCheckEnd(const size_t block_size,
+                                              BrotliIn* r,
+                                              size_t* bytes_read,
+                                              bool* is_last) {
+  *bytes_read = 0;
+  const uint8_t* data = reinterpret_cast<const uint8_t*>(
+      r->Read(block_size, bytes_read));
+  assert((data == NULL) == (*bytes_read == 0));
+  *is_last = BrotliInIsFinished(r);
+  return data;
+}
+
+static bool CopyOneBlockToRingBuffer(BrotliIn* r,
+                                     BrotliCompressor* compressor,
+                                     size_t* bytes_read,
+                                     bool* is_last) {
+  const size_t block_size = compressor->input_block_size();
+  const uint8_t* data = BrotliInReadAndCheckEnd(block_size, r,
+                                                bytes_read, is_last);
+  if (data == NULL) {
+    return *is_last;
+  }
+  compressor->CopyInputToRingBuffer(*bytes_read, data);
+
+  // Read more bytes until block_size is filled or an EOF (data == NULL) is
+  // received. This is useful to get deterministic compressed output for the
+  // same input no matter how r->Read splits the input to chunks.
+  for (size_t remaining = block_size - *bytes_read; remaining > 0; ) {
+    size_t more_bytes_read = 0;
+    data = BrotliInReadAndCheckEnd(remaining, r, &more_bytes_read, is_last);
+    if (data == NULL) {
+      return *is_last;
+    }
+    compressor->CopyInputToRingBuffer(more_bytes_read, data);
+    *bytes_read += more_bytes_read;
+    remaining -= more_bytes_read;
+  }
+  return true;
+}
+
+
+int BrotliCompress(BrotliParams params, BrotliIn* in, BrotliOut* out) {
+  return BrotliCompressWithCustomDictionary(0, 0, params, in, out);
+}
+
+// Reads the provided input in 'block_size' blocks. Only the last read can be
+// smaller than 'block_size'.
+class BrotliBlockReader {
+ public:
+  explicit BrotliBlockReader(size_t block_size)
+      : block_size_(block_size), buf_(NULL) {}
+  ~BrotliBlockReader(void) { delete[] buf_; }
+
+  const uint8_t* Read(BrotliIn* in, size_t* bytes_read, bool* is_last) {
+    *bytes_read = 0;
+    const uint8_t* data = BrotliInReadAndCheckEnd(block_size_, in,
+                                                  bytes_read, is_last);
+    if (data == NULL || *bytes_read == block_size_ || *is_last) {
+      // If we could get the whole block in one read, or it is the last block,
+      // we just return the pointer to the data without copying.
+      return data;
+    }
+    // If the data comes in smaller chunks, we need to copy it into an internal
+    // buffer until we get a whole block or reach the last chunk.
+    if (buf_ == NULL) {
+      buf_ = new uint8_t[block_size_];
+    }
+    memcpy(buf_, data, *bytes_read);
+    do {
+      size_t cur_bytes_read = 0;
+      data = BrotliInReadAndCheckEnd(block_size_ - *bytes_read, in,
+                                     &cur_bytes_read, is_last);
+      if (data == NULL) {
+        return *is_last ? buf_ : NULL;
+      }
+      memcpy(&buf_[*bytes_read], data, cur_bytes_read);
+      *bytes_read += cur_bytes_read;
+    } while (*bytes_read < block_size_ && !*is_last);
+    return buf_;
+  }
+
+ private:
+  const size_t block_size_;
+  uint8_t* buf_;
+};
+
+int BrotliCompressWithCustomDictionary(size_t dictsize, const uint8_t* dict,
+                                       BrotliParams params,
+                                       BrotliIn* in, BrotliOut* out) {
+  if (params.quality <= 1) {
+    const int quality = std::max(0, params.quality);
+    const int lgwin = std::min(kMaxWindowBits,
+                               std::max(kMinWindowBits, params.lgwin));
+    uint8_t* storage = NULL;
+    int* table = NULL;
+    uint32_t* command_buf = NULL;
+    uint8_t* literal_buf = NULL;
+    uint8_t cmd_depths[128];
+    uint16_t cmd_bits[128];
+    uint8_t cmd_code[512];
+    size_t cmd_code_numbits;
+    if (quality == 0) {
+      InitCommandPrefixCodes(cmd_depths, cmd_bits, cmd_code, &cmd_code_numbits);
+    }
+    uint8_t last_byte;
+    uint8_t last_byte_bits;
+    EncodeWindowBits(lgwin, &last_byte, &last_byte_bits);
+    BrotliBlockReader r(1u << lgwin);
+    int ok = 1;
+    bool is_last = false;
+    while (ok && !is_last) {
+      // Read next block of input.
+      size_t bytes;
+      const uint8_t* data = r.Read(in, &bytes, &is_last);
+      if (data == NULL) {
+        if (!is_last) {
+          ok = 0;
+          break;
+        }
+        assert(bytes == 0);
+      }
+      // Set up output storage.
+      const size_t max_out_size = 2 * bytes + 500;
+      if (storage == NULL) {
+        storage = new uint8_t[max_out_size];
+      }
+      storage[0] = last_byte;
+      size_t storage_ix = last_byte_bits;
+      // Set up hash table.
+      size_t htsize = HashTableSize(MaxHashTableSize(quality), bytes);
+      if (table == NULL) {
+        table = new int[htsize];
+      }
+      memset(table, 0, htsize * sizeof(table[0]));
+      // Set up command and literal buffers for two pass mode.
+      if (quality == 1 && command_buf == NULL) {
+        size_t buf_size = std::min(bytes, kCompressFragmentTwoPassBlockSize);
+        command_buf = new uint32_t[buf_size];
+        literal_buf = new uint8_t[buf_size];
+      }
+      // Do the actual compression.
+      if (quality == 0) {
+        BrotliCompressFragmentFast(data, bytes, is_last, table, htsize,
+                                   cmd_depths, cmd_bits,
+                                   &cmd_code_numbits, cmd_code,
+                                   &storage_ix, storage);
+      } else {
+        BrotliCompressFragmentTwoPass(data, bytes, is_last,
+                                      command_buf, literal_buf,
+                                      table, htsize,
+                                      &storage_ix, storage);
+      }
+      // Save last bytes to stitch it together with the next output block.
+      last_byte = storage[storage_ix >> 3];
+      last_byte_bits = storage_ix & 7u;
+      // Write output block.
+      size_t out_bytes = storage_ix >> 3;
+      if (out_bytes > 0 && !out->Write(storage, out_bytes)) {
+        ok = 0;
+        break;
+      }
+    }
+    delete[] storage;
+    delete[] table;
+    delete[] command_buf;
+    delete[] literal_buf;
+    return ok;
+  }
+
+  size_t in_bytes = 0;
+  size_t out_bytes = 0;
+  uint8_t* output;
+  bool final_block = false;
+  BrotliCompressor compressor(params);
+  if (dictsize != 0) compressor.BrotliSetCustomDictionary(dictsize, dict);
+  while (!final_block) {
+    if (!CopyOneBlockToRingBuffer(in, &compressor, &in_bytes, &final_block)) {
+      return false;
+    }
+    out_bytes = 0;
+    if (!compressor.WriteBrotliData(final_block,
+                                    /* force_flush = */ false,
+                                    &out_bytes, &output)) {
+      return false;
+    }
+    if (out_bytes > 0 && !out->Write(output, out_bytes)) {
+      return false;
+    }
+  }
+  return true;
+}
+
+
+}  // namespace brotli
diff --git a/third_party/brotli/enc/encode.h b/third_party/brotli/enc/encode.h
new file mode 100644
index 0000000..a06aa40
--- /dev/null
+++ b/third_party/brotli/enc/encode.h
@@ -0,0 +1,207 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// API for Brotli compression
+
+#ifndef BROTLI_ENC_ENCODE_H_
+#define BROTLI_ENC_ENCODE_H_
+
+#include <string>
+#include <vector>
+#include "./command.h"
+#include "./hash.h"
+#include "./ringbuffer.h"
+#include "./static_dict.h"
+#include "./streams.h"
+#include "./types.h"
+
+namespace brotli {
+
+static const int kMaxWindowBits = 24;
+static const int kMinWindowBits = 10;
+static const int kMinInputBlockBits = 16;
+static const int kMaxInputBlockBits = 24;
+
+struct BrotliParams {
+  BrotliParams(void)
+      : mode(MODE_GENERIC),
+        quality(11),
+        lgwin(22),
+        lgblock(0),
+        enable_dictionary(true),
+        enable_transforms(false),
+        greedy_block_split(false),
+        enable_context_modeling(true) {}
+
+  enum Mode {
+    // Default compression mode. The compressor does not know anything in
+    // advance about the properties of the input.
+    MODE_GENERIC = 0,
+    // Compression mode for UTF-8 format text input.
+    MODE_TEXT = 1,
+    // Compression mode used in WOFF 2.0.
+    MODE_FONT = 2
+  };
+  Mode mode;
+
+  // Controls the compression-speed vs compression-density tradeoffs. The higher
+  // the quality, the slower the compression. Range is 0 to 11.
+  int quality;
+  // Base 2 logarithm of the sliding window size. Range is 10 to 24.
+  int lgwin;
+  // Base 2 logarithm of the maximum input block size. Range is 16 to 24.
+  // If set to 0, the value will be set based on the quality.
+  int lgblock;
+
+  // These settings are deprecated and will be ignored.
+  // All speed vs. size compromises are controlled by the quality param.
+  bool enable_dictionary;
+  bool enable_transforms;
+  bool greedy_block_split;
+  bool enable_context_modeling;
+};
+
+// An instance can not be reused for multiple brotli streams.
+class BrotliCompressor {
+ public:
+  explicit BrotliCompressor(BrotliParams params);
+  ~BrotliCompressor(void);
+
+  // The maximum input size that can be processed at once.
+  size_t input_block_size(void) const { return size_t(1) << params_.lgblock; }
+
+  // Encodes the data in input_buffer as a meta-block and writes it to
+  // encoded_buffer (*encoded_size should be set to the size of
+  // encoded_buffer) and sets *encoded_size to the number of bytes that
+  // was written. The input_size must be <= input_block_size().
+  // Returns 0 if there was an error and 1 otherwise.
+  bool WriteMetaBlock(const size_t input_size,
+                      const uint8_t* input_buffer,
+                      const bool is_last,
+                      size_t* encoded_size,
+                      uint8_t* encoded_buffer);
+
+  // Writes a metadata meta-block containing the given input to encoded_buffer.
+  // *encoded_size should be set to the size of the encoded_buffer.
+  // Sets *encoded_size to the number of bytes that was written.
+  // Note that the given input data will not be part of the sliding window and
+  // thus no backward references can be made to this data from subsequent
+  // metablocks.
+  bool WriteMetadata(const size_t input_size,
+                     const uint8_t* input_buffer,
+                     const bool is_last,
+                     size_t* encoded_size,
+                     uint8_t* encoded_buffer);
+
+  // Writes a zero-length meta-block with end-of-input bit set to the
+  // internal output buffer and copies the output buffer to encoded_buffer
+  // (*encoded_size should be set to the size of encoded_buffer) and sets
+  // *encoded_size to the number of bytes written. Returns false if there was
+  // an error and true otherwise.
+  bool FinishStream(size_t* encoded_size, uint8_t* encoded_buffer);
+
+  // Copies the given input data to the internal ring buffer of the compressor.
+  // No processing of the data occurs at this time and this function can be
+  // called multiple times before calling WriteBrotliData() to process the
+  // accumulated input. At most input_block_size() bytes of input data can be
+  // copied to the ring buffer, otherwise the next WriteBrotliData() will fail.
+  void CopyInputToRingBuffer(const size_t input_size,
+                             const uint8_t* input_buffer);
+
+  // Processes the accumulated input data and sets *out_size to the length of
+  // the new output meta-block, or to zero if no new output meta-block was
+  // created (in this case the processed input data is buffered internally).
+  // If *out_size is positive, *output points to the start of the output data.
+  // If is_last or force_flush is true, an output meta-block is always created.
+  // Returns false if the size of the input data is larger than
+  // input_block_size().
+  bool WriteBrotliData(const bool is_last, const bool force_flush,
+                       size_t* out_size, uint8_t** output);
+
+  // Fills the new state with a dictionary for LZ77, warming up the ringbuffer,
+  // e.g. for custom static dictionaries for data formats.
+  // Not to be confused with the built-in transformable dictionary of Brotli.
+  // To decode, use BrotliSetCustomDictionary of the decoder with the same
+  // dictionary.
+  void BrotliSetCustomDictionary(size_t size, const uint8_t* dict);
+
+  // No-op, but we keep it here for API backward-compatibility.
+  void WriteStreamHeader(void) {}
+
+ private:
+  uint8_t* GetBrotliStorage(size_t size);
+
+  // Allocates and clears a hash table using memory in "*this",
+  // stores the number of buckets in "*table_size" and returns a pointer to
+  // the base of the hash table.
+  int* GetHashTable(int quality,
+                    size_t input_size, size_t* table_size);
+
+  BrotliParams params_;
+  Hashers* hashers_;
+  int hash_type_;
+  uint64_t input_pos_;
+  RingBuffer* ringbuffer_;
+  size_t cmd_alloc_size_;
+  Command* commands_;
+  size_t num_commands_;
+  size_t num_literals_;
+  size_t last_insert_len_;
+  uint64_t last_flush_pos_;
+  uint64_t last_processed_pos_;
+  int dist_cache_[4];
+  int saved_dist_cache_[4];
+  uint8_t last_byte_;
+  uint8_t last_byte_bits_;
+  uint8_t prev_byte_;
+  uint8_t prev_byte2_;
+  size_t storage_size_;
+  uint8_t* storage_;
+  // Hash table for quality 0 mode.
+  int small_table_[1 << 10];  // 2KB
+  int* large_table_;          // Allocated only when needed
+  // Command and distance prefix codes (each 64 symbols, stored back-to-back)
+  // used for the next block in quality 0. The command prefix code is over a
+  // smaller alphabet with the following 64 symbols:
+  //    0 - 15: insert length code 0, copy length code 0 - 15, same distance
+  //   16 - 39: insert length code 0, copy length code 0 - 23
+  //   40 - 63: insert length code 0 - 23, copy length code 0
+  // Note that symbols 16 and 40 represent the same code in the full alphabet,
+  // but we do not use either of them in quality 0.
+  uint8_t cmd_depths_[128];
+  uint16_t cmd_bits_[128];
+  // The compressed form of the command and distance prefix codes for the next
+  // block in quality 0.
+  uint8_t cmd_code_[512];
+  size_t cmd_code_numbits_;
+  // Command and literal buffers for quality 1.
+  uint32_t* command_buf_;
+  uint8_t* literal_buf_;
+};
+
+// Compresses the data in input_buffer into encoded_buffer, and sets
+// *encoded_size to the compressed length.
+// Returns 0 if there was an error and 1 otherwise.
+int BrotliCompressBuffer(BrotliParams params,
+                         size_t input_size,
+                         const uint8_t* input_buffer,
+                         size_t* encoded_size,
+                         uint8_t* encoded_buffer);
+
+// Same as above, but uses the specified input and output classes instead
+// of reading from and writing to pre-allocated memory buffers.
+int BrotliCompress(BrotliParams params, BrotliIn* in, BrotliOut* out);
+
+// Before compressing the data, sets a custom LZ77 dictionary with
+// BrotliCompressor::BrotliSetCustomDictionary.
+int BrotliCompressWithCustomDictionary(size_t dictsize, const uint8_t* dict,
+                                       BrotliParams params,
+                                       BrotliIn* in, BrotliOut* out);
+
+
+}  // namespace brotli
+
+#endif  // BROTLI_ENC_ENCODE_H_
diff --git a/third_party/brotli/enc/encode_parallel.cc b/third_party/brotli/enc/encode_parallel.cc
new file mode 100644
index 0000000..cbad9754
--- /dev/null
+++ b/third_party/brotli/enc/encode_parallel.cc
@@ -0,0 +1,279 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Implementation of parallel Brotli compressor.
+
+#include "./encode_parallel.h"
+
+#include <algorithm>
+#include <limits>
+
+#include "./backward_references.h"
+#include "./bit_cost.h"
+#include "./block_splitter.h"
+#include "./brotli_bit_stream.h"
+#include "./cluster.h"
+#include "./context.h"
+#include "./metablock.h"
+#include "./transform.h"
+#include "./entropy_encode.h"
+#include "./fast_log.h"
+#include "./hash.h"
+#include "./histogram.h"
+#include "./prefix.h"
+#include "./utf8_util.h"
+#include "./write_bits.h"
+
+namespace brotli {
+
+namespace {
+
+void RecomputeDistancePrefixes(Command* cmds, size_t num_commands,
+                               uint32_t num_direct_distance_codes,
+                               uint32_t distance_postfix_bits) {
+  if (num_direct_distance_codes == 0 &&
+      distance_postfix_bits == 0) {
+    return;
+  }
+  for (size_t i = 0; i < num_commands; ++i) {
+    Command* cmd = &cmds[i];
+    if (cmd->copy_len() && cmd->cmd_prefix_ >= 128) {
+      PrefixEncodeCopyDistance(cmd->DistanceCode(),
+                               num_direct_distance_codes,
+                               distance_postfix_bits,
+                               &cmd->dist_prefix_,
+                               &cmd->dist_extra_);
+    }
+  }
+}
+
+bool WriteMetaBlockParallel(const BrotliParams& params,
+                            const uint32_t input_size,
+                            const uint8_t* input_buffer,
+                            const uint32_t prefix_size,
+                            const uint8_t* prefix_buffer,
+                            const bool is_first,
+                            const bool is_last,
+                            size_t* encoded_size,
+                            uint8_t* encoded_buffer) {
+  if (input_size == 0) {
+    return false;
+  }
+
+  // Copy prefix + next input block into a continuous area.
+  uint32_t input_pos = prefix_size;
+  // CreateBackwardReferences reads up to 3 bytes past the end of input if the
+  // mask points past the end of input.
+  // FindMatchLengthWithLimit could do another 8 bytes look-forward.
+  std::vector<uint8_t> input(prefix_size + input_size + 4 + 8);
+  memcpy(&input[0], prefix_buffer, prefix_size);
+  memcpy(&input[input_pos], input_buffer, input_size);
+  // Since we don't have a ringbuffer, masking is a no-op.
+  // We use one less bit than the full range because some of the code uses
+  // mask + 1 as the size of the ringbuffer.
+  const uint32_t mask = std::numeric_limits<uint32_t>::max() >> 1;
+
+  uint8_t prev_byte = input_pos > 0 ? input[(input_pos - 1) & mask] : 0;
+  uint8_t prev_byte2 = input_pos > 1 ? input[(input_pos - 2) & mask] : 0;
+
+  // Decide about UTF8 mode.
+  static const double kMinUTF8Ratio = 0.75;
+  bool utf8_mode = IsMostlyUTF8(&input[0], input_pos, mask, input_size,
+                                kMinUTF8Ratio);
+
+  // Initialize hashers.
+  int hash_type = std::min(10, params.quality);
+  Hashers* hashers = new Hashers();
+  hashers->Init(hash_type);
+
+  // Compute backward references.
+  size_t last_insert_len = 0;
+  size_t num_commands = 0;
+  size_t num_literals = 0;
+  int dist_cache[4] = { -4, -4, -4, -4 };
+  Command* commands = static_cast<Command*>(
+      malloc(sizeof(Command) * ((input_size + 1) >> 1)));
+  if (commands == 0) {
+    delete hashers;
+    return false;
+  }
+  CreateBackwardReferences(
+      input_size, input_pos, is_last,
+      &input[0], mask,
+      params.quality,
+      params.lgwin,
+      hashers,
+      hash_type,
+      dist_cache,
+      &last_insert_len,
+      commands,
+      &num_commands,
+      &num_literals);
+  delete hashers;
+  if (last_insert_len > 0) {
+    commands[num_commands++] = Command(last_insert_len);
+    num_literals += last_insert_len;
+  }
+  assert(num_commands != 0);
+
+  // Build the meta-block.
+  MetaBlockSplit mb;
+  uint32_t num_direct_distance_codes =
+      params.mode == BrotliParams::MODE_FONT ? 12 : 0;
+  uint32_t distance_postfix_bits =
+      params.mode == BrotliParams::MODE_FONT ? 1 : 0;
+  ContextType literal_context_mode = utf8_mode ? CONTEXT_UTF8 : CONTEXT_SIGNED;
+  RecomputeDistancePrefixes(commands, num_commands,
+                            num_direct_distance_codes,
+                            distance_postfix_bits);
+  if (params.quality <= 9) {
+    BuildMetaBlockGreedy(&input[0], input_pos, mask,
+                         commands, num_commands,
+                         &mb);
+  } else {
+    BuildMetaBlock(&input[0], input_pos, mask,
+                   prev_byte, prev_byte2,
+                   commands, num_commands,
+                   literal_context_mode,
+                   &mb);
+  }
+
+  // Set up the temporary output storage.
+  const size_t max_out_size = 2 * input_size + 500;
+  std::vector<uint8_t> storage(max_out_size);
+  uint8_t first_byte = 0;
+  size_t first_byte_bits = 0;
+  if (is_first) {
+    if (params.lgwin == 16) {
+      first_byte = 0;
+      first_byte_bits = 1;
+    } else if (params.lgwin == 17) {
+      first_byte = 1;
+      first_byte_bits = 7;
+    } else {
+      first_byte = static_cast<uint8_t>(((params.lgwin - 17) << 1) | 1);
+      first_byte_bits = 4;
+    }
+  }
+  storage[0] = static_cast<uint8_t>(first_byte);
+  size_t storage_ix = first_byte_bits;
+
+  // Store the meta-block to the temporary output.
+  StoreMetaBlock(&input[0], input_pos, input_size, mask,
+                 prev_byte, prev_byte2,
+                 is_last,
+                 num_direct_distance_codes,
+                 distance_postfix_bits,
+                 literal_context_mode,
+                 commands, num_commands,
+                 mb,
+                 &storage_ix, &storage[0]);
+  free(commands);
+
+  // If this is not the last meta-block, store an empty metadata
+  // meta-block so that the meta-block will end at a byte boundary.
+  if (!is_last) {
+    StoreSyncMetaBlock(&storage_ix, &storage[0]);
+  }
+
+  // If the compressed data is too large, fall back to an uncompressed
+  // meta-block.
+  size_t output_size = storage_ix >> 3;
+  if (input_size + 4 < output_size) {
+    storage[0] = static_cast<uint8_t>(first_byte);
+    storage_ix = first_byte_bits;
+    StoreUncompressedMetaBlock(is_last, &input[0], input_pos, mask,
+                               input_size,
+                               &storage_ix, &storage[0]);
+    output_size = storage_ix >> 3;
+  }
+
+  // Copy the temporary output with size-check to the output.
+  if (output_size > *encoded_size) {
+    return false;
+  }
+  memcpy(encoded_buffer, &storage[0], output_size);
+  *encoded_size = output_size;
+  return true;
+}
+
+}  // namespace
+
+int BrotliCompressBufferParallel(BrotliParams params,
+                                 size_t input_size,
+                                 const uint8_t* input_buffer,
+                                 size_t* encoded_size,
+                                 uint8_t* encoded_buffer) {
+  if (*encoded_size == 0) {
+    // Output buffer needs at least one byte.
+    return 0;
+  } else  if (input_size == 0) {
+    encoded_buffer[0] = 6;
+    *encoded_size = 1;
+    return 1;
+  }
+
+  // Sanitize params.
+  if (params.lgwin < kMinWindowBits) {
+    params.lgwin = kMinWindowBits;
+  } else if (params.lgwin > kMaxWindowBits) {
+    params.lgwin = kMaxWindowBits;
+  }
+  if (params.lgblock == 0) {
+    params.lgblock = 16;
+    if (params.quality >= 9 && params.lgwin > params.lgblock) {
+      params.lgblock = std::min(21, params.lgwin);
+    }
+  } else if (params.lgblock < kMinInputBlockBits) {
+    params.lgblock = kMinInputBlockBits;
+  } else if (params.lgblock > kMaxInputBlockBits) {
+    params.lgblock = kMaxInputBlockBits;
+  }
+  size_t max_input_block_size = 1 << params.lgblock;
+  size_t max_prefix_size = 1u << params.lgwin;
+
+  std::vector<std::vector<uint8_t> > compressed_pieces;
+
+  // Compress block-by-block independently.
+  for (size_t pos = 0; pos < input_size; ) {
+    uint32_t input_block_size =
+        static_cast<uint32_t>(std::min(max_input_block_size, input_size - pos));
+    uint32_t prefix_size =
+        static_cast<uint32_t>(std::min(max_prefix_size, pos));
+    size_t out_size = input_block_size + (input_block_size >> 3) + 1024;
+    std::vector<uint8_t> out(out_size);
+    if (!WriteMetaBlockParallel(params,
+                                input_block_size,
+                                &input_buffer[pos],
+                                prefix_size,
+                                &input_buffer[pos - prefix_size],
+                                pos == 0,
+                                pos + input_block_size == input_size,
+                                &out_size,
+                                &out[0])) {
+      return false;
+    }
+    out.resize(out_size);
+    compressed_pieces.push_back(out);
+    pos += input_block_size;
+  }
+
+  // Piece together the output.
+  size_t out_pos = 0;
+  for (size_t i = 0; i < compressed_pieces.size(); ++i) {
+    const std::vector<uint8_t>& out = compressed_pieces[i];
+    if (out_pos + out.size() > *encoded_size) {
+      return false;
+    }
+    memcpy(&encoded_buffer[out_pos], &out[0], out.size());
+    out_pos += out.size();
+  }
+  *encoded_size = out_pos;
+
+  return true;
+}
+
+}  // namespace brotli
diff --git a/third_party/brotli/enc/encode_parallel.h b/third_party/brotli/enc/encode_parallel.h
new file mode 100644
index 0000000..8d637b7
--- /dev/null
+++ b/third_party/brotli/enc/encode_parallel.h
@@ -0,0 +1,28 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// API for parallel Brotli compression
+// Note that this is only a proof of concept currently and not part of the
+// final API yet.
+
+#ifndef BROTLI_ENC_ENCODE_PARALLEL_H_
+#define BROTLI_ENC_ENCODE_PARALLEL_H_
+
+
+#include "./encode.h"
+#include "./types.h"
+
+namespace brotli {
+
+int BrotliCompressBufferParallel(BrotliParams params,
+                                 size_t input_size,
+                                 const uint8_t* input_buffer,
+                                 size_t* encoded_size,
+                                 uint8_t* encoded_buffer);
+
+}  // namespace brotli
+
+#endif  // BROTLI_ENC_ENCODE_PARALLEL_H_
diff --git a/third_party/brotli/enc/entropy_encode.cc b/third_party/brotli/enc/entropy_encode.cc
new file mode 100644
index 0000000..f18355d8
--- /dev/null
+++ b/third_party/brotli/enc/entropy_encode.cc
@@ -0,0 +1,480 @@
+/* Copyright 2010 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Entropy encoding (Huffman) utilities.
+
+#include "./entropy_encode.h"
+
+#include <algorithm>
+#include <limits>
+#include <cstdlib>
+
+#include "./histogram.h"
+#include "./port.h"
+#include "./types.h"
+
+namespace brotli {
+
+void SetDepth(const HuffmanTree &p,
+              HuffmanTree *pool,
+              uint8_t *depth,
+              uint8_t level) {
+  if (p.index_left_ >= 0) {
+    ++level;
+    SetDepth(pool[p.index_left_], pool, depth, level);
+    SetDepth(pool[p.index_right_or_value_], pool, depth, level);
+  } else {
+    depth[p.index_right_or_value_] = level;
+  }
+}
+
+// Sort the root nodes, least popular first.
+static inline bool SortHuffmanTree(const HuffmanTree& v0,
+                                   const HuffmanTree& v1) {
+  if (v0.total_count_ != v1.total_count_) {
+    return v0.total_count_ < v1.total_count_;
+  }
+  return v0.index_right_or_value_ > v1.index_right_or_value_;
+}
+
+// This function will create a Huffman tree.
+//
+// The catch here is that the tree cannot be arbitrarily deep.
+// Brotli specifies a maximum depth of 15 bits for "code trees"
+// and 7 bits for "code length code trees."
+//
+// count_limit is the value that is to be faked as the minimum value
+// and this minimum value is raised until the tree matches the
+// maximum length requirement.
+//
+// This algorithm is not of excellent performance for very long data blocks,
+// especially when population counts are longer than 2**tree_limit, but
+// we are not planning to use this with extremely long blocks.
+//
+// See http://en.wikipedia.org/wiki/Huffman_coding
+void CreateHuffmanTree(const uint32_t *data,
+                       const size_t length,
+                       const int tree_limit,
+                       HuffmanTree* tree,
+                       uint8_t *depth) {
+  // For block sizes below 64 kB, we never need to do a second iteration
+  // of this loop. Probably all of our block sizes will be smaller than
+  // that, so this loop is mostly of academic interest. If we actually
+  // would need this, we would be better off with the Katajainen algorithm.
+  for (uint32_t count_limit = 1; ; count_limit *= 2) {
+    size_t n = 0;
+    for (size_t i = length; i != 0;) {
+      --i;
+      if (data[i]) {
+        const uint32_t count = std::max(data[i], count_limit);
+        tree[n++] = HuffmanTree(count, -1, static_cast<int16_t>(i));
+      }
+    }
+
+    if (n == 1) {
+      depth[tree[0].index_right_or_value_] = 1;      // Only one element.
+      break;
+    }
+
+    std::sort(tree, tree + n, SortHuffmanTree);
+
+    // The nodes are:
+    // [0, n): the sorted leaf nodes that we start with.
+    // [n]: we add a sentinel here.
+    // [n + 1, 2n): new parent nodes are added here, starting from
+    //              (n+1). These are naturally in ascending order.
+    // [2n]: we add a sentinel at the end as well.
+    // There will be (2n+1) elements at the end.
+    const HuffmanTree sentinel(std::numeric_limits<uint32_t>::max(), -1, -1);
+    tree[n] = sentinel;
+    tree[n + 1] = sentinel;
+
+    size_t i = 0;      // Points to the next leaf node.
+    size_t j = n + 1;  // Points to the next non-leaf node.
+    for (size_t k = n - 1; k != 0; --k) {
+      size_t left, right;
+      if (tree[i].total_count_ <= tree[j].total_count_) {
+        left = i;
+        ++i;
+      } else {
+        left = j;
+        ++j;
+      }
+      if (tree[i].total_count_ <= tree[j].total_count_) {
+        right = i;
+        ++i;
+      } else {
+        right = j;
+        ++j;
+      }
+
+      // The sentinel node becomes the parent node.
+      size_t j_end = 2 * n - k;
+      tree[j_end].total_count_ =
+          tree[left].total_count_ + tree[right].total_count_;
+      tree[j_end].index_left_ = static_cast<int16_t>(left);
+      tree[j_end].index_right_or_value_ = static_cast<int16_t>(right);
+
+      // Add back the last sentinel node.
+      tree[j_end + 1] = sentinel;
+    }
+    SetDepth(tree[2 * n - 1], &tree[0], depth, 0);
+
+    // We need to pack the Huffman tree in tree_limit bits.
+    // If this was not successful, add fake entities to the lowest values
+    // and retry.
+    if (*std::max_element(&depth[0], &depth[length]) <= tree_limit) {
+      break;
+    }
+  }
+}
+
+static void Reverse(uint8_t* v, size_t start, size_t end) {
+  --end;
+  while (start < end) {
+    uint8_t tmp = v[start];
+    v[start] = v[end];
+    v[end] = tmp;
+    ++start;
+    --end;
+  }
+}
+
+static void WriteHuffmanTreeRepetitions(
+    const uint8_t previous_value,
+    const uint8_t value,
+    size_t repetitions,
+    size_t* tree_size,
+    uint8_t* tree,
+    uint8_t* extra_bits_data) {
+  assert(repetitions > 0);
+  if (previous_value != value) {
+    tree[*tree_size] = value;
+    extra_bits_data[*tree_size] = 0;
+    ++(*tree_size);
+    --repetitions;
+  }
+  if (repetitions == 7) {
+    tree[*tree_size] = value;
+    extra_bits_data[*tree_size] = 0;
+    ++(*tree_size);
+    --repetitions;
+  }
+  if (repetitions < 3) {
+    for (size_t i = 0; i < repetitions; ++i) {
+      tree[*tree_size] = value;
+      extra_bits_data[*tree_size] = 0;
+      ++(*tree_size);
+    }
+  } else {
+    repetitions -= 3;
+    size_t start = *tree_size;
+    while (true) {
+      tree[*tree_size] = 16;
+      extra_bits_data[*tree_size] = repetitions & 0x3;
+      ++(*tree_size);
+      repetitions >>= 2;
+      if (repetitions == 0) {
+        break;
+      }
+      --repetitions;
+    }
+    Reverse(tree, start, *tree_size);
+    Reverse(extra_bits_data, start, *tree_size);
+  }
+}
+
+static void WriteHuffmanTreeRepetitionsZeros(
+    size_t repetitions,
+    size_t* tree_size,
+    uint8_t* tree,
+    uint8_t* extra_bits_data) {
+  if (repetitions == 11) {
+    tree[*tree_size] = 0;
+    extra_bits_data[*tree_size] = 0;
+    ++(*tree_size);
+    --repetitions;
+  }
+  if (repetitions < 3) {
+    for (size_t i = 0; i < repetitions; ++i) {
+      tree[*tree_size] = 0;
+      extra_bits_data[*tree_size] = 0;
+      ++(*tree_size);
+    }
+  } else {
+    repetitions -= 3;
+    size_t start = *tree_size;
+    while (true) {
+      tree[*tree_size] = 17;
+      extra_bits_data[*tree_size] = repetitions & 0x7;
+      ++(*tree_size);
+      repetitions >>= 3;
+      if (repetitions == 0) {
+        break;
+      }
+      --repetitions;
+    }
+    Reverse(tree, start, *tree_size);
+    Reverse(extra_bits_data, start, *tree_size);
+  }
+}
+
+void OptimizeHuffmanCountsForRle(size_t length, uint32_t* counts,
+                                 uint8_t* good_for_rle) {
+  size_t nonzero_count = 0;
+  size_t stride;
+  size_t limit;
+  size_t sum;
+  const size_t streak_limit = 1240;
+  // Let's make the Huffman code more compatible with rle encoding.
+  size_t i;
+  for (i = 0; i < length; i++) {
+    if (counts[i]) {
+      ++nonzero_count;
+    }
+  }
+  if (nonzero_count < 16) {
+    return;
+  }
+  while (length != 0 && counts[length - 1] == 0) {
+    --length;
+  }
+  if (length == 0) {
+    return;  // All zeros.
+  }
+  // Now counts[0..length - 1] does not have trailing zeros.
+  {
+    size_t nonzeros = 0;
+    uint32_t smallest_nonzero = 1 << 30;
+    for (i = 0; i < length; ++i) {
+      if (counts[i] != 0) {
+        ++nonzeros;
+        if (smallest_nonzero > counts[i]) {
+          smallest_nonzero = counts[i];
+        }
+      }
+    }
+    if (nonzeros < 5) {
+      // Small histogram will model it well.
+      return;
+    }
+    size_t zeros = length - nonzeros;
+    if (smallest_nonzero < 4) {
+      if (zeros < 6) {
+        for (i = 1; i < length - 1; ++i) {
+          if (counts[i - 1] != 0 && counts[i] == 0 && counts[i + 1] != 0) {
+            counts[i] = 1;
+          }
+        }
+      }
+    }
+    if (nonzeros < 28) {
+      return;
+    }
+  }
+  // 2) Let's mark all population counts that already can be encoded
+  // with an rle code.
+  memset(good_for_rle, 0, length);
+  {
+    // Let's not spoil any of the existing good rle codes.
+    // Mark any seq of 0's that is longer as 5 as a good_for_rle.
+    // Mark any seq of non-0's that is longer as 7 as a good_for_rle.
+    uint32_t symbol = counts[0];
+    size_t step = 0;
+    for (i = 0; i <= length; ++i) {
+      if (i == length || counts[i] != symbol) {
+        if ((symbol == 0 && step >= 5) ||
+            (symbol != 0 && step >= 7)) {
+          size_t k;
+          for (k = 0; k < step; ++k) {
+            good_for_rle[i - k - 1] = 1;
+          }
+        }
+        step = 1;
+        if (i != length) {
+          symbol = counts[i];
+        }
+      } else {
+        ++step;
+      }
+    }
+  }
+  // 3) Let's replace those population counts that lead to more rle codes.
+  // Math here is in 24.8 fixed point representation.
+  stride = 0;
+  limit = 256 * (counts[0] + counts[1] + counts[2]) / 3 + 420;
+  sum = 0;
+  for (i = 0; i <= length; ++i) {
+    if (i == length || good_for_rle[i] ||
+        (i != 0 && good_for_rle[i - 1]) ||
+        (256 * counts[i] - limit + streak_limit) >= 2 * streak_limit) {
+      if (stride >= 4 || (stride >= 3 && sum == 0)) {
+        size_t k;
+        // The stride must end, collapse what we have, if we have enough (4).
+        size_t count = (sum + stride / 2) / stride;
+        if (count == 0) {
+          count = 1;
+        }
+        if (sum == 0) {
+          // Don't make an all zeros stride to be upgraded to ones.
+          count = 0;
+        }
+        for (k = 0; k < stride; ++k) {
+          // We don't want to change value at counts[i],
+          // that is already belonging to the next stride. Thus - 1.
+          counts[i - k - 1] = static_cast<uint32_t>(count);
+        }
+      }
+      stride = 0;
+      sum = 0;
+      if (i < length - 2) {
+        // All interesting strides have a count of at least 4,
+        // at least when non-zeros.
+        limit = 256 * (counts[i] + counts[i + 1] + counts[i + 2]) / 3 + 420;
+      } else if (i < length) {
+        limit = 256 * counts[i];
+      } else {
+        limit = 0;
+      }
+    }
+    ++stride;
+    if (i != length) {
+      sum += counts[i];
+      if (stride >= 4) {
+        limit = (256 * sum + stride / 2) / stride;
+      }
+      if (stride == 4) {
+        limit += 120;
+      }
+    }
+  }
+}
+
+static void DecideOverRleUse(const uint8_t* depth, const size_t length,
+                             bool *use_rle_for_non_zero,
+                             bool *use_rle_for_zero) {
+  size_t total_reps_zero = 0;
+  size_t total_reps_non_zero = 0;
+  size_t count_reps_zero = 1;
+  size_t count_reps_non_zero = 1;
+  for (size_t i = 0; i < length;) {
+    const uint8_t value = depth[i];
+    size_t reps = 1;
+    for (size_t k = i + 1; k < length && depth[k] == value; ++k) {
+      ++reps;
+    }
+    if (reps >= 3 && value == 0) {
+      total_reps_zero += reps;
+      ++count_reps_zero;
+    }
+    if (reps >= 4 && value != 0) {
+      total_reps_non_zero += reps;
+      ++count_reps_non_zero;
+    }
+    i += reps;
+  }
+  *use_rle_for_non_zero = total_reps_non_zero > count_reps_non_zero * 2;
+  *use_rle_for_zero = total_reps_zero > count_reps_zero * 2;
+}
+
+void WriteHuffmanTree(const uint8_t* depth,
+                      size_t length,
+                      size_t* tree_size,
+                      uint8_t* tree,
+                      uint8_t* extra_bits_data) {
+  uint8_t previous_value = 8;
+
+  // Throw away trailing zeros.
+  size_t new_length = length;
+  for (size_t i = 0; i < length; ++i) {
+    if (depth[length - i - 1] == 0) {
+      --new_length;
+    } else {
+      break;
+    }
+  }
+
+  // First gather statistics on if it is a good idea to do rle.
+  bool use_rle_for_non_zero = false;
+  bool use_rle_for_zero = false;
+  if (length > 50) {
+    // Find rle coding for longer codes.
+    // Shorter codes seem not to benefit from rle.
+    DecideOverRleUse(depth, new_length,
+                     &use_rle_for_non_zero, &use_rle_for_zero);
+  }
+
+  // Actual rle coding.
+  for (size_t i = 0; i < new_length;) {
+    const uint8_t value = depth[i];
+    size_t reps = 1;
+    if ((value != 0 && use_rle_for_non_zero) ||
+        (value == 0 && use_rle_for_zero)) {
+      for (size_t k = i + 1; k < new_length && depth[k] == value; ++k) {
+        ++reps;
+      }
+    }
+    if (value == 0) {
+      WriteHuffmanTreeRepetitionsZeros(reps, tree_size, tree, extra_bits_data);
+    } else {
+      WriteHuffmanTreeRepetitions(previous_value,
+                                  value, reps, tree_size,
+                                  tree, extra_bits_data);
+      previous_value = value;
+    }
+    i += reps;
+  }
+}
+
+namespace {
+
+uint16_t ReverseBits(int num_bits, uint16_t bits) {
+  static const size_t kLut[16] = {  // Pre-reversed 4-bit values.
+    0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe,
+    0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7, 0xf
+  };
+  size_t retval = kLut[bits & 0xf];
+  for (int i = 4; i < num_bits; i += 4) {
+    retval <<= 4;
+    bits = static_cast<uint16_t>(bits >> 4);
+    retval |= kLut[bits & 0xf];
+  }
+  retval >>= (-num_bits & 0x3);
+  return static_cast<uint16_t>(retval);
+}
+
+}  // namespace
+
+void ConvertBitDepthsToSymbols(const uint8_t *depth,
+                               size_t len,
+                               uint16_t *bits) {
+  // In Brotli, all bit depths are [1..15]
+  // 0 bit depth means that the symbol does not exist.
+  const int kMaxBits = 16;  // 0..15 are values for bits
+  uint16_t bl_count[kMaxBits] = { 0 };
+  {
+    for (size_t i = 0; i < len; ++i) {
+      ++bl_count[depth[i]];
+    }
+    bl_count[0] = 0;
+  }
+  uint16_t next_code[kMaxBits];
+  next_code[0] = 0;
+  {
+    int code = 0;
+    for (int bits = 1; bits < kMaxBits; ++bits) {
+      code = (code + bl_count[bits - 1]) << 1;
+      next_code[bits] = static_cast<uint16_t>(code);
+    }
+  }
+  for (size_t i = 0; i < len; ++i) {
+    if (depth[i]) {
+      bits[i] = ReverseBits(depth[i], next_code[depth[i]]++);
+    }
+  }
+}
+
+}  // namespace brotli
diff --git a/third_party/brotli/enc/entropy_encode.h b/third_party/brotli/enc/entropy_encode.h
new file mode 100644
index 0000000..090f954
--- /dev/null
+++ b/third_party/brotli/enc/entropy_encode.h
@@ -0,0 +1,104 @@
+/* Copyright 2010 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Entropy encoding (Huffman) utilities.
+
+#ifndef BROTLI_ENC_ENTROPY_ENCODE_H_
+#define BROTLI_ENC_ENTROPY_ENCODE_H_
+
+#include <string.h>
+#include "./histogram.h"
+#include "./prefix.h"
+#include "./types.h"
+
+namespace brotli {
+
+// A node of a Huffman tree.
+struct HuffmanTree {
+  HuffmanTree() {}
+  HuffmanTree(uint32_t count, int16_t left, int16_t right)
+      : total_count_(count),
+        index_left_(left),
+        index_right_or_value_(right) {
+  }
+  uint32_t total_count_;
+  int16_t index_left_;
+  int16_t index_right_or_value_;
+};
+
+void SetDepth(const HuffmanTree &p, HuffmanTree *pool,
+              uint8_t *depth, uint8_t level);
+
+// This function will create a Huffman tree.
+//
+// The (data,length) contains the population counts.
+// The tree_limit is the maximum bit depth of the Huffman codes.
+//
+// The depth contains the tree, i.e., how many bits are used for
+// the symbol.
+//
+// The actual Huffman tree is constructed in the tree[] array, which has to
+// be at least 2 * length + 1 long.
+//
+// See http://en.wikipedia.org/wiki/Huffman_coding
+void CreateHuffmanTree(const uint32_t *data,
+                       const size_t length,
+                       const int tree_limit,
+                       HuffmanTree* tree,
+                       uint8_t *depth);
+
+// Change the population counts in a way that the consequent
+// Huffman tree compression, especially its rle-part will be more
+// likely to compress this data more efficiently.
+//
+// length contains the size of the histogram.
+// counts contains the population counts.
+// good_for_rle is a buffer of at least length size
+void OptimizeHuffmanCountsForRle(size_t length, uint32_t* counts,
+                                 uint8_t* good_for_rle);
+
+// Write a Huffman tree from bit depths into the bitstream representation
+// of a Huffman tree. The generated Huffman tree is to be compressed once
+// more using a Huffman tree
+void WriteHuffmanTree(const uint8_t* depth,
+                      size_t num,
+                      size_t* tree_size,
+                      uint8_t* tree,
+                      uint8_t* extra_bits_data);
+
+// Get the actual bit values for a tree of bit depths.
+void ConvertBitDepthsToSymbols(const uint8_t *depth,
+                               size_t len,
+                               uint16_t *bits);
+
+template<int kSize>
+struct EntropyCode {
+  // How many bits for symbol.
+  uint8_t depth_[kSize];
+  // Actual bits used to represent the symbol.
+  uint16_t bits_[kSize];
+  // How many non-zero depth.
+  int count_;
+  // First four symbols with non-zero depth.
+  int symbols_[4];
+};
+
+static const int kCodeLengthCodes = 18;
+
+// Literal entropy code.
+typedef EntropyCode<256> EntropyCodeLiteral;
+// Prefix entropy codes.
+typedef EntropyCode<kNumCommandPrefixes> EntropyCodeCommand;
+typedef EntropyCode<kNumDistancePrefixes> EntropyCodeDistance;
+typedef EntropyCode<kNumBlockLenPrefixes> EntropyCodeBlockLength;
+// Context map entropy code, 256 Huffman tree indexes + 16 run length codes.
+typedef EntropyCode<272> EntropyCodeContextMap;
+// Block type entropy code, 256 block types + 2 special symbols.
+typedef EntropyCode<258> EntropyCodeBlockType;
+
+}  // namespace brotli
+
+#endif  // BROTLI_ENC_ENTROPY_ENCODE_H_
diff --git a/third_party/brotli/enc/entropy_encode_static.h b/third_party/brotli/enc/entropy_encode_static.h
new file mode 100644
index 0000000..d21f3b5
--- /dev/null
+++ b/third_party/brotli/enc/entropy_encode_static.h
@@ -0,0 +1,572 @@
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Static entropy codes used for faster meta-block encoding.
+
+#ifndef BROTLI_ENC_ENTROPY_ENCODE_STATIC_H_
+#define BROTLI_ENC_ENTROPY_ENCODE_STATIC_H_
+
+#include "./prefix.h"
+#include "./types.h"
+#include "./write_bits.h"
+
+namespace brotli {
+
+static const uint8_t kCodeLengthDepth[18] = {
+  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 0, 4, 4,
+};
+
+static const uint8_t kStaticCommandCodeDepth[kNumCommandPrefixes] = {
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+  11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+};
+
+static const uint8_t kStaticDistanceCodeDepth[64] = {
+  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+};
+
+static const uint32_t kCodeLengthBits[18] = {
+  0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 15, 31, 0, 11, 7,
+};
+
+inline void StoreStaticCodeLengthCode(size_t* storage_ix, uint8_t* storage) {
+  WriteBits(40, MAKE_UINT64_T(0xff, 0x55555554), storage_ix, storage);
+}
+
+static const uint64_t kZeroRepsBits[704] = {
+  0x00000000, 0x00000000, 0x00000000, 0x00000007, 0x00000017, 0x00000027,
+  0x00000037, 0x00000047, 0x00000057, 0x00000067, 0x00000077, 0x00000770,
+  0x00000b87, 0x00001387, 0x00001b87, 0x00002387, 0x00002b87, 0x00003387,
+  0x00003b87, 0x00000397, 0x00000b97, 0x00001397, 0x00001b97, 0x00002397,
+  0x00002b97, 0x00003397, 0x00003b97, 0x000003a7, 0x00000ba7, 0x000013a7,
+  0x00001ba7, 0x000023a7, 0x00002ba7, 0x000033a7, 0x00003ba7, 0x000003b7,
+  0x00000bb7, 0x000013b7, 0x00001bb7, 0x000023b7, 0x00002bb7, 0x000033b7,
+  0x00003bb7, 0x000003c7, 0x00000bc7, 0x000013c7, 0x00001bc7, 0x000023c7,
+  0x00002bc7, 0x000033c7, 0x00003bc7, 0x000003d7, 0x00000bd7, 0x000013d7,
+  0x00001bd7, 0x000023d7, 0x00002bd7, 0x000033d7, 0x00003bd7, 0x000003e7,
+  0x00000be7, 0x000013e7, 0x00001be7, 0x000023e7, 0x00002be7, 0x000033e7,
+  0x00003be7, 0x000003f7, 0x00000bf7, 0x000013f7, 0x00001bf7, 0x000023f7,
+  0x00002bf7, 0x000033f7, 0x00003bf7, 0x0001c387, 0x0005c387, 0x0009c387,
+  0x000dc387, 0x0011c387, 0x0015c387, 0x0019c387, 0x001dc387, 0x0001cb87,
+  0x0005cb87, 0x0009cb87, 0x000dcb87, 0x0011cb87, 0x0015cb87, 0x0019cb87,
+  0x001dcb87, 0x0001d387, 0x0005d387, 0x0009d387, 0x000dd387, 0x0011d387,
+  0x0015d387, 0x0019d387, 0x001dd387, 0x0001db87, 0x0005db87, 0x0009db87,
+  0x000ddb87, 0x0011db87, 0x0015db87, 0x0019db87, 0x001ddb87, 0x0001e387,
+  0x0005e387, 0x0009e387, 0x000de387, 0x0011e387, 0x0015e387, 0x0019e387,
+  0x001de387, 0x0001eb87, 0x0005eb87, 0x0009eb87, 0x000deb87, 0x0011eb87,
+  0x0015eb87, 0x0019eb87, 0x001deb87, 0x0001f387, 0x0005f387, 0x0009f387,
+  0x000df387, 0x0011f387, 0x0015f387, 0x0019f387, 0x001df387, 0x0001fb87,
+  0x0005fb87, 0x0009fb87, 0x000dfb87, 0x0011fb87, 0x0015fb87, 0x0019fb87,
+  0x001dfb87, 0x0001c397, 0x0005c397, 0x0009c397, 0x000dc397, 0x0011c397,
+  0x0015c397, 0x0019c397, 0x001dc397, 0x0001cb97, 0x0005cb97, 0x0009cb97,
+  0x000dcb97, 0x0011cb97, 0x0015cb97, 0x0019cb97, 0x001dcb97, 0x0001d397,
+  0x0005d397, 0x0009d397, 0x000dd397, 0x0011d397, 0x0015d397, 0x0019d397,
+  0x001dd397, 0x0001db97, 0x0005db97, 0x0009db97, 0x000ddb97, 0x0011db97,
+  0x0015db97, 0x0019db97, 0x001ddb97, 0x0001e397, 0x0005e397, 0x0009e397,
+  0x000de397, 0x0011e397, 0x0015e397, 0x0019e397, 0x001de397, 0x0001eb97,
+  0x0005eb97, 0x0009eb97, 0x000deb97, 0x0011eb97, 0x0015eb97, 0x0019eb97,
+  0x001deb97, 0x0001f397, 0x0005f397, 0x0009f397, 0x000df397, 0x0011f397,
+  0x0015f397, 0x0019f397, 0x001df397, 0x0001fb97, 0x0005fb97, 0x0009fb97,
+  0x000dfb97, 0x0011fb97, 0x0015fb97, 0x0019fb97, 0x001dfb97, 0x0001c3a7,
+  0x0005c3a7, 0x0009c3a7, 0x000dc3a7, 0x0011c3a7, 0x0015c3a7, 0x0019c3a7,
+  0x001dc3a7, 0x0001cba7, 0x0005cba7, 0x0009cba7, 0x000dcba7, 0x0011cba7,
+  0x0015cba7, 0x0019cba7, 0x001dcba7, 0x0001d3a7, 0x0005d3a7, 0x0009d3a7,
+  0x000dd3a7, 0x0011d3a7, 0x0015d3a7, 0x0019d3a7, 0x001dd3a7, 0x0001dba7,
+  0x0005dba7, 0x0009dba7, 0x000ddba7, 0x0011dba7, 0x0015dba7, 0x0019dba7,
+  0x001ddba7, 0x0001e3a7, 0x0005e3a7, 0x0009e3a7, 0x000de3a7, 0x0011e3a7,
+  0x0015e3a7, 0x0019e3a7, 0x001de3a7, 0x0001eba7, 0x0005eba7, 0x0009eba7,
+  0x000deba7, 0x0011eba7, 0x0015eba7, 0x0019eba7, 0x001deba7, 0x0001f3a7,
+  0x0005f3a7, 0x0009f3a7, 0x000df3a7, 0x0011f3a7, 0x0015f3a7, 0x0019f3a7,
+  0x001df3a7, 0x0001fba7, 0x0005fba7, 0x0009fba7, 0x000dfba7, 0x0011fba7,
+  0x0015fba7, 0x0019fba7, 0x001dfba7, 0x0001c3b7, 0x0005c3b7, 0x0009c3b7,
+  0x000dc3b7, 0x0011c3b7, 0x0015c3b7, 0x0019c3b7, 0x001dc3b7, 0x0001cbb7,
+  0x0005cbb7, 0x0009cbb7, 0x000dcbb7, 0x0011cbb7, 0x0015cbb7, 0x0019cbb7,
+  0x001dcbb7, 0x0001d3b7, 0x0005d3b7, 0x0009d3b7, 0x000dd3b7, 0x0011d3b7,
+  0x0015d3b7, 0x0019d3b7, 0x001dd3b7, 0x0001dbb7, 0x0005dbb7, 0x0009dbb7,
+  0x000ddbb7, 0x0011dbb7, 0x0015dbb7, 0x0019dbb7, 0x001ddbb7, 0x0001e3b7,
+  0x0005e3b7, 0x0009e3b7, 0x000de3b7, 0x0011e3b7, 0x0015e3b7, 0x0019e3b7,
+  0x001de3b7, 0x0001ebb7, 0x0005ebb7, 0x0009ebb7, 0x000debb7, 0x0011ebb7,
+  0x0015ebb7, 0x0019ebb7, 0x001debb7, 0x0001f3b7, 0x0005f3b7, 0x0009f3b7,
+  0x000df3b7, 0x0011f3b7, 0x0015f3b7, 0x0019f3b7, 0x001df3b7, 0x0001fbb7,
+  0x0005fbb7, 0x0009fbb7, 0x000dfbb7, 0x0011fbb7, 0x0015fbb7, 0x0019fbb7,
+  0x001dfbb7, 0x0001c3c7, 0x0005c3c7, 0x0009c3c7, 0x000dc3c7, 0x0011c3c7,
+  0x0015c3c7, 0x0019c3c7, 0x001dc3c7, 0x0001cbc7, 0x0005cbc7, 0x0009cbc7,
+  0x000dcbc7, 0x0011cbc7, 0x0015cbc7, 0x0019cbc7, 0x001dcbc7, 0x0001d3c7,
+  0x0005d3c7, 0x0009d3c7, 0x000dd3c7, 0x0011d3c7, 0x0015d3c7, 0x0019d3c7,
+  0x001dd3c7, 0x0001dbc7, 0x0005dbc7, 0x0009dbc7, 0x000ddbc7, 0x0011dbc7,
+  0x0015dbc7, 0x0019dbc7, 0x001ddbc7, 0x0001e3c7, 0x0005e3c7, 0x0009e3c7,
+  0x000de3c7, 0x0011e3c7, 0x0015e3c7, 0x0019e3c7, 0x001de3c7, 0x0001ebc7,
+  0x0005ebc7, 0x0009ebc7, 0x000debc7, 0x0011ebc7, 0x0015ebc7, 0x0019ebc7,
+  0x001debc7, 0x0001f3c7, 0x0005f3c7, 0x0009f3c7, 0x000df3c7, 0x0011f3c7,
+  0x0015f3c7, 0x0019f3c7, 0x001df3c7, 0x0001fbc7, 0x0005fbc7, 0x0009fbc7,
+  0x000dfbc7, 0x0011fbc7, 0x0015fbc7, 0x0019fbc7, 0x001dfbc7, 0x0001c3d7,
+  0x0005c3d7, 0x0009c3d7, 0x000dc3d7, 0x0011c3d7, 0x0015c3d7, 0x0019c3d7,
+  0x001dc3d7, 0x0001cbd7, 0x0005cbd7, 0x0009cbd7, 0x000dcbd7, 0x0011cbd7,
+  0x0015cbd7, 0x0019cbd7, 0x001dcbd7, 0x0001d3d7, 0x0005d3d7, 0x0009d3d7,
+  0x000dd3d7, 0x0011d3d7, 0x0015d3d7, 0x0019d3d7, 0x001dd3d7, 0x0001dbd7,
+  0x0005dbd7, 0x0009dbd7, 0x000ddbd7, 0x0011dbd7, 0x0015dbd7, 0x0019dbd7,
+  0x001ddbd7, 0x0001e3d7, 0x0005e3d7, 0x0009e3d7, 0x000de3d7, 0x0011e3d7,
+  0x0015e3d7, 0x0019e3d7, 0x001de3d7, 0x0001ebd7, 0x0005ebd7, 0x0009ebd7,
+  0x000debd7, 0x0011ebd7, 0x0015ebd7, 0x0019ebd7, 0x001debd7, 0x0001f3d7,
+  0x0005f3d7, 0x0009f3d7, 0x000df3d7, 0x0011f3d7, 0x0015f3d7, 0x0019f3d7,
+  0x001df3d7, 0x0001fbd7, 0x0005fbd7, 0x0009fbd7, 0x000dfbd7, 0x0011fbd7,
+  0x0015fbd7, 0x0019fbd7, 0x001dfbd7, 0x0001c3e7, 0x0005c3e7, 0x0009c3e7,
+  0x000dc3e7, 0x0011c3e7, 0x0015c3e7, 0x0019c3e7, 0x001dc3e7, 0x0001cbe7,
+  0x0005cbe7, 0x0009cbe7, 0x000dcbe7, 0x0011cbe7, 0x0015cbe7, 0x0019cbe7,
+  0x001dcbe7, 0x0001d3e7, 0x0005d3e7, 0x0009d3e7, 0x000dd3e7, 0x0011d3e7,
+  0x0015d3e7, 0x0019d3e7, 0x001dd3e7, 0x0001dbe7, 0x0005dbe7, 0x0009dbe7,
+  0x000ddbe7, 0x0011dbe7, 0x0015dbe7, 0x0019dbe7, 0x001ddbe7, 0x0001e3e7,
+  0x0005e3e7, 0x0009e3e7, 0x000de3e7, 0x0011e3e7, 0x0015e3e7, 0x0019e3e7,
+  0x001de3e7, 0x0001ebe7, 0x0005ebe7, 0x0009ebe7, 0x000debe7, 0x0011ebe7,
+  0x0015ebe7, 0x0019ebe7, 0x001debe7, 0x0001f3e7, 0x0005f3e7, 0x0009f3e7,
+  0x000df3e7, 0x0011f3e7, 0x0015f3e7, 0x0019f3e7, 0x001df3e7, 0x0001fbe7,
+  0x0005fbe7, 0x0009fbe7, 0x000dfbe7, 0x0011fbe7, 0x0015fbe7, 0x0019fbe7,
+  0x001dfbe7, 0x0001c3f7, 0x0005c3f7, 0x0009c3f7, 0x000dc3f7, 0x0011c3f7,
+  0x0015c3f7, 0x0019c3f7, 0x001dc3f7, 0x0001cbf7, 0x0005cbf7, 0x0009cbf7,
+  0x000dcbf7, 0x0011cbf7, 0x0015cbf7, 0x0019cbf7, 0x001dcbf7, 0x0001d3f7,
+  0x0005d3f7, 0x0009d3f7, 0x000dd3f7, 0x0011d3f7, 0x0015d3f7, 0x0019d3f7,
+  0x001dd3f7, 0x0001dbf7, 0x0005dbf7, 0x0009dbf7, 0x000ddbf7, 0x0011dbf7,
+  0x0015dbf7, 0x0019dbf7, 0x001ddbf7, 0x0001e3f7, 0x0005e3f7, 0x0009e3f7,
+  0x000de3f7, 0x0011e3f7, 0x0015e3f7, 0x0019e3f7, 0x001de3f7, 0x0001ebf7,
+  0x0005ebf7, 0x0009ebf7, 0x000debf7, 0x0011ebf7, 0x0015ebf7, 0x0019ebf7,
+  0x001debf7, 0x0001f3f7, 0x0005f3f7, 0x0009f3f7, 0x000df3f7, 0x0011f3f7,
+  0x0015f3f7, 0x0019f3f7, 0x001df3f7, 0x0001fbf7, 0x0005fbf7, 0x0009fbf7,
+  0x000dfbf7, 0x0011fbf7, 0x0015fbf7, 0x0019fbf7, 0x001dfbf7, 0x00e1c387,
+  0x02e1c387, 0x04e1c387, 0x06e1c387, 0x08e1c387, 0x0ae1c387, 0x0ce1c387,
+  0x0ee1c387, 0x00e5c387, 0x02e5c387, 0x04e5c387, 0x06e5c387, 0x08e5c387,
+  0x0ae5c387, 0x0ce5c387, 0x0ee5c387, 0x00e9c387, 0x02e9c387, 0x04e9c387,
+  0x06e9c387, 0x08e9c387, 0x0ae9c387, 0x0ce9c387, 0x0ee9c387, 0x00edc387,
+  0x02edc387, 0x04edc387, 0x06edc387, 0x08edc387, 0x0aedc387, 0x0cedc387,
+  0x0eedc387, 0x00f1c387, 0x02f1c387, 0x04f1c387, 0x06f1c387, 0x08f1c387,
+  0x0af1c387, 0x0cf1c387, 0x0ef1c387, 0x00f5c387, 0x02f5c387, 0x04f5c387,
+  0x06f5c387, 0x08f5c387, 0x0af5c387, 0x0cf5c387, 0x0ef5c387, 0x00f9c387,
+  0x02f9c387, 0x04f9c387, 0x06f9c387, 0x08f9c387, 0x0af9c387, 0x0cf9c387,
+  0x0ef9c387, 0x00fdc387, 0x02fdc387, 0x04fdc387, 0x06fdc387, 0x08fdc387,
+  0x0afdc387, 0x0cfdc387, 0x0efdc387, 0x00e1cb87, 0x02e1cb87, 0x04e1cb87,
+  0x06e1cb87, 0x08e1cb87, 0x0ae1cb87, 0x0ce1cb87, 0x0ee1cb87, 0x00e5cb87,
+  0x02e5cb87, 0x04e5cb87, 0x06e5cb87, 0x08e5cb87, 0x0ae5cb87, 0x0ce5cb87,
+  0x0ee5cb87, 0x00e9cb87, 0x02e9cb87, 0x04e9cb87, 0x06e9cb87, 0x08e9cb87,
+  0x0ae9cb87, 0x0ce9cb87, 0x0ee9cb87, 0x00edcb87, 0x02edcb87, 0x04edcb87,
+  0x06edcb87, 0x08edcb87, 0x0aedcb87, 0x0cedcb87, 0x0eedcb87, 0x00f1cb87,
+  0x02f1cb87, 0x04f1cb87, 0x06f1cb87, 0x08f1cb87, 0x0af1cb87, 0x0cf1cb87,
+  0x0ef1cb87, 0x00f5cb87, 0x02f5cb87, 0x04f5cb87, 0x06f5cb87, 0x08f5cb87,
+  0x0af5cb87, 0x0cf5cb87, 0x0ef5cb87, 0x00f9cb87, 0x02f9cb87, 0x04f9cb87,
+  0x06f9cb87, 0x08f9cb87,
+};
+
+static const uint32_t kZeroRepsDepth[704] = {
+   0,  4,  8,  7,  7,  7,  7,  7,  7,  7,  7, 11, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+  14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+  21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 28, 28, 28, 28, 28,
+  28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+  28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+  28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+  28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+  28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+  28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+  28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+};
+
+static const uint64_t kNonZeroRepsBits[704] = {
+  0x0000000b, 0x0000001b, 0x0000002b, 0x0000003b, 0x000002cb, 0x000006cb,
+  0x00000acb, 0x00000ecb, 0x000002db, 0x000006db, 0x00000adb, 0x00000edb,
+  0x000002eb, 0x000006eb, 0x00000aeb, 0x00000eeb, 0x000002fb, 0x000006fb,
+  0x00000afb, 0x00000efb, 0x0000b2cb, 0x0001b2cb, 0x0002b2cb, 0x0003b2cb,
+  0x0000b6cb, 0x0001b6cb, 0x0002b6cb, 0x0003b6cb, 0x0000bacb, 0x0001bacb,
+  0x0002bacb, 0x0003bacb, 0x0000becb, 0x0001becb, 0x0002becb, 0x0003becb,
+  0x0000b2db, 0x0001b2db, 0x0002b2db, 0x0003b2db, 0x0000b6db, 0x0001b6db,
+  0x0002b6db, 0x0003b6db, 0x0000badb, 0x0001badb, 0x0002badb, 0x0003badb,
+  0x0000bedb, 0x0001bedb, 0x0002bedb, 0x0003bedb, 0x0000b2eb, 0x0001b2eb,
+  0x0002b2eb, 0x0003b2eb, 0x0000b6eb, 0x0001b6eb, 0x0002b6eb, 0x0003b6eb,
+  0x0000baeb, 0x0001baeb, 0x0002baeb, 0x0003baeb, 0x0000beeb, 0x0001beeb,
+  0x0002beeb, 0x0003beeb, 0x0000b2fb, 0x0001b2fb, 0x0002b2fb, 0x0003b2fb,
+  0x0000b6fb, 0x0001b6fb, 0x0002b6fb, 0x0003b6fb, 0x0000bafb, 0x0001bafb,
+  0x0002bafb, 0x0003bafb, 0x0000befb, 0x0001befb, 0x0002befb, 0x0003befb,
+  0x002cb2cb, 0x006cb2cb, 0x00acb2cb, 0x00ecb2cb, 0x002db2cb, 0x006db2cb,
+  0x00adb2cb, 0x00edb2cb, 0x002eb2cb, 0x006eb2cb, 0x00aeb2cb, 0x00eeb2cb,
+  0x002fb2cb, 0x006fb2cb, 0x00afb2cb, 0x00efb2cb, 0x002cb6cb, 0x006cb6cb,
+  0x00acb6cb, 0x00ecb6cb, 0x002db6cb, 0x006db6cb, 0x00adb6cb, 0x00edb6cb,
+  0x002eb6cb, 0x006eb6cb, 0x00aeb6cb, 0x00eeb6cb, 0x002fb6cb, 0x006fb6cb,
+  0x00afb6cb, 0x00efb6cb, 0x002cbacb, 0x006cbacb, 0x00acbacb, 0x00ecbacb,
+  0x002dbacb, 0x006dbacb, 0x00adbacb, 0x00edbacb, 0x002ebacb, 0x006ebacb,
+  0x00aebacb, 0x00eebacb, 0x002fbacb, 0x006fbacb, 0x00afbacb, 0x00efbacb,
+  0x002cbecb, 0x006cbecb, 0x00acbecb, 0x00ecbecb, 0x002dbecb, 0x006dbecb,
+  0x00adbecb, 0x00edbecb, 0x002ebecb, 0x006ebecb, 0x00aebecb, 0x00eebecb,
+  0x002fbecb, 0x006fbecb, 0x00afbecb, 0x00efbecb, 0x002cb2db, 0x006cb2db,
+  0x00acb2db, 0x00ecb2db, 0x002db2db, 0x006db2db, 0x00adb2db, 0x00edb2db,
+  0x002eb2db, 0x006eb2db, 0x00aeb2db, 0x00eeb2db, 0x002fb2db, 0x006fb2db,
+  0x00afb2db, 0x00efb2db, 0x002cb6db, 0x006cb6db, 0x00acb6db, 0x00ecb6db,
+  0x002db6db, 0x006db6db, 0x00adb6db, 0x00edb6db, 0x002eb6db, 0x006eb6db,
+  0x00aeb6db, 0x00eeb6db, 0x002fb6db, 0x006fb6db, 0x00afb6db, 0x00efb6db,
+  0x002cbadb, 0x006cbadb, 0x00acbadb, 0x00ecbadb, 0x002dbadb, 0x006dbadb,
+  0x00adbadb, 0x00edbadb, 0x002ebadb, 0x006ebadb, 0x00aebadb, 0x00eebadb,
+  0x002fbadb, 0x006fbadb, 0x00afbadb, 0x00efbadb, 0x002cbedb, 0x006cbedb,
+  0x00acbedb, 0x00ecbedb, 0x002dbedb, 0x006dbedb, 0x00adbedb, 0x00edbedb,
+  0x002ebedb, 0x006ebedb, 0x00aebedb, 0x00eebedb, 0x002fbedb, 0x006fbedb,
+  0x00afbedb, 0x00efbedb, 0x002cb2eb, 0x006cb2eb, 0x00acb2eb, 0x00ecb2eb,
+  0x002db2eb, 0x006db2eb, 0x00adb2eb, 0x00edb2eb, 0x002eb2eb, 0x006eb2eb,
+  0x00aeb2eb, 0x00eeb2eb, 0x002fb2eb, 0x006fb2eb, 0x00afb2eb, 0x00efb2eb,
+  0x002cb6eb, 0x006cb6eb, 0x00acb6eb, 0x00ecb6eb, 0x002db6eb, 0x006db6eb,
+  0x00adb6eb, 0x00edb6eb, 0x002eb6eb, 0x006eb6eb, 0x00aeb6eb, 0x00eeb6eb,
+  0x002fb6eb, 0x006fb6eb, 0x00afb6eb, 0x00efb6eb, 0x002cbaeb, 0x006cbaeb,
+  0x00acbaeb, 0x00ecbaeb, 0x002dbaeb, 0x006dbaeb, 0x00adbaeb, 0x00edbaeb,
+  0x002ebaeb, 0x006ebaeb, 0x00aebaeb, 0x00eebaeb, 0x002fbaeb, 0x006fbaeb,
+  0x00afbaeb, 0x00efbaeb, 0x002cbeeb, 0x006cbeeb, 0x00acbeeb, 0x00ecbeeb,
+  0x002dbeeb, 0x006dbeeb, 0x00adbeeb, 0x00edbeeb, 0x002ebeeb, 0x006ebeeb,
+  0x00aebeeb, 0x00eebeeb, 0x002fbeeb, 0x006fbeeb, 0x00afbeeb, 0x00efbeeb,
+  0x002cb2fb, 0x006cb2fb, 0x00acb2fb, 0x00ecb2fb, 0x002db2fb, 0x006db2fb,
+  0x00adb2fb, 0x00edb2fb, 0x002eb2fb, 0x006eb2fb, 0x00aeb2fb, 0x00eeb2fb,
+  0x002fb2fb, 0x006fb2fb, 0x00afb2fb, 0x00efb2fb, 0x002cb6fb, 0x006cb6fb,
+  0x00acb6fb, 0x00ecb6fb, 0x002db6fb, 0x006db6fb, 0x00adb6fb, 0x00edb6fb,
+  0x002eb6fb, 0x006eb6fb, 0x00aeb6fb, 0x00eeb6fb, 0x002fb6fb, 0x006fb6fb,
+  0x00afb6fb, 0x00efb6fb, 0x002cbafb, 0x006cbafb, 0x00acbafb, 0x00ecbafb,
+  0x002dbafb, 0x006dbafb, 0x00adbafb, 0x00edbafb, 0x002ebafb, 0x006ebafb,
+  0x00aebafb, 0x00eebafb, 0x002fbafb, 0x006fbafb, 0x00afbafb, 0x00efbafb,
+  0x002cbefb, 0x006cbefb, 0x00acbefb, 0x00ecbefb, 0x002dbefb, 0x006dbefb,
+  0x00adbefb, 0x00edbefb, 0x002ebefb, 0x006ebefb, 0x00aebefb, 0x00eebefb,
+  0x002fbefb, 0x006fbefb, 0x00afbefb, 0x00efbefb, 0x0b2cb2cb, 0x1b2cb2cb,
+  0x2b2cb2cb, 0x3b2cb2cb, 0x0b6cb2cb, 0x1b6cb2cb, 0x2b6cb2cb, 0x3b6cb2cb,
+  0x0bacb2cb, 0x1bacb2cb, 0x2bacb2cb, 0x3bacb2cb, 0x0becb2cb, 0x1becb2cb,
+  0x2becb2cb, 0x3becb2cb, 0x0b2db2cb, 0x1b2db2cb, 0x2b2db2cb, 0x3b2db2cb,
+  0x0b6db2cb, 0x1b6db2cb, 0x2b6db2cb, 0x3b6db2cb, 0x0badb2cb, 0x1badb2cb,
+  0x2badb2cb, 0x3badb2cb, 0x0bedb2cb, 0x1bedb2cb, 0x2bedb2cb, 0x3bedb2cb,
+  0x0b2eb2cb, 0x1b2eb2cb, 0x2b2eb2cb, 0x3b2eb2cb, 0x0b6eb2cb, 0x1b6eb2cb,
+  0x2b6eb2cb, 0x3b6eb2cb, 0x0baeb2cb, 0x1baeb2cb, 0x2baeb2cb, 0x3baeb2cb,
+  0x0beeb2cb, 0x1beeb2cb, 0x2beeb2cb, 0x3beeb2cb, 0x0b2fb2cb, 0x1b2fb2cb,
+  0x2b2fb2cb, 0x3b2fb2cb, 0x0b6fb2cb, 0x1b6fb2cb, 0x2b6fb2cb, 0x3b6fb2cb,
+  0x0bafb2cb, 0x1bafb2cb, 0x2bafb2cb, 0x3bafb2cb, 0x0befb2cb, 0x1befb2cb,
+  0x2befb2cb, 0x3befb2cb, 0x0b2cb6cb, 0x1b2cb6cb, 0x2b2cb6cb, 0x3b2cb6cb,
+  0x0b6cb6cb, 0x1b6cb6cb, 0x2b6cb6cb, 0x3b6cb6cb, 0x0bacb6cb, 0x1bacb6cb,
+  0x2bacb6cb, 0x3bacb6cb, 0x0becb6cb, 0x1becb6cb, 0x2becb6cb, 0x3becb6cb,
+  0x0b2db6cb, 0x1b2db6cb, 0x2b2db6cb, 0x3b2db6cb, 0x0b6db6cb, 0x1b6db6cb,
+  0x2b6db6cb, 0x3b6db6cb, 0x0badb6cb, 0x1badb6cb, 0x2badb6cb, 0x3badb6cb,
+  0x0bedb6cb, 0x1bedb6cb, 0x2bedb6cb, 0x3bedb6cb, 0x0b2eb6cb, 0x1b2eb6cb,
+  0x2b2eb6cb, 0x3b2eb6cb, 0x0b6eb6cb, 0x1b6eb6cb, 0x2b6eb6cb, 0x3b6eb6cb,
+  0x0baeb6cb, 0x1baeb6cb, 0x2baeb6cb, 0x3baeb6cb, 0x0beeb6cb, 0x1beeb6cb,
+  0x2beeb6cb, 0x3beeb6cb, 0x0b2fb6cb, 0x1b2fb6cb, 0x2b2fb6cb, 0x3b2fb6cb,
+  0x0b6fb6cb, 0x1b6fb6cb, 0x2b6fb6cb, 0x3b6fb6cb, 0x0bafb6cb, 0x1bafb6cb,
+  0x2bafb6cb, 0x3bafb6cb, 0x0befb6cb, 0x1befb6cb, 0x2befb6cb, 0x3befb6cb,
+  0x0b2cbacb, 0x1b2cbacb, 0x2b2cbacb, 0x3b2cbacb, 0x0b6cbacb, 0x1b6cbacb,
+  0x2b6cbacb, 0x3b6cbacb, 0x0bacbacb, 0x1bacbacb, 0x2bacbacb, 0x3bacbacb,
+  0x0becbacb, 0x1becbacb, 0x2becbacb, 0x3becbacb, 0x0b2dbacb, 0x1b2dbacb,
+  0x2b2dbacb, 0x3b2dbacb, 0x0b6dbacb, 0x1b6dbacb, 0x2b6dbacb, 0x3b6dbacb,
+  0x0badbacb, 0x1badbacb, 0x2badbacb, 0x3badbacb, 0x0bedbacb, 0x1bedbacb,
+  0x2bedbacb, 0x3bedbacb, 0x0b2ebacb, 0x1b2ebacb, 0x2b2ebacb, 0x3b2ebacb,
+  0x0b6ebacb, 0x1b6ebacb, 0x2b6ebacb, 0x3b6ebacb, 0x0baebacb, 0x1baebacb,
+  0x2baebacb, 0x3baebacb, 0x0beebacb, 0x1beebacb, 0x2beebacb, 0x3beebacb,
+  0x0b2fbacb, 0x1b2fbacb, 0x2b2fbacb, 0x3b2fbacb, 0x0b6fbacb, 0x1b6fbacb,
+  0x2b6fbacb, 0x3b6fbacb, 0x0bafbacb, 0x1bafbacb, 0x2bafbacb, 0x3bafbacb,
+  0x0befbacb, 0x1befbacb, 0x2befbacb, 0x3befbacb, 0x0b2cbecb, 0x1b2cbecb,
+  0x2b2cbecb, 0x3b2cbecb, 0x0b6cbecb, 0x1b6cbecb, 0x2b6cbecb, 0x3b6cbecb,
+  0x0bacbecb, 0x1bacbecb, 0x2bacbecb, 0x3bacbecb, 0x0becbecb, 0x1becbecb,
+  0x2becbecb, 0x3becbecb, 0x0b2dbecb, 0x1b2dbecb, 0x2b2dbecb, 0x3b2dbecb,
+  0x0b6dbecb, 0x1b6dbecb, 0x2b6dbecb, 0x3b6dbecb, 0x0badbecb, 0x1badbecb,
+  0x2badbecb, 0x3badbecb, 0x0bedbecb, 0x1bedbecb, 0x2bedbecb, 0x3bedbecb,
+  0x0b2ebecb, 0x1b2ebecb, 0x2b2ebecb, 0x3b2ebecb, 0x0b6ebecb, 0x1b6ebecb,
+  0x2b6ebecb, 0x3b6ebecb, 0x0baebecb, 0x1baebecb, 0x2baebecb, 0x3baebecb,
+  0x0beebecb, 0x1beebecb, 0x2beebecb, 0x3beebecb, 0x0b2fbecb, 0x1b2fbecb,
+  0x2b2fbecb, 0x3b2fbecb, 0x0b6fbecb, 0x1b6fbecb, 0x2b6fbecb, 0x3b6fbecb,
+  0x0bafbecb, 0x1bafbecb, 0x2bafbecb, 0x3bafbecb, 0x0befbecb, 0x1befbecb,
+  0x2befbecb, 0x3befbecb, 0x0b2cb2db, 0x1b2cb2db, 0x2b2cb2db, 0x3b2cb2db,
+  0x0b6cb2db, 0x1b6cb2db, 0x2b6cb2db, 0x3b6cb2db, 0x0bacb2db, 0x1bacb2db,
+  0x2bacb2db, 0x3bacb2db, 0x0becb2db, 0x1becb2db, 0x2becb2db, 0x3becb2db,
+  0x0b2db2db, 0x1b2db2db, 0x2b2db2db, 0x3b2db2db, 0x0b6db2db, 0x1b6db2db,
+  0x2b6db2db, 0x3b6db2db, 0x0badb2db, 0x1badb2db, 0x2badb2db, 0x3badb2db,
+  0x0bedb2db, 0x1bedb2db, 0x2bedb2db, 0x3bedb2db, 0x0b2eb2db, 0x1b2eb2db,
+  0x2b2eb2db, 0x3b2eb2db, 0x0b6eb2db, 0x1b6eb2db, 0x2b6eb2db, 0x3b6eb2db,
+  0x0baeb2db, 0x1baeb2db, 0x2baeb2db, 0x3baeb2db, 0x0beeb2db, 0x1beeb2db,
+  0x2beeb2db, 0x3beeb2db, 0x0b2fb2db, 0x1b2fb2db, 0x2b2fb2db, 0x3b2fb2db,
+  0x0b6fb2db, 0x1b6fb2db, 0x2b6fb2db, 0x3b6fb2db, 0x0bafb2db, 0x1bafb2db,
+  0x2bafb2db, 0x3bafb2db, 0x0befb2db, 0x1befb2db, 0x2befb2db, 0x3befb2db,
+  0x0b2cb6db, 0x1b2cb6db, 0x2b2cb6db, 0x3b2cb6db, 0x0b6cb6db, 0x1b6cb6db,
+  0x2b6cb6db, 0x3b6cb6db, 0x0bacb6db, 0x1bacb6db, 0x2bacb6db, 0x3bacb6db,
+  0x0becb6db, 0x1becb6db, 0x2becb6db, 0x3becb6db, 0x0b2db6db, 0x1b2db6db,
+  0x2b2db6db, 0x3b2db6db, 0x0b6db6db, 0x1b6db6db, 0x2b6db6db, 0x3b6db6db,
+  0x0badb6db, 0x1badb6db, 0x2badb6db, 0x3badb6db, 0x0bedb6db, 0x1bedb6db,
+  0x2bedb6db, 0x3bedb6db, 0x0b2eb6db, 0x1b2eb6db, 0x2b2eb6db, 0x3b2eb6db,
+  0x0b6eb6db, 0x1b6eb6db, 0x2b6eb6db, 0x3b6eb6db, 0x0baeb6db, 0x1baeb6db,
+  0x2baeb6db, 0x3baeb6db,
+};
+
+static const uint32_t kNonZeroRepsDepth[704] = {
+   6,  6,  6,  6, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+  12, 12, 12, 12, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+  18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+  18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+  18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+  18, 18, 18, 18, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+  24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+  24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+  24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+  24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+  24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+  24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+  24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+  24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+  24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+  24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+  24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+  24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+  24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+  24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+  24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+  24, 24, 24, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+  30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+  30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+  30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+  30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+  30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+  30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+  30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+  30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+  30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+  30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+  30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+  30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+  30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+  30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+  30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+  30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+  30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+  30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+  30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+  30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+  30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+  30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+};
+
+static const uint16_t kStaticLiteralCodeBits[256] = {
+    0,  128,   64,  192,   32,  160,   96,  224,
+   16,  144,   80,  208,   48,  176,  112,  240,
+    8,  136,   72,  200,   40,  168,  104,  232,
+   24,  152,   88,  216,   56,  184,  120,  248,
+    4,  132,   68,  196,   36,  164,  100,  228,
+   20,  148,   84,  212,   52,  180,  116,  244,
+   12,  140,   76,  204,   44,  172,  108,  236,
+   28,  156,   92,  220,   60,  188,  124,  252,
+    2,  130,   66,  194,   34,  162,   98,  226,
+   18,  146,   82,  210,   50,  178,  114,  242,
+   10,  138,   74,  202,   42,  170,  106,  234,
+   26,  154,   90,  218,   58,  186,  122,  250,
+    6,  134,   70,  198,   38,  166,  102,  230,
+   22,  150,   86,  214,   54,  182,  118,  246,
+   14,  142,   78,  206,   46,  174,  110,  238,
+   30,  158,   94,  222,   62,  190,  126,  254,
+    1,  129,   65,  193,   33,  161,   97,  225,
+   17,  145,   81,  209,   49,  177,  113,  241,
+    9,  137,   73,  201,   41,  169,  105,  233,
+   25,  153,   89,  217,   57,  185,  121,  249,
+    5,  133,   69,  197,   37,  165,  101,  229,
+   21,  149,   85,  213,   53,  181,  117,  245,
+   13,  141,   77,  205,   45,  173,  109,  237,
+   29,  157,   93,  221,   61,  189,  125,  253,
+    3,  131,   67,  195,   35,  163,   99,  227,
+   19,  147,   83,  211,   51,  179,  115,  243,
+   11,  139,   75,  203,   43,  171,  107,  235,
+   27,  155,   91,  219,   59,  187,  123,  251,
+    7,  135,   71,  199,   39,  167,  103,  231,
+   23,  151,   87,  215,   55,  183,  119,  247,
+   15,  143,   79,  207,   47,  175,  111,  239,
+   31,  159,   95,  223,   63,  191,  127,  255,
+};
+
+inline void StoreStaticLiteralHuffmanTree(size_t* storage_ix,
+                                          uint8_t* storage) {
+  WriteBits(32, 0x00010003U, storage_ix, storage);
+}
+
+static const uint16_t kStaticCommandCodeBits[kNumCommandPrefixes] = {
+    0,  256,  128,  384,   64,  320,  192,  448,
+   32,  288,  160,  416,   96,  352,  224,  480,
+   16,  272,  144,  400,   80,  336,  208,  464,
+   48,  304,  176,  432,  112,  368,  240,  496,
+    8,  264,  136,  392,   72,  328,  200,  456,
+   40,  296,  168,  424,  104,  360,  232,  488,
+   24,  280,  152,  408,   88,  344,  216,  472,
+   56,  312,  184,  440,  120,  376,  248,  504,
+    4,  260,  132,  388,   68,  324,  196,  452,
+   36,  292,  164,  420,  100,  356,  228,  484,
+   20,  276,  148,  404,   84,  340,  212,  468,
+   52,  308,  180,  436,  116,  372,  244,  500,
+   12,  268,  140,  396,   76,  332,  204,  460,
+   44,  300,  172,  428,  108,  364,  236,  492,
+   28,  284,  156,  412,   92,  348,  220,  476,
+   60,  316,  188,  444,  124,  380,  252,  508,
+    2,  258,  130,  386,   66,  322,  194,  450,
+   34,  290,  162,  418,   98,  354,  226,  482,
+   18,  274,  146,  402,   82,  338,  210,  466,
+   50,  306,  178,  434,  114,  370,  242,  498,
+   10,  266,  138,  394,   74,  330,  202,  458,
+   42,  298,  170,  426,  106,  362,  234,  490,
+   26,  282,  154,  410,   90,  346,  218,  474,
+   58,  314,  186,  442,  122,  378,  250,  506,
+    6,  262,  134,  390,   70,  326,  198,  454,
+   38,  294,  166,  422,  102,  358,  230,  486,
+   22,  278,  150,  406,   86,  342,  214,  470,
+   54,  310,  182,  438,  118,  374,  246,  502,
+   14,  270,  142,  398,   78,  334,  206,  462,
+   46,  302,  174,  430,  110,  366,  238,  494,
+   30,  286,  158,  414,   94,  350,  222,  478,
+   62,  318,  190,  446,  126,  382,  254,  510,
+    1,  257,  129,  385,   65,  321,  193,  449,
+   33,  289,  161,  417,   97,  353,  225,  481,
+   17,  273,  145,  401,   81,  337,  209,  465,
+   49,  305,  177,  433,  113,  369,  241,  497,
+    9,  265,  137,  393,   73,  329,  201,  457,
+   41,  297,  169,  425,  105,  361,  233,  489,
+   25,  281,  153,  409,   89,  345,  217,  473,
+   57,  313,  185,  441,  121,  377,  249,  505,
+    5,  261,  133,  389,   69,  325,  197,  453,
+   37,  293,  165,  421,  101,  357,  229,  485,
+   21,  277,  149,  405,   85,  341,  213,  469,
+   53,  309,  181,  437,  117,  373,  245,  501,
+   13,  269,  141,  397,   77,  333,  205,  461,
+   45,  301,  173,  429,  109,  365,  237,  493,
+   29,  285,  157,  413,   93,  349,  221,  477,
+   61,  317,  189,  445,  125,  381,  253,  509,
+    3,  259,  131,  387,   67,  323,  195,  451,
+   35,  291,  163,  419,   99,  355,  227,  483,
+   19,  275,  147,  403,   83,  339,  211,  467,
+   51,  307,  179,  435,  115,  371,  243,  499,
+   11,  267,  139,  395,   75,  331,  203,  459,
+   43,  299,  171,  427,  107,  363,  235,  491,
+   27,  283,  155,  411,   91,  347,  219,  475,
+   59,  315,  187,  443,  123,  379,  251,  507,
+    7, 1031,  519, 1543,  263, 1287,  775, 1799,
+  135, 1159,  647, 1671,  391, 1415,  903, 1927,
+   71, 1095,  583, 1607,  327, 1351,  839, 1863,
+  199, 1223,  711, 1735,  455, 1479,  967, 1991,
+   39, 1063,  551, 1575,  295, 1319,  807, 1831,
+  167, 1191,  679, 1703,  423, 1447,  935, 1959,
+  103, 1127,  615, 1639,  359, 1383,  871, 1895,
+  231, 1255,  743, 1767,  487, 1511,  999, 2023,
+   23, 1047,  535, 1559,  279, 1303,  791, 1815,
+  151, 1175,  663, 1687,  407, 1431,  919, 1943,
+   87, 1111,  599, 1623,  343, 1367,  855, 1879,
+  215, 1239,  727, 1751,  471, 1495,  983, 2007,
+   55, 1079,  567, 1591,  311, 1335,  823, 1847,
+  183, 1207,  695, 1719,  439, 1463,  951, 1975,
+  119, 1143,  631, 1655,  375, 1399,  887, 1911,
+  247, 1271,  759, 1783,  503, 1527, 1015, 2039,
+   15, 1039,  527, 1551,  271, 1295,  783, 1807,
+  143, 1167,  655, 1679,  399, 1423,  911, 1935,
+   79, 1103,  591, 1615,  335, 1359,  847, 1871,
+  207, 1231,  719, 1743,  463, 1487,  975, 1999,
+   47, 1071,  559, 1583,  303, 1327,  815, 1839,
+  175, 1199,  687, 1711,  431, 1455,  943, 1967,
+  111, 1135,  623, 1647,  367, 1391,  879, 1903,
+  239, 1263,  751, 1775,  495, 1519, 1007, 2031,
+   31, 1055,  543, 1567,  287, 1311,  799, 1823,
+  159, 1183,  671, 1695,  415, 1439,  927, 1951,
+   95, 1119,  607, 1631,  351, 1375,  863, 1887,
+  223, 1247,  735, 1759,  479, 1503,  991, 2015,
+   63, 1087,  575, 1599,  319, 1343,  831, 1855,
+  191, 1215,  703, 1727,  447, 1471,  959, 1983,
+  127, 1151,  639, 1663,  383, 1407,  895, 1919,
+  255, 1279,  767, 1791,  511, 1535, 1023, 2047,
+};
+
+inline void StoreStaticCommandHuffmanTree(size_t* storage_ix,
+                                          uint8_t* storage) {
+  WriteBits(28, 0x0000000006307003U, storage_ix, storage);
+  WriteBits(31, 0x0000000009262441U, storage_ix, storage);
+}
+
+static const uint16_t kStaticDistanceCodeBits[64] = {
+   0, 32, 16, 48,  8, 40, 24, 56,  4, 36, 20, 52, 12, 44, 28, 60,
+   2, 34, 18, 50, 10, 42, 26, 58,  6, 38, 22, 54, 14, 46, 30, 62,
+   1, 33, 17, 49,  9, 41, 25, 57,  5, 37, 21, 53, 13, 45, 29, 61,
+   3, 35, 19, 51, 11, 43, 27, 59,  7, 39, 23, 55, 15, 47, 31, 63,
+};
+
+inline void StoreStaticDistanceHuffmanTree(size_t* storage_ix,
+                                           uint8_t* storage) {
+  WriteBits(18, 0x000000000001dc03U, storage_ix, storage);
+  WriteBits(10, 0x00000000000000daU, storage_ix, storage);
+}
+
+}  // namespace brotli
+
+#endif  // BROTLI_ENC_ENTROPY_ENCODE_STATIC_H_
diff --git a/third_party/brotli/enc/fast_log.h b/third_party/brotli/enc/fast_log.h
new file mode 100644
index 0000000..e750e56
--- /dev/null
+++ b/third_party/brotli/enc/fast_log.h
@@ -0,0 +1,139 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Utilities for fast computation of logarithms.
+
+#ifndef BROTLI_ENC_FAST_LOG_H_
+#define BROTLI_ENC_FAST_LOG_H_
+
+#include <assert.h>
+#include <math.h>
+
+#include "./types.h"
+
+namespace brotli {
+
+static inline uint32_t Log2FloorNonZero(size_t n) {
+#ifdef __GNUC__
+  return 31u ^ static_cast<uint32_t>(__builtin_clz(static_cast<uint32_t>(n)));
+#else
+  uint32_t result = 0;
+  while (n >>= 1) result++;
+  return result;
+#endif
+}
+
+// A lookup table for small values of log2(int) to be used in entropy
+// computation.
+//
+// ", ".join(["%.16ff" % x for x in [0.0]+[log2(x) for x in range(1, 256)]])
+static const float kLog2Table[] = {
+  0.0000000000000000f, 0.0000000000000000f, 1.0000000000000000f,
+  1.5849625007211563f, 2.0000000000000000f, 2.3219280948873622f,
+  2.5849625007211561f, 2.8073549220576042f, 3.0000000000000000f,
+  3.1699250014423126f, 3.3219280948873626f, 3.4594316186372978f,
+  3.5849625007211565f, 3.7004397181410922f, 3.8073549220576037f,
+  3.9068905956085187f, 4.0000000000000000f, 4.0874628412503400f,
+  4.1699250014423122f, 4.2479275134435852f, 4.3219280948873626f,
+  4.3923174227787607f, 4.4594316186372973f, 4.5235619560570131f,
+  4.5849625007211570f, 4.6438561897747244f, 4.7004397181410926f,
+  4.7548875021634691f, 4.8073549220576037f, 4.8579809951275728f,
+  4.9068905956085187f, 4.9541963103868758f, 5.0000000000000000f,
+  5.0443941193584534f, 5.0874628412503400f, 5.1292830169449664f,
+  5.1699250014423122f, 5.2094533656289501f, 5.2479275134435852f,
+  5.2854022188622487f, 5.3219280948873626f, 5.3575520046180838f,
+  5.3923174227787607f, 5.4262647547020979f, 5.4594316186372973f,
+  5.4918530963296748f, 5.5235619560570131f, 5.5545888516776376f,
+  5.5849625007211570f, 5.6147098441152083f, 5.6438561897747244f,
+  5.6724253419714961f, 5.7004397181410926f, 5.7279204545631996f,
+  5.7548875021634691f, 5.7813597135246599f, 5.8073549220576046f,
+  5.8328900141647422f, 5.8579809951275719f, 5.8826430493618416f,
+  5.9068905956085187f, 5.9307373375628867f, 5.9541963103868758f,
+  5.9772799234999168f, 6.0000000000000000f, 6.0223678130284544f,
+  6.0443941193584534f, 6.0660891904577721f, 6.0874628412503400f,
+  6.1085244567781700f, 6.1292830169449672f, 6.1497471195046822f,
+  6.1699250014423122f, 6.1898245588800176f, 6.2094533656289510f,
+  6.2288186904958804f, 6.2479275134435861f, 6.2667865406949019f,
+  6.2854022188622487f, 6.3037807481771031f, 6.3219280948873617f,
+  6.3398500028846252f, 6.3575520046180847f, 6.3750394313469254f,
+  6.3923174227787598f, 6.4093909361377026f, 6.4262647547020979f,
+  6.4429434958487288f, 6.4594316186372982f, 6.4757334309663976f,
+  6.4918530963296748f, 6.5077946401986964f, 6.5235619560570131f,
+  6.5391588111080319f, 6.5545888516776376f, 6.5698556083309478f,
+  6.5849625007211561f, 6.5999128421871278f, 6.6147098441152092f,
+  6.6293566200796095f, 6.6438561897747253f, 6.6582114827517955f,
+  6.6724253419714952f, 6.6865005271832185f, 6.7004397181410917f,
+  6.7142455176661224f, 6.7279204545631988f, 6.7414669864011465f,
+  6.7548875021634691f, 6.7681843247769260f, 6.7813597135246599f,
+  6.7944158663501062f, 6.8073549220576037f, 6.8201789624151887f,
+  6.8328900141647422f, 6.8454900509443757f, 6.8579809951275719f,
+  6.8703647195834048f, 6.8826430493618416f, 6.8948177633079437f,
+  6.9068905956085187f, 6.9188632372745955f, 6.9307373375628867f,
+  6.9425145053392399f, 6.9541963103868758f, 6.9657842846620879f,
+  6.9772799234999168f, 6.9886846867721664f, 7.0000000000000000f,
+  7.0112272554232540f, 7.0223678130284544f, 7.0334230015374501f,
+  7.0443941193584534f, 7.0552824355011898f, 7.0660891904577721f,
+  7.0768155970508317f, 7.0874628412503400f, 7.0980320829605272f,
+  7.1085244567781700f, 7.1189410727235076f, 7.1292830169449664f,
+  7.1395513523987937f, 7.1497471195046822f, 7.1598713367783891f,
+  7.1699250014423130f, 7.1799090900149345f, 7.1898245588800176f,
+  7.1996723448363644f, 7.2094533656289492f, 7.2191685204621621f,
+  7.2288186904958804f, 7.2384047393250794f, 7.2479275134435861f,
+  7.2573878426926521f, 7.2667865406949019f, 7.2761244052742384f,
+  7.2854022188622487f, 7.2946207488916270f, 7.3037807481771031f,
+  7.3128829552843557f, 7.3219280948873617f, 7.3309168781146177f,
+  7.3398500028846243f, 7.3487281542310781f, 7.3575520046180847f,
+  7.3663222142458151f, 7.3750394313469254f, 7.3837042924740528f,
+  7.3923174227787607f, 7.4008794362821844f, 7.4093909361377026f,
+  7.4178525148858991f, 7.4262647547020979f, 7.4346282276367255f,
+  7.4429434958487288f, 7.4512111118323299f, 7.4594316186372973f,
+  7.4676055500829976f, 7.4757334309663976f, 7.4838157772642564f,
+  7.4918530963296748f, 7.4998458870832057f, 7.5077946401986964f,
+  7.5156998382840436f, 7.5235619560570131f, 7.5313814605163119f,
+  7.5391588111080319f, 7.5468944598876373f, 7.5545888516776376f,
+  7.5622424242210728f, 7.5698556083309478f, 7.5774288280357487f,
+  7.5849625007211561f, 7.5924570372680806f, 7.5999128421871278f,
+  7.6073303137496113f, 7.6147098441152075f, 7.6220518194563764f,
+  7.6293566200796095f, 7.6366246205436488f, 7.6438561897747244f,
+  7.6510516911789290f, 7.6582114827517955f, 7.6653359171851765f,
+  7.6724253419714952f, 7.6794800995054464f, 7.6865005271832185f,
+  7.6934869574993252f, 7.7004397181410926f, 7.7073591320808825f,
+  7.7142455176661224f, 7.7210991887071856f, 7.7279204545631996f,
+  7.7347096202258392f, 7.7414669864011465f, 7.7481928495894596f,
+  7.7548875021634691f, 7.7615512324444795f, 7.7681843247769260f,
+  7.7747870596011737f, 7.7813597135246608f, 7.7879025593914317f,
+  7.7944158663501062f, 7.8008998999203047f, 7.8073549220576037f,
+  7.8137811912170374f, 7.8201789624151887f, 7.8265484872909159f,
+  7.8328900141647422f, 7.8392037880969445f, 7.8454900509443757f,
+  7.8517490414160571f, 7.8579809951275719f, 7.8641861446542798f,
+  7.8703647195834048f, 7.8765169465650002f, 7.8826430493618425f,
+  7.8887432488982601f, 7.8948177633079446f, 7.9008668079807496f,
+  7.9068905956085187f, 7.9128893362299619f, 7.9188632372745955f,
+  7.9248125036057813f, 7.9307373375628867f, 7.9366379390025719f,
+  7.9425145053392399f, 7.9483672315846778f, 7.9541963103868758f,
+  7.9600019320680806f, 7.9657842846620870f, 7.9715435539507720f,
+  7.9772799234999168f, 7.9829935746943104f, 7.9886846867721664f,
+  7.9943534368588578f
+};
+
+// Faster logarithm for small integers, with the property of log2(0) == 0.
+static inline double FastLog2(size_t v) {
+  if (v < sizeof(kLog2Table) / sizeof(kLog2Table[0])) {
+    return kLog2Table[v];
+  }
+#if defined(_MSC_VER) && _MSC_VER <= 1700
+  // Visual Studio 2012 does not have the log2() function defined, so we use
+  // log() and a multiplication instead.
+  static const double kLog2Inv = 1.4426950408889634f;
+  return log(static_cast<double>(v)) * kLog2Inv;
+#else
+  return log2(static_cast<double>(v));
+#endif
+}
+
+}  // namespace brotli
+
+#endif  // BROTLI_ENC_FAST_LOG_H_
diff --git a/third_party/brotli/enc/find_match_length.h b/third_party/brotli/enc/find_match_length.h
new file mode 100644
index 0000000..1337ec3
--- /dev/null
+++ b/third_party/brotli/enc/find_match_length.h
@@ -0,0 +1,77 @@
+/* Copyright 2010 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Function to find maximal matching prefixes of strings.
+
+#ifndef BROTLI_ENC_FIND_MATCH_LENGTH_H_
+#define BROTLI_ENC_FIND_MATCH_LENGTH_H_
+
+
+#include "./port.h"
+#include "./types.h"
+
+namespace brotli {
+
+// Separate implementation for little-endian 64-bit targets, for speed.
+#if defined(__GNUC__) && defined(_LP64) && defined(IS_LITTLE_ENDIAN)
+
+static inline size_t FindMatchLengthWithLimit(const uint8_t* s1,
+                                              const uint8_t* s2,
+                                              size_t limit) {
+  size_t matched = 0;
+  size_t limit2 = (limit >> 3) + 1;  // + 1 is for pre-decrement in while
+  while (PREDICT_TRUE(--limit2)) {
+    if (PREDICT_FALSE(BROTLI_UNALIGNED_LOAD64(s2) ==
+                      BROTLI_UNALIGNED_LOAD64(s1 + matched))) {
+      s2 += 8;
+      matched += 8;
+    } else {
+      uint64_t x =
+          BROTLI_UNALIGNED_LOAD64(s2) ^ BROTLI_UNALIGNED_LOAD64(s1 + matched);
+      size_t matching_bits = static_cast<size_t>(__builtin_ctzll(x));
+      matched += matching_bits >> 3;
+      return matched;
+    }
+  }
+  limit = (limit & 7) + 1;  // + 1 is for pre-decrement in while
+  while (--limit) {
+    if (PREDICT_TRUE(s1[matched] == *s2)) {
+      ++s2;
+      ++matched;
+    } else {
+      return matched;
+    }
+  }
+  return matched;
+}
+#else
+static inline size_t FindMatchLengthWithLimit(const uint8_t* s1,
+                                             const uint8_t* s2,
+                                             size_t limit) {
+  size_t matched = 0;
+  const uint8_t* s2_limit = s2 + limit;
+  const uint8_t* s2_ptr = s2;
+  // Find out how long the match is. We loop over the data 32 bits at a
+  // time until we find a 32-bit block that doesn't match; then we find
+  // the first non-matching bit and use that to calculate the total
+  // length of the match.
+  while (s2_ptr <= s2_limit - 4 &&
+         BROTLI_UNALIGNED_LOAD32(s2_ptr) ==
+         BROTLI_UNALIGNED_LOAD32(s1 + matched)) {
+    s2_ptr += 4;
+    matched += 4;
+  }
+  while ((s2_ptr < s2_limit) && (s1[matched] == *s2_ptr)) {
+    ++s2_ptr;
+    ++matched;
+  }
+  return matched;
+}
+#endif
+
+}  // namespace brotli
+
+#endif  // BROTLI_ENC_FIND_MATCH_LENGTH_H_
diff --git a/third_party/brotli/enc/hash.h b/third_party/brotli/enc/hash.h
new file mode 100644
index 0000000..8716863b
--- /dev/null
+++ b/third_party/brotli/enc/hash.h
@@ -0,0 +1,974 @@
+/* Copyright 2010 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// A (forgetful) hash table to the data seen by the compressor, to
+// help create backward references to previous data.
+
+#ifndef BROTLI_ENC_HASH_H_
+#define BROTLI_ENC_HASH_H_
+
+#include <sys/types.h>
+#include <algorithm>
+#include <cstring>
+#include <limits>
+
+#include "./dictionary_hash.h"
+#include "./fast_log.h"
+#include "./find_match_length.h"
+#include "./port.h"
+#include "./prefix.h"
+#include "./static_dict.h"
+#include "./transform.h"
+#include "./types.h"
+
+namespace brotli {
+
+static const size_t kMaxTreeSearchDepth = 64;
+static const size_t kMaxTreeCompLength = 128;
+
+static const uint32_t kDistanceCacheIndex[] = {
+  0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
+};
+static const int kDistanceCacheOffset[] = {
+  0, 0, 0, 0, -1, 1, -2, 2, -3, 3, -1, 1, -2, 2, -3, 3
+};
+
+static const uint32_t kCutoffTransformsCount = 10;
+static const uint8_t kCutoffTransforms[] = {
+  0, 12, 27, 23, 42, 63, 56, 48, 59, 64
+};
+
+// kHashMul32 multiplier has these properties:
+// * The multiplier must be odd. Otherwise we may lose the highest bit.
+// * No long streaks of 1s or 0s.
+// * There is no effort to ensure that it is a prime, the oddity is enough
+//   for this use.
+// * The number has been tuned heuristically against compression benchmarks.
+static const uint32_t kHashMul32 = 0x1e35a7bd;
+
+template<int kShiftBits>
+inline uint32_t Hash(const uint8_t *data) {
+  uint32_t h = BROTLI_UNALIGNED_LOAD32(data) * kHashMul32;
+  // The higher bits contain more mixture from the multiplication,
+  // so we take our results from there.
+  return h >> (32 - kShiftBits);
+}
+
+// Usually, we always choose the longest backward reference. This function
+// allows for the exception of that rule.
+//
+// If we choose a backward reference that is further away, it will
+// usually be coded with more bits. We approximate this by assuming
+// log2(distance). If the distance can be expressed in terms of the
+// last four distances, we use some heuristic constants to estimate
+// the bits cost. For the first up to four literals we use the bit
+// cost of the literals from the literal cost model, after that we
+// use the average bit cost of the cost model.
+//
+// This function is used to sometimes discard a longer backward reference
+// when it is not much longer and the bit cost for encoding it is more
+// than the saved literals.
+//
+// backward_reference_offset MUST be positive.
+inline double BackwardReferenceScore(size_t copy_length,
+                                     size_t backward_reference_offset) {
+  return 5.4 * static_cast<double>(copy_length) -
+      1.20 * Log2FloorNonZero(backward_reference_offset);
+}
+
+inline double BackwardReferenceScoreUsingLastDistance(size_t copy_length,
+    size_t distance_short_code) {
+  static const double kDistanceShortCodeBitCost[16] = {
+    -0.6, 0.95, 1.17, 1.27,
+    0.93, 0.93, 0.96, 0.96, 0.99, 0.99,
+    1.05, 1.05, 1.15, 1.15, 1.25, 1.25
+  };
+  return 5.4 * static_cast<double>(copy_length) -
+      kDistanceShortCodeBitCost[distance_short_code];
+}
+
+struct BackwardMatch {
+  BackwardMatch(void) : distance(0), length_and_code(0) {}
+
+  BackwardMatch(size_t dist, size_t len)
+      : distance(static_cast<uint32_t>(dist))
+      , length_and_code(static_cast<uint32_t>(len << 5)) {}
+
+  BackwardMatch(size_t dist, size_t len, size_t len_code)
+      : distance(static_cast<uint32_t>(dist))
+      , length_and_code(static_cast<uint32_t>(
+            (len << 5) | (len == len_code ? 0 : len_code))) {}
+
+  size_t length(void) const {
+    return length_and_code >> 5;
+  }
+  size_t length_code(void) const {
+    size_t code = length_and_code & 31;
+    return code ? code : length();
+  }
+
+  uint32_t distance;
+  uint32_t length_and_code;
+};
+
+// A (forgetful) hash table to the data seen by the compressor, to
+// help create backward references to previous data.
+//
+// This is a hash map of fixed size (kBucketSize). Starting from the
+// given index, kBucketSweep buckets are used to store values of a key.
+template <int kBucketBits, int kBucketSweep, bool kUseDictionary>
+class HashLongestMatchQuickly {
+ public:
+  HashLongestMatchQuickly(void) {
+    Reset();
+  }
+  void Reset(void) {
+    need_init_ = true;
+    num_dict_lookups_ = 0;
+    num_dict_matches_ = 0;
+  }
+  void Init(void) {
+    if (need_init_) {
+      // It is not strictly necessary to fill this buffer here, but
+      // not filling will make the results of the compression stochastic
+      // (but correct). This is because random data would cause the
+      // system to find accidentally good backward references here and there.
+      memset(&buckets_[0], 0, sizeof(buckets_));
+      need_init_ = false;
+    }
+  }
+  void InitForData(const uint8_t* data, size_t num) {
+    for (size_t i = 0; i < num; ++i) {
+      const uint32_t key = HashBytes(&data[i]);
+      memset(&buckets_[key], 0, kBucketSweep * sizeof(buckets_[0]));
+      need_init_ = false;
+    }
+  }
+  // Look at 4 bytes at data.
+  // Compute a hash from these, and store the value somewhere within
+  // [ix .. ix+3].
+  inline void Store(const uint8_t *data, const uint32_t ix) {
+    const uint32_t key = HashBytes(data);
+    // Wiggle the value with the bucket sweep range.
+    const uint32_t off = (ix >> 3) % kBucketSweep;
+    buckets_[key + off] = ix;
+  }
+
+  // Find a longest backward match of &ring_buffer[cur_ix & ring_buffer_mask]
+  // up to the length of max_length and stores the position cur_ix in the
+  // hash table.
+  //
+  // Does not look for matches longer than max_length.
+  // Does not look for matches further away than max_backward.
+  // Writes the best found match length into best_len_out.
+  // Writes the index (&data[index]) of the start of the best match into
+  // best_distance_out.
+  inline bool FindLongestMatch(const uint8_t * __restrict ring_buffer,
+                               const size_t ring_buffer_mask,
+                               const int* __restrict distance_cache,
+                               const size_t cur_ix,
+                               const size_t max_length,
+                               const size_t max_backward,
+                               size_t * __restrict best_len_out,
+                               size_t * __restrict best_len_code_out,
+                               size_t * __restrict best_distance_out,
+                               double* __restrict best_score_out) {
+    const size_t best_len_in = *best_len_out;
+    const size_t cur_ix_masked = cur_ix & ring_buffer_mask;
+    const uint32_t key = HashBytes(&ring_buffer[cur_ix_masked]);
+    int compare_char = ring_buffer[cur_ix_masked + best_len_in];
+    double best_score = *best_score_out;
+    size_t best_len = best_len_in;
+    size_t cached_backward = static_cast<size_t>(distance_cache[0]);
+    size_t prev_ix = cur_ix - cached_backward;
+    bool match_found = false;
+    if (prev_ix < cur_ix) {
+      prev_ix &= static_cast<uint32_t>(ring_buffer_mask);
+      if (compare_char == ring_buffer[prev_ix + best_len]) {
+        size_t len = FindMatchLengthWithLimit(&ring_buffer[prev_ix],
+                                              &ring_buffer[cur_ix_masked],
+                                              max_length);
+        if (len >= 4) {
+          best_score = BackwardReferenceScoreUsingLastDistance(len, 0);
+          best_len = len;
+          *best_len_out = len;
+          *best_len_code_out = len;
+          *best_distance_out = cached_backward;
+          *best_score_out = best_score;
+          compare_char = ring_buffer[cur_ix_masked + best_len];
+          if (kBucketSweep == 1) {
+            buckets_[key] = static_cast<uint32_t>(cur_ix);
+            return true;
+          } else {
+            match_found = true;
+          }
+        }
+      }
+    }
+    if (kBucketSweep == 1) {
+      // Only one to look for, don't bother to prepare for a loop.
+      prev_ix = buckets_[key];
+      buckets_[key] = static_cast<uint32_t>(cur_ix);
+      size_t backward = cur_ix - prev_ix;
+      prev_ix &= static_cast<uint32_t>(ring_buffer_mask);
+      if (compare_char != ring_buffer[prev_ix + best_len_in]) {
+        return false;
+      }
+      if (PREDICT_FALSE(backward == 0 || backward > max_backward)) {
+        return false;
+      }
+      const size_t len = FindMatchLengthWithLimit(&ring_buffer[prev_ix],
+                                                  &ring_buffer[cur_ix_masked],
+                                                  max_length);
+      if (len >= 4) {
+        *best_len_out = len;
+        *best_len_code_out = len;
+        *best_distance_out = backward;
+        *best_score_out = BackwardReferenceScore(len, backward);
+        return true;
+      }
+    } else {
+      uint32_t *bucket = buckets_ + key;
+      prev_ix = *bucket++;
+      for (int i = 0; i < kBucketSweep; ++i, prev_ix = *bucket++) {
+        const size_t backward = cur_ix - prev_ix;
+        prev_ix &= static_cast<uint32_t>(ring_buffer_mask);
+        if (compare_char != ring_buffer[prev_ix + best_len]) {
+          continue;
+        }
+        if (PREDICT_FALSE(backward == 0 || backward > max_backward)) {
+          continue;
+        }
+        const size_t len = FindMatchLengthWithLimit(&ring_buffer[prev_ix],
+                                                    &ring_buffer[cur_ix_masked],
+                                                    max_length);
+        if (len >= 4) {
+          const double score = BackwardReferenceScore(len, backward);
+          if (best_score < score) {
+            best_score = score;
+            best_len = len;
+            *best_len_out = best_len;
+            *best_len_code_out = best_len;
+            *best_distance_out = backward;
+            *best_score_out = score;
+            compare_char = ring_buffer[cur_ix_masked + best_len];
+            match_found = true;
+          }
+        }
+      }
+    }
+    if (kUseDictionary && !match_found &&
+        num_dict_matches_ >= (num_dict_lookups_ >> 7)) {
+      ++num_dict_lookups_;
+      const uint32_t dict_key = Hash<14>(&ring_buffer[cur_ix_masked]) << 1;
+      const uint16_t v = kStaticDictionaryHash[dict_key];
+      if (v > 0) {
+        const uint32_t len = v & 31;
+        const uint32_t dist = v >> 5;
+        const size_t offset =
+            kBrotliDictionaryOffsetsByLength[len] + len * dist;
+        if (len <= max_length) {
+          const size_t matchlen =
+              FindMatchLengthWithLimit(&ring_buffer[cur_ix_masked],
+                                       &kBrotliDictionary[offset], len);
+          if (matchlen + kCutoffTransformsCount > len && matchlen > 0) {
+            const size_t transform_id = kCutoffTransforms[len - matchlen];
+            const size_t word_id =
+                transform_id * (1u << kBrotliDictionarySizeBitsByLength[len]) +
+                dist;
+            const size_t backward = max_backward + word_id + 1;
+            const double score = BackwardReferenceScore(matchlen, backward);
+            if (best_score < score) {
+              ++num_dict_matches_;
+              best_score = score;
+              best_len = matchlen;
+              *best_len_out = best_len;
+              *best_len_code_out = len;
+              *best_distance_out = backward;
+              *best_score_out = best_score;
+              match_found = true;
+            }
+          }
+        }
+      }
+    }
+    const uint32_t off = (cur_ix >> 3) % kBucketSweep;
+    buckets_[key + off] = static_cast<uint32_t>(cur_ix);
+    return match_found;
+  }
+
+  enum { kHashLength = 5 };
+  enum { kHashTypeLength = 8 };
+  // HashBytes is the function that chooses the bucket to place
+  // the address in. The HashLongestMatch and HashLongestMatchQuickly
+  // classes have separate, different implementations of hashing.
+  static uint32_t HashBytes(const uint8_t *data) {
+    // Computing a hash based on 5 bytes works much better for
+    // qualities 1 and 3, where the next hash value is likely to replace
+    uint64_t h = (BROTLI_UNALIGNED_LOAD64(data) << 24) * kHashMul32;
+    // The higher bits contain more mixture from the multiplication,
+    // so we take our results from there.
+    return static_cast<uint32_t>(h >> (64 - kBucketBits));
+  }
+
+  enum { kHashMapSize = 4 << kBucketBits };
+
+ private:
+  static const uint32_t kBucketSize = 1 << kBucketBits;
+  uint32_t buckets_[kBucketSize + kBucketSweep];
+  // True if buckets_ array needs to be initialized.
+  bool need_init_;
+  size_t num_dict_lookups_;
+  size_t num_dict_matches_;
+};
+
+// A (forgetful) hash table to the data seen by the compressor, to
+// help create backward references to previous data.
+//
+// This is a hash map of fixed size (kBucketSize) to a ring buffer of
+// fixed size (kBlockSize). The ring buffer contains the last kBlockSize
+// index positions of the given hash key in the compressed data.
+template <int kBucketBits,
+          int kBlockBits,
+          int kNumLastDistancesToCheck>
+class HashLongestMatch {
+ public:
+  HashLongestMatch(void) {
+    Reset();
+  }
+
+  void Reset(void) {
+    need_init_ = true;
+    num_dict_lookups_ = 0;
+    num_dict_matches_ = 0;
+  }
+
+  void Init(void) {
+    if (need_init_) {
+      memset(&num_[0], 0, sizeof(num_));
+      need_init_ = false;
+    }
+  }
+
+  void InitForData(const uint8_t* data, size_t num) {
+    for (size_t i = 0; i < num; ++i) {
+      const uint32_t key = HashBytes(&data[i]);
+      num_[key] = 0;
+      need_init_ = false;
+    }
+  }
+
+  // Look at 3 bytes at data.
+  // Compute a hash from these, and store the value of ix at that position.
+  inline void Store(const uint8_t *data, const uint32_t ix) {
+    const uint32_t key = HashBytes(data);
+    const int minor_ix = num_[key] & kBlockMask;
+    buckets_[key][minor_ix] = ix;
+    ++num_[key];
+  }
+
+  // Find a longest backward match of &data[cur_ix] up to the length of
+  // max_length and stores the position cur_ix in the hash table.
+  //
+  // Does not look for matches longer than max_length.
+  // Does not look for matches further away than max_backward.
+  // Writes the best found match length into best_len_out.
+  // Writes the index (&data[index]) offset from the start of the best match
+  // into best_distance_out.
+  // Write the score of the best match into best_score_out.
+  bool FindLongestMatch(const uint8_t * __restrict data,
+                        const size_t ring_buffer_mask,
+                        const int* __restrict distance_cache,
+                        const size_t cur_ix,
+                        const size_t max_length,
+                        const size_t max_backward,
+                        size_t * __restrict best_len_out,
+                        size_t * __restrict best_len_code_out,
+                        size_t * __restrict best_distance_out,
+                        double * __restrict best_score_out) {
+    *best_len_code_out = 0;
+    const size_t cur_ix_masked = cur_ix & ring_buffer_mask;
+    bool match_found = false;
+    // Don't accept a short copy from far away.
+    double best_score = *best_score_out;
+    size_t best_len = *best_len_out;
+    *best_len_out = 0;
+    // Try last distance first.
+    for (size_t i = 0; i < kNumLastDistancesToCheck; ++i) {
+      const size_t idx = kDistanceCacheIndex[i];
+      const size_t backward =
+          static_cast<size_t>(distance_cache[idx] + kDistanceCacheOffset[i]);
+      size_t prev_ix = static_cast<size_t>(cur_ix - backward);
+      if (prev_ix >= cur_ix) {
+        continue;
+      }
+      if (PREDICT_FALSE(backward > max_backward)) {
+        continue;
+      }
+      prev_ix &= ring_buffer_mask;
+
+      if (cur_ix_masked + best_len > ring_buffer_mask ||
+          prev_ix + best_len > ring_buffer_mask ||
+          data[cur_ix_masked + best_len] != data[prev_ix + best_len]) {
+        continue;
+      }
+      const size_t len = FindMatchLengthWithLimit(&data[prev_ix],
+                                                  &data[cur_ix_masked],
+                                                  max_length);
+      if (len >= 3 || (len == 2 && i < 2)) {
+        // Comparing for >= 2 does not change the semantics, but just saves for
+        // a few unnecessary binary logarithms in backward reference score,
+        // since we are not interested in such short matches.
+        double score = BackwardReferenceScoreUsingLastDistance(len, i);
+        if (best_score < score) {
+          best_score = score;
+          best_len = len;
+          *best_len_out = best_len;
+          *best_len_code_out = best_len;
+          *best_distance_out = backward;
+          *best_score_out = best_score;
+          match_found = true;
+        }
+      }
+    }
+    const uint32_t key = HashBytes(&data[cur_ix_masked]);
+    const uint32_t * __restrict const bucket = &buckets_[key][0];
+    const size_t down = (num_[key] > kBlockSize) ? (num_[key] - kBlockSize) : 0;
+    for (size_t i = num_[key]; i > down;) {
+      --i;
+      size_t prev_ix = bucket[i & kBlockMask];
+      const size_t backward = cur_ix - prev_ix;
+      if (PREDICT_FALSE(backward == 0 || backward > max_backward)) {
+        break;
+      }
+      prev_ix &= ring_buffer_mask;
+      if (cur_ix_masked + best_len > ring_buffer_mask ||
+          prev_ix + best_len > ring_buffer_mask ||
+          data[cur_ix_masked + best_len] != data[prev_ix + best_len]) {
+        continue;
+      }
+      const size_t len = FindMatchLengthWithLimit(&data[prev_ix],
+                                                  &data[cur_ix_masked],
+                                                  max_length);
+      if (len >= 4) {
+        // Comparing for >= 3 does not change the semantics, but just saves
+        // for a few unnecessary binary logarithms in backward reference
+        // score, since we are not interested in such short matches.
+        double score = BackwardReferenceScore(len, backward);
+        if (best_score < score) {
+          best_score = score;
+          best_len = len;
+          *best_len_out = best_len;
+          *best_len_code_out = best_len;
+          *best_distance_out = backward;
+          *best_score_out = best_score;
+          match_found = true;
+        }
+      }
+    }
+    buckets_[key][num_[key] & kBlockMask] = static_cast<uint32_t>(cur_ix);
+    ++num_[key];
+    if (!match_found && num_dict_matches_ >= (num_dict_lookups_ >> 7)) {
+      size_t dict_key = Hash<14>(&data[cur_ix_masked]) << 1;
+      for (int k = 0; k < 2; ++k, ++dict_key) {
+        ++num_dict_lookups_;
+        const uint16_t v = kStaticDictionaryHash[dict_key];
+        if (v > 0) {
+          const size_t len = v & 31;
+          const size_t dist = v >> 5;
+          const size_t offset =
+              kBrotliDictionaryOffsetsByLength[len] + len * dist;
+          if (len <= max_length) {
+            const size_t matchlen =
+                FindMatchLengthWithLimit(&data[cur_ix_masked],
+                                         &kBrotliDictionary[offset], len);
+            if (matchlen + kCutoffTransformsCount > len && matchlen > 0) {
+              const size_t transform_id = kCutoffTransforms[len - matchlen];
+              const size_t word_id =
+                  transform_id * (1 << kBrotliDictionarySizeBitsByLength[len]) +
+                  dist;
+              const size_t backward = max_backward + word_id + 1;
+              double score = BackwardReferenceScore(matchlen, backward);
+              if (best_score < score) {
+                ++num_dict_matches_;
+                best_score = score;
+                best_len = matchlen;
+                *best_len_out = best_len;
+                *best_len_code_out = len;
+                *best_distance_out = backward;
+                *best_score_out = best_score;
+                match_found = true;
+              }
+            }
+          }
+        }
+      }
+    }
+    return match_found;
+  }
+
+  // Finds all backward matches of &data[cur_ix & ring_buffer_mask] up to the
+  // length of max_length and stores the position cur_ix in the hash table.
+  //
+  // Sets *num_matches to the number of matches found, and stores the found
+  // matches in matches[0] to matches[*num_matches - 1]. The matches will be
+  // sorted by strictly increasing length and (non-strictly) increasing
+  // distance.
+  size_t FindAllMatches(const uint8_t* data,
+                        const size_t ring_buffer_mask,
+                        const size_t cur_ix,
+                        const size_t max_length,
+                        const size_t max_backward,
+                        BackwardMatch* matches) {
+    BackwardMatch* const orig_matches = matches;
+    const size_t cur_ix_masked = cur_ix & ring_buffer_mask;
+    size_t best_len = 1;
+    size_t stop = cur_ix - 64;
+    if (cur_ix < 64) { stop = 0; }
+    for (size_t i = cur_ix - 1; i > stop && best_len <= 2; --i) {
+      size_t prev_ix = i;
+      const size_t backward = cur_ix - prev_ix;
+      if (PREDICT_FALSE(backward > max_backward)) {
+        break;
+      }
+      prev_ix &= ring_buffer_mask;
+      if (data[cur_ix_masked] != data[prev_ix] ||
+          data[cur_ix_masked + 1] != data[prev_ix + 1]) {
+        continue;
+      }
+      const size_t len =
+          FindMatchLengthWithLimit(&data[prev_ix], &data[cur_ix_masked],
+                                   max_length);
+      if (len > best_len) {
+        best_len = len;
+        *matches++ = BackwardMatch(backward, len);
+      }
+    }
+    const uint32_t key = HashBytes(&data[cur_ix_masked]);
+    const uint32_t * __restrict const bucket = &buckets_[key][0];
+    const size_t down = (num_[key] > kBlockSize) ? (num_[key] - kBlockSize) : 0;
+    for (size_t i = num_[key]; i > down;) {
+      --i;
+      size_t prev_ix = bucket[i & kBlockMask];
+      const size_t backward = cur_ix - prev_ix;
+      if (PREDICT_FALSE(backward == 0 || backward > max_backward)) {
+        break;
+      }
+      prev_ix &= ring_buffer_mask;
+      if (cur_ix_masked + best_len > ring_buffer_mask ||
+          prev_ix + best_len > ring_buffer_mask ||
+          data[cur_ix_masked + best_len] != data[prev_ix + best_len]) {
+        continue;
+      }
+      const size_t len =
+          FindMatchLengthWithLimit(&data[prev_ix], &data[cur_ix_masked],
+                                   max_length);
+      if (len > best_len) {
+        best_len = len;
+        *matches++ = BackwardMatch(backward, len);
+      }
+    }
+    buckets_[key][num_[key] & kBlockMask] = static_cast<uint32_t>(cur_ix);
+    ++num_[key];
+    uint32_t dict_matches[kMaxDictionaryMatchLen + 1];
+    for (size_t i = 0; i <= kMaxDictionaryMatchLen; ++i) {
+      dict_matches[i] = kInvalidMatch;
+    }
+    size_t minlen = std::max<size_t>(4, best_len + 1);
+    if (FindAllStaticDictionaryMatches(&data[cur_ix_masked], minlen, max_length,
+                                       &dict_matches[0])) {
+      size_t maxlen = std::min<size_t>(kMaxDictionaryMatchLen, max_length);
+      for (size_t l = minlen; l <= maxlen; ++l) {
+        uint32_t dict_id = dict_matches[l];
+        if (dict_id < kInvalidMatch) {
+          *matches++ = BackwardMatch(max_backward + (dict_id >> 5) + 1, l,
+                                     dict_id & 31);
+        }
+      }
+    }
+    return static_cast<size_t>(matches - orig_matches);
+  }
+
+  enum { kHashLength = 4 };
+  enum { kHashTypeLength = 4 };
+
+  // HashBytes is the function that chooses the bucket to place
+  // the address in. The HashLongestMatch and HashLongestMatchQuickly
+  // classes have separate, different implementations of hashing.
+  static uint32_t HashBytes(const uint8_t *data) {
+    uint32_t h = BROTLI_UNALIGNED_LOAD32(data) * kHashMul32;
+    // The higher bits contain more mixture from the multiplication,
+    // so we take our results from there.
+    return h >> (32 - kBucketBits);
+  }
+
+  enum { kHashMapSize = 2 << kBucketBits };
+
+  static const size_t kMaxNumMatches = 64 + (1 << kBlockBits);
+
+ private:
+  // Number of hash buckets.
+  static const uint32_t kBucketSize = 1 << kBucketBits;
+
+  // Only kBlockSize newest backward references are kept,
+  // and the older are forgotten.
+  static const uint32_t kBlockSize = 1 << kBlockBits;
+
+  // Mask for accessing entries in a block (in a ringbuffer manner).
+  static const uint32_t kBlockMask = (1 << kBlockBits) - 1;
+
+  // Number of entries in a particular bucket.
+  uint16_t num_[kBucketSize];
+
+  // Buckets containing kBlockSize of backward references.
+  uint32_t buckets_[kBucketSize][kBlockSize];
+
+  // True if num_ array needs to be initialized.
+  bool need_init_;
+
+  size_t num_dict_lookups_;
+  size_t num_dict_matches_;
+};
+
+// A (forgetful) hash table where each hash bucket contains a binary tree of
+// sequences whose first 4 bytes share the same hash code.
+// Each sequence is kMaxTreeCompLength long and is identified by its starting
+// position in the input data. The binary tree is sorted by the lexicographic
+// order of the sequences, and it is also a max-heap with respect to the
+// starting positions.
+class HashToBinaryTree {
+ public:
+  HashToBinaryTree() : forest_(NULL) {
+    Reset();
+  }
+
+  ~HashToBinaryTree() {
+    delete[] forest_;
+  }
+
+  void Reset() {
+    need_init_ = true;
+  }
+
+  void Init(int lgwin, size_t position, size_t bytes, bool is_last) {
+    if (need_init_) {
+      window_mask_ = (1u << lgwin) - 1u;
+      invalid_pos_ = static_cast<uint32_t>(-window_mask_);
+      for (uint32_t i = 0; i < kBucketSize; i++) {
+        buckets_[i] = invalid_pos_;
+      }
+      size_t num_nodes = (position == 0 && is_last) ? bytes : window_mask_ + 1;
+      forest_ = new uint32_t[2 * num_nodes];
+      need_init_ = false;
+    }
+  }
+
+  // Finds all backward matches of &data[cur_ix & ring_buffer_mask] up to the
+  // length of max_length and stores the position cur_ix in the hash table.
+  //
+  // Sets *num_matches to the number of matches found, and stores the found
+  // matches in matches[0] to matches[*num_matches - 1]. The matches will be
+  // sorted by strictly increasing length and (non-strictly) increasing
+  // distance.
+  size_t FindAllMatches(const uint8_t* data,
+                        const size_t ring_buffer_mask,
+                        const size_t cur_ix,
+                        const size_t max_length,
+                        const size_t max_backward,
+                        BackwardMatch* matches) {
+    BackwardMatch* const orig_matches = matches;
+    const size_t cur_ix_masked = cur_ix & ring_buffer_mask;
+    size_t best_len = 1;
+    size_t stop = cur_ix - 64;
+    if (cur_ix < 64) { stop = 0; }
+    for (size_t i = cur_ix - 1; i > stop && best_len <= 2; --i) {
+      size_t prev_ix = i;
+      const size_t backward = cur_ix - prev_ix;
+      if (PREDICT_FALSE(backward > max_backward)) {
+        break;
+      }
+      prev_ix &= ring_buffer_mask;
+      if (data[cur_ix_masked] != data[prev_ix] ||
+          data[cur_ix_masked + 1] != data[prev_ix + 1]) {
+        continue;
+      }
+      const size_t len =
+          FindMatchLengthWithLimit(&data[prev_ix], &data[cur_ix_masked],
+                                   max_length);
+      if (len > best_len) {
+        best_len = len;
+        *matches++ = BackwardMatch(backward, len);
+      }
+    }
+    if (best_len < max_length) {
+      matches = StoreAndFindMatches(data, cur_ix, ring_buffer_mask,
+                                    max_length, &best_len, matches);
+    }
+    uint32_t dict_matches[kMaxDictionaryMatchLen + 1];
+    for (size_t i = 0; i <= kMaxDictionaryMatchLen; ++i) {
+      dict_matches[i] = kInvalidMatch;
+    }
+    size_t minlen = std::max<size_t>(4, best_len + 1);
+    if (FindAllStaticDictionaryMatches(&data[cur_ix_masked], minlen, max_length,
+                                       &dict_matches[0])) {
+      size_t maxlen = std::min<size_t>(kMaxDictionaryMatchLen, max_length);
+      for (size_t l = minlen; l <= maxlen; ++l) {
+        uint32_t dict_id = dict_matches[l];
+        if (dict_id < kInvalidMatch) {
+          *matches++ = BackwardMatch(max_backward + (dict_id >> 5) + 1, l,
+                                     dict_id & 31);
+        }
+      }
+    }
+    return static_cast<size_t>(matches - orig_matches);
+  }
+
+  // Stores the hash of the next 4 bytes and re-roots the binary tree at the
+  // current sequence, without returning any matches.
+  // REQUIRES: cur_ix + kMaxTreeCompLength <= end-of-current-block
+  void Store(const uint8_t* data,
+             const size_t ring_buffer_mask,
+             const size_t cur_ix) {
+    size_t best_len = 0;
+    StoreAndFindMatches(data, cur_ix, ring_buffer_mask, kMaxTreeCompLength,
+                        &best_len, NULL);
+  }
+
+  void StitchToPreviousBlock(size_t num_bytes,
+                             size_t position,
+                             const uint8_t* ringbuffer,
+                             size_t ringbuffer_mask) {
+    if (num_bytes >= 3 && position >= kMaxTreeCompLength) {
+      // Store the last `kMaxTreeCompLength - 1` positions in the hasher.
+      // These could not be calculated before, since they require knowledge
+      // of both the previous and the current block.
+      const size_t i_start = position - kMaxTreeCompLength + 1;
+      const size_t i_end = std::min(position, i_start + num_bytes);
+      for (size_t i = i_start; i < i_end; ++i) {
+        // We know that i + kMaxTreeCompLength <= position + num_bytes, i.e. the
+        // end of the current block and that we have at least
+        // kMaxTreeCompLength tail in the ringbuffer.
+        Store(ringbuffer, ringbuffer_mask, i);
+      }
+    }
+  }
+
+  static const size_t kMaxNumMatches = 64 + kMaxTreeSearchDepth;
+
+ private:
+  // Stores the hash of the next 4 bytes and in a single tree-traversal, the
+  // hash bucket's binary tree is searched for matches and is re-rooted at the
+  // current position.
+  //
+  // If less than kMaxTreeCompLength data is available, the hash bucket of the
+  // current position is searched for matches, but the state of the hash table
+  // is not changed, since we can not know the final sorting order of the
+  // current (incomplete) sequence.
+  //
+  // This function must be called with increasing cur_ix positions.
+  BackwardMatch* StoreAndFindMatches(const uint8_t* const __restrict data,
+                                     const size_t cur_ix,
+                                     const size_t ring_buffer_mask,
+                                     const size_t max_length,
+                                     size_t* const __restrict best_len,
+                                     BackwardMatch* __restrict matches) {
+    const size_t cur_ix_masked = cur_ix & ring_buffer_mask;
+    const size_t max_backward = window_mask_ - 15;
+    const size_t max_comp_len = std::min(max_length, kMaxTreeCompLength);
+    const bool reroot_tree = max_length >= kMaxTreeCompLength;
+    const uint32_t key = HashBytes(&data[cur_ix_masked]);
+    size_t prev_ix = buckets_[key];
+    // The forest index of the rightmost node of the left subtree of the new
+    // root, updated as we traverse and reroot the tree of the hash bucket.
+    size_t node_left = LeftChildIndex(cur_ix);
+    // The forest index of the leftmost node of the right subtree of the new
+    // root, updated as we traverse and reroot the tree of the hash bucket.
+    size_t node_right = RightChildIndex(cur_ix);
+    // The match length of the rightmost node of the left subtree of the new
+    // root, updated as we traverse and reroot the tree of the hash bucket.
+    size_t best_len_left = 0;
+    // The match length of the leftmost node of the right subtree of the new
+    // root, updated as we traverse and reroot the tree of the hash bucket.
+    size_t best_len_right = 0;
+    if (reroot_tree) {
+      buckets_[key] = static_cast<uint32_t>(cur_ix);
+    }
+    for (size_t depth_remaining = kMaxTreeSearchDepth; ; --depth_remaining) {
+      const size_t backward = cur_ix - prev_ix;
+      const size_t prev_ix_masked = prev_ix & ring_buffer_mask;
+      if (backward == 0 || backward > max_backward || depth_remaining == 0) {
+        if (reroot_tree) {
+          forest_[node_left] = invalid_pos_;
+          forest_[node_right] = invalid_pos_;
+        }
+        break;
+      }
+      const size_t cur_len = std::min(best_len_left, best_len_right);
+      const size_t len = cur_len +
+          FindMatchLengthWithLimit(&data[cur_ix_masked + cur_len],
+                                   &data[prev_ix_masked + cur_len],
+                                   max_length - cur_len);
+      if (len > *best_len) {
+        *best_len = len;
+        if (matches) {
+          *matches++ = BackwardMatch(backward, len);
+        }
+        if (len >= max_comp_len) {
+          if (reroot_tree) {
+            forest_[node_left] = forest_[LeftChildIndex(prev_ix)];
+            forest_[node_right] = forest_[RightChildIndex(prev_ix)];
+          }
+          break;
+        }
+      }
+      if (data[cur_ix_masked + len] > data[prev_ix_masked + len]) {
+        best_len_left = len;
+        if (reroot_tree) {
+          forest_[node_left] = static_cast<uint32_t>(prev_ix);
+        }
+        node_left = RightChildIndex(prev_ix);
+        prev_ix = forest_[node_left];
+      } else {
+        best_len_right = len;
+        if (reroot_tree) {
+          forest_[node_right] = static_cast<uint32_t>(prev_ix);
+        }
+        node_right = LeftChildIndex(prev_ix);
+        prev_ix = forest_[node_right];
+      }
+    }
+    return matches;
+  }
+
+  inline size_t LeftChildIndex(const size_t pos) {
+    return 2 * (pos & window_mask_);
+  }
+
+  inline size_t RightChildIndex(const size_t pos) {
+    return 2 * (pos & window_mask_) + 1;
+  }
+
+  static uint32_t HashBytes(const uint8_t *data) {
+    uint32_t h = BROTLI_UNALIGNED_LOAD32(data) * kHashMul32;
+    // The higher bits contain more mixture from the multiplication,
+    // so we take our results from there.
+    return h >> (32 - kBucketBits);
+  }
+
+  static const int kBucketBits = 17;
+  static const size_t kBucketSize = 1 << kBucketBits;
+
+  // The window size minus 1
+  size_t window_mask_;
+
+  // Hash table that maps the 4-byte hashes of the sequence to the last
+  // position where this hash was found, which is the root of the binary
+  // tree of sequences that share this hash bucket.
+  uint32_t buckets_[kBucketSize];
+
+  // The union of the binary trees of each hash bucket. The root of the tree
+  // corresponding to a hash is a sequence starting at buckets_[hash] and
+  // the left and right children of a sequence starting at pos are
+  // forest_[2 * pos] and forest_[2 * pos + 1].
+  uint32_t* forest_;
+
+  // A position used to mark a non-existent sequence, i.e. a tree is empty if
+  // its root is at invalid_pos_ and a node is a leaf if both its children
+  // are at invalid_pos_.
+  uint32_t invalid_pos_;
+
+  bool need_init_;
+};
+
+struct Hashers {
+  // For kBucketSweep == 1, enabling the dictionary lookup makes compression
+  // a little faster (0.5% - 1%) and it compresses 0.15% better on small text
+  // and html inputs.
+  typedef HashLongestMatchQuickly<16, 1, true> H2;
+  typedef HashLongestMatchQuickly<16, 2, false> H3;
+  typedef HashLongestMatchQuickly<17, 4, true> H4;
+  typedef HashLongestMatch<14, 4, 4> H5;
+  typedef HashLongestMatch<14, 5, 4> H6;
+  typedef HashLongestMatch<15, 6, 10> H7;
+  typedef HashLongestMatch<15, 7, 10> H8;
+  typedef HashLongestMatch<15, 8, 16> H9;
+  typedef HashToBinaryTree H10;
+
+  Hashers(void) : hash_h2(0), hash_h3(0), hash_h4(0), hash_h5(0),
+                  hash_h6(0), hash_h7(0), hash_h8(0), hash_h9(0), hash_h10(0) {}
+
+  ~Hashers(void) {
+    delete hash_h2;
+    delete hash_h3;
+    delete hash_h4;
+    delete hash_h5;
+    delete hash_h6;
+    delete hash_h7;
+    delete hash_h8;
+    delete hash_h9;
+    delete hash_h10;
+  }
+
+  void Init(int type) {
+    switch (type) {
+      case 2: hash_h2 = new H2; break;
+      case 3: hash_h3 = new H3; break;
+      case 4: hash_h4 = new H4; break;
+      case 5: hash_h5 = new H5; break;
+      case 6: hash_h6 = new H6; break;
+      case 7: hash_h7 = new H7; break;
+      case 8: hash_h8 = new H8; break;
+      case 9: hash_h9 = new H9; break;
+      case 10: hash_h10 = new H10; break;
+      default: break;
+    }
+  }
+
+  template<typename Hasher>
+  void WarmupHash(const size_t size, const uint8_t* dict, Hasher* hasher) {
+    hasher->Init();
+    for (size_t i = 0; i + Hasher::kHashTypeLength - 1 < size; i++) {
+      hasher->Store(&dict[i], static_cast<uint32_t>(i));
+    }
+  }
+
+  // Custom LZ77 window.
+  void PrependCustomDictionary(
+      int type, int lgwin, const size_t size, const uint8_t* dict) {
+    switch (type) {
+      case 2: WarmupHash(size, dict, hash_h2); break;
+      case 3: WarmupHash(size, dict, hash_h3); break;
+      case 4: WarmupHash(size, dict, hash_h4); break;
+      case 5: WarmupHash(size, dict, hash_h5); break;
+      case 6: WarmupHash(size, dict, hash_h6); break;
+      case 7: WarmupHash(size, dict, hash_h7); break;
+      case 8: WarmupHash(size, dict, hash_h8); break;
+      case 9: WarmupHash(size, dict, hash_h9); break;
+      case 10:
+        hash_h10->Init(lgwin, 0, size, false);
+        for (size_t i = 0; i + kMaxTreeCompLength - 1 < size; ++i) {
+          hash_h10->Store(dict, std::numeric_limits<size_t>::max(), i);
+        }
+        break;
+      default: break;
+    }
+  }
+
+
+  H2* hash_h2;
+  H3* hash_h3;
+  H4* hash_h4;
+  H5* hash_h5;
+  H6* hash_h6;
+  H7* hash_h7;
+  H8* hash_h8;
+  H9* hash_h9;
+  H10* hash_h10;
+};
+
+}  // namespace brotli
+
+#endif  // BROTLI_ENC_HASH_H_
diff --git a/third_party/brotli/enc/histogram.cc b/third_party/brotli/enc/histogram.cc
new file mode 100644
index 0000000..9d733d8
--- /dev/null
+++ b/third_party/brotli/enc/histogram.cc
@@ -0,0 +1,67 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Build per-context histograms of literals, commands and distance codes.
+
+#include "./histogram.h"
+
+#include <cmath>
+
+#include "./block_splitter.h"
+#include "./command.h"
+#include "./context.h"
+#include "./prefix.h"
+
+namespace brotli {
+
+void BuildHistograms(
+    const Command* cmds,
+    const size_t num_commands,
+    const BlockSplit& literal_split,
+    const BlockSplit& insert_and_copy_split,
+    const BlockSplit& dist_split,
+    const uint8_t* ringbuffer,
+    size_t start_pos,
+    size_t mask,
+    uint8_t prev_byte,
+    uint8_t prev_byte2,
+    const std::vector<ContextType>& context_modes,
+    std::vector<HistogramLiteral>* literal_histograms,
+    std::vector<HistogramCommand>* insert_and_copy_histograms,
+    std::vector<HistogramDistance>* copy_dist_histograms) {
+  size_t pos = start_pos;
+  BlockSplitIterator literal_it(literal_split);
+  BlockSplitIterator insert_and_copy_it(insert_and_copy_split);
+  BlockSplitIterator dist_it(dist_split);
+  for (size_t i = 0; i < num_commands; ++i) {
+    const Command &cmd = cmds[i];
+    insert_and_copy_it.Next();
+    (*insert_and_copy_histograms)[insert_and_copy_it.type_].Add(
+        cmd.cmd_prefix_);
+    for (size_t j = cmd.insert_len_; j != 0; --j) {
+      literal_it.Next();
+      size_t context = (literal_it.type_ << kLiteralContextBits) +
+          Context(prev_byte, prev_byte2, context_modes[literal_it.type_]);
+      (*literal_histograms)[context].Add(ringbuffer[pos & mask]);
+      prev_byte2 = prev_byte;
+      prev_byte = ringbuffer[pos & mask];
+      ++pos;
+    }
+    pos += cmd.copy_len();
+    if (cmd.copy_len()) {
+      prev_byte2 = ringbuffer[(pos - 2) & mask];
+      prev_byte = ringbuffer[(pos - 1) & mask];
+      if (cmd.cmd_prefix_ >= 128) {
+        dist_it.Next();
+        size_t context = (dist_it.type_ << kDistanceContextBits) +
+            cmd.DistanceContext();
+        (*copy_dist_histograms)[context].Add(cmd.dist_prefix_);
+      }
+    }
+  }
+}
+
+}  // namespace brotli
diff --git a/third_party/brotli/enc/histogram.h b/third_party/brotli/enc/histogram.h
new file mode 100644
index 0000000..a1153c8
--- /dev/null
+++ b/third_party/brotli/enc/histogram.h
@@ -0,0 +1,94 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Models the histograms of literals, commands and distance codes.
+
+#ifndef BROTLI_ENC_HISTOGRAM_H_
+#define BROTLI_ENC_HISTOGRAM_H_
+
+#include <cstring>
+#include <limits>
+#include <vector>
+#include "./context.h"
+#include "./command.h"
+#include "./fast_log.h"
+#include "./prefix.h"
+#include "./types.h"
+
+namespace brotli {
+
+struct BlockSplit;
+
+// A simple container for histograms of data in blocks.
+template<int kDataSize>
+struct Histogram {
+  Histogram(void) {
+    Clear();
+  }
+  void Clear(void) {
+    memset(data_, 0, sizeof(data_));
+    total_count_ = 0;
+    bit_cost_ = std::numeric_limits<double>::infinity();
+  }
+  void Add(size_t val) {
+    ++data_[val];
+    ++total_count_;
+  }
+  void Remove(size_t val) {
+    --data_[val];
+    --total_count_;
+  }
+  template<typename DataType>
+  void Add(const DataType *p, size_t n) {
+    total_count_ += n;
+    n += 1;
+    while(--n) ++data_[*p++];
+  }
+  void AddHistogram(const Histogram& v) {
+    total_count_ += v.total_count_;
+    for (size_t i = 0; i < kDataSize; ++i) {
+      data_[i] += v.data_[i];
+    }
+  }
+
+  uint32_t data_[kDataSize];
+  size_t total_count_;
+  double bit_cost_;
+};
+
+// Literal histogram.
+typedef Histogram<256> HistogramLiteral;
+// Prefix histograms.
+typedef Histogram<kNumCommandPrefixes> HistogramCommand;
+typedef Histogram<kNumDistancePrefixes> HistogramDistance;
+typedef Histogram<kNumBlockLenPrefixes> HistogramBlockLength;
+// Context map histogram, 256 Huffman tree indexes + 16 run length codes.
+typedef Histogram<272> HistogramContextMap;
+// Block type histogram, 256 block types + 2 special symbols.
+typedef Histogram<258> HistogramBlockType;
+
+static const size_t kLiteralContextBits = 6;
+static const size_t kDistanceContextBits = 2;
+
+void BuildHistograms(
+    const Command* cmds,
+    const size_t num_commands,
+    const BlockSplit& literal_split,
+    const BlockSplit& insert_and_copy_split,
+    const BlockSplit& dist_split,
+    const uint8_t* ringbuffer,
+    size_t pos,
+    size_t mask,
+    uint8_t prev_byte,
+    uint8_t prev_byte2,
+    const std::vector<ContextType>& context_modes,
+    std::vector<HistogramLiteral>* literal_histograms,
+    std::vector<HistogramCommand>* insert_and_copy_histograms,
+    std::vector<HistogramDistance>* copy_dist_histograms);
+
+}  // namespace brotli
+
+#endif  // BROTLI_ENC_HISTOGRAM_H_
diff --git a/third_party/brotli/enc/literal_cost.cc b/third_party/brotli/enc/literal_cost.cc
new file mode 100644
index 0000000..e6be86f
--- /dev/null
+++ b/third_party/brotli/enc/literal_cost.cc
@@ -0,0 +1,165 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Literal cost model to allow backward reference replacement to be efficient.
+
+#include "./literal_cost.h"
+
+#include <math.h>
+#include <algorithm>
+
+#include "./fast_log.h"
+#include "./types.h"
+#include "./utf8_util.h"
+
+namespace brotli {
+
+static size_t UTF8Position(size_t last, size_t c, size_t clamp) {
+  if (c < 128) {
+    return 0;  // Next one is the 'Byte 1' again.
+  } else if (c >= 192) {  // Next one is the 'Byte 2' of utf-8 encoding.
+    return std::min<size_t>(1, clamp);
+  } else {
+    // Let's decide over the last byte if this ends the sequence.
+    if (last < 0xe0) {
+      return 0;  // Completed two or three byte coding.
+    } else {  // Next one is the 'Byte 3' of utf-8 encoding.
+      return std::min<size_t>(2, clamp);
+    }
+  }
+}
+
+static size_t DecideMultiByteStatsLevel(size_t pos, size_t len, size_t mask,
+                                        const uint8_t *data) {
+  size_t counts[3] = { 0 };
+  size_t max_utf8 = 1;  // should be 2, but 1 compresses better.
+  size_t last_c = 0;
+  size_t utf8_pos = 0;
+  for (size_t i = 0; i < len; ++i) {
+    size_t c = data[(pos + i) & mask];
+    utf8_pos = UTF8Position(last_c, c, 2);
+    ++counts[utf8_pos];
+    last_c = c;
+  }
+  if (counts[2] < 500) {
+    max_utf8 = 1;
+  }
+  if (counts[1] + counts[2] < 25) {
+    max_utf8 = 0;
+  }
+  return max_utf8;
+}
+
+static void EstimateBitCostsForLiteralsUTF8(size_t pos, size_t len, size_t mask,
+                                            const uint8_t *data, float *cost) {
+
+  // max_utf8 is 0 (normal ascii single byte modeling),
+  // 1 (for 2-byte utf-8 modeling), or 2 (for 3-byte utf-8 modeling).
+  const size_t max_utf8 = DecideMultiByteStatsLevel(pos, len, mask, data);
+  size_t histogram[3][256] = { { 0 } };
+  size_t window_half = 495;
+  size_t in_window = std::min(window_half, len);
+  size_t in_window_utf8[3] = { 0 };
+
+  // Bootstrap histograms.
+  size_t last_c = 0;
+  size_t utf8_pos = 0;
+  for (size_t i = 0; i < in_window; ++i) {
+    size_t c = data[(pos + i) & mask];
+    ++histogram[utf8_pos][c];
+    ++in_window_utf8[utf8_pos];
+    utf8_pos = UTF8Position(last_c, c, max_utf8);
+    last_c = c;
+  }
+
+  // Compute bit costs with sliding window.
+  for (size_t i = 0; i < len; ++i) {
+    if (i >= window_half) {
+      // Remove a byte in the past.
+      size_t c = i < window_half + 1 ?
+          0 : data[(pos + i - window_half - 1) & mask];
+      size_t last_c = i < window_half + 2 ?
+          0 : data[(pos + i - window_half - 2) & mask];
+      size_t utf8_pos2 = UTF8Position(last_c, c, max_utf8);
+      --histogram[utf8_pos2][data[(pos + i - window_half) & mask]];
+      --in_window_utf8[utf8_pos2];
+    }
+    if (i + window_half < len) {
+      // Add a byte in the future.
+      size_t c = data[(pos + i + window_half - 1) & mask];
+      size_t last_c = data[(pos + i + window_half - 2) & mask];
+      size_t utf8_pos2 = UTF8Position(last_c, c, max_utf8);
+      ++histogram[utf8_pos2][data[(pos + i + window_half) & mask]];
+      ++in_window_utf8[utf8_pos2];
+    }
+    size_t c = i < 1 ? 0 : data[(pos + i - 1) & mask];
+    size_t last_c = i < 2 ? 0 : data[(pos + i - 2) & mask];
+    size_t utf8_pos = UTF8Position(last_c, c, max_utf8);
+    size_t masked_pos = (pos + i) & mask;
+    size_t histo = histogram[utf8_pos][data[masked_pos]];
+    if (histo == 0) {
+      histo = 1;
+    }
+    double lit_cost = FastLog2(in_window_utf8[utf8_pos]) - FastLog2(histo);
+    lit_cost += 0.02905;
+    if (lit_cost < 1.0) {
+      lit_cost *= 0.5;
+      lit_cost += 0.5;
+    }
+    // Make the first bytes more expensive -- seems to help, not sure why.
+    // Perhaps because the entropy source is changing its properties
+    // rapidly in the beginning of the file, perhaps because the beginning
+    // of the data is a statistical "anomaly".
+    if (i < 2000) {
+      lit_cost += 0.7 - (static_cast<double>(2000 - i) / 2000.0 * 0.35);
+    }
+    cost[i] = static_cast<float>(lit_cost);
+  }
+}
+
+void EstimateBitCostsForLiterals(size_t pos, size_t len, size_t mask,
+                                 const uint8_t *data, float *cost) {
+  if (IsMostlyUTF8(data, pos, mask, len, kMinUTF8Ratio)) {
+    EstimateBitCostsForLiteralsUTF8(pos, len, mask, data, cost);
+    return;
+  }
+  size_t histogram[256] = { 0 };
+  size_t window_half = 2000;
+  size_t in_window = std::min(window_half, len);
+
+  // Bootstrap histogram.
+  for (size_t i = 0; i < in_window; ++i) {
+    ++histogram[data[(pos + i) & mask]];
+  }
+
+  // Compute bit costs with sliding window.
+  for (size_t i = 0; i < len; ++i) {
+    if (i >= window_half) {
+      // Remove a byte in the past.
+      --histogram[data[(pos + i - window_half) & mask]];
+      --in_window;
+    }
+    if (i + window_half < len) {
+      // Add a byte in the future.
+      ++histogram[data[(pos + i + window_half) & mask]];
+      ++in_window;
+    }
+    size_t histo = histogram[data[(pos + i) & mask]];
+    if (histo == 0) {
+      histo = 1;
+    }
+    double lit_cost = FastLog2(in_window) - FastLog2(histo);
+    lit_cost += 0.029;
+    if (lit_cost < 1.0) {
+      lit_cost *= 0.5;
+      lit_cost += 0.5;
+    }
+    cost[i] = static_cast<float>(lit_cost);
+  }
+}
+
+
+}  // namespace brotli
diff --git a/third_party/brotli/enc/literal_cost.h b/third_party/brotli/enc/literal_cost.h
new file mode 100644
index 0000000..291aa8a
--- /dev/null
+++ b/third_party/brotli/enc/literal_cost.h
@@ -0,0 +1,24 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Literal cost model to allow backward reference replacement to be efficient.
+
+#ifndef BROTLI_ENC_LITERAL_COST_H_
+#define BROTLI_ENC_LITERAL_COST_H_
+
+#include "./types.h"
+
+namespace brotli {
+
+// Estimates how many bits the literals in the interval [pos, pos + len) in the
+// ringbuffer (data, mask) will take entropy coded and writes these estimates
+// to the cost[0..len) array.
+void EstimateBitCostsForLiterals(size_t pos, size_t len, size_t mask,
+                                 const uint8_t *data, float *cost);
+
+}  // namespace brotli
+
+#endif  // BROTLI_ENC_LITERAL_COST_H_
diff --git a/third_party/brotli/enc/metablock.cc b/third_party/brotli/enc/metablock.cc
new file mode 100644
index 0000000..fc962c5
--- /dev/null
+++ b/third_party/brotli/enc/metablock.cc
@@ -0,0 +1,539 @@
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Algorithms for distributing the literals and commands of a metablock between
+// block types and contexts.
+
+#include "./metablock.h"
+
+#include "./block_splitter.h"
+#include "./context.h"
+#include "./cluster.h"
+#include "./histogram.h"
+
+namespace brotli {
+
+void BuildMetaBlock(const uint8_t* ringbuffer,
+                    const size_t pos,
+                    const size_t mask,
+                    uint8_t prev_byte,
+                    uint8_t prev_byte2,
+                    const Command* cmds,
+                    size_t num_commands,
+                    ContextType literal_context_mode,
+                    MetaBlockSplit* mb) {
+  SplitBlock(cmds, num_commands,
+             ringbuffer, pos, mask,
+             &mb->literal_split,
+             &mb->command_split,
+             &mb->distance_split);
+
+  std::vector<ContextType> literal_context_modes(mb->literal_split.num_types,
+                                                 literal_context_mode);
+
+  size_t num_literal_contexts =
+      mb->literal_split.num_types << kLiteralContextBits;
+  size_t num_distance_contexts =
+      mb->distance_split.num_types << kDistanceContextBits;
+  std::vector<HistogramLiteral> literal_histograms(num_literal_contexts);
+  mb->command_histograms.resize(mb->command_split.num_types);
+  std::vector<HistogramDistance> distance_histograms(num_distance_contexts);
+  BuildHistograms(cmds, num_commands,
+                  mb->literal_split,
+                  mb->command_split,
+                  mb->distance_split,
+                  ringbuffer,
+                  pos,
+                  mask,
+                  prev_byte,
+                  prev_byte2,
+                  literal_context_modes,
+                  &literal_histograms,
+                  &mb->command_histograms,
+                  &distance_histograms);
+
+  // Histogram ids need to fit in one byte.
+  static const size_t kMaxNumberOfHistograms = 256;
+
+  ClusterHistograms(literal_histograms,
+                    1u << kLiteralContextBits,
+                    mb->literal_split.num_types,
+                    kMaxNumberOfHistograms,
+                    &mb->literal_histograms,
+                    &mb->literal_context_map);
+
+  ClusterHistograms(distance_histograms,
+                    1u << kDistanceContextBits,
+                    mb->distance_split.num_types,
+                    kMaxNumberOfHistograms,
+                    &mb->distance_histograms,
+                    &mb->distance_context_map);
+}
+
+// Greedy block splitter for one block category (literal, command or distance).
+template<typename HistogramType>
+class BlockSplitter {
+ public:
+  BlockSplitter(size_t alphabet_size,
+                size_t min_block_size,
+                double split_threshold,
+                size_t num_symbols,
+                BlockSplit* split,
+                std::vector<HistogramType>* histograms)
+      : alphabet_size_(alphabet_size),
+        min_block_size_(min_block_size),
+        split_threshold_(split_threshold),
+        num_blocks_(0),
+        split_(split),
+        histograms_(histograms),
+        target_block_size_(min_block_size),
+        block_size_(0),
+        curr_histogram_ix_(0),
+        merge_last_count_(0) {
+    size_t max_num_blocks = num_symbols / min_block_size + 1;
+    // We have to allocate one more histogram than the maximum number of block
+    // types for the current histogram when the meta-block is too big.
+    size_t max_num_types = std::min<size_t>(max_num_blocks, kMaxBlockTypes + 1);
+    split_->lengths.resize(max_num_blocks);
+    split_->types.resize(max_num_blocks);
+    histograms_->resize(max_num_types);
+    last_histogram_ix_[0] = last_histogram_ix_[1] = 0;
+  }
+
+  // Adds the next symbol to the current histogram. When the current histogram
+  // reaches the target size, decides on merging the block.
+  void AddSymbol(size_t symbol) {
+    (*histograms_)[curr_histogram_ix_].Add(symbol);
+    ++block_size_;
+    if (block_size_ == target_block_size_) {
+      FinishBlock(/* is_final = */ false);
+    }
+  }
+
+  // Does either of three things:
+  //   (1) emits the current block with a new block type;
+  //   (2) emits the current block with the type of the second last block;
+  //   (3) merges the current block with the last block.
+  void FinishBlock(bool is_final) {
+    if (block_size_ < min_block_size_) {
+      block_size_ = min_block_size_;
+    }
+    if (num_blocks_ == 0) {
+      // Create first block.
+      split_->lengths[0] = static_cast<uint32_t>(block_size_);
+      split_->types[0] = 0;
+      last_entropy_[0] =
+          BitsEntropy(&(*histograms_)[0].data_[0], alphabet_size_);
+      last_entropy_[1] = last_entropy_[0];
+      ++num_blocks_;
+      ++split_->num_types;
+      ++curr_histogram_ix_;
+      block_size_ = 0;
+    } else if (block_size_ > 0) {
+      double entropy = BitsEntropy(&(*histograms_)[curr_histogram_ix_].data_[0],
+                                   alphabet_size_);
+      HistogramType combined_histo[2];
+      double combined_entropy[2];
+      double diff[2];
+      for (size_t j = 0; j < 2; ++j) {
+        size_t last_histogram_ix = last_histogram_ix_[j];
+        combined_histo[j] = (*histograms_)[curr_histogram_ix_];
+        combined_histo[j].AddHistogram((*histograms_)[last_histogram_ix]);
+        combined_entropy[j] = BitsEntropy(
+            &combined_histo[j].data_[0], alphabet_size_);
+        diff[j] = combined_entropy[j] - entropy - last_entropy_[j];
+      }
+
+      if (split_->num_types < kMaxBlockTypes &&
+          diff[0] > split_threshold_ &&
+          diff[1] > split_threshold_) {
+        // Create new block.
+        split_->lengths[num_blocks_] = static_cast<uint32_t>(block_size_);
+        split_->types[num_blocks_] = static_cast<uint8_t>(split_->num_types);
+        last_histogram_ix_[1] = last_histogram_ix_[0];
+        last_histogram_ix_[0] = static_cast<uint8_t>(split_->num_types);
+        last_entropy_[1] = last_entropy_[0];
+        last_entropy_[0] = entropy;
+        ++num_blocks_;
+        ++split_->num_types;
+        ++curr_histogram_ix_;
+        block_size_ = 0;
+        merge_last_count_ = 0;
+        target_block_size_ = min_block_size_;
+      } else if (diff[1] < diff[0] - 20.0) {
+        // Combine this block with second last block.
+        split_->lengths[num_blocks_] = static_cast<uint32_t>(block_size_);
+        split_->types[num_blocks_] = split_->types[num_blocks_ - 2];
+        std::swap(last_histogram_ix_[0], last_histogram_ix_[1]);
+        (*histograms_)[last_histogram_ix_[0]] = combined_histo[1];
+        last_entropy_[1] = last_entropy_[0];
+        last_entropy_[0] = combined_entropy[1];
+        ++num_blocks_;
+        block_size_ = 0;
+        (*histograms_)[curr_histogram_ix_].Clear();
+        merge_last_count_ = 0;
+        target_block_size_ = min_block_size_;
+      } else {
+        // Combine this block with last block.
+        split_->lengths[num_blocks_ - 1] += static_cast<uint32_t>(block_size_);
+        (*histograms_)[last_histogram_ix_[0]] = combined_histo[0];
+        last_entropy_[0] = combined_entropy[0];
+        if (split_->num_types == 1) {
+          last_entropy_[1] = last_entropy_[0];
+        }
+        block_size_ = 0;
+        (*histograms_)[curr_histogram_ix_].Clear();
+        if (++merge_last_count_ > 1) {
+          target_block_size_ += min_block_size_;
+        }
+      }
+    }
+    if (is_final) {
+      (*histograms_).resize(split_->num_types);
+      split_->types.resize(num_blocks_);
+      split_->lengths.resize(num_blocks_);
+    }
+  }
+
+ private:
+  static const uint16_t kMaxBlockTypes = 256;
+
+  // Alphabet size of particular block category.
+  const size_t alphabet_size_;
+  // We collect at least this many symbols for each block.
+  const size_t min_block_size_;
+  // We merge histograms A and B if
+  //   entropy(A+B) < entropy(A) + entropy(B) + split_threshold_,
+  // where A is the current histogram and B is the histogram of the last or the
+  // second last block type.
+  const double split_threshold_;
+
+  size_t num_blocks_;
+  BlockSplit* split_;  // not owned
+  std::vector<HistogramType>* histograms_;  // not owned
+
+  // The number of symbols that we want to collect before deciding on whether
+  // or not to merge the block with a previous one or emit a new block.
+  size_t target_block_size_;
+  // The number of symbols in the current histogram.
+  size_t block_size_;
+  // Offset of the current histogram.
+  size_t curr_histogram_ix_;
+  // Offset of the histograms of the previous two block types.
+  size_t last_histogram_ix_[2];
+  // Entropy of the previous two block types.
+  double last_entropy_[2];
+  // The number of times we merged the current block with the last one.
+  size_t merge_last_count_;
+};
+
+void BuildMetaBlockGreedy(const uint8_t* ringbuffer,
+                          size_t pos,
+                          size_t mask,
+                          const Command *commands,
+                          size_t n_commands,
+                          MetaBlockSplit* mb) {
+  size_t num_literals = 0;
+  for (size_t i = 0; i < n_commands; ++i) {
+    num_literals += commands[i].insert_len_;
+  }
+
+  BlockSplitter<HistogramLiteral> lit_blocks(
+      256, 512, 400.0, num_literals,
+      &mb->literal_split, &mb->literal_histograms);
+  BlockSplitter<HistogramCommand> cmd_blocks(
+      kNumCommandPrefixes, 1024, 500.0, n_commands,
+      &mb->command_split, &mb->command_histograms);
+  BlockSplitter<HistogramDistance> dist_blocks(
+      64, 512, 100.0, n_commands,
+      &mb->distance_split, &mb->distance_histograms);
+
+  for (size_t i = 0; i < n_commands; ++i) {
+    const Command cmd = commands[i];
+    cmd_blocks.AddSymbol(cmd.cmd_prefix_);
+    for (size_t j = cmd.insert_len_; j != 0; --j) {
+      lit_blocks.AddSymbol(ringbuffer[pos & mask]);
+      ++pos;
+    }
+    pos += cmd.copy_len();
+    if (cmd.copy_len() && cmd.cmd_prefix_ >= 128) {
+      dist_blocks.AddSymbol(cmd.dist_prefix_);
+    }
+  }
+
+  lit_blocks.FinishBlock(/* is_final = */ true);
+  cmd_blocks.FinishBlock(/* is_final = */ true);
+  dist_blocks.FinishBlock(/* is_final = */ true);
+}
+
+// Greedy block splitter for one block category (literal, command or distance).
+// Gathers histograms for all context buckets.
+template<typename HistogramType>
+class ContextBlockSplitter {
+ public:
+  ContextBlockSplitter(size_t alphabet_size,
+                       size_t num_contexts,
+                       size_t min_block_size,
+                       double split_threshold,
+                       size_t num_symbols,
+                       BlockSplit* split,
+                       std::vector<HistogramType>* histograms)
+      : alphabet_size_(alphabet_size),
+        num_contexts_(num_contexts),
+        max_block_types_(kMaxBlockTypes / num_contexts),
+        min_block_size_(min_block_size),
+        split_threshold_(split_threshold),
+        num_blocks_(0),
+        split_(split),
+        histograms_(histograms),
+        target_block_size_(min_block_size),
+        block_size_(0),
+        curr_histogram_ix_(0),
+        last_entropy_(2 * num_contexts),
+        merge_last_count_(0) {
+    size_t max_num_blocks = num_symbols / min_block_size + 1;
+    // We have to allocate one more histogram than the maximum number of block
+    // types for the current histogram when the meta-block is too big.
+    size_t max_num_types = std::min(max_num_blocks, max_block_types_ + 1);
+    split_->lengths.resize(max_num_blocks);
+    split_->types.resize(max_num_blocks);
+    histograms_->resize(max_num_types * num_contexts);
+    last_histogram_ix_[0] = last_histogram_ix_[1] = 0;
+  }
+
+  // Adds the next symbol to the current block type and context. When the
+  // current block reaches the target size, decides on merging the block.
+  void AddSymbol(size_t symbol, size_t context) {
+    (*histograms_)[curr_histogram_ix_ + context].Add(symbol);
+    ++block_size_;
+    if (block_size_ == target_block_size_) {
+      FinishBlock(/* is_final = */ false);
+    }
+  }
+
+  // Does either of three things:
+  //   (1) emits the current block with a new block type;
+  //   (2) emits the current block with the type of the second last block;
+  //   (3) merges the current block with the last block.
+  void FinishBlock(bool is_final) {
+    if (block_size_ < min_block_size_) {
+      block_size_ = min_block_size_;
+    }
+    if (num_blocks_ == 0) {
+      // Create first block.
+      split_->lengths[0] = static_cast<uint32_t>(block_size_);
+      split_->types[0] = 0;
+      for (size_t i = 0; i < num_contexts_; ++i) {
+        last_entropy_[i] =
+            BitsEntropy(&(*histograms_)[i].data_[0], alphabet_size_);
+        last_entropy_[num_contexts_ + i] = last_entropy_[i];
+      }
+      ++num_blocks_;
+      ++split_->num_types;
+      curr_histogram_ix_ += num_contexts_;
+      block_size_ = 0;
+    } else if (block_size_ > 0) {
+      // Try merging the set of histograms for the current block type with the
+      // respective set of histograms for the last and second last block types.
+      // Decide over the split based on the total reduction of entropy across
+      // all contexts.
+      std::vector<double> entropy(num_contexts_);
+      std::vector<HistogramType> combined_histo(2 * num_contexts_);
+      std::vector<double> combined_entropy(2 * num_contexts_);
+      double diff[2] = { 0.0 };
+      for (size_t i = 0; i < num_contexts_; ++i) {
+        size_t curr_histo_ix = curr_histogram_ix_ + i;
+        entropy[i] = BitsEntropy(&(*histograms_)[curr_histo_ix].data_[0],
+                                 alphabet_size_);
+        for (size_t j = 0; j < 2; ++j) {
+          size_t jx = j * num_contexts_ + i;
+          size_t last_histogram_ix = last_histogram_ix_[j] + i;
+          combined_histo[jx] = (*histograms_)[curr_histo_ix];
+          combined_histo[jx].AddHistogram((*histograms_)[last_histogram_ix]);
+          combined_entropy[jx] = BitsEntropy(
+              &combined_histo[jx].data_[0], alphabet_size_);
+          diff[j] += combined_entropy[jx] - entropy[i] - last_entropy_[jx];
+        }
+      }
+
+      if (split_->num_types < max_block_types_ &&
+          diff[0] > split_threshold_ &&
+          diff[1] > split_threshold_) {
+        // Create new block.
+        split_->lengths[num_blocks_] = static_cast<uint32_t>(block_size_);
+        split_->types[num_blocks_] = static_cast<uint8_t>(split_->num_types);
+        last_histogram_ix_[1] = last_histogram_ix_[0];
+        last_histogram_ix_[0] = split_->num_types * num_contexts_;
+        for (size_t i = 0; i < num_contexts_; ++i) {
+          last_entropy_[num_contexts_ + i] = last_entropy_[i];
+          last_entropy_[i] = entropy[i];
+        }
+        ++num_blocks_;
+        ++split_->num_types;
+        curr_histogram_ix_ += num_contexts_;
+        block_size_ = 0;
+        merge_last_count_ = 0;
+        target_block_size_ = min_block_size_;
+      } else if (diff[1] < diff[0] - 20.0) {
+        // Combine this block with second last block.
+        split_->lengths[num_blocks_] = static_cast<uint32_t>(block_size_);
+        split_->types[num_blocks_] = split_->types[num_blocks_ - 2];
+        std::swap(last_histogram_ix_[0], last_histogram_ix_[1]);
+        for (size_t i = 0; i < num_contexts_; ++i) {
+          (*histograms_)[last_histogram_ix_[0] + i] =
+              combined_histo[num_contexts_ + i];
+          last_entropy_[num_contexts_ + i] = last_entropy_[i];
+          last_entropy_[i] = combined_entropy[num_contexts_ + i];
+          (*histograms_)[curr_histogram_ix_ + i].Clear();
+        }
+        ++num_blocks_;
+        block_size_ = 0;
+        merge_last_count_ = 0;
+        target_block_size_ = min_block_size_;
+      } else {
+        // Combine this block with last block.
+        split_->lengths[num_blocks_ - 1] += static_cast<uint32_t>(block_size_);
+        for (size_t i = 0; i < num_contexts_; ++i) {
+          (*histograms_)[last_histogram_ix_[0] + i] = combined_histo[i];
+          last_entropy_[i] = combined_entropy[i];
+          if (split_->num_types == 1) {
+            last_entropy_[num_contexts_ + i] = last_entropy_[i];
+          }
+          (*histograms_)[curr_histogram_ix_ + i].Clear();
+        }
+        block_size_ = 0;
+        if (++merge_last_count_ > 1) {
+          target_block_size_ += min_block_size_;
+        }
+      }
+    }
+    if (is_final) {
+      (*histograms_).resize(split_->num_types * num_contexts_);
+      split_->types.resize(num_blocks_);
+      split_->lengths.resize(num_blocks_);
+    }
+  }
+
+ private:
+  static const int kMaxBlockTypes = 256;
+
+  // Alphabet size of particular block category.
+  const size_t alphabet_size_;
+  const size_t num_contexts_;
+  const size_t max_block_types_;
+  // We collect at least this many symbols for each block.
+  const size_t min_block_size_;
+  // We merge histograms A and B if
+  //   entropy(A+B) < entropy(A) + entropy(B) + split_threshold_,
+  // where A is the current histogram and B is the histogram of the last or the
+  // second last block type.
+  const double split_threshold_;
+
+  size_t num_blocks_;
+  BlockSplit* split_;  // not owned
+  std::vector<HistogramType>* histograms_;  // not owned
+
+  // The number of symbols that we want to collect before deciding on whether
+  // or not to merge the block with a previous one or emit a new block.
+  size_t target_block_size_;
+  // The number of symbols in the current histogram.
+  size_t block_size_;
+  // Offset of the current histogram.
+  size_t curr_histogram_ix_;
+  // Offset of the histograms of the previous two block types.
+  size_t last_histogram_ix_[2];
+  // Entropy of the previous two block types.
+  std::vector<double> last_entropy_;
+  // The number of times we merged the current block with the last one.
+  size_t merge_last_count_;
+};
+
+void BuildMetaBlockGreedyWithContexts(const uint8_t* ringbuffer,
+                                      size_t pos,
+                                      size_t mask,
+                                      uint8_t prev_byte,
+                                      uint8_t prev_byte2,
+                                      ContextType literal_context_mode,
+                                      size_t num_contexts,
+                                      const uint32_t* static_context_map,
+                                      const Command *commands,
+                                      size_t n_commands,
+                                      MetaBlockSplit* mb) {
+  size_t num_literals = 0;
+  for (size_t i = 0; i < n_commands; ++i) {
+    num_literals += commands[i].insert_len_;
+  }
+
+  ContextBlockSplitter<HistogramLiteral> lit_blocks(
+      256, num_contexts, 512, 400.0, num_literals,
+      &mb->literal_split, &mb->literal_histograms);
+  BlockSplitter<HistogramCommand> cmd_blocks(
+      kNumCommandPrefixes, 1024, 500.0, n_commands,
+      &mb->command_split, &mb->command_histograms);
+  BlockSplitter<HistogramDistance> dist_blocks(
+      64, 512, 100.0, n_commands,
+      &mb->distance_split, &mb->distance_histograms);
+
+  for (size_t i = 0; i < n_commands; ++i) {
+    const Command cmd = commands[i];
+    cmd_blocks.AddSymbol(cmd.cmd_prefix_);
+    for (size_t j = cmd.insert_len_; j != 0; --j) {
+      size_t context = Context(prev_byte, prev_byte2, literal_context_mode);
+      uint8_t literal = ringbuffer[pos & mask];
+      lit_blocks.AddSymbol(literal, static_context_map[context]);
+      prev_byte2 = prev_byte;
+      prev_byte = literal;
+      ++pos;
+    }
+    pos += cmd.copy_len();
+    if (cmd.copy_len()) {
+      prev_byte2 = ringbuffer[(pos - 2) & mask];
+      prev_byte = ringbuffer[(pos - 1) & mask];
+      if (cmd.cmd_prefix_ >= 128) {
+        dist_blocks.AddSymbol(cmd.dist_prefix_);
+      }
+    }
+  }
+
+  lit_blocks.FinishBlock(/* is_final = */ true);
+  cmd_blocks.FinishBlock(/* is_final = */ true);
+  dist_blocks.FinishBlock(/* is_final = */ true);
+
+  mb->literal_context_map.resize(
+      mb->literal_split.num_types << kLiteralContextBits);
+  for (size_t i = 0; i < mb->literal_split.num_types; ++i) {
+    for (size_t j = 0; j < (1u << kLiteralContextBits); ++j) {
+      mb->literal_context_map[(i << kLiteralContextBits) + j] =
+          static_cast<uint32_t>(i * num_contexts) + static_context_map[j];
+    }
+  }
+}
+
+void OptimizeHistograms(size_t num_direct_distance_codes,
+                        size_t distance_postfix_bits,
+                        MetaBlockSplit* mb) {
+  uint8_t* good_for_rle = new uint8_t[kNumCommandPrefixes];
+  for (size_t i = 0; i < mb->literal_histograms.size(); ++i) {
+    OptimizeHuffmanCountsForRle(256, &mb->literal_histograms[i].data_[0],
+                                good_for_rle);
+  }
+  for (size_t i = 0; i < mb->command_histograms.size(); ++i) {
+    OptimizeHuffmanCountsForRle(kNumCommandPrefixes,
+                                &mb->command_histograms[i].data_[0],
+                                good_for_rle);
+  }
+  size_t num_distance_codes =
+      kNumDistanceShortCodes + num_direct_distance_codes +
+      (48u << distance_postfix_bits);
+  for (size_t i = 0; i < mb->distance_histograms.size(); ++i) {
+    OptimizeHuffmanCountsForRle(num_distance_codes,
+                                &mb->distance_histograms[i].data_[0],
+                                good_for_rle);
+  }
+  delete[] good_for_rle;
+}
+
+}  // namespace brotli
diff --git a/third_party/brotli/enc/metablock.h b/third_party/brotli/enc/metablock.h
new file mode 100644
index 0000000..d192885
--- /dev/null
+++ b/third_party/brotli/enc/metablock.h
@@ -0,0 +1,80 @@
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Algorithms for distributing the literals and commands of a metablock between
+// block types and contexts.
+
+#ifndef BROTLI_ENC_METABLOCK_H_
+#define BROTLI_ENC_METABLOCK_H_
+
+#include <vector>
+
+#include "./command.h"
+#include "./histogram.h"
+
+namespace brotli {
+
+struct BlockSplit {
+  BlockSplit(void) : num_types(0) {}
+
+  size_t num_types;
+  std::vector<uint8_t> types;
+  std::vector<uint32_t> lengths;
+};
+
+struct MetaBlockSplit {
+  BlockSplit literal_split;
+  BlockSplit command_split;
+  BlockSplit distance_split;
+  std::vector<uint32_t> literal_context_map;
+  std::vector<uint32_t> distance_context_map;
+  std::vector<HistogramLiteral> literal_histograms;
+  std::vector<HistogramCommand> command_histograms;
+  std::vector<HistogramDistance> distance_histograms;
+};
+
+// Uses the slow shortest-path block splitter and does context clustering.
+void BuildMetaBlock(const uint8_t* ringbuffer,
+                    const size_t pos,
+                    const size_t mask,
+                    uint8_t prev_byte,
+                    uint8_t prev_byte2,
+                    const Command* cmds,
+                    size_t num_commands,
+                    ContextType literal_context_mode,
+                    MetaBlockSplit* mb);
+
+// Uses a fast greedy block splitter that tries to merge current block with the
+// last or the second last block and does not do any context modeling.
+void BuildMetaBlockGreedy(const uint8_t* ringbuffer,
+                          size_t pos,
+                          size_t mask,
+                          const Command *commands,
+                          size_t n_commands,
+                          MetaBlockSplit* mb);
+
+// Uses a fast greedy block splitter that tries to merge current block with the
+// last or the second last block and uses a static context clustering which
+// is the same for all block types.
+void BuildMetaBlockGreedyWithContexts(const uint8_t* ringbuffer,
+                                      size_t pos,
+                                      size_t mask,
+                                      uint8_t prev_byte,
+                                      uint8_t prev_byte2,
+                                      ContextType literal_context_mode,
+                                      size_t num_contexts,
+                                      const uint32_t* static_context_map,
+                                      const Command *commands,
+                                      size_t n_commands,
+                                      MetaBlockSplit* mb);
+
+void OptimizeHistograms(size_t num_direct_distance_codes,
+                        size_t distance_postfix_bits,
+                        MetaBlockSplit* mb);
+
+}  // namespace brotli
+
+#endif  // BROTLI_ENC_METABLOCK_H_
diff --git a/third_party/brotli/enc/port.h b/third_party/brotli/enc/port.h
new file mode 100644
index 0000000..e73df63a
--- /dev/null
+++ b/third_party/brotli/enc/port.h
@@ -0,0 +1,142 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Macros for endianness, branch prediction and unaligned loads and stores.
+
+#ifndef BROTLI_ENC_PORT_H_
+#define BROTLI_ENC_PORT_H_
+
+#include <assert.h>
+#include <string.h>
+#include "./types.h"
+
+#if defined OS_LINUX || defined OS_CYGWIN
+#include <endian.h>
+#elif defined OS_FREEBSD
+#include <machine/endian.h>
+#elif defined OS_MACOSX
+#include <machine/endian.h>
+/* Let's try and follow the Linux convention */
+#define __BYTE_ORDER  BYTE_ORDER
+#define __LITTLE_ENDIAN LITTLE_ENDIAN
+#endif
+
+// define the macro IS_LITTLE_ENDIAN
+// using the above endian definitions from endian.h if
+// endian.h was included
+#ifdef __BYTE_ORDER
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#define IS_LITTLE_ENDIAN
+#endif
+
+#else
+
+#if defined(__LITTLE_ENDIAN__)
+#define IS_LITTLE_ENDIAN
+#endif
+#endif  // __BYTE_ORDER
+
+#if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
+#define IS_LITTLE_ENDIAN
+#endif
+
+// Enable little-endian optimization for x64 architecture on Windows.
+#if (defined(_WIN32) || defined(_WIN64)) && defined(_M_X64)
+#define IS_LITTLE_ENDIAN
+#endif
+
+/* Compatibility with non-clang compilers. */
+#ifndef __has_builtin
+#define __has_builtin(x) 0
+#endif
+
+#if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ > 95) || \
+    (defined(__llvm__) && __has_builtin(__builtin_expect))
+#define PREDICT_FALSE(x) (__builtin_expect(x, 0))
+#define PREDICT_TRUE(x) (__builtin_expect(!!(x), 1))
+#else
+#define PREDICT_FALSE(x) (x)
+#define PREDICT_TRUE(x) (x)
+#endif
+
+// Portable handling of unaligned loads, stores, and copies.
+// On some platforms, like ARM, the copy functions can be more efficient
+// then a load and a store.
+
+#if defined(ARCH_PIII) || \
+  defined(ARCH_ATHLON) || defined(ARCH_K8) || defined(_ARCH_PPC)
+
+// x86 and x86-64 can perform unaligned loads/stores directly;
+// modern PowerPC hardware can also do unaligned integer loads and stores;
+// but note: the FPU still sends unaligned loads and stores to a trap handler!
+
+#define BROTLI_UNALIGNED_LOAD32(_p) (*reinterpret_cast<const uint32_t *>(_p))
+#define BROTLI_UNALIGNED_LOAD64(_p) (*reinterpret_cast<const uint64_t *>(_p))
+
+#define BROTLI_UNALIGNED_STORE32(_p, _val) \
+  (*reinterpret_cast<uint32_t *>(_p) = (_val))
+#define BROTLI_UNALIGNED_STORE64(_p, _val) \
+  (*reinterpret_cast<uint64_t *>(_p) = (_val))
+
+#elif defined(__arm__) && \
+  !defined(__ARM_ARCH_5__) && \
+  !defined(__ARM_ARCH_5T__) && \
+  !defined(__ARM_ARCH_5TE__) && \
+  !defined(__ARM_ARCH_5TEJ__) && \
+  !defined(__ARM_ARCH_6__) && \
+  !defined(__ARM_ARCH_6J__) && \
+  !defined(__ARM_ARCH_6K__) && \
+  !defined(__ARM_ARCH_6Z__) && \
+  !defined(__ARM_ARCH_6ZK__) && \
+  !defined(__ARM_ARCH_6T2__)
+
+// ARMv7 and newer support native unaligned accesses, but only of 16-bit
+// and 32-bit values (not 64-bit); older versions either raise a fatal signal,
+// do an unaligned read and rotate the words around a bit, or do the reads very
+// slowly (trip through kernel mode).
+
+#define BROTLI_UNALIGNED_LOAD32(_p) (*reinterpret_cast<const uint32_t *>(_p))
+#define BROTLI_UNALIGNED_STORE32(_p, _val) \
+  (*reinterpret_cast<uint32_t *>(_p) = (_val))
+
+inline uint64_t BROTLI_UNALIGNED_LOAD64(const void *p) {
+  uint64_t t;
+  memcpy(&t, p, sizeof t);
+  return t;
+}
+
+inline void BROTLI_UNALIGNED_STORE64(void *p, uint64_t v) {
+  memcpy(p, &v, sizeof v);
+}
+
+#else
+
+// These functions are provided for architectures that don't support
+// unaligned loads and stores.
+
+inline uint32_t BROTLI_UNALIGNED_LOAD32(const void *p) {
+  uint32_t t;
+  memcpy(&t, p, sizeof t);
+  return t;
+}
+
+inline uint64_t BROTLI_UNALIGNED_LOAD64(const void *p) {
+  uint64_t t;
+  memcpy(&t, p, sizeof t);
+  return t;
+}
+
+inline void BROTLI_UNALIGNED_STORE32(void *p, uint32_t v) {
+  memcpy(p, &v, sizeof v);
+}
+
+inline void BROTLI_UNALIGNED_STORE64(void *p, uint64_t v) {
+  memcpy(p, &v, sizeof v);
+}
+
+#endif
+
+#endif  // BROTLI_ENC_PORT_H_
diff --git a/third_party/brotli/enc/prefix.h b/third_party/brotli/enc/prefix.h
new file mode 100644
index 0000000..86fff8d
--- /dev/null
+++ b/third_party/brotli/enc/prefix.h
@@ -0,0 +1,79 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Functions for encoding of integers into prefix codes the amount of extra
+// bits, and the actual values of the extra bits.
+
+#ifndef BROTLI_ENC_PREFIX_H_
+#define BROTLI_ENC_PREFIX_H_
+
+#include "./fast_log.h"
+#include "./types.h"
+
+namespace brotli {
+
+static const uint32_t kNumInsertLenPrefixes = 24;
+static const uint32_t kNumCopyLenPrefixes = 24;
+static const uint32_t kNumCommandPrefixes = 704;
+static const uint32_t kNumBlockLenPrefixes = 26;
+static const uint32_t kNumDistanceShortCodes = 16;
+static const uint32_t kNumDistancePrefixes = 520;
+
+// Represents the range of values belonging to a prefix code:
+// [offset, offset + 2^nbits)
+struct PrefixCodeRange {
+  uint32_t offset;
+  uint32_t nbits;
+};
+
+static const PrefixCodeRange kBlockLengthPrefixCode[kNumBlockLenPrefixes] = {
+  {   1,  2}, {    5,  2}, {  9,   2}, {  13,  2},
+  {  17,  3}, {   25,  3}, {  33,  3}, {  41,  3},
+  {  49,  4}, {   65,  4}, {  81,  4}, {  97,  4},
+  { 113,  5}, {  145,  5}, { 177,  5}, { 209,  5},
+  { 241,  6}, {  305,  6}, { 369,  7}, { 497,  8},
+  { 753,  9}, { 1265, 10}, {2289, 11}, {4337, 12},
+  {8433, 13}, {16625, 24}
+};
+
+inline void GetBlockLengthPrefixCode(uint32_t len, uint32_t* code,
+                                     uint32_t* n_extra, uint32_t* extra) {
+  *code = 0;
+  while (*code < 25 && len >= kBlockLengthPrefixCode[*code + 1].offset) {
+    ++(*code);
+  }
+  *n_extra = kBlockLengthPrefixCode[*code].nbits;
+  *extra = len - kBlockLengthPrefixCode[*code].offset;
+}
+
+inline void PrefixEncodeCopyDistance(size_t distance_code,
+                                     size_t num_direct_codes,
+                                     size_t postfix_bits,
+                                     uint16_t* code,
+                                     uint32_t* extra_bits) {
+  if (distance_code < kNumDistanceShortCodes + num_direct_codes) {
+    *code = static_cast<uint16_t>(distance_code);
+    *extra_bits = 0;
+    return;
+  }
+  distance_code -= kNumDistanceShortCodes + num_direct_codes;  /* >= 0 */
+  distance_code += (1u << (postfix_bits + 2u));  /* > 0 */
+  size_t bucket = Log2FloorNonZero(distance_code) - 1;
+  size_t postfix_mask = (1 << postfix_bits) - 1;
+  size_t postfix = distance_code & postfix_mask;
+  size_t prefix = (distance_code >> bucket) & 1;
+  size_t offset = (2 + prefix) << bucket;
+  size_t nbits = bucket - postfix_bits;
+  *code = static_cast<uint16_t>(
+      (kNumDistanceShortCodes + num_direct_codes +
+       ((2 * (nbits - 1) + prefix) << postfix_bits) + postfix));
+  *extra_bits = static_cast<uint32_t>(
+      (nbits << 24) | ((distance_code - offset) >> postfix_bits));
+}
+
+}  // namespace brotli
+
+#endif  // BROTLI_ENC_PREFIX_H_
diff --git a/third_party/brotli/enc/ringbuffer.h b/third_party/brotli/enc/ringbuffer.h
new file mode 100644
index 0000000..13e1b836
--- /dev/null
+++ b/third_party/brotli/enc/ringbuffer.h
@@ -0,0 +1,145 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Sliding window over the input data.
+
+#ifndef BROTLI_ENC_RINGBUFFER_H_
+#define BROTLI_ENC_RINGBUFFER_H_
+
+#include <cstdlib>  /* free, realloc */
+
+#include "./port.h"
+#include "./types.h"
+
+namespace brotli {
+
+// A RingBuffer(window_bits, tail_bits) contains `1 << window_bits' bytes of
+// data in a circular manner: writing a byte writes it to:
+//   `position() % (1 << window_bits)'.
+// For convenience, the RingBuffer array contains another copy of the
+// first `1 << tail_bits' bytes:
+//   buffer_[i] == buffer_[i + (1 << window_bits)], if i < (1 << tail_bits),
+// and another copy of the last two bytes:
+//   buffer_[-1] == buffer_[(1 << window_bits) - 1] and
+//   buffer_[-2] == buffer_[(1 << window_bits) - 2].
+class RingBuffer {
+ public:
+  RingBuffer(int window_bits, int tail_bits)
+      : size_(1u << window_bits),
+        mask_((1u << window_bits) - 1),
+        tail_size_(1u << tail_bits),
+        total_size_(size_ + tail_size_),
+        cur_size_(0),
+        pos_(0),
+        data_(0),
+        buffer_(0) {}
+
+  ~RingBuffer(void) {
+    free(data_);
+  }
+
+  // Allocates or re-allocates data_ to the given length + plus some slack
+  // region before and after. Fills the slack regions with zeros.
+  inline void InitBuffer(const uint32_t buflen) {
+    static const size_t kSlackForEightByteHashingEverywhere = 7;
+    cur_size_ = buflen;
+    data_ = static_cast<uint8_t*>(realloc(
+        data_, 2 + buflen + kSlackForEightByteHashingEverywhere));
+    buffer_ = data_ + 2;
+    buffer_[-2] = buffer_[-1] = 0;
+    for (size_t i = 0; i < kSlackForEightByteHashingEverywhere; ++i) {
+      buffer_[cur_size_ + i] = 0;
+    }
+  }
+
+  // Push bytes into the ring buffer.
+  void Write(const uint8_t *bytes, size_t n) {
+    if (pos_ == 0 && n < tail_size_) {
+      // Special case for the first write: to process the first block, we don't
+      // need to allocate the whole ringbuffer and we don't need the tail
+      // either. However, we do this memory usage optimization only if the
+      // first write is less than the tail size, which is also the input block
+      // size, otherwise it is likely that other blocks will follow and we
+      // will need to reallocate to the full size anyway.
+      pos_ = static_cast<uint32_t>(n);
+      InitBuffer(pos_);
+      memcpy(buffer_, bytes, n);
+      return;
+    }
+    if (cur_size_ < total_size_) {
+      // Lazily allocate the full buffer.
+      InitBuffer(total_size_);
+      // Initialize the last two bytes to zero, so that we don't have to worry
+      // later when we copy the last two bytes to the first two positions.
+      buffer_[size_ - 2] = 0;
+      buffer_[size_ - 1] = 0;
+    }
+    const size_t masked_pos = pos_ & mask_;
+    // The length of the writes is limited so that we do not need to worry
+    // about a write
+    WriteTail(bytes, n);
+    if (PREDICT_TRUE(masked_pos + n <= size_)) {
+      // A single write fits.
+      memcpy(&buffer_[masked_pos], bytes, n);
+    } else {
+      // Split into two writes.
+      // Copy into the end of the buffer, including the tail buffer.
+      memcpy(&buffer_[masked_pos], bytes,
+             std::min(n, total_size_ - masked_pos));
+      // Copy into the beginning of the buffer
+      memcpy(&buffer_[0], bytes + (size_ - masked_pos),
+             n - (size_ - masked_pos));
+    }
+    buffer_[-2] = buffer_[size_ - 2];
+    buffer_[-1] = buffer_[size_ - 1];
+    pos_ += static_cast<uint32_t>(n);
+    if (pos_ > (1u << 30)) {  /* Wrap, but preserve not-a-first-lap feature. */
+      pos_ = (pos_ & ((1u << 30) - 1)) | (1u << 30);
+    }
+  }
+
+  void Reset(void) {
+    pos_ = 0;
+  }
+
+  // Logical cursor position in the ring buffer.
+  uint32_t position(void) const { return pos_; }
+
+  // Bit mask for getting the physical position for a logical position.
+  uint32_t mask(void) const { return mask_; }
+
+  uint8_t *start(void) { return &buffer_[0]; }
+  const uint8_t *start(void) const { return &buffer_[0]; }
+
+ private:
+  void WriteTail(const uint8_t *bytes, size_t n) {
+    const size_t masked_pos = pos_ & mask_;
+    if (PREDICT_FALSE(masked_pos < tail_size_)) {
+      // Just fill the tail buffer with the beginning data.
+      const size_t p = size_ + masked_pos;
+      memcpy(&buffer_[p], bytes, std::min(n, tail_size_ - masked_pos));
+    }
+  }
+
+  // Size of the ringbuffer is (1 << window_bits) + tail_size_.
+  const uint32_t size_;
+  const uint32_t mask_;
+  const uint32_t tail_size_;
+  const uint32_t total_size_;
+
+  uint32_t cur_size_;
+  // Position to write in the ring buffer.
+  uint32_t pos_;
+  // The actual ring buffer containing the copy of the last two bytes, the data,
+  // and the copy of the beginning as a tail.
+  uint8_t *data_;
+  // The start of the ringbuffer.
+  uint8_t *buffer_;
+};
+
+}  // namespace brotli
+
+#endif  // BROTLI_ENC_RINGBUFFER_H_
diff --git a/third_party/brotli/enc/static_dict.cc b/third_party/brotli/enc/static_dict.cc
new file mode 100644
index 0000000..27177b1
--- /dev/null
+++ b/third_party/brotli/enc/static_dict.cc
@@ -0,0 +1,455 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+#include "./static_dict.h"
+
+#include <algorithm>
+
+#include "./dictionary.h"
+#include "./find_match_length.h"
+#include "./static_dict_lut.h"
+#include "./transform.h"
+
+namespace brotli {
+
+inline uint32_t Hash(const uint8_t *data) {
+  uint32_t h = BROTLI_UNALIGNED_LOAD32(data) * kDictHashMul32;
+  // The higher bits contain more mixture from the multiplication,
+  // so we take our results from there.
+  return h >> (32 - kDictNumBits);
+}
+
+inline void AddMatch(size_t distance, size_t len, size_t len_code,
+                     uint32_t* matches) {
+  uint32_t match = static_cast<uint32_t>((distance << 5) + len_code);
+  matches[len] = std::min(matches[len], match);
+}
+
+inline size_t DictMatchLength(const uint8_t* data,
+                              size_t id,
+                              size_t len,
+                              size_t maxlen) {
+  const size_t offset = kBrotliDictionaryOffsetsByLength[len] + len * id;
+  return FindMatchLengthWithLimit(&kBrotliDictionary[offset], data,
+                                  std::min(len, maxlen));
+}
+
+inline bool IsMatch(DictWord w, const uint8_t* data, size_t max_length) {
+  if (w.len > max_length) return false;
+  const size_t offset = kBrotliDictionaryOffsetsByLength[w.len] + w.len * w.idx;
+  const uint8_t* dict = &kBrotliDictionary[offset];
+  if (w.transform == 0) {
+    // Match against base dictionary word.
+    return FindMatchLengthWithLimit(dict, data, w.len) == w.len;
+  } else if (w.transform == 10) {
+    // Match against uppercase first transform.
+    // Note that there are only ASCII uppercase words in the lookup table.
+    return (dict[0] >= 'a' && dict[0] <= 'z' &&
+            (dict[0] ^ 32) == data[0] &&
+            FindMatchLengthWithLimit(&dict[1], &data[1], w.len - 1u) ==
+            w.len - 1u);
+  } else {
+    // Match against uppercase all transform.
+    // Note that there are only ASCII uppercase words in the lookup table.
+    for (size_t i = 0; i < w.len; ++i) {
+      if (dict[i] >= 'a' && dict[i] <= 'z') {
+        if ((dict[i] ^ 32) != data[i]) return false;
+      } else {
+        if (dict[i] != data[i]) return false;
+      }
+    }
+    return true;
+  }
+}
+
+bool FindAllStaticDictionaryMatches(const uint8_t* data,
+                                    size_t min_length,
+                                    size_t max_length,
+                                    uint32_t* matches) {
+  bool found_match = false;
+  size_t key = Hash(data);
+  size_t bucket = kStaticDictionaryBuckets[key];
+  if (bucket != 0) {
+    size_t num = bucket & 0xff;
+    size_t offset = bucket >> 8;
+    for (size_t i = 0; i < num; ++i) {
+      const DictWord w = kStaticDictionaryWords[offset + i];
+      const size_t l = w.len;
+      const size_t n = 1u << kBrotliDictionarySizeBitsByLength[l];
+      const size_t id = w.idx;
+      if (w.transform == 0) {
+        const size_t matchlen = DictMatchLength(data, id, l, max_length);
+        // Transform "" + kIdentity + ""
+        if (matchlen == l) {
+          AddMatch(id, l, l, matches);
+          found_match = true;
+        }
+        // Transforms "" + kOmitLast1 + "" and "" + kOmitLast1 + "ing "
+        if (matchlen >= l - 1) {
+          AddMatch(id + 12 * n, l - 1, l, matches);
+          if (l + 2 < max_length &&
+              data[l - 1] == 'i' && data[l] == 'n' && data[l + 1] == 'g' &&
+              data[l + 2] == ' ') {
+            AddMatch(id + 49 * n, l + 3, l, matches);
+          }
+          found_match = true;
+        }
+        // Transform "" + kOmitLastN + "" (N = 2 .. 9)
+        size_t minlen = min_length;
+        if (l > 9) minlen = std::max(minlen, l - 9);
+        size_t maxlen = std::min(matchlen, l - 2);
+        for (size_t len = minlen; len <= maxlen; ++len) {
+          AddMatch(id + kOmitLastNTransforms[l - len] * n, len, l, matches);
+          found_match = true;
+        }
+        if (matchlen < l || l + 6 >= max_length) {
+          continue;
+        }
+        const uint8_t* s = &data[l];
+        // Transforms "" + kIdentity + <suffix>
+        if (s[0] == ' ') {
+          AddMatch(id + n, l + 1, l, matches);
+          if (s[1] == 'a') {
+            if (s[2] == ' ') {
+              AddMatch(id + 28 * n, l + 3, l, matches);
+            } else if (s[2] == 's') {
+              if (s[3] == ' ') AddMatch(id + 46 * n, l + 4, l, matches);
+            } else if (s[2] == 't') {
+              if (s[3] == ' ') AddMatch(id + 60 * n, l + 4, l, matches);
+            } else if (s[2] == 'n') {
+              if (s[3] == 'd' && s[4] == ' ') {
+                AddMatch(id + 10 * n, l + 5, l, matches);
+              }
+            }
+          } else if (s[1] == 'b') {
+            if (s[2] == 'y' && s[3] == ' ') {
+              AddMatch(id + 38 * n, l + 4, l, matches);
+          }
+          } else if (s[1] == 'i') {
+            if (s[2] == 'n') {
+              if (s[3] == ' ') AddMatch(id + 16 * n, l + 4, l, matches);
+            } else if (s[2] == 's') {
+              if (s[3] == ' ') AddMatch(id + 47 * n, l + 4, l, matches);
+            }
+          } else if (s[1] == 'f') {
+            if (s[2] == 'o') {
+              if (s[3] == 'r' && s[4] == ' ') {
+                AddMatch(id + 25 * n, l + 5, l, matches);
+              }
+            } else if (s[2] == 'r') {
+              if (s[3] == 'o' && s[4] == 'm' && s[5] == ' ') {
+                AddMatch(id + 37 * n, l + 6, l, matches);
+              }
+            }
+          } else if (s[1] == 'o') {
+            if (s[2] == 'f') {
+              if (s[3] == ' ') AddMatch(id + 8 * n, l + 4, l, matches);
+            } else if (s[2] == 'n') {
+              if (s[3] == ' ') AddMatch(id + 45 * n, l + 4, l, matches);
+            }
+          } else if (s[1] == 'n') {
+            if (s[2] == 'o' && s[3] == 't' && s[4] == ' ') {
+              AddMatch(id + 80 * n, l + 5, l, matches);
+            }
+          } else if (s[1] == 't') {
+            if (s[2] == 'h') {
+              if (s[3] == 'e') {
+                if (s[4] == ' ') AddMatch(id + 5 * n, l + 5, l, matches);
+              } else if (s[3] == 'a') {
+                if (s[4] == 't' && s[5] == ' ') {
+                  AddMatch(id + 29 * n, l + 6, l, matches);
+                }
+              }
+            } else if (s[2] == 'o') {
+              if (s[3] == ' ') AddMatch(id + 17 * n, l + 4, l, matches);
+            }
+          } else if (s[1] == 'w') {
+            if (s[2] == 'i' && s[3] == 't' && s[4] == 'h' && s[5] == ' ') {
+              AddMatch(id + 35 * n, l + 6, l, matches);
+            }
+          }
+        } else if (s[0] == '"') {
+          AddMatch(id + 19 * n, l + 1, l, matches);
+          if (s[1] == '>') {
+            AddMatch(id + 21 * n, l + 2, l, matches);
+          }
+        } else if (s[0] == '.') {
+          AddMatch(id + 20 * n, l + 1, l, matches);
+          if (s[1] == ' ') {
+            AddMatch(id + 31 * n, l + 2, l, matches);
+            if (s[2] == 'T' && s[3] == 'h') {
+              if (s[4] == 'e') {
+                if (s[5] == ' ') AddMatch(id + 43 * n, l + 6, l, matches);
+              } else if (s[4] == 'i') {
+                if (s[5] == 's' && s[6] == ' ') {
+                  AddMatch(id + 75 * n, l + 7, l, matches);
+                }
+              }
+            }
+          }
+        } else if (s[0] == ',') {
+          AddMatch(id + 76 * n, l + 1, l, matches);
+          if (s[1] == ' ') {
+            AddMatch(id + 14 * n, l + 2, l, matches);
+          }
+        } else if (s[0] == '\n') {
+          AddMatch(id + 22 * n, l + 1, l, matches);
+          if (s[1] == '\t') {
+            AddMatch(id + 50 * n, l + 2, l, matches);
+          }
+        } else if (s[0] == ']') {
+          AddMatch(id + 24 * n, l + 1, l, matches);
+        } else if (s[0] == '\'') {
+          AddMatch(id + 36 * n, l + 1, l, matches);
+        } else if (s[0] == ':') {
+          AddMatch(id + 51 * n, l + 1, l, matches);
+        } else if (s[0] == '(') {
+          AddMatch(id + 57 * n, l + 1, l, matches);
+        } else if (s[0] == '=') {
+          if (s[1] == '"') {
+            AddMatch(id + 70 * n, l + 2, l, matches);
+          } else if (s[1] == '\'') {
+            AddMatch(id + 86 * n, l + 2, l, matches);
+          }
+        } else if (s[0] == 'a') {
+          if (s[1] == 'l' && s[2] == ' ') {
+            AddMatch(id + 84 * n, l + 3, l, matches);
+          }
+        } else if (s[0] == 'e') {
+          if (s[1] == 'd') {
+            if (s[2] == ' ') AddMatch(id + 53 * n, l + 3, l, matches);
+          } else if (s[1] == 'r') {
+            if (s[2] == ' ') AddMatch(id + 82 * n, l + 3, l, matches);
+          } else if (s[1] == 's') {
+            if (s[2] == 't' && s[3] == ' ') {
+              AddMatch(id + 95 * n, l + 4, l, matches);
+            }
+          }
+        } else if (s[0] == 'f') {
+          if (s[1] == 'u' && s[2] == 'l' && s[3] == ' ') {
+            AddMatch(id + 90 * n, l + 4, l, matches);
+          }
+        } else if (s[0] == 'i') {
+          if (s[1] == 'v') {
+            if (s[2] == 'e' && s[3] == ' ') {
+            AddMatch(id + 92 * n, l + 4, l, matches);
+            }
+          } else if (s[1] == 'z') {
+            if (s[2] == 'e' && s[3] == ' ') {
+              AddMatch(id + 100 * n, l + 4, l, matches);
+            }
+          }
+        } else if (s[0] == 'l') {
+          if (s[1] == 'e') {
+            if (s[2] == 's' && s[3] == 's' && s[4] == ' ') {
+              AddMatch(id + 93 * n, l + 5, l, matches);
+            }
+          } else if (s[1] == 'y') {
+            if (s[2] == ' ') AddMatch(id + 61 * n, l + 3, l, matches);
+          }
+        } else if (s[0] == 'o') {
+          if (s[1] == 'u' && s[2] == 's' && s[3] == ' ') {
+            AddMatch(id + 106 * n, l + 4, l, matches);
+          }
+        }
+      } else {
+        // Set t=false for kUppercaseFirst and
+        //     t=true otherwise (kUppercaseAll) transform.
+        const bool t = w.transform != kUppercaseFirst;
+        if (!IsMatch(w, data, max_length)) {
+          continue;
+        }
+        // Transform "" + kUppercase{First,All} + ""
+        AddMatch(id + (t ? 44 : 9) * n, l, l, matches);
+        found_match = true;
+        if (l + 1 >= max_length) {
+          continue;
+        }
+        // Transforms "" + kUppercase{First,All} + <suffix>
+        const uint8_t* s = &data[l];
+        if (s[0] == ' ') {
+          AddMatch(id + (t ? 68 : 4) * n, l + 1, l, matches);
+        } else if (s[0] == '"') {
+          AddMatch(id + (t ? 87 : 66) * n, l + 1, l, matches);
+          if (s[1] == '>') {
+            AddMatch(id + (t ? 97 : 69) * n, l + 2, l, matches);
+          }
+        } else if (s[0] == '.') {
+          AddMatch(id + (t ? 101 : 79) * n, l + 1, l, matches);
+          if (s[1] == ' ') {
+            AddMatch(id + (t ? 114 : 88) * n, l + 2, l, matches);
+          }
+        } else if (s[0] == ',') {
+          AddMatch(id + (t ? 112 : 99) * n, l + 1, l, matches);
+          if (s[1] == ' ') {
+            AddMatch(id + (t ? 107 : 58) * n, l + 2, l, matches);
+          }
+        } else if (s[0] == '\'') {
+          AddMatch(id + (t ? 94 : 74) * n, l + 1, l, matches);
+        } else if (s[0] == '(') {
+          AddMatch(id + (t ? 113 : 78) * n, l + 1, l, matches);
+        } else if (s[0] == '=') {
+          if (s[1] == '"') {
+            AddMatch(id + (t ? 105 : 104) * n, l + 2, l, matches);
+          } else if (s[1] == '\'') {
+            AddMatch(id + (t ? 116 : 108) * n, l + 2, l, matches);
+          }
+        }
+      }
+    }
+  }
+  // Transforms with prefixes " " and "."
+  if (max_length >= 5 && (data[0] == ' ' || data[0] == '.')) {
+    bool is_space = (data[0] == ' ');
+    key = Hash(&data[1]);
+    bucket = kStaticDictionaryBuckets[key];
+    size_t num = bucket & 0xff;
+    size_t offset = bucket >> 8;
+    for (size_t i = 0; i < num; ++i) {
+      const DictWord w = kStaticDictionaryWords[offset + i];
+      const size_t l = w.len;
+      const size_t n = 1u << kBrotliDictionarySizeBitsByLength[l];
+      const size_t id = w.idx;
+      if (w.transform == 0) {
+        if (!IsMatch(w, &data[1], max_length - 1)) {
+          continue;
+        }
+        // Transforms " " + kIdentity + "" and "." + kIdentity + ""
+        AddMatch(id + (is_space ? 6 : 32) * n, l + 1, l, matches);
+        found_match = true;
+        if (l + 2 >= max_length) {
+          continue;
+        }
+        // Transforms " " + kIdentity + <suffix> and "." + kIdentity + <suffix>
+        const uint8_t* s = &data[l + 1];
+        if (s[0] == ' ') {
+          AddMatch(id + (is_space ? 2 : 77) * n, l + 2, l, matches);
+        } else if (s[0] == '(') {
+          AddMatch(id + (is_space ? 89 : 67) * n, l + 2, l, matches);
+        } else if (is_space) {
+          if (s[0] == ',') {
+            AddMatch(id + 103 * n, l + 2, l, matches);
+            if (s[1] == ' ') {
+              AddMatch(id + 33 * n, l + 3, l, matches);
+            }
+          } else if (s[0] == '.') {
+            AddMatch(id + 71 * n, l + 2, l, matches);
+            if (s[1] == ' ') {
+              AddMatch(id + 52 * n, l + 3, l, matches);
+            }
+          } else if (s[0] == '=') {
+            if (s[1] == '"') {
+              AddMatch(id + 81 * n, l + 3, l, matches);
+            } else if (s[1] == '\'') {
+              AddMatch(id + 98 * n, l + 3, l, matches);
+            }
+          }
+        }
+      } else if (is_space) {
+        // Set t=false for kUppercaseFirst and
+        //     t=true otherwise (kUppercaseAll) transform.
+        const bool t = w.transform != kUppercaseFirst;
+        if (!IsMatch(w, &data[1], max_length - 1)) {
+          continue;
+        }
+        // Transforms " " + kUppercase{First,All} + ""
+        AddMatch(id + (t ? 85 : 30) * n, l + 1, l, matches);
+        found_match = true;
+        if (l + 2 >= max_length) {
+          continue;
+        }
+        // Transforms " " + kUppercase{First,All} + <suffix>
+        const uint8_t* s = &data[l + 1];
+        if (s[0] == ' ') {
+          AddMatch(id + (t ? 83 : 15) * n, l + 2, l, matches);
+        } else if (s[0] == ',') {
+          if (!t) {
+            AddMatch(id + 109 * n, l + 2, l, matches);
+        }
+          if (s[1] == ' ') {
+            AddMatch(id + (t ? 111 : 65) * n, l + 3, l, matches);
+          }
+        } else if (s[0] == '.') {
+          AddMatch(id + (t ? 115 : 96) * n, l + 2, l, matches);
+          if (s[1] == ' ') {
+            AddMatch(id + (t ? 117 : 91) * n, l + 3, l, matches);
+          }
+        } else if (s[0] == '=') {
+          if (s[1] == '"') {
+            AddMatch(id + (t ? 110 : 118) * n, l + 3, l, matches);
+          } else if (s[1] == '\'') {
+            AddMatch(id + (t ? 119 : 120) * n, l + 3, l, matches);
+          }
+        }
+      }
+    }
+  }
+  if (max_length >= 6) {
+    // Transforms with prefixes "e ", "s ", ", " and "\xc2\xa0"
+    if ((data[1] == ' ' &&
+         (data[0] == 'e' || data[0] == 's' || data[0] == ',')) ||
+        (data[0] == 0xc2 && data[1] == 0xa0)) {
+      key = Hash(&data[2]);
+      bucket = kStaticDictionaryBuckets[key];
+      size_t num = bucket & 0xff;
+      size_t offset = bucket >> 8;
+      for (size_t i = 0; i < num; ++i) {
+        const DictWord w = kStaticDictionaryWords[offset + i];
+        const size_t l = w.len;
+        const size_t n = 1u << kBrotliDictionarySizeBitsByLength[l];
+        const size_t id = w.idx;
+        if (w.transform == 0 && IsMatch(w, &data[2], max_length - 2)) {
+          if (data[0] == 0xc2) {
+            AddMatch(id + 102 * n, l + 2, l, matches);
+            found_match = true;
+          } else if (l + 2 < max_length && data[l + 2] == ' ') {
+            size_t t = data[0] == 'e' ? 18 : (data[0] == 's' ? 7 : 13);
+            AddMatch(id + t * n, l + 3, l, matches);
+            found_match = true;
+          }
+        }
+      }
+    }
+  }
+  if (max_length >= 9) {
+    // Transforms with prefixes " the " and ".com/"
+    if ((data[0] == ' ' && data[1] == 't' && data[2] == 'h' &&
+         data[3] == 'e' && data[4] == ' ') ||
+        (data[0] == '.' && data[1] == 'c' && data[2] == 'o' &&
+         data[3] == 'm' && data[4] == '/')) {
+      key = Hash(&data[5]);
+      bucket = kStaticDictionaryBuckets[key];
+      size_t num = bucket & 0xff;
+      size_t offset = bucket >> 8;
+      for (size_t i = 0; i < num; ++i) {
+        const DictWord w = kStaticDictionaryWords[offset + i];
+        const size_t l = w.len;
+        const size_t n = 1u << kBrotliDictionarySizeBitsByLength[l];
+        const size_t id = w.idx;
+        if (w.transform == 0 && IsMatch(w, &data[5], max_length - 5)) {
+          AddMatch(id + (data[0] == ' ' ? 41 : 72) * n, l + 5, l, matches);
+          found_match = true;
+          if (l + 5 < max_length) {
+            const uint8_t* s = &data[l + 5];
+            if (data[0] == ' ') {
+              if (l + 8 < max_length &&
+                  s[0] == ' ' && s[1] == 'o' && s[2] == 'f' && s[3] == ' ') {
+                AddMatch(id + 62 * n, l + 9, l, matches);
+                if (l + 12 < max_length &&
+                    s[4] == 't' && s[5] == 'h' && s[6] == 'e' && s[7] == ' ') {
+                  AddMatch(id + 73 * n, l + 13, l, matches);
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  return found_match;
+}
+
+}  // namespace brotli
diff --git a/third_party/brotli/enc/static_dict.h b/third_party/brotli/enc/static_dict.h
new file mode 100644
index 0000000..d293934
--- /dev/null
+++ b/third_party/brotli/enc/static_dict.h
@@ -0,0 +1,32 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Class to model the static dictionary.
+
+#ifndef BROTLI_ENC_STATIC_DICT_H_
+#define BROTLI_ENC_STATIC_DICT_H_
+
+#include "./types.h"
+
+namespace brotli {
+
+static const size_t kMaxDictionaryMatchLen = 37;
+static const uint32_t kInvalidMatch = 0xfffffff;
+
+// Matches data against static dictionary words, and for each length l,
+// for which a match is found, updates matches[l] to be the minimum possible
+//   (distance << 5) + len_code.
+// Prerequisites:
+//   matches array is at least kMaxDictionaryMatchLen + 1 long
+//   all elements are initialized to kInvalidMatch
+bool FindAllStaticDictionaryMatches(const uint8_t* data,
+                                    size_t min_length,
+                                    size_t max_length,
+                                    uint32_t* matches);
+
+}  // namespace brotli
+
+#endif  // BROTLI_ENC_STATIC_DICT_H_
diff --git a/third_party/brotli/enc/static_dict_lut.h b/third_party/brotli/enc/static_dict_lut.h
new file mode 100644
index 0000000..267c7711
--- /dev/null
+++ b/third_party/brotli/enc/static_dict_lut.h
@@ -0,0 +1,4127 @@
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Lookup table for static dictionary and transforms.
+
+#ifndef BROTLI_ENC_DICTIONARY_LUT_H_
+#define BROTLI_ENC_DICTIONARY_LUT_H_
+
+#include "./types.h"
+
+namespace brotli {
+
+static const int kDictNumBits = 15
+;static const uint32_t kDictHashMul32 = 0x1e35a7bd;
+
+struct DictWord {
+  uint8_t len;
+  uint8_t transform;
+  uint16_t idx;
+};
+
+static const uint32_t kStaticDictionaryBuckets[] = {
+ 0x000002, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000203, 0x00050e, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x001301, 0x000000, 0x000000, 0x000000, 0x001401, 0x000000, 0x001501, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x001602,
+ 0x000000, 0x000000, 0x001804, 0x000000, 0x001c18, 0x000000, 0x003402, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x003606, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x003c0f, 0x004b12, 0x000000, 0x000000,
+ 0x000000, 0x005d02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x005f01, 0x000000, 0x006001, 0x000000, 0x006101, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x006202, 0x006405, 0x006902, 0x006b02,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x006d01, 0x000000, 0x006e01,
+ 0x006f01, 0x000000, 0x007005, 0x007506, 0x007b01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x007c03, 0x007f01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x008002, 0x000000, 0x000000, 0x008201, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x008303, 0x000000, 0x000000, 0x008602, 0x000000, 0x000000,
+ 0x000000, 0x008801, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x008901,
+ 0x008a03, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x008d01, 0x008e01, 0x008f01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x009001, 0x000000, 0x000000, 0x000000, 0x009103, 0x009402, 0x009601, 0x009701,
+ 0x000000, 0x000000, 0x009801, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x009901, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x009a05, 0x000000, 0x000000, 0x000000, 0x000000, 0x009f16, 0x00b501,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x00b605, 0x000000,
+ 0x000000, 0x000000, 0x00bb01, 0x00bc03, 0x000000, 0x000000, 0x00bf02, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x00c103, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x00c405, 0x00c907,
+ 0x00d001, 0x000000, 0x000000, 0x00d10e, 0x000000, 0x00df01, 0x000000, 0x000000,
+ 0x000000, 0x00e006, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x00e601, 0x000000, 0x000000, 0x000000,
+ 0x00e708, 0x000000, 0x00ef02, 0x000000, 0x000000, 0x00f102, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x00f302, 0x000000, 0x000000, 0x000000, 0x00f503, 0x000000, 0x000000,
+ 0x00f802, 0x00fa02, 0x00fc05, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x010103, 0x000000, 0x000000, 0x010402, 0x010604, 0x000000, 0x000000, 0x000000,
+ 0x010a01, 0x000000, 0x000000, 0x010b01, 0x000000, 0x010c02, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x010e01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x010f01, 0x000000,
+ 0x011004, 0x000000, 0x011401, 0x000000, 0x011508, 0x011d01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x011e02, 0x000000, 0x012001, 0x012101, 0x012204, 0x000000,
+ 0x000000, 0x000000, 0x012601, 0x000000, 0x000000, 0x012701, 0x012801, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x012901, 0x000000, 0x000000, 0x000000, 0x012a06, 0x000000, 0x000000,
+ 0x013013, 0x000000, 0x014303, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x014601, 0x000000, 0x014701, 0x014807, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x014f04, 0x000000, 0x000000, 0x015301, 0x000000, 0x015401, 0x015501, 0x015603,
+ 0x000000, 0x000000, 0x015902, 0x000000, 0x015b01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x015c02, 0x015e04, 0x000000, 0x000000, 0x016208,
+ 0x000000, 0x016a01, 0x000000, 0x016b04, 0x000000, 0x016f01, 0x017001, 0x000000,
+ 0x017102, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x017301, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x017402, 0x000000, 0x017601, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x017701, 0x017811, 0x000000, 0x000000, 0x018901,
+ 0x018a01, 0x018b02, 0x000000, 0x000000, 0x018d02, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x018f08, 0x000000, 0x000000, 0x01970c, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x01a301, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x01a401, 0x000000, 0x000000, 0x01a501, 0x01a606, 0x000000, 0x000000, 0x01ac06,
+ 0x01b201, 0x01b306, 0x01b901, 0x000000, 0x000000, 0x01ba01, 0x000000, 0x01bb01,
+ 0x01bc08, 0x01c403, 0x01c701, 0x000000, 0x01c801, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x01c901, 0x000000, 0x000000, 0x000000, 0x01ca01, 0x000000,
+ 0x000000, 0x000000, 0x01cb02, 0x000000, 0x01cd01, 0x01ce02, 0x01d001, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x01d103, 0x01d401, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x01d504, 0x000000, 0x000000,
+ 0x000000, 0x01d902, 0x000000, 0x01db07, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x01e202, 0x000000, 0x01e401, 0x000000, 0x000000, 0x000000, 0x01e502, 0x000000,
+ 0x000000, 0x01e703, 0x01ea01, 0x01eb05, 0x000000, 0x000000, 0x01f002, 0x01f201,
+ 0x01f301, 0x000000, 0x01f404, 0x000000, 0x000000, 0x000000, 0x01f801, 0x000000,
+ 0x000000, 0x01f901, 0x000000, 0x000000, 0x000000, 0x01fa02, 0x000000, 0x000000,
+ 0x000000, 0x01fc02, 0x000000, 0x000000, 0x000000, 0x000000, 0x01fe01, 0x01ff07,
+ 0x02060a, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x021001,
+ 0x021104, 0x000000, 0x000000, 0x000000, 0x021509, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x021e0a, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x022804, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x022c03, 0x022f01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x023003, 0x000000, 0x023301, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x023401, 0x023509, 0x000000, 0x023e2c, 0x000000, 0x026a01, 0x000000,
+ 0x026b03, 0x000000, 0x000000, 0x026e01, 0x026f01, 0x000000, 0x000000, 0x000000,
+ 0x027001, 0x000000, 0x000000, 0x027101, 0x027201, 0x000000, 0x000000, 0x027302,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x027501, 0x000000, 0x02760a, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x028002, 0x000000, 0x000000, 0x000000, 0x000000, 0x02820d, 0x028f0c, 0x029b05,
+ 0x000000, 0x000000, 0x000000, 0x02a001, 0x000000, 0x000000, 0x000000, 0x02a108,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x02a905, 0x000000, 0x02ae03, 0x000000, 0x02b103, 0x000000, 0x02b406, 0x02ba01,
+ 0x02bb04, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x02bf01,
+ 0x02c002, 0x000000, 0x000000, 0x000000, 0x000000, 0x02c203, 0x02c501, 0x000000,
+ 0x02c60f, 0x000000, 0x000000, 0x000000, 0x000000, 0x02d503, 0x000000, 0x000000,
+ 0x02d801, 0x000000, 0x000000, 0x000000, 0x02d901, 0x02da15, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x02ef0a, 0x000000, 0x000000, 0x000000, 0x02f901,
+ 0x000000, 0x02fa04, 0x000000, 0x000000, 0x02fe03, 0x000000, 0x000000, 0x000000,
+ 0x030104, 0x030501, 0x000000, 0x000000, 0x030601, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x030701,
+ 0x000000, 0x000000, 0x000000, 0x030806, 0x030e02, 0x000000, 0x000000, 0x000000,
+ 0x031003, 0x031302, 0x000000, 0x000000, 0x000000, 0x000000, 0x031503, 0x000000,
+ 0x000000, 0x000000, 0x031801, 0x000000, 0x000000, 0x000000, 0x000000, 0x03190a,
+ 0x000000, 0x000000, 0x03230f, 0x033202, 0x033406, 0x000000, 0x033a07, 0x000000,
+ 0x000000, 0x000000, 0x034101, 0x000000, 0x000000, 0x034206, 0x000000, 0x000000,
+ 0x000000, 0x034803, 0x000000, 0x034b06, 0x000000, 0x035101, 0x035208, 0x035a01,
+ 0x000000, 0x035b0e, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x036902, 0x000000, 0x036b01, 0x000000, 0x036c0d, 0x037903, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x037c01,
+ 0x037d04, 0x038101, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x038201, 0x000000, 0x000000, 0x000000, 0x038304, 0x038702, 0x038901,
+ 0x000000, 0x000000, 0x000000, 0x038a01, 0x000000, 0x038b01, 0x038c01, 0x000000,
+ 0x038d01, 0x000000, 0x000000, 0x000000, 0x000000, 0x038e05, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x039306, 0x000000, 0x000000, 0x000000, 0x039903,
+ 0x039c05, 0x000000, 0x03a104, 0x000000, 0x03a509, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x03ae01, 0x000000, 0x000000, 0x03af09, 0x000000, 0x03b801,
+ 0x03b901, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x03ba07,
+ 0x000000, 0x03c101, 0x03c20d, 0x000000, 0x000000, 0x03cf01, 0x000000, 0x000000,
+ 0x03d001, 0x03d101, 0x03d201, 0x03d301, 0x000000, 0x03d403, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x03d701, 0x000000, 0x000000, 0x03d802, 0x000000, 0x000000,
+ 0x03da02, 0x03dc02, 0x03de01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x03df01, 0x000000, 0x000000, 0x000000,
+ 0x03e003, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x03e304,
+ 0x000000, 0x000000, 0x000000, 0x03e702, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x03e903, 0x000000, 0x000000, 0x000000, 0x000000, 0x03ec02, 0x03ee02,
+ 0x000000, 0x000000, 0x000000, 0x03f001, 0x000000, 0x000000, 0x000000, 0x03f101,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x03f201, 0x000000,
+ 0x03f302, 0x000000, 0x000000, 0x000000, 0x000000, 0x03f502, 0x03f704, 0x000000,
+ 0x000000, 0x000000, 0x03fb01, 0x000000, 0x03fc01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x03fd02, 0x000000, 0x000000, 0x000000, 0x03ff01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x040001, 0x000000, 0x000000, 0x040101,
+ 0x040204, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x040602, 0x000000,
+ 0x040801, 0x000000, 0x000000, 0x000000, 0x000000, 0x040903, 0x000000, 0x000000,
+ 0x000000, 0x040c03, 0x040f02, 0x000000, 0x000000, 0x000000, 0x041101, 0x04120a,
+ 0x000000, 0x000000, 0x041c01, 0x000000, 0x041d03, 0x000000, 0x000000, 0x042001,
+ 0x000000, 0x000000, 0x000000, 0x042102, 0x000000, 0x000000, 0x042301, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x042401, 0x000000,
+ 0x000000, 0x042501, 0x000000, 0x000000, 0x000000, 0x000000, 0x042601, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x042701, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x042801, 0x000000, 0x000000, 0x000000, 0x000000, 0x042901, 0x042a02,
+ 0x000000, 0x000000, 0x000000, 0x042c01, 0x042d02, 0x042f01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x043002, 0x000000, 0x043205, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x043704, 0x043b04, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x043f06, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x044501, 0x000000, 0x04460c, 0x000000, 0x045205, 0x000000,
+ 0x000000, 0x000000, 0x045702, 0x045905, 0x000000, 0x045e03, 0x000000, 0x046104,
+ 0x000000, 0x000000, 0x046503, 0x000000, 0x046801, 0x000000, 0x046902, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x046b0c, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x047701, 0x000000, 0x000000, 0x047801, 0x047902,
+ 0x000000, 0x047b01, 0x047c01, 0x000000, 0x000000, 0x047d01, 0x047e01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x047f01, 0x000000, 0x048001, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x048109, 0x000000, 0x048a01, 0x000000, 0x000000,
+ 0x000000, 0x048b01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x048c02,
+ 0x000000, 0x048e03, 0x000000, 0x049101, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x049201, 0x049301, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x049402, 0x049602, 0x049809, 0x000000, 0x04a109,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x04aa1a, 0x000000, 0x000000, 0x04c403, 0x000000, 0x000000,
+ 0x04c703, 0x000000, 0x000000, 0x04ca01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x04cb01, 0x04cc01, 0x000000, 0x000000, 0x04cd01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x04ce02,
+ 0x000000, 0x000000, 0x000000, 0x04d00a, 0x000000, 0x000000, 0x04da01, 0x04db02,
+ 0x04dd02, 0x04df06, 0x000000, 0x000000, 0x000000, 0x000000, 0x04e501, 0x04e603,
+ 0x04e901, 0x04ea01, 0x000000, 0x000000, 0x000000, 0x04eb01, 0x000000, 0x000000,
+ 0x04ec01, 0x000000, 0x000000, 0x000000, 0x04ed02, 0x04ef01, 0x000000, 0x000000,
+ 0x04f001, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x04f101, 0x000000, 0x04f206,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x04f801, 0x04f902, 0x04fb0d, 0x050802,
+ 0x000000, 0x000000, 0x050a01, 0x050b01, 0x050c01, 0x000000, 0x000000, 0x050d01,
+ 0x050e01, 0x050f06, 0x000000, 0x000000, 0x000000, 0x000000, 0x051502, 0x000000,
+ 0x051707, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x051e01, 0x051f02, 0x000000, 0x052102, 0x000000, 0x052304,
+ 0x052701, 0x052801, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x052901, 0x052a01, 0x052b0b, 0x000000, 0x053601, 0x000000, 0x053705,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x053c01, 0x053d04, 0x000000, 0x05410b,
+ 0x000000, 0x054c01, 0x000000, 0x000000, 0x000000, 0x054d02, 0x054f01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x055001, 0x000000, 0x000000,
+ 0x000000, 0x055103, 0x055401, 0x000000, 0x05550d, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x056207, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x056902, 0x000000, 0x056b07, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x057208, 0x000000, 0x000000, 0x000000, 0x000000, 0x057a02,
+ 0x000000, 0x057c02, 0x000000, 0x000000, 0x057e01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x057f01, 0x058001, 0x000000, 0x058102, 0x000000, 0x000000,
+ 0x000000, 0x058301, 0x058403, 0x05870d, 0x000000, 0x000000, 0x059416, 0x05aa03,
+ 0x000000, 0x000000, 0x05ad01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x05ae01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x05af03, 0x000000, 0x000000, 0x000000, 0x000000, 0x05b201,
+ 0x05b301, 0x05b40e, 0x05c202, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x05c403, 0x000000, 0x05c701, 0x000000, 0x05c805, 0x000000, 0x000000,
+ 0x05cd09, 0x000000, 0x000000, 0x05d601, 0x000000, 0x000000, 0x000000, 0x05d702,
+ 0x000000, 0x000000, 0x05d901, 0x05da02, 0x05dc13, 0x05ef01, 0x05f005, 0x000000,
+ 0x000000, 0x000000, 0x05f502, 0x000000, 0x000000, 0x000000, 0x000000, 0x05f701,
+ 0x05f804, 0x000000, 0x05fc03, 0x05ff01, 0x000000, 0x000000, 0x000000, 0x060001,
+ 0x06010b, 0x060c01, 0x000000, 0x060d08, 0x061501, 0x06160d, 0x062301, 0x000000,
+ 0x062402, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x062604, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x062a14, 0x000000, 0x063e04, 0x000000, 0x064201, 0x000000, 0x064301, 0x000000,
+ 0x064403, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x064702, 0x064901,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x064a04, 0x000000, 0x064e01, 0x000000,
+ 0x064f02, 0x065101, 0x000000, 0x065203, 0x000000, 0x000000, 0x06550c, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x066101, 0x000000, 0x000000, 0x000000, 0x066206,
+ 0x000000, 0x000000, 0x000000, 0x066802, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x066a07, 0x000000, 0x000000,
+ 0x000000, 0x067102, 0x000000, 0x000000, 0x067301, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x067401, 0x000000, 0x000000, 0x000000, 0x067501, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x067607, 0x000000, 0x067d01, 0x000000, 0x000000,
+ 0x067e01, 0x067f04, 0x000000, 0x000000, 0x068301, 0x000000, 0x000000, 0x068401,
+ 0x068502, 0x000000, 0x068701, 0x068801, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x068901, 0x000000, 0x000000, 0x000000, 0x068a01, 0x068b04, 0x068f02,
+ 0x000000, 0x069105, 0x000000, 0x000000, 0x069611, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x06a701, 0x000000, 0x000000, 0x06a810, 0x000000, 0x000000,
+ 0x06b80d, 0x000000, 0x000000, 0x000000, 0x000000, 0x06c501, 0x06c602, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x06c802, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x06ca01, 0x000000, 0x000000, 0x06cb01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x06cc02, 0x06ce02,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x06d004, 0x000000, 0x000000, 0x000000,
+ 0x06d402, 0x000000, 0x000000, 0x000000, 0x06d609, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x06df05, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x06e413, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x06f701, 0x000000,
+ 0x06f802, 0x06fa01, 0x000000, 0x000000, 0x000000, 0x000000, 0x06fb01, 0x06fc01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x06fd01, 0x06fe02, 0x070005, 0x000000,
+ 0x070501, 0x070602, 0x000000, 0x000000, 0x000000, 0x000000, 0x070802, 0x000000,
+ 0x070a02, 0x070c01, 0x000000, 0x000000, 0x000000, 0x070d05, 0x071201, 0x000000,
+ 0x071302, 0x071507, 0x000000, 0x071c01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x071d0b, 0x07280f, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x073709, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x074002, 0x000000, 0x000000, 0x000000, 0x074202, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x074405, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x074937, 0x000000, 0x078004, 0x078404, 0x000000, 0x000000, 0x000000,
+ 0x078801, 0x078901, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x078a01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x078b02, 0x000000, 0x000000, 0x000000, 0x078d0c, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x079902, 0x000000, 0x000000,
+ 0x079b02, 0x000000, 0x000000, 0x000000, 0x000000, 0x079d07, 0x000000, 0x07a401,
+ 0x000000, 0x07a507, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x07ac02,
+ 0x07ae01, 0x000000, 0x000000, 0x000000, 0x000000, 0x07af01, 0x000000, 0x07b002,
+ 0x000000, 0x07b201, 0x07b301, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x07b402, 0x000000, 0x000000, 0x000000, 0x000000, 0x07b601,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x07b703, 0x07ba03, 0x000000, 0x07bd02,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x07bf04, 0x07c302, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x07c50e, 0x07d304, 0x07d704, 0x000000, 0x000000, 0x000000,
+ 0x07db01, 0x07dc02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x07de01, 0x000000, 0x07df01, 0x07e004,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x07e404, 0x000000, 0x000000, 0x07e804,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x07ec07, 0x07f304, 0x07f702,
+ 0x000000, 0x07f901, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x07fa02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x07fc01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x07fd01, 0x07fe01,
+ 0x000000, 0x07ff01, 0x08000a, 0x000000, 0x080a04, 0x000000, 0x000000, 0x080e01,
+ 0x000000, 0x080f01, 0x081001, 0x000000, 0x000000, 0x081103, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x081401, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x081501, 0x000000, 0x081601, 0x000000, 0x081708, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x081f02, 0x082101, 0x082202, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x082401, 0x000000, 0x082502, 0x082701, 0x082810, 0x083802,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x083a09, 0x000000, 0x000000, 0x084301,
+ 0x084403, 0x000000, 0x084702, 0x000000, 0x000000, 0x084901, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x084a02, 0x000000, 0x000000, 0x084c02, 0x084e01,
+ 0x084f02, 0x000000, 0x000000, 0x000000, 0x085107, 0x000000, 0x000000, 0x000000,
+ 0x085802, 0x085a01, 0x085b01, 0x085c03, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x085f01, 0x086001, 0x000000,
+ 0x000000, 0x086103, 0x086401, 0x000000, 0x000000, 0x000000, 0x000000, 0x086501,
+ 0x000000, 0x000000, 0x086607, 0x086d01, 0x000000, 0x086e01, 0x000000, 0x086f01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x087001, 0x087120,
+ 0x000000, 0x000000, 0x089108, 0x089903, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x089c0c, 0x08a803, 0x000000, 0x08ab01, 0x000000, 0x08ac01,
+ 0x000000, 0x08ad02, 0x08af0d, 0x000000, 0x000000, 0x000000, 0x000000, 0x08bc01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x08bd01, 0x000000, 0x08be02,
+ 0x08c001, 0x000000, 0x000000, 0x08c101, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x08c209, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x08cb01, 0x000000, 0x000000, 0x08cc04, 0x000000, 0x000000, 0x000000, 0x08d001,
+ 0x08d102, 0x000000, 0x000000, 0x000000, 0x08d302, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x08d502, 0x000000, 0x08d705, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x08dc01, 0x08dd01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x08de02,
+ 0x000000, 0x08e004, 0x000000, 0x000000, 0x000000, 0x000000, 0x08e401, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x08e501, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x08e601, 0x000000, 0x08e703, 0x000000, 0x08ea04, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x08ee02,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x08f001,
+ 0x08f101, 0x000000, 0x000000, 0x000000, 0x000000, 0x08f201, 0x000000, 0x08f301,
+ 0x000000, 0x000000, 0x000000, 0x08f402, 0x08f601, 0x08f702, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x08f905, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x08fe02, 0x000000, 0x090001, 0x000000, 0x000000,
+ 0x090101, 0x000000, 0x090206, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x090801,
+ 0x090901, 0x090a01, 0x090b02, 0x000000, 0x000000, 0x090d01, 0x000000, 0x090e03,
+ 0x000000, 0x091101, 0x000000, 0x000000, 0x091201, 0x000000, 0x091302, 0x000000,
+ 0x091509, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x091e01, 0x000000, 0x091f02, 0x092101, 0x092201, 0x000000, 0x09230f, 0x000000,
+ 0x000000, 0x000000, 0x093214, 0x000000, 0x094607, 0x000000, 0x094d04, 0x095101,
+ 0x000000, 0x095207, 0x000000, 0x000000, 0x095901, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x095a02, 0x000000, 0x095c01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x095d01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x095e03, 0x096102, 0x096304, 0x096703, 0x096a02, 0x000000, 0x000000,
+ 0x000000, 0x096c02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x096e01, 0x000000, 0x000000, 0x096f01, 0x097002, 0x097201, 0x000000, 0x097305,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x097801, 0x000000, 0x000000,
+ 0x000000, 0x097901, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x097a01, 0x097b01,
+ 0x000000, 0x097c01, 0x000000, 0x000000, 0x097d04, 0x098102, 0x000000, 0x098305,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x098801, 0x098903,
+ 0x000000, 0x098c01, 0x000000, 0x000000, 0x098d0b, 0x099802, 0x000000, 0x099a03,
+ 0x000000, 0x000000, 0x099d02, 0x000000, 0x099f0d, 0x000000, 0x09ac01, 0x000000,
+ 0x09ad08, 0x09b505, 0x000000, 0x000000, 0x000000, 0x09ba02, 0x000000, 0x000000,
+ 0x09bc01, 0x000000, 0x000000, 0x09bd01, 0x000000, 0x09be12, 0x000000, 0x09d00a,
+ 0x09da01, 0x000000, 0x000000, 0x000000, 0x000000, 0x09db04, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x09df01, 0x09e001, 0x09e101, 0x000000,
+ 0x000000, 0x09e202, 0x000000, 0x09e401, 0x000000, 0x000000, 0x09e501, 0x09e601,
+ 0x000000, 0x09e701, 0x09e801, 0x000000, 0x09e901, 0x000000, 0x09ea01, 0x09eb05,
+ 0x000000, 0x000000, 0x000000, 0x09f001, 0x09f102, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x09f301, 0x000000, 0x000000, 0x09f401,
+ 0x000000, 0x09f505, 0x09fa02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x09fc03, 0x000000, 0x09ff01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0a000f, 0x000000,
+ 0x0a0f01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x0a1001, 0x0a1101, 0x000000, 0x000000, 0x000000, 0x0a1201,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0a1301,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x0a1402, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x0a1601, 0x000000, 0x0a1704, 0x000000, 0x0a1b02, 0x0a1d01, 0x000000,
+ 0x000000, 0x000000, 0x0a1e02, 0x000000, 0x000000, 0x000000, 0x000000, 0x0a2001,
+ 0x0a2101, 0x000000, 0x0a2206, 0x000000, 0x0a2801, 0x0a2901, 0x000000, 0x000000,
+ 0x0a2a02, 0x000000, 0x0a2c01, 0x000000, 0x000000, 0x000000, 0x0a2d01, 0x0a2e04,
+ 0x0a3204, 0x000000, 0x0a3602, 0x000000, 0x000000, 0x000000, 0x0a3802, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x0a3a01, 0x000000, 0x000000, 0x0a3b01,
+ 0x000000, 0x000000, 0x000000, 0x0a3c02, 0x000000, 0x0a3e02, 0x000000, 0x0a4003,
+ 0x000000, 0x000000, 0x0a4301, 0x0a4406, 0x000000, 0x000000, 0x0a4a01, 0x0a4b01,
+ 0x0a4c02, 0x000000, 0x000000, 0x0a4e03, 0x000000, 0x000000, 0x000000, 0x0a5101,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x0a5201, 0x000000, 0x0a5305, 0x000000,
+ 0x0a5806, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0a5e01,
+ 0x0a5f01, 0x000000, 0x000000, 0x0a6001, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x0a6101, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0a6205,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x0a6715, 0x0a7c02, 0x000000, 0x0a7e01,
+ 0x000000, 0x0a7f01, 0x000000, 0x000000, 0x0a8005, 0x000000, 0x000000, 0x0a8501,
+ 0x000000, 0x0a8603, 0x000000, 0x000000, 0x0a8903, 0x000000, 0x0a8c05, 0x0a9101,
+ 0x000000, 0x000000, 0x000000, 0x0a9202, 0x000000, 0x0a9401, 0x0a9501, 0x0a9609,
+ 0x000000, 0x000000, 0x000000, 0x0a9f0a, 0x0aa905, 0x0aae03, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x0ab102, 0x0ab307, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x0aba01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0abb01,
+ 0x000000, 0x000000, 0x0abc01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x0abd02, 0x000000, 0x000000, 0x0abf02, 0x0ac104, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x0ac504, 0x000000, 0x000000, 0x000000, 0x000000, 0x0ac901,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x0aca01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x0acb03, 0x0ace01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x0acf02, 0x000000, 0x000000, 0x0ad101, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0ad201, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0ad301,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0ad403, 0x0ad707, 0x000000,
+ 0x000000, 0x0ade01, 0x000000, 0x000000, 0x0adf05, 0x000000, 0x0ae401, 0x000000,
+ 0x0ae502, 0x000000, 0x000000, 0x000000, 0x0ae701, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0ae802,
+ 0x0aea01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0aeb01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0aec02, 0x0aee04,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x0af203, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x0af501, 0x000000, 0x0af601, 0x0af709, 0x0b0002, 0x0b0202, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x0b0401, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x0b0501, 0x0b0601, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x0b0704, 0x000000, 0x000000, 0x0b0b06, 0x000000, 0x0b1102,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0b1302, 0x000000,
+ 0x0b1501, 0x000000, 0x000000, 0x0b1602, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0b1801, 0x000000, 0x000000,
+ 0x000000, 0x0b1901, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0b1a01,
+ 0x0b1b02, 0x000000, 0x000000, 0x000000, 0x000000, 0x0b1d01, 0x000000, 0x000000,
+ 0x0b1e02, 0x000000, 0x0b2004, 0x000000, 0x0b2404, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x0b2801, 0x000000, 0x000000, 0x000000, 0x000000, 0x0b2901,
+ 0x000000, 0x0b2a01, 0x000000, 0x000000, 0x0b2b02, 0x000000, 0x0b2d06, 0x0b3307,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x0b3a01, 0x000000, 0x0b3b01, 0x000000,
+ 0x000000, 0x0b3c01, 0x0b3d06, 0x0b4305, 0x0b4801, 0x0b4901, 0x000000, 0x000000,
+ 0x0b4a01, 0x000000, 0x000000, 0x0b4b0e, 0x000000, 0x000000, 0x000000, 0x0b5906,
+ 0x0b5f01, 0x000000, 0x0b6003, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x0b6312, 0x000000, 0x0b7501, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x0b7604, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x0b7a01, 0x000000, 0x0b7b01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x0b7c05, 0x000000, 0x000000, 0x000000, 0x0b8103, 0x000000,
+ 0x0b8401, 0x000000, 0x000000, 0x0b8504, 0x0b8901, 0x0b8a04, 0x000000, 0x000000,
+ 0x000000, 0x0b8e02, 0x0b9001, 0x000000, 0x000000, 0x0b9101, 0x000000, 0x0b9201,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0b9301, 0x0b9401,
+ 0x0b9501, 0x0b9602, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x0b9801, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0b9905,
+ 0x0b9e07, 0x000000, 0x0ba501, 0x0ba601, 0x0ba705, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x0bac01, 0x000000, 0x000000, 0x0bad01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0bae07, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0bb502, 0x000000,
+ 0x0bb701, 0x0bb801, 0x000000, 0x000000, 0x0bb901, 0x000000, 0x000000, 0x000000,
+ 0x0bba09, 0x000000, 0x000000, 0x0bc30a, 0x000000, 0x000000, 0x0bcd02, 0x000000,
+ 0x000000, 0x0bcf01, 0x000000, 0x000000, 0x0bd002, 0x0bd203, 0x000000, 0x000000,
+ 0x000000, 0x0bd504, 0x000000, 0x000000, 0x000000, 0x000000, 0x0bd901, 0x0bda01,
+ 0x000000, 0x000000, 0x0bdb03, 0x000000, 0x0bde0a, 0x000000, 0x0be801, 0x000000,
+ 0x000000, 0x0be901, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x0bea02, 0x000000, 0x0bec04, 0x000000, 0x000000, 0x000000, 0x000000, 0x0bf001,
+ 0x000000, 0x0bf105, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x0bf60a, 0x000000, 0x000000, 0x0c0001, 0x0c0104, 0x0c0501,
+ 0x0c0601, 0x000000, 0x0c0706, 0x0c0d01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x0c0e05, 0x000000, 0x0c1303, 0x000000,
+ 0x0c1604, 0x000000, 0x0c1a01, 0x000000, 0x000000, 0x000000, 0x0c1b01, 0x000000,
+ 0x0c1c01, 0x0c1d14, 0x000000, 0x0c3102, 0x000000, 0x000000, 0x000000, 0x0c3301,
+ 0x000000, 0x0c3407, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x0c3b02, 0x0c3d02, 0x000000, 0x000000, 0x0c3f0b, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x0c4a02, 0x000000, 0x000000, 0x0c4c01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0c4d01, 0x0c4e01, 0x0c4f06,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x0c5502, 0x000000, 0x000000, 0x0c5701,
+ 0x000000, 0x000000, 0x0c5801, 0x000000, 0x000000, 0x0c5901, 0x000000, 0x0c5a03,
+ 0x0c5d02, 0x0c5f01, 0x000000, 0x000000, 0x0c6001, 0x0c6101, 0x000000, 0x000000,
+ 0x0c620b, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x0c6d02, 0x000000, 0x0c6f04, 0x000000, 0x000000, 0x0c7306, 0x000000, 0x000000,
+ 0x0c790a, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0c8305,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x0c8807, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x0c8f01, 0x0c9002, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x0c9201, 0x000000, 0x000000, 0x0c9302, 0x0c9501, 0x000000, 0x0c9601,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x0c9701, 0x000000, 0x0c9801, 0x0c9902,
+ 0x000000, 0x0c9b05, 0x0ca006, 0x000000, 0x0ca602, 0x0ca801, 0x0ca909, 0x000000,
+ 0x000000, 0x0cb201, 0x0cb301, 0x0cb402, 0x0cb605, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0cbb01, 0x000000, 0x000000,
+ 0x0cbc06, 0x000000, 0x000000, 0x000000, 0x0cc204, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0cc607, 0x000000, 0x000000,
+ 0x000000, 0x0ccd04, 0x000000, 0x0cd102, 0x000000, 0x000000, 0x000000, 0x0cd301,
+ 0x000000, 0x000000, 0x000000, 0x0cd401, 0x0cd501, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x0cd605, 0x0cdb02, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x0cdd02, 0x0cdf03, 0x000000, 0x000000, 0x0ce201, 0x0ce301,
+ 0x0ce401, 0x000000, 0x0ce502, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x0ce702, 0x0ce902, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x0ceb03, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x0cee01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x0cef02, 0x0cf101, 0x0cf203, 0x000000, 0x0cf501,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x0cf602, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0cf801, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x0cf902, 0x000000, 0x000000, 0x0cfb01, 0x0cfc01, 0x000000, 0x000000, 0x0cfd02,
+ 0x000000, 0x000000, 0x0cff01, 0x0d0002, 0x0d0204, 0x000000, 0x000000, 0x0d0602,
+ 0x000000, 0x000000, 0x0d0801, 0x000000, 0x0d0905, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x0d0e04, 0x0d1201, 0x000000, 0x000000, 0x000000, 0x0d1303, 0x000000,
+ 0x000000, 0x0d1603, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x0d1901, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x0d1a0a, 0x000000, 0x000000, 0x0d2401, 0x0d2501,
+ 0x0d2601, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0d2701,
+ 0x0d2801, 0x000000, 0x0d2903, 0x000000, 0x000000, 0x0d2c03, 0x000000, 0x000000,
+ 0x0d2f01, 0x000000, 0x000000, 0x0d3002, 0x000000, 0x0d3208, 0x0d3a03, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x0d3d0c, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x0d4901, 0x000000, 0x0d4a21, 0x0d6b01,
+ 0x0d6c02, 0x0d6e02, 0x000000, 0x000000, 0x0d7001, 0x000000, 0x000000, 0x000000,
+ 0x0d7107, 0x000000, 0x000000, 0x0d7801, 0x000000, 0x000000, 0x000000, 0x0d7901,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0d7a01,
+ 0x000000, 0x000000, 0x0d7b01, 0x000000, 0x0d7c03, 0x0d7f01, 0x000000, 0x0d8001,
+ 0x000000, 0x000000, 0x0d8101, 0x000000, 0x0d8201, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0d8309, 0x000000,
+ 0x000000, 0x0d8c01, 0x0d8d05, 0x000000, 0x000000, 0x0d9205, 0x000000, 0x000000,
+ 0x000000, 0x0d9707, 0x0d9e02, 0x0da001, 0x000000, 0x0da101, 0x000000, 0x000000,
+ 0x0da208, 0x0daa01, 0x000000, 0x0dab01, 0x000000, 0x000000, 0x0dac01, 0x000000,
+ 0x000000, 0x000000, 0x0dad0c, 0x000000, 0x0db902, 0x000000, 0x000000, 0x000000,
+ 0x0dbb01, 0x0dbc01, 0x000000, 0x000000, 0x000000, 0x0dbd02, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x0dbf01, 0x0dc001, 0x0dc104, 0x000000, 0x000000, 0x0dc504,
+ 0x0dc901, 0x000000, 0x000000, 0x000000, 0x000000, 0x0dca05, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x0dcf03, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x0dd202, 0x0dd401, 0x000000, 0x000000, 0x0dd502, 0x0dd703,
+ 0x000000, 0x0dda01, 0x0ddb02, 0x000000, 0x000000, 0x0ddd03, 0x000000, 0x0de001,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0de101,
+ 0x000000, 0x0de203, 0x000000, 0x0de501, 0x000000, 0x0de604, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0dea12, 0x000000,
+ 0x0dfc12, 0x000000, 0x000000, 0x000000, 0x0e0e01, 0x000000, 0x000000, 0x000000,
+ 0x0e0f01, 0x000000, 0x0e1001, 0x000000, 0x0e1101, 0x0e1203, 0x000000, 0x000000,
+ 0x0e1502, 0x0e1702, 0x000000, 0x0e1901, 0x0e1a01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0e1b04, 0x0e1f03,
+ 0x0e2205, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0e2704, 0x0e2b01,
+ 0x000000, 0x0e2c05, 0x0e3101, 0x0e3201, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x0e3301, 0x000000, 0x0e3401, 0x000000, 0x000000, 0x0e350d,
+ 0x0e4201, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0e4301,
+ 0x0e4403, 0x000000, 0x000000, 0x000000, 0x000000, 0x0e4701, 0x0e4801, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x0e4901, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x0e4a02, 0x000000, 0x0e4c02, 0x0e4e01, 0x0e4f01, 0x000000, 0x0e501b,
+ 0x000000, 0x0e6b02, 0x000000, 0x000000, 0x000000, 0x0e6d02, 0x0e6f02, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x0e7102, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x0e7301, 0x000000, 0x000000, 0x0e7407, 0x000000,
+ 0x000000, 0x000000, 0x0e7b01, 0x0e7c02, 0x000000, 0x000000, 0x000000, 0x0e7e01,
+ 0x0e7f0b, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0e8a01, 0x000000,
+ 0x0e8b01, 0x0e8c01, 0x000000, 0x000000, 0x0e8d02, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x0e8f01, 0x0e9005, 0x000000, 0x0e9501, 0x0e9602,
+ 0x0e9806, 0x000000, 0x000000, 0x000000, 0x0e9e02, 0x000000, 0x0ea001, 0x000000,
+ 0x000000, 0x0ea101, 0x000000, 0x000000, 0x0ea201, 0x0ea309, 0x000000, 0x0eac02,
+ 0x000000, 0x0eae07, 0x0eb501, 0x0eb601, 0x000000, 0x0eb701, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x0eb802, 0x000000, 0x000000, 0x0eba03, 0x000000, 0x0ebd01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0ebe01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0ebf01, 0x000000, 0x0ec009,
+ 0x0ec902, 0x000000, 0x0ecb01, 0x0ecc02, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0ece14, 0x000000, 0x0ee203,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0ee501, 0x0ee601, 0x0ee704,
+ 0x0eeb01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x0eec04, 0x000000, 0x000000, 0x0ef00a, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x0efa0d, 0x000000, 0x000000, 0x0f0701, 0x0f0801, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x0f0901, 0x0f0a02, 0x0f0c06, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x0f1201, 0x000000, 0x0f1302, 0x0f1501, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x0f160a, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x0f2001, 0x000000, 0x0f2101, 0x000000, 0x0f220b, 0x0f2d01,
+ 0x000000, 0x0f2e05, 0x000000, 0x000000, 0x000000, 0x000000, 0x0f3315, 0x0f4801,
+ 0x000000, 0x0f490b, 0x000000, 0x000000, 0x000000, 0x0f5406, 0x0f5a03, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x0f5d07, 0x0f6401, 0x0f6501, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x0f6601, 0x000000, 0x000000, 0x000000, 0x0f6701, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x0f6802, 0x000000, 0x0f6a09, 0x000000,
+ 0x000000, 0x000000, 0x0f7301, 0x0f7401, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0f7501, 0x000000, 0x0f7606,
+ 0x0f7c01, 0x000000, 0x000000, 0x000000, 0x000000, 0x0f7d01, 0x000000, 0x000000,
+ 0x000000, 0x0f7e01, 0x000000, 0x000000, 0x000000, 0x0f7f06, 0x0f8501, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x0f8602, 0x0f8801, 0x0f8902, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x0f8b05, 0x000000, 0x0f9001, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0f9119, 0x0faa06,
+ 0x000000, 0x000000, 0x0fb001, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0fb101, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x0fb204, 0x000000, 0x0fb604, 0x000000, 0x000000,
+ 0x000000, 0x0fba01, 0x0fbb03, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x0fbe03, 0x0fc101, 0x000000, 0x000000, 0x0fc202,
+ 0x0fc402, 0x0fc601, 0x0fc713, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x0fda01, 0x000000, 0x0fdb01, 0x0fdc01, 0x000000, 0x0fdd01, 0x0fde03, 0x0fe106,
+ 0x000000, 0x000000, 0x0fe710, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x0ff703, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x0ffa03, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x0ffd01, 0x0ffe01, 0x000000, 0x000000, 0x0fff02,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x100101, 0x100202, 0x000000,
+ 0x000000, 0x000000, 0x100403, 0x000000, 0x100701, 0x000000, 0x000000, 0x000000,
+ 0x100803, 0x100b05, 0x000000, 0x101002, 0x000000, 0x000000, 0x101201, 0x10130a,
+ 0x000000, 0x101d01, 0x000000, 0x000000, 0x101e01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x101f04, 0x102301, 0x102401, 0x000000,
+ 0x102503, 0x000000, 0x000000, 0x000000, 0x102804, 0x000000, 0x000000, 0x102c03,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x102f02, 0x103101, 0x103201, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x1033a3, 0x000000, 0x000000, 0x10d603, 0x000000,
+ 0x000000, 0x000000, 0x10d90f, 0x10e802, 0x000000, 0x10ea01, 0x10eb01, 0x000000,
+ 0x10ec01, 0x000000, 0x10ed01, 0x000000, 0x000000, 0x000000, 0x10ee01, 0x000000,
+ 0x10ef01, 0x000000, 0x000000, 0x000000, 0x10f005, 0x000000, 0x000000, 0x000000,
+ 0x10f503, 0x10f801, 0x10f904, 0x10fd01, 0x000000, 0x10fe01, 0x10ff02, 0x000000,
+ 0x110101, 0x110209, 0x000000, 0x000000, 0x110b05, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x111004, 0x000000, 0x000000, 0x000000, 0x111401, 0x000000, 0x111503,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x111801, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x111902, 0x000000, 0x000000, 0x000000, 0x111b01, 0x000000, 0x000000,
+ 0x000000, 0x111c01, 0x111d02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x111f01, 0x000000, 0x000000, 0x000000, 0x000000, 0x112001,
+ 0x000000, 0x000000, 0x000000, 0x112105, 0x000000, 0x000000, 0x000000, 0x112607,
+ 0x112d09, 0x000000, 0x000000, 0x000000, 0x000000, 0x113602, 0x113801, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x113901, 0x000000, 0x000000, 0x113a03, 0x000000,
+ 0x113d01, 0x113e03, 0x114109, 0x000000, 0x114a01, 0x114b02, 0x114d01, 0x000000,
+ 0x114e11, 0x000000, 0x115f01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x116002, 0x000000, 0x000000, 0x000000, 0x116201, 0x116301, 0x000000, 0x116401,
+ 0x116502, 0x000000, 0x116703, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x116a04, 0x000000, 0x116e03, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x117101, 0x000000, 0x117202, 0x000000, 0x117401, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x117501, 0x117602, 0x000000, 0x117802,
+ 0x000000, 0x000000, 0x117a02, 0x000000, 0x000000, 0x000000, 0x000000, 0x117c01,
+ 0x117d01, 0x000000, 0x000000, 0x000000, 0x117e02, 0x118001, 0x000000, 0x118102,
+ 0x000000, 0x118302, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x118502, 0x000000, 0x000000, 0x118709, 0x000000, 0x000000, 0x11900b,
+ 0x000000, 0x119b02, 0x000000, 0x000000, 0x119d01, 0x119e09, 0x000000, 0x11a703,
+ 0x11aa01, 0x000000, 0x11ab01, 0x000000, 0x11ac02, 0x000000, 0x11ae01, 0x000000,
+ 0x000000, 0x11af02, 0x000000, 0x000000, 0x000000, 0x000000, 0x11b101, 0x000000,
+ 0x11b201, 0x000000, 0x000000, 0x11b301, 0x000000, 0x000000, 0x000000, 0x11b402,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x11b601, 0x000000, 0x000000,
+ 0x000000, 0x11b705, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x11bc02,
+ 0x11be01, 0x11bf01, 0x11c002, 0x11c201, 0x000000, 0x11c302, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x11c501, 0x11c602, 0x000000, 0x11c809, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x11d109, 0x000000, 0x000000, 0x11da03, 0x000000, 0x000000,
+ 0x000000, 0x11dd01, 0x000000, 0x000000, 0x000000, 0x11de01, 0x000000, 0x11df01,
+ 0x000000, 0x11e004, 0x000000, 0x000000, 0x000000, 0x11e401, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x11e504, 0x000000, 0x000000, 0x11e902, 0x000000,
+ 0x000000, 0x000000, 0x11eb09, 0x000000, 0x000000, 0x11f401, 0x000000, 0x11f512,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x120701, 0x120801, 0x000000, 0x120901,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x120a01, 0x000000, 0x120b01, 0x000000,
+ 0x000000, 0x120c03, 0x000000, 0x120f01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x121020, 0x000000, 0x000000, 0x000000, 0x000000, 0x123002, 0x000000,
+ 0x123208, 0x000000, 0x123a01, 0x000000, 0x000000, 0x000000, 0x123b02, 0x123d02,
+ 0x000000, 0x123f01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x124003,
+ 0x12430b, 0x000000, 0x000000, 0x000000, 0x000000, 0x124e0a, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x125802, 0x000000, 0x000000, 0x000000, 0x000000, 0x125a02,
+ 0x000000, 0x125c01, 0x000000, 0x000000, 0x000000, 0x000000, 0x125d04, 0x000000,
+ 0x000000, 0x126107, 0x000000, 0x000000, 0x126801, 0x000000, 0x000000, 0x000000,
+ 0x126901, 0x126a01, 0x126b01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x126c03,
+ 0x000000, 0x000000, 0x126f01, 0x000000, 0x127008, 0x127806, 0x127e02, 0x000000,
+ 0x000000, 0x000000, 0x128002, 0x000000, 0x000000, 0x000000, 0x128201, 0x000000,
+ 0x000000, 0x000000, 0x128301, 0x000000, 0x000000, 0x000000, 0x128401, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x128503, 0x000000, 0x128801, 0x128901,
+ 0x128a01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x128b01, 0x000000, 0x000000, 0x000000, 0x128c02, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x128e23, 0x12b101, 0x000000, 0x12b201, 0x000000,
+ 0x12b308, 0x12bb01, 0x000000, 0x000000, 0x12bc01, 0x12bd01, 0x000000, 0x12be07,
+ 0x12c501, 0x12c602, 0x000000, 0x000000, 0x000000, 0x000000, 0x12c801, 0x12c901,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x12ca01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x12cb01, 0x000000, 0x12cc02, 0x000000,
+ 0x000000, 0x12ce06, 0x000000, 0x12d401, 0x12d501, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x12d601, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x12d702, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x12d902, 0x000000, 0x000000, 0x000000, 0x12db01, 0x000000, 0x12dc0e,
+ 0x000000, 0x000000, 0x000000, 0x12ea04, 0x000000, 0x000000, 0x12ee06, 0x000000,
+ 0x12f402, 0x12f603, 0x12f901, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x12fa05, 0x000000, 0x12ff0f, 0x000000, 0x000000, 0x130e01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x130f01, 0x000000, 0x000000, 0x000000, 0x000000, 0x131001,
+ 0x000000, 0x131101, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x131201, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x131302, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x131501, 0x131601,
+ 0x131706, 0x131d02, 0x131f06, 0x000000, 0x132503, 0x000000, 0x000000, 0x13280a,
+ 0x000000, 0x000000, 0x133201, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x133301, 0x133402, 0x133602, 0x133805, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x133d01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x133e02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x134001, 0x000000, 0x134101, 0x134207, 0x000000, 0x13490e, 0x000000,
+ 0x135701, 0x000000, 0x135804, 0x135c03, 0x135f04, 0x136337, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x139a01, 0x139b02, 0x139d01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x139e01, 0x000000, 0x000000,
+ 0x000000, 0x139f01, 0x000000, 0x000000, 0x000000, 0x13a003, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x13a301, 0x000000, 0x000000, 0x000000, 0x000000, 0x13a401,
+ 0x13a501, 0x13a602, 0x000000, 0x13a801, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x13a901, 0x13aa01, 0x000000,
+ 0x13ab01, 0x000000, 0x000000, 0x13ac01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x13ad01, 0x000000, 0x000000, 0x13ae02, 0x000000, 0x000000, 0x000000, 0x13b001,
+ 0x13b102, 0x000000, 0x000000, 0x000000, 0x000000, 0x13b305, 0x13b805, 0x13bd01,
+ 0x000000, 0x13be02, 0x000000, 0x13c003, 0x000000, 0x000000, 0x000000, 0x13c303,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x13c601, 0x000000, 0x13c701,
+ 0x13c802, 0x000000, 0x13ca01, 0x000000, 0x000000, 0x000000, 0x13cb08, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x13d301, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x13d401, 0x000000, 0x000000, 0x13d502, 0x13d703,
+ 0x000000, 0x000000, 0x13da02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x13dc0d, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x13e901, 0x13ea02, 0x13ec04, 0x13f002, 0x13f201, 0x000000,
+ 0x13f301, 0x000000, 0x13f401, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x13f507, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x13fc01, 0x13fd03, 0x000000, 0x140001, 0x000000, 0x140108, 0x000000, 0x000000,
+ 0x140907, 0x000000, 0x000000, 0x000000, 0x14100b, 0x000000, 0x000000, 0x000000,
+ 0x141b03, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x141e03, 0x142101, 0x000000, 0x000000, 0x000000, 0x142201, 0x000000, 0x000000,
+ 0x142303, 0x142602, 0x142801, 0x000000, 0x000000, 0x000000, 0x000000, 0x142901,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x142a01, 0x142b02, 0x000000, 0x142d01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x142e05, 0x000000, 0x000000, 0x000000, 0x143306, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x143901, 0x143a0b, 0x000000,
+ 0x000000, 0x144501, 0x000000, 0x000000, 0x144601, 0x144702, 0x144904, 0x000000,
+ 0x000000, 0x144d03, 0x145002, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x145203, 0x000000, 0x145503, 0x145804, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x145c01, 0x000000, 0x145d02, 0x145f01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x146001, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x146101, 0x14620c, 0x000000, 0x146e0d,
+ 0x000000, 0x000000, 0x147b05, 0x148005, 0x000000, 0x148501, 0x000000, 0x148602,
+ 0x000000, 0x000000, 0x148801, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x148902, 0x000000, 0x148b0a, 0x149507, 0x000000, 0x149c03, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x149f01, 0x14a001, 0x14a101, 0x14a201,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x14a301, 0x000000, 0x14a402,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x14a601, 0x14a701, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x14a802, 0x14aa03, 0x000000, 0x000000, 0x14ad01, 0x000000, 0x000000,
+ 0x14ae09, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x14b702, 0x000000, 0x000000, 0x14b901, 0x14ba01, 0x14bb01, 0x000000, 0x14bc01,
+ 0x000000, 0x000000, 0x14bd01, 0x000000, 0x000000, 0x000000, 0x000000, 0x14be01,
+ 0x14bf01, 0x000000, 0x14c003, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x14c301, 0x000000, 0x000000, 0x000000, 0x14c408, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x14cc01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x14cd01, 0x000000, 0x14ce02,
+ 0x14d003, 0x000000, 0x14d306, 0x000000, 0x000000, 0x000000, 0x000000, 0x14d902,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x14db01, 0x000000, 0x000000, 0x14dc01, 0x000000, 0x000000, 0x000000, 0x14dd01,
+ 0x000000, 0x14de01, 0x14df01, 0x000000, 0x000000, 0x14e002, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x14e201, 0x14e301, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x14e401,
+ 0x000000, 0x14e504, 0x000000, 0x14e904, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x14ed01, 0x000000, 0x000000, 0x14ee02, 0x000000, 0x000000, 0x14f004, 0x000000,
+ 0x000000, 0x14f402, 0x000000, 0x14f606, 0x000000, 0x14fc06, 0x000000, 0x000000,
+ 0x000000, 0x150201, 0x000000, 0x000000, 0x000000, 0x150302, 0x000000, 0x000000,
+ 0x000000, 0x150502, 0x000000, 0x150701, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x150802, 0x000000, 0x000000, 0x000000, 0x000000, 0x150a01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x150b02, 0x150d03,
+ 0x151003, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x151301, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x151405, 0x151901, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x151a01, 0x000000, 0x000000, 0x000000, 0x151b01, 0x151c01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x151d04, 0x000000, 0x000000, 0x000000, 0x000000, 0x152101,
+ 0x000000, 0x000000, 0x152204, 0x000000, 0x152601, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x152712, 0x153904, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x153d02, 0x000000,
+ 0x153f01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x154001,
+ 0x154101, 0x000000, 0x000000, 0x000000, 0x154201, 0x154303, 0x154601, 0x000000,
+ 0x000000, 0x154701, 0x154802, 0x154a05, 0x000000, 0x000000, 0x000000, 0x154f01,
+ 0x155002, 0x000000, 0x000000, 0x000000, 0x155202, 0x000000, 0x000000, 0x000000,
+ 0x155403, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x155702,
+ 0x000000, 0x155901, 0x000000, 0x000000, 0x155a03, 0x000000, 0x155d03, 0x000000,
+ 0x000000, 0x156001, 0x000000, 0x000000, 0x156102, 0x000000, 0x000000, 0x156301,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x156407, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x156b01, 0x000000, 0x000000, 0x156c01, 0x156d02,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x156f01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x157012, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x158203, 0x000000, 0x000000, 0x000000, 0x158501,
+ 0x000000, 0x158601, 0x000000, 0x000000, 0x158701, 0x000000, 0x000000, 0x000000,
+ 0x158802, 0x000000, 0x158a01, 0x000000, 0x000000, 0x158b01, 0x158c01, 0x000000,
+ 0x158d04, 0x000000, 0x000000, 0x15910c, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x159d01, 0x159e01, 0x000000, 0x000000, 0x159f02, 0x000000, 0x15a105,
+ 0x000000, 0x000000, 0x15a601, 0x000000, 0x15a701, 0x000000, 0x000000, 0x15a802,
+ 0x000000, 0x15aa0a, 0x000000, 0x15b401, 0x000000, 0x000000, 0x15b502, 0x000000,
+ 0x15b707, 0x15be01, 0x000000, 0x000000, 0x000000, 0x000000, 0x15bf03, 0x000000,
+ 0x000000, 0x000000, 0x15c202, 0x15c401, 0x000000, 0x15c501, 0x000000, 0x15c602,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x15c815, 0x000000, 0x000000, 0x15dd02,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x15df09, 0x15e801, 0x000000, 0x000000, 0x000000, 0x000000, 0x15e902,
+ 0x000000, 0x000000, 0x15eb0c, 0x000000, 0x15f701, 0x000000, 0x15f804, 0x000000,
+ 0x000000, 0x000000, 0x15fc0c, 0x000000, 0x160801, 0x000000, 0x160901, 0x160a08,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x161201, 0x000000,
+ 0x000000, 0x000000, 0x161301, 0x161408, 0x000000, 0x161c01, 0x161d10, 0x162d01,
+ 0x000000, 0x162e06, 0x000000, 0x000000, 0x000000, 0x000000, 0x163401, 0x163504,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x163902, 0x163b0b, 0x000000,
+ 0x164603, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x164901, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x164a01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x164b01, 0x000000, 0x000000, 0x164c01, 0x000000, 0x164d02,
+ 0x000000, 0x000000, 0x000000, 0x164f15, 0x000000, 0x166401, 0x000000, 0x166501,
+ 0x166609, 0x000000, 0x000000, 0x166f07, 0x167601, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x167702, 0x000000, 0x167903, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x167c01, 0x167d02, 0x000000, 0x167f01, 0x168002, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x168201, 0x168301, 0x168401, 0x000000, 0x168501,
+ 0x000000, 0x168601, 0x168702, 0x000000, 0x168906, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x168f04, 0x169302, 0x000000, 0x000000, 0x000000, 0x000000, 0x169502,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x169704, 0x000000, 0x000000, 0x169b09,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x16a402, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x16a602, 0x000000, 0x000000, 0x16a80a, 0x000000,
+ 0x000000, 0x000000, 0x16b205, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x16b70b, 0x000000, 0x000000, 0x16c203, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x16c501, 0x16c601, 0x000000,
+ 0x000000, 0x16c701, 0x000000, 0x000000, 0x16c802, 0x000000, 0x16ca09, 0x16d301,
+ 0x16d401, 0x000000, 0x16d504, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x16d902, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x16db03, 0x000000,
+ 0x16de02, 0x16e002, 0x000000, 0x000000, 0x16e202, 0x000000, 0x16e402, 0x000000,
+ 0x000000, 0x16e602, 0x000000, 0x16e808, 0x000000, 0x000000, 0x000000, 0x16f002,
+ 0x16f202, 0x000000, 0x000000, 0x000000, 0x16f402, 0x000000, 0x16f609, 0x000000,
+ 0x000000, 0x000000, 0x16ff01, 0x000000, 0x000000, 0x170002, 0x170203, 0x000000,
+ 0x170501, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x170602,
+ 0x000000, 0x17080a, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x171204, 0x000000, 0x171601, 0x000000, 0x000000, 0x171701, 0x000000, 0x171809,
+ 0x172102, 0x172303, 0x000000, 0x172601, 0x172701, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x172801, 0x172903, 0x000000, 0x172c10, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x173c02, 0x000000, 0x000000, 0x173e02, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x174001, 0x000000, 0x000000,
+ 0x174105, 0x000000, 0x174601, 0x174701, 0x174803, 0x000000, 0x174b0c, 0x000000,
+ 0x000000, 0x000000, 0x175702, 0x175909, 0x176203, 0x176501, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x176601, 0x000000, 0x176702, 0x000000, 0x000000,
+ 0x000000, 0x176901, 0x176a01, 0x000000, 0x000000, 0x176b05, 0x000000, 0x000000,
+ 0x177002, 0x177204, 0x000000, 0x000000, 0x000000, 0x000000, 0x177601, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x177701, 0x000000, 0x000000, 0x177801,
+ 0x000000, 0x177901, 0x000000, 0x000000, 0x000000, 0x177a04, 0x177e02, 0x000000,
+ 0x178002, 0x000000, 0x178204, 0x000000, 0x178602, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x178801, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x178904,
+ 0x000000, 0x178d02, 0x000000, 0x000000, 0x178f01, 0x000000, 0x000000, 0x000000,
+ 0x179005, 0x179502, 0x179701, 0x000000, 0x000000, 0x000000, 0x179804, 0x179c01,
+ 0x000000, 0x000000, 0x179d07, 0x000000, 0x000000, 0x17a401, 0x000000, 0x000000,
+ 0x17a501, 0x000000, 0x17a602, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x17a806, 0x000000, 0x17ae01, 0x000000, 0x000000, 0x000000, 0x17af02,
+ 0x000000, 0x17b105, 0x17b601, 0x17b703, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x17ba01, 0x17bb01, 0x000000, 0x000000, 0x17bc01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x17bd01, 0x17be01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x17bf03, 0x000000, 0x17c201, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x17c304, 0x000000, 0x000000, 0x17c701, 0x000000, 0x17c804,
+ 0x000000, 0x000000, 0x17cc0c, 0x17d802, 0x000000, 0x000000, 0x17da03, 0x000000,
+ 0x17dd01, 0x000000, 0x000000, 0x000000, 0x17de0e, 0x17ec01, 0x17ed03, 0x000000,
+ 0x000000, 0x000000, 0x17f001, 0x000000, 0x000000, 0x000000, 0x000000, 0x17f101,
+ 0x000000, 0x000000, 0x000000, 0x17f203, 0x17f508, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x17fd02, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x17ff02, 0x000000, 0x000000, 0x180105, 0x180602, 0x180803, 0x000000,
+ 0x180b07, 0x000000, 0x181211, 0x000000, 0x182301, 0x182401, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x182502, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x18270b, 0x18320b, 0x000000, 0x000000, 0x183d02, 0x000000, 0x183f04, 0x000000,
+ 0x000000, 0x184301, 0x184401, 0x184501, 0x000000, 0x18460d, 0x000000, 0x000000,
+ 0x000000, 0x185306, 0x000000, 0x000000, 0x000000, 0x185901, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x185a05, 0x185f02, 0x000000, 0x186101,
+ 0x186201, 0x186306, 0x000000, 0x186905, 0x186e02, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x187001, 0x000000, 0x000000, 0x000000, 0x187114, 0x188506,
+ 0x000000, 0x188b01, 0x000000, 0x000000, 0x000000, 0x188c01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x188d22, 0x000000,
+ 0x000000, 0x000000, 0x18af02, 0x000000, 0x000000, 0x18b10a, 0x18bb02, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x18bd01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x18be02,
+ 0x000000, 0x000000, 0x18c001, 0x000000, 0x18c101, 0x000000, 0x18c201, 0x18c310,
+ 0x000000, 0x000000, 0x18d301, 0x18d40c, 0x18e001, 0x000000, 0x000000, 0x000000,
+ 0x18e101, 0x18e201, 0x18e301, 0x000000, 0x18e403, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x18e706, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x18ed01, 0x18ee01, 0x18ef02, 0x000000, 0x000000, 0x000000, 0x000000, 0x18f103,
+ 0x000000, 0x18f408, 0x18fc03, 0x18ff0b, 0x190a03, 0x000000, 0x190d01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x190e01, 0x190f01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x191001, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x191102, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x191301, 0x000000, 0x191402, 0x191602, 0x191804,
+ 0x000000, 0x191c01, 0x191d03, 0x000000, 0x192005, 0x192501, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x192601, 0x192701, 0x000000, 0x000000, 0x192803, 0x000000, 0x000000, 0x192b02,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x192d01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x192e01, 0x192f02, 0x000000, 0x000000, 0x193104, 0x000000, 0x000000,
+ 0x000000, 0x193501, 0x000000, 0x000000, 0x193606, 0x000000, 0x193c01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x193d01, 0x000000, 0x000000,
+ 0x193e01, 0x000000, 0x193f01, 0x000000, 0x194002, 0x194201, 0x000000, 0x000000,
+ 0x000000, 0x19430b, 0x000000, 0x194e01, 0x194f01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x195004, 0x000000, 0x000000, 0x195402,
+ 0x195606, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x195c01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x195d01, 0x195e01, 0x195f02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x196109, 0x000000, 0x000000, 0x000000, 0x196a01, 0x196b03, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x196e01, 0x196f01, 0x000000, 0x000000, 0x000000, 0x000000, 0x197001, 0x000000,
+ 0x000000, 0x000000, 0x197102, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x197301, 0x000000, 0x000000, 0x197401, 0x197501, 0x000000, 0x000000, 0x000000,
+ 0x197601, 0x197701, 0x197802, 0x000000, 0x197a01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x197b04, 0x197f02, 0x000000, 0x198102, 0x000000, 0x000000, 0x19832e,
+ 0x000000, 0x19b105, 0x000000, 0x000000, 0x000000, 0x19b601, 0x000000, 0x19b703,
+ 0x000000, 0x000000, 0x000000, 0x19ba03, 0x000000, 0x000000, 0x000000, 0x19bd01,
+ 0x000000, 0x19be01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x19bf01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x19c001, 0x19c105, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x19c601, 0x19c701, 0x000000, 0x000000, 0x19c801,
+ 0x19c902, 0x19cb04, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x19cf02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x19d101, 0x19d204, 0x000000, 0x19d601, 0x000000, 0x19d702, 0x19d902,
+ 0x19db11, 0x000000, 0x19ec02, 0x000000, 0x000000, 0x000000, 0x000000, 0x19ee02,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x19f001, 0x000000, 0x19f105, 0x000000,
+ 0x000000, 0x000000, 0x19f60d, 0x000000, 0x1a0303, 0x1a0601, 0x000000, 0x1a0702,
+ 0x000000, 0x1a0903, 0x1a0c06, 0x000000, 0x1a1201, 0x1a1301, 0x1a1401, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x1a1501, 0x000000, 0x000000, 0x000000, 0x1a1601, 0x000000, 0x1a170d, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1a240b, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x1a2f01, 0x1a3001, 0x1a3105, 0x000000, 0x000000, 0x1a3602, 0x1a3803, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x1a3b01, 0x000000, 0x000000, 0x000000,
+ 0x1a3c02, 0x000000, 0x1a3e05, 0x1a4301, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x1a4401, 0x1a4502, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x1a4701, 0x1a4806, 0x1a4e02, 0x000000, 0x1a5005,
+ 0x1a5501, 0x000000, 0x000000, 0x1a5607, 0x1a5d01, 0x000000, 0x1a5e01, 0x000000,
+ 0x000000, 0x1a5f01, 0x1a6001, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x1a6102, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1a6307,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1a6a01, 0x000000,
+ 0x000000, 0x1a6b01, 0x1a6c05, 0x000000, 0x000000, 0x000000, 0x1a7106, 0x000000,
+ 0x000000, 0x000000, 0x1a7704, 0x1a7b01, 0x000000, 0x1a7c02, 0x000000, 0x000000,
+ 0x000000, 0x1a7e01, 0x000000, 0x1a7f01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1a8007,
+ 0x000000, 0x000000, 0x000000, 0x1a8701, 0x000000, 0x000000, 0x000000, 0x1a8809,
+ 0x000000, 0x000000, 0x1a9101, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x1a9201, 0x000000, 0x000000, 0x000000, 0x1a9308, 0x000000, 0x000000, 0x000000,
+ 0x1a9b0b, 0x000000, 0x000000, 0x1aa601, 0x000000, 0x1aa70f, 0x1ab60d, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x1ac302, 0x000000, 0x000000, 0x1ac502, 0x000000,
+ 0x1ac701, 0x1ac80a, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x1ad201, 0x000000, 0x1ad302, 0x1ad502, 0x1ad701,
+ 0x000000, 0x000000, 0x000000, 0x1ad801, 0x1ad901, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x1ada02, 0x000000, 0x000000, 0x1adc01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1add01, 0x000000, 0x000000,
+ 0x000000, 0x1ade01, 0x000000, 0x1adf07, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1ae601, 0x000000,
+ 0x1ae703, 0x1aea02, 0x1aec02, 0x000000, 0x1aee04, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1af202, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x1af409, 0x000000, 0x000000, 0x000000, 0x000000, 0x1afd01,
+ 0x000000, 0x1afe01, 0x000000, 0x000000, 0x1aff01, 0x000000, 0x000000, 0x1b0001,
+ 0x1b0101, 0x000000, 0x000000, 0x000000, 0x1b0201, 0x000000, 0x000000, 0x000000,
+ 0x1b0303, 0x1b0605, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x1b0b01, 0x000000, 0x1b0c01, 0x000000, 0x000000, 0x000000, 0x1b0d01, 0x1b0e01,
+ 0x1b0f01, 0x000000, 0x1b1001, 0x000000, 0x1b1101, 0x000000, 0x000000, 0x1b1204,
+ 0x1b1601, 0x000000, 0x1b1703, 0x000000, 0x000000, 0x000000, 0x000000, 0x1b1a01,
+ 0x1b1b01, 0x1b1c01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x1b1d06, 0x1b2301, 0x1b2403, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x1b2702, 0x1b2909, 0x1b3202, 0x1b3401, 0x1b3501,
+ 0x000000, 0x000000, 0x1b3601, 0x1b3701, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1b3801, 0x000000, 0x000000,
+ 0x1b3909, 0x1b4201, 0x000000, 0x000000, 0x1b4303, 0x000000, 0x000000, 0x1b4601,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1b4704, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1b4b02, 0x1b4d02, 0x1b4f03,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1b5211,
+ 0x000000, 0x000000, 0x000000, 0x1b6307, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1b6a02, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1b6c01, 0x000000,
+ 0x000000, 0x1b6d01, 0x1b6e05, 0x1b7302, 0x000000, 0x1b7503, 0x1b7805, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1b7d01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x1b7e07, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1b8501, 0x000000,
+ 0x1b8601, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x1b8704, 0x1b8b02, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x1b8d06, 0x000000, 0x1b9301, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x1b9404, 0x000000, 0x1b9802, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x1b9a02, 0x1b9c01, 0x000000, 0x1b9d01, 0x1b9e01, 0x1b9f06, 0x000000,
+ 0x000000, 0x1ba502, 0x000000, 0x1ba701, 0x1ba802, 0x000000, 0x1baa01, 0x000000,
+ 0x000000, 0x000000, 0x1bab03, 0x1bae01, 0x1baf02, 0x000000, 0x000000, 0x1bb103,
+ 0x000000, 0x1bb40e, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x1bc201, 0x000000, 0x000000, 0x1bc302, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1bc504, 0x000000, 0x1bc901,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1bca01,
+ 0x000000, 0x1bcb01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1bcc01,
+ 0x000000, 0x000000, 0x1bcd06, 0x000000, 0x000000, 0x1bd301, 0x000000, 0x1bd401,
+ 0x000000, 0x000000, 0x1bd502, 0x000000, 0x000000, 0x000000, 0x000000, 0x1bd701,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1bd801, 0x000000, 0x1bd902,
+ 0x000000, 0x1bdb01, 0x1bdc01, 0x000000, 0x000000, 0x1bdd05, 0x000000, 0x000000,
+ 0x1be209, 0x000000, 0x1beb02, 0x1bed02, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x1bef01, 0x000000, 0x000000, 0x000000, 0x1bf003, 0x1bf301, 0x1bf401, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x1bf505, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1bfa02,
+ 0x1bfc04, 0x1c0002, 0x000000, 0x1c0201, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1c0301, 0x000000, 0x1c0408,
+ 0x1c0c01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1c0d03, 0x1c1002,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x1c120e, 0x000000, 0x1c2003, 0x1c2302,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1c2501, 0x1c2604, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x1c2a05, 0x1c2f02, 0x000000, 0x1c3108, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x1c3902, 0x1c3b02, 0x1c3d02, 0x1c3f01, 0x1c4002,
+ 0x1c4202, 0x1c4401, 0x000000, 0x000000, 0x000000, 0x000000, 0x1c4503, 0x1c4801,
+ 0x000000, 0x1c4905, 0x000000, 0x000000, 0x1c4e13, 0x000000, 0x000000, 0x000000,
+ 0x1c6117, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x1c7801, 0x000000, 0x000000, 0x1c7901, 0x1c7a01, 0x000000, 0x000000, 0x1c7b05,
+ 0x000000, 0x1c8003, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x1c8301, 0x000000, 0x1c8401, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x1c8503, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x1c8802, 0x000000, 0x000000, 0x000000, 0x000000, 0x1c8a01, 0x000000, 0x1c8b02,
+ 0x000000, 0x1c8d19, 0x000000, 0x1ca602, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x1ca806, 0x000000, 0x1cae04, 0x1cb201, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x1cb301, 0x000000, 0x1cb401, 0x1cb502,
+ 0x1cb702, 0x1cb903, 0x000000, 0x000000, 0x000000, 0x000000, 0x1cbc01, 0x000000,
+ 0x1cbd08, 0x1cc501, 0x000000, 0x1cc601, 0x1cc705, 0x000000, 0x000000, 0x1ccc01,
+ 0x000000, 0x000000, 0x000000, 0x1ccd02, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x1ccf01, 0x000000, 0x000000, 0x000000, 0x1cd001,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1cd101, 0x000000, 0x1cd201,
+ 0x1cd303, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1cd603, 0x000000,
+ 0x000000, 0x1cd90c, 0x000000, 0x000000, 0x000000, 0x000000, 0x1ce501, 0x000000,
+ 0x000000, 0x000000, 0x1ce601, 0x1ce701, 0x000000, 0x1ce801, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1ce903, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x1cec01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x1ced0f, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x1cfc06, 0x1d0202, 0x1d0406, 0x000000, 0x000000, 0x000000,
+ 0x1d0a01, 0x000000, 0x000000, 0x1d0b01, 0x000000, 0x000000, 0x000000, 0x1d0c01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1d0d05, 0x1d1203,
+ 0x000000, 0x1d1502, 0x000000, 0x1d1708, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1d1f01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x1d2004, 0x000000, 0x000000, 0x1d2401,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1d2501, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x1d2603, 0x1d2906, 0x1d2f04, 0x000000,
+ 0x1d330e, 0x000000, 0x000000, 0x1d4101, 0x000000, 0x1d4202, 0x000000, 0x000000,
+ 0x1d4405, 0x000000, 0x000000, 0x000000, 0x1d4901, 0x1d4a09, 0x000000, 0x000000,
+ 0x1d5304, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1d5701, 0x000000,
+ 0x000000, 0x000000, 0x1d5801, 0x1d5902, 0x1d5b02, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x1d5d01, 0x000000, 0x000000, 0x1d5e02, 0x1d6001, 0x1d6104, 0x000000,
+ 0x000000, 0x000000, 0x1d6503, 0x000000, 0x000000, 0x1d6802, 0x000000, 0x000000,
+ 0x1d6a05, 0x000000, 0x1d6f02, 0x000000, 0x1d7101, 0x000000, 0x1d7202, 0x000000,
+ 0x000000, 0x1d7401, 0x1d7504, 0x1d7901, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x1d7a01, 0x000000, 0x1d7b02, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x1d7d02, 0x000000, 0x000000, 0x1d7f01, 0x1d8001, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x1d8109, 0x1d8a0a, 0x000000, 0x1d9401, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x1d9502, 0x1d9702, 0x000000, 0x1d9903, 0x1d9c02, 0x1d9e01,
+ 0x000000, 0x000000, 0x000000, 0x1d9f03, 0x000000, 0x1da202, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x1da405, 0x000000, 0x000000, 0x000000, 0x1da901,
+ 0x000000, 0x000000, 0x1daa05, 0x000000, 0x000000, 0x1daf02, 0x1db108, 0x1db902,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1dbb01, 0x000000, 0x1dbc01,
+ 0x1dbd01, 0x000000, 0x000000, 0x1dbe01, 0x000000, 0x000000, 0x1dbf04, 0x000000,
+ 0x1dc301, 0x000000, 0x1dc401, 0x1dc501, 0x000000, 0x1dc603, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x1dc901, 0x000000, 0x000000, 0x000000, 0x000000, 0x1dca02,
+ 0x1dcc02, 0x1dce02, 0x000000, 0x000000, 0x1dd006, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x1dd601, 0x000000, 0x1dd702, 0x1dd901, 0x000000, 0x000000,
+ 0x1dda01, 0x000000, 0x000000, 0x000000, 0x000000, 0x1ddb01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1ddc10, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x1dec01, 0x1ded01, 0x1dee02, 0x1df001, 0x000000,
+ 0x1df101, 0x000000, 0x1df211, 0x000000, 0x1e0304, 0x1e0702, 0x1e0901, 0x000000,
+ 0x1e0a01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1e0b08,
+ 0x000000, 0x000000, 0x1e1307, 0x000000, 0x1e1a01, 0x000000, 0x1e1b01, 0x000000,
+ 0x1e1c0c, 0x000000, 0x1e2801, 0x000000, 0x000000, 0x000000, 0x1e2902, 0x000000,
+ 0x1e2b05, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1e3002,
+ 0x1e3201, 0x000000, 0x1e3301, 0x000000, 0x1e3402, 0x1e3604, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1e3a02, 0x000000, 0x000000,
+ 0x1e3c04, 0x1e4003, 0x000000, 0x1e4303, 0x000000, 0x000000, 0x000000, 0x1e4601,
+ 0x000000, 0x000000, 0x000000, 0x1e4701, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x1e4803, 0x000000, 0x000000, 0x1e4b01, 0x000000,
+ 0x1e4c02, 0x000000, 0x1e4e01, 0x000000, 0x1e4f01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x1e5007, 0x1e5701, 0x000000, 0x000000, 0x1e5801, 0x000000, 0x000000,
+ 0x1e5901, 0x000000, 0x000000, 0x1e5a01, 0x000000, 0x000000, 0x1e5b01, 0x000000,
+ 0x000000, 0x1e5c05, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1e6105,
+ 0x1e6601, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1e6701, 0x1e6805,
+ 0x000000, 0x1e6d02, 0x000000, 0x000000, 0x000000, 0x000000, 0x1e6f06, 0x000000,
+ 0x1e7501, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1e760b, 0x000000,
+ 0x1e8103, 0x000000, 0x000000, 0x1e8401, 0x000000, 0x1e8502, 0x000000, 0x1e8702,
+ 0x000000, 0x1e8906, 0x1e8f01, 0x1e9001, 0x1e9102, 0x000000, 0x1e9302, 0x1e950a,
+ 0x000000, 0x000000, 0x000000, 0x1e9f02, 0x000000, 0x1ea101, 0x000000, 0x1ea201,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x1ea302, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x1ea50a, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x1eaf01, 0x1eb001, 0x1eb104, 0x1eb503, 0x000000, 0x1eb801,
+ 0x000000, 0x000000, 0x1eb92f, 0x000000, 0x000000, 0x1ee801, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x1ee901, 0x000000, 0x000000, 0x1eea02, 0x1eec01, 0x1eed01,
+ 0x1eee01, 0x000000, 0x1eef01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x1ef001, 0x1ef102, 0x000000, 0x1ef301, 0x000000, 0x000000,
+ 0x1ef402, 0x000000, 0x000000, 0x1ef603, 0x000000, 0x1ef905, 0x1efe02, 0x000000,
+ 0x000000, 0x1f0002, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x1f0201, 0x000000, 0x1f0301, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x1f0404, 0x000000, 0x000000, 0x000000, 0x000000, 0x1f0804, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x1f0c01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x1f0d03, 0x000000, 0x1f100f, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1f1f01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x1f2003, 0x1f2314, 0x1f3701, 0x000000, 0x1f3801, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x1f390d, 0x000000, 0x000000, 0x000000, 0x000000, 0x1f4601,
+ 0x1f4702, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1f4902, 0x000000, 0x000000,
+ 0x000000, 0x1f4b06, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x1f510a, 0x000000, 0x1f5b01, 0x1f5c01, 0x000000, 0x000000,
+ 0x1f5d02, 0x000000, 0x000000, 0x1f5f01, 0x1f6001, 0x000000, 0x000000, 0x1f6102,
+ 0x1f6301, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x1f6406, 0x000000, 0x000000, 0x000000, 0x1f6a09,
+ 0x1f7307, 0x1f7a01, 0x1f7b01, 0x000000, 0x000000, 0x1f7c01, 0x000000, 0x000000,
+ 0x000000, 0x1f7d01, 0x000000, 0x1f7e01, 0x000000, 0x1f7f02, 0x000000, 0x1f8102,
+ 0x1f830c, 0x000000, 0x000000, 0x000000, 0x1f8f01, 0x1f9008, 0x000000, 0x1f9803,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1f9b01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x1f9c11, 0x1fad01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1fae01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x1faf03, 0x1fb202, 0x000000, 0x1fb403, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x1fb701,
+ 0x1fb801, 0x1fb906, 0x1fbf01, 0x1fc001, 0x1fc101, 0x1fc208, 0x000000, 0x000000,
+ 0x1fca05, 0x000000, 0x000000, 0x1fcf01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x1fd001, 0x1fd107, 0x1fd801, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x1fd903, 0x000000, 0x1fdc03, 0x1fdf02, 0x1fe102,
+ 0x000000, 0x1fe301, 0x1fe401, 0x000000, 0x000000, 0x000000, 0x000000, 0x1fe501,
+ 0x1fe60c, 0x000000, 0x000000, 0x1ff206, 0x000000, 0x000000, 0x000000, 0x1ff801,
+ 0x000000, 0x000000, 0x000000, 0x1ff901, 0x000000, 0x000000, 0x1ffa01, 0x000000,
+ 0x000000, 0x000000, 0x1ffb10, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x200b06, 0x000000, 0x000000, 0x000000, 0x000000, 0x201103, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x201401, 0x000000, 0x201501, 0x000000, 0x000000,
+ 0x201603, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x201901,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x201a02, 0x000000, 0x201c01, 0x000000, 0x000000, 0x201d03, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x202008,
+ 0x000000, 0x000000, 0x000000, 0x202809, 0x000000, 0x000000, 0x203105, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x203601, 0x000000, 0x203704, 0x203b04, 0x000000, 0x203f01,
+ 0x204004, 0x000000, 0x000000, 0x204403, 0x000000, 0x204701, 0x204802, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x204a02, 0x000000, 0x000000, 0x000000, 0x204c01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x204d08, 0x000000, 0x000000, 0x000000, 0x205501, 0x000000, 0x205604,
+ 0x205a02, 0x000000, 0x000000, 0x205c01, 0x205d03, 0x206003, 0x206301, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x206402, 0x206604, 0x206a01, 0x206b01, 0x206c03,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x206f03, 0x20720e,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x208001,
+ 0x000000, 0x000000, 0x000000, 0x208101, 0x208202, 0x208401, 0x208501, 0x208605,
+ 0x000000, 0x000000, 0x208b06, 0x209102, 0x000000, 0x000000, 0x20930a, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x209d01, 0x000000, 0x000000, 0x209e03,
+ 0x000000, 0x20a101, 0x20a205, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x20a70c, 0x20b305, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x20b803, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x20bb03, 0x000000, 0x000000, 0x000000, 0x20be01, 0x000000, 0x20bf02, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x20c106, 0x20c702, 0x000000, 0x000000, 0x20c902,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x20cb01,
+ 0x20cc01, 0x000000, 0x20cd01, 0x000000, 0x20ce01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x20cf01, 0x000000, 0x20d009, 0x20d901, 0x20da01, 0x000000,
+ 0x20db01, 0x20dc09, 0x20e501, 0x000000, 0x000000, 0x000000, 0x000000, 0x20e601,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x20e701, 0x000000, 0x000000, 0x20e810,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x20f801,
+ 0x20f901, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x20fa01,
+ 0x000000, 0x000000, 0x20fb03, 0x000000, 0x20fe04, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x210207, 0x000000, 0x210904, 0x000000, 0x210d06, 0x000000, 0x000000,
+ 0x211301, 0x000000, 0x211401, 0x000000, 0x000000, 0x000000, 0x211503, 0x000000,
+ 0x211806, 0x211e01, 0x211f01, 0x000000, 0x000000, 0x000000, 0x000000, 0x212002,
+ 0x212201, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x212306, 0x000000, 0x000000, 0x212901, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x212a02, 0x212c01, 0x212d22, 0x000000,
+ 0x214f02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x215104, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x215504, 0x215902, 0x215b01, 0x000000, 0x000000, 0x215c04, 0x000000,
+ 0x000000, 0x21600c, 0x000000, 0x216c0c, 0x000000, 0x000000, 0x217801, 0x217901,
+ 0x000000, 0x000000, 0x217a03, 0x217d01, 0x217e04, 0x218204, 0x000000, 0x218608,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x218e0f, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x219d01, 0x000000, 0x219e01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x219f01, 0x000000, 0x000000, 0x21a001, 0x000000, 0x000000, 0x000000,
+ 0x21a101, 0x000000, 0x000000, 0x000000, 0x21a202, 0x000000, 0x000000, 0x21a404,
+ 0x21a804, 0x21ac01, 0x000000, 0x000000, 0x21ad01, 0x000000, 0x21ae01, 0x000000,
+ 0x21af01, 0x21b00c, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x21bc01, 0x21bd01, 0x21be0b, 0x21c902, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x21cb02, 0x21cd01, 0x21ce01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x21cf01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x21d001, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x21d101, 0x000000, 0x000000, 0x21d201, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x21d301, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x21d402,
+ 0x21d601, 0x21d701, 0x000000, 0x000000, 0x000000, 0x000000, 0x21d804, 0x000000,
+ 0x21dc02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x21de03, 0x21e10a, 0x000000, 0x21eb02, 0x000000, 0x21ed03, 0x000000, 0x000000,
+ 0x000000, 0x21f001, 0x000000, 0x000000, 0x000000, 0x21f110, 0x000000, 0x220104,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x220501, 0x000000, 0x220602, 0x220801, 0x22090a,
+ 0x221303, 0x221601, 0x221705, 0x221c03, 0x221f01, 0x000000, 0x222002, 0x222203,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x222501, 0x222602, 0x222809, 0x223102,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x223301, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x223403, 0x223702, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x223901, 0x223a01, 0x223b02, 0x000000, 0x223d03, 0x224001,
+ 0x224103, 0x224401, 0x000000, 0x224505, 0x000000, 0x224a01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x224b01, 0x000000, 0x000000, 0x224c02, 0x000000, 0x000000,
+ 0x224e01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x224f01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x225001, 0x000000, 0x000000, 0x000000, 0x000000, 0x225102, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x225302, 0x22550d, 0x000000, 0x000000, 0x000000, 0x22620a,
+ 0x000000, 0x226c01, 0x226d01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x226e01, 0x226f02, 0x000000, 0x000000, 0x000000, 0x000000, 0x227104, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x227506, 0x227b01, 0x227c02, 0x000000, 0x227e02,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x228001, 0x000000, 0x000000, 0x000000,
+ 0x228101, 0x000000, 0x000000, 0x000000, 0x228201, 0x000000, 0x228301, 0x000000,
+ 0x000000, 0x000000, 0x228401, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x228501, 0x228601, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x228701, 0x000000,
+ 0x000000, 0x000000, 0x228801, 0x000000, 0x228904, 0x000000, 0x000000, 0x000000,
+ 0x228d01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x228e01, 0x000000, 0x228f10, 0x000000, 0x000000, 0x229f02, 0x000000, 0x000000,
+ 0x22a104, 0x000000, 0x000000, 0x22a502, 0x22a701, 0x000000, 0x000000, 0x22a801,
+ 0x22a901, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x22aa01,
+ 0x000000, 0x22ab14, 0x000000, 0x000000, 0x000000, 0x000000, 0x22bf04, 0x22c301,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x22c403, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x22c703, 0x000000, 0x22ca04, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x22ce01, 0x22cf01, 0x22d001, 0x000000, 0x000000, 0x000000, 0x22d101,
+ 0x000000, 0x22d201, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x22d30d, 0x000000,
+ 0x000000, 0x000000, 0x22e001, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x22e102, 0x000000, 0x22e30b,
+ 0x000000, 0x22ee02, 0x000000, 0x000000, 0x000000, 0x22f002, 0x22f202, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x22f401, 0x000000, 0x22f504, 0x000000, 0x22f903,
+ 0x22fc0d, 0x000000, 0x000000, 0x230901, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x230a19, 0x000000, 0x232301, 0x000000, 0x000000, 0x000000, 0x000000, 0x232403,
+ 0x232701, 0x000000, 0x000000, 0x000000, 0x000000, 0x232801, 0x232902, 0x000000,
+ 0x232b05, 0x23300f, 0x233f03, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x234237,
+ 0x237901, 0x000000, 0x000000, 0x237a06, 0x238001, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x238102, 0x000000, 0x000000, 0x000000, 0x238301,
+ 0x000000, 0x000000, 0x238402, 0x000000, 0x238601, 0x000000, 0x000000, 0x238701,
+ 0x238804, 0x238c01, 0x238d0a, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x239702, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x239906, 0x000000, 0x000000, 0x239f01, 0x000000, 0x23a001,
+ 0x23a101, 0x000000, 0x000000, 0x000000, 0x23a201, 0x23a301, 0x000000, 0x000000,
+ 0x23a401, 0x000000, 0x000000, 0x23a501, 0x000000, 0x23a602, 0x000000, 0x000000,
+ 0x23a802, 0x23aa01, 0x000000, 0x000000, 0x000000, 0x23ab04, 0x000000, 0x000000,
+ 0x23af08, 0x000000, 0x23b704, 0x000000, 0x000000, 0x23bb01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x23bc03, 0x000000, 0x23bf0b, 0x23ca02,
+ 0x000000, 0x000000, 0x23cc01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x23cd03, 0x000000, 0x23d001, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x23d102, 0x000000, 0x000000, 0x000000, 0x000000, 0x23d302,
+ 0x000000, 0x23d501, 0x23d601, 0x23d701, 0x000000, 0x23d809, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x23e101, 0x000000,
+ 0x23e201, 0x000000, 0x000000, 0x000000, 0x23e301, 0x23e401, 0x000000, 0x000000,
+ 0x23e501, 0x000000, 0x000000, 0x000000, 0x000000, 0x23e602, 0x000000, 0x000000,
+ 0x000000, 0x23e804, 0x000000, 0x000000, 0x000000, 0x000000, 0x23ec01, 0x23ed0a,
+ 0x000000, 0x000000, 0x000000, 0x23f703, 0x23fa05, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x23ff01, 0x240003, 0x000000, 0x240301, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x240401, 0x240501, 0x240601, 0x000000, 0x240701, 0x240802, 0x000000,
+ 0x000000, 0x240a01, 0x000000, 0x240b01, 0x240c01, 0x000000, 0x000000, 0x240d02,
+ 0x000000, 0x240f01, 0x000000, 0x241001, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x241101, 0x241202, 0x000000, 0x000000, 0x241401, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x241502, 0x241701,
+ 0x000000, 0x000000, 0x241803, 0x000000, 0x000000, 0x000000, 0x000000, 0x241b03,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x241e01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x241f01,
+ 0x000000, 0x000000, 0x000000, 0x242001, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x242101, 0x000000, 0x000000, 0x000000, 0x000000, 0x242201, 0x000000,
+ 0x000000, 0x242303, 0x242601, 0x000000, 0x000000, 0x000000, 0x242701, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x242801, 0x000000,
+ 0x000000, 0x242901, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x242a03, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x242d01, 0x242e02,
+ 0x000000, 0x000000, 0x243001, 0x243102, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x243303, 0x243602, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x243803,
+ 0x000000, 0x000000, 0x000000, 0x243b01, 0x243c02, 0x243e01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x243f0d, 0x000000, 0x000000,
+ 0x244c04, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x245004, 0x245407,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x245b01, 0x245c04, 0x246008, 0x246801, 0x246904,
+ 0x000000, 0x246d01, 0x246e96, 0x000000, 0x000000, 0x250402, 0x000000, 0x250603,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x250901, 0x000000, 0x000000, 0x000000,
+ 0x250a01, 0x000000, 0x250b01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x250c01, 0x000000, 0x000000, 0x250d03,
+ 0x000000, 0x000000, 0x000000, 0x251001, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x251101, 0x251202, 0x000000, 0x000000, 0x000000, 0x000000, 0x251402, 0x000000,
+ 0x251601, 0x251704, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x251b02, 0x000000, 0x251d02, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x251f03, 0x252202, 0x000000, 0x252402, 0x000000, 0x252602,
+ 0x000000, 0x000000, 0x252802, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x252a01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x252b01, 0x252c0f, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x253b01, 0x000000, 0x000000, 0x253c05, 0x000000, 0x000000, 0x254101, 0x000000,
+ 0x254201, 0x254301, 0x000000, 0x000000, 0x000000, 0x000000, 0x254401, 0x000000,
+ 0x000000, 0x000000, 0x254502, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x254701, 0x254801, 0x000000, 0x254901, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x254a01, 0x254b02, 0x000000,
+ 0x000000, 0x000000, 0x254d07, 0x000000, 0x255401, 0x000000, 0x255503, 0x000000,
+ 0x255802, 0x000000, 0x255a07, 0x256102, 0x000000, 0x256302, 0x256501, 0x256602,
+ 0x000000, 0x000000, 0x000000, 0x25680f, 0x257704, 0x000000, 0x000000, 0x257b02,
+ 0x000000, 0x000000, 0x000000, 0x257d02, 0x000000, 0x257f01, 0x000000, 0x258007,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x25871e, 0x000000,
+ 0x25a501, 0x25a602, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x25a802, 0x000000, 0x000000, 0x25aa01, 0x25ab01, 0x25ac01, 0x25ad02,
+ 0x000000, 0x000000, 0x000000, 0x25af02, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x25b104, 0x25b501, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x25b601, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x25b701, 0x000000, 0x25b801, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x25b901, 0x000000, 0x000000, 0x25ba05, 0x000000, 0x000000,
+ 0x25bf01, 0x000000, 0x000000, 0x25c002, 0x000000, 0x25c202, 0x25c402, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x25c602, 0x000000, 0x25c808, 0x25d001, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x25d101, 0x25d201, 0x25d302, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x25d50c, 0x25e102, 0x000000, 0x000000, 0x25e301, 0x25e401,
+ 0x25e501, 0x000000, 0x25e60e, 0x25f401, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x25f508, 0x000000, 0x25fd01, 0x000000, 0x000000, 0x000000, 0x000000, 0x25fe01,
+ 0x000000, 0x000000, 0x000000, 0x25ff0e, 0x000000, 0x260d02, 0x000000, 0x260f06,
+ 0x000000, 0x000000, 0x000000, 0x261504, 0x000000, 0x261901, 0x261a01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x261b01, 0x000000, 0x261c0b, 0x262701,
+ 0x000000, 0x262801, 0x000000, 0x000000, 0x000000, 0x262901, 0x262a02, 0x000000,
+ 0x262c01, 0x000000, 0x262d01, 0x000000, 0x262e01, 0x000000, 0x000000, 0x000000,
+ 0x262f01, 0x263007, 0x263702, 0x000000, 0x000000, 0x000000, 0x263903, 0x000000,
+ 0x263c04, 0x000000, 0x000000, 0x000000, 0x000000, 0x264001, 0x26410e, 0x000000,
+ 0x000000, 0x000000, 0x264f03, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x265201, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x265308, 0x000000, 0x265b03,
+ 0x000000, 0x265e05, 0x000000, 0x266302, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x266503, 0x000000, 0x000000, 0x266803, 0x266b04, 0x000000, 0x000000, 0x000000,
+ 0x266f01, 0x000000, 0x000000, 0x000000, 0x267001, 0x000000, 0x000000, 0x267103,
+ 0x000000, 0x267402, 0x000000, 0x000000, 0x000000, 0x267601, 0x267707, 0x000000,
+ 0x000000, 0x267e01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x267f07, 0x268602, 0x268801, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x268901, 0x268a01, 0x268b05, 0x269002, 0x269205,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x269706, 0x000000,
+ 0x269d01, 0x000000, 0x000000, 0x000000, 0x269e04, 0x000000, 0x000000, 0x26a20f,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x26b101,
+ 0x26b201, 0x26b301, 0x000000, 0x000000, 0x000000, 0x26b401, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x26b503, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x26b801, 0x000000, 0x000000, 0x000000, 0x000000, 0x26b908, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x26c101, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x26c202, 0x26c405, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x26c901, 0x000000, 0x000000, 0x000000, 0x26ca01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x26cb07, 0x000000, 0x26d201,
+ 0x000000, 0x000000, 0x26d316, 0x26e904, 0x26ed03, 0x000000, 0x26f001, 0x26f104,
+ 0x000000, 0x000000, 0x26f505, 0x000000, 0x26fa02, 0x26fc01, 0x26fd03, 0x000000,
+ 0x000000, 0x000000, 0x270002, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x270201, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x270305, 0x270801, 0x000000, 0x000000, 0x270903, 0x000000, 0x000000,
+ 0x000000, 0x270c07, 0x000000, 0x271303, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x27160c, 0x272201, 0x272302, 0x272509, 0x000000, 0x000000, 0x000000,
+ 0x272e01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x272f02, 0x000000,
+ 0x000000, 0x273102, 0x000000, 0x273302, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x273501, 0x000000, 0x273601, 0x273701, 0x273801, 0x273901, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x273a02, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x273c09, 0x274501, 0x000000, 0x000000, 0x000000, 0x000000, 0x274602,
+ 0x000000, 0x000000, 0x274801, 0x274901, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x274a01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x274b03, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x274e03, 0x000000, 0x275104, 0x000000, 0x000000, 0x000000,
+ 0x275502, 0x000000, 0x275704, 0x000000, 0x000000, 0x275b01, 0x275c07, 0x000000,
+ 0x000000, 0x276303, 0x000000, 0x276603, 0x276901, 0x276a03, 0x000000, 0x000000,
+ 0x000000, 0x276d03, 0x277001, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x277105, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x277601, 0x000000, 0x277704, 0x000000, 0x277b0c, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x278702, 0x000000, 0x000000,
+ 0x000000, 0x278903, 0x000000, 0x000000, 0x278c02, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x278e01, 0x278f06, 0x000000, 0x000000, 0x279501, 0x000000, 0x279601,
+ 0x279701, 0x000000, 0x27980a, 0x000000, 0x000000, 0x27a202, 0x000000, 0x27a401,
+ 0x27a506, 0x000000, 0x000000, 0x27ab02, 0x000000, 0x27ad01, 0x27ae01, 0x27af08,
+ 0x27b703, 0x000000, 0x000000, 0x27ba02, 0x000000, 0x27bc03, 0x000000, 0x000000,
+ 0x000000, 0x27bf01, 0x000000, 0x000000, 0x000000, 0x000000, 0x27c001, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x27c110, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x27d108, 0x000000, 0x27d901, 0x000000, 0x000000, 0x27da01, 0x27db01, 0x000000,
+ 0x27dc01, 0x27dd01, 0x000000, 0x27de02, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x27e004, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x27e404, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x27e80c,
+ 0x000000, 0x27f401, 0x000000, 0x27f501, 0x27f601, 0x000000, 0x000000, 0x27f705,
+ 0x000000, 0x000000, 0x27fc01, 0x27fd06, 0x280306, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x280902, 0x000000, 0x280b03, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x280e02, 0x000000, 0x000000, 0x281001, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x281101, 0x000000, 0x281201,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x281318, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x282b04, 0x282f01, 0x283001, 0x000000, 0x000000, 0x000000, 0x283106, 0x000000,
+ 0x283701, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x283801, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x283901, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x283a04, 0x283e03, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x284101, 0x000000, 0x000000, 0x000000, 0x284201, 0x000000, 0x284303,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x284604, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x284a02, 0x284c01, 0x000000, 0x000000,
+ 0x000000, 0x284d01, 0x284e02, 0x000000, 0x285005, 0x000000, 0x285502, 0x000000,
+ 0x285701, 0x000000, 0x000000, 0x000000, 0x000000, 0x285802, 0x000000, 0x000000,
+ 0x285a01, 0x000000, 0x285b02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x285d01, 0x000000, 0x000000, 0x285e03, 0x286101, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x28620a, 0x286c02, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x286e02, 0x000000, 0x287009, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x287906, 0x000000, 0x287f01, 0x000000,
+ 0x288003, 0x000000, 0x000000, 0x000000, 0x288301, 0x288401, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x288501, 0x000000, 0x000000, 0x000000, 0x288601,
+ 0x000000, 0x28870a, 0x000000, 0x000000, 0x289102, 0x289302, 0x289501, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x289601, 0x000000,
+ 0x000000, 0x289702, 0x289902, 0x000000, 0x000000, 0x289b01, 0x000000, 0x289c06,
+ 0x000000, 0x28a201, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x28a301, 0x000000, 0x28a405, 0x28a901, 0x000000, 0x000000,
+ 0x28aa01, 0x000000, 0x28ab09, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x28b401, 0x28b501, 0x28b602, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x28b802, 0x000000,
+ 0x000000, 0x28ba03, 0x000000, 0x000000, 0x28bd02, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x28bf01, 0x000000, 0x28c001, 0x28c102, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x28c301, 0x28c401, 0x000000, 0x28c501, 0x000000, 0x28c605,
+ 0x000000, 0x28cb02, 0x28cd02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x28cf01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x28d002, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x28d202, 0x000000,
+ 0x28d401, 0x000000, 0x000000, 0x000000, 0x28d503, 0x28d802, 0x000000, 0x000000,
+ 0x28da0a, 0x000000, 0x28e403, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x28e709, 0x28f001, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x28f101,
+ 0x28f209, 0x000000, 0x28fb07, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x290203, 0x000000, 0x000000,
+ 0x000000, 0x290508, 0x000000, 0x000000, 0x290d0b, 0x000000, 0x291803, 0x291b01,
+ 0x000000, 0x000000, 0x291c01, 0x291d02, 0x291f02, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x292103, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x292401, 0x000000, 0x292501, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x292601,
+ 0x292708, 0x000000, 0x000000, 0x292f09, 0x000000, 0x293803, 0x293b01, 0x000000,
+ 0x293c02, 0x293e03, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x294101,
+ 0x294201, 0x294301, 0x000000, 0x294401, 0x000000, 0x000000, 0x000000, 0x294501,
+ 0x000000, 0x294608, 0x000000, 0x000000, 0x000000, 0x000000, 0x294e01, 0x000000,
+ 0x000000, 0x294f02, 0x000000, 0x295107, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x295801, 0x295901,
+ 0x295a02, 0x295c01, 0x000000, 0x295d04, 0x000000, 0x000000, 0x296104, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x296503, 0x000000, 0x000000, 0x296801,
+ 0x000000, 0x000000, 0x000000, 0x296901, 0x000000, 0x296a01, 0x000000, 0x296b01,
+ 0x000000, 0x296c02, 0x000000, 0x000000, 0x296e13, 0x000000, 0x298101, 0x000000,
+ 0x298202, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x298401, 0x298501,
+ 0x29860f, 0x000000, 0x000000, 0x000000, 0x299501, 0x000000, 0x000000, 0x000000,
+ 0x299603, 0x000000, 0x299901, 0x000000, 0x299a01, 0x000000, 0x000000, 0x000000,
+ 0x299b01, 0x299c02, 0x299e03, 0x000000, 0x29a101, 0x000000, 0x000000, 0x29a208,
+ 0x000000, 0x29aa02, 0x000000, 0x000000, 0x000000, 0x000000, 0x29ac01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x29ad01, 0x000000, 0x000000, 0x000000, 0x29ae01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x29af01, 0x29b001, 0x000000, 0x29b102, 0x000000, 0x000000, 0x000000,
+ 0x29b302, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x29b504,
+ 0x000000, 0x29b90a, 0x000000, 0x000000, 0x29c305, 0x000000, 0x29c801, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x29c902, 0x000000, 0x000000, 0x000000, 0x29cb03,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x29ce01, 0x000000, 0x29cf01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x29d00a,
+ 0x000000, 0x29da03, 0x29dd02, 0x29df02, 0x000000, 0x000000, 0x29e101, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x29e203,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x29e501, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x29e603, 0x29e90d, 0x29f601, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x29f701, 0x000000, 0x000000, 0x29f803, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x29fb02, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x29fd02, 0x000000, 0x000000, 0x29ff01, 0x2a0003, 0x000000,
+ 0x000000, 0x000000, 0x2a0302, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x2a0501, 0x000000, 0x000000, 0x000000, 0x2a060a, 0x000000, 0x2a1003,
+ 0x000000, 0x000000, 0x2a1301, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x2a1404, 0x000000, 0x000000, 0x000000, 0x2a1802, 0x000000, 0x000000,
+ 0x2a1a01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x2a1b04, 0x2a1f05, 0x000000, 0x000000, 0x000000, 0x2a2402, 0x000000,
+ 0x000000, 0x000000, 0x2a2604, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x2a2a01, 0x000000, 0x000000, 0x2a2b0c,
+ 0x000000, 0x2a3701, 0x000000, 0x2a3801, 0x000000, 0x000000, 0x000000, 0x2a3902,
+ 0x000000, 0x000000, 0x000000, 0x2a3b02, 0x000000, 0x000000, 0x2a3d01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x2a3e01, 0x000000, 0x000000, 0x000000, 0x000000, 0x2a3f01, 0x2a4002, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x2a4201, 0x000000, 0x2a4301, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x2a4401, 0x2a4501, 0x2a4603, 0x000000, 0x2a4917, 0x2a6001,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x2a6102, 0x000000, 0x000000, 0x2a6301,
+ 0x000000, 0x2a6403, 0x000000, 0x000000, 0x2a6701, 0x000000, 0x000000, 0x2a6801,
+ 0x2a6901, 0x2a6a01, 0x2a6b03, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x2a6e03, 0x000000, 0x2a7101, 0x2a7205, 0x2a7712, 0x2a8901, 0x000000,
+ 0x000000, 0x2a8a01, 0x2a8b01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x2a8c03, 0x000000, 0x000000, 0x000000, 0x2a8f03, 0x2a9201, 0x000000, 0x000000,
+ 0x2a9302, 0x2a9501, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2a9602,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x2a9801, 0x000000, 0x2a9902, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x2a9b03, 0x2a9e01, 0x000000, 0x2a9f04, 0x000000,
+ 0x000000, 0x2aa301, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2aa401,
+ 0x000000, 0x2aa505, 0x000000, 0x000000, 0x000000, 0x2aaa01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x2aab04, 0x000000, 0x000000, 0x2aaf01, 0x2ab001,
+ 0x000000, 0x000000, 0x2ab102, 0x000000, 0x000000, 0x000000, 0x2ab307, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x2aba06, 0x000000, 0x000000, 0x2ac002, 0x000000,
+ 0x000000, 0x000000, 0x2ac201, 0x000000, 0x000000, 0x2ac30a, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x2acd02, 0x000000, 0x2acf02, 0x2ad102, 0x000000, 0x000000,
+ 0x2ad302, 0x000000, 0x000000, 0x000000, 0x2ad501, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2ad601,
+ 0x000000, 0x000000, 0x000000, 0x2ad705, 0x000000, 0x000000, 0x000000, 0x2adc02,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2ade01, 0x000000, 0x000000,
+ 0x000000, 0x2adf02, 0x2ae104, 0x000000, 0x000000, 0x2ae502, 0x2ae703, 0x2aea01,
+ 0x000000, 0x000000, 0x2aeb01, 0x000000, 0x2aec02, 0x000000, 0x000000, 0x2aee01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x2aef01, 0x000000, 0x000000, 0x000000,
+ 0x2af002, 0x000000, 0x2af201, 0x000000, 0x000000, 0x000000, 0x2af301, 0x2af401,
+ 0x000000, 0x000000, 0x000000, 0x2af501, 0x000000, 0x2af602, 0x000000, 0x2af809,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2b0102, 0x2b0301,
+ 0x000000, 0x2b0403, 0x2b0701, 0x2b0802, 0x000000, 0x000000, 0x2b0a01, 0x2b0b01,
+ 0x2b0c01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2b0d01, 0x000000, 0x000000,
+ 0x2b0e06, 0x2b1402, 0x000000, 0x000000, 0x000000, 0x000000, 0x2b1603, 0x000000,
+ 0x000000, 0x000000, 0x2b1915, 0x000000, 0x000000, 0x000000, 0x000000, 0x2b2e01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2b2f04, 0x2b3301, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2b3403, 0x000000, 0x000000,
+ 0x2b3701, 0x2b3801, 0x000000, 0x2b3903, 0x000000, 0x2b3c10, 0x000000, 0x2b4c01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2b4d02, 0x000000, 0x000000,
+ 0x000000, 0x2b4f06, 0x000000, 0x000000, 0x000000, 0x2b5501, 0x000000, 0x000000,
+ 0x000000, 0x2b5601, 0x2b5701, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x2b5801, 0x2b5901, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x2b5a03, 0x000000, 0x000000, 0x2b5d06, 0x2b6301, 0x000000, 0x000000,
+ 0x000000, 0x2b6405, 0x000000, 0x2b6905, 0x2b6e0c, 0x000000, 0x2b7a0b, 0x000000,
+ 0x000000, 0x000000, 0x2b8501, 0x000000, 0x000000, 0x2b8603, 0x000000, 0x2b8901,
+ 0x000000, 0x2b8a01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x2b8b01, 0x000000, 0x2b8c03, 0x2b8f01, 0x2b9001, 0x2b9102, 0x000000,
+ 0x2b9301, 0x000000, 0x2b9401, 0x000000, 0x000000, 0x000000, 0x2b9501, 0x000000,
+ 0x000000, 0x2b9601, 0x2b9703, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2b9a01,
+ 0x000000, 0x000000, 0x2b9b02, 0x2b9d06, 0x000000, 0x000000, 0x000000, 0x2ba302,
+ 0x2ba502, 0x000000, 0x000000, 0x000000, 0x2ba706, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x2bad01, 0x2bae01, 0x000000, 0x000000, 0x000000, 0x2baf03,
+ 0x2bb201, 0x000000, 0x000000, 0x2bb301, 0x2bb405, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x2bb906, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x2bbf02, 0x2bc101, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x2bc201, 0x000000, 0x2bc301, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x2bc401, 0x000000, 0x000000, 0x000000, 0x2bc501,
+ 0x000000, 0x2bc602, 0x000000, 0x000000, 0x2bc802, 0x000000, 0x2bca03, 0x000000,
+ 0x2bcd11, 0x000000, 0x000000, 0x2bde3e, 0x000000, 0x000000, 0x000000, 0x2c1c02,
+ 0x2c1e01, 0x000000, 0x000000, 0x2c1f01, 0x2c2005, 0x2c2505, 0x000000, 0x000000,
+ 0x000000, 0x2c2a02, 0x000000, 0x000000, 0x000000, 0x000000, 0x2c2c01, 0x2c2d01,
+ 0x000000, 0x2c2e02, 0x000000, 0x000000, 0x000000, 0x2c3001, 0x000000, 0x2c3114,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x2c4504, 0x000000, 0x2c4901, 0x000000,
+ 0x000000, 0x000000, 0x2c4a01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x2c4b01, 0x000000, 0x2c4c01, 0x2c4d02, 0x000000, 0x2c4f01, 0x000000, 0x2c5003,
+ 0x000000, 0x000000, 0x000000, 0x2c5301, 0x2c5401, 0x000000, 0x000000, 0x2c5505,
+ 0x000000, 0x000000, 0x000000, 0x2c5a01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x2c5b01, 0x000000, 0x2c5c0d, 0x2c6901, 0x000000, 0x000000,
+ 0x2c6a03, 0x000000, 0x2c6d02, 0x2c6f01, 0x000000, 0x000000, 0x000000, 0x2c7001,
+ 0x000000, 0x000000, 0x2c7105, 0x2c7603, 0x000000, 0x2c790d, 0x2c8601, 0x000000,
+ 0x2c8706, 0x2c8d02, 0x000000, 0x000000, 0x000000, 0x2c8f01, 0x000000, 0x000000,
+ 0x2c9003, 0x2c9305, 0x000000, 0x000000, 0x000000, 0x000000, 0x2c9801, 0x000000,
+ 0x000000, 0x000000, 0x2c9903, 0x000000, 0x2c9c05, 0x000000, 0x2ca103, 0x2ca401,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2ca507, 0x000000, 0x2cac01,
+ 0x000000, 0x2cad02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2caf0d,
+ 0x2cbc01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2cbd01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x2cbe01, 0x000000, 0x000000, 0x2cbf04,
+ 0x2cc301, 0x2cc402, 0x2cc606, 0x000000, 0x2ccc04, 0x000000, 0x2cd001, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x2cd101, 0x000000, 0x000000, 0x000000, 0x2cd201,
+ 0x000000, 0x2cd301, 0x2cd403, 0x2cd701, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x2cd803, 0x000000, 0x000000, 0x2cdb03, 0x000000, 0x000000, 0x2cde0a, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x2ce805, 0x000000, 0x000000, 0x2ced07, 0x000000, 0x2cf401, 0x000000,
+ 0x000000, 0x2cf501, 0x2cf602, 0x2cf802, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2cfa01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x2cfb04, 0x000000, 0x2cff01, 0x2d0008, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x2d0801, 0x2d0901, 0x2d0a03, 0x2d0d09, 0x000000, 0x000000,
+ 0x2d1604, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2d1a01, 0x000000,
+ 0x2d1b04, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2d1f04, 0x2d2301,
+ 0x000000, 0x2d2402, 0x000000, 0x000000, 0x2d2601, 0x000000, 0x2d2701, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2d2802, 0x000000, 0x000000,
+ 0x2d2a01, 0x2d2b01, 0x000000, 0x2d2c02, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x2d2e02, 0x000000, 0x000000, 0x000000, 0x2d3005, 0x000000, 0x2d3501, 0x000000,
+ 0x2d3602, 0x000000, 0x000000, 0x000000, 0x2d3801, 0x000000, 0x2d3902, 0x000000,
+ 0x000000, 0x000000, 0x2d3b01, 0x2d3c01, 0x000000, 0x000000, 0x000000, 0x2d3d02,
+ 0x2d3f03, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x2d4201, 0x000000, 0x2d4303, 0x2d4604, 0x000000, 0x2d4a01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2d4b01, 0x000000,
+ 0x2d4c01, 0x000000, 0x000000, 0x000000, 0x000000, 0x2d4d03, 0x2d5001, 0x000000,
+ 0x000000, 0x000000, 0x2d5101, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2d5201, 0x2d5302, 0x000000,
+ 0x2d5502, 0x000000, 0x000000, 0x2d5702, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x2d5901, 0x000000, 0x000000, 0x2d5a02, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x2d5c09, 0x000000, 0x2d6501, 0x000000, 0x000000, 0x000000, 0x2d6602, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x2d6801, 0x000000, 0x000000, 0x2d6901, 0x2d6a01,
+ 0x2d6b02, 0x2d6d09, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x2d7607, 0x000000, 0x000000, 0x2d7d02, 0x000000, 0x2d7f01, 0x2d8001, 0x000000,
+ 0x2d8101, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x2d8201, 0x000000, 0x000000, 0x2d8301, 0x2d8403, 0x2d8715,
+ 0x000000, 0x000000, 0x2d9c02, 0x2d9e01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x2d9f01, 0x000000, 0x000000, 0x2da004, 0x000000, 0x2da403, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2da71c, 0x000000,
+ 0x000000, 0x000000, 0x2dc303, 0x000000, 0x2dc602, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x2dc803, 0x000000, 0x000000, 0x2dcb13, 0x2dde02, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2de003,
+ 0x2de302, 0x2de501, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2de601,
+ 0x000000, 0x000000, 0x000000, 0x2de702, 0x2de901, 0x000000, 0x2dea04, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2dee01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2def01, 0x000000, 0x000000,
+ 0x000000, 0x2df005, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x2df501, 0x2df605, 0x000000, 0x2dfb01, 0x2dfc01, 0x000000, 0x2dfd01, 0x000000,
+ 0x000000, 0x2dfe02, 0x000000, 0x2e0001, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2e0102,
+ 0x2e0303, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x2e0601, 0x000000, 0x2e0701, 0x000000, 0x000000, 0x000000, 0x2e0801, 0x000000,
+ 0x000000, 0x000000, 0x2e0902, 0x000000, 0x000000, 0x000000, 0x000000, 0x2e0b01,
+ 0x000000, 0x000000, 0x2e0c02, 0x2e0e01, 0x2e0f03, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x2e1227, 0x2e3901, 0x2e3a01, 0x2e3b01, 0x000000, 0x000000, 0x2e3c01,
+ 0x000000, 0x000000, 0x000000, 0x2e3d08, 0x000000, 0x000000, 0x2e4505, 0x2e4a01,
+ 0x000000, 0x2e4b11, 0x000000, 0x2e5c02, 0x000000, 0x000000, 0x000000, 0x2e5e01,
+ 0x000000, 0x000000, 0x000000, 0x2e5f02, 0x2e6101, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x2e6201, 0x000000, 0x2e6301, 0x2e6406, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x2e6a01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x2e6b01, 0x000000, 0x2e6c01, 0x000000, 0x2e6d01, 0x000000, 0x000000,
+ 0x2e6e07, 0x000000, 0x2e7501, 0x2e7602, 0x2e780c, 0x2e8401, 0x2e8502, 0x000000,
+ 0x2e8706, 0x2e8d02, 0x000000, 0x000000, 0x2e8f02, 0x000000, 0x2e9102, 0x2e9303,
+ 0x2e9601, 0x2e9701, 0x000000, 0x000000, 0x000000, 0x000000, 0x2e9805, 0x000000,
+ 0x2e9d07, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2ea402, 0x2ea601,
+ 0x2ea701, 0x000000, 0x2ea803, 0x000000, 0x000000, 0x000000, 0x000000, 0x2eab01,
+ 0x2eac04, 0x000000, 0x000000, 0x000000, 0x000000, 0x2eb001, 0x000000, 0x2eb101,
+ 0x000000, 0x2eb201, 0x000000, 0x2eb301, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x2eb402, 0x000000, 0x000000, 0x2eb602, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2eb811, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x2ec901, 0x000000, 0x000000, 0x000000, 0x2eca01,
+ 0x2ecb06, 0x2ed101, 0x2ed205, 0x000000, 0x2ed701, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x2ed801, 0x000000, 0x000000, 0x000000, 0x2ed905, 0x000000,
+ 0x2ede05, 0x2ee301, 0x2ee401, 0x2ee505, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x2eea01, 0x000000, 0x000000, 0x2eeb02, 0x2eed01, 0x000000, 0x000000,
+ 0x2eee04, 0x000000, 0x000000, 0x2ef209, 0x2efb01, 0x000000, 0x000000, 0x2efc03,
+ 0x000000, 0x000000, 0x2eff01, 0x2f0001, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x2f0107, 0x000000, 0x2f0802, 0x2f0a01, 0x000000, 0x000000, 0x2f0b02, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2f0d08, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2f1501, 0x2f1601,
+ 0x000000, 0x2f1704, 0x000000, 0x000000, 0x000000, 0x2f1b04, 0x2f1f01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x2f2002, 0x2f2201, 0x2f2306, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2f2901,
+ 0x000000, 0x000000, 0x000000, 0x2f2a01, 0x2f2b03, 0x000000, 0x000000, 0x000000,
+ 0x2f2e02, 0x000000, 0x2f3005, 0x2f3501, 0x2f3601, 0x000000, 0x000000, 0x2f3701,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x2f3803, 0x000000, 0x2f3b05, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x2f4001, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x2f4104, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x2f4501, 0x2f4601, 0x2f4707, 0x2f4e03, 0x000000, 0x000000,
+ 0x2f5102, 0x2f5302, 0x000000, 0x000000, 0x000000, 0x2f5501, 0x000000, 0x000000,
+ 0x000000, 0x2f5601, 0x2f5708, 0x2f5f02, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x2f6101, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2f6201,
+ 0x000000, 0x000000, 0x000000, 0x2f6302, 0x2f6503, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x2f6802, 0x000000, 0x2f6a02, 0x000000, 0x2f6c01, 0x000000, 0x000000,
+ 0x2f6d02, 0x000000, 0x000000, 0x000000, 0x2f6f01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x2f7003, 0x000000, 0x2f7305, 0x000000, 0x2f7801, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x2f7911, 0x2f8a02, 0x2f8c02, 0x000000, 0x000000,
+ 0x000000, 0x2f8e03, 0x000000, 0x000000, 0x000000, 0x000000, 0x2f9105, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2f9601, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x2f9702,
+ 0x000000, 0x000000, 0x000000, 0x2f9901, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x2f9a01, 0x2f9b01, 0x000000, 0x000000, 0x2f9c07, 0x000000, 0x2fa301,
+ 0x000000, 0x2fa401, 0x000000, 0x000000, 0x2fa503, 0x000000, 0x2fa802, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x2faa06, 0x000000, 0x2fb001, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x2fb101, 0x2fb201, 0x2fb301, 0x2fb404, 0x000000, 0x2fb801,
+ 0x2fb904, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x2fbd01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x2fbe06, 0x000000, 0x000000, 0x2fc404, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x2fc801, 0x000000, 0x000000, 0x000000, 0x000000, 0x2fc902,
+ 0x000000, 0x000000, 0x2fcb06, 0x2fd101, 0x000000, 0x000000, 0x000000, 0x2fd201,
+ 0x000000, 0x000000, 0x000000, 0x2fd309, 0x2fdc01, 0x000000, 0x2fdd02, 0x2fdf01,
+ 0x000000, 0x2fe012, 0x000000, 0x000000, 0x2ff202, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x2ff401, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x2ff50b, 0x000000, 0x300001, 0x000000, 0x000000, 0x300102, 0x000000, 0x300301,
+ 0x300401, 0x000000, 0x000000, 0x300501, 0x000000, 0x300601, 0x000000, 0x000000,
+ 0x300701, 0x000000, 0x300801, 0x000000, 0x300903, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x300c08, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x30141d,
+ 0x000000, 0x303102, 0x303301, 0x000000, 0x000000, 0x000000, 0x000000, 0x303401,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x303501, 0x303601, 0x000000, 0x303701, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x303801, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x303902, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x303b02, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x303d01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x303e04, 0x000000, 0x304201, 0x304301, 0x30440a, 0x000000, 0x000000, 0x304e03,
+ 0x305101, 0x305201, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x305304,
+ 0x305703, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x305a03, 0x000000, 0x305d01, 0x000000, 0x305e01, 0x000000, 0x000000,
+ 0x305f09, 0x000000, 0x000000, 0x000000, 0x000000, 0x306801, 0x000000, 0x000000,
+ 0x306904, 0x000000, 0x000000, 0x000000, 0x000000, 0x306d05, 0x307201, 0x000000,
+ 0x000000, 0x307306, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x307901,
+ 0x000000, 0x000000, 0x000000, 0x307a01, 0x000000, 0x000000, 0x000000, 0x307b08,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x308301, 0x000000, 0x308402, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x308602, 0x000000, 0x308804, 0x308c02,
+ 0x000000, 0x000000, 0x000000, 0x308e01, 0x308f02, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x309101, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x309201,
+ 0x309301, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x309401, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x309507,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x309c05, 0x000000, 0x000000, 0x000000, 0x30a101, 0x30a201, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x30a317, 0x30ba12,
+ 0x000000, 0x000000, 0x30cc01, 0x30cd01, 0x000000, 0x000000, 0x000000, 0x30ce01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x30cf06, 0x30d507, 0x30dc01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x30dd02, 0x000000, 0x30df01, 0x30e001, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x30e101, 0x000000, 0x000000, 0x000000, 0x30e205,
+ 0x000000, 0x30e704, 0x000000, 0x000000, 0x000000, 0x30eb03, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x30ee01, 0x000000,
+ 0x000000, 0x000000, 0x30ef01, 0x000000, 0x000000, 0x000000, 0x30f001, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x30f105, 0x000000, 0x30f601, 0x000000,
+ 0x000000, 0x30f702, 0x000000, 0x30f902, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x30fb08, 0x000000, 0x310302, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x310501, 0x000000, 0x000000, 0x000000, 0x310601, 0x310702, 0x000000, 0x000000,
+ 0x000000, 0x310901, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x310a07, 0x000000, 0x000000, 0x311103, 0x000000, 0x311401,
+ 0x000000, 0x311503, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x311802, 0x000000,
+ 0x000000, 0x000000, 0x311a03, 0x311d03, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x312001, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x312101, 0x312218, 0x313a05, 0x000000, 0x313f03,
+ 0x000000, 0x000000, 0x314201, 0x000000, 0x314303, 0x000000, 0x31460a, 0x000000,
+ 0x315002, 0x000000, 0x000000, 0x000000, 0x000000, 0x315213, 0x316502, 0x000000,
+ 0x316709, 0x000000, 0x000000, 0x31700d, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x317d01, 0x000000, 0x000000, 0x317e02, 0x000000, 0x318004,
+ 0x318402, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x318602, 0x000000, 0x318801, 0x000000,
+ 0x31890b, 0x319401, 0x000000, 0x319503, 0x000000, 0x319804, 0x000000, 0x319c02,
+ 0x000000, 0x000000, 0x000000, 0x319e01, 0x319f03, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x31a21e, 0x31c002, 0x000000, 0x000000, 0x31c201, 0x000000, 0x000000,
+ 0x31c302, 0x000000, 0x000000, 0x31c501, 0x31c602, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x31c801, 0x000000,
+ 0x31c901, 0x31ca01, 0x000000, 0x31cb0b, 0x000000, 0x000000, 0x31d608, 0x31de06,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x31e401, 0x000000, 0x31e504, 0x31e901,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x31ea01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x31eb0d, 0x31f81f, 0x000000,
+ 0x321701, 0x000000, 0x32180b, 0x000000, 0x322303, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x322603, 0x000000, 0x322901, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x322a02, 0x322c01, 0x000000, 0x322d01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x322e03, 0x000000, 0x000000, 0x323102, 0x323301, 0x323401, 0x000000, 0x000000,
+ 0x000000, 0x323501, 0x000000, 0x000000, 0x000000, 0x323601, 0x000000, 0x323702,
+ 0x000000, 0x323901, 0x000000, 0x000000, 0x323a03, 0x000000, 0x323d01, 0x000000,
+ 0x323e03, 0x000000, 0x000000, 0x324103, 0x000000, 0x324403, 0x324701, 0x324802,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x324a02, 0x000000, 0x324c01, 0x000000, 0x000000, 0x324d06, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x325301, 0x325403, 0x325701, 0x000000, 0x325804, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x325c02, 0x000000, 0x000000, 0x000000, 0x325e01, 0x325f02, 0x326104,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x326507,
+ 0x000000, 0x326c01, 0x326d10, 0x000000, 0x327d02, 0x000000, 0x327f01, 0x000000,
+ 0x000000, 0x000000, 0x328001, 0x000000, 0x328101, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x328201, 0x000000, 0x328301, 0x328401, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x328508, 0x000000, 0x328d02,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x328f02, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x329102, 0x000000, 0x000000,
+ 0x329301, 0x000000, 0x000000, 0x329401, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x329501, 0x000000, 0x000000, 0x000000, 0x000000, 0x329601, 0x000000, 0x329701,
+ 0x000000, 0x329801, 0x000000, 0x000000, 0x000000, 0x329904, 0x329d01, 0x329e01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x329f04, 0x32a302, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x32a504, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x32a901, 0x000000, 0x32aa01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x32ab0a, 0x000000,
+ 0x000000, 0x32b502, 0x000000, 0x000000, 0x000000, 0x32b701, 0x32b801, 0x000000,
+ 0x32b90a, 0x32c301, 0x32c404, 0x32c801, 0x32c902, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x32cb01, 0x000000, 0x000000, 0x32cc02, 0x000000, 0x000000, 0x32ce02,
+ 0x32d008, 0x000000, 0x32d803, 0x000000, 0x000000, 0x000000, 0x32db01, 0x000000,
+ 0x32dc01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x32dd02, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x32df03, 0x32e201, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x32e301, 0x000000, 0x000000, 0x32e403, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x32e705, 0x000000,
+ 0x32ec03, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x32ef01,
+ 0x000000, 0x000000, 0x32f002, 0x000000, 0x000000, 0x000000, 0x32f201, 0x32f302,
+ 0x32f501, 0x000000, 0x000000, 0x000000, 0x000000, 0x32f602, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x32f805, 0x32fd02, 0x000000,
+ 0x32ff04, 0x000000, 0x000000, 0x330301, 0x330406, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x330a01, 0x000000, 0x000000, 0x330b03, 0x000000, 0x330e06,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x331401, 0x331501, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x331601, 0x331701, 0x331801, 0x000000,
+ 0x331903, 0x000000, 0x000000, 0x000000, 0x331c01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x331d01, 0x000000, 0x331e01, 0x331f06,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x332505, 0x000000, 0x332a01,
+ 0x000000, 0x332b01, 0x000000, 0x000000, 0x000000, 0x332c18, 0x000000, 0x334401,
+ 0x334502, 0x334701, 0x334801, 0x000000, 0x000000, 0x334901, 0x000000, 0x334a03,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x334d10, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x335d12, 0x000000, 0x336f01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x337001, 0x000000,
+ 0x000000, 0x337104, 0x000000, 0x000000, 0x000000, 0x000000, 0x337502, 0x000000,
+ 0x000000, 0x000000, 0x337701, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x337801, 0x000000, 0x337905, 0x337e04, 0x338202, 0x000000, 0x000000, 0x000000,
+ 0x338401, 0x000000, 0x000000, 0x338501, 0x000000, 0x000000, 0x33860f, 0x000000,
+ 0x000000, 0x339501, 0x000000, 0x000000, 0x000000, 0x339605, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x339b07, 0x000000, 0x000000, 0x33a20d, 0x33af09, 0x000000, 0x000000, 0x000000,
+ 0x33b808, 0x000000, 0x33c004, 0x33c402, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x33c604, 0x33ca01, 0x000000, 0x33cb01, 0x33cc01, 0x000000, 0x33cd0a,
+ 0x000000, 0x33d704, 0x000000, 0x000000, 0x000000, 0x000000, 0x33db01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x33dc16, 0x33f202, 0x000000, 0x000000, 0x33f401,
+ 0x33f501, 0x000000, 0x000000, 0x33f602, 0x000000, 0x000000, 0x33f805, 0x000000,
+ 0x33fd01, 0x000000, 0x000000, 0x000000, 0x33fe0e, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x340c03, 0x000000, 0x340f01, 0x000000, 0x000000, 0x000000, 0x341001,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x341101, 0x000000,
+ 0x000000, 0x341204, 0x000000, 0x341607, 0x000000, 0x000000, 0x341d01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x341e0b, 0x000000, 0x342908, 0x000000,
+ 0x343104, 0x000000, 0x343501, 0x343602, 0x343802, 0x000000, 0x000000, 0x343a01,
+ 0x343b01, 0x000000, 0x343c01, 0x343d02, 0x000000, 0x343f04, 0x000000, 0x344301,
+ 0x344405, 0x344901, 0x000000, 0x344a01, 0x344b01, 0x000000, 0x344c02, 0x344e04,
+ 0x345206, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x345808, 0x346001,
+ 0x000000, 0x34610a, 0x000000, 0x000000, 0x000000, 0x000000, 0x346b02, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x346d01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x346e02, 0x000000, 0x000000, 0x000000, 0x000000, 0x347002, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x347201, 0x000000, 0x000000, 0x000000,
+ 0x347302, 0x000000, 0x000000, 0x347508, 0x347d01, 0x000000, 0x347e06, 0x000000,
+ 0x348403, 0x000000, 0x348701, 0x348802, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x348a06, 0x000000, 0x349001, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x349101, 0x349201, 0x000000, 0x349304, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x349701, 0x349801, 0x349904, 0x349d01, 0x000000, 0x349e01, 0x349f02,
+ 0x34a101, 0x34a201, 0x000000, 0x34a302, 0x000000, 0x000000, 0x34a501, 0x34a602,
+ 0x000000, 0x34a806, 0x000000, 0x000000, 0x000000, 0x000000, 0x34ae03, 0x000000,
+ 0x34b103, 0x000000, 0x34b401, 0x000000, 0x000000, 0x34b501, 0x000000, 0x000000,
+ 0x34b601, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x34b701,
+ 0x34b803, 0x000000, 0x34bb10, 0x000000, 0x000000, 0x34cb06, 0x34d103, 0x000000,
+ 0x000000, 0x34d403, 0x34d702, 0x000000, 0x000000, 0x000000, 0x34d905, 0x34de02,
+ 0x000000, 0x34e002, 0x34e201, 0x000000, 0x34e303, 0x000000, 0x34e601, 0x000000,
+ 0x34e701, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x34e802,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x34ea02, 0x000000,
+ 0x000000, 0x000000, 0x34ec06, 0x34f201, 0x000000, 0x000000, 0x000000, 0x34f301,
+ 0x34f401, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x34f505, 0x000000, 0x34fa01, 0x000000, 0x000000, 0x000000, 0x000000, 0x34fb02,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x34fd03, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x350002,
+ 0x000000, 0x000000, 0x350202, 0x000000, 0x000000, 0x000000, 0x000000, 0x350405,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x350903, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x350c05, 0x000000, 0x351109, 0x000000, 0x351a05, 0x000000, 0x351f01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x352002, 0x352201, 0x000000, 0x352301, 0x352401, 0x352501, 0x35260a, 0x000000,
+ 0x000000, 0x353001, 0x353105, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x353602, 0x000000, 0x353802, 0x353a02, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x353c05, 0x000000,
+ 0x000000, 0x000000, 0x354104, 0x000000, 0x000000, 0x000000, 0x354510, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x355502,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x355703, 0x000000, 0x355a01, 0x000000, 0x000000, 0x355b02,
+ 0x000000, 0x000000, 0x355d01, 0x000000, 0x000000, 0x000000, 0x355e01, 0x000000,
+ 0x355f04, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x356301, 0x000000,
+ 0x356402, 0x356601, 0x000000, 0x000000, 0x356703, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x356a0a, 0x357401, 0x000000, 0x357501, 0x000000,
+ 0x000000, 0x000000, 0x357605, 0x000000, 0x000000, 0x000000, 0x357b02, 0x357d03,
+ 0x358005, 0x000000, 0x000000, 0x000000, 0x358503, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x358802, 0x000000, 0x000000, 0x000000, 0x000000, 0x358a07,
+ 0x000000, 0x000000, 0x000000, 0x359101, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x359201, 0x000000, 0x359301,
+ 0x359402, 0x000000, 0x000000, 0x359605, 0x359b06, 0x35a101, 0x35a201, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x35a302,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x35a502,
+ 0x000000, 0x35a701, 0x000000, 0x000000, 0x35a801, 0x35a909, 0x35b204, 0x000000,
+ 0x35b601, 0x000000, 0x000000, 0x35b701, 0x000000, 0x000000, 0x000000, 0x35b804,
+ 0x000000, 0x35bc05, 0x000000, 0x000000, 0x35c101, 0x35c201, 0x000000, 0x35c301,
+ 0x35c401, 0x000000, 0x35c501, 0x000000, 0x000000, 0x35c601, 0x000000, 0x000000,
+ 0x000000, 0x35c701, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x35c803, 0x000000, 0x000000, 0x35cb03, 0x000000, 0x35ce01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x35cf02, 0x35d109, 0x35da0a, 0x000000, 0x000000, 0x000000, 0x35e401,
+ 0x000000, 0x35e503, 0x000000, 0x35e803, 0x000000, 0x35eb02, 0x35ed0a, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x35f701, 0x35f811, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x360902, 0x000000, 0x360b02, 0x000000, 0x000000, 0x360d01,
+ 0x000000, 0x000000, 0x360e01, 0x000000, 0x360f02, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x361101, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x361202, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x36140d, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x362102, 0x000000, 0x000000, 0x362301, 0x000000, 0x000000, 0x362401, 0x000000,
+ 0x000000, 0x362501, 0x362605, 0x000000, 0x362b01, 0x000000, 0x362c01, 0x362d02,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x362f01, 0x000000, 0x000000, 0x000000, 0x000000, 0x363005,
+ 0x363508, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x363d02, 0x000000, 0x363f01, 0x364001, 0x364101,
+ 0x000000, 0x000000, 0x364203, 0x364503, 0x000000, 0x364802, 0x364a01, 0x364b04,
+ 0x364f02, 0x000000, 0x000000, 0x365103, 0x000000, 0x000000, 0x000000, 0x365401,
+ 0x000000, 0x000000, 0x000000, 0x365501, 0x000000, 0x000000, 0x000000, 0x365601,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x365705, 0x365c01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x365d01, 0x000000, 0x365e01, 0x000000, 0x000000,
+ 0x365f01, 0x000000, 0x000000, 0x000000, 0x366001, 0x000000, 0x000000, 0x366102,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x366303,
+ 0x000000, 0x366605, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x366b01,
+ 0x000000, 0x366c01, 0x000000, 0x366d01, 0x000000, 0x000000, 0x366e09, 0x000000,
+ 0x36770a, 0x000000, 0x000000, 0x000000, 0x368101, 0x000000, 0x000000, 0x368201,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x368301, 0x000000, 0x36840a, 0x000000,
+ 0x368e02, 0x369001, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x369114, 0x36a501,
+ 0x000000, 0x36a603, 0x36a901, 0x000000, 0x36aa01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x36ab03, 0x000000, 0x000000, 0x36ae13, 0x000000, 0x000000, 0x000000,
+ 0x36c101, 0x000000, 0x36c202, 0x000000, 0x36c414, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x36d802, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x36da03, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x36dd02, 0x000000, 0x000000, 0x000000, 0x36df01, 0x36e002, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x36e201, 0x000000, 0x000000, 0x36e304, 0x36e707, 0x000000, 0x36ee01,
+ 0x000000, 0x36ef02, 0x36f101, 0x000000, 0x000000, 0x36f201, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x36f304,
+ 0x000000, 0x000000, 0x000000, 0x36f702, 0x000000, 0x36f901, 0x36fa01, 0x000000,
+ 0x36fb03, 0x36fe06, 0x370401, 0x370501, 0x370606, 0x370c02, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x370e01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x370f01, 0x371001, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x371104, 0x000000, 0x371501, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x371601, 0x000000, 0x000000, 0x000000, 0x371701, 0x000000,
+ 0x000000, 0x371802, 0x000000, 0x000000, 0x000000, 0x371a01, 0x371b01, 0x000000,
+ 0x000000, 0x371c08, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x372401, 0x000000, 0x000000, 0x000000, 0x000000, 0x372501,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x372601, 0x000000, 0x000000, 0x372701,
+ 0x000000, 0x000000, 0x372801, 0x000000, 0x372905, 0x372e01, 0x000000, 0x372f08,
+ 0x373702, 0x000000, 0x000000, 0x373902, 0x000000, 0x373b01, 0x000000, 0x000000,
+ 0x000000, 0x373c01, 0x373d04, 0x000000, 0x000000, 0x000000, 0x000000, 0x374103,
+ 0x000000, 0x000000, 0x374402, 0x000000, 0x374601, 0x000000, 0x000000, 0x000000,
+ 0x374701, 0x000000, 0x000000, 0x374801, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x374902, 0x000000, 0x374b01,
+ 0x374c02, 0x000000, 0x000000, 0x374e02, 0x000000, 0x375001, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x375101, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x37520a, 0x000000, 0x000000, 0x375c01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x375d02, 0x000000, 0x000000, 0x375f02, 0x000000,
+ 0x000000, 0x376101, 0x000000, 0x000000, 0x376202, 0x376401, 0x000000, 0x000000,
+ 0x376503, 0x376802, 0x376a03, 0x000000, 0x376d07, 0x000000, 0x000000, 0x377401,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x377501, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x377601, 0x377704, 0x000000, 0x000000, 0x000000,
+ 0x377b04, 0x000000, 0x000000, 0x377f17, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x379603,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x379901, 0x000000, 0x000000, 0x379a05, 0x000000, 0x000000, 0x000000,
+ 0x379f01, 0x37a005, 0x000000, 0x000000, 0x000000, 0x37a501, 0x000000, 0x000000,
+ 0x000000, 0x37a603, 0x000000, 0x37a901, 0x000000, 0x000000, 0x37aa03, 0x000000,
+ 0x000000, 0x37ad02, 0x000000, 0x000000, 0x37af04, 0x000000, 0x000000, 0x000000,
+ 0x37b301, 0x000000, 0x37b401, 0x000000, 0x000000, 0x000000, 0x000000, 0x37b505,
+ 0x37ba02, 0x37bc08, 0x000000, 0x000000, 0x37c401, 0x000000, 0x000000, 0x37c501,
+ 0x000000, 0x37c603, 0x37c901, 0x000000, 0x000000, 0x000000, 0x37ca01, 0x000000,
+ 0x000000, 0x000000, 0x37cb01, 0x37cc01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x37cd02, 0x000000, 0x000000, 0x000000, 0x37cf01, 0x000000, 0x000000, 0x000000,
+ 0x37d001, 0x000000, 0x37d103, 0x000000, 0x37d408, 0x37dc01, 0x37dd02, 0x37df01,
+ 0x37e002, 0x000000, 0x37e201, 0x000000, 0x37e301, 0x37e402, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x37e601, 0x37e705, 0x000000, 0x000000, 0x37ec01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x37ed02, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x37ef01, 0x000000, 0x000000, 0x000000, 0x000000, 0x37f001,
+ 0x37f104, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x37f503, 0x37f801,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x37f901, 0x37fa01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x37fb01, 0x000000, 0x000000, 0x000000,
+ 0x37fc04, 0x000000, 0x000000, 0x380003, 0x380301, 0x000000, 0x380401, 0x000000,
+ 0x000000, 0x380503, 0x000000, 0x380801, 0x380901, 0x000000, 0x000000, 0x380a0f,
+ 0x000000, 0x381902, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x381b01,
+ 0x381c06, 0x382202, 0x000000, 0x382401, 0x000000, 0x000000, 0x382505, 0x000000,
+ 0x382a15, 0x000000, 0x383f01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x384004, 0x000000, 0x000000, 0x384401, 0x000000, 0x384502, 0x000000, 0x384701,
+ 0x384808, 0x000000, 0x000000, 0x000000, 0x385007, 0x000000, 0x000000, 0x385706,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x385d01, 0x000000, 0x000000, 0x000000, 0x385e04, 0x000000, 0x000000,
+ 0x386205, 0x000000, 0x386702, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x386901, 0x000000, 0x000000, 0x386a03, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x386d08, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x387503, 0x000000, 0x387803, 0x000000, 0x387b06, 0x000000,
+ 0x000000, 0x388101, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x388202,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x388408, 0x000000,
+ 0x388c01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x388d04,
+ 0x389101, 0x000000, 0x000000, 0x000000, 0x389202, 0x000000, 0x000000, 0x000000,
+ 0x389401, 0x389501, 0x000000, 0x000000, 0x000000, 0x389601, 0x389701, 0x389803,
+ 0x389b01, 0x389c01, 0x389d01, 0x389e01, 0x389f01, 0x38a002, 0x000000, 0x38a202,
+ 0x000000, 0x38a401, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x38a505, 0x000000, 0x38aa05, 0x38af01,
+ 0x38b001, 0x38b101, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x38b20b, 0x38bd04, 0x38c107,
+ 0x000000, 0x38c807, 0x000000, 0x38cf03, 0x000000, 0x38d201, 0x000000, 0x000000,
+ 0x38d302, 0x38d501, 0x38d601, 0x000000, 0x000000, 0x38d701, 0x000000, 0x000000,
+ 0x000000, 0x38d801, 0x000000, 0x38d902, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x38db08, 0x38e301, 0x000000, 0x000000, 0x38e401, 0x38e502, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x38e701, 0x000000, 0x000000, 0x38e802,
+ 0x000000, 0x000000, 0x000000, 0x38ea05, 0x38ef01, 0x000000, 0x000000, 0x38f001,
+ 0x38f101, 0x38f201, 0x000000, 0x000000, 0x38f302, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x38f501, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x38f604, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x38fa01, 0x000000, 0x38fb0c, 0x000000,
+ 0x000000, 0x390701, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x390803, 0x000000,
+ 0x000000, 0x390b01, 0x390c06, 0x391202, 0x000000, 0x391402, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x39160c, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x392201, 0x000000, 0x392303, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x392602, 0x000000, 0x392801, 0x392901, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x392a01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x392b03, 0x000000, 0x000000, 0x392e03, 0x393102, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x393301, 0x000000, 0x000000, 0x000000, 0x000000, 0x393401,
+ 0x393507, 0x000000, 0x393c01, 0x000000, 0x000000, 0x393d04, 0x000000, 0x394103,
+ 0x000000, 0x394404, 0x000000, 0x000000, 0x000000, 0x394803, 0x000000, 0x000000,
+ 0x000000, 0x394b01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x394c01, 0x000000, 0x000000, 0x394d0a, 0x000000,
+ 0x000000, 0x000000, 0x395701, 0x000000, 0x000000, 0x395801, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x395901, 0x395a03, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x395d01, 0x000000, 0x000000, 0x000000, 0x000000, 0x395e0a, 0x396802,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x396a06, 0x397006, 0x397601, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x397701, 0x000000, 0x000000, 0x000000, 0x397806, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x397e01, 0x000000, 0x397f01, 0x398005, 0x398502, 0x000000,
+ 0x000000, 0x000000, 0x398701, 0x398802, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x398a02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x398c03, 0x398f01, 0x399003, 0x000000, 0x000000, 0x399302, 0x399502, 0x000000,
+ 0x000000, 0x000000, 0x399709, 0x39a002, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x39a203, 0x39a502, 0x39a701, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x39a801, 0x39a903, 0x39ac06, 0x39b201, 0x000000, 0x39b301, 0x000000, 0x39b401,
+ 0x39b501, 0x000000, 0x000000, 0x39b601, 0x000000, 0x000000, 0x39b701, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x39b802, 0x000000, 0x39ba03, 0x000000, 0x000000,
+ 0x39bd03, 0x000000, 0x000000, 0x39c001, 0x39c102, 0x39c307, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x39ca03, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x39cd05, 0x000000, 0x39d201, 0x39d302, 0x39d503, 0x000000,
+ 0x000000, 0x000000, 0x39d801, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x39d901, 0x000000, 0x000000, 0x000000, 0x000000, 0x39da01, 0x000000,
+ 0x39db03, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x39de01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x39df02,
+ 0x000000, 0x39e101, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x39e201, 0x000000, 0x39e303, 0x000000, 0x39e601, 0x000000, 0x000000, 0x000000,
+ 0x39e702, 0x000000, 0x000000, 0x39e901, 0x39ea03, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x39ed03, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x39f00c,
+ 0x000000, 0x39fc01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x39fd01,
+ 0x000000, 0x000000, 0x39fe18, 0x3a1602, 0x000000, 0x3a1803, 0x000000, 0x3a1b01,
+ 0x000000, 0x3a1c01, 0x3a1d02, 0x3a1f01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x3a2001, 0x000000, 0x3a210c, 0x3a2d01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x3a2e0c, 0x000000, 0x3a3a01, 0x000000, 0x3a3b03, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3a3e09, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x3a470b, 0x000000, 0x000000, 0x3a5201, 0x000000, 0x3a5302,
+ 0x3a5501, 0x3a5601, 0x000000, 0x000000, 0x3a5709, 0x000000, 0x3a6002, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3a6201, 0x000000,
+ 0x000000, 0x3a6301, 0x3a6402, 0x3a6601, 0x000000, 0x000000, 0x3a670c, 0x000000,
+ 0x000000, 0x000000, 0x3a7309, 0x3a7c11, 0x000000, 0x000000, 0x3a8d05, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x3a9203, 0x000000, 0x000000, 0x3a9503, 0x3a9801,
+ 0x000000, 0x000000, 0x3a9912, 0x3aab01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x3aac01, 0x000000, 0x3aad01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x3aae02, 0x000000, 0x000000, 0x3ab004, 0x3ab404, 0x3ab801, 0x000000,
+ 0x000000, 0x000000, 0x3ab901, 0x000000, 0x000000, 0x000000, 0x3aba08, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x3ac201, 0x3ac301, 0x000000, 0x000000,
+ 0x000000, 0x3ac401, 0x3ac502, 0x3ac702, 0x3ac90f, 0x000000, 0x3ad801, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x3ad909, 0x000000, 0x000000, 0x3ae207, 0x3ae902,
+ 0x3aeb01, 0x000000, 0x000000, 0x3aec01, 0x3aed02, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3aef01, 0x000000, 0x000000,
+ 0x000000, 0x3af005, 0x000000, 0x000000, 0x000000, 0x000000, 0x3af502, 0x000000,
+ 0x3af701, 0x000000, 0x3af803, 0x000000, 0x3afb02, 0x000000, 0x000000, 0x3afd03,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x3b0001, 0x000000, 0x000000, 0x3b0103, 0x000000, 0x3b0404, 0x3b0802, 0x000000,
+ 0x000000, 0x000000, 0x3b0a03, 0x000000, 0x3b0d01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x3b0e01, 0x000000, 0x000000, 0x3b0f03, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x3b1206, 0x3b1801, 0x000000, 0x000000,
+ 0x000000, 0x3b1901, 0x000000, 0x3b1a03, 0x000000, 0x000000, 0x3b1d01, 0x000000,
+ 0x3b1e02, 0x000000, 0x000000, 0x000000, 0x3b2001, 0x3b2101, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x3b2201, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x3b230e, 0x000000, 0x000000, 0x3b3108, 0x3b3907, 0x000000,
+ 0x3b4001, 0x3b4105, 0x000000, 0x3b4602, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x3b4801, 0x000000, 0x3b4901, 0x3b4a04, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x3b4e02, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x3b5002, 0x3b5207, 0x000000, 0x3b5901, 0x3b5a01, 0x3b5b08, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3b6302, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x3b6501, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x3b6606, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x3b6c01, 0x000000, 0x3b6d12, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3b7f02, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x3b8104, 0x000000, 0x3b8502, 0x3b8708, 0x000000, 0x3b8f02,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x3b9101, 0x3b9201, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3b9303, 0x000000, 0x000000,
+ 0x000000, 0x3b9607, 0x3b9d04, 0x3ba101, 0x000000, 0x000000, 0x000000, 0x3ba20a,
+ 0x000000, 0x000000, 0x000000, 0x3bac02, 0x3bae01, 0x000000, 0x000000, 0x000000,
+ 0x3baf01, 0x3bb001, 0x3bb103, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x3bb404, 0x000000, 0x000000, 0x000000, 0x000000, 0x3bb802, 0x000000, 0x000000,
+ 0x3bba05, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x3bbf01, 0x3bc007, 0x000000, 0x000000, 0x3bc702, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x3bc901, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x3bca01, 0x3bcb01, 0x000000, 0x3bcc02, 0x000000, 0x000000, 0x3bce01, 0x000000,
+ 0x000000, 0x3bcf01, 0x3bd001, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3bd103,
+ 0x3bd401, 0x000000, 0x000000, 0x000000, 0x3bd501, 0x3bd601, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x3bd701, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x3bd803, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x3bdb01, 0x000000, 0x3bdc01, 0x3bdd04, 0x000000, 0x3be104, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x3be501, 0x000000, 0x3be606, 0x000000, 0x3bec01,
+ 0x000000, 0x000000, 0x3bed01, 0x000000, 0x000000, 0x3bee01, 0x3bef01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x3bf002, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x3bf201, 0x000000, 0x000000, 0x3bf301, 0x3bf401, 0x3bf506, 0x000000, 0x3bfb01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x3bfc01, 0x000000, 0x3bfd01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x3bfe01, 0x3bff04, 0x3c0310, 0x000000, 0x3c130c, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x3c1f01, 0x000000, 0x000000, 0x3c2002,
+ 0x000000, 0x3c2201, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x3c2301, 0x000000, 0x000000, 0x3c2401, 0x3c2501, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x3c2601, 0x000000, 0x3c2702, 0x000000, 0x000000, 0x000000, 0x3c2903, 0x000000,
+ 0x3c2c05, 0x3c3101, 0x000000, 0x000000, 0x000000, 0x000000, 0x3c3201, 0x000000,
+ 0x000000, 0x000000, 0x3c3304, 0x000000, 0x3c370c, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x3c4307, 0x000000, 0x3c4a03, 0x000000,
+ 0x000000, 0x3c4d01, 0x000000, 0x000000, 0x000000, 0x000000, 0x3c4e01, 0x000000,
+ 0x000000, 0x000000, 0x3c4f01, 0x000000, 0x000000, 0x000000, 0x3c5008, 0x3c5802,
+ 0x3c5a01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x3c5b03, 0x000000, 0x000000, 0x3c5e01, 0x000000, 0x000000, 0x000000, 0x3c5f02,
+ 0x000000, 0x000000, 0x3c6102, 0x000000, 0x3c6301, 0x3c6401, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x3c6502, 0x3c6701, 0x000000, 0x3c6801, 0x000000,
+ 0x000000, 0x3c6901, 0x000000, 0x000000, 0x3c6a01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x3c6b0d, 0x000000, 0x000000, 0x000000, 0x000000, 0x3c7803,
+ 0x000000, 0x000000, 0x3c7b01, 0x000000, 0x3c7c01, 0x3c7d01, 0x000000, 0x000000,
+ 0x000000, 0x3c7e01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3c7f04,
+ 0x000000, 0x3c8306, 0x3c8901, 0x000000, 0x000000, 0x000000, 0x3c8a01, 0x000000,
+ 0x000000, 0x000000, 0x3c8b01, 0x000000, 0x3c8c0b, 0x000000, 0x000000, 0x3c970a,
+ 0x000000, 0x3ca102, 0x000000, 0x000000, 0x000000, 0x3ca301, 0x000000, 0x3ca401,
+ 0x3ca501, 0x000000, 0x000000, 0x3ca612, 0x000000, 0x000000, 0x3cb801, 0x3cb902,
+ 0x000000, 0x3cbb04, 0x3cbf01, 0x000000, 0x3cc001, 0x000000, 0x000000, 0x000000,
+ 0x3cc101, 0x000000, 0x3cc202, 0x000000, 0x3cc408, 0x3ccc08, 0x3cd404, 0x3cd801,
+ 0x3cd904, 0x000000, 0x3cdd01, 0x000000, 0x3cde03, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x3ce102, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x3ce301, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3ce404,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3ce801,
+ 0x3ce901, 0x000000, 0x000000, 0x000000, 0x000000, 0x3cea01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x3ceb01, 0x000000, 0x000000, 0x000000,
+ 0x3cec03, 0x000000, 0x000000, 0x000000, 0x000000, 0x3cef01, 0x000000, 0x000000,
+ 0x3cf001, 0x000000, 0x000000, 0x000000, 0x000000, 0x3cf101, 0x3cf201, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3cf305, 0x000000, 0x3cf803,
+ 0x000000, 0x000000, 0x3cfb01, 0x000000, 0x000000, 0x3cfc02, 0x000000, 0x000000,
+ 0x3cfe02, 0x3d0001, 0x3d0102, 0x000000, 0x000000, 0x3d0310, 0x000000, 0x3d1301,
+ 0x3d140c, 0x000000, 0x000000, 0x3d2001, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x3d2101, 0x000000, 0x000000, 0x3d2205, 0x000000,
+ 0x000000, 0x000000, 0x3d2702, 0x000000, 0x3d2906, 0x000000, 0x000000, 0x000000,
+ 0x3d2f01, 0x000000, 0x000000, 0x3d3003, 0x000000, 0x000000, 0x3d3301, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x3d3405, 0x000000, 0x000000, 0x3d3901,
+ 0x000000, 0x000000, 0x3d3a01, 0x000000, 0x000000, 0x000000, 0x000000, 0x3d3b01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x3d3c01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x3d3d01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3d3e02, 0x000000,
+ 0x000000, 0x3d4005, 0x000000, 0x3d4501, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x3d4601, 0x000000, 0x3d4702, 0x000000, 0x000000, 0x3d4907, 0x000000, 0x000000,
+ 0x000000, 0x3d5002, 0x000000, 0x3d5201, 0x3d5301, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3d5401, 0x000000,
+ 0x3d5501, 0x3d5601, 0x000000, 0x3d5701, 0x000000, 0x3d5802, 0x000000, 0x3d5a02,
+ 0x000000, 0x3d5c03, 0x000000, 0x3d5f04, 0x3d6301, 0x000000, 0x3d6401, 0x000000,
+ 0x3d6502, 0x3d6704, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3d6b01,
+ 0x000000, 0x000000, 0x000000, 0x3d6c01, 0x000000, 0x3d6d0e, 0x000000, 0x000000,
+ 0x000000, 0x3d7b05, 0x000000, 0x3d8001, 0x3d8101, 0x000000, 0x000000, 0x3d8201,
+ 0x000000, 0x3d8301, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3d8403,
+ 0x000000, 0x000000, 0x000000, 0x3d8701, 0x000000, 0x3d8806, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x3d8e06, 0x000000, 0x000000, 0x000000,
+ 0x3d9402, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x3d9604, 0x000000, 0x000000, 0x000000, 0x3d9a0d, 0x000000,
+ 0x000000, 0x3da701, 0x000000, 0x000000, 0x000000, 0x000000, 0x3da805, 0x3dad01,
+ 0x3dae01, 0x000000, 0x000000, 0x3daf0f, 0x000000, 0x000000, 0x000000, 0x3dbe04,
+ 0x000000, 0x3dc207, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3dc901, 0x000000,
+ 0x000000, 0x000000, 0x3dca02, 0x000000, 0x000000, 0x000000, 0x000000, 0x3dcc01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3dcd02, 0x3dcf03, 0x000000,
+ 0x000000, 0x3dd202, 0x000000, 0x000000, 0x3dd402, 0x3dd601, 0x000000, 0x3dd701,
+ 0x000000, 0x000000, 0x3dd802, 0x000000, 0x3dda03, 0x3ddd01, 0x3dde04, 0x3de201,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x3de301, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x3de406, 0x3dea05, 0x3def02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x3df102, 0x3df301, 0x000000, 0x3df403, 0x000000, 0x000000,
+ 0x000000, 0x3df701, 0x000000, 0x000000, 0x000000, 0x000000, 0x3df801, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3df906, 0x000000, 0x3dff04,
+ 0x000000, 0x000000, 0x3e0301, 0x000000, 0x000000, 0x000000, 0x000000, 0x3e0401,
+ 0x3e0505, 0x3e0a02, 0x3e0c03, 0x000000, 0x000000, 0x3e0f01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x3e1001, 0x3e1102, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3e1301, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3e1401, 0x000000, 0x000000,
+ 0x3e1501, 0x000000, 0x000000, 0x000000, 0x3e1601, 0x000000, 0x3e1701, 0x3e1801,
+ 0x000000, 0x3e1903, 0x3e1c01, 0x3e1d09, 0x000000, 0x3e2604, 0x3e2a01, 0x000000,
+ 0x3e2b08, 0x000000, 0x3e330b, 0x3e3e02, 0x000000, 0x3e400d, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x3e4d08, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x3e5503, 0x000000, 0x000000, 0x000000, 0x3e5805,
+ 0x000000, 0x000000, 0x3e5d01, 0x000000, 0x3e5e0a, 0x000000, 0x000000, 0x3e6801,
+ 0x000000, 0x000000, 0x3e6903, 0x000000, 0x000000, 0x3e6c01, 0x3e6d01, 0x3e6e03,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3e7104,
+ 0x000000, 0x000000, 0x000000, 0x3e7501, 0x000000, 0x3e7604, 0x3e7a03, 0x3e7d01,
+ 0x000000, 0x3e7e01, 0x000000, 0x3e7f08, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x3e8701, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x3e8802, 0x3e8a02, 0x000000, 0x3e8c01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x3e8d01, 0x000000, 0x000000, 0x3e8e08, 0x3e9601, 0x3e9701, 0x3e9801, 0x000000,
+ 0x000000, 0x3e9904, 0x000000, 0x3e9d02, 0x000000, 0x3e9f01, 0x000000, 0x3ea002,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3ea201, 0x3ea301,
+ 0x3ea402, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3ea602, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x3ea802, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x3eaa01, 0x3eab03, 0x000000, 0x000000, 0x3eae01, 0x000000, 0x000000,
+ 0x000000, 0x3eaf01, 0x000000, 0x000000, 0x3eb001, 0x3eb102, 0x3eb303, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x3eb601, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3eb702, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3eb902, 0x3ebb01, 0x3ebc02,
+ 0x000000, 0x000000, 0x3ebe01, 0x000000, 0x000000, 0x3ebf03, 0x000000, 0x000000,
+ 0x000000, 0x3ec201, 0x3ec301, 0x000000, 0x000000, 0x3ec409, 0x3ecd01, 0x000000,
+ 0x000000, 0x000000, 0x3ece01, 0x000000, 0x000000, 0x000000, 0x3ecf01, 0x000000,
+ 0x3ed007, 0x000000, 0x000000, 0x000000, 0x3ed701, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x3ed804, 0x3edc04, 0x000000, 0x3ee006, 0x000000, 0x3ee601, 0x000000, 0x3ee701,
+ 0x3ee897, 0x000000, 0x000000, 0x3f7f03, 0x000000, 0x000000, 0x3f8201, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3f8301, 0x3f8401,
+ 0x000000, 0x000000, 0x3f8501, 0x000000, 0x000000, 0x3f8605, 0x000000, 0x3f8b01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3f8c01,
+ 0x000000, 0x000000, 0x3f8d03, 0x3f9001, 0x000000, 0x3f9101, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x3f9201, 0x3f9301, 0x3f9403, 0x3f9701, 0x000000, 0x000000,
+ 0x000000, 0x3f9803, 0x3f9b02, 0x000000, 0x000000, 0x000000, 0x3f9d03, 0x000000,
+ 0x3fa001, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x3fa101, 0x000000, 0x000000, 0x000000, 0x000000, 0x3fa201,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3fa301,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x3fa402, 0x3fa602, 0x3fa805, 0x000000, 0x3fad02, 0x000000, 0x3faf01, 0x000000,
+ 0x3fb001, 0x000000, 0x3fb101, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3fb201,
+ 0x3fb304, 0x3fb701, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x3fb802, 0x3fba03, 0x000000, 0x3fbd03, 0x000000, 0x000000, 0x000000, 0x3fc005,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3fc507,
+ 0x3fcc03, 0x3fcf01, 0x000000, 0x000000, 0x000000, 0x000000, 0x3fd003, 0x3fd305,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x3fd801, 0x000000, 0x000000,
+ 0x3fd901, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x3fda01, 0x000000, 0x000000, 0x3fdb01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x3fdc01, 0x000000, 0x000000, 0x000000, 0x3fdd07, 0x000000,
+ 0x3fe402, 0x000000, 0x000000, 0x000000, 0x000000, 0x3fe601, 0x3fe702, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x3fe901, 0x3fea01, 0x3feb01, 0x3fec01, 0x000000,
+ 0x000000, 0x3fed01, 0x000000, 0x000000, 0x000000, 0x000000, 0x3fee01, 0x3fef01,
+ 0x000000, 0x3ff005, 0x3ff502, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x3ff702, 0x000000, 0x000000, 0x000000, 0x000000, 0x3ff901,
+ 0x3ffa01, 0x000000, 0x3ffb01, 0x000000, 0x000000, 0x000000, 0x3ffc02, 0x3ffe07,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x400509, 0x000000, 0x000000,
+ 0x000000, 0x400e03, 0x000000, 0x401102, 0x401302, 0x401501, 0x401602, 0x000000,
+ 0x000000, 0x000000, 0x401802, 0x401a01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x401b01, 0x000000, 0x401c02, 0x401e08, 0x402601, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x402704, 0x000000, 0x000000, 0x000000, 0x402b06, 0x403101,
+ 0x40320e, 0x404001, 0x000000, 0x404101, 0x404202, 0x000000, 0x000000, 0x000000,
+ 0x404401, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x404502, 0x000000, 0x000000, 0x404702, 0x404901, 0x000000, 0x000000, 0x404a01,
+ 0x000000, 0x000000, 0x404b02, 0x000000, 0x000000, 0x000000, 0x000000, 0x404d01,
+ 0x000000, 0x404e03, 0x000000, 0x000000, 0x40510d, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x405e01, 0x000000, 0x000000, 0x405f01, 0x000000, 0x406003,
+ 0x406301, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x406404, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x406802, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x406a07, 0x000000, 0x000000, 0x407105, 0x000000, 0x000000, 0x407602, 0x000000,
+ 0x407801, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x407902, 0x000000, 0x000000, 0x000000, 0x407b01, 0x407c02, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x407e02,
+ 0x408003, 0x000000, 0x000000, 0x000000, 0x408301, 0x000000, 0x408402, 0x000000,
+ 0x40860a, 0x000000, 0x409002, 0x000000, 0x000000, 0x409203, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x409507, 0x000000, 0x000000, 0x409c01,
+ 0x409d01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x409e04, 0x40a201, 0x40a303, 0x000000, 0x000000, 0x000000,
+ 0x40a601, 0x000000, 0x40a701, 0x000000, 0x000000, 0x000000, 0x40a805, 0x000000,
+ 0x000000, 0x40ad04, 0x000000, 0x000000, 0x40b103, 0x40b405, 0x000000, 0x000000,
+ 0x000000, 0x40b903, 0x000000, 0x000000, 0x000000, 0x40bc0c, 0x40c801, 0x000000,
+ 0x000000, 0x000000, 0x40c901, 0x40ca08, 0x40d201, 0x000000, 0x40d302, 0x000000,
+ 0x40d502, 0x000000, 0x000000, 0x000000, 0x40d701, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x40d802, 0x000000, 0x000000, 0x000000, 0x000000, 0x40da01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x40db08,
+ 0x40e301, 0x000000, 0x000000, 0x000000, 0x000000, 0x40e405, 0x000000, 0x40e916,
+ 0x000000, 0x000000, 0x000000, 0x40ff01, 0x000000, 0x000000, 0x410004, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x410401, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x410505, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x410a02, 0x000000, 0x000000, 0x000000, 0x000000, 0x410c01, 0x410d01,
+ 0x000000, 0x000000, 0x000000, 0x410e01, 0x000000, 0x000000, 0x410f0b, 0x411a04,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x411e01, 0x000000, 0x411f01, 0x000000,
+ 0x000000, 0x000000, 0x412003, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x41230a, 0x000000, 0x412d03, 0x000000, 0x000000, 0x000000, 0x000000, 0x413001,
+ 0x000000, 0x413102, 0x000000, 0x413301, 0x000000, 0x413401, 0x000000, 0x413502,
+ 0x000000, 0x413709, 0x000000, 0x000000, 0x000000, 0x414002, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x414202, 0x000000, 0x000000, 0x000000,
+ 0x414402, 0x000000, 0x000000, 0x000000, 0x000000, 0x414601, 0x000000, 0x414701,
+ 0x414802, 0x000000, 0x000000, 0x000000, 0x414a01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x414b02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x414d06, 0x415302, 0x000000, 0x000000, 0x415501,
+ 0x415601, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x415701, 0x000000, 0x415801, 0x000000, 0x000000, 0x415901, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x415a01, 0x000000, 0x000000, 0x000000, 0x415b02,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x415d04, 0x416105, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x416602, 0x000000,
+ 0x000000, 0x416804, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x416c03,
+ 0x000000, 0x416f04, 0x000000, 0x000000, 0x000000, 0x000000, 0x417302, 0x000000,
+ 0x000000, 0x417501, 0x000000, 0x417601, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x417702, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x417907, 0x000000, 0x418001, 0x000000, 0x418102, 0x000000, 0x418305,
+ 0x000000, 0x000000, 0x000000, 0x418803, 0x418b01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x418c01, 0x000000, 0x000000, 0x418d02, 0x000000,
+ 0x418f01, 0x000000, 0x000000, 0x419002, 0x419205, 0x419702, 0x000000, 0x000000,
+ 0x419904, 0x000000, 0x000000, 0x000000, 0x419d0b, 0x000000, 0x000000, 0x41a805,
+ 0x000000, 0x000000, 0x41ad02, 0x41af01, 0x41b002, 0x000000, 0x41b201, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x41b310, 0x000000, 0x000000, 0x41c303, 0x41c602, 0x000000, 0x000000,
+ 0x41c80a, 0x41d206, 0x41d801, 0x000000, 0x000000, 0x41d901, 0x41da01, 0x000000,
+ 0x000000, 0x41db02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x41dd01, 0x000000, 0x41de01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x41df0c, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x41eb05, 0x000000, 0x41f001, 0x41f103,
+ 0x000000, 0x41f401, 0x41f501, 0x000000, 0x41f602, 0x000000, 0x000000, 0x000000,
+ 0x41f802, 0x41fa03, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x41fd01,
+ 0x41fe02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x420001, 0x000000, 0x42010f, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x42100b, 0x000000, 0x000000, 0x421b01,
+ 0x421c01, 0x421d01, 0x000000, 0x000000, 0x421e0a, 0x000000, 0x000000, 0x000000,
+ 0x422801, 0x422902, 0x000000, 0x000000, 0x000000, 0x422b01, 0x422c01, 0x000000,
+ 0x000000, 0x000000, 0x422d03, 0x423001, 0x000000, 0x423103, 0x423401, 0x423502,
+ 0x000000, 0x000000, 0x000000, 0x423703, 0x423a0a, 0x000000, 0x000000, 0x000000,
+ 0x424404, 0x000000, 0x424806, 0x000000, 0x000000, 0x424e01, 0x000000, 0x000000,
+ 0x424f02, 0x000000, 0x000000, 0x000000, 0x000000, 0x425103, 0x000000, 0x000000,
+ 0x425402, 0x000000, 0x425606, 0x425c01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x425d01, 0x000000, 0x000000, 0x425e02, 0x000000, 0x000000, 0x000000, 0x426001,
+ 0x000000, 0x426102, 0x426304, 0x426702, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x426902, 0x426b02, 0x000000, 0x426d01, 0x000000, 0x000000, 0x426e01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x426f05, 0x427401, 0x427507, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x427c0a, 0x000000, 0x428602, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x428803, 0x428b02, 0x000000, 0x428d01, 0x000000, 0x000000, 0x428e06, 0x000000,
+ 0x429401, 0x000000, 0x000000, 0x429501, 0x429601, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x429701, 0x000000, 0x429801, 0x429901, 0x000000, 0x429a02, 0x429c01,
+ 0x000000, 0x429d01, 0x000000, 0x429e08, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x42a601, 0x000000, 0x000000, 0x42a701, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x42a803, 0x000000, 0x000000, 0x42ab04,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x42af01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x42b001, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x42b106,
+ 0x000000, 0x42b701, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x42b802,
+ 0x42ba01, 0x42bb01, 0x000000, 0x000000, 0x000000, 0x42bc07, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x42c301, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x42c402, 0x000000, 0x42c607, 0x42cd01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x42ce02, 0x000000,
+ 0x000000, 0x42d002, 0x000000, 0x42d207, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x42d901, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x42da0a, 0x42e402,
+ 0x42e601, 0x000000, 0x000000, 0x42e701, 0x000000, 0x000000, 0x000000, 0x42e801,
+ 0x42e901, 0x000000, 0x42ea01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x42eb03, 0x42ee0a, 0x42f801, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x42f901, 0x000000, 0x42fa01, 0x000000, 0x42fb01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x42fc01, 0x42fd01,
+ 0x000000, 0x42fe02, 0x430002, 0x000000, 0x430208, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x430a08, 0x431203, 0x000000, 0x431505, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x431a03, 0x000000, 0x000000, 0x431d03, 0x432001, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x432102, 0x000000, 0x000000, 0x432301, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x432402, 0x432603,
+ 0x000000, 0x432901, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x432a01, 0x432b07, 0x433201, 0x433301, 0x000000,
+ 0x000000, 0x43340c, 0x434001, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x434101, 0x000000, 0x000000, 0x000000, 0x000000, 0x434201, 0x000000, 0x434301,
+ 0x000000, 0x434409, 0x000000, 0x000000, 0x434d06, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x435302, 0x000000, 0x435501, 0x435602, 0x000000, 0x000000,
+ 0x000000, 0x435803, 0x435b01, 0x000000, 0x000000, 0x435c03, 0x000000, 0x435f03,
+ 0x000000, 0x000000, 0x436201, 0x000000, 0x43630c, 0x000000, 0x000000, 0x436f02,
+ 0x000000, 0x437102, 0x000000, 0x000000, 0x000000, 0x437303, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x437601, 0x437701, 0x000000, 0x437816, 0x000000, 0x438e07,
+ 0x000000, 0x439503, 0x000000, 0x439801, 0x000000, 0x000000, 0x000000, 0x439902,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x439b01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x439c01, 0x000000, 0x439d03, 0x43a001, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x43a101, 0x43a202, 0x000000, 0x43a401, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x43a502, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x43a70e, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x43b50a,
+ 0x000000, 0x43bf04, 0x43c302, 0x000000, 0x000000, 0x000000, 0x43c501, 0x43c602,
+ 0x000000, 0x000000, 0x43c801, 0x000000, 0x000000, 0x43c901, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x43ca01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x43cb01, 0x43cc02,
+ 0x000000, 0x000000, 0x43ce0c, 0x000000, 0x000000, 0x000000, 0x43da01, 0x000000,
+ 0x43db15, 0x000000, 0x000000, 0x000000, 0x43f001, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x43f101, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x43f204,
+ 0x000000, 0x000000, 0x43f602, 0x000000, 0x000000, 0x000000, 0x43f810, 0x440801,
+ 0x000000, 0x440901, 0x000000, 0x440a03, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x440d01, 0x440e01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x440f04, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x441301, 0x441404,
+ 0x441804, 0x000000, 0x000000, 0x000000, 0x441c04, 0x000000, 0x000000, 0x442001,
+ 0x000000, 0x000000, 0x44210b, 0x000000, 0x000000, 0x442c01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x442d02, 0x442f06,
+ 0x443504, 0x000000, 0x000000, 0x443902, 0x000000, 0x000000, 0x443b01, 0x000000,
+ 0x000000, 0x443c01, 0x000000, 0x000000, 0x000000, 0x000000, 0x443d05, 0x000000,
+ 0x444204, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x444604, 0x000000,
+ 0x000000, 0x000000, 0x444a01, 0x444b01, 0x000000, 0x444c01, 0x000000, 0x444d05,
+ 0x000000, 0x445201, 0x445301, 0x000000, 0x000000, 0x445401, 0x000000, 0x445501,
+ 0x445601, 0x000000, 0x000000, 0x000000, 0x445701, 0x000000, 0x000000, 0x000000,
+ 0x445805, 0x000000, 0x000000, 0x000000, 0x445d01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x445e02, 0x000000, 0x446002, 0x000000, 0x446205, 0x000000,
+ 0x000000, 0x000000, 0x446701, 0x446801, 0x446901, 0x000000, 0x000000, 0x446a04,
+ 0x000000, 0x000000, 0x000000, 0x446e03, 0x000000, 0x000000, 0x000000, 0x447101,
+ 0x000000, 0x000000, 0x447204, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x447601, 0x000000, 0x000000, 0x000000,
+ 0x447706, 0x000000, 0x000000, 0x000000, 0x447d02, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x447f03, 0x000000, 0x000000, 0x000000, 0x448201, 0x000000, 0x448303,
+ 0x448606, 0x448c07, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x449302, 0x000000, 0x000000, 0x449501, 0x000000, 0x449601,
+ 0x000000, 0x000000, 0x449703, 0x000000, 0x000000, 0x000000, 0x449a01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x449b01, 0x000000, 0x000000,
+ 0x449c01, 0x449d01, 0x000000, 0x449e02, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x44a001, 0x44a105, 0x000000, 0x44a606, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x44ac01, 0x000000, 0x000000, 0x000000, 0x44ad01, 0x44ae03, 0x000000,
+ 0x44b101, 0x000000, 0x000000, 0x44b201, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x44b308, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x44bb01, 0x44bc01, 0x000000, 0x000000, 0x44bd02, 0x44bf01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x44c003, 0x000000, 0x000000, 0x000000,
+ 0x44c301, 0x000000, 0x000000, 0x44c402, 0x000000, 0x000000, 0x44c605, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x44cb06, 0x000000, 0x000000, 0x44d103, 0x000000, 0x44d401,
+ 0x44d501, 0x000000, 0x000000, 0x000000, 0x000000, 0x44d601, 0x000000, 0x000000,
+ 0x44d706, 0x000000, 0x000000, 0x44dd01, 0x000000, 0x000000, 0x44de02, 0x44e001,
+ 0x44e101, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x44e201, 0x000000, 0x000000, 0x44e301, 0x000000, 0x000000, 0x44e401, 0x000000,
+ 0x44e502, 0x000000, 0x44e701, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x44e802, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x44ea02, 0x000000, 0x000000, 0x000000, 0x000000, 0x44ec01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x44ed10, 0x44fd01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x44fe01, 0x44ff01, 0x000000, 0x450001, 0x450103, 0x000000, 0x000000,
+ 0x000000, 0x450402, 0x450602, 0x450806, 0x000000, 0x450e05, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x451302, 0x000000, 0x000000,
+ 0x000000, 0x45151c, 0x000000, 0x453106, 0x000000, 0x000000, 0x453702, 0x453904,
+ 0x453d02, 0x000000, 0x000000, 0x453f01, 0x000000, 0x000000, 0x454003, 0x000000,
+ 0x000000, 0x000000, 0x454301, 0x000000, 0x454401, 0x000000, 0x454501, 0x000000,
+ 0x000000, 0x000000, 0x454602, 0x000000, 0x000000, 0x000000, 0x000000, 0x454802,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x454a02, 0x000000, 0x000000, 0x000000,
+ 0x454c01, 0x454d01, 0x000000, 0x000000, 0x000000, 0x000000, 0x454e01, 0x454f01,
+ 0x455004, 0x000000, 0x000000, 0x000000, 0x455401, 0x000000, 0x455501, 0x455601,
+ 0x455702, 0x455907, 0x456001, 0x456101, 0x000000, 0x456203, 0x000000, 0x456506,
+ 0x000000, 0x456b03, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x456e01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x456f01,
+ 0x000000, 0x000000, 0x457001, 0x000000, 0x000000, 0x457101, 0x457203, 0x000000,
+ 0x457501, 0x457601, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x457725, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x459c01, 0x000000, 0x000000, 0x000000,
+ 0x459d01, 0x000000, 0x000000, 0x000000, 0x459e02, 0x45a001, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x45a105, 0x45a601, 0x45a701, 0x45a80c, 0x000000,
+ 0x000000, 0x45b401, 0x000000, 0x000000, 0x000000, 0x45b502, 0x000000, 0x000000,
+ 0x000000, 0x45b702, 0x45b904, 0x45bd01, 0x000000, 0x45be04, 0x000000, 0x000000,
+ 0x45c201, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x45c301,
+ 0x45c409, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x45cd01, 0x45ce01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x45cf07, 0x000000, 0x000000, 0x000000,
+ 0x45d602, 0x000000, 0x000000, 0x000000, 0x45d802, 0x45da01, 0x000000, 0x45db01,
+ 0x000000, 0x45dc01, 0x000000, 0x000000, 0x45dd01, 0x000000, 0x000000, 0x45de04,
+ 0x45e23e, 0x462001, 0x000000, 0x000000, 0x000000, 0x000000, 0x462101, 0x000000,
+ 0x000000, 0x46220d, 0x000000, 0x462f04, 0x000000, 0x000000, 0x463302, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x463502, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x463702, 0x463905, 0x000000, 0x000000, 0x463e14, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x465204, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x465602, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x465801, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x465902, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x465b02, 0x000000, 0x000000,
+ 0x465d01, 0x000000, 0x000000, 0x000000, 0x465e01, 0x000000, 0x000000, 0x000000,
+ 0x465f01, 0x000000, 0x46600d, 0x000000, 0x000000, 0x000000, 0x466d01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x466e05, 0x000000,
+ 0x000000, 0x467301, 0x467401, 0x46750b, 0x000000, 0x000000, 0x468007, 0x468701,
+ 0x000000, 0x468801, 0x468901, 0x000000, 0x468a03, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x468d02, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x468f03, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x469201, 0x000000, 0x000000, 0x000000, 0x469307,
+ 0x000000, 0x000000, 0x469a03, 0x000000, 0x000000, 0x469d0f, 0x46ac01, 0x46ad03,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x46b001, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x46b102, 0x46b308,
+ 0x000000, 0x000000, 0x000000, 0x46bb03, 0x000000, 0x46be01, 0x000000, 0x000000,
+ 0x46bf01, 0x000000, 0x46c002, 0x000000, 0x000000, 0x46c201, 0x46c302, 0x000000,
+ 0x46c503, 0x000000, 0x000000, 0x000000, 0x000000, 0x46c802, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x46ca01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x46cb01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x46cc01, 0x46cd01, 0x000000, 0x46ce01, 0x000000, 0x000000, 0x46cf07,
+ 0x46d60f, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x46e501, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x46e601, 0x46e704, 0x000000, 0x000000, 0x46eb08, 0x46f302, 0x000000, 0x46f505,
+ 0x46fa01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x46fb0b, 0x470601, 0x000000, 0x470701, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x470802, 0x000000, 0x470a01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x470b01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x470c01, 0x000000, 0x000000, 0x470d01, 0x000000,
+ 0x000000, 0x470e01, 0x470f02, 0x000000, 0x000000, 0x471101, 0x471201, 0x471301,
+ 0x000000, 0x000000, 0x000000, 0x471406, 0x000000, 0x471a01, 0x000000, 0x471b01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x471c02, 0x000000, 0x000000, 0x000000,
+ 0x471e01, 0x471f06, 0x000000, 0x000000, 0x472501, 0x000000, 0x000000, 0x000000,
+ 0x472601, 0x472704, 0x000000, 0x000000, 0x000000, 0x472b02, 0x000000, 0x000000,
+ 0x472d01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x472e02, 0x000000,
+ 0x473006, 0x473603, 0x000000, 0x473901, 0x000000, 0x473a05, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x473f01, 0x000000, 0x000000, 0x474001, 0x474101, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x474208, 0x474a02, 0x000000, 0x474c01,
+ 0x000000, 0x474d0c, 0x000000, 0x000000, 0x000000, 0x475903, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x475c01, 0x475d01, 0x475e02, 0x476008,
+ 0x476801, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x476901, 0x000000, 0x476a01,
+ 0x000000, 0x476b01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x476c02, 0x000000, 0x476e02, 0x477001, 0x000000, 0x000000, 0x477112, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x478302, 0x000000, 0x000000, 0x000000, 0x478501,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x478601, 0x000000, 0x478701, 0x478802,
+ 0x000000, 0x478a01, 0x000000, 0x000000, 0x478b04, 0x478f0b, 0x000000, 0x479a01,
+ 0x000000, 0x479b04, 0x000000, 0x479f01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x47a003, 0x000000, 0x47a301, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x47a403, 0x000000, 0x47a701, 0x47a801,
+ 0x000000, 0x47a902, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x47ab03,
+ 0x000000, 0x47ae05, 0x000000, 0x000000, 0x47b301, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x47b40a, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x47be01, 0x000000, 0x000000, 0x000000, 0x47bf01, 0x000000, 0x47c001,
+ 0x000000, 0x47c101, 0x47c242, 0x000000, 0x000000, 0x000000, 0x480407, 0x480b01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x480c05, 0x481101,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x481201, 0x000000, 0x481301, 0x000000,
+ 0x000000, 0x000000, 0x481402, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x481601, 0x000000, 0x000000, 0x000000, 0x481701, 0x000000, 0x481803, 0x000000,
+ 0x481b01, 0x000000, 0x000000, 0x481c05, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x482101, 0x000000, 0x000000, 0x482206,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x482803, 0x000000, 0x000000, 0x000000,
+ 0x482b01, 0x000000, 0x482c01, 0x000000, 0x000000, 0x000000, 0x482d01, 0x482e01,
+ 0x482f05, 0x000000, 0x000000, 0x000000, 0x483401, 0x000000, 0x000000, 0x000000,
+ 0x483502, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x483702,
+ 0x483901, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x483a04,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x483e01, 0x000000, 0x000000,
+ 0x483f09, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x484810,
+ 0x000000, 0x485801, 0x000000, 0x485901, 0x485a02, 0x000000, 0x000000, 0x000000,
+ 0x485c01, 0x485d01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x485e05,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x486301, 0x486401, 0x000000, 0x486501,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x486602, 0x486801,
+ 0x000000, 0x486902, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x486b01, 0x486c01, 0x486d01, 0x486e03, 0x000000, 0x487107, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x487803, 0x487b02, 0x000000, 0x000000, 0x487d0b, 0x000000,
+ 0x000000, 0x488802, 0x488a01, 0x000000, 0x000000, 0x000000, 0x488b02, 0x000000,
+ 0x488d0c, 0x000000, 0x000000, 0x000000, 0x000000, 0x489902, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x489b01, 0x000000, 0x000000, 0x489c01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x489d02, 0x000000, 0x489f02,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x48a102, 0x000000, 0x000000, 0x000000,
+ 0x48a301, 0x000000, 0x000000, 0x48a401, 0x48a503, 0x000000, 0x000000, 0x48a801,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x48a901, 0x000000, 0x000000, 0x000000,
+ 0x48aa01, 0x48ab01, 0x000000, 0x48ac03, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x48af03, 0x000000, 0x000000, 0x48b201, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x48b304, 0x000000, 0x48b701,
+ 0x000000, 0x000000, 0x48b802, 0x48ba09, 0x000000, 0x000000, 0x000000, 0x48c301,
+ 0x000000, 0x000000, 0x000000, 0x48c401, 0x000000, 0x000000, 0x48c501, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x48c601, 0x000000,
+ 0x48c703, 0x000000, 0x000000, 0x48ca02, 0x48cc04, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x48d002, 0x48d205, 0x48d704, 0x000000, 0x48db01,
+ 0x000000, 0x000000, 0x48dc02, 0x000000, 0x48de01, 0x48df01, 0x000000, 0x000000,
+ 0x000000, 0x48e009, 0x000000, 0x000000, 0x48e908, 0x48f103, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x48f407, 0x48fb01, 0x48fc01, 0x000000, 0x000000, 0x48fd04,
+ 0x000000, 0x000000, 0x490105, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x490601, 0x490701, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x490803, 0x000000,
+ 0x000000, 0x490b02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x490d06, 0x000000, 0x491301, 0x000000, 0x000000, 0x491401, 0x000000, 0x491501,
+ 0x000000, 0x000000, 0x491603, 0x000000, 0x491904, 0x000000, 0x000000, 0x491d01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x491e03, 0x000000,
+ 0x000000, 0x492104, 0x000000, 0x492505, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x492a08, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x493202,
+ 0x493401, 0x000000, 0x000000, 0x493501, 0x000000, 0x493601, 0x493702, 0x493902,
+ 0x493b04, 0x000000, 0x493f01, 0x494001, 0x000000, 0x000000, 0x494109, 0x494a02,
+ 0x000000, 0x494c01, 0x000000, 0x000000, 0x000000, 0x494d03, 0x000000, 0x000000,
+ 0x000000, 0x495004, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x495405,
+ 0x495901, 0x495a02, 0x495c03, 0x000000, 0x000000, 0x495f03, 0x496201, 0x000000,
+ 0x496305, 0x000000, 0x496802, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x496a05, 0x000000, 0x000000, 0x496f01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x497003, 0x497302, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x497505, 0x000000, 0x000000, 0x000000, 0x497a04,
+ 0x497e01, 0x497f09, 0x000000, 0x000000, 0x000000, 0x000000, 0x498802, 0x000000,
+ 0x000000, 0x498a02, 0x498c01, 0x000000, 0x000000, 0x498d01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x498e01, 0x000000, 0x000000, 0x498f01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x499007, 0x000000, 0x499701, 0x000000, 0x499801, 0x000000,
+ 0x499901, 0x000000, 0x000000, 0x000000, 0x000000, 0x499a01, 0x000000, 0x499b01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x499c01, 0x499d02,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x499f05, 0x000000, 0x000000, 0x000000, 0x49a407,
+ 0x49ab02, 0x000000, 0x000000, 0x49ad04, 0x49b101, 0x000000, 0x000000, 0x49b202,
+ 0x49b405, 0x000000, 0x000000, 0x49b907, 0x49c00a, 0x49ca01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x49cb03, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x49ce01, 0x000000, 0x49cf04, 0x000000, 0x000000, 0x000000, 0x49d301,
+ 0x000000, 0x000000, 0x000000, 0x49d401, 0x000000, 0x49d50d, 0x49e201, 0x49e303,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x49e601, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x49e701, 0x000000,
+ 0x000000, 0x000000, 0x49e808, 0x49f001, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x49f102, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x49f302,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x49f508, 0x49fd09, 0x000000, 0x000000,
+ 0x000000, 0x4a0606, 0x4a0c01, 0x000000, 0x000000, 0x000000, 0x000000, 0x4a0d01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x4a0e01, 0x4a0f01, 0x000000, 0x000000,
+ 0x4a1001, 0x000000, 0x000000, 0x4a1101, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x4a1201, 0x4a1301, 0x000000, 0x000000, 0x000000, 0x4a1402, 0x000000, 0x4a1601,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x4a1701, 0x000000, 0x4a1801, 0x000000, 0x4a1903, 0x4a1c03, 0x4a1f01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x4a2004, 0x000000,
+ 0x000000, 0x000000, 0x4a2409, 0x000000, 0x000000, 0x000000, 0x4a2d08, 0x000000,
+ 0x4a3501, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x4a3604, 0x4a3a02,
+ 0x000000, 0x000000, 0x4a3c01, 0x000000, 0x000000, 0x000000, 0x4a3d02, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x4a3f03, 0x4a4207, 0x000000,
+ 0x000000, 0x4a4901, 0x000000, 0x000000, 0x4a4a05, 0x000000, 0x4a4f07, 0x000000,
+ 0x4a5601, 0x4a5707, 0x000000, 0x4a5e02, 0x000000, 0x4a6009, 0x4a6901, 0x000000,
+ 0x000000, 0x000000, 0x4a6a04, 0x4a6e01, 0x4a6f03, 0x000000, 0x4a7204, 0x4a7601,
+ 0x4a7718, 0x000000, 0x000000, 0x4a8f05, 0x000000, 0x000000, 0x000000, 0x4a9401,
+ 0x4a9501, 0x000000, 0x000000, 0x000000, 0x000000, 0x4a9601, 0x000000, 0x4a9701,
+ 0x000000, 0x000000, 0x000000, 0x4a9801, 0x000000, 0x000000, 0x4a9901, 0x000000,
+ 0x4a9a01, 0x4a9b03, 0x000000, 0x000000, 0x4a9e08, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x4aa601, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x4aa704, 0x000000, 0x000000, 0x000000, 0x4aab01,
+ 0x4aac04, 0x000000, 0x4ab001, 0x4ab101, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x4ab201, 0x4ab301, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x4ab401, 0x4ab502, 0x000000, 0x4ab701, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x4ab801, 0x4ab901, 0x4aba01, 0x4abb0e, 0x000000, 0x000000, 0x4ac901,
+ 0x000000, 0x000000, 0x4aca09, 0x4ad302, 0x4ad518, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x4aed03, 0x4af002, 0x000000,
+ 0x000000, 0x4af206, 0x000000, 0x000000, 0x000000, 0x4af801, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x4af903, 0x000000, 0x4afc01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x4afd04, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x4b0101, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x4b0202, 0x000000,
+ 0x4b0405, 0x4b0903, 0x000000, 0x000000, 0x000000, 0x4b0c05, 0x000000, 0x4b1105,
+ 0x000000, 0x000000, 0x000000, 0x4b1606, 0x4b1c01, 0x000000, 0x000000, 0x4b1d01,
+ 0x000000, 0x000000, 0x4b1e01, 0x4b1f01, 0x4b2006, 0x4b2601, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x4b2708, 0x000000, 0x4b2f01, 0x4b3005, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x4b3502, 0x000000, 0x4b3702, 0x4b3901, 0x4b3a02,
+ 0x000000, 0x000000, 0x4b3c05, 0x000000, 0x4b4106, 0x000000, 0x000000, 0x000000,
+ 0x4b4706, 0x000000, 0x4b4d03, 0x4b5001, 0x4b5101, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x4b5201, 0x000000, 0x000000, 0x4b5301, 0x000000, 0x000000, 0x4b5402,
+ 0x4b5601, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x4b5703,
+ 0x4b5a01, 0x000000, 0x4b5b05, 0x000000, 0x000000, 0x000000, 0x000000, 0x4b6001,
+ 0x000000, 0x4b6104, 0x000000, 0x000000, 0x000000, 0x000000, 0x4b6501, 0x4b6601,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x4b6701, 0x4b6809, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x4b7101, 0x000000, 0x000000, 0x4b7206, 0x000000, 0x000000,
+ 0x4b7801, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x4b790b, 0x000000, 0x4b8401, 0x000000, 0x4b8501, 0x4b8601, 0x000000, 0x4b8701,
+ 0x4b8809, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x4b9107, 0x000000, 0x000000, 0x4b9801,
+ 0x000000, 0x4b9908, 0x4ba104, 0x000000, 0x4ba501, 0x4ba602, 0x000000, 0x000000,
+ 0x4ba806, 0x000000, 0x4bae02, 0x000000, 0x4bb003, 0x4bb308, 0x4bbb01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x4bbc01, 0x4bbd02, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x4bbf0a, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x4bc90a, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x4bd301, 0x000000, 0x000000, 0x4bd409, 0x4bdd02, 0x000000, 0x4bdf01,
+ 0x000000, 0x000000, 0x000000, 0x4be003, 0x000000, 0x000000, 0x000000, 0x4be303,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x4be601, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x4be710, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x4bf70b, 0x4c0202, 0x000000, 0x000000, 0x4c0401, 0x000000, 0x4c0501, 0x4c0604,
+ 0x000000, 0x4c0a07, 0x4c1108, 0x4c190c, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x4c2507, 0x000000, 0x000000, 0x000000, 0x000000, 0x4c2c01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x4c2d02, 0x4c2f01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x4c3001, 0x000000, 0x000000, 0x000000, 0x000000, 0x4c3101, 0x4c3201,
+ 0x000000, 0x000000, 0x000000, 0x4c3303, 0x000000, 0x000000, 0x4c3603, 0x000000,
+ 0x000000, 0x4c3901, 0x000000, 0x4c3a01, 0x000000, 0x4c3b02, 0x000000, 0x4c3d0c,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x4c4907, 0x000000, 0x4c5001, 0x4c5105, 0x000000, 0x4c5603,
+ 0x4c5901, 0x000000, 0x4c5a04, 0x4c5e01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x4c5f01, 0x4c6002, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x4c6201, 0x000000, 0x000000, 0x4c6304, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x4c6701, 0x4c6801, 0x000000, 0x000000, 0x4c6903, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x4c6c02, 0x4c6e01, 0x000000, 0x4c6f01, 0x000000,
+ 0x000000, 0x000000, 0x4c7001, 0x4c7108, 0x000000, 0x4c7902, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x4c7b01, 0x000000, 0x000000, 0x000000, 0x000000, 0x4c7c03,
+ 0x4c7f01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x4c8001, 0x4c8101, 0x000000, 0x000000, 0x000000, 0x4c8201, 0x4c8301, 0x000000,
+ 0x4c8403, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x4c8701,
+ 0x4c8806, 0x4c8e01, 0x000000, 0x4c8f04, 0x000000, 0x000000, 0x4c9301, 0x000000,
+ 0x000000, 0x4c9401, 0x000000, 0x4c9502, 0x4c9702, 0x4c9903, 0x000000, 0x4c9c01,
+ 0x4c9d02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x4c9f01,
+ 0x4ca001, 0x000000, 0x000000, 0x4ca101, 0x000000, 0x000000, 0x4ca201, 0x000000,
+ 0x000000, 0x000000, 0x4ca301, 0x4ca40a, 0x4cae01, 0x000000, 0x000000, 0x4caf02,
+ 0x4cb102, 0x4cb307, 0x000000, 0x4cba01, 0x000000, 0x000000, 0x4cbb0e, 0x4cc901,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x4cca10, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x4cda02, 0x4cdc02, 0x000000, 0x000000, 0x000000, 0x000000, 0x4cde04, 0x000000,
+ 0x4ce201, 0x000000, 0x4ce303, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x4ce601, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x4ce701, 0x4ce803, 0x4ceb03, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x4cee02, 0x4cf001, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x4cf101, 0x4cf201, 0x000000, 0x000000, 0x4cf302,
+ 0x000000, 0x4cf501, 0x000000, 0x000000, 0x4cf601, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x4cf704, 0x4cfb02, 0x000000, 0x4cfd03, 0x000000,
+ 0x4d0002, 0x000000, 0x000000, 0x000000, 0x4d0203, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x4d0502, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x4d0702, 0x000000, 0x4d0903, 0x000000, 0x000000, 0x4d0c05, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x4d1101, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x4d1203, 0x000000, 0x4d1501, 0x4d1604, 0x4d1a01, 0x000000,
+ 0x000000, 0x4d1b01, 0x000000, 0x4d1c05, 0x000000, 0x000000, 0x000000, 0x4d2101,
+ 0x000000, 0x000000, 0x4d2218, 0x000000, 0x4d3a01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x4d3b03, 0x4d3e03, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x4d4101, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x4d4201, 0x000000, 0x000000, 0x4d430a, 0x4d4d01,
+ 0x000000, 0x4d4e01, 0x000000, 0x000000, 0x4d4f01, 0x000000, 0x000000, 0x000000,
+ 0x4d5003, 0x000000, 0x000000, 0x4d5301, 0x4d5402, 0x000000, 0x000000, 0x000000,
+ 0x4d5602, 0x000000, 0x000000, 0x000000, 0x4d5802, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x4d5a01, 0x000000, 0x4d5b01, 0x000000, 0x4d5c02, 0x000000, 0x000000,
+ 0x4d5e01, 0x000000, 0x000000, 0x000000, 0x4d5f01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x4d6007, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x4d6705, 0x000000, 0x4d6c01,
+ 0x000000, 0x4d6d08, 0x4d7501, 0x4d7602, 0x000000, 0x000000, 0x000000, 0x4d7805,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x4d7d01, 0x000000, 0x000000, 0x000000, 0x000000, 0x4d7e04,
+ 0x000000, 0x000000, 0x4d8202, 0x000000, 0x000000, 0x000000, 0x000000, 0x4d8402,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x4d8601, 0x000000, 0x000000, 0x4d8701,
+ 0x000000, 0x4d8802, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x4d8a03, 0x000000, 0x000000, 0x000000, 0x4d8d0a, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x4d9701,
+ 0x000000, 0x4d9801, 0x000000, 0x4d9902, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x4d9b02, 0x000000, 0x000000, 0x4d9d01, 0x000000,
+ 0x000000, 0x4d9e01, 0x000000, 0x000000, 0x4d9f01, 0x4da002, 0x4da205, 0x000000,
+ 0x4da702, 0x4da902, 0x4dab01, 0x000000, 0x000000, 0x4dac01, 0x4dad02, 0x4daf02,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x4db102, 0x4db301, 0x4db401, 0x000000,
+ 0x000000, 0x4db501, 0x000000, 0x000000, 0x000000, 0x4db601, 0x000000, 0x4db706,
+ 0x4dbd01, 0x000000, 0x000000, 0x4dbe02, 0x000000, 0x000000, 0x4dc001, 0x000000,
+ 0x000000, 0x000000, 0x4dc102, 0x000000, 0x4dc301, 0x000000, 0x4dc402, 0x4dc602,
+ 0x000000, 0x000000, 0x000000, 0x4dc807, 0x4dcf12, 0x000000, 0x4de101, 0x4de201,
+ 0x4de302, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x4de501, 0x000000, 0x4de602, 0x000000, 0x4de806, 0x000000, 0x000000, 0x000000,
+ 0x4dee01, 0x4def02, 0x4df106, 0x4df705, 0x000000, 0x4dfc06, 0x000000, 0x4e0204,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x4e0601, 0x000000, 0x4e070e,
+ 0x000000, 0x4e1501, 0x000000, 0x000000, 0x4e1602, 0x000000, 0x4e1802, 0x000000,
+ 0x4e1a03, 0x000000, 0x000000, 0x000000, 0x4e1d01, 0x4e1e02, 0x4e2002, 0x000000,
+ 0x4e2202, 0x4e2406, 0x000000, 0x4e2a01, 0x4e2b02, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x4e2d06, 0x000000, 0x4e3301, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x4e3402, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x4e3601, 0x4e3701, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x4e3802,
+ 0x000000, 0x000000, 0x4e3a02, 0x000000, 0x000000, 0x4e3c03, 0x000000, 0x000000,
+ 0x4e3f0c, 0x000000, 0x000000, 0x000000, 0x000000, 0x4e4b01, 0x4e4c03, 0x000000,
+ 0x4e4f01, 0x4e5001, 0x000000, 0x000000, 0x4e5102, 0x000000, 0x4e5302, 0x000000,
+ 0x000000, 0x4e5503, 0x4e5802, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x4e5a02, 0x000000, 0x000000, 0x4e5c01,
+ 0x000000, 0x4e5d02, 0x000000, 0x4e5f02, 0x000000, 0x000000, 0x4e6101, 0x000000,
+ 0x000000, 0x4e6202, 0x000000, 0x000000, 0x000000, 0x000000, 0x4e6401, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x4e6501, 0x4e6601, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x4e6701, 0x000000, 0x000000, 0x4e6801, 0x4e6901, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x4e6a03, 0x000000, 0x4e6d02, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x4e6f01, 0x000000, 0x4e700e, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x4e7e03, 0x000000, 0x4e8109, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x4e8a05, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x4e8f01,
+ 0x000000, 0x000000, 0x000000, 0x4e9001, 0x4e9101, 0x000000, 0x000000, 0x000000,
+ 0x4e9208, 0x4e9a01, 0x4e9b07, 0x000000, 0x000000, 0x000000, 0x4ea202, 0x4ea401,
+ 0x4ea502, 0x000000, 0x000000, 0x000000, 0x000000, 0x4ea701, 0x000000, 0x000000,
+ 0x4ea801, 0x4ea90c, 0x4eb502, 0x000000, 0x4eb701, 0x000000, 0x000000, 0x000000,
+ 0x4eb801, 0x000000, 0x000000, 0x4eb904, 0x000000, 0x000000, 0x000000, 0x4ebd05,
+ 0x000000, 0x4ec201, 0x000000, 0x000000, 0x4ec302, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x4ec502, 0x000000, 0x4ec702, 0x000000,
+ 0x4ec905, 0x000000, 0x4ece03, 0x000000, 0x000000, 0x4ed12d, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x4efe01, 0x000000, 0x000000, 0x000000, 0x000000, 0x4eff02,
+ 0x000000, 0x4f0104, 0x000000, 0x000000, 0x4f0501, 0x000000, 0x4f0601, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x4f0701, 0x000000, 0x000000, 0x4f0801, 0x4f090a,
+ 0x000000, 0x4f1303, 0x000000, 0x4f1602, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x4f1801, 0x000000, 0x000000, 0x000000, 0x4f1901, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x4f1a02, 0x000000, 0x4f1c01, 0x000000, 0x4f1d02,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x4f1f08, 0x000000, 0x000000, 0x4f2702,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x4f290c, 0x000000, 0x000000, 0x000000,
+ 0x4f3501, 0x000000, 0x000000, 0x4f3603, 0x4f3901, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x4f3a01, 0x000000, 0x4f3b01, 0x000000, 0x4f3c02, 0x000000,
+ 0x4f3e03, 0x4f4102, 0x000000, 0x000000, 0x000000, 0x000000, 0x4f4301, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x4f4404, 0x4f4802, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x4f4a01, 0x000000, 0x4f4b03, 0x4f4e04, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x4f5201, 0x000000, 0x000000,
+ 0x4f5301, 0x000000, 0x4f5401, 0x000000, 0x4f5502, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x4f5702, 0x000000, 0x000000, 0x000000, 0x4f5901,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x4f5a01, 0x4f5b06, 0x000000, 0x4f6111,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x4f7203, 0x000000,
+ 0x000000, 0x000000, 0x4f750a, 0x000000, 0x000000, 0x000000, 0x000000, 0x4f7f0a,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x4f8903, 0x000000, 0x000000, 0x4f8c0a, 0x000000, 0x4f9602,
+ 0x4f9801, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x4f9901, 0x4f9a01, 0x000000, 0x4f9b01,
+ 0x000000, 0x000000, 0x4f9c01, 0x000000, 0x4f9d01, 0x000000, 0x4f9e05, 0x000000,
+ 0x4fa302, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x4fa502,
+ 0x4fa701, 0x4fa802, 0x000000, 0x000000, 0x4faa01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x4fab02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x4fad11, 0x4fbe02, 0x000000, 0x000000, 0x000000,
+ 0x4fc003, 0x000000, 0x000000, 0x4fc306, 0x000000, 0x000000, 0x4fc902, 0x4fcb03,
+ 0x000000, 0x4fce01, 0x000000, 0x000000, 0x4fcf01, 0x000000, 0x4fd001, 0x4fd101,
+ 0x4fd205, 0x000000, 0x000000, 0x000000, 0x000000, 0x4fd702, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x4fd901, 0x000000, 0x4fda03, 0x000000, 0x4fdd02,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x4fdf03, 0x000000, 0x4fe201, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x4fe301, 0x4fe401, 0x000000, 0x000000, 0x4fe503, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x4fe801, 0x000000, 0x4fe907, 0x000000, 0x000000,
+ 0x000000, 0x4ff004, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x4ff404,
+ 0x000000, 0x000000, 0x000000, 0x4ff803, 0x000000, 0x4ffb01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x4ffc08, 0x000000,
+ 0x000000, 0x500401, 0x000000, 0x000000, 0x500501, 0x000000, 0x000000, 0x500609,
+ 0x000000, 0x500f01, 0x000000, 0x501001, 0x000000, 0x000000, 0x501101, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x501201, 0x501301, 0x000000, 0x501413, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x502707, 0x502e02, 0x000000, 0x50300a, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x503a01, 0x000000, 0x000000, 0x503b03, 0x000000, 0x000000,
+ 0x000000, 0x503e03, 0x000000, 0x000000, 0x000000, 0x504102, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x50430f, 0x000000, 0x000000, 0x505201, 0x000000,
+ 0x000000, 0x505302, 0x000000, 0x505517, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x506c01, 0x000000, 0x000000, 0x000000, 0x000000, 0x506d03, 0x000000,
+ 0x000000, 0x507001, 0x507101, 0x000000, 0x000000, 0x000000, 0x000000, 0x507202,
+ 0x000000, 0x507401, 0x507514, 0x000000, 0x000000, 0x000000, 0x508902, 0x508b01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x508c06, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x509201, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x509301,
+ 0x000000, 0x000000, 0x000000, 0x509401, 0x000000, 0x509509, 0x000000, 0x000000,
+ 0x509e44, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x50e202, 0x000000,
+ 0x000000, 0x50e404, 0x000000, 0x000000, 0x000000, 0x50e801, 0x50e90a, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x50f301, 0x50f401, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x50f502, 0x50f701, 0x50f804, 0x000000, 0x50fc01, 0x000000,
+ 0x50fd01, 0x000000, 0x50fe01, 0x50ff01, 0x000000, 0x510007, 0x000000, 0x000000,
+ 0x510701, 0x000000, 0x510803, 0x000000, 0x510b01, 0x000000, 0x000000, 0x510c01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x510d04, 0x000000, 0x000000, 0x000000, 0x000000, 0x511107, 0x000000, 0x000000,
+ 0x000000, 0x511802, 0x000000, 0x000000, 0x511a03, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x511d01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x511e01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x511f01, 0x000000, 0x512008, 0x512808, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x513001, 0x000000, 0x000000, 0x000000, 0x513109, 0x513a06,
+ 0x514001, 0x000000, 0x514105, 0x000000, 0x514601, 0x000000, 0x000000, 0x514702,
+ 0x000000, 0x000000, 0x514901, 0x000000, 0x000000, 0x514a01, 0x000000, 0x514b01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x514c05, 0x000000, 0x000000,
+ 0x515102, 0x515301, 0x515401, 0x000000, 0x000000, 0x000000, 0x515501, 0x000000,
+ 0x515603, 0x000000, 0x000000, 0x000000, 0x515903, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x515c01, 0x515d01, 0x515e01, 0x000000,
+ 0x515f04, 0x516303, 0x000000, 0x000000, 0x516601, 0x000000, 0x000000, 0x516702,
+ 0x516901, 0x000000, 0x516a01, 0x000000, 0x516b0a, 0x000000, 0x517501, 0x000000,
+ 0x000000, 0x000000, 0x517601, 0x000000, 0x000000, 0x000000, 0x000000, 0x51770d,
+ 0x000000, 0x000000, 0x000000, 0x518402, 0x000000, 0x000000, 0x518602, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x518803, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x518b04, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x518f02, 0x000000, 0x000000, 0x519101, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x519201, 0x519306, 0x000000, 0x000000, 0x519901, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x519a0e, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x51a801, 0x000000,
+ 0x51a904, 0x51ad02, 0x000000, 0x000000, 0x51af03, 0x51b201, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x51b301, 0x000000, 0x51b402, 0x000000, 0x51b601,
+ 0x51b702, 0x51b905, 0x000000, 0x51be01, 0x000000, 0x51bf01, 0x51c001, 0x51c105,
+ 0x000000, 0x000000, 0x51c604, 0x000000, 0x000000, 0x51ca02, 0x000000, 0x000000,
+ 0x51cc02, 0x000000, 0x000000, 0x000000, 0x51ce03, 0x000000, 0x000000, 0x000000,
+ 0x51d101, 0x51d203, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x51d504,
+ 0x000000, 0x51d901, 0x000000, 0x000000, 0x51da09, 0x51e303, 0x000000, 0x000000,
+ 0x51e606, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x51ec02, 0x51ee09,
+ 0x000000, 0x000000, 0x000000, 0x51f703, 0x000000, 0x51fa01, 0x51fb01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x51fc06, 0x000000, 0x000000, 0x000000,
+ 0x520203, 0x000000, 0x520501, 0x000000, 0x520601, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x520701, 0x520807, 0x000000, 0x000000, 0x000000, 0x000000, 0x520f02,
+ 0x000000, 0x521106, 0x000000, 0x521701, 0x000000, 0x000000, 0x000000, 0x521801,
+ 0x521903, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x521c05, 0x522101,
+ 0x522201, 0x522301, 0x000000, 0x000000, 0x522401, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x522501, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x522601, 0x522705, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x522c01,
+ 0x000000, 0x000000, 0x522d01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x522e02, 0x000000, 0x523005, 0x000000,
+ 0x523501, 0x523602, 0x000000, 0x000000, 0x000000, 0x523804, 0x523c04, 0x000000,
+ 0x000000, 0x524007, 0x524701, 0x524801, 0x000000, 0x000000, 0x524901, 0x524a02,
+ 0x000000, 0x000000, 0x000000, 0x524c02, 0x000000, 0x000000, 0x000000, 0x524e01,
+ 0x524f01, 0x000000, 0x000000, 0x525001, 0x000000, 0x525104, 0x000000, 0x000000,
+ 0x525501, 0x000000, 0x000000, 0x000000, 0x000000, 0x525601, 0x000000, 0x000000,
+ 0x525701, 0x525805, 0x000000, 0x000000, 0x525d01, 0x525e02, 0x000000, 0x526002,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x526202,
+ 0x000000, 0x526401, 0x000000, 0x526501, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x526601, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x526702, 0x000000, 0x526901, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x526a01, 0x000000, 0x000000, 0x526b01,
+ 0x526c01, 0x526d01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x526e01,
+ 0x000000, 0x526f01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x527003,
+ 0x527301, 0x527403, 0x000000, 0x000000, 0x527701, 0x527802, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x527a07, 0x528101, 0x528202, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x528404, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x528802, 0x528a03, 0x000000,
+ 0x000000, 0x528d03, 0x000000, 0x000000, 0x000000, 0x529005, 0x529501, 0x000000,
+ 0x529601, 0x000000, 0x000000, 0x529701, 0x000000, 0x529801, 0x529906, 0x000000,
+ 0x529f02, 0x52a101, 0x52a201, 0x52a304, 0x000000, 0x000000, 0x000000, 0x52a701,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x52a803, 0x000000,
+ 0x52ab02, 0x000000, 0x52ad04, 0x000000, 0x000000, 0x000000, 0x000000, 0x52b101,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x52b201, 0x000000, 0x000000, 0x52b302,
+ 0x000000, 0x52b501, 0x000000, 0x52b601, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x52b703, 0x52ba09, 0x52c301, 0x000000, 0x000000, 0x000000, 0x52c401,
+ 0x000000, 0x000000, 0x52c502, 0x000000, 0x000000, 0x000000, 0x52c701, 0x000000,
+ 0x000000, 0x52c805, 0x000000, 0x000000, 0x000000, 0x52cd0e, 0x000000, 0x52db01,
+ 0x000000, 0x000000, 0x52dc02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x52de01, 0x52df07, 0x000000, 0x000000, 0x52e602, 0x52e801, 0x000000,
+ 0x52e901, 0x000000, 0x000000, 0x000000, 0x000000, 0x52ea01, 0x52eb01, 0x000000,
+ 0x000000, 0x52ec01, 0x000000, 0x000000, 0x000000, 0x000000, 0x52ed06, 0x52f301,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x52f401, 0x000000, 0x000000,
+ 0x52f501, 0x52f611, 0x000000, 0x000000, 0x000000, 0x000000, 0x530701, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x530802, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x530a04, 0x000000, 0x000000, 0x000000,
+ 0x530e09, 0x000000, 0x531702, 0x000000, 0x531908, 0x000000, 0x532101, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x53220b,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x532d03, 0x000000, 0x000000, 0x533001, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x533101, 0x000000, 0x000000, 0x000000, 0x533201, 0x000000, 0x533302, 0x53350e,
+ 0x000000, 0x534302, 0x000000, 0x534504, 0x534901, 0x534a01, 0x000000, 0x534b02,
+ 0x000000, 0x534d01, 0x000000, 0x000000, 0x000000, 0x534e01, 0x534f18, 0x000000,
+ 0x000000, 0x000000, 0x536702, 0x000000, 0x000000, 0x536907, 0x537001, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x537101, 0x000000, 0x000000, 0x000000,
+ 0x537203, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x537501, 0x000000, 0x000000, 0x537605, 0x537b02, 0x537d01,
+ 0x000000, 0x000000, 0x000000, 0x537e02, 0x538001, 0x000000, 0x538102, 0x000000,
+ 0x000000, 0x000000, 0x538301, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x538401, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x538501, 0x000000, 0x538601, 0x000000,
+ 0x000000, 0x538701, 0x000000, 0x000000, 0x538804, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x538c01, 0x538d07, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x539401, 0x539501, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x539601, 0x000000, 0x539702, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x539901, 0x000000, 0x000000, 0x000000, 0x539a01,
+ 0x539b01, 0x000000, 0x539c01, 0x539d01, 0x000000, 0x000000, 0x000000, 0x539e01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x539f01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x53a00c, 0x000000, 0x53ac01, 0x000000, 0x53ad03, 0x000000, 0x000000,
+ 0x000000, 0x53b003, 0x53b301, 0x000000, 0x000000, 0x000000, 0x000000, 0x53b404,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x53b801, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x53b909, 0x000000, 0x53c201, 0x000000, 0x53c305, 0x53c803, 0x000000, 0x53cb01,
+ 0x000000, 0x53cc01, 0x53cd03, 0x000000, 0x000000, 0x000000, 0x53d001, 0x000000,
+ 0x000000, 0x53d102, 0x000000, 0x000000, 0x000000, 0x53d301, 0x53d403, 0x000000,
+ 0x000000, 0x53d709, 0x000000, 0x000000, 0x000000, 0x53e005, 0x53e501, 0x000000,
+ 0x000000, 0x53e602, 0x000000, 0x000000, 0x53e802, 0x53ea01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x53eb01, 0x000000,
+ 0x000000, 0x53ec01, 0x53ed02, 0x000000, 0x000000, 0x53ef23, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x541202, 0x000000, 0x000000, 0x541401,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x541503,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x541801, 0x541901,
+ 0x000000, 0x000000, 0x541a02, 0x000000, 0x000000, 0x541c06, 0x000000, 0x000000,
+ 0x542219, 0x543b03, 0x000000, 0x543e08, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x544602, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x54480e, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x54560d,
+ 0x000000, 0x000000, 0x546301, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x546401, 0x000000, 0x54650b, 0x000000,
+ 0x000000, 0x547001, 0x547101, 0x547201, 0x547303, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x547608, 0x000000, 0x000000, 0x000000, 0x000000, 0x547e04,
+ 0x000000, 0x548204, 0x000000, 0x000000, 0x000000, 0x000000, 0x548607, 0x548d07,
+ 0x549409, 0x549d01, 0x000000, 0x000000, 0x549e01, 0x549f02, 0x000000, 0x54a101,
+ 0x000000, 0x000000, 0x54a203, 0x000000, 0x54a502, 0x54a701, 0x54a801, 0x000000,
+ 0x54a909, 0x54b201, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x54b30a,
+ 0x000000, 0x54bd01, 0x000000, 0x000000, 0x000000, 0x000000, 0x54be05, 0x54c303,
+ 0x000000, 0x54c601, 0x000000, 0x54c705, 0x000000, 0x000000, 0x54cc01, 0x000000,
+ 0x000000, 0x000000, 0x54cd01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x54ce01, 0x000000, 0x000000, 0x000000, 0x54cf05,
+ 0x000000, 0x54d40d, 0x000000, 0x54e101, 0x000000, 0x000000, 0x000000, 0x54e202,
+ 0x54e404, 0x000000, 0x000000, 0x000000, 0x000000, 0x54e804, 0x54ec01, 0x54ed05,
+ 0x000000, 0x54f202, 0x000000, 0x000000, 0x000000, 0x54f401, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x54f502, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x54f701, 0x000000, 0x000000, 0x000000, 0x000000, 0x54f802, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x54fa01, 0x54fb01, 0x000000,
+ 0x54fc03, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x54ff03,
+ 0x000000, 0x000000, 0x550201, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x550302, 0x000000, 0x000000, 0x550501,
+ 0x000000, 0x000000, 0x550606, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x550c01, 0x000000, 0x550d01, 0x000000,
+ 0x000000, 0x550e01, 0x000000, 0x000000, 0x000000, 0x000000, 0x550f01, 0x000000,
+ 0x000000, 0x551003, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x551307, 0x551a01, 0x551b03, 0x551e06, 0x000000,
+ 0x000000, 0x000000, 0x552408, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x552c01, 0x000000, 0x000000, 0x000000, 0x000000, 0x552d01, 0x000000, 0x552e02,
+ 0x553001, 0x000000, 0x553101, 0x553206, 0x000000, 0x553802, 0x553a01, 0x553b03,
+ 0x000000, 0x553e01, 0x000000, 0x553f01, 0x000000, 0x000000, 0x554001, 0x000000,
+ 0x000000, 0x554106, 0x554701, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x55480f, 0x555701, 0x555812, 0x000000, 0x000000, 0x556a03, 0x556d01, 0x556e02,
+ 0x557001, 0x000000, 0x000000, 0x000000, 0x557101, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x557203, 0x000000,
+ 0x557501, 0x000000, 0x000000, 0x000000, 0x557602, 0x000000, 0x557805, 0x557d01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x557e01, 0x000000, 0x000000, 0x557f06,
+ 0x558501, 0x558602, 0x558804, 0x000000, 0x558c03, 0x000000, 0x558f02, 0x000000,
+ 0x000000, 0x559103, 0x000000, 0x000000, 0x000000, 0x559401, 0x559501, 0x559601,
+ 0x000000, 0x000000, 0x559701, 0x000000, 0x000000, 0x559801, 0x559901, 0x559a04,
+ 0x000000, 0x559e02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x55a001, 0x000000, 0x000000, 0x55a10b, 0x55ac06, 0x55b205, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x55b701, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x55b802, 0x000000, 0x55ba02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x55bc01, 0x000000, 0x000000,
+ 0x000000, 0x55bd01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x55be01,
+ 0x000000, 0x55bf02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x55c103, 0x55c401, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x55c501, 0x000000, 0x55c603, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x55c901, 0x55ca01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x55cb01, 0x55cc04, 0x000000, 0x000000,
+ 0x55d001, 0x55d104, 0x000000, 0x000000, 0x000000, 0x55d506, 0x000000, 0x000000,
+ 0x55db01, 0x55dc01, 0x000000, 0x55dd03, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x55e003, 0x000000, 0x55e304, 0x000000, 0x55e707, 0x000000, 0x55ee02,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x55f001, 0x000000,
+ 0x55f101, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x55f201,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x55f304, 0x000000, 0x000000,
+ 0x000000, 0x55f701, 0x000000, 0x55f806, 0x55fe01, 0x000000, 0x000000, 0x55ff01,
+ 0x000000, 0x000000, 0x000000, 0x560002, 0x560201, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x560301, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x560410, 0x561402, 0x000000, 0x561601, 0x000000, 0x000000, 0x000000,
+ 0x561708, 0x000000, 0x000000, 0x000000, 0x561f01, 0x562004, 0x000000, 0x000000,
+ 0x562402, 0x562601, 0x562703, 0x562a01, 0x000000, 0x000000, 0x562b01, 0x562c03,
+ 0x000000, 0x000000, 0x562f02, 0x000000, 0x000000, 0x000000, 0x000000, 0x563107,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x563801,
+ 0x000000, 0x000000, 0x000000, 0x563901, 0x563a01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x563b01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x563c07, 0x56430f, 0x565205, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x565703, 0x000000, 0x000000, 0x565a01, 0x000000,
+ 0x565b01, 0x000000, 0x565c01, 0x000000, 0x565d01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x565e08, 0x566601, 0x000000, 0x566702,
+ 0x566903, 0x000000, 0x000000, 0x000000, 0x000000, 0x566c03, 0x000000, 0x000000,
+ 0x000000, 0x566f01, 0x56700c, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x567c01, 0x000000, 0x000000, 0x000000, 0x567d02, 0x000000, 0x000000,
+ 0x567f02, 0x568102, 0x000000, 0x568301, 0x568402, 0x568603, 0x568908, 0x000000,
+ 0x000000, 0x000000, 0x569102, 0x000000, 0x000000, 0x000000, 0x000000, 0x56930d,
+ 0x56a002, 0x000000, 0x000000, 0x000000, 0x000000, 0x56a203, 0x000000, 0x56a501,
+ 0x56a601, 0x000000, 0x000000, 0x56a704, 0x56ab02, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x56ad04, 0x000000, 0x56b107,
+ 0x56b807, 0x000000, 0x000000, 0x56bf01, 0x000000, 0x56c003, 0x000000, 0x56c303,
+ 0x000000, 0x000000, 0x56c608, 0x000000, 0x56ce08, 0x56d601, 0x000000, 0x000000,
+ 0x56d702, 0x000000, 0x56d901, 0x000000, 0x000000, 0x56da01, 0x56db01, 0x000000,
+ 0x56dc03, 0x000000, 0x56df01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x56e001, 0x000000, 0x000000, 0x000000, 0x56e104, 0x56e501, 0x56e60c, 0x000000,
+ 0x000000, 0x000000, 0x56f209, 0x56fb01, 0x000000, 0x56fc01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x56fd01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x56fe01, 0x000000, 0x56ff05, 0x000000, 0x570401, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x570502, 0x570703, 0x570a03, 0x570d01,
+ 0x000000, 0x000000, 0x570e02, 0x571001, 0x000000, 0x000000, 0x571103, 0x000000,
+ 0x571402, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x571606, 0x000000, 0x571c01, 0x571d03, 0x000000,
+ 0x000000, 0x000000, 0x572003, 0x000000, 0x572307, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x572a02,
+ 0x000000, 0x000000, 0x000000, 0x572c11, 0x000000, 0x573d01, 0x000000, 0x000000,
+ 0x000000, 0x573e01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x573f02,
+ 0x000000, 0x574106, 0x574703, 0x000000, 0x574a02, 0x574c01, 0x000000, 0x574d07,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x575401,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x575501, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x575601, 0x575701, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x575805, 0x575d03, 0x000000, 0x000000, 0x576001, 0x000000,
+ 0x576103, 0x576402, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x576602,
+ 0x000000, 0x576801, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x576903,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x576c01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x576d01, 0x000000, 0x576e08, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x577601, 0x000000, 0x000000,
+ 0x577703, 0x577a01, 0x577b06, 0x578103, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x578401, 0x000000, 0x000000, 0x578502, 0x000000, 0x000000, 0x578701,
+ 0x000000, 0x000000, 0x578801, 0x57890e, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x579702, 0x000000, 0x000000, 0x000000, 0x000000, 0x579901,
+ 0x000000, 0x000000, 0x000000, 0x579a01, 0x000000, 0x579b04, 0x000000, 0x579f03,
+ 0x000000, 0x57a207, 0x57a901, 0x57aa01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x57ab02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x57ad08, 0x000000,
+ 0x57b501, 0x000000, 0x57b60a, 0x000000, 0x000000, 0x000000, 0x57c005, 0x000000,
+ 0x57c501, 0x000000, 0x57c601, 0x000000, 0x000000, 0x000000, 0x000000, 0x57c701,
+ 0x57c80e, 0x000000, 0x57d601, 0x000000, 0x000000, 0x000000, 0x57d701, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x57d80a, 0x000000, 0x000000, 0x57e20f, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x57f101, 0x000000, 0x000000,
+ 0x57f201, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x57f301, 0x000000, 0x000000, 0x000000, 0x57f403, 0x57f70e, 0x000000, 0x000000,
+ 0x000000, 0x580501, 0x000000, 0x000000, 0x580601, 0x000000, 0x000000, 0x580704,
+ 0x000000, 0x580b0d, 0x581802, 0x000000, 0x581a06, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x582001, 0x000000, 0x000000, 0x582104, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x582501, 0x000000, 0x000000, 0x000000, 0x000000, 0x582601, 0x582707, 0x000000,
+ 0x000000, 0x582e04, 0x000000, 0x583203, 0x000000, 0x583501, 0x583602, 0x583801,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x583901, 0x000000, 0x000000,
+ 0x583a03, 0x000000, 0x000000, 0x583d01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x583e01, 0x000000, 0x583f01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x584009, 0x000000, 0x584902, 0x000000, 0x000000, 0x584b05, 0x000000,
+ 0x000000, 0x585009, 0x000000, 0x000000, 0x585901, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x585a05, 0x000000, 0x585f01, 0x58600d, 0x000000,
+ 0x000000, 0x586d01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x586e01,
+ 0x000000, 0x000000, 0x586f04, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x587301, 0x000000, 0x587402, 0x587605, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x587b01, 0x587c01, 0x000000, 0x000000, 0x000000, 0x587d01,
+ 0x000000, 0x587e01, 0x000000, 0x000000, 0x000000, 0x587f11, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x589002, 0x589201, 0x589302, 0x000000, 0x000000, 0x589501, 0x58960c, 0x000000,
+ 0x58a202, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x58a403, 0x000000, 0x000000, 0x58a703, 0x000000, 0x58aa08, 0x58b201, 0x58b30a,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x58bd01, 0x000000, 0x58be04, 0x000000, 0x000000, 0x000000, 0x000000, 0x58c201,
+ 0x000000, 0x000000, 0x000000, 0x58c301, 0x58c401, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x58c502, 0x58c701, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x58c802, 0x000000, 0x000000,
+ 0x58ca01, 0x000000, 0x000000, 0x000000, 0x000000, 0x58cb03, 0x58ce01, 0x58cf03,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x58d20a, 0x000000, 0x58dc02, 0x000000,
+ 0x000000, 0x58de07, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x58e502, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x58e704, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x58eb01, 0x58ec01, 0x58ed02, 0x000000, 0x58ef01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x58f001, 0x58f101, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x58f201, 0x000000, 0x000000, 0x58f303, 0x58f601,
+ 0x000000, 0x58f701, 0x58f803, 0x58fb02, 0x000000, 0x000000, 0x58fd02, 0x58ff03,
+ 0x000000, 0x590202, 0x000000, 0x590407, 0x590b02, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x590d04, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x591101, 0x000000, 0x591201, 0x591301, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x591405,
+ 0x000000, 0x000000, 0x591901, 0x591a03, 0x591d02, 0x591f09, 0x000000, 0x592801,
+ 0x592905, 0x000000, 0x592e02, 0x593001, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x593102, 0x000000, 0x593302,
+ 0x593501, 0x000000, 0x593601, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x593707, 0x000000, 0x593e09, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x594701, 0x594801, 0x000000, 0x594901, 0x594a03, 0x000000, 0x000000, 0x594d02,
+ 0x000000, 0x000000, 0x594f01, 0x000000, 0x000000, 0x000000, 0x000000, 0x595001,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x595101, 0x000000, 0x595201, 0x595301, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x595402, 0x000000, 0x595601, 0x000000, 0x595701,
+ 0x000000, 0x595808, 0x596001, 0x596102, 0x596301, 0x596401, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x596501, 0x596607, 0x000000,
+ 0x596d01, 0x000000, 0x596e05, 0x000000, 0x000000, 0x000000, 0x597301, 0x000000,
+ 0x597403, 0x000000, 0x000000, 0x000000, 0x000000, 0x597701, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x597802, 0x597a08, 0x000000, 0x000000, 0x000000, 0x598202,
+ 0x598401, 0x000000, 0x000000, 0x598502, 0x000000, 0x000000, 0x000000, 0x598709,
+ 0x000000, 0x000000, 0x000000, 0x599001, 0x59910b, 0x000000, 0x000000, 0x000000,
+ 0x599c01, 0x599d01, 0x000000, 0x000000, 0x000000, 0x599e01, 0x000000, 0x000000,
+ 0x000000, 0x599f02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x59a101, 0x000000, 0x59a207, 0x000000, 0x000000, 0x59a902, 0x000000,
+ 0x59ab06, 0x000000, 0x000000, 0x59b101, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x59b201, 0x000000, 0x000000, 0x59b301, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x59b403, 0x000000,
+ 0x59b701, 0x000000, 0x000000, 0x000000, 0x59b801, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x59b901, 0x000000, 0x59ba07, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x59c101, 0x000000, 0x000000, 0x59c208, 0x000000, 0x59ca02,
+ 0x000000, 0x000000, 0x59cc01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x59cd0f, 0x000000, 0x59dc01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x59dd01, 0x59de01, 0x59df0f, 0x000000, 0x000000,
+ 0x59ee01, 0x59ef05, 0x59f401, 0x000000, 0x000000, 0x000000, 0x000000, 0x59f502,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x59f703, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x59fa03, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x59fd0a, 0x000000, 0x000000, 0x000000, 0x5a0701, 0x000000, 0x5a0803, 0x5a0b01,
+ 0x5a0c07, 0x5a1301, 0x5a1402, 0x000000, 0x5a1604, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x5a1a01, 0x5a1b01, 0x000000, 0x000000, 0x000000, 0x5a1c04, 0x5a2036,
+ 0x000000, 0x000000, 0x000000, 0x5a5601, 0x000000, 0x5a5701, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x5a5809, 0x000000, 0x5a6103, 0x5a6408, 0x000000,
+ 0x5a6c01, 0x000000, 0x000000, 0x5a6d02, 0x000000, 0x000000, 0x000000, 0x5a6f02,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x5a7103, 0x000000, 0x000000, 0x000000, 0x000000, 0x5a7402, 0x5a7601, 0x5a7714,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x5a8b01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x5a8c07, 0x000000, 0x000000, 0x5a9301, 0x000000, 0x5a9406, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x5a9a01, 0x000000, 0x000000, 0x5a9b03, 0x5a9e03,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x5aa102, 0x000000, 0x5aa303, 0x000000, 0x5aa602, 0x000000, 0x5aa801,
+ 0x5aa911, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x5aba02,
+ 0x5abc01, 0x000000, 0x000000, 0x5abd04, 0x5ac104, 0x5ac507, 0x000000, 0x000000,
+ 0x000000, 0x5acc01, 0x5acd02, 0x5acf01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x5ad005, 0x5ad50b, 0x000000, 0x000000, 0x000000, 0x5ae003, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x5ae308, 0x000000, 0x5aeb01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x5aec14, 0x000000, 0x5b0001, 0x000000,
+ 0x5b0101, 0x000000, 0x000000, 0x000000, 0x000000, 0x5b0203, 0x000000, 0x5b0501,
+ 0x000000, 0x000000, 0x5b0609, 0x5b0f02, 0x000000, 0x000000, 0x5b1106, 0x000000,
+ 0x5b1704, 0x000000, 0x000000, 0x000000, 0x000000, 0x5b1b01, 0x000000, 0x5b1c03,
+ 0x000000, 0x5b1f06, 0x000000, 0x5b2503, 0x000000, 0x000000, 0x000000, 0x5b2806,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x5b2e01, 0x5b2f02, 0x5b3102, 0x000000,
+ 0x5b3305, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x5b3802, 0x000000, 0x000000, 0x000000, 0x000000, 0x5b3a01, 0x000000,
+ 0x5b3b02, 0x5b3d01, 0x000000, 0x000000, 0x000000, 0x5b3e01, 0x5b3f01, 0x000000,
+ 0x5b4006, 0x000000, 0x5b4602, 0x000000, 0x5b4804, 0x000000, 0x000000, 0x5b4c05,
+ 0x000000, 0x5b5101, 0x5b5203, 0x000000, 0x5b5501, 0x5b5604, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x5b5a01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x5b5b02, 0x5b5d03, 0x000000, 0x000000, 0x5b6005,
+ 0x5b6501, 0x000000, 0x000000, 0x000000, 0x5b6601, 0x000000, 0x000000, 0x000000,
+ 0x5b6701, 0x000000, 0x000000, 0x000000, 0x000000, 0x5b680e, 0x000000, 0x000000,
+ 0x000000, 0x5b7601, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x5b7706, 0x000000, 0x5b7d15, 0x000000, 0x5b9201, 0x5b9304,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x5b9706, 0x000000, 0x5b9d02, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x5b9f02, 0x000000, 0x000000,
+ 0x5ba106, 0x5ba701, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x5ba805, 0x000000, 0x000000, 0x000000, 0x5bad01, 0x5bae01, 0x000000, 0x000000,
+ 0x5baf01, 0x000000, 0x000000, 0x000000, 0x5bb017, 0x5bc701, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x5bc802, 0x000000,
+ 0x5bca03, 0x000000, 0x000000, 0x5bcd01, 0x000000, 0x000000, 0x5bce0a, 0x000000,
+ 0x000000, 0x5bd802, 0x000000, 0x000000, 0x5bda02, 0x000000, 0x000000, 0x000000,
+ 0x5bdc01, 0x000000, 0x000000, 0x000000, 0x000000, 0x5bdd01, 0x5bde02, 0x5be003,
+ 0x5be301, 0x000000, 0x5be403, 0x5be70b, 0x5bf202, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x5bf403, 0x000000, 0x000000, 0x5bf70c, 0x000000, 0x000000,
+ 0x5c0301, 0x000000, 0x000000, 0x5c0402, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x5c0601, 0x000000, 0x5c0701, 0x000000, 0x000000, 0x5c0805, 0x000000,
+ 0x000000, 0x5c0d02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x5c0f01,
+ 0x5c1001, 0x5c1101, 0x000000, 0x000000, 0x000000, 0x000000, 0x5c1203, 0x000000,
+ 0x5c1501, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x5c1604, 0x000000, 0x5c1a02, 0x000000,
+ 0x000000, 0x5c1c06, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x5c2209, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x5c2b02, 0x5c2d04, 0x000000, 0x000000, 0x000000, 0x000000, 0x5c3104, 0x5c3501,
+ 0x000000, 0x000000, 0x5c3601, 0x000000, 0x5c3706, 0x000000, 0x000000, 0x000000,
+ 0x5c3d02, 0x5c3f02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x5c4101,
+ 0x000000, 0x000000, 0x5c4202, 0x000000, 0x000000, 0x000000, 0x000000, 0x5c4405,
+ 0x5c4901, 0x000000, 0x5c4a02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x5c4c01, 0x000000, 0x5c4d04, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x5c5102, 0x000000, 0x5c5302, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x5c5502, 0x000000, 0x000000, 0x000000, 0x000000, 0x5c571b,
+ 0x5c7202, 0x000000, 0x5c740c, 0x000000, 0x000000, 0x000000, 0x5c8001, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x5c8101, 0x000000,
+ 0x5c8201, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x5c8301, 0x000000,
+ 0x000000, 0x000000, 0x5c8404, 0x5c8804, 0x000000, 0x5c8c01, 0x5c8d06, 0x5c9302,
+ 0x000000, 0x5c9507, 0x000000, 0x5c9c03, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x5c9f02, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x5ca101, 0x000000, 0x000000, 0x5ca203, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x5ca502, 0x000000, 0x000000, 0x5ca702, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x5ca904, 0x000000, 0x000000, 0x000000, 0x5cad03, 0x5cb00c, 0x000000,
+ 0x5cbc05, 0x5cc102, 0x000000, 0x5cc301, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x5cc401, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x5cc501, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x5cc602, 0x000000, 0x5cc804, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x5ccc08, 0x5cd405, 0x000000, 0x000000, 0x000000, 0x5cd901,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x5cda01,
+ 0x000000, 0x5cdb09, 0x5ce40f, 0x000000, 0x000000, 0x5cf302, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x5cf501, 0x000000, 0x5cf603, 0x000000, 0x000000, 0x000000,
+ 0x5cf904, 0x000000, 0x000000, 0x5cfd01, 0x000000, 0x5cfe01, 0x000000, 0x000000,
+ 0x5cff01, 0x000000, 0x5d000a, 0x000000, 0x5d0a02, 0x000000, 0x000000, 0x000000,
+ 0x5d0c06, 0x000000, 0x5d1202, 0x000000, 0x000000, 0x000000, 0x5d1401, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x5d1502, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x5d1701, 0x5d1801, 0x5d1901,
+ 0x5d1a02, 0x000000, 0x000000, 0x000000, 0x000000, 0x5d1c01, 0x5d1d08, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x5d2501, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x5d2620, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x5d4602, 0x5d4801, 0x000000, 0x000000, 0x5d4901, 0x5d4a0c, 0x5d5604,
+ 0x000000, 0x5d5a02, 0x000000, 0x000000, 0x000000, 0x000000, 0x5d5c01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x5d5d01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x5d5e02, 0x5d6001, 0x000000, 0x5d6101, 0x000000,
+ 0x5d620b, 0x5d6d01, 0x5d6e01, 0x5d6f02, 0x000000, 0x5d7102, 0x000000, 0x5d7303,
+ 0x000000, 0x5d7607, 0x000000, 0x5d7d03, 0x000000, 0x5d8004, 0x5d8401, 0x000000,
+ 0x5d8504, 0x5d8909, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x5d9201,
+ 0x5d9302, 0x5d9501, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x5d9603, 0x000000, 0x5d9903, 0x5d9c01, 0x000000, 0x5d9d01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x5d9e01, 0x5d9f05, 0x000000, 0x000000, 0x5da401, 0x000000,
+ 0x000000, 0x5da501, 0x000000, 0x000000, 0x000000, 0x000000, 0x5da601, 0x000000,
+ 0x5da701, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x5da803, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x5dab04,
+ 0x000000, 0x000000, 0x5daf01, 0x000000, 0x5db002, 0x000000, 0x000000, 0x5db201,
+ 0x000000, 0x000000, 0x5db302, 0x5db501, 0x5db601, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x5db702, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x5db904, 0x000000, 0x000000, 0x000000,
+ 0x5dbd01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x5dbe04, 0x000000, 0x000000, 0x5dc201, 0x000000, 0x5dc302,
+ 0x000000, 0x5dc501, 0x000000, 0x000000, 0x000000, 0x5dc601, 0x000000, 0x000000,
+ 0x5dc701, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x5dc801, 0x000000, 0x000000, 0x5dc901, 0x000000, 0x000000, 0x5dca02, 0x000000,
+ 0x000000, 0x5dcc01, 0x5dcd01, 0x000000, 0x000000, 0x5dce01, 0x5dcf0b, 0x5dda01,
+ 0x000000, 0x5ddb01, 0x5ddc01, 0x000000, 0x5ddd03, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x5de001, 0x5de101, 0x000000, 0x5de201, 0x000000, 0x000000,
+ 0x5de308, 0x000000, 0x000000, 0x5deb04, 0x000000, 0x5def01, 0x5df00e, 0x5dfe04,
+ 0x5e0201, 0x000000, 0x5e0302, 0x5e0501, 0x000000, 0x000000, 0x5e0607, 0x5e0d09,
+ 0x5e1603, 0x000000, 0x5e1905, 0x000000, 0x000000, 0x000000, 0x5e1e03, 0x000000,
+ 0x5e2103, 0x5e2403, 0x5e2702, 0x5e2901, 0x000000, 0x5e2a01, 0x000000, 0x000000,
+ 0x000000, 0x5e2b02, 0x000000, 0x000000, 0x000000, 0x000000, 0x5e2d01, 0x5e2e02,
+ 0x000000, 0x5e3002, 0x000000, 0x000000, 0x5e3205, 0x5e3704, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x5e3b01, 0x000000, 0x5e3c01, 0x000000,
+ 0x5e3d01, 0x000000, 0x5e3e08, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x5e4601, 0x000000, 0x000000, 0x5e4701, 0x000000, 0x5e4805, 0x5e4d04, 0x000000,
+ 0x000000, 0x000000, 0x5e5101, 0x000000, 0x000000, 0x5e5202, 0x5e5405, 0x5e5909,
+ 0x000000, 0x5e6202, 0x000000, 0x000000, 0x000000, 0x5e6401, 0x5e6501, 0x5e6602,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x5e6801, 0x5e6905, 0x5e6e03, 0x000000, 0x000000, 0x000000,
+ 0x5e7101, 0x000000, 0x000000, 0x5e7202, 0x000000, 0x000000, 0x5e7403, 0x000000,
+ 0x5e770d, 0x5e8404, 0x000000, 0x5e8803, 0x5e8b02, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x5e8d06, 0x5e9308, 0x5e9b04, 0x000000, 0x000000,
+ 0x000000, 0x5e9f02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x5ea108, 0x000000, 0x5ea901, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x5eaa01, 0x000000, 0x5eab03,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x5eae01, 0x5eaf01, 0x5eb007,
+ 0x000000, 0x000000, 0x5eb701, 0x000000, 0x000000, 0x5eb802, 0x000000, 0x5eba02,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x5ebc0f, 0x000000,
+ 0x5ecb01, 0x000000, 0x000000, 0x000000, 0x5ecc02, 0x000000, 0x5ece01, 0x5ecf01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x5ed001, 0x000000, 0x000000, 0x5ed105,
+ 0x000000, 0x000000, 0x5ed601, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x5ed70d, 0x000000, 0x5ee401, 0x5ee502, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x5ee71b, 0x000000, 0x000000, 0x5f0206,
+ 0x000000, 0x000000, 0x000000, 0x5f0801, 0x5f0901, 0x5f0a08, 0x5f120c, 0x000000,
+ 0x5f1e12, 0x000000, 0x000000, 0x5f3001, 0x5f3101, 0x000000, 0x000000, 0x000000,
+ 0x5f3201, 0x000000, 0x000000, 0x000000, 0x000000, 0x5f3301, 0x5f3401, 0x5f3504,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x5f3901, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x5f3a02, 0x000000, 0x5f3c02, 0x000000, 0x5f3e06, 0x5f4401,
+ 0x000000, 0x5f4504, 0x000000, 0x000000, 0x5f4901, 0x5f4a05, 0x5f4f01, 0x000000,
+ 0x000000, 0x000000, 0x5f5001, 0x5f5104, 0x000000, 0x5f5505, 0x000000, 0x000000,
+ 0x000000, 0x5f5a04, 0x000000, 0x000000, 0x000000, 0x5f5e01, 0x000000, 0x5f5f01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x5f6002, 0x000000, 0x5f6203,
+ 0x000000, 0x5f6501, 0x000000, 0x5f6605, 0x5f6b07, 0x000000, 0x5f7204, 0x000000,
+ 0x000000, 0x000000, 0x5f7601, 0x000000, 0x000000, 0x000000, 0x5f7702, 0x5f7904,
+ 0x5f7d01, 0x000000, 0x000000, 0x000000, 0x5f7e01, 0x5f7f01, 0x5f8003, 0x5f8301,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x5f8404, 0x5f8801, 0x000000, 0x000000,
+ 0x5f8901, 0x5f8a01, 0x5f8b05, 0x000000, 0x5f9005, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x5f9501, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x5f9602,
+ 0x000000, 0x5f9801, 0x5f9901, 0x5f9a01, 0x5f9b02, 0x000000, 0x5f9d02, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x5f9f01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x5fa001, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x5fa103, 0x5fa401, 0x000000, 0x000000, 0x000000, 0x000000, 0x5fa502,
+ 0x000000, 0x000000, 0x000000, 0x5fa706, 0x000000, 0x000000, 0x000000, 0x5fad03,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x5fb001, 0x000000, 0x000000, 0x5fb101,
+ 0x000000, 0x000000, 0x000000, 0x5fb207, 0x5fb901, 0x000000, 0x000000, 0x000000,
+ 0x5fba04, 0x000000, 0x000000, 0x5fbe02, 0x000000, 0x000000, 0x5fc001, 0x5fc103,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x5fc401, 0x000000, 0x5fc502,
+ 0x000000, 0x5fc701, 0x000000, 0x5fc803, 0x5fcb01, 0x5fcc02, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x5fce01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x5fcf09, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x5fd802, 0x5fda01, 0x000000, 0x5fdb08, 0x000000,
+ 0x000000, 0x000000, 0x5fe301, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x5fe401, 0x5fe503, 0x000000, 0x000000, 0x000000, 0x5fe801, 0x5fe901, 0x000000,
+ 0x5fea01, 0x000000, 0x5feb02, 0x000000, 0x5fed02, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x5fef01, 0x000000, 0x000000, 0x000000, 0x5ff001, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x5ff105, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x5ff602, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x5ff805, 0x000000, 0x000000, 0x000000, 0x5ffd01, 0x000000, 0x5ffe02, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x600004, 0x600403, 0x000000, 0x600701, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x600801, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x600901, 0x000000, 0x000000, 0x600a01, 0x000000, 0x600b02, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x600d01, 0x600e01, 0x000000, 0x000000, 0x000000, 0x000000, 0x600f02,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x601102,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x601301,
+ 0x601405, 0x000000, 0x000000, 0x000000, 0x000000, 0x601901, 0x601a01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x601b01, 0x000000, 0x000000, 0x601c05, 0x000000,
+ 0x602101, 0x000000, 0x000000, 0x602201, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x602303, 0x602601, 0x602708, 0x602f03, 0x000000, 0x000000, 0x000000, 0x60320b,
+ 0x000000, 0x603d01, 0x603e01, 0x000000, 0x000000, 0x000000, 0x000000, 0x603f0f,
+ 0x000000, 0x000000, 0x000000, 0x604e01, 0x604f01, 0x605005, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x605501, 0x000000,
+ 0x605601, 0x605701, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x605802,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x605a01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x605b01, 0x605c01, 0x000000, 0x605d04, 0x606101,
+ 0x000000, 0x000000, 0x000000, 0x606203, 0x000000, 0x606501, 0x000000, 0x000000,
+ 0x606602, 0x000000, 0x000000, 0x000000, 0x606802, 0x000000, 0x606a01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x606b01, 0x000000, 0x606c01, 0x000000, 0x000000,
+ 0x606d02, 0x000000, 0x000000, 0x606f01, 0x607001, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x607101, 0x607206, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x607801, 0x000000, 0x60790b, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x608401, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x608502, 0x000000, 0x608701, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x608801, 0x608901, 0x000000, 0x608a01,
+ 0x000000, 0x608b02, 0x608d01, 0x000000, 0x608e01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x608f05, 0x000000, 0x000000, 0x60940d, 0x000000, 0x000000, 0x60a10b,
+ 0x000000, 0x60ac01, 0x60ad02, 0x000000, 0x000000, 0x000000, 0x60af01, 0x000000,
+ 0x000000, 0x000000, 0x60b005, 0x000000, 0x000000, 0x000000, 0x60b504, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x60b901, 0x000000, 0x60ba01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x60bb01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x60bc02, 0x60be01, 0x60bf04, 0x000000,
+ 0x60c301, 0x000000, 0x000000, 0x000000, 0x000000, 0x60c404, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x60c808, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x60d001, 0x000000, 0x60d102, 0x60d301, 0x000000, 0x000000, 0x000000, 0x60d405,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x60d904, 0x60dd01, 0x000000, 0x60de01,
+ 0x60df03, 0x000000, 0x000000, 0x000000, 0x60e201, 0x000000, 0x60e302, 0x60e501,
+ 0x000000, 0x60e603, 0x000000, 0x000000, 0x000000, 0x60e911, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x60fa01, 0x60fb07, 0x000000, 0x610201,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x610303, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x610604, 0x000000, 0x610a01, 0x610b03,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x610e01, 0x000000, 0x000000, 0x610f01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x611001, 0x000000, 0x611101, 0x611201,
+ 0x000000, 0x000000, 0x000000, 0x611301, 0x000000, 0x611401, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x611501,
+ 0x000000, 0x61160d, 0x000000, 0x000000, 0x61230f, 0x000000, 0x000000, 0x000000,
+ 0x613201, 0x000000, 0x000000, 0x000000, 0x61330b, 0x000000, 0x613e02, 0x614002,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x614201, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x61430d, 0x000000, 0x615001, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x615103, 0x000000, 0x000000, 0x61540d,
+ 0x616101, 0x616201, 0x000000, 0x000000, 0x000000, 0x616307, 0x000000, 0x000000,
+ 0x616a03, 0x000000, 0x000000, 0x616d03, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x617005, 0x617501, 0x000000,
+ 0x617602, 0x000000, 0x000000, 0x617801, 0x000000, 0x000000, 0x000000, 0x617905,
+ 0x000000, 0x617e02, 0x000000, 0x000000, 0x000000, 0x618001, 0x000000, 0x000000,
+ 0x618102, 0x000000, 0x618304, 0x618702, 0x618902, 0x618b04, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x618f01, 0x000000, 0x000000, 0x000000, 0x619005,
+ 0x000000, 0x619501, 0x000000, 0x000000, 0x619601, 0x000000, 0x000000, 0x619709,
+ 0x000000, 0x000000, 0x000000, 0x61a001, 0x000000, 0x000000, 0x000000, 0x61a107,
+ 0x000000, 0x000000, 0x61a802, 0x000000, 0x000000, 0x000000, 0x61aa0f, 0x000000,
+ 0x000000, 0x61b905, 0x000000, 0x000000, 0x61be0b, 0x000000, 0x000000, 0x000000,
+ 0x61c901, 0x000000, 0x000000, 0x61ca01, 0x61cb01, 0x000000, 0x61cc02, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x61ce01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x61cf02, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x61d101, 0x000000, 0x000000, 0x61d202,
+ 0x61d404, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x61d802,
+ 0x000000, 0x000000, 0x61da01, 0x000000, 0x61db01, 0x61dc01, 0x000000, 0x000000,
+ 0x61dd01, 0x000000, 0x000000, 0x000000, 0x61de02, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x61e002, 0x61e201, 0x000000, 0x000000, 0x61e304, 0x61e701, 0x000000,
+ 0x61e804, 0x61ec01, 0x61ed02, 0x000000, 0x000000, 0x000000, 0x000000, 0x61ef01,
+ 0x000000, 0x61f011, 0x000000, 0x620102, 0x000000, 0x000000, 0x620301, 0x620408,
+ 0x620c04, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x621003,
+ 0x621305, 0x000000, 0x000000, 0x621802, 0x000000, 0x000000, 0x621a01, 0x621b01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x621c03, 0x000000,
+ 0x000000, 0x000000, 0x621f01, 0x622004, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x622401, 0x000000, 0x000000, 0x000000, 0x622504,
+ 0x000000, 0x622904, 0x622d05, 0x000000, 0x623204, 0x000000, 0x623608, 0x000000,
+ 0x000000, 0x000000, 0x623e0a, 0x000000, 0x624802, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x624a0b, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x625501, 0x000000, 0x625620, 0x000000, 0x627602, 0x000000, 0x000000, 0x000000,
+ 0x627804, 0x000000, 0x000000, 0x000000, 0x000000, 0x627c06, 0x000000, 0x628204,
+ 0x000000, 0x628602, 0x000000, 0x628802, 0x000000, 0x000000, 0x000000, 0x628a01,
+ 0x000000, 0x000000, 0x000000, 0x628b01, 0x000000, 0x000000, 0x000000, 0x628c02,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x628e02,
+ 0x629004, 0x000000, 0x000000, 0x000000, 0x000000, 0x629402, 0x629604, 0x000000,
+ 0x000000, 0x000000, 0x629a09, 0x000000, 0x000000, 0x000000, 0x62a305, 0x000000,
+ 0x62a801, 0x62a902, 0x000000, 0x000000, 0x000000, 0x000000, 0x62ab05, 0x62b003,
+ 0x000000, 0x62b305, 0x000000, 0x000000, 0x62b833, 0x62eb01, 0x000000, 0x62ec01,
+ 0x000000, 0x62ed01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x62ee01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x62ef04, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x62f301,
+ 0x000000, 0x000000, 0x000000, 0x62f403, 0x000000, 0x000000, 0x000000, 0x62f701,
+ 0x62f801, 0x62f905, 0x000000, 0x000000, 0x62fe07, 0x000000, 0x630502, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x630702, 0x000000,
+ 0x630915, 0x000000, 0x631e04, 0x000000, 0x632205, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x632702, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x632902, 0x000000, 0x632b02, 0x000000, 0x632d09,
+ 0x000000, 0x000000, 0x633602, 0x000000, 0x000000, 0x633801, 0x000000, 0x000000,
+ 0x000000, 0x633905, 0x000000, 0x000000, 0x000000, 0x633e06, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x634402, 0x634602, 0x000000, 0x000000, 0x634802, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x634a02, 0x000000, 0x000000,
+ 0x000000, 0x634c03, 0x000000, 0x000000, 0x000000, 0x634f09, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x635802, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x635a01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x635b01, 0x000000, 0x000000, 0x000000, 0x635c03,
+ 0x000000, 0x000000, 0x635f02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x636101, 0x000000, 0x000000, 0x636203, 0x000000, 0x636503, 0x000000,
+ 0x000000, 0x636801, 0x000000, 0x000000, 0x000000, 0x636902, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x636b01, 0x000000, 0x636c01, 0x636d01, 0x636e01, 0x000000,
+ 0x000000, 0x000000, 0x636f01, 0x000000, 0x637002, 0x000000, 0x000000, 0x000000,
+ 0x637202, 0x000000, 0x637407, 0x000000, 0x637b01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x637c02, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x637e03, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x638101, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x638202, 0x000000, 0x000000, 0x000000, 0x000000, 0x638406,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x638a01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x638b01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x638c0c,
+ 0x000000, 0x639801, 0x000000, 0x000000, 0x639906, 0x000000, 0x639f06, 0x000000,
+ 0x63a502, 0x000000, 0x63a701, 0x000000, 0x000000, 0x63a801, 0x63a903, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x63ac01, 0x63ad01, 0x63ae01,
+ 0x000000, 0x63af01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x63b001, 0x000000, 0x63b105, 0x63b607, 0x63bd02, 0x000000, 0x63bf01,
+ 0x000000, 0x63c00b, 0x000000, 0x000000, 0x63cb02, 0x63cd01, 0x000000, 0x000000,
+ 0x63ce01, 0x000000, 0x63cf02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x63d101, 0x000000, 0x63d201, 0x000000, 0x63d301, 0x63d40b, 0x63df02, 0x000000,
+ 0x000000, 0x000000, 0x63e101, 0x63e203, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x63e505, 0x000000, 0x000000, 0x000000, 0x000000, 0x63ea02,
+ 0x000000, 0x000000, 0x000000, 0x63ec01, 0x000000, 0x000000, 0x000000, 0x63ed06,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x63f301, 0x000000, 0x000000, 0x000000, 0x000000, 0x63f401, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x63f501, 0x000000, 0x63f601, 0x63f701, 0x63f801,
+ 0x000000, 0x63f902, 0x000000, 0x000000, 0x000000, 0x63fb01, 0x000000, 0x63fc12,
+ 0x640e03, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x641101, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x641204, 0x641606, 0x000000, 0x000000, 0x641c02,
+ 0x000000, 0x000000, 0x641e04, 0x000000, 0x000000, 0x000000, 0x642201, 0x64230d,
+ 0x000000, 0x000000, 0x643005, 0x000000, 0x000000, 0x000000, 0x000000, 0x643507,
+ 0x000000, 0x000000, 0x000000, 0x643c02, 0x643e08, 0x000000, 0x000000, 0x644607,
+ 0x000000, 0x000000, 0x644d14, 0x646101, 0x000000, 0x646203, 0x646501, 0x646601,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x646702, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x646904, 0x000000,
+ 0x000000, 0x646d01, 0x000000, 0x646e01, 0x000000, 0x646f03, 0x000000, 0x647201,
+ 0x647301, 0x647401, 0x000000, 0x000000, 0x64750a, 0x647f04, 0x648302, 0x000000,
+ 0x000000, 0x000000, 0x648503, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x648802, 0x000000, 0x000000, 0x648a01,
+ 0x000000, 0x000000, 0x000000, 0x648b01, 0x000000, 0x648c04, 0x649001, 0x000000,
+ 0x649102, 0x000000, 0x649318, 0x64ab06, 0x64b102, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x64b301, 0x000000, 0x000000, 0x000000, 0x000000, 0x64b401,
+ 0x000000, 0x64b502, 0x64b701, 0x64b804, 0x000000, 0x000000, 0x000000, 0x64bc08,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x64c404, 0x64c807,
+ 0x000000, 0x000000, 0x000000, 0x64cf01, 0x64d002, 0x000000, 0x000000, 0x64d203,
+ 0x64d501, 0x64d602, 0x000000, 0x000000, 0x64d803, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x64db0c, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x64e701, 0x64e80d, 0x000000, 0x000000, 0x000000, 0x64f501,
+ 0x000000, 0x000000, 0x000000, 0x64f601, 0x64f701, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x64f801, 0x64f901,
+ 0x000000, 0x000000, 0x64fa01, 0x000000, 0x000000, 0x64fb0a, 0x000000, 0x650501,
+ 0x000000, 0x000000, 0x000000, 0x650602, 0x650802, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x650a01, 0x650b01, 0x000000, 0x650c05,
+ 0x651101, 0x000000, 0x651201, 0x000000, 0x651301, 0x651401, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x651518, 0x652d01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x652e01, 0x652f01, 0x653003, 0x000000, 0x000000,
+ 0x000000, 0x653301, 0x653401, 0x000000, 0x000000, 0x000000, 0x000000, 0x653502,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x653701,
+ 0x000000, 0x653801, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x653902, 0x000000, 0x000000, 0x653b01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x653c0a, 0x654601, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x654702, 0x000000, 0x000000, 0x654903, 0x000000, 0x000000, 0x000000,
+ 0x654c05, 0x000000, 0x000000, 0x655104, 0x655503, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x655805, 0x000000, 0x655d06, 0x000000,
+ 0x656305, 0x000000, 0x000000, 0x656801, 0x656901, 0x000000, 0x000000, 0x656a01,
+ 0x000000, 0x656b01, 0x656c01, 0x656d01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x656e01, 0x000000, 0x000000, 0x000000, 0x000000, 0x656f01, 0x000000,
+ 0x000000, 0x000000, 0x657002, 0x657202, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x657402, 0x657603, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x657903, 0x000000, 0x657c01, 0x000000, 0x000000, 0x000000,
+ 0x657d02, 0x000000, 0x000000, 0x000000, 0x657f09, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x658809, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x659103, 0x000000, 0x000000, 0x000000, 0x659401, 0x000000,
+ 0x000000, 0x000000, 0x659501, 0x659607, 0x000000, 0x000000, 0x659d01, 0x659e01,
+ 0x659f01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x65a001,
+ 0x65a102, 0x65a302, 0x000000, 0x65a501, 0x65a601, 0x000000, 0x000000, 0x000000,
+ 0x65a704, 0x65ab01, 0x000000, 0x65ac04, 0x65b001, 0x65b10a, 0x65bb02, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x65bd01, 0x000000, 0x000000, 0x65be02,
+ 0x000000, 0x000000, 0x65c001, 0x000000, 0x65c101, 0x000000, 0x65c202, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x65c401, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x65c505, 0x65ca01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x65cb06, 0x000000, 0x65d101, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x65d202, 0x000000, 0x65d402, 0x000000, 0x000000, 0x65d602, 0x000000, 0x000000,
+ 0x000000, 0x65d801, 0x000000, 0x65d903, 0x65dc01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x65dd01, 0x000000, 0x000000, 0x000000, 0x65de0b, 0x000000, 0x65e904,
+ 0x000000, 0x000000, 0x65ed01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x65ee01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x65ef05,
+ 0x65f406, 0x000000, 0x65fa0f, 0x660902, 0x000000, 0x660b01, 0x000000, 0x000000,
+ 0x660c0b, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x661705,
+ 0x661c0e, 0x662a09, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x663302, 0x663501, 0x000000, 0x000000, 0x000000,
+ 0x663603, 0x000000, 0x663901, 0x663a01, 0x000000, 0x000000, 0x663b02, 0x000000,
+ 0x000000, 0x663d01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x663e01,
+ 0x000000, 0x000000, 0x000000, 0x663f01, 0x664090, 0x000000, 0x66d001, 0x66d101,
+ 0x000000, 0x66d201, 0x000000, 0x000000, 0x66d301, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x66d406, 0x000000, 0x66da04, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x66de0f, 0x000000, 0x000000,
+ 0x000000, 0x66ed1d, 0x000000, 0x000000, 0x000000, 0x670a03, 0x000000, 0x000000,
+ 0x670d01, 0x670e02, 0x671007, 0x000000, 0x000000, 0x67170e, 0x672505, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x672a01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x672b08, 0x000000, 0x000000, 0x673303, 0x000000, 0x000000, 0x673601,
+ 0x000000, 0x673702, 0x673906, 0x673f03, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x674201, 0x000000, 0x674305, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x674803, 0x000000, 0x674b02, 0x000000,
+ 0x000000, 0x000000, 0x674d01, 0x000000, 0x000000, 0x000000, 0x000000, 0x674e02,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x675001, 0x000000, 0x675102, 0x675301,
+ 0x000000, 0x675401, 0x675501, 0x000000, 0x000000, 0x000000, 0x675601, 0x000000,
+ 0x000000, 0x000000, 0x675702, 0x000000, 0x000000, 0x675902, 0x000000, 0x000000,
+ 0x675b03, 0x000000, 0x675e01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x675f06, 0x676503, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x676801, 0x000000,
+ 0x000000, 0x676901, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x676a02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x676c08, 0x000000, 0x677401, 0x000000, 0x000000, 0x677501, 0x000000,
+ 0x677601, 0x000000, 0x000000, 0x677705, 0x677c01, 0x677d01, 0x000000, 0x000000,
+ 0x677e02, 0x000000, 0x678007, 0x678702, 0x678901, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x678a02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x678c01, 0x000000, 0x000000, 0x678d02, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x678f01, 0x000000, 0x679002, 0x679203, 0x000000, 0x000000, 0x000000,
+ 0x679501, 0x000000, 0x000000, 0x000000, 0x679605, 0x000000, 0x679b02, 0x679d01,
+ 0x000000, 0x000000, 0x000000, 0x679e05, 0x000000, 0x67a301, 0x000000, 0x67a404,
+ 0x67a815, 0x67bd01, 0x000000, 0x000000, 0x000000, 0x67be0c, 0x000000, 0x000000,
+ 0x000000, 0x67ca02, 0x000000, 0x000000, 0x67cc0f, 0x000000, 0x67db05, 0x000000,
+ 0x67e00a, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x67ea01,
+ 0x000000, 0x67eb02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x67ed01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x67ee02, 0x67f002, 0x67f203, 0x67f502,
+ 0x000000, 0x000000, 0x000000, 0x67f704, 0x67fb01, 0x000000, 0x67fc06, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x680202, 0x000000, 0x680401, 0x000000,
+ 0x000000, 0x680502, 0x000000, 0x000000, 0x68070b, 0x681201, 0x000000, 0x000000,
+ 0x000000, 0x681302, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x681501, 0x681603, 0x000000, 0x000000, 0x000000,
+ 0x681906, 0x000000, 0x000000, 0x681f07, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x682607, 0x682d01, 0x682e0e, 0x000000, 0x000000, 0x000000, 0x683c01, 0x683d01,
+ 0x683e02, 0x000000, 0x684037, 0x000000, 0x000000, 0x000000, 0x000000, 0x687701,
+ 0x000000, 0x687802, 0x000000, 0x687a01, 0x687b01, 0x000000, 0x687c01, 0x687d01,
+ 0x687e01, 0x000000, 0x000000, 0x000000, 0x000000, 0x687f03, 0x688201, 0x000000,
+ 0x000000, 0x000000, 0x68830d, 0x689005, 0x000000, 0x000000, 0x000000, 0x689501,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x689602, 0x000000, 0x689801,
+ 0x689908, 0x000000, 0x68a101, 0x000000, 0x000000, 0x000000, 0x68a201, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x68a301, 0x000000, 0x000000, 0x68a402,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x68a601, 0x000000, 0x68a701,
+ 0x68a801, 0x000000, 0x000000, 0x000000, 0x68a903, 0x000000, 0x68ac01, 0x68ad02,
+ 0x000000, 0x000000, 0x000000, 0x68af03, 0x000000, 0x000000, 0x68b201, 0x000000,
+ 0x68b301, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x68b403, 0x000000, 0x000000, 0x68b701, 0x000000, 0x000000,
+ 0x68b803, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x68bb0d, 0x000000, 0x68c801, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x68c901, 0x000000, 0x000000, 0x68ca02, 0x68cc05, 0x68d101,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x68d20e, 0x000000, 0x000000, 0x68e002,
+ 0x000000, 0x68e201, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x68e301, 0x000000, 0x68e404, 0x68e801, 0x000000,
+ 0x68e901, 0x000000, 0x68ea11, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x68fb02, 0x000000, 0x68fd04, 0x690101, 0x690207, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x690904, 0x690d01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x690e01, 0x690f04, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x69130b, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x691e02, 0x692001, 0x692101, 0x692201, 0x692303, 0x692602, 0x000000, 0x000000,
+ 0x000000, 0x692801, 0x692903, 0x000000, 0x000000, 0x692c03, 0x000000, 0x000000,
+ 0x000000, 0x692f01, 0x000000, 0x000000, 0x693001, 0x693101, 0x000000, 0x000000,
+ 0x000000, 0x693201, 0x000000, 0x693301, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x693404, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x693806, 0x000000, 0x000000, 0x693e01, 0x000000, 0x000000, 0x693f02, 0x000000,
+ 0x000000, 0x000000, 0x69410a, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x694b02, 0x000000, 0x694d05, 0x000000, 0x000000, 0x695202,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x695404,
+ 0x000000, 0x695801, 0x695902, 0x695b01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x695c01, 0x000000, 0x695d04, 0x000000, 0x696102, 0x000000, 0x696302,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x696504, 0x000000,
+ 0x696901, 0x696a03, 0x000000, 0x696d0d, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x697a03, 0x697d01, 0x000000, 0x000000, 0x697e03, 0x698102, 0x698301, 0x698401,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x698501, 0x698603, 0x698901, 0x000000, 0x698a06, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x699001, 0x000000, 0x000000, 0x000000, 0x699103, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x699401, 0x699501, 0x699603, 0x699902, 0x000000,
+ 0x000000, 0x699b01, 0x699c01, 0x000000, 0x000000, 0x000000, 0x699d04, 0x69a102,
+ 0x000000, 0x000000, 0x000000, 0x69a301, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x69a401, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x69a501, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x69a602, 0x69a801, 0x000000, 0x69a901, 0x000000, 0x000000,
+ 0x000000, 0x69aa01, 0x69ab03, 0x000000, 0x69ae01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x69af02, 0x69b101, 0x69b202, 0x000000, 0x69b403, 0x000000, 0x69b705, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x69bc01, 0x000000, 0x000000, 0x69bd02,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x69bf04,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x69c302, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x69c501, 0x000000,
+ 0x69c602, 0x000000, 0x000000, 0x000000, 0x69c801, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x69c901, 0x000000, 0x69ca03, 0x69cd01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x69ce01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x69cf02, 0x69d104, 0x000000, 0x69d501, 0x000000, 0x000000, 0x69d604,
+ 0x000000, 0x69da03, 0x69dd01, 0x000000, 0x000000, 0x000000, 0x69de02, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x69e001, 0x000000, 0x000000, 0x000000, 0x69e101,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x69e201, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x69e309, 0x69ec01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x69ed06, 0x000000, 0x000000, 0x69f302, 0x000000, 0x69f504, 0x000000,
+ 0x000000, 0x69f901, 0x69fa10, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x6a0a01, 0x000000, 0x000000, 0x000000, 0x000000, 0x6a0b01, 0x6a0c01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x6a0d01, 0x6a0e01, 0x000000, 0x6a0f07,
+ 0x000000, 0x6a1605, 0x000000, 0x000000, 0x000000, 0x6a1b0b, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x6a260e, 0x000000, 0x6a3402,
+ 0x000000, 0x000000, 0x6a3602, 0x000000, 0x6a3802, 0x000000, 0x6a3a03, 0x000000,
+ 0x6a3d02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x6a3f02, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x6a4101, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x6a4201, 0x000000, 0x000000, 0x6a4302, 0x000000, 0x000000, 0x6a4501, 0x000000,
+ 0x6a4602, 0x000000, 0x000000, 0x000000, 0x000000, 0x6a4804, 0x000000, 0x000000,
+ 0x000000, 0x6a4c03, 0x000000, 0x000000, 0x6a4f03, 0x6a5201, 0x6a5302, 0x6a5501,
+ 0x6a5601, 0x000000, 0x6a5701, 0x000000, 0x6a5801, 0x6a5907, 0x000000, 0x000000,
+ 0x6a6002, 0x000000, 0x000000, 0x000000, 0x000000, 0x6a6202, 0x000000, 0x6a6401,
+ 0x000000, 0x6a6501, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x6a6603, 0x000000, 0x6a6901, 0x6a6a07, 0x000000, 0x6a7101, 0x000000, 0x000000,
+ 0x000000, 0x6a7202, 0x000000, 0x6a7401, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x6a7501, 0x6a7603, 0x6a7901, 0x000000, 0x000000, 0x000000, 0x6a7a08,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x6a8209, 0x000000,
+ 0x6a8b02, 0x6a8d12, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x6a9f01, 0x6aa004, 0x6aa401, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x6aa50a, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x6aaf01, 0x6ab005, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x6ab502, 0x000000, 0x6ab709, 0x000000, 0x6ac001, 0x000000,
+ 0x6ac101, 0x6ac201, 0x000000, 0x6ac308, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x6acb08, 0x000000, 0x000000, 0x000000, 0x6ad302, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x6ad501, 0x000000, 0x6ad604, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x6ada03, 0x000000, 0x000000, 0x6add01, 0x6ade02, 0x6ae004,
+ 0x000000, 0x000000, 0x000000, 0x6ae402, 0x000000, 0x6ae609, 0x000000, 0x6aef02,
+ 0x6af101, 0x000000, 0x000000, 0x6af211, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x6b0301, 0x000000, 0x6b0407, 0x6b0b04, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x6b0f2d, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x6b3c03, 0x000000, 0x000000, 0x000000, 0x6b3f02, 0x000000, 0x000000, 0x000000,
+ 0x6b4101, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x6b4201, 0x000000, 0x000000, 0x000000, 0x6b4301, 0x000000, 0x000000, 0x6b4404,
+ 0x000000, 0x6b4802, 0x6b4a02, 0x000000, 0x000000, 0x6b4c01, 0x000000, 0x6b4d01,
+ 0x000000, 0x6b4e06, 0x000000, 0x6b5405, 0x6b5902, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x6b5b01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x6b5c08, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x6b6401, 0x000000, 0x6b6508, 0x6b6d09, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x6b7615, 0x6b8b01, 0x000000, 0x000000, 0x000000, 0x6b8c0c, 0x6b9801, 0x000000,
+ 0x000000, 0x000000, 0x6b9901, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x6b9a02, 0x000000, 0x000000,
+ 0x6b9c01, 0x6b9d01, 0x000000, 0x6b9e04, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x6ba210, 0x000000, 0x000000, 0x6bb202, 0x000000,
+ 0x6bb401, 0x6bb501, 0x6bb602, 0x6bb801, 0x000000, 0x6bb901, 0x000000, 0x000000,
+ 0x6bba06, 0x6bc001, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x6bc102,
+ 0x000000, 0x000000, 0x6bc301, 0x6bc407, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x6bcb04, 0x000000, 0x000000, 0x6bcf08, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x6bd702,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x6bd908, 0x000000, 0x000000, 0x000000, 0x6be102,
+ 0x000000, 0x000000, 0x6be30b, 0x000000, 0x000000, 0x000000, 0x6bee01, 0x000000,
+ 0x000000, 0x6bef02, 0x6bf102, 0x000000, 0x6bf302, 0x6bf505, 0x000000, 0x000000,
+ 0x000000, 0x6bfa01, 0x000000, 0x6bfb05, 0x6c0002, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x6c0209, 0x6c0b01, 0x000000, 0x6c0c01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x6c0d02, 0x000000, 0x000000,
+ 0x6c0f01, 0x000000, 0x6c1004, 0x000000, 0x000000, 0x000000, 0x6c1402, 0x000000,
+ 0x6c1602, 0x000000, 0x000000, 0x000000, 0x6c1801, 0x6c1908, 0x000000, 0x000000,
+ 0x000000, 0x6c211d, 0x000000, 0x000000, 0x000000, 0x6c3e01, 0x000000, 0x6c3f01,
+ 0x6c4006, 0x6c4601, 0x6c4708, 0x000000, 0x000000, 0x6c4f01, 0x000000, 0x6c5002,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x6c5201, 0x000000, 0x000000, 0x6c5301, 0x000000, 0x6c5405, 0x000000,
+ 0x6c5904, 0x000000, 0x000000, 0x000000, 0x6c5d01, 0x000000, 0x000000, 0x000000,
+ 0x6c5e01, 0x6c5f01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x6c6001, 0x6c6101, 0x000000, 0x000000, 0x000000, 0x6c6201, 0x6c6303, 0x6c6601,
+ 0x6c6710, 0x000000, 0x000000, 0x000000, 0x6c7702, 0x6c7904, 0x000000, 0x000000,
+ 0x000000, 0x6c7d01, 0x6c7e01, 0x000000, 0x6c7f01, 0x6c8004, 0x000000, 0x000000,
+ 0x6c8403, 0x000000, 0x6c8702, 0x000000, 0x6c8905, 0x000000, 0x000000, 0x6c8e01,
+ 0x000000, 0x6c8f01, 0x6c900b, 0x6c9b08, 0x000000, 0x6ca301, 0x6ca401, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x6ca50b,
+ 0x000000, 0x6cb002, 0x000000, 0x6cb201, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x6cb321, 0x6cd401, 0x6cd502, 0x000000, 0x000000, 0x000000, 0x6cd701, 0x000000,
+ 0x000000, 0x000000, 0x6cd813, 0x6ceb05, 0x000000, 0x6cf001, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x6cf101, 0x000000, 0x6cf201, 0x000000, 0x000000,
+ 0x000000, 0x6cf305, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x6cf801,
+ 0x6cf901, 0x000000, 0x000000, 0x6cfa02, 0x000000, 0x000000, 0x000000, 0x6cfc04,
+ 0x6d000f, 0x000000, 0x000000, 0x6d0f01, 0x000000, 0x000000, 0x6d1001, 0x000000,
+ 0x6d1109, 0x000000, 0x000000, 0x000000, 0x6d1a03, 0x6d1d07, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x6d2401, 0x000000, 0x6d2503, 0x000000, 0x6d2802, 0x000000, 0x6d2a07, 0x6d3106,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x6d3703, 0x6d3a01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x6d3b01, 0x6d3c02,
+ 0x000000, 0x000000, 0x000000, 0x6d3e02, 0x000000, 0x6d4006, 0x6d4601, 0x000000,
+ 0x6d4701, 0x6d4804, 0x000000, 0x6d4c02, 0x000000, 0x6d4e44, 0x6d9201, 0x6d9304,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x6d9702, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x6d9901, 0x6d9a02, 0x000000, 0x000000,
+ 0x6d9c02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x6d9e03, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x6da103,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x6da401, 0x6da502,
+ 0x6da701, 0x000000, 0x6da801, 0x000000, 0x000000, 0x6da901, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x6daa03, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x6dad07, 0x000000, 0x000000, 0x000000, 0x000000, 0x6db401,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x6db502, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x6db702, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x6db907, 0x000000, 0x6dc011, 0x6dd101,
+ 0x6dd201, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x6dd302, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x6dd50b, 0x000000,
+ 0x6de002, 0x000000, 0x6de204, 0x000000, 0x000000, 0x6de605, 0x000000, 0x000000,
+ 0x000000, 0x6deb01, 0x6dec05, 0x000000, 0x000000, 0x000000, 0x6df106, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x6df703, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x6dfa02, 0x6dfc04, 0x6e0005, 0x000000, 0x000000, 0x000000, 0x000000, 0x6e0501,
+ 0x000000, 0x6e0605, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x6e0b01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x6e0c02, 0x000000, 0x000000, 0x6e0e03,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x6e110a, 0x6e1b02, 0x000000, 0x6e1d01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x6e1e02, 0x000000, 0x6e200d, 0x6e2d01, 0x000000, 0x000000,
+ 0x6e2e02, 0x6e3002, 0x000000, 0x6e3202, 0x000000, 0x6e3402, 0x000000, 0x000000,
+ 0x000000, 0x6e3601, 0x6e3701, 0x6e3805, 0x000000, 0x6e3d01, 0x000000, 0x6e3e02,
+ 0x6e4001, 0x000000, 0x000000, 0x000000, 0x6e4101, 0x000000, 0x6e4202, 0x6e4403,
+ 0x6e4703, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x6e4a06, 0x000000, 0x6e5001, 0x000000, 0x000000, 0x6e5101,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x6e5202, 0x000000, 0x000000, 0x000000,
+ 0x6e5403, 0x000000, 0x000000, 0x000000, 0x6e5702, 0x6e5901, 0x000000, 0x6e5a01,
+ 0x6e5b01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x6e5c01,
+ 0x000000, 0x000000, 0x6e5d01, 0x6e5e01, 0x000000, 0x000000, 0x6e5f02, 0x000000,
+ 0x000000, 0x6e6101, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x6e6201,
+ 0x000000, 0x000000, 0x6e6301, 0x000000, 0x000000, 0x6e6401, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x6e6501, 0x6e6601, 0x000000, 0x000000, 0x6e6702, 0x000000,
+ 0x000000, 0x000000, 0x6e6902, 0x000000, 0x6e6b01, 0x6e6c01, 0x000000, 0x6e6d02,
+ 0x6e6f02, 0x6e7103, 0x000000, 0x6e7401, 0x6e7501, 0x000000, 0x000000, 0x000000,
+ 0x6e7601, 0x000000, 0x6e7701, 0x6e7802, 0x6e7a09, 0x000000, 0x6e8302, 0x000000,
+ 0x6e8503, 0x000000, 0x6e8802, 0x000000, 0x000000, 0x000000, 0x000000, 0x6e8a01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x6e8b01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x6e8c01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x6e8d01, 0x6e8e01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x6e8f01, 0x000000, 0x000000, 0x6e9007, 0x000000, 0x6e9701, 0x000000,
+ 0x6e9801, 0x6e9901, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x6e9a05, 0x000000, 0x000000, 0x000000, 0x6e9f01, 0x6ea007, 0x000000, 0x000000,
+ 0x6ea701, 0x000000, 0x000000, 0x000000, 0x6ea809, 0x6eb101, 0x000000, 0x6eb205,
+ 0x000000, 0x000000, 0x6eb703, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x6eba01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x6ebb3f, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x6efa01, 0x000000, 0x6efb01, 0x6efc03, 0x000000, 0x6eff04,
+ 0x000000, 0x000000, 0x000000, 0x6f0301, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x6f0402, 0x000000, 0x000000, 0x000000, 0x000000, 0x6f0601, 0x000000,
+ 0x000000, 0x000000, 0x6f0704, 0x000000, 0x000000, 0x6f0b01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x6f0c02, 0x000000, 0x000000, 0x000000, 0x6f0e03,
+ 0x6f1118, 0x000000, 0x6f2906, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x6f2f01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x6f3002, 0x000000, 0x6f3204, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x6f3603, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x6f3906, 0x000000, 0x6f3f01, 0x000000, 0x6f4004, 0x000000, 0x000000,
+ 0x6f4401, 0x000000, 0x000000, 0x000000, 0x000000, 0x6f4502, 0x6f4701, 0x000000,
+ 0x000000, 0x6f4803, 0x000000, 0x000000, 0x000000, 0x000000, 0x6f4b03, 0x000000,
+ 0x000000, 0x000000, 0x6f4e02, 0x000000, 0x6f5002, 0x000000, 0x6f5201, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x6f5302, 0x000000, 0x000000, 0x6f5501, 0x6f5605,
+ 0x000000, 0x000000, 0x000000, 0x6f5b02, 0x000000, 0x000000, 0x000000, 0x6f5d02,
+ 0x000000, 0x000000, 0x6f5f01, 0x6f6001, 0x6f6107, 0x6f6805, 0x000000, 0x6f6d01,
+ 0x000000, 0x6f6e01, 0x6f6f01, 0x000000, 0x000000, 0x000000, 0x000000, 0x6f7003,
+ 0x000000, 0x000000, 0x6f7305, 0x000000, 0x000000, 0x6f7801, 0x6f7901, 0x000000,
+ 0x000000, 0x000000, 0x6f7a09, 0x000000, 0x6f8305, 0x000000, 0x6f8801, 0x6f8906,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x6f8f03, 0x6f9201, 0x000000, 0x000000,
+ 0x6f9301, 0x000000, 0x000000, 0x000000, 0x000000, 0x6f9401, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x6f9502, 0x6f9701, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x6f9801, 0x000000, 0x000000,
+ 0x000000, 0x6f9902, 0x000000, 0x6f9b01, 0x6f9c02, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x6f9e01, 0x000000, 0x000000, 0x000000, 0x000000, 0x6f9f05, 0x6fa407,
+ 0x6fab01, 0x000000, 0x000000, 0x6fac01, 0x000000, 0x000000, 0x000000, 0x6fad05,
+ 0x6fb203, 0x000000, 0x6fb503, 0x000000, 0x000000, 0x6fb804, 0x000000, 0x000000,
+ 0x6fbc09, 0x000000, 0x000000, 0x000000, 0x000000, 0x6fc501, 0x6fc604, 0x6fca01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x6fcb06, 0x000000,
+ 0x6fd102, 0x000000, 0x000000, 0x6fd303, 0x000000, 0x6fd601, 0x000000, 0x6fd703,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x6fda02, 0x000000,
+ 0x000000, 0x000000, 0x6fdc01, 0x6fdd01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x6fde04, 0x000000, 0x6fe209, 0x000000, 0x000000, 0x6feb0a, 0x000000,
+ 0x000000, 0x000000, 0x6ff508, 0x000000, 0x6ffd01, 0x6ffe01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x6fff01,
+ 0x700002, 0x700201, 0x70030f, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x701204, 0x000000, 0x000000, 0x000000, 0x701601, 0x000000,
+ 0x000000, 0x000000, 0x701701, 0x000000, 0x701801, 0x701907, 0x000000, 0x702002,
+ 0x000000, 0x702201, 0x702302, 0x702501, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x702611, 0x703708, 0x000000, 0x000000, 0x000000,
+ 0x703f01, 0x000000, 0x000000, 0x000000, 0x704001, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x704101, 0x000000,
+ 0x704202, 0x000000, 0x704401, 0x000000, 0x000000, 0x704503, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x704804, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x704c01, 0x704d02, 0x704f02, 0x705102, 0x705301, 0x000000, 0x705402, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x705601, 0x705702, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x705902, 0x000000, 0x000000, 0x000000, 0x705b02,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x705d01, 0x000000,
+ 0x705e01, 0x705f01, 0x000000, 0x000000, 0x000000, 0x000000, 0x706001, 0x706101,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x706201, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x706301, 0x000000, 0x706409,
+ 0x000000, 0x706d02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x706f01, 0x000000, 0x707001, 0x000000, 0x707101, 0x000000, 0x000000, 0x000000,
+ 0x70720a, 0x000000, 0x000000, 0x000000, 0x707c02, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x707e02, 0x000000, 0x000000, 0x708001, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x708103, 0x000000, 0x708401, 0x000000, 0x000000,
+ 0x708501, 0x000000, 0x000000, 0x708601, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x708702, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x708902, 0x708b04, 0x000000, 0x000000, 0x708f03, 0x709202, 0x000000,
+ 0x000000, 0x709405, 0x000000, 0x709910, 0x000000, 0x000000, 0x000000, 0x70a90a,
+ 0x70b301, 0x000000, 0x000000, 0x70b401, 0x000000, 0x70b501, 0x70b602, 0x000000,
+ 0x000000, 0x000000, 0x70b801, 0x000000, 0x000000, 0x000000, 0x70b909, 0x000000,
+ 0x70c201, 0x70c301, 0x70c405, 0x000000, 0x000000, 0x000000, 0x70c906, 0x70cf02,
+ 0x70d108, 0x70d902, 0x70db03, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x70de03, 0x000000, 0x000000, 0x000000, 0x70e101, 0x70e201,
+ 0x000000, 0x000000, 0x000000, 0x70e304, 0x000000, 0x000000, 0x70e702, 0x000000,
+ 0x70e901, 0x000000, 0x000000, 0x000000, 0x000000, 0x70ea01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x70eb02, 0x000000, 0x000000, 0x000000,
+ 0x70ed04, 0x000000, 0x70f101, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x70f201, 0x70f303, 0x70f601, 0x000000, 0x000000, 0x70f701,
+ 0x000000, 0x70f803, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x70fb02, 0x000000, 0x000000, 0x000000, 0x000000, 0x70fd03,
+ 0x710001, 0x000000, 0x000000, 0x000000, 0x710106, 0x000000, 0x710703, 0x000000,
+ 0x710a03, 0x000000, 0x000000, 0x000000, 0x000000, 0x710d0e, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x711b0a, 0x000000, 0x000000, 0x000000,
+ 0x712501, 0x000000, 0x000000, 0x000000, 0x000000, 0x712601, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x712703,
+ 0x000000, 0x712a04, 0x000000, 0x712e01, 0x712f06, 0x000000, 0x713501, 0x713601,
+ 0x000000, 0x000000, 0x713705, 0x713c07, 0x714301, 0x714401, 0x714501, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x714601, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x714701, 0x000000, 0x714808, 0x000000, 0x000000,
+ 0x000000, 0x715002, 0x000000, 0x000000, 0x71520a, 0x000000, 0x000000, 0x715c03,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x715f01, 0x000000, 0x716001, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x71610a, 0x000000, 0x000000, 0x000000,
+ 0x716b01, 0x000000, 0x000000, 0x000000, 0x716c01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x716d07, 0x000000, 0x717402, 0x000000, 0x717604, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x717a03,
+ 0x000000, 0x000000, 0x000000, 0x717d02, 0x717f06, 0x718508, 0x000000, 0x718d0c,
+ 0x719901, 0x000000, 0x000000, 0x000000, 0x719a01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x719b01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x719c03, 0x719f02, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x71a107, 0x71a806, 0x000000, 0x000000, 0x000000,
+ 0x71ae02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x71b002, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x71b202,
+ 0x000000, 0x71b406, 0x000000, 0x000000, 0x000000, 0x71ba05, 0x000000, 0x000000,
+ 0x71bf12, 0x000000, 0x000000, 0x71d102, 0x71d30c, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x71df08, 0x000000,
+ 0x71e70e, 0x71f502, 0x000000, 0x71f704, 0x000000, 0x000000, 0x71fb01, 0x000000,
+ 0x71fc2f, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x722b01, 0x000000, 0x000000, 0x722c01, 0x000000, 0x000000, 0x722d04,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x723107, 0x000000, 0x000000, 0x000000, 0x723804, 0x000000,
+ 0x723c03, 0x000000, 0x723f02, 0x000000, 0x724106, 0x724718, 0x725f02, 0x000000,
+ 0x726103, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x726401, 0x000000, 0x000000, 0x726505, 0x726a01, 0x726b02, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x726d01, 0x000000, 0x726e01, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x726f01, 0x727001, 0x727102, 0x727302, 0x000000, 0x727502,
+ 0x000000, 0x000000, 0x727703, 0x727a05, 0x000000, 0x727f0a, 0x000000, 0x000000,
+ 0x000000, 0x728901, 0x000000, 0x000000, 0x728a01, 0x000000, 0x000000, 0x728b02,
+ 0x728d02, 0x728f07, 0x000000, 0x729603, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x729901, 0x729a02, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x729c02, 0x729e01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x729f01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x72a001, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x72a101, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x72a201, 0x72a301, 0x72a405, 0x000000,
+ 0x000000, 0x72a901, 0x000000, 0x000000, 0x72aa02, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x72ac07, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x72b301, 0x000000, 0x72b401, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x72b502, 0x000000, 0x000000, 0x72b70a,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x72c103, 0x000000, 0x72c405, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x72c903, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x72cc01, 0x000000, 0x000000, 0x000000, 0x72cd01, 0x000000,
+ 0x000000, 0x72ce06, 0x72d401, 0x000000, 0x72d50e, 0x72e302, 0x72e504, 0x72e901,
+ 0x72ea01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x72eb03, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x72ee0c, 0x000000, 0x000000, 0x000000, 0x72fa02, 0x000000, 0x000000, 0x000000,
+ 0x72fc02, 0x000000, 0x000000, 0x72fe02, 0x000000, 0x730002, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x730203, 0x000000, 0x730504, 0x730902, 0x730b04, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x730f05, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x731403, 0x000000, 0x000000, 0x000000, 0x731704, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x731b05,
+ 0x000000, 0x73200d, 0x000000, 0x000000, 0x000000, 0x732d04, 0x000000, 0x000000,
+ 0x000000, 0x733101, 0x000000, 0x000000, 0x000000, 0x733201, 0x733305, 0x000000,
+ 0x000000, 0x733801, 0x000000, 0x000000, 0x000000, 0x733901, 0x000000, 0x733a03,
+ 0x000000, 0x733d03, 0x734004, 0x000000, 0x734401, 0x000000, 0x000000, 0x000000,
+ 0x734502, 0x000000, 0x000000, 0x000000, 0x734704, 0x000000, 0x000000, 0x000000,
+ 0x734b02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x734d01, 0x000000, 0x734e01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x734f01, 0x735008, 0x735801, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x735901, 0x000000, 0x000000, 0x735a07,
+ 0x736102, 0x000000, 0x736302, 0x000000, 0x000000, 0x000000, 0x736501, 0x000000,
+ 0x736601, 0x736703, 0x736a01, 0x000000, 0x000000, 0x736b01, 0x000000, 0x000000,
+ 0x000000, 0x736c01, 0x000000, 0x000000, 0x000000, 0x736d02, 0x000000, 0x000000,
+ 0x736f06, 0x000000, 0x000000, 0x000000, 0x000000, 0x737503, 0x737801, 0x000000,
+ 0x737902, 0x737b01, 0x000000, 0x000000, 0x737c01, 0x000000, 0x000000, 0x737d0c,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x738906, 0x738f02, 0x739105, 0x739602, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x739801, 0x739903, 0x000000, 0x000000, 0x739c10, 0x000000,
+ 0x000000, 0x73ac01, 0x000000, 0x73ad01, 0x000000, 0x73ae01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x73af01, 0x73b008, 0x000000, 0x000000, 0x73b807, 0x000000,
+ 0x000000, 0x000000, 0x73bf01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x73c001, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x73c101, 0x73c202, 0x73c401, 0x000000, 0x73c503, 0x000000, 0x73c802, 0x73ca01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x73cb01, 0x000000,
+ 0x73cc04, 0x000000, 0x73d001, 0x000000, 0x000000, 0x000000, 0x73d103, 0x000000,
+ 0x73d403, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x73d703,
+ 0x73da01, 0x000000, 0x000000, 0x73db01, 0x000000, 0x000000, 0x000000, 0x73dc03,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x73df07, 0x000000, 0x000000,
+ 0x000000, 0x73e602, 0x73e802, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x73ea02, 0x000000, 0x73ec02, 0x73ee05, 0x000000, 0x000000,
+ 0x73f301, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x73f402, 0x000000,
+ 0x000000, 0x000000, 0x73f601, 0x000000, 0x000000, 0x000000, 0x73f701, 0x000000,
+ 0x73f801, 0x73f90a, 0x740301, 0x000000, 0x740401, 0x000000, 0x000000, 0x000000,
+ 0x740504, 0x000000, 0x74090e, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x741701, 0x000000, 0x741806, 0x000000, 0x741e06, 0x000000,
+ 0x742401, 0x742510, 0x000000, 0x74350b, 0x744002, 0x000000, 0x744201, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x744301, 0x000000, 0x000000, 0x744406,
+ 0x000000, 0x000000, 0x000000, 0x744a01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x744b01, 0x000000, 0x000000, 0x000000, 0x744c01, 0x744d01, 0x744e2f, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x747d02, 0x000000, 0x000000, 0x000000, 0x747f01, 0x000000,
+ 0x748002, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x748202, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x748403,
+ 0x000000, 0x748702, 0x748901, 0x000000, 0x000000, 0x748a02, 0x000000, 0x000000,
+ 0x748c01, 0x748d05, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x749201, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x749301, 0x749404, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x749814, 0x000000, 0x000000, 0x74ac03,
+ 0x74af12, 0x74c10f, 0x74d002, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x74d20e, 0x74e001, 0x000000, 0x74e101, 0x000000, 0x000000, 0x74e203, 0x74e512,
+ 0x74f702, 0x74f901, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x74fa01, 0x74fb03, 0x000000, 0x000000, 0x000000, 0x74fe02, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x750003, 0x000000, 0x000000, 0x750301,
+ 0x000000, 0x750405, 0x000000, 0x000000, 0x750909, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x751201, 0x000000, 0x000000, 0x000000, 0x751306, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x751901, 0x000000, 0x751a0d, 0x75270f, 0x753601,
+ 0x753702, 0x753903, 0x000000, 0x000000, 0x000000, 0x753c01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x753d02, 0x753f01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x754006,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x754608, 0x754e02, 0x000000,
+ 0x000000, 0x755001, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x755104, 0x000000, 0x755501, 0x000000,
+ 0x755601, 0x000000, 0x75571b, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x757201, 0x757301, 0x000000, 0x000000, 0x000000, 0x757403, 0x000000,
+ 0x757701, 0x000000, 0x000000, 0x000000, 0x757802, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x757a04, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x757e01, 0x000000, 0x000000, 0x757f02, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x758102, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x758306, 0x758901, 0x000000,
+ 0x000000, 0x758a07, 0x000000, 0x000000, 0x000000, 0x000000, 0x759114, 0x75a501,
+ 0x000000, 0x75a602, 0x000000, 0x75a809, 0x75b101, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x75b201, 0x75b301, 0x75b402, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x75b601, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x75b701,
+ 0x000000, 0x000000, 0x75b801, 0x75b901, 0x000000, 0x000000, 0x000000, 0x75ba07,
+ 0x75c101, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x75c201, 0x000000,
+ 0x000000, 0x75c303, 0x75c611, 0x000000, 0x000000, 0x000000, 0x75d704, 0x000000,
+ 0x75db01, 0x75dc07, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x75e301, 0x75e40b, 0x000000, 0x75ef02, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x75f102, 0x75f303, 0x000000,
+ 0x000000, 0x75f603, 0x000000, 0x000000, 0x75f901, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x75fa0a, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x760403, 0x000000, 0x000000, 0x000000,
+ 0x760701, 0x000000, 0x000000, 0x760801, 0x000000, 0x000000, 0x000000, 0x760901,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x760a01, 0x000000, 0x760b02, 0x000000,
+ 0x760d05, 0x761204, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x761602,
+ 0x000000, 0x000000, 0x761802, 0x761a03, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x761d02, 0x000000, 0x761f03, 0x762202, 0x762405, 0x000000, 0x762902, 0x762b11,
+ 0x000000, 0x000000, 0x000000, 0x763c02, 0x000000, 0x000000, 0x763e01, 0x763f06,
+ 0x000000, 0x000000, 0x000000, 0x764502, 0x764702, 0x000000, 0x000000, 0x764902,
+ 0x000000, 0x764b0a, 0x000000, 0x765501, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x765601, 0x765702, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x765901,
+ 0x765a03, 0x765d02, 0x765f02, 0x76610a, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x766b01, 0x766c01, 0x000000, 0x000000, 0x000000, 0x766d01,
+ 0x000000, 0x000000, 0x000000, 0x766e01, 0x000000, 0x766f02, 0x767104, 0x767501,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x767605, 0x000000, 0x767b10,
+ 0x768b01, 0x768c07, 0x000000, 0x000000, 0x769301, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x769401, 0x000000, 0x769501,
+ 0x000000, 0x769601, 0x769705, 0x000000, 0x000000, 0x769c01, 0x769d0c, 0x76a901,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x76aa02, 0x000000, 0x000000, 0x76ac04,
+ 0x000000, 0x76b003, 0x000000, 0x76b309, 0x76bc04, 0x000000, 0x000000, 0x000000,
+ 0x76c002, 0x000000, 0x000000, 0x000000, 0x000000, 0x76c201, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x76c301, 0x000000, 0x000000, 0x76c401, 0x000000,
+ 0x76c502, 0x76c701, 0x000000, 0x76c801, 0x000000, 0x76c907, 0x000000, 0x000000,
+ 0x000000, 0x76d001, 0x000000, 0x000000, 0x76d101, 0x76d201, 0x000000, 0x76d304,
+ 0x000000, 0x76d703, 0x000000, 0x000000, 0x000000, 0x76da03, 0x76dd02, 0x76df01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x76e003, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x76e301, 0x000000, 0x76e401, 0x76e503, 0x000000,
+ 0x76e801, 0x76e903, 0x000000, 0x000000, 0x000000, 0x76ec07, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x76f304, 0x76f701, 0x76f801, 0x000000, 0x000000, 0x000000,
+ 0x76f906, 0x000000, 0x76ff03, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x770202, 0x000000, 0x770408, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x770c07, 0x000000, 0x000000, 0x771301, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x771401, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x771501, 0x77160a, 0x772001, 0x772107, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x772803, 0x000000,
+ 0x772b01, 0x000000, 0x000000, 0x000000, 0x772c01, 0x772d04, 0x000000, 0x773102,
+ 0x773307, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x773a01, 0x000000, 0x773b01, 0x000000,
+ 0x773c0c, 0x000000, 0x000000, 0x000000, 0x000000, 0x774801, 0x000000, 0x000000,
+ 0x77490f, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x775802, 0x000000,
+ 0x000000, 0x775a01, 0x775b02, 0x775d01, 0x775e01, 0x775f01, 0x000000, 0x000000,
+ 0x776001, 0x000000, 0x776101, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x776207, 0x776901, 0x776a0f, 0x000000, 0x777901,
+ 0x777a03, 0x000000, 0x000000, 0x777d04, 0x000000, 0x000000, 0x778111, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x779201, 0x77930b, 0x779e0b, 0x77a902, 0x000000,
+ 0x000000, 0x77ab04, 0x77af0f, 0x77be01, 0x77bf01, 0x000000, 0x77c001, 0x000000,
+ 0x000000, 0x77c10b, 0x77cc01, 0x000000, 0x77cd06, 0x000000, 0x77d302, 0x77d501,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x77d610,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x77e603, 0x000000, 0x000000, 0x77e902, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x77eb01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x77ec01, 0x000000, 0x77ed01, 0x77ee04, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x77f202, 0x000000, 0x000000, 0x000000, 0x77f401, 0x000000, 0x000000, 0x77f509,
+ 0x77fe0a, 0x780802, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x780a02, 0x000000, 0x000000, 0x780c01, 0x000000,
+ 0x000000, 0x000000, 0x780d02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x780f01, 0x781003, 0x000000, 0x000000, 0x000000, 0x781303, 0x000000, 0x000000,
+ 0x000000, 0x781603, 0x000000, 0x781901, 0x000000, 0x781a01, 0x781b03, 0x000000,
+ 0x000000, 0x781e01, 0x781f01, 0x782001, 0x000000, 0x000000, 0x000000, 0x782106,
+ 0x000000, 0x000000, 0x782703, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x782a01, 0x000000, 0x782b02, 0x000000, 0x000000, 0x782d03,
+ 0x000000, 0x783001, 0x783101, 0x783203, 0x783503, 0x783802, 0x000000, 0x000000,
+ 0x783a01, 0x783b01, 0x783c09, 0x000000, 0x000000, 0x000000, 0x000000, 0x784502,
+ 0x000000, 0x000000, 0x000000, 0x784712, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x785902, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x785b07, 0x786204, 0x000000, 0x000000, 0x786601, 0x786701, 0x000000, 0x786802,
+ 0x000000, 0x786a01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x786b02, 0x000000, 0x000000, 0x786d04, 0x000000, 0x000000, 0x000000, 0x787101,
+ 0x000000, 0x787202, 0x000000, 0x787401, 0x787507, 0x000000, 0x787c01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x787d01, 0x787e02, 0x000000, 0x000000,
+ 0x788002, 0x000000, 0x788201, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x788306, 0x788901, 0x000000, 0x000000, 0x788a06, 0x000000, 0x789001, 0x000000,
+ 0x000000, 0x789102, 0x000000, 0x000000, 0x789301, 0x000000, 0x000000, 0x78940c,
+ 0x000000, 0x000000, 0x000000, 0x78a002, 0x78a206, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x78a802, 0x000000, 0x78aa03, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x78ad01, 0x000000, 0x78ae02, 0x000000, 0x78b001, 0x000000, 0x78b106,
+ 0x000000, 0x000000, 0x000000, 0x78b702, 0x78b903, 0x000000, 0x78bc01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x78bd05, 0x000000, 0x000000,
+ 0x000000, 0x78c212, 0x78d409, 0x78dd01, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x78de02, 0x000000, 0x000000, 0x78e001, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x78e101, 0x000000, 0x000000, 0x78e208, 0x000000, 0x000000,
+ 0x78ea01, 0x78eb04, 0x000000, 0x000000, 0x78ef01, 0x000000, 0x000000, 0x78f001,
+ 0x78f104, 0x78f503, 0x000000, 0x000000, 0x78f805, 0x78fd02, 0x000000, 0x000000,
+ 0x000000, 0x78ff01, 0x000000, 0x000000, 0x790001, 0x000000, 0x790104, 0x79050c,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x791101,
+ 0x791203, 0x791502, 0x000000, 0x791701, 0x000000, 0x000000, 0x791802, 0x000000,
+ 0x000000, 0x791a02, 0x791c01, 0x000000, 0x000000, 0x791d05, 0x792203, 0x000000,
+ 0x000000, 0x792502, 0x000000, 0x792702, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x792902, 0x000000, 0x000000, 0x792b03, 0x792e01, 0x792f01, 0x793002, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x793201, 0x793301, 0x793403,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x793704, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x793b01, 0x793c01, 0x793d03, 0x000000, 0x000000, 0x000000,
+ 0x794002, 0x794202, 0x794402, 0x000000, 0x794601, 0x000000, 0x000000, 0x000000,
+ 0x794701, 0x000000, 0x794804, 0x000000, 0x000000, 0x000000, 0x794c01, 0x794d01,
+ 0x794e08, 0x000000, 0x000000, 0x795603, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x795902, 0x000000, 0x795b03, 0x795e01, 0x000000, 0x000000, 0x000000,
+ 0x795f01, 0x796002, 0x000000, 0x000000, 0x000000, 0x000000, 0x796201, 0x000000,
+ 0x000000, 0x796301, 0x000000, 0x000000, 0x000000, 0x796402, 0x796601, 0x000000,
+ 0x796707, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x796e37, 0x000000, 0x79a502, 0x000000, 0x79a701,
+ 0x000000, 0x000000, 0x79a801, 0x79a901, 0x79aa02, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x79ac02, 0x000000, 0x79ae01, 0x79af0a, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x79b909, 0x79c203,
+ 0x79c501, 0x79c601, 0x000000, 0x000000, 0x000000, 0x79c703, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x79ca07, 0x000000, 0x000000,
+ 0x000000, 0x79d106, 0x000000, 0x000000, 0x000000, 0x79d703, 0x79da01, 0x000000,
+ 0x000000, 0x79db02, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x79dd01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x79de06, 0x000000, 0x000000, 0x000000, 0x79e406, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x79ea04, 0x79ee10, 0x000000, 0x000000, 0x000000, 0x000000, 0x79fe01,
+ 0x000000, 0x79ff01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x7a0003, 0x7a0311, 0x7a1401, 0x000000,
+ 0x7a1501, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x7a1602,
+ 0x000000, 0x000000, 0x7a1801, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x7a1901, 0x7a1a01, 0x000000, 0x000000,
+ 0x7a1b01, 0x000000, 0x7a1c01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x7a1d01, 0x7a1e01, 0x000000, 0x000000, 0x7a1f02, 0x000000, 0x7a2101, 0x000000,
+ 0x7a220e, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x7a3001, 0x000000,
+ 0x7a3102, 0x000000, 0x7a3301, 0x000000, 0x000000, 0x7a3402, 0x7a3601, 0x7a3702,
+ 0x000000, 0x000000, 0x7a3902, 0x000000, 0x000000, 0x000000, 0x7a3b03, 0x7a3e04,
+ 0x000000, 0x7a4201, 0x000000, 0x7a4302, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x7a4501, 0x000000, 0x000000, 0x000000, 0x000000, 0x7a4601, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x7a4701, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x7a4803, 0x7a4b01, 0x7a4c06, 0x7a5202, 0x000000,
+ 0x7a5406, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x7a5a01, 0x000000,
+ 0x7a5b01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x7a5c02, 0x7a5e04,
+ 0x000000, 0x000000, 0x7a6202, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x7a6403, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x7a6701, 0x000000,
+ 0x000000, 0x7a6801, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x7a6901, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x7a6a03, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x7a6d03, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x7a7002, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x7a7201, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x7a7302, 0x000000, 0x000000, 0x7a7501, 0x7a7601, 0x000000,
+ 0x7a7702, 0x000000, 0x000000, 0x7a7901, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x7a7a01, 0x000000, 0x000000, 0x7a7b07, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x7a8209, 0x000000,
+ 0x7a8b01, 0x000000, 0x000000, 0x7a8c03, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x7a8f0c, 0x000000, 0x7a9b01,
+ 0x000000, 0x7a9c03, 0x000000, 0x7a9f09, 0x000000, 0x7aa804, 0x000000, 0x7aac02,
+ 0x7aae01, 0x7aaf01, 0x000000, 0x7ab004, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x7ab402, 0x7ab601, 0x000000, 0x000000, 0x000000, 0x7ab702,
+ 0x7ab904, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x7abd01,
+ 0x7abe01, 0x000000, 0x000000, 0x7abf01, 0x000000, 0x7ac007, 0x7ac701, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x7ac801, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x7ac901, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x7aca03, 0x000000, 0x000000, 0x000000, 0x000000, 0x7acd04, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x7ad102, 0x000000, 0x7ad304, 0x000000, 0x7ad703, 0x000000, 0x000000, 0x7ada01,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x7adb09, 0x000000, 0x7ae404, 0x7ae801,
+ 0x000000, 0x000000, 0x7ae901, 0x000000, 0x000000, 0x7aea01, 0x000000, 0x000000,
+ 0x7aeb01, 0x000000, 0x000000, 0x000000, 0x7aec04, 0x7af003, 0x000000, 0x7af30d,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x7b0001, 0x7b0102, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x7b0301, 0x7b0401, 0x7b0507,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x7b0c03, 0x7b0f01, 0x7b1004, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x7b1401, 0x000000, 0x000000, 0x000000, 0x000000, 0x7b1501, 0x000000, 0x000000,
+ 0x7b1602, 0x000000, 0x000000, 0x7b1801, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x7b1908, 0x000000, 0x7b210e,
+ 0x7b2f03, 0x7b3201, 0x7b3301, 0x000000, 0x7b3405, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x7b3907, 0x7b4006, 0x7b4601, 0x000000, 0x000000,
+ 0x000000, 0x7b4701, 0x7b4801, 0x7b4902, 0x000000, 0x000000, 0x7b4b03, 0x7b4e02,
+ 0x000000, 0x7b5001, 0x000000, 0x000000, 0x000000, 0x7b5101, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x7b5201, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x7b5302, 0x7b5506, 0x7b5b01, 0x7b5c01, 0x000000, 0x000000, 0x7b5d02,
+ 0x7b5f01, 0x7b6001, 0x7b6109, 0x7b6a01, 0x000000, 0x7b6b01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x7b6c02, 0x000000, 0x7b6e01, 0x000000, 0x7b6f01, 0x7b7002,
+ 0x000000, 0x000000, 0x7b7201, 0x7b7304, 0x000000, 0x000000, 0x7b7702, 0x7b7901,
+ 0x000000, 0x000000, 0x000000, 0x7b7a04, 0x000000, 0x7b7e01, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x7b7f01, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x7b8001, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x7b8103,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x7b8401, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x7b8503, 0x7b8802, 0x000000, 0x000000, 0x000000, 0x000000, 0x7b8a0e, 0x000000,
+ 0x7b9801, 0x000000, 0x000000, 0x7b9901, 0x000000, 0x000000, 0x7b9a01, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x7b9b02, 0x000000, 0x7b9d02, 0x000000, 0x000000, 0x000000, 0x000000, 0x7b9f04,
+ 0x000000, 0x000000, 0x000000, 0x7ba305, 0x000000, 0x000000, 0x000000, 0x7ba813,
+ 0x000000, 0x000000, 0x7bbb0d, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x7bc802, 0x7bca01, 0x7bcb02, 0x000000, 0x7bcd02, 0x000000,
+ 0x000000, 0x000000, 0x7bcf06, 0x000000, 0x7bd501, 0x000000, 0x7bd602, 0x000000,
+};
+
+#include "static_dict_lut2.h"
+}  // namespace brotli
+
+#endif  // BROTLI_ENC_DICTIONARY_LUT_H_
diff --git a/third_party/brotli/enc/static_dict_lut2.h b/third_party/brotli/enc/static_dict_lut2.h
new file mode 100644
index 0000000..4bdb9df
--- /dev/null
+++ b/third_party/brotli/enc/static_dict_lut2.h
@@ -0,0 +1,7934 @@
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+static const DictWord kStaticDictionaryWords[] = {
+  {  8,  0,  1002 }, {  8,  0,  1015 }, {  4,  0,   683 }, {  4, 10,   325 },
+  { 10, 10,   125 }, {  7, 11,   572 }, {  9, 11,   592 }, { 11, 11,   680 },
+  { 11, 11,   842 }, { 11, 11,   924 }, { 12, 11,   356 }, { 12, 11,   550 },
+  { 13, 11,   317 }, { 13, 11,   370 }, { 13, 11,   469 }, { 13, 11,   471 },
+  { 14, 11,   397 }, { 18, 11,    69 }, { 18, 11,   145 }, {  6,  0,  1265 },
+  {  8, 11,   534 }, {  6,  0,  1431 }, { 11,  0,   138 }, { 12,  0,    40 },
+  {  4,  0,   155 }, {  7,  0,  1689 }, {  4, 10,   718 }, {  7, 10,  1216 },
+  {  4,  0,   245 }, {  5,  0,   151 }, {  5,  0,   741 }, {  6,  0,  1147 },
+  {  7,  0,   498 }, {  7,  0,   870 }, {  7,  0,  1542 }, { 12,  0,   213 },
+  { 14,  0,    36 }, { 14,  0,   391 }, { 17,  0,   111 }, { 18,  0,     6 },
+  { 18,  0,    46 }, { 18,  0,   151 }, { 19,  0,    36 }, { 20,  0,    32 },
+  { 20,  0,    56 }, { 20,  0,    69 }, { 20,  0,   102 }, { 21,  0,     4 },
+  { 22,  0,     8 }, { 22,  0,    10 }, { 22,  0,    14 }, { 22,  0,    31 },
+  {  4,  0,   624 }, {  7,  0,  1752 }, {  5, 10,   124 }, {  5, 10,   144 },
+  {  6, 10,   548 }, {  7, 10,    15 }, {  7, 10,   153 }, {  9, 10,   629 },
+  {  6,  0,   503 }, {  9,  0,   586 }, { 13,  0,   468 }, { 14,  0,    66 },
+  { 16,  0,    58 }, {  7, 10,  1531 }, {  8, 10,   416 }, {  9, 10,   275 },
+  { 10, 10,   100 }, { 11, 10,   658 }, { 11, 10,   979 }, { 12, 10,    86 },
+  { 14, 10,   207 }, { 15, 10,    20 }, { 15, 10,    25 }, {  5,  0,   603 },
+  {  7,  0,  1212 }, {  9,  0,   565 }, { 14,  0,   301 }, {  5, 10,   915 },
+  {  6, 10,  1783 }, {  7, 10,   211 }, {  7, 10,  1353 }, {  9, 10,    83 },
+  { 10, 10,   376 }, { 10, 10,   431 }, { 11, 10,   543 }, { 12, 10,   664 },
+  { 13, 10,   280 }, { 13, 10,   428 }, { 14, 10,   128 }, { 17, 10,    52 },
+  { 17, 10,    81 }, {  4,  0,   492 }, {  5,  0,   451 }, {  7,  0,   835 },
+  { 13,  0,    70 }, {  4,  0,   539 }, {  7, 11,   748 }, { 11, 11,   700 },
+  {  7, 11,  1517 }, { 11, 11,   597 }, { 14, 11,    76 }, { 14, 11,   335 },
+  { 20, 11,    33 }, {  6,  0,   113 }, {  7,  0,   436 }, {  4, 10,   338 },
+  {  5, 10,   400 }, {  8,  0,   718 }, {  5, 11,   127 }, {  5, 11,   418 },
+  {  6,  0,  1505 }, {  7,  0,   520 }, {  6, 11,   198 }, { 11, 10,   892 },
+  { 12, 11,    83 }, {  4, 10,   221 }, {  5, 10,   659 }, {  5, 10,   989 },
+  {  7, 10,   697 }, {  7, 10,  1211 }, { 10, 10,   284 }, {  7,  0,  1070 },
+  {  5, 11,   276 }, {  6, 11,    55 }, {  7, 11,  1369 }, {  6,  0,  1515 },
+  {  6, 11,  1752 }, {  8, 11,   726 }, { 10, 10,   507 }, { 15,  0,    78 },
+  {  4, 10,   188 }, {  7, 10,   805 }, {  5, 10,   884 }, { 11, 10,   991 },
+  {  5, 11,   764 }, {  6, 10,  1653 }, {  6, 11,   309 }, {  7, 11,   331 },
+  { 10, 11,   550 }, {  7, 11,  1861 }, {  4, 11,   348 }, {  7, 11,   986 },
+  {  7, 11,  1573 }, { 12,  0,   610 }, { 13,  0,   431 }, { 16,  0,    59 },
+  {  9, 11,   799 }, { 12, 10,   166 }, {  6,  0,  1530 }, {  4,  0,   750 },
+  {  4,  0,   307 }, {  5,  0,   964 }, {  6, 11,   194 }, {  7, 11,   133 },
+  { 10, 11,   493 }, { 10, 11,   570 }, { 11, 11,   664 }, {  5, 11,    24 },
+  {  5, 11,   569 }, {  6, 11,     3 }, {  6, 11,   119 }, {  6, 11,   143 },
+  {  6, 11,   440 }, {  7, 11,   295 }, {  7, 11,   599 }, {  7, 11,  1686 },
+  {  7, 11,  1854 }, {  8, 11,   424 }, {  9, 11,    43 }, {  9, 11,   584 },
+  {  9, 11,   760 }, { 10, 11,   148 }, { 10, 11,   328 }, { 11, 11,   159 },
+  { 11, 11,   253 }, { 11, 11,   506 }, { 12, 11,   487 }, { 12, 11,   531 },
+  { 16, 11,    33 }, {  8, 10,   760 }, {  5, 11,    14 }, {  5, 11,   892 },
+  {  6, 11,   283 }, {  7, 11,   234 }, {  8, 11,   537 }, {  7, 11,  1251 },
+  {  4, 11,   126 }, {  8, 11,   635 }, { 19, 11,    34 }, {  4, 11,   316 },
+  {  7, 11,  1561 }, {  6,  0,   999 }, {  6,  0,  1310 }, {  9, 11,   861 },
+  {  4, 11,    64 }, {  5, 11,   352 }, {  5, 11,   720 }, {  6, 11,   368 },
+  { 11, 11,   359 }, {  4,  0,    75 }, {  5,  0,   180 }, {  6,  0,   500 },
+  {  7,  0,    58 }, {  7,  0,   710 }, { 10,  0,   645 }, {  8, 10,   770 },
+  {  5,  0,   649 }, {  6,  0,   276 }, {  7,  0,   282 }, {  7,  0,   879 },
+  {  7,  0,   924 }, {  8,  0,   459 }, {  9,  0,   599 }, {  9,  0,   754 },
+  { 11,  0,   574 }, { 12,  0,   128 }, { 12,  0,   494 }, { 13,  0,    52 },
+  { 13,  0,   301 }, { 15,  0,    30 }, { 15,  0,   132 }, {  4,  0,   200 },
+  {  4, 10,    89 }, {  5, 10,   489 }, {  6, 10,   315 }, {  7, 10,   553 },
+  {  7, 10,  1745 }, { 10, 10,   243 }, {  7, 11,  1050 }, {  7,  0,  1621 },
+  {  6, 10,  1658 }, {  9, 10,     3 }, { 10, 10,   154 }, { 11, 10,   641 },
+  { 13, 10,    85 }, { 13, 10,   201 }, { 13, 10,   346 }, {  6, 11,   175 },
+  {  9, 11,   289 }, {  5, 11,   432 }, {  5, 11,   913 }, {  6,  0,   225 },
+  {  9,  0,   211 }, {  7,  0,   718 }, {  8,  0,   687 }, { 11,  0,   374 },
+  {  4, 10,   166 }, {  5, 10,   505 }, {  9,  0,   110 }, {  6, 10,  1670 },
+  {  8,  0,    58 }, {  9,  0,   724 }, { 11,  0,   809 }, { 13,  0,   113 },
+  { 17,  0,    72 }, {  6,  0,   345 }, {  7,  0,  1247 }, { 16, 11,    82 },
+  {  5, 11,   931 }, {  6, 11,  1698 }, {  8,  0,   767 }, {  8,  0,   803 },
+  {  9,  0,   301 }, {  9,  0,   903 }, { 11,  0,   203 }, {  6,  0,  1154 },
+  {  7,  0,  1949 }, {  8,  0,   674 }, {  6,  0,   259 }, {  7,  0,  1275 },
+  {  5, 11,   774 }, {  6, 11,  1637 }, {  6, 11,  1686 }, {  6, 11,  1751 },
+  {  6,  0,  1231 }, {  7, 10,   445 }, {  8, 10,   307 }, {  8, 10,   704 },
+  { 10, 10,    41 }, { 10, 10,   439 }, { 11, 10,   237 }, { 11, 10,   622 },
+  { 12, 10,   201 }, {  8,  0,   254 }, {  6, 11,   260 }, {  7, 11,  1484 },
+  { 11,  0,   277 }, {  7, 10,  1977 }, {  4, 10,   189 }, {  5, 10,   713 },
+  {  6, 11,   573 }, {  8, 10,    57 }, { 10, 10,   371 }, {  4, 10,   552 },
+  {  6, 11,   344 }, {  5,  0,   248 }, {  9,  0,   800 }, { 10,  0,   693 },
+  { 11,  0,   482 }, { 11,  0,   734 }, { 11,  0,   789 }, {  6, 11,   240 },
+  {  4,  0,   116 }, {  5,  0,    95 }, {  5,  0,   445 }, {  7,  0,  1688 },
+  {  8,  0,    29 }, {  9,  0,   272 }, { 11,  0,   509 }, { 11,  0,   915 },
+  {  4, 11,   292 }, {  4, 11,   736 }, {  5, 11,   871 }, {  6, 11,   171 },
+  {  6, 11,  1689 }, {  7, 11,  1324 }, {  7, 11,  1944 }, {  9, 11,   415 },
+  {  9, 11,   580 }, { 14, 11,   230 }, { 18, 11,    68 }, {  7,  0,   490 },
+  { 13,  0,   100 }, { 15,  0,    75 }, {  7,  0,  1641 }, {  5,  0,   543 },
+  {  7, 11,   209 }, {  8, 11,   661 }, { 10, 11,    42 }, { 11, 11,    58 },
+  { 12, 11,    58 }, { 12, 11,   118 }, { 13, 11,    32 }, {  5,  0,   181 },
+  {  8,  0,    41 }, {  6, 11,    63 }, {  7, 11,   920 }, {  5,  0,   657 },
+  {  5, 11,   793 }, { 10,  0,   709 }, {  7,  0,    25 }, {  8,  0,   202 },
+  { 10,  0,   536 }, {  5, 11,   665 }, {  7, 10,  1788 }, { 17, 10,    49 },
+  {  9,  0,   423 }, { 12,  0,    89 }, {  5, 11,    67 }, {  6, 11,    62 },
+  {  6, 11,   374 }, {  7, 11,  1391 }, {  8,  0,   113 }, {  9,  0,   877 },
+  { 10,  0,   554 }, { 11,  0,    83 }, { 12,  0,   136 }, { 19,  0,   109 },
+  {  9, 11,   790 }, { 12, 11,    47 }, { 10, 10,   661 }, {  4,  0,   963 },
+  { 10,  0,   927 }, { 14,  0,   442 }, {  7, 10,  1945 }, {  5,  0,   976 },
+  {  4,  0,   206 }, {  4, 11,   391 }, {  7, 11,  1169 }, {  6,  0,  2002 },
+  {  6,  0,   696 }, {  6,  0,  1008 }, {  6,  0,  1170 }, {  4, 11,   271 },
+  {  7,  0,    13 }, {  8,  0,   226 }, { 10,  0,   537 }, { 11,  0,   570 },
+  { 11,  0,   605 }, { 11,  0,   799 }, { 11,  0,   804 }, { 12,  0,    85 },
+  { 12,  0,   516 }, { 12,  0,   623 }, { 13,  0,   112 }, { 13,  0,   361 },
+  { 14,  0,    77 }, { 14,  0,    78 }, { 17,  0,    28 }, { 19,  0,   110 },
+  { 12, 11,   314 }, {  4,  0,   769 }, {  6,  0,  1544 }, {  4,  0,   551 },
+  {  9,  0,   678 }, {  5, 10,    84 }, {  6, 10,   163 }, {  9,  0,    57 },
+  {  9,  0,   459 }, { 10,  0,   425 }, { 11,  0,   119 }, { 12,  0,   184 },
+  { 12,  0,   371 }, { 13,  0,   358 }, { 17,  0,    51 }, {  5,  0,   188 },
+  {  5,  0,   814 }, {  8,  0,    10 }, {  9,  0,   421 }, {  9,  0,   729 },
+  { 10,  0,   609 }, { 11,  0,   689 }, {  4, 11,   253 }, {  5, 10,   410 },
+  {  5, 11,   544 }, {  7, 11,   300 }, {  9, 11,   340 }, {  6,  0,   624 },
+  { 10, 11,   321 }, {  7,  0,  1941 }, { 18,  0,   130 }, {  5, 10,   322 },
+  {  8, 10,   186 }, {  9, 10,   262 }, { 10, 10,   187 }, { 14, 10,   208 },
+  {  5, 11,    53 }, {  5, 11,   541 }, {  6, 11,    94 }, {  6, 11,   499 },
+  {  7, 11,   230 }, { 11, 11,   321 }, {  5, 10,   227 }, {  4,  0,   378 },
+  {  4, 11,   920 }, {  5, 11,    25 }, {  5, 11,   790 }, {  6, 11,   457 },
+  {  7, 11,   853 }, {  9,  0,   269 }, {  4,  0,   528 }, {  6,  0,  1146 },
+  {  7, 10,  1395 }, {  8, 10,   486 }, {  9, 10,   236 }, {  9, 10,   878 },
+  { 10, 10,   218 }, { 11, 10,    95 }, { 19, 10,    17 }, { 19, 10,    31 },
+  {  7, 10,  2043 }, {  8, 10,   672 }, { 13, 10,   448 }, {  6,  0,  1105 },
+  {  6,  0,  1616 }, {  6, 11,  1765 }, { 12, 11,   163 }, {  5, 10,   412 },
+  {  5, 11,   822 }, {  4, 11,   634 }, {  6,  0,   656 }, {  6, 11,  1730 },
+  {  6,  0,  1940 }, {  5,  0,   104 }, {  6,  0,   173 }, {  7,  0,  1631 },
+  {  8, 10,   562 }, {  6, 11,    36 }, {  7, 11,   658 }, {  8, 11,   454 },
+  { 19, 11,    86 }, {  5,  0,   457 }, {  6, 10,  1771 }, {  7,  0,   810 },
+  {  8,  0,   138 }, {  8,  0,   342 }, {  9,  0,    84 }, { 10,  0,   193 },
+  { 11,  0,   883 }, { 12,  0,   359 }, {  9,  0,   620 }, {  7, 10,  1190 },
+  {  9, 10,   132 }, {  7, 11,   975 }, {  9, 11,   789 }, {  6,  0,    95 },
+  {  6,  0,  1934 }, {  8,  0,   967 }, { 13, 11,   335 }, {  6,  0,   406 },
+  { 10,  0,   409 }, { 10,  0,   447 }, { 11,  0,    44 }, { 12,  0,   100 },
+  {  4, 10,   317 }, {  7, 10,  1279 }, {  4,  0,   477 }, {  6,  0,  1268 },
+  {  6,  0,  1941 }, {  8,  0,   944 }, {  5, 10,    63 }, {  5, 10,   509 },
+  {  4,  0,   629 }, {  4, 11,   104 }, {  4,  0,   246 }, {  5,  0,   375 },
+  {  6,  0,  1636 }, {  4, 10,   288 }, {  7, 11,  1614 }, {  9,  0,    49 },
+  { 10,  0,   774 }, {  8, 10,    89 }, {  8, 10,   620 }, { 11, 10,   628 },
+  { 12, 10,   322 }, { 15, 10,   124 }, {  4,  0,   282 }, {  7,  0,  1034 },
+  { 11,  0,   398 }, { 11,  0,   634 }, { 12,  0,     1 }, { 12,  0,    79 },
+  { 12,  0,   544 }, { 14,  0,   237 }, { 17,  0,    10 }, { 18,  0,    20 },
+  {  4,  0,   824 }, {  7, 11,    45 }, {  9, 11,   542 }, {  9, 11,   566 },
+  { 10, 11,   728 }, {  5,  0,   118 }, {  5,  0,   499 }, {  6,  0,   476 },
+  {  6,  0,   665 }, {  6,  0,  1176 }, {  6,  0,  1196 }, {  7,  0,   600 },
+  {  7,  0,   888 }, {  7,  0,  1096 }, {  7,  0,   296 }, {  7,  0,   596 },
+  {  8,  0,   560 }, {  8,  0,   586 }, {  9,  0,   612 }, { 11,  0,   304 },
+  { 12,  0,    46 }, { 13,  0,    89 }, { 14,  0,   112 }, { 17,  0,   122 },
+  {  5,  0,   894 }, {  6,  0,  1772 }, {  9,  0,  1009 }, { 10, 10,   120 },
+  {  5, 11,   533 }, {  7, 11,   755 }, { 10, 11,   780 }, { 23, 10,     1 },
+  {  6,  0,  1474 }, {  7, 11,    87 }, { 14, 11,   288 }, { 11,  0,   366 },
+  {  9, 10,   461 }, {  7, 11,   988 }, {  7, 11,  1939 }, {  9, 11,    64 },
+  {  9, 11,   502 }, { 12, 11,     7 }, { 12, 11,    34 }, { 13, 11,    12 },
+  { 13, 11,   234 }, { 19, 11,    77 }, {  7,  0,  1599 }, {  7,  0,  1723 },
+  {  8,  0,    79 }, {  8,  0,   106 }, {  8,  0,   190 }, {  8,  0,   302 },
+  {  8,  0,   383 }, {  8,  0,   713 }, {  9,  0,   119 }, {  9,  0,   233 },
+  {  9,  0,   419 }, {  9,  0,   471 }, { 10,  0,   181 }, { 10,  0,   406 },
+  { 11,  0,    57 }, { 11,  0,    85 }, { 11,  0,   120 }, { 11,  0,   177 },
+  { 11,  0,   296 }, { 11,  0,   382 }, { 11,  0,   454 }, { 11,  0,   758 },
+  { 11,  0,   999 }, { 12,  0,    27 }, { 12,  0,    98 }, { 12,  0,   131 },
+  { 12,  0,   245 }, { 12,  0,   312 }, { 12,  0,   446 }, { 12,  0,   454 },
+  { 13,  0,    25 }, { 13,  0,    98 }, { 13,  0,   426 }, { 13,  0,   508 },
+  { 14,  0,    70 }, { 14,  0,   163 }, { 14,  0,   272 }, { 14,  0,   277 },
+  { 14,  0,   370 }, { 15,  0,    95 }, { 15,  0,   138 }, { 15,  0,   167 },
+  { 17,  0,    38 }, { 20,  0,    96 }, {  7, 10,  1346 }, { 10,  0,   200 },
+  { 19,  0,     2 }, { 23,  0,    22 }, {  7, 11,   141 }, {  6, 10,    85 },
+  {  6,  0,  1759 }, { 10,  0,   372 }, { 17,  0,    16 }, {  8,  0,   943 },
+  {  4, 11,   619 }, { 11, 11,    88 }, {  5, 11,   246 }, {  8, 11,   189 },
+  {  9, 11,   355 }, {  9, 11,   512 }, { 10, 11,   124 }, { 10, 11,   453 },
+  { 11, 11,   143 }, { 11, 11,   416 }, { 11, 11,   859 }, { 13, 11,   341 },
+  {  5,  0,   258 }, {  6,  0,   719 }, {  6,  0,  1798 }, {  6,  0,  1839 },
+  {  8,  0,   900 }, { 10,  0,   874 }, { 10,  0,   886 }, { 12,  0,   698 },
+  { 12,  0,   732 }, { 12,  0,   770 }, { 16,  0,   106 }, { 18,  0,   163 },
+  { 18,  0,   170 }, { 18,  0,   171 }, { 24,  0,    20 }, {  9,  0,   707 },
+  { 11,  0,   326 }, { 11,  0,   339 }, { 12,  0,   423 }, { 12,  0,   502 },
+  { 20,  0,    62 }, {  9, 11,   707 }, { 11, 11,   326 }, { 11, 11,   339 },
+  { 12, 11,   423 }, { 12, 11,   502 }, { 20, 11,    62 }, {  5,  0,    30 },
+  {  7,  0,   495 }, {  8,  0,   134 }, {  9,  0,   788 }, { 12,  0,   438 },
+  {  5, 11,   678 }, {  5, 10,   279 }, {  6, 10,   235 }, {  7, 10,   468 },
+  {  8, 10,   446 }, {  9, 10,   637 }, { 10, 10,   717 }, { 11, 10,   738 },
+  { 12, 10,   514 }, {  5, 11,    35 }, {  6, 11,   287 }, {  7, 11,   862 },
+  {  7, 11,  1886 }, { 10, 11,   179 }, {  7,  0,  1948 }, {  7,  0,  2004 },
+  {  4, 11,   517 }, {  5, 10,    17 }, {  6, 10,   371 }, {  9, 10,   528 },
+  {  4,  0,   115 }, {  5,  0,   669 }, {  6,  0,   407 }, {  8,  0,   311 },
+  { 11,  0,    10 }, { 13,  0,     5 }, {  9,  0,   381 }, {  5,  0,    50 },
+  {  6,  0,   439 }, {  7,  0,   780 }, {  7,  0,  1040 }, {  8, 11,   667 },
+  { 11, 11,   403 }, { 18, 11,    83 }, {  5,  0,     1 }, {  6,  0,    81 },
+  { 10,  0,   520 }, {  6,  0,   738 }, {  5,  0,   482 }, {  8,  0,    98 },
+  {  9,  0,   172 }, { 10,  0,   360 }, { 10,  0,   700 }, { 10,  0,   822 },
+  { 11,  0,   302 }, { 11,  0,   778 }, { 12,  0,    50 }, { 12,  0,   127 },
+  { 12,  0,   396 }, { 13,  0,    62 }, { 13,  0,   328 }, { 14,  0,   122 },
+  { 19,  0,    72 }, {  9, 11,   157 }, { 10, 11,   131 }, { 12, 11,    72 },
+  {  7, 11,   714 }, {  7, 11,   539 }, {  5,  0,     2 }, {  6,  0,   512 },
+  {  7,  0,   797 }, {  7,  0,  1494 }, {  8,  0,   253 }, {  8,  0,   589 },
+  {  9,  0,    77 }, { 10,  0,     1 }, { 10,  0,   129 }, { 10,  0,   225 },
+  { 11,  0,   118 }, { 11,  0,   226 }, { 11,  0,   251 }, { 11,  0,   430 },
+  { 11,  0,   701 }, { 11,  0,   974 }, { 11,  0,   982 }, { 12,  0,    64 },
+  { 12,  0,   260 }, { 12,  0,   488 }, { 12,  0,   690 }, {  5, 11,   394 },
+  {  7, 11,   367 }, {  7, 11,   487 }, {  7, 11,   857 }, {  7, 11,  1713 },
+  {  8, 11,   246 }, {  9, 11,   537 }, { 10, 11,   165 }, { 12, 11,   219 },
+  { 12, 11,   561 }, {  8,  0,   557 }, {  5, 10,   779 }, {  5, 10,   807 },
+  {  6, 10,  1655 }, {  6, 10,  1676 }, {  4, 10,   196 }, {  5, 10,   558 },
+  {  5, 10,   949 }, { 11, 11,   827 }, { 12, 11,    56 }, { 14, 11,    34 },
+  { 15, 11,   148 }, {  9,  0,   347 }, {  5,  0,   572 }, {  6,  0,   832 },
+  {  4,  0,    12 }, {  7,  0,   504 }, {  7,  0,   522 }, {  7,  0,   809 },
+  {  8,  0,   797 }, { 13,  0,    88 }, {  4, 10,   752 }, {  5, 11,   449 },
+  {  7, 11,    86 }, {  8, 11,   103 }, { 17, 11,    69 }, {  7, 11,  2028 },
+  { 10, 11,   641 }, {  5,  0,   528 }, {  6, 11,     1 }, { 14, 11,     2 },
+  {  6,  0,   861 }, { 10,  0,   294 }, {  4, 10,   227 }, {  5, 10,   159 },
+  {  5, 10,   409 }, {  7, 10,    80 }, { 10, 10,   479 }, { 12, 10,   418 },
+  { 14, 10,    50 }, { 14, 10,   249 }, { 14, 10,   295 }, {  7, 10,  1470 },
+  {  8, 10,    66 }, {  8, 10,   137 }, {  8, 10,   761 }, {  9, 10,   638 },
+  { 11, 10,    80 }, { 11, 10,   212 }, { 11, 10,   368 }, { 11, 10,   418 },
+  { 12, 10,     8 }, { 13, 10,    15 }, { 16, 10,    61 }, { 17, 10,    59 },
+  { 19, 10,    28 }, { 20, 10,    84 }, { 20,  0,   109 }, {  7, 11,  1148 },
+  {  6, 11,   277 }, {  7, 11,  1274 }, {  7, 11,  1386 }, {  7, 11,  1392 },
+  { 12, 11,   129 }, { 18, 11,    87 }, {  6, 11,   187 }, {  7, 11,    39 },
+  {  7, 11,  1203 }, {  8, 11,   380 }, {  8, 11,   542 }, { 14, 11,   117 },
+  { 21, 11,    28 }, {  6,  0,  1187 }, {  5,  0,   266 }, {  9,  0,   290 },
+  {  9,  0,   364 }, { 10,  0,   293 }, { 11,  0,   606 }, { 14,  0,    45 },
+  {  6, 11,   297 }, {  7, 11,   793 }, { 11, 11,   938 }, {  4,  0,    50 },
+  {  6,  0,   594 }, {  9,  0,   121 }, { 10,  0,    49 }, { 10,  0,   412 },
+  { 11,  0,   834 }, {  8,  0,   748 }, {  7, 11,   464 }, {  8, 11,   438 },
+  { 11, 11,   105 }, { 11, 11,   363 }, { 12, 11,   231 }, { 14, 11,   386 },
+  { 15, 11,   102 }, { 20, 11,    75 }, {  4,  0,   466 }, { 13,  0,   399 },
+  { 14,  0,   337 }, {  6, 10,    38 }, {  7, 10,  1220 }, {  8, 10,   185 },
+  {  8, 10,   256 }, {  9, 10,    22 }, {  9, 10,   331 }, { 10, 10,   738 },
+  { 11, 10,   205 }, { 11, 10,   540 }, { 11, 10,   746 }, { 13, 10,   465 },
+  { 14, 10,   194 }, {  9,  0,   378 }, { 13,  0,   162 }, {  9,  0,   519 },
+  {  4, 10,   159 }, {  6, 10,   115 }, {  7, 10,   252 }, {  7, 10,   257 },
+  {  7, 10,  1928 }, {  8, 10,    69 }, {  9, 10,   384 }, { 10, 10,    91 },
+  { 10, 10,   615 }, { 12, 10,   375 }, { 14, 10,   235 }, { 18, 10,   117 },
+  { 19, 10,   123 }, {  5, 11,   604 }, {  5, 10,   911 }, {  8, 10,   278 },
+  {  4,  0,   667 }, {  8,  0,   351 }, {  9,  0,   322 }, {  4, 10,   151 },
+  {  7, 10,  1567 }, {  6,  0,   902 }, {  5, 10,   990 }, { 12,  0,   180 },
+  {  5, 10,   194 }, {  7, 10,  1662 }, {  9, 10,    90 }, {  4,  0,   869 },
+  {  6,  0,  1996 }, {  6,  0,   813 }, {  5, 10,   425 }, {  9, 11,   761 },
+  {  4,  0,   260 }, {  5, 10,   971 }, {  5, 11,    20 }, {  6, 11,   298 },
+  {  7, 11,   659 }, {  7, 11,  1366 }, {  9, 11,   219 }, {  4,  0,    39 },
+  {  5,  0,    36 }, {  7,  0,  1843 }, {  8,  0,   407 }, { 11,  0,   144 },
+  { 12,  0,   523 }, {  4,  0,   510 }, { 10,  0,   587 }, { 11, 10,   752 },
+  {  7,  0,    29 }, {  7,  0,    66 }, {  7,  0,  1980 }, { 10,  0,   487 },
+  { 10,  0,   809 }, { 13,  0,   260 }, { 14,  0,    82 }, { 18,  0,    63 },
+  {  9, 10,   662 }, {  5, 10,    72 }, {  6, 10,   264 }, {  7, 10,    21 },
+  {  7, 10,    46 }, {  7, 10,  2013 }, {  8, 10,   215 }, {  8, 10,   513 },
+  { 10, 10,   266 }, { 11, 10,    22 }, {  6,  0,   570 }, {  6,  0,   565 },
+  {  7,  0,  1667 }, {  4, 11,   439 }, { 10, 10,    95 }, { 11, 10,   603 },
+  { 12, 11,   242 }, { 13, 10,   443 }, { 14, 10,   160 }, { 15, 10,     4 },
+  {  6,  0,  1464 }, {  6, 10,   431 }, {  9,  0,   372 }, { 15,  0,     2 },
+  { 19,  0,    10 }, { 19,  0,    18 }, {  5, 10,   874 }, {  6, 10,  1677 },
+  { 15, 10,     0 }, {  4,  0,   787 }, {  6,  0,   380 }, { 12,  0,   399 },
+  { 21,  0,    19 }, {  7, 10,   939 }, {  7, 10,  1172 }, {  7, 10,  1671 },
+  {  9, 10,   540 }, { 10, 10,   696 }, { 11, 10,   265 }, { 11, 10,   732 },
+  { 11, 10,   928 }, { 11, 10,   937 }, { 13, 10,   438 }, {  9,  0,   200 },
+  {  4, 11,   233 }, {  4,  0,   516 }, {  6, 11,   577 }, {  4,  0,   844 },
+  { 11,  0,   887 }, { 14,  0,   365 }, { 14,  0,   375 }, {  4, 11,   482 },
+  {  8,  0,   821 }, { 12,  0,    44 }, {  7,  0,  1655 }, {  8,  0,   305 },
+  {  5, 10,   682 }, {  7, 10,  1887 }, {  7, 11,   346 }, {  4, 10,   696 },
+  {  4,  0,    10 }, {  7,  0,   917 }, { 11,  0,   786 }, {  5, 11,   795 },
+  {  6, 11,  1741 }, {  8, 11,   417 }, {  9, 11,   782 }, {  4,  0,  1016 },
+  {  6,  0,  2031 }, {  5,  0,   684 }, {  4, 10,   726 }, {  5, 10,   630 },
+  {  6,  0,  1021 }, {  6,  0,  1480 }, {  8, 10,   802 }, {  8, 10,   838 },
+  {  6,  0,    27 }, {  6,  0,   395 }, {  7, 11,   622 }, {  7, 11,   625 },
+  {  7, 11,  1750 }, {  4, 11,   203 }, {  7, 11,  1936 }, {  6, 10,   118 },
+  {  7, 10,   215 }, {  7, 10,  1521 }, { 12, 10,    11 }, {  4,  0,   813 },
+  {  8,  0,   511 }, {  7, 10,   615 }, { 10, 10,   251 }, {  7, 10,  1044 },
+  { 17,  0,    56 }, {  5, 10,   225 }, {  6,  0,   342 }, {  6,  0,   496 },
+  {  8,  0,   275 }, {  9,  0,   206 }, {  4,  0,   909 }, {  5,  0,   940 },
+  {  4,  0,   891 }, {  7, 11,   311 }, {  9, 11,   308 }, { 12, 11,   255 },
+  {  4, 10,   370 }, {  5, 10,   756 }, {  7, 10,  1326 }, {  4,  0,   687 },
+  {  6,  0,  1596 }, {  6,  0,  1342 }, {  6, 10,  1662 }, {  7, 10,    48 },
+  {  8, 10,   771 }, { 10, 10,   116 }, { 13, 10,   104 }, { 14, 10,   105 },
+  { 14, 10,   184 }, { 15, 10,   168 }, { 19, 10,    92 }, { 20, 10,    68 },
+  { 10, 10,   209 }, {  4, 11,   400 }, {  5, 11,   267 }, {  7, 11,   232 },
+  { 23, 11,    12 }, {  6,  0,    41 }, { 13,  0,   160 }, { 13, 11,   314 },
+  {  6,  0,  1718 }, {  8,  0,   778 }, { 14, 11,   261 }, {  6,  0,  1610 },
+  {  5,  0,   115 }, {  4,  0,   294 }, { 14,  0,   314 }, {  4, 10,   120 },
+  {  4,  0,   983 }, {  5,  0,   193 }, { 12,  0,   178 }, { 10, 10,   429 },
+  {  5, 10,   820 }, {  7, 10,   931 }, {  6,  0,   994 }, {  6,  0,  1051 },
+  {  6,  0,  1439 }, {  7,  0,   174 }, {  5, 11,   732 }, {  4, 11,   100 },
+  {  7, 11,   679 }, {  8, 11,   313 }, { 10, 10,   199 }, {  6, 10,   151 },
+  {  6, 10,  1675 }, {  7, 10,   383 }, { 23, 10,    10 }, {  6,  0,  1796 },
+  {  8,  0,   848 }, {  8,  0,   867 }, {  8,  0,   907 }, { 10,  0,   855 },
+  { 12,  0,   703 }, { 12,  0,   221 }, {  4,  0,   122 }, {  5,  0,   796 },
+  {  5,  0,   952 }, {  6,  0,  1660 }, {  6,  0,  1671 }, {  8,  0,   567 },
+  {  9,  0,   687 }, {  9,  0,   742 }, { 10,  0,   686 }, { 11,  0,   682 },
+  { 11,  0,   909 }, { 12,  0,   281 }, {  5, 11,   362 }, {  5, 11,   443 },
+  {  6, 11,   318 }, {  7, 11,  1019 }, { 11, 11,   623 }, {  5, 11,   463 },
+  {  8, 11,   296 }, { 11,  0,   583 }, { 13,  0,   262 }, {  6, 10,  1624 },
+  { 12, 10,   422 }, { 14, 10,   360 }, {  5,  0,   179 }, {  7,  0,  1095 },
+  {  7,  0,  1213 }, {  4, 10,    43 }, {  4, 11,   454 }, {  5, 10,   344 },
+  {  5, 10,   357 }, {  4,  0,    66 }, {  7,  0,   722 }, {  7,  0,   904 },
+  {  6,  0,   773 }, {  7,  0,   352 }, {  5, 10,   888 }, {  5, 11,    48 },
+  {  5, 11,   404 }, {  6, 11,   557 }, {  7, 11,   458 }, {  8, 11,   597 },
+  { 10, 11,   455 }, { 10, 11,   606 }, { 11, 11,    49 }, { 11, 11,   548 },
+  { 12, 11,   476 }, { 13, 11,    18 }, { 13, 11,   450 }, {  6, 11,   418 },
+  {  4, 10,   711 }, {  5, 11,   442 }, {  7, 11,  1984 }, { 13,  0,    35 },
+  {  9,  0,   152 }, {  6,  0,  1197 }, {  7, 11,  1093 }, {  9, 11,   203 },
+  {  9, 10,   440 }, { 10,  0,   592 }, { 10,  0,   753 }, { 12,  0,   317 },
+  { 12,  0,   355 }, { 12,  0,   465 }, { 12,  0,   469 }, { 12,  0,   560 },
+  { 12,  0,   578 }, { 13,  0,   243 }, {  5,  0,   564 }, {  6,  0,   797 },
+  {  5, 10,   958 }, {  5, 10,   987 }, {  5, 11,    55 }, {  7, 11,   376 },
+  { 12, 11,   161 }, {  5, 11,   450 }, {  6,  0,   556 }, {  6,  0,   819 },
+  { 11, 10,   276 }, { 14, 10,   293 }, {  7,  0,   544 }, { 10,  0,    61 },
+  {  8,  0,   719 }, {  4, 10,    65 }, {  5, 10,   479 }, {  5, 10,  1004 },
+  {  7, 10,  1913 }, {  8, 10,   317 }, {  9, 10,   302 }, { 10, 10,   612 },
+  { 13, 10,    22 }, {  4,  0,     5 }, {  5,  0,   498 }, {  8,  0,   637 },
+  {  9,  0,   521 }, {  4, 11,   213 }, {  4, 10,   261 }, {  7, 11,   223 },
+  {  7, 10,   510 }, {  8, 11,    80 }, {  5,  0,   927 }, {  7,  0,   101 },
+  {  4, 10,   291 }, {  7, 11,   381 }, {  7, 11,   806 }, {  7, 11,   820 },
+  {  8, 11,   354 }, {  8, 11,   437 }, {  8, 11,   787 }, {  9, 10,   515 },
+  {  9, 11,   657 }, { 10, 11,    58 }, { 10, 11,   339 }, { 10, 11,   749 },
+  { 11, 11,   914 }, { 12, 10,   152 }, { 12, 11,   162 }, { 12, 10,   443 },
+  { 13, 11,    75 }, { 13, 10,   392 }, { 14, 11,   106 }, { 14, 11,   198 },
+  { 14, 11,   320 }, { 14, 10,   357 }, { 14, 11,   413 }, { 18, 11,    43 },
+  {  6,  0,  1153 }, {  7,  0,  1441 }, {  8, 11,   747 }, {  4,  0,   893 },
+  {  5,  0,   780 }, {  5,  0,   893 }, { 10, 11,   654 }, {  5, 11,   692 },
+  {  5,  0,   238 }, {  6, 11,   191 }, {  4, 10,   130 }, {  7, 10,   843 },
+  {  6,  0,  1296 }, {  5, 10,    42 }, {  5, 10,   879 }, {  7, 10,   245 },
+  {  7, 10,   324 }, {  7, 10,  1532 }, { 11, 10,   463 }, { 11, 10,   472 },
+  { 13, 10,   363 }, { 16, 10,    52 }, {  6,  0,  1729 }, {  6,  0,  1999 },
+  {  8,  0,   969 }, {  4, 10,   134 }, {  5, 10,   372 }, {  4,  0,    60 },
+  {  7,  0,   941 }, {  7,  0,  1800 }, {  8,  0,   314 }, {  9,  0,   700 },
+  { 11,  0,   487 }, {  6,  0,  1144 }, {  6, 11,   162 }, {  7, 11,  1960 },
+  {  8, 11,   831 }, {  4, 11,   706 }, {  7,  0,  1147 }, { 10, 11,   426 },
+  { 10, 11,    89 }, {  7,  0,  1853 }, { 10,  0,   437 }, {  8,  0,   419 },
+  {  7, 10,  1634 }, {  5,  0,   828 }, {  5,  0,   806 }, {  7,  0,   176 },
+  {  7,  0,   178 }, {  7,  0,  1240 }, {  7,  0,  1976 }, {  4, 10,   644 },
+  {  7, 11,  1877 }, {  5, 11,   420 }, {  7, 11,  1449 }, {  4,  0,    51 },
+  {  5,  0,    39 }, {  6,  0,     4 }, {  7,  0,   591 }, {  7,  0,   849 },
+  {  7,  0,   951 }, {  7,  0,  1613 }, {  7,  0,  1760 }, {  7,  0,  1988 },
+  {  9,  0,   434 }, { 10,  0,   754 }, { 11,  0,    25 }, { 11,  0,    37 },
+  { 10, 11,    57 }, { 10, 11,   277 }, {  7, 10,   540 }, {  4, 11,   204 },
+  {  7,  0,   159 }, { 11, 11,   231 }, {  5,  0,   902 }, {  7,  0,   928 },
+  {  7, 11,   366 }, {  9, 11,   287 }, { 12, 11,   199 }, { 12, 11,   556 },
+  { 12, 11,   577 }, {  6, 10,   623 }, {  8, 10,   789 }, {  4, 10,   908 },
+  {  5, 10,   359 }, {  5, 10,   508 }, {  6, 10,  1723 }, {  7, 10,   343 },
+  {  7, 10,  1996 }, {  7, 10,  2026 }, {  6,  0,   270 }, {  4, 10,   341 },
+  {  7, 10,   480 }, {  5, 11,   356 }, {  7, 11,   224 }, { 11, 11,   588 },
+  { 11, 11,   864 }, { 11, 11,   968 }, { 15, 11,   160 }, {  4,  0,   556 },
+  {  9,  0,   801 }, {  4,  0,   416 }, { 14,  0,   372 }, {  5,  0,   152 },
+  {  5,  0,   197 }, {  7,  0,   340 }, {  7,  0,   867 }, { 10,  0,   548 },
+  { 10,  0,   581 }, { 11,  0,     6 }, { 12,  0,     3 }, { 12,  0,    19 },
+  { 14,  0,   110 }, { 14,  0,   289 }, { 11,  0,   369 }, {  7, 11,   630 },
+  {  9, 11,   567 }, { 11, 11,   150 }, { 11, 11,   444 }, { 13, 11,   119 },
+  {  6, 11,   539 }, {  7, 10,  1995 }, {  8, 10,   299 }, { 11, 10,   890 },
+  { 12, 10,   674 }, {  7,  0,    34 }, {  7,  0,   190 }, {  8,  0,    28 },
+  {  8,  0,   141 }, {  8,  0,   444 }, {  8,  0,   811 }, {  9,  0,   468 },
+  { 11,  0,   334 }, { 12,  0,    24 }, { 12,  0,   386 }, { 12,  0,   576 },
+  {  5,  0,   757 }, {  7,  0,  1553 }, {  8,  0,   898 }, {  5,  0,   721 },
+  {  8,  0,  1012 }, {  4,  0,   789 }, {  5,  0,   647 }, {  7,  0,  1102 },
+  {  4,  0,   898 }, { 10,  0,   183 }, {  4, 10,   238 }, {  5, 10,   503 },
+  {  6, 10,   179 }, {  7, 10,  2003 }, {  8, 10,   381 }, {  8, 10,   473 },
+  {  9, 10,   149 }, { 10, 10,   788 }, { 15, 10,    45 }, { 15, 10,    86 },
+  { 20, 10,   110 }, { 22, 10,    57 }, {  9,  0,   136 }, { 19,  0,   107 },
+  {  4, 10,   121 }, {  5, 10,   156 }, {  5, 10,   349 }, { 10, 10,   605 },
+  { 14, 10,   342 }, {  4, 11,   235 }, {  7, 11,   255 }, {  4, 11,   194 },
+  {  5, 11,   584 }, {  6, 11,   384 }, {  7, 11,   583 }, { 10, 11,   761 },
+  { 11, 11,   760 }, { 11, 11,   851 }, {  6, 10,    80 }, {  6, 10,  1694 },
+  {  7, 10,   173 }, {  7, 10,  1974 }, {  9, 10,   547 }, { 10, 10,   730 },
+  { 14, 10,    18 }, { 22, 10,    39 }, {  4, 10,   923 }, {  6, 10,  1711 },
+  {  5,  0,   277 }, { 13,  0,   247 }, {  4,  0,   435 }, {  5, 11,   562 },
+  {  6,  0,  1311 }, {  5, 11,   191 }, {  9, 11,   271 }, {  4, 10,   595 },
+  {  7, 11,  1537 }, { 14, 11,    96 }, { 15, 11,    73 }, {  5,  0,   437 },
+  {  7,  0,   502 }, {  7,  0,   519 }, {  7,  0,  1122 }, {  7,  0,  1751 },
+  { 14,  0,   211 }, {  6, 10,   459 }, {  7, 10,  1753 }, {  7, 10,  1805 },
+  {  8, 10,   658 }, {  9, 10,     1 }, { 11, 10,   959 }, { 13, 10,   446 },
+  {  6,  0,   814 }, {  4, 11,   470 }, {  5, 11,   473 }, {  6, 11,   153 },
+  {  7, 11,  1503 }, {  7, 11,  1923 }, { 10, 11,   701 }, { 11, 11,   132 },
+  { 11, 11,   168 }, { 11, 11,   227 }, { 11, 11,   320 }, { 11, 11,   436 },
+  { 11, 11,   525 }, { 11, 11,   855 }, { 12, 11,    41 }, { 12, 11,   286 },
+  { 13, 11,   103 }, { 13, 11,   284 }, { 14, 11,   255 }, { 14, 11,   262 },
+  { 15, 11,   117 }, { 15, 11,   127 }, {  5,  0,   265 }, {  6,  0,   212 },
+  {  7,  0,    28 }, { 10,  0,   750 }, {  5, 11,   327 }, {  6, 11,   552 },
+  {  7, 11,  1754 }, {  9, 11,   604 }, {  6,  0,  2012 }, {  4,  0,   702 },
+  {  5, 11,    80 }, {  6, 11,   405 }, {  7, 11,   403 }, {  7, 11,  1502 },
+  {  7, 11,  1626 }, {  8, 11,   456 }, {  9, 11,   487 }, {  9, 11,   853 },
+  {  9, 11,   889 }, { 10, 11,   309 }, { 11, 11,   721 }, { 11, 11,   994 },
+  { 12, 11,   430 }, { 13, 11,   165 }, {  5,  0,   808 }, {  7,  0,  2045 },
+  {  5,  0,   166 }, {  8,  0,   739 }, { 12,  0,   511 }, {  6, 10,   490 },
+  {  4, 11,   453 }, {  5, 11,   887 }, {  6, 11,   535 }, {  8, 11,     6 },
+  {  8, 11,   543 }, {  4,  0,   119 }, {  5,  0,   170 }, {  5,  0,   447 },
+  {  7,  0,  1708 }, {  7,  0,  1889 }, {  9,  0,   357 }, {  9,  0,   719 },
+  { 12,  0,   486 }, { 12,  0,   596 }, {  9,  0,   500 }, {  7, 10,   250 },
+  {  8, 10,   507 }, {  4, 10,   158 }, {  6,  0,   809 }, {  6,  0,  1500 },
+  {  9,  0,   327 }, { 11,  0,   350 }, { 11,  0,   831 }, { 13,  0,   352 },
+  {  4, 10,   140 }, {  7, 10,   362 }, {  8, 10,   209 }, {  9, 10,    10 },
+  {  9, 10,   503 }, {  9, 10,   614 }, { 10, 10,   689 }, { 11, 10,   327 },
+  { 11, 10,   725 }, { 12, 10,   252 }, { 12, 10,   583 }, { 13, 10,   192 },
+  { 14, 10,   269 }, { 14, 10,   356 }, { 20, 10,    50 }, {  7, 11,   741 },
+  {  4,  0,   450 }, {  7,  0,  1158 }, { 19, 10,     1 }, { 19, 10,    26 },
+  { 22, 10,     9 }, {  6,  0,   597 }, {  7,  0,  1318 }, {  6,  0,  1602 },
+  {  6, 10,   228 }, {  7, 10,  1341 }, {  9, 10,   408 }, { 10, 10,   343 },
+  {  7,  0,  1375 }, {  7,  0,  1466 }, { 10,  0,   331 }, {  4,  0,   754 },
+  {  4, 10,   557 }, {  5, 11,   101 }, {  6, 11,    88 }, {  6, 11,   543 },
+  {  7, 11,  1677 }, {  9, 11,   100 }, { 10, 11,   677 }, { 14, 11,   169 },
+  { 14, 11,   302 }, { 14, 11,   313 }, { 15, 11,    48 }, { 15, 11,    84 },
+  {  6,  0,  1368 }, {  4, 11,   310 }, {  9, 11,   795 }, { 10, 11,   733 },
+  { 11, 11,   451 }, { 12, 11,   249 }, { 14, 11,   115 }, { 14, 11,   286 },
+  { 15, 11,   100 }, {  4, 10,   548 }, { 10,  0,   557 }, {  7, 10,   197 },
+  {  8, 10,   142 }, {  8, 10,   325 }, {  9, 10,   150 }, {  9, 10,   596 },
+  { 10, 10,   353 }, { 11, 10,    74 }, { 11, 10,   315 }, { 12, 10,   662 },
+  { 12, 10,   681 }, { 14, 10,   423 }, { 15, 10,   141 }, {  5, 11,   587 },
+  {  5,  0,   850 }, {  8,  0,   799 }, { 10,  0,   908 }, { 12,  0,   701 },
+  { 12,  0,   757 }, { 14,  0,   466 }, {  4,  0,    62 }, {  5,  0,   275 },
+  { 18,  0,    19 }, {  6, 10,   399 }, {  6, 10,   579 }, {  7, 10,   692 },
+  {  7, 10,   846 }, {  7, 10,  1015 }, {  7, 10,  1799 }, {  8, 10,   403 },
+  {  9, 10,   394 }, { 10, 10,   133 }, { 12, 10,     4 }, { 12, 10,   297 },
+  { 12, 10,   452 }, { 16, 10,    81 }, { 18, 10,    25 }, { 21, 10,    14 },
+  { 22, 10,    12 }, { 23, 10,    18 }, { 12,  0,   459 }, {  7, 10,  1546 },
+  { 11, 10,   299 }, { 14, 10,   407 }, {  4, 10,   177 }, {  4, 11,   498 },
+  {  7, 11,   217 }, {  8, 11,   140 }, { 10, 11,   610 }, {  5, 10,   411 },
+  {  7, 10,   653 }, {  6,  0,  1802 }, {  7, 10,   439 }, { 10, 10,   727 },
+  { 11, 10,   260 }, { 11, 10,   684 }, {  5, 11,   905 }, { 11, 11,   580 },
+  { 14, 11,   201 }, {  6,  0,  1397 }, {  5, 10,   208 }, {  7, 10,   753 },
+  {  7, 10,  1528 }, {  7,  0,   238 }, {  7,  0,  2033 }, {  8,  0,   120 },
+  {  8,  0,   188 }, {  8,  0,   659 }, {  9,  0,   598 }, { 10,  0,   466 },
+  { 12,  0,   342 }, { 12,  0,   588 }, { 13,  0,   503 }, { 14,  0,   246 },
+  { 15,  0,    92 }, {  7, 11,  1041 }, {  4, 11,   456 }, {  7, 11,   105 },
+  {  7, 11,   358 }, {  7, 11,  1637 }, {  8, 11,   643 }, { 11, 11,   483 },
+  {  6,  0,  1318 }, {  6,  0,  1324 }, {  4,  0,   201 }, {  7,  0,  1744 },
+  {  8,  0,   602 }, { 11,  0,   247 }, { 11,  0,   826 }, { 17,  0,    65 },
+  {  5, 10,   242 }, {  8,  0,   164 }, { 18,  0,    62 }, {  5, 10,   953 },
+  { 11, 10,   802 }, {  5,  0,   615 }, {  7, 11,  1566 }, {  8, 11,   269 },
+  {  9, 11,   212 }, {  9, 11,   718 }, { 14, 11,    15 }, { 14, 11,   132 },
+  { 14, 11,   227 }, {  5, 10,   290 }, {  4, 10,   380 }, {  5, 10,    52 },
+  {  7, 10,   277 }, {  9, 10,   368 }, { 11, 10,   791 }, {  7,  0,  1243 },
+  {  5, 11,   539 }, { 11, 11,   919 }, { 13, 11,   409 }, {  8,  0,   968 },
+  {  5, 11,   470 }, {  6,  0,   882 }, {  4,  0,   907 }, {  5,  0,   100 },
+  { 10,  0,   329 }, { 12,  0,   416 }, { 21,  0,    29 }, { 10, 10,   138 },
+  { 11, 10,   476 }, {  5, 10,   725 }, {  5, 10,   727 }, {  6, 11,    91 },
+  {  7, 11,   435 }, {  7, 10,  1811 }, {  4, 11,    16 }, {  5, 11,   316 },
+  {  5, 11,   842 }, {  6, 11,   370 }, {  6, 11,  1778 }, {  8, 11,   166 },
+  { 11, 11,   812 }, { 12, 11,   206 }, { 12, 11,   351 }, { 14, 11,   418 },
+  { 16, 11,    15 }, { 16, 11,    34 }, { 18, 11,     3 }, { 19, 11,     3 },
+  { 19, 11,     7 }, { 20, 11,     4 }, { 21, 11,    21 }, {  4,  0,   176 },
+  {  5,  0,   636 }, {  5,  0,   998 }, {  7,  0,     9 }, {  7,  0,  1508 },
+  {  8,  0,    26 }, {  9,  0,   317 }, {  9,  0,   358 }, { 10,  0,   210 },
+  { 10,  0,   292 }, { 10,  0,   533 }, { 11,  0,   555 }, { 12,  0,   526 },
+  { 12,  0,   607 }, { 13,  0,   263 }, { 13,  0,   459 }, { 14,  0,   271 },
+  {  6,  0,   256 }, {  8,  0,   265 }, {  4, 10,    38 }, {  7, 10,   307 },
+  {  7, 10,   999 }, {  7, 10,  1481 }, {  7, 10,  1732 }, {  7, 10,  1738 },
+  {  9, 10,   414 }, { 11, 10,   316 }, { 12, 10,    52 }, { 13, 10,   420 },
+  { 19, 10,   100 }, {  7, 10,  1296 }, {  4, 11,   611 }, {  5, 11,   606 },
+  {  4,  0,   643 }, { 14, 11,    21 }, {  5, 11,   715 }, {  5, 10,   723 },
+  {  6,  0,   610 }, {  7, 11,   597 }, { 10,  0,   127 }, { 13,  0,    27 },
+  {  6,  0,  1995 }, {  6,  0,  2001 }, {  8,  0,   119 }, {  8,  0,   973 },
+  {  4, 11,   149 }, { 10, 11,   368 }, { 12,  0,   522 }, {  4, 11,   154 },
+  {  5, 10,   109 }, {  6, 10,  1784 }, {  7, 11,  1134 }, {  7, 10,  1895 },
+  {  8, 11,   105 }, { 12, 10,   296 }, { 12, 10,   302 }, {  4, 11,    31 },
+  {  6, 11,   429 }, {  7, 11,   962 }, {  9, 11,   458 }, { 11, 11,   691 },
+  { 10,  0,   553 }, { 11,  0,   876 }, { 13,  0,   193 }, { 13,  0,   423 },
+  { 14,  0,   166 }, { 19,  0,    84 }, {  4, 11,   312 }, {  5, 10,   216 },
+  {  7, 10,  1879 }, {  9, 10,   141 }, {  9, 10,   270 }, {  9, 10,   679 },
+  { 10, 10,   159 }, { 11, 10,   197 }, { 12, 10,   538 }, { 12, 10,   559 },
+  { 14, 10,   144 }, { 14, 10,   167 }, { 15, 10,    67 }, {  6,  0,  1582 },
+  {  7,  0,  1578 }, {  7, 11,  1578 }, {  9, 10,    81 }, {  4, 11,   236 },
+  {  6, 10,   391 }, {  6,  0,   795 }, {  7, 10,   322 }, {  8, 10,   249 },
+  {  5, 11,   836 }, {  5, 11,   857 }, {  6, 11,  1680 }, {  7, 11,    59 },
+  { 19, 11,    53 }, {  7,  0,   432 }, { 10, 11,    68 }, { 11, 11,   494 },
+  {  4, 11,    81 }, { 11, 11,   867 }, {  7,  0,   126 }, {  8,  0,    84 },
+  { 14, 11,   280 }, {  5, 11,   282 }, {  8, 11,   650 }, {  9, 11,   295 },
+  {  9, 11,   907 }, { 10, 11,   443 }, {  8,  0,   790 }, {  5, 10,   632 },
+  { 10, 10,   526 }, {  6,  0,    64 }, { 12,  0,   377 }, { 13,  0,   309 },
+  { 14,  0,   141 }, { 14,  0,   429 }, { 14, 11,   141 }, { 14, 11,   429 },
+  {  6,  0,  1529 }, {  6,  0,   321 }, {  7,  0,  1857 }, {  9,  0,   530 },
+  { 19,  0,    99 }, {  7, 10,   948 }, {  7, 10,  1042 }, {  8, 10,   235 },
+  {  8, 10,   461 }, {  9, 10,   453 }, { 10, 10,   354 }, { 17, 10,    77 },
+  {  7,  0,  1104 }, { 11,  0,   269 }, { 11,  0,   539 }, { 11,  0,   627 },
+  { 11,  0,   706 }, { 11,  0,   975 }, { 12,  0,   248 }, { 12,  0,   434 },
+  { 12,  0,   600 }, { 12,  0,   622 }, { 13,  0,   297 }, { 13,  0,   485 },
+  { 14,  0,    69 }, { 14,  0,   409 }, { 15,  0,   108 }, {  4, 10,   362 },
+  {  7, 10,    52 }, {  7, 10,   303 }, { 10, 11,    70 }, { 12, 11,    26 },
+  { 14, 11,    17 }, { 14, 11,   178 }, { 15, 11,    34 }, { 21, 11,    12 },
+  { 11,  0,   977 }, { 13,  0,   507 }, {  9,  0,    34 }, { 11,  0,   484 },
+  {  5, 10,   196 }, {  6, 10,   486 }, {  7, 10,   212 }, {  8, 10,   309 },
+  {  8, 10,   346 }, {  6,  0,  1700 }, {  7,  0,    26 }, {  7,  0,   293 },
+  {  7,  0,   382 }, {  7,  0,  1026 }, {  7,  0,  1087 }, {  7,  0,  2027 },
+  {  8,  0,    24 }, {  8,  0,   114 }, {  8,  0,   252 }, {  8,  0,   727 },
+  {  8,  0,   729 }, {  9,  0,    30 }, {  9,  0,   199 }, {  9,  0,   231 },
+  {  9,  0,   251 }, {  9,  0,   334 }, {  9,  0,   361 }, {  9,  0,   712 },
+  { 10,  0,    55 }, { 10,  0,    60 }, { 10,  0,   232 }, { 10,  0,   332 },
+  { 10,  0,   384 }, { 10,  0,   396 }, { 10,  0,   504 }, { 10,  0,   542 },
+  { 10,  0,   652 }, { 11,  0,    20 }, { 11,  0,    48 }, { 11,  0,   207 },
+  { 11,  0,   291 }, { 11,  0,   298 }, { 11,  0,   342 }, { 11,  0,   365 },
+  { 11,  0,   394 }, { 11,  0,   620 }, { 11,  0,   705 }, { 11,  0,  1017 },
+  { 12,  0,   123 }, { 12,  0,   340 }, { 12,  0,   406 }, { 12,  0,   643 },
+  { 13,  0,    61 }, { 13,  0,   269 }, { 13,  0,   311 }, { 13,  0,   319 },
+  { 13,  0,   486 }, { 14,  0,   234 }, { 15,  0,    62 }, { 15,  0,    85 },
+  { 16,  0,    71 }, { 18,  0,   119 }, { 20,  0,   105 }, {  7, 10,  1912 },
+  {  4, 11,    71 }, {  5, 11,   376 }, {  7, 11,   119 }, { 10, 11,   665 },
+  { 10,  0,   918 }, { 10,  0,   926 }, {  4, 10,   686 }, {  8, 11,    55 },
+  { 10, 10,   625 }, {  8, 10,   706 }, {  4, 11,   479 }, {  4, 10,    30 },
+  {  5, 10,    43 }, {  6,  0,   379 }, {  7,  0,   270 }, {  8,  0,   176 },
+  {  8,  0,   183 }, {  9,  0,   432 }, {  9,  0,   661 }, { 12,  0,   247 },
+  { 12,  0,   617 }, { 18,  0,   125 }, {  7, 11,   607 }, {  8, 11,    99 },
+  { 24, 11,     4 }, {  5,  0,   792 }, {  5,  0,   900 }, {  4, 11,   612 },
+  {  5, 11,   561 }, {  4, 11,    41 }, {  4, 10,   220 }, {  5, 11,    74 },
+  {  7, 10,  1535 }, {  7, 11,  1627 }, { 11, 11,   871 }, { 12, 11,   619 },
+  {  7,  0,  1920 }, {  7, 11,    94 }, { 11, 11,   329 }, { 11, 11,   965 },
+  { 12, 11,   241 }, { 14, 11,   354 }, { 15, 11,    22 }, { 20, 11,    63 },
+  {  9, 11,   209 }, {  9, 11,   300 }, {  6,  0,   771 }, {  7,  0,  1979 },
+  {  4,  0,   901 }, {  5,  0,   776 }, { 14,  0,   254 }, {  5, 11,    98 },
+  {  9, 11,    16 }, { 13, 11,   386 }, {  5, 11,   984 }, {  4, 11,   182 },
+  {  6, 11,   205 }, {  7, 11,   220 }, {  7, 10,  1725 }, {  7, 10,  1774 },
+  { 10, 10,   393 }, {  5, 10,   263 }, {  6, 10,   414 }, {  4, 11,    42 },
+  {  9, 11,   205 }, {  9, 11,   786 }, { 10, 11,   659 }, { 14,  0,   140 },
+  { 20,  0,    41 }, {  8,  0,   440 }, { 10,  0,   359 }, {  6, 10,   178 },
+  {  6, 11,   289 }, {  6, 10,  1750 }, {  7, 11,  1670 }, {  9, 10,   690 },
+  { 10, 10,   155 }, { 10, 10,   373 }, { 11, 10,   698 }, { 12, 11,    57 },
+  { 13, 10,   155 }, { 20, 10,    93 }, { 23, 11,     4 }, {  4,  0,    37 },
+  {  5,  0,   334 }, {  7,  0,  1253 }, { 23, 11,    25 }, {  4,  0,   508 },
+  {  4, 11,   635 }, {  5, 10,    97 }, {  9, 10,   393 }, { 11, 11,   533 },
+  {  4,  0,   640 }, {  5,  0,   513 }, {  6, 10,  1639 }, {  4, 11,   371 },
+  {  4, 11,   272 }, {  7, 11,   836 }, {  7, 11,  1651 }, { 17, 11,    89 },
+  {  5, 11,   825 }, {  6, 11,   444 }, {  6, 11,  1640 }, {  8, 11,   308 },
+  {  4, 10,   191 }, {  7, 10,   934 }, {  8, 10,   647 }, { 17, 10,    97 },
+  { 12,  0,   246 }, { 15,  0,   162 }, { 19,  0,    64 }, { 20,  0,     8 },
+  { 20,  0,    95 }, { 22,  0,    24 }, { 24,  0,    17 }, {  4,  0,   533 },
+  {  5, 10,   165 }, {  9, 10,   346 }, { 10, 10,   655 }, {  5, 11,   737 },
+  { 11, 10,   885 }, {  5, 10,   877 }, {  8, 10,   128 }, { 11, 10,   179 },
+  {  9, 11,   307 }, { 12,  0,   752 }, {  5,  0,   920 }, {  7,  0,  1048 },
+  {  5,  0,   153 }, {  6,  0,   580 }, {  6, 10,  1663 }, {  7, 10,   132 },
+  {  7, 10,  1154 }, {  7, 10,  1415 }, {  7, 10,  1507 }, { 12, 10,   493 },
+  { 15, 10,   105 }, { 23, 10,    15 }, {  5, 10,   459 }, {  7, 10,  1073 },
+  {  8, 10,   241 }, {  8, 10,   334 }, { 10,  0,   391 }, {  7,  0,  1952 },
+  {  5, 11,   525 }, {  8, 11,   641 }, { 11, 11,   388 }, { 12, 11,   580 },
+  { 14,  0,   126 }, {  6,  0,   640 }, {  4,  0,   483 }, {  7,  0,  1616 },
+  {  9,  0,    69 }, {  6, 10,   324 }, {  6, 10,   520 }, {  7, 10,   338 },
+  {  7, 10,  1729 }, {  8, 10,   228 }, { 11, 10,   750 }, {  5, 11,   493 },
+  {  6, 11,   528 }, {  7,  0,   734 }, {  4, 11,   174 }, {  7, 11,   911 },
+  { 10,  0,   480 }, {  9,  0,   495 }, { 18,  0,   104 }, {  7, 10,   705 },
+  {  9,  0,   472 }, {  4, 10,    73 }, {  6, 10,   612 }, {  7, 10,   927 },
+  {  7, 10,  1330 }, {  7, 10,  1822 }, {  8, 10,   217 }, {  9, 10,   765 },
+  {  9, 10,   766 }, { 10, 10,   408 }, { 11, 10,    51 }, { 11, 10,   793 },
+  { 12, 10,   266 }, { 15, 10,   158 }, { 20, 10,    89 }, { 22, 10,    32 },
+  {  7, 11,   548 }, {  9, 11,    58 }, {  4, 11,    32 }, {  5, 11,   215 },
+  {  6, 11,   269 }, {  7, 11,  1782 }, {  7, 11,  1892 }, { 10, 11,    16 },
+  { 11, 11,   822 }, { 11, 11,   954 }, { 13, 11,   481 }, {  4,  0,   874 },
+  {  9,  0,   229 }, {  5, 10,   389 }, {  8, 10,   636 }, {  7, 11,  1749 },
+  {  8, 11,   477 }, {  6,  0,   948 }, {  5, 11,   308 }, {  7, 11,  1088 },
+  {  4,  0,   748 }, { 11,  0,  1009 }, {  8, 10,    21 }, {  6,  0,   555 },
+  {  7,  0,   485 }, {  5, 11,   126 }, {  8, 11,   297 }, {  9, 11,   366 },
+  {  9, 11,   445 }, { 12, 11,    53 }, { 12, 11,   374 }, { 13, 11,   492 },
+  {  7, 11,  1551 }, { 11, 11,   361 }, {  8,  0,   193 }, {  8,  0,   472 },
+  {  8,  0,   653 }, { 13,  0,    93 }, { 19,  0,    14 }, {  4,  0,   984 },
+  {  4, 11,   175 }, {  5,  0,   172 }, {  6,  0,  1971 }, {  4, 11,   685 },
+  { 21, 11,     8 }, {  5, 11,   797 }, { 13,  0,    83 }, {  5, 10,   189 },
+  {  7, 10,   442 }, {  7, 10,   443 }, {  8, 10,   281 }, { 12, 10,   174 },
+  { 13, 10,   261 }, {  6,  0,  1568 }, {  5, 11,   565 }, { 11,  0,   384 },
+  {  5,  0,   260 }, {  7,  0,   758 }, {  7,  0,   880 }, {  7,  0,  1359 },
+  {  9,  0,   164 }, {  9,  0,   167 }, { 10,  0,   156 }, { 10,  0,   588 },
+  { 12,  0,   101 }, { 14,  0,    48 }, { 15,  0,    70 }, {  6, 10,     2 },
+  {  7, 10,  1262 }, {  7, 10,  1737 }, {  8, 10,    22 }, {  8, 10,   270 },
+  {  8, 10,   612 }, {  9, 10,   312 }, {  9, 10,   436 }, { 10, 10,   311 },
+  { 10, 10,   623 }, { 11, 10,    72 }, { 11, 10,   330 }, { 11, 10,   455 },
+  { 12, 10,   321 }, { 12, 10,   504 }, { 12, 10,   530 }, { 12, 10,   543 },
+  { 13, 10,    17 }, { 13, 10,   156 }, { 13, 10,   334 }, { 17, 10,    60 },
+  { 20, 10,    64 }, {  4, 11,   252 }, {  7, 11,  1068 }, { 10, 11,   434 },
+  { 11, 11,   228 }, { 11, 11,   426 }, { 13, 11,   231 }, { 18, 11,   106 },
+  { 20, 11,    87 }, {  7, 10,   354 }, { 10, 10,   410 }, { 11, 10,   815 },
+  {  6,  0,   367 }, {  7, 10,   670 }, {  7, 10,  1327 }, {  8, 10,   411 },
+  {  8, 10,   435 }, {  9, 10,   653 }, {  9, 10,   740 }, { 10, 10,   385 },
+  { 11, 10,   222 }, { 11, 10,   324 }, { 11, 10,   829 }, { 12, 10,   611 },
+  {  7,  0,  1174 }, {  6, 10,   166 }, {  7, 10,   374 }, { 18,  0,   121 },
+  {  4,  0,   828 }, {  5, 11,   231 }, { 10, 11,   509 }, {  7, 11,   601 },
+  {  9, 11,   277 }, {  9, 11,   674 }, { 10, 11,   178 }, { 10, 11,   257 },
+  { 10, 11,   418 }, { 11, 11,   531 }, { 11, 11,   544 }, { 11, 11,   585 },
+  { 12, 11,   113 }, { 12, 11,   475 }, { 13, 11,    99 }, { 14, 11,   428 },
+  {  6,  0,  1541 }, {  7, 11,  1779 }, {  5,  0,   343 }, {  6, 10,   398 },
+  {  7, 10,    50 }, {  7, 11,  1683 }, {  4,  0,   440 }, {  7,  0,    57 },
+  {  8,  0,   167 }, {  8,  0,   375 }, {  9,  0,    82 }, {  9,  0,   561 },
+  {  9,  0,   744 }, { 10,  0,   620 }, {  9, 11,   744 }, {  6,  0,   926 },
+  {  6, 10,   517 }, {  7, 10,  1159 }, { 10, 10,   621 }, { 11, 10,   192 },
+  {  9,  0,   827 }, {  8,  0,   194 }, {  8,  0,   756 }, { 10, 10,   223 },
+  { 11, 10,   645 }, {  7, 10,    64 }, {  8, 10,   245 }, {  4, 11,   399 },
+  {  5, 11,   119 }, {  5, 11,   494 }, {  7, 11,   751 }, {  9, 11,   556 },
+  {  4,  0,   808 }, {  7,  0,    22 }, {  7, 10,  1763 }, { 12, 10,   310 },
+  {  5,  0,   639 }, {  7,  0,  1249 }, { 11,  0,   896 }, {  6, 11,   584 },
+  {  6,  0,  1614 }, {  7,  0,   860 }, {  7, 11,  1121 }, {  5, 10,   129 },
+  {  6, 10,    61 }, {  7, 10,   947 }, {  4,  0,   102 }, {  7,  0,   815 },
+  {  7,  0,  1699 }, { 11,  0,   964 }, { 13, 10,   505 }, { 13, 10,   506 },
+  { 11, 10,  1000 }, {  4, 11,   679 }, {  4,  0,   899 }, {  4,  0,   569 },
+  {  5, 11,   694 }, {  9, 11,   714 }, {  8,  0,   795 }, {  6,  0,  2045 },
+  { 11, 11,     7 }, {  6,  0,    52 }, {  9,  0,   104 }, {  9,  0,   559 },
+  { 12,  0,   308 }, { 19,  0,    87 }, {  4,  0,   301 }, {  4,  0,   604 },
+  {  5, 10,   637 }, {  8,  0,   779 }, {  5, 11,   143 }, {  5, 11,   769 },
+  {  6, 11,  1760 }, {  7, 11,   682 }, {  7, 11,  1992 }, {  8, 11,   736 },
+  {  9, 10,   590 }, { 19,  0,    32 }, {  9, 11,   527 }, {  5, 10,   280 },
+  {  7, 10,  1226 }, {  6,  0,   494 }, {  6,  0,   677 }, {  6,  0,   682 },
+  {  6,  0,  1044 }, {  5, 10,   281 }, {  7, 10,  1064 }, {  7,  0,   508 },
+  {  5, 11,   860 }, {  6, 11,   422 }, {  7, 11,     0 }, {  7, 11,  1544 },
+  {  9, 11,   577 }, { 11, 11,   990 }, { 12, 11,   141 }, { 12, 11,   453 },
+  { 13, 11,    47 }, { 13, 11,   266 }, {  6,  0,  1014 }, {  5, 11,   515 },
+  {  9, 11,   131 }, {  6,  0,   957 }, {  4, 11,   646 }, {  6,  0,   310 },
+  {  7,  0,  1849 }, {  8,  0,    72 }, {  8,  0,   272 }, {  8,  0,   431 },
+  {  9,  0,    12 }, {  9,  0,   376 }, { 10,  0,   563 }, { 10,  0,   630 },
+  { 10,  0,   796 }, { 10,  0,   810 }, { 11,  0,   367 }, { 11,  0,   599 },
+  { 11,  0,   686 }, { 12,  0,   672 }, {  7,  0,   570 }, {  4, 11,   396 },
+  {  7, 10,   120 }, {  7, 11,   728 }, {  8, 10,   489 }, {  9, 11,   117 },
+  {  9, 10,   319 }, { 10, 10,   820 }, { 11, 10,  1004 }, { 12, 10,   379 },
+  { 12, 10,   679 }, { 13, 10,   117 }, { 13, 11,   202 }, { 13, 10,   412 },
+  { 14, 10,    25 }, { 15, 10,    52 }, { 15, 10,   161 }, { 16, 10,    47 },
+  { 20, 11,    51 }, { 21, 10,     2 }, {  6, 11,   121 }, {  6, 11,   124 },
+  {  6, 11,   357 }, {  7, 11,  1138 }, {  7, 11,  1295 }, {  8, 11,   162 },
+  { 11, 11,   655 }, {  8,  0,   449 }, {  4, 10,   937 }, {  5, 10,   801 },
+  {  8, 11,   449 }, { 11, 11,   958 }, {  6,  0,   181 }, {  7,  0,   537 },
+  {  8,  0,    64 }, {  9,  0,   127 }, { 10,  0,   496 }, { 12,  0,   510 },
+  { 13,  0,   384 }, { 10, 11,   253 }, {  4,  0,   244 }, {  7,  0,   233 },
+  {  5, 11,   237 }, {  4, 10,   365 }, {  6,  0,  1650 }, { 10,  0,   702 },
+  { 11,  0,   245 }, {  5, 10,     7 }, { 11, 10,   774 }, { 13,  0,   463 },
+  { 20,  0,    49 }, { 13, 11,   463 }, { 20, 11,    49 }, {  4, 10,   734 },
+  {  5, 10,   662 }, {  6, 10,   430 }, {  4, 10,   746 }, {  7, 10,  1090 },
+  {  5, 10,   360 }, {  8, 10,   237 }, {  9,  0,   338 }, { 15, 11,    10 },
+  {  7, 11,   571 }, { 10, 11,   366 }, {  6,  0,  1279 }, {  9, 11,   513 },
+  { 10, 11,    22 }, { 10, 11,    39 }, { 12, 11,   122 }, { 12, 11,   187 },
+  {  5,  0,   896 }, { 18,  0,   178 }, {  6,  0,   695 }, {  9,  0,   808 },
+  {  6, 11,   587 }, {  7, 11,   107 }, {  7, 11,   838 }, {  8, 11,   550 },
+  { 10, 11,   401 }, {  7,  0,  1117 }, {  8,  0,   539 }, {  4, 10,   277 },
+  {  5, 10,   608 }, {  6, 10,   493 }, {  7, 10,   457 }, { 12, 10,   384 },
+  {  5, 11,   768 }, { 12,  0,   257 }, {  7, 10,    27 }, {  7, 10,   316 },
+  { 12,  0,  1003 }, {  4,  0,   207 }, {  5,  0,   586 }, {  5,  0,   676 },
+  {  6,  0,   448 }, {  8,  0,   244 }, { 11,  0,     1 }, { 13,  0,     3 },
+  { 16,  0,    54 }, { 17,  0,     4 }, { 18,  0,    13 }, {  5, 10,   552 },
+  {  4, 10,   401 }, {  9, 10,   264 }, {  5,  0,   516 }, {  7,  0,  1883 },
+  {  7, 11,  1883 }, { 12,  0,   960 }, {  4, 11,   894 }, {  5,  0,     4 },
+  {  5,  0,   810 }, {  6,  0,    13 }, {  6,  0,   538 }, {  6,  0,  1690 },
+  {  6,  0,  1726 }, {  7,  0,   499 }, {  7,  0,  1819 }, {  8,  0,   148 },
+  {  8,  0,   696 }, {  8,  0,   791 }, { 12,  0,   125 }, { 15,  0,     9 },
+  {  7,  0,  1268 }, { 11,  0,    30 }, { 14,  0,   315 }, {  9, 10,   543 },
+  { 10, 10,   524 }, { 12, 10,   524 }, { 16, 10,    18 }, { 20, 10,    26 },
+  { 20, 10,    65 }, {  6,  0,   748 }, {  4, 10,   205 }, {  5, 10,   623 },
+  {  7, 10,   104 }, {  8, 10,   519 }, { 11,  0,   542 }, { 11,  0,   852 },
+  { 12,  0,     6 }, {  4,  0,   848 }, {  7,  0,  1385 }, { 11,  0,   582 },
+  { 11,  0,   650 }, { 11,  0,   901 }, { 11,  0,   949 }, { 12,  0,   232 },
+  { 12,  0,   236 }, { 13,  0,   413 }, { 13,  0,   501 }, { 18,  0,   116 },
+  {  7, 10,   579 }, {  9, 10,    41 }, {  9, 10,   244 }, {  9, 10,   669 },
+  { 10, 10,     5 }, { 11, 10,   861 }, { 11, 10,   951 }, { 11, 10,   980 },
+  {  4,  0,   945 }, {  6,  0,  1811 }, {  6,  0,  1845 }, {  6,  0,  1853 },
+  {  6,  0,  1858 }, {  8,  0,   862 }, { 12,  0,   782 }, { 12,  0,   788 },
+  { 18,  0,   160 }, { 20,  0,   117 }, {  4, 10,   717 }, {  4,  0,   925 },
+  {  5,  0,   803 }, {  8,  0,   698 }, { 10,  0,   828 }, {  6,  0,  1416 },
+  {  4,  0,   610 }, { 11,  0,   992 }, {  6,  0,   878 }, {  6,  0,  1477 },
+  {  7,  0,  1847 }, { 10, 11,   531 }, {  9, 11,   539 }, {  6, 11,   272 },
+  {  5,  0,   383 }, {  6,  0,  1404 }, {  4, 10,   489 }, {  4, 11,     9 },
+  {  5, 11,   128 }, {  7, 11,   368 }, { 11, 11,   480 }, { 20, 11,     3 },
+  {  8,  0,   986 }, {  9,  0,   660 }, { 10,  0,   347 }, {  7, 10,   892 },
+  {  8, 11,   682 }, {  7,  0,   572 }, {  9,  0,   592 }, { 11,  0,   680 },
+  { 12,  0,   356 }, { 12,  0,   550 }, {  7,  0,  1411 }, { 10, 11,   527 },
+  {  4, 11,     2 }, {  7, 11,   545 }, {  7, 11,   894 }, {  9, 10,   473 },
+  { 11,  0,    64 }, {  7, 11,   481 }, {  7, 10,   819 }, {  9, 10,    26 },
+  {  9, 10,   392 }, {  9, 11,   792 }, { 10, 10,   152 }, { 10, 10,   226 },
+  { 12, 10,   276 }, { 12, 10,   426 }, { 12, 10,   589 }, { 13, 10,   460 },
+  { 15, 10,    97 }, { 19, 10,    48 }, { 20, 10,   104 }, {  7, 10,    51 },
+  {  8, 11,   445 }, {  8, 11,   646 }, {  7,  0,   606 }, {  4, 10,   674 },
+  {  6,  0,  1829 }, {  6,  0,  1830 }, {  4, 10,   770 }, {  5, 10,    79 },
+  {  7, 10,  1027 }, {  7, 10,  1477 }, { 11, 10,    52 }, {  5, 11,   530 },
+  { 14, 11,   113 }, {  6, 10,  1666 }, {  7,  0,   748 }, { 11,  0,   700 },
+  {  6, 10,   195 }, {  5, 10,   789 }, {  9,  0,    87 }, { 10,  0,   365 },
+  {  4, 10,   251 }, {  4, 10,   688 }, {  7, 10,   513 }, {  7, 10,  1284 },
+  {  8, 11,   111 }, {  5,  0,   127 }, {  6,  0,   198 }, { 12,  0,    83 },
+  {  5, 11,   556 }, {  5, 10,   889 }, {  4, 10,   160 }, {  5, 10,   330 },
+  {  7, 10,  1434 }, {  8, 10,   174 }, {  5,  0,   276 }, {  6,  0,    55 },
+  {  7,  0,  1369 }, { 10,  0,   864 }, {  8, 11,    16 }, { 12, 11,   568 },
+  {  6,  0,  1752 }, {  8,  0,   726 }, {  7,  0,  1066 }, {  5,  0,   764 },
+  {  6, 11,   186 }, {  9, 11,   426 }, { 11,  0,   683 }, { 11, 11,   683 },
+  {  6,  0,   309 }, {  7,  0,   331 }, { 10,  0,   550 }, {  5, 10,   374 },
+  {  6,  0,  1212 }, {  6,  0,  1852 }, {  7,  0,  1062 }, {  8,  0,   874 },
+  {  8,  0,   882 }, { 10,  0,   936 }, {  4, 11,   585 }, {  6,  0,  1364 },
+  {  7,  0,   986 }, {  5, 10,   731 }, {  6,  0,   723 }, {  6,  0,  1408 },
+  { 10,  0,   381 }, {  7,  0,  1573 }, {  6,  0,  1025 }, {  4, 10,   626 },
+  {  5, 10,   642 }, {  6, 10,   425 }, { 10, 10,   202 }, { 11, 10,   141 },
+  {  4, 11,    93 }, {  5, 11,   252 }, {  6, 11,   229 }, {  7, 11,   291 },
+  {  9, 11,   550 }, { 11, 11,   644 }, {  9, 11,   749 }, {  9, 11,   162 },
+  {  4, 11,   381 }, {  7,  0,  1559 }, {  6,  0,   194 }, {  7,  0,   133 },
+  { 10,  0,   493 }, { 10,  0,   570 }, { 11,  0,   664 }, {  5,  0,    24 },
+  {  5,  0,   569 }, {  6,  0,     3 }, {  6,  0,   119 }, {  6,  0,   143 },
+  {  6,  0,   440 }, {  7,  0,   295 }, {  7,  0,   599 }, {  7,  0,  1686 },
+  {  7,  0,  1854 }, {  8,  0,   424 }, {  9,  0,    43 }, {  9,  0,   584 },
+  {  9,  0,   760 }, { 10,  0,   148 }, { 10,  0,   328 }, { 11,  0,   159 },
+  { 11,  0,   253 }, { 11,  0,   506 }, { 12,  0,   487 }, { 12,  0,   531 },
+  {  6,  0,   661 }, {  6,  0,  1517 }, {  8, 10,   835 }, { 23, 10,    17 },
+  {  5,  0,    14 }, {  5,  0,   892 }, {  6,  0,   283 }, {  7,  0,   234 },
+  {  8,  0,   537 }, { 11,  0,   541 }, {  4,  0,   126 }, {  8,  0,   635 },
+  { 19,  0,    34 }, {  4,  0,   316 }, {  4,  0,   495 }, {  7,  0,  1561 },
+  {  4, 11,   187 }, {  5, 11,   184 }, {  5, 11,   690 }, {  7, 11,  1869 },
+  { 10, 11,   756 }, { 11, 11,   783 }, {  4,  0,   998 }, {  9,  0,   861 },
+  {  8,  0,  1009 }, { 11, 11,   292 }, {  5, 11,    21 }, {  6, 11,    77 },
+  {  6, 11,   157 }, {  7, 11,   974 }, {  7, 11,  1301 }, {  7, 11,  1339 },
+  {  7, 11,  1490 }, {  7, 11,  1873 }, {  9, 11,   628 }, {  7, 11,  1283 },
+  {  9, 11,   227 }, {  9, 11,   499 }, { 10, 11,   341 }, { 11, 11,   325 },
+  { 11, 11,   408 }, { 14, 11,   180 }, { 15, 11,   144 }, { 18, 11,    47 },
+  { 19, 11,    49 }, {  4,  0,    64 }, {  5,  0,   352 }, {  5,  0,   720 },
+  {  6,  0,   368 }, { 11,  0,   359 }, {  5, 10,   384 }, {  8, 10,   455 },
+  { 12, 10,    48 }, {  5, 10,   264 }, {  6, 10,   184 }, {  7,  0,  1577 },
+  { 10,  0,   304 }, { 10,  0,   549 }, { 12,  0,   365 }, { 13,  0,   220 },
+  { 13,  0,   240 }, { 14,  0,    33 }, {  6,  0,  1107 }, {  6,  0,   929 },
+  {  7,  0,  1142 }, {  6,  0,   175 }, {  9,  0,   289 }, {  5,  0,   432 },
+  {  5,  0,   913 }, {  6,  0,   279 }, {  7,  0,   219 }, {  5, 10,   633 },
+  {  7, 10,  1323 }, {  7,  0,   785 }, {  7, 10,   359 }, {  8, 10,   243 },
+  { 12, 10,   175 }, { 11,  0,   595 }, {  4, 10,   105 }, {  8, 11,   398 },
+  {  9, 11,   681 }, { 11, 11,   632 }, { 12,  0,    80 }, {  5,  0,   931 },
+  {  6,  0,  1698 }, { 14, 11,   241 }, {  6, 11,    20 }, {  6,  0,  1323 },
+  { 11,  0,   526 }, { 11,  0,   939 }, { 13,  0,   290 }, {  5,  0,   774 },
+  {  6,  0,   780 }, {  6,  0,  1637 }, {  6,  0,  1686 }, {  6,  0,  1751 },
+  {  8,  0,   559 }, { 13,  0,   109 }, { 13,  0,   127 }, {  7,  0,  1167 },
+  { 11,  0,   934 }, { 13,  0,   391 }, { 17,  0,    76 }, {  7, 11,   709 },
+  {  7,  0,   963 }, {  6,  0,   260 }, {  7,  0,  1484 }, {  6,  0,   573 },
+  {  4, 10,   758 }, { 11, 11,   941 }, {  7, 10,  1649 }, { 17, 11,    36 },
+  {  4,  0,   292 }, {  9,  0,   580 }, {  4,  0,   736 }, {  5,  0,   871 },
+  {  6,  0,  1689 }, {  7,  0,  1944 }, {  7, 11,   945 }, { 11, 11,   713 },
+  { 11, 11,   744 }, {  6,  0,  1164 }, {  7, 11,   937 }, {  6,  0,  1922 },
+  {  9,  0,   982 }, { 15,  0,   173 }, { 15,  0,   178 }, { 15,  0,   200 },
+  { 18,  0,   189 }, { 18,  0,   207 }, { 21,  0,    47 }, {  7, 11,  1652 },
+  {  7,  0,  1695 }, { 11, 10,   128 }, {  6,  0,    63 }, {  7,  0,   920 },
+  {  5,  0,   793 }, { 15, 11,   134 }, {  5, 10,   918 }, {  5,  0,    67 },
+  {  6,  0,    62 }, {  6,  0,   374 }, {  7,  0,  1391 }, {  9,  0,   790 },
+  { 12,  0,    47 }, {  4, 11,   579 }, {  5, 11,   226 }, {  5, 11,   323 },
+  {  7, 11,   960 }, { 10, 11,   784 }, { 13, 11,   191 }, {  4,  0,   391 },
+  {  7,  0,  1169 }, {  9,  0,   443 }, { 13, 11,   232 }, { 18, 11,    35 },
+  {  4, 10,   340 }, {  4,  0,   271 }, {  9, 11,   313 }, {  5, 11,   973 },
+  {  9, 11,   659 }, {  6,  0,  1140 }, {  6, 11,   135 }, {  7, 11,  1176 },
+  {  4,  0,   253 }, {  5,  0,   544 }, {  7,  0,   300 }, {  9,  0,   340 },
+  {  7,  0,   897 }, {  5, 10,   985 }, {  7, 10,   509 }, { 17, 10,    96 },
+  { 10, 11,   735 }, {  7, 10,  1919 }, { 10,  0,   890 }, {  5,  0,   818 },
+  {  6,  0,  1122 }, {  5,  0,    53 }, {  5,  0,   541 }, {  6,  0,    94 },
+  {  6,  0,   499 }, {  7,  0,   230 }, { 11,  0,   321 }, {  4,  0,   920 },
+  {  5,  0,    25 }, {  5,  0,   790 }, {  6,  0,   457 }, {  7,  0,   853 },
+  {  8,  0,   788 }, { 14, 11,    31 }, {  4, 10,   247 }, {  7, 11,   314 },
+  {  4,  0,   468 }, {  7,  0,   243 }, {  6, 10,   337 }, {  7, 10,   494 },
+  {  8, 10,    27 }, {  8, 10,   599 }, { 10, 10,   153 }, {  4, 10,   184 },
+  {  5, 10,   390 }, {  7, 10,   618 }, {  7, 10,  1456 }, { 11, 10,   710 },
+  {  6,  0,   870 }, {  6,  0,  1238 }, {  6,  0,  1765 }, { 10,  0,   853 },
+  { 10,  0,   943 }, { 14,  0,   437 }, { 14,  0,   439 }, { 14,  0,   443 },
+  { 14,  0,   446 }, { 14,  0,   452 }, { 14,  0,   469 }, { 14,  0,   471 },
+  { 14,  0,   473 }, { 16,  0,    93 }, { 16,  0,   102 }, { 16,  0,   110 },
+  { 20,  0,   121 }, {  4,  0,   605 }, {  7,  0,   518 }, {  7,  0,  1282 },
+  {  7,  0,  1918 }, { 10,  0,   180 }, { 11,  0,   218 }, {  5,  0,   822 },
+  {  4,  0,   634 }, { 11,  0,   916 }, { 14,  0,   419 }, {  6, 11,   281 },
+  {  7, 11,     6 }, {  8, 11,   282 }, {  8, 11,   480 }, {  8, 11,   499 },
+  {  9, 11,   198 }, { 10, 11,   143 }, { 10, 11,   169 }, { 10, 11,   211 },
+  { 10, 11,   417 }, { 10, 11,   574 }, { 11, 11,   147 }, { 11, 11,   395 },
+  { 12, 11,    75 }, { 12, 11,   407 }, { 12, 11,   608 }, { 13, 11,   500 },
+  { 14, 11,   251 }, {  6,  0,   898 }, {  6,  0,    36 }, {  7,  0,   658 },
+  {  8,  0,   454 }, { 22, 11,    48 }, {  5, 11,   674 }, {  7, 11,  1776 },
+  {  4, 11,   419 }, { 10, 10,   227 }, { 11, 10,   497 }, { 11, 10,   709 },
+  { 12, 10,   415 }, {  6, 10,   360 }, {  7, 10,  1664 }, {  8, 10,   478 },
+  {  9,  0,   806 }, { 12, 11,   508 }, { 14, 11,   102 }, { 14, 11,   226 },
+  { 16, 11,    57 }, {  7, 11,  1123 }, {  4, 11,   138 }, {  7, 11,  1012 },
+  {  7, 11,  1280 }, {  9, 11,    76 }, {  5, 11,    29 }, { 12, 11,   638 },
+  {  8, 10,   699 }, {  6,  0,  1326 }, {  4,  0,   104 }, {  7, 11,   735 },
+  {  4, 10,   739 }, {  6,  0,  1331 }, {  7,  0,   260 }, {  7, 11,   260 },
+  {  7, 11,  1063 }, {  7,  0,    45 }, {  9,  0,   542 }, {  9,  0,   566 },
+  { 10,  0,   728 }, {  9, 10,   869 }, {  4, 10,    67 }, {  5, 10,   422 },
+  {  7, 10,  1037 }, {  7, 10,  1289 }, {  7, 10,  1555 }, {  9, 10,   741 },
+  { 17, 10,   108 }, { 11,  0,   263 }, {  6,  0,  1516 }, { 14,  0,   146 },
+  { 15,  0,    42 }, { 16,  0,    23 }, { 17,  0,    86 }, { 18,  0,    17 },
+  { 10,  0,   468 }, {  8,  0,  1005 }, {  4, 11,    17 }, {  5, 11,    23 },
+  {  7, 11,   995 }, { 11, 11,   383 }, { 11, 11,   437 }, { 12, 11,   460 },
+  { 12, 11,   532 }, {  7,  0,    87 }, { 14,  0,   288 }, { 10, 10,    96 },
+  {  7, 11,   626 }, { 16, 10,    26 }, {  7,  0,   988 }, {  7,  0,  1939 },
+  {  9,  0,    64 }, {  9,  0,   502 }, { 12,  0,    22 }, { 12,  0,    34 },
+  { 13,  0,    12 }, { 13,  0,   234 }, { 19,  0,    77 }, { 13,  0,   133 },
+  {  8, 10,   203 }, { 11, 10,   823 }, { 11, 10,   846 }, { 12, 10,   482 },
+  { 13, 10,   277 }, { 13, 10,   302 }, { 13, 10,   464 }, { 14, 10,   205 },
+  { 14, 10,   221 }, {  4, 10,   449 }, {  5, 10,   718 }, {  7,  0,   141 },
+  {  6,  0,  1842 }, {  8,  0,   872 }, {  8, 11,    70 }, { 12, 11,   171 },
+  { 13, 11,   272 }, {  4, 10,   355 }, {  6, 10,   311 }, {  9, 10,   256 },
+  { 10, 10,   404 }, {  4,  0,   619 }, {  9,  0,   261 }, { 10, 11,   233 },
+  { 10, 10,   758 }, { 11, 11,    76 }, {  5,  0,   246 }, {  8,  0,   189 },
+  {  9,  0,   355 }, {  9,  0,   512 }, { 10,  0,   124 }, { 10,  0,   453 },
+  { 11,  0,   143 }, { 11,  0,   416 }, { 11,  0,   859 }, { 13,  0,   341 },
+  {  6, 11,   442 }, {  5, 10,   827 }, {  5, 10,    64 }, { 12, 10,   581 },
+  {  4, 10,   442 }, {  7, 10,  1047 }, {  7, 10,  1352 }, {  7, 10,  1643 },
+  {  6, 11,  1709 }, {  5,  0,   678 }, {  6,  0,   305 }, {  7,  0,   775 },
+  {  7,  0,  1065 }, {  5, 10,   977 }, { 11, 11,    69 }, { 12, 11,   105 },
+  { 12, 11,   117 }, { 13, 11,   213 }, { 14, 11,    13 }, { 14, 11,    62 },
+  { 14, 11,   177 }, { 14, 11,   421 }, { 15, 11,    19 }, { 18, 11,   141 },
+  {  9, 11,   309 }, {  5,  0,    35 }, {  7,  0,   862 }, {  7,  0,  1886 },
+  { 10,  0,   179 }, {  8,  0,   285 }, {  4,  0,   517 }, {  7, 11,   976 },
+  {  9, 11,   146 }, { 10, 11,   206 }, { 10, 11,   596 }, { 13, 11,   218 },
+  { 14, 11,   153 }, {  4, 10,   254 }, {  6,  0,   214 }, { 12,  0,   540 },
+  {  4, 10,   275 }, {  7, 10,  1219 }, { 12, 10,   376 }, {  8,  0,   667 },
+  { 11,  0,   403 }, { 18,  0,    83 }, { 12,  0,    74 }, { 10, 11,   648 },
+  { 11, 11,   671 }, { 15, 11,    46 }, {  7,  0,   125 }, {  6, 10,  1753 },
+  {  5,  0,   761 }, {  6,  0,   912 }, {  4, 11,   518 }, {  6, 10,   369 },
+  {  6, 10,   502 }, {  7, 10,  1036 }, {  7, 11,  1136 }, {  8, 10,   348 },
+  {  9, 10,   452 }, { 10, 10,    26 }, { 11, 10,   224 }, { 11, 10,   387 },
+  { 11, 10,   772 }, { 12, 10,    95 }, { 12, 10,   629 }, { 13, 10,   195 },
+  { 13, 10,   207 }, { 13, 10,   241 }, { 14, 10,   260 }, { 14, 10,   270 },
+  { 15, 10,   140 }, { 10,  0,   131 }, { 12,  0,    72 }, {  4, 10,   269 },
+  {  5, 10,   480 }, {  7, 10,   532 }, {  7, 10,  1197 }, {  7, 10,  1358 },
+  {  8, 10,   291 }, { 11, 10,   349 }, { 14, 10,   396 }, {  8, 11,   689 },
+  {  9, 11,   863 }, {  8,  0,   333 }, { 10,  0,   182 }, {  4, 11,    18 },
+  {  7, 11,   145 }, {  7, 11,   444 }, {  7, 11,  1278 }, {  8, 11,    49 },
+  {  8, 11,   400 }, {  9, 11,    71 }, {  9, 11,   250 }, { 10, 11,   459 },
+  { 12, 11,   160 }, { 16, 11,    24 }, { 14, 11,    35 }, { 14, 11,   191 },
+  {  7, 11,  1864 }, {  7,  0,  1338 }, { 20, 10,    15 }, { 14,  0,    94 },
+  { 15,  0,    65 }, { 16,  0,     4 }, { 16,  0,    77 }, { 16,  0,    80 },
+  { 17,  0,     5 }, { 12, 11,    82 }, { 15, 11,    36 }, {  5, 11,  1010 },
+  {  5,  0,   449 }, {  5,  0,   646 }, {  7,  0,    86 }, {  8,  0,   103 },
+  {  7, 10,   657 }, {  7,  0,  2028 }, { 10,  0,   641 }, {  8, 10,   533 },
+  {  6,  0,     1 }, { 11, 11,   970 }, {  5, 11,    87 }, {  7, 11,   313 },
+  {  7, 11,  1103 }, { 10, 11,   112 }, { 10, 11,   582 }, { 11, 11,   389 },
+  { 11, 11,   813 }, { 12, 11,   385 }, { 13, 11,   286 }, { 14, 11,   124 },
+  { 18, 11,   108 }, {  6,  0,   869 }, {  4, 11,   267 }, {  6,  0,   277 },
+  {  7,  0,  1274 }, {  7,  0,  1386 }, { 18,  0,    87 }, {  6,  0,   187 },
+  {  7,  0,    39 }, {  7,  0,  1203 }, {  8,  0,   380 }, { 14,  0,   117 },
+  { 21,  0,    28 }, {  4, 10,   211 }, {  4, 10,   332 }, {  5, 10,   335 },
+  {  6, 10,   238 }, {  7, 10,   269 }, {  7, 10,   811 }, {  7, 10,  1797 },
+  {  8, 10,   836 }, {  9, 10,   507 }, { 13, 10,   242 }, {  4,  0,   785 },
+  {  5,  0,   368 }, {  6,  0,   297 }, {  7,  0,   793 }, { 11,  0,   938 },
+  {  7,  0,   464 }, {  8,  0,   558 }, { 11,  0,   105 }, { 12,  0,   231 },
+  { 14,  0,   386 }, { 15,  0,   102 }, { 20,  0,    75 }, {  5, 10,  1009 },
+  {  8,  0,   877 }, { 12,  0,   731 }, { 11, 11,   289 }, { 10, 11,   249 },
+  { 11, 11,   209 }, {  4, 11,   561 }, {  6,  0,  1608 }, {  4, 11,   760 },
+  {  6,  0,  1429 }, {  9, 11,   154 }, { 12, 11,   485 }, {  5, 10,   228 },
+  {  6, 10,   203 }, {  7, 10,   156 }, {  8, 10,   347 }, {  9, 10,   265 },
+  {  7,  0,  1010 }, { 11,  0,   733 }, { 11,  0,   759 }, { 13,  0,    34 },
+  { 14,  0,   427 }, { 18,  0,    45 }, {  7, 10,  1131 }, {  7, 10,  1468 },
+  {  8, 11,   255 }, {  7,  0,  1656 }, {  9,  0,   369 }, { 10,  0,   338 },
+  { 10,  0,   490 }, { 11,  0,   154 }, { 11,  0,   545 }, { 11,  0,   775 },
+  { 13,  0,    77 }, { 13,  0,   274 }, {  5, 11,   621 }, {  6,  0,  1038 },
+  {  4, 11,   368 }, {  7, 11,   641 }, {  6,  0,  2010 }, {  8,  0,   979 },
+  {  8,  0,   985 }, { 10,  0,   951 }, { 10,  0,  1011 }, {  6,  0,  1005 },
+  { 19,  0,   121 }, {  5, 10,   291 }, {  5, 10,   318 }, {  7, 10,   765 },
+  {  9, 10,   389 }, { 12, 10,   548 }, {  5,  0,    20 }, {  6,  0,   298 },
+  {  7,  0,   659 }, {  9,  0,   219 }, {  7,  0,  1440 }, { 11,  0,   854 },
+  { 11,  0,   872 }, { 11,  0,   921 }, { 12,  0,   551 }, { 13,  0,   472 },
+  { 14,  0,   367 }, {  5,  0,   490 }, {  6,  0,   615 }, {  6,  0,   620 },
+  {  7,  0,   683 }, {  6,  0,  1070 }, {  6,  0,  1597 }, { 11,  0,   522 },
+  {  4,  0,   439 }, {  8,  0,   669 }, {  6,  0,   766 }, {  6,  0,  1143 },
+  {  6,  0,  1245 }, { 10, 10,   525 }, { 11, 10,    82 }, {  9, 11,    92 },
+  { 19, 11,    91 }, {  6,  0,   668 }, {  6,  0,  1218 }, {  6, 11,   525 },
+  {  9, 11,   876 }, { 12, 11,   284 }, {  4,  0,   233 }, {  8,  0,   547 },
+  {  4, 10,   422 }, {  5, 10,   355 }, { 17, 10,     0 }, {  6, 11,   300 },
+  {  7, 11,  1515 }, {  4,  0,   482 }, {  9, 10,   905 }, {  4,  0,   886 },
+  {  7,  0,   346 }, {  5, 11,   594 }, {  5, 10,   865 }, {  5, 10,   914 },
+  {  6, 10,  1625 }, {  7,  0,   334 }, {  5,  0,   795 }, {  6,  0,  1741 },
+  {  5, 10,   234 }, {  7, 10,  1383 }, {  6, 11,  1641 }, {  8, 11,   820 },
+  {  7,  0,   371 }, {  7, 11,  1313 }, { 10, 11,   660 }, {  7, 10,  1312 },
+  {  7,  0,   622 }, {  7,  0,   625 }, {  7,  0,  1750 }, {  7,  0,   339 },
+  {  4,  0,   203 }, {  7,  0,  1936 }, { 15,  0,    29 }, { 16,  0,    38 },
+  { 15, 11,    29 }, { 16, 11,    38 }, {  5,  0,   338 }, {  7,  0,  1256 },
+  {  7, 10,  1493 }, { 10,  0,   130 }, {  6, 10,   421 }, {  7, 10,    61 },
+  {  7, 10,  1540 }, { 10, 10,   501 }, {  6, 11,   389 }, {  7, 11,   149 },
+  {  9, 11,   142 }, { 10, 11,    94 }, {  9, 10,   341 }, { 11,  0,   678 },
+  { 12,  0,   307 }, { 14, 10,    98 }, {  6, 11,     8 }, {  7, 11,  1881 },
+  {  8, 11,    91 }, {  7,  0,  2044 }, {  6,  0,   770 }, {  6,  0,   802 },
+  {  6,  0,   812 }, {  7,  0,   311 }, {  9,  0,   308 }, { 12,  0,   255 },
+  {  6, 10,   102 }, {  7, 10,    72 }, { 15, 10,   142 }, { 19, 10,    67 },
+  { 23, 10,    30 }, {  7, 10,   823 }, {  7,  0,  1266 }, {  7, 11,  1746 },
+  {  7, 10,  1870 }, {  4,  0,   400 }, {  5,  0,   267 }, {  7,  0,   232 },
+  {  7, 11,    24 }, { 11, 11,   542 }, { 11, 11,   852 }, {  7, 11,  1739 },
+  {  4, 11,   503 }, {  7, 11,  1661 }, {  5, 11,   130 }, {  7, 11,  1314 },
+  {  9, 11,   610 }, { 10, 11,   718 }, { 11, 11,   601 }, { 11, 11,   819 },
+  { 11, 11,   946 }, { 12, 11,   536 }, { 10, 11,   149 }, { 11, 11,   280 },
+  { 14, 11,   336 }, {  7,  0,   739 }, { 11,  0,   690 }, {  7, 11,  1946 },
+  {  8, 10,    48 }, {  8, 10,    88 }, {  8, 10,   582 }, {  8, 10,   681 },
+  {  9, 10,   373 }, {  9, 10,   864 }, { 11, 10,   157 }, { 11, 10,   843 },
+  { 20, 10,    27 }, {  6,  0,   990 }, {  4, 10,    88 }, {  5, 10,   137 },
+  {  5, 10,   174 }, {  5, 10,   777 }, {  6, 10,  1664 }, {  6, 10,  1725 },
+  {  7, 10,    77 }, {  7, 10,   426 }, {  7, 10,  1317 }, {  7, 10,  1355 },
+  {  8, 10,   126 }, {  8, 10,   563 }, {  9, 10,   523 }, {  9, 10,   750 },
+  { 10, 10,   310 }, { 10, 10,   836 }, { 11, 10,    42 }, { 11, 10,   318 },
+  { 11, 10,   731 }, { 12, 10,    68 }, { 12, 10,    92 }, { 12, 10,   507 },
+  { 12, 10,   692 }, { 13, 10,    81 }, { 13, 10,   238 }, { 13, 10,   374 },
+  { 14, 10,   436 }, { 18, 10,   138 }, { 19, 10,    78 }, { 19, 10,   111 },
+  { 20, 10,    55 }, { 20, 10,    77 }, { 20, 10,    92 }, { 13, 10,   418 },
+  {  7,  0,  1831 }, {  4, 10,   938 }, {  6,  0,   776 }, {  6,  0,   915 },
+  { 10, 10,   351 }, {  5, 11,   348 }, {  6, 11,   522 }, {  6, 10,  1668 },
+  {  7, 10,  1499 }, {  8, 10,   117 }, {  9, 10,   314 }, { 10, 10,   174 },
+  {  7, 10,   707 }, {  4,  0,   613 }, {  5, 10,   403 }, {  4, 11,   392 },
+  {  5, 11,   433 }, {  9, 11,   633 }, { 11, 11,   629 }, {  5,  0,   763 },
+  {  4,  0,   878 }, {  4,  0,   977 }, {  4,  0,   100 }, {  6,  0,   463 },
+  {  4, 10,    44 }, {  5, 10,   311 }, {  7, 10,   639 }, {  7, 10,   762 },
+  {  7, 10,  1827 }, {  9, 10,     8 }, {  9, 10,   462 }, { 20, 10,    83 },
+  {  6, 11,   234 }, {  4, 10,   346 }, {  7, 10,   115 }, {  9, 10,   180 },
+  {  9, 10,   456 }, { 10, 10,   363 }, {  5,  0,   362 }, {  5,  0,   443 },
+  {  6,  0,   318 }, {  7,  0,  1019 }, { 11,  0,   623 }, {  5,  0,   463 },
+  {  8,  0,   296 }, {  7, 11,   140 }, {  7, 11,  1950 }, {  8, 11,   680 },
+  { 11, 11,   817 }, { 19, 11,    88 }, {  7, 11,  1222 }, { 10, 11,   386 },
+  { 14,  0,   137 }, {  4,  0,   454 }, {  7,  0,  1914 }, {  6, 11,     5 },
+  {  7, 10,  1051 }, {  9, 10,   545 }, { 11, 11,   249 }, { 12, 11,   313 },
+  { 16, 11,    66 }, { 17, 11,    26 }, {  7,  0,  1527 }, { 17,  0,    58 },
+  { 20, 11,    59 }, {  5,  0,    48 }, {  5,  0,   404 }, {  6,  0,   557 },
+  {  7,  0,   458 }, {  8,  0,   597 }, { 10,  0,   455 }, { 10,  0,   606 },
+  { 11,  0,    49 }, { 11,  0,   548 }, { 12,  0,   476 }, { 13,  0,    18 },
+  { 13,  0,   450 }, {  5, 11,   963 }, {  6, 11,  1773 }, {  5,  0,   729 },
+  { 10, 11,   586 }, {  5,  0,   442 }, {  7,  0,  1984 }, {  6,  0,   449 },
+  { 16,  0,    40 }, {  4,  0,   853 }, {  7, 11,   180 }, {  8, 11,   509 },
+  {  8, 11,   792 }, {  6, 10,   185 }, {  7, 10,  1899 }, {  9, 10,   875 },
+  { 11, 10,   673 }, {  6, 11,   524 }, { 12,  0,   227 }, {  4, 10,   327 },
+  {  5, 10,   478 }, {  7, 10,  1332 }, {  8, 10,   753 }, {  6,  0,  1491 },
+  {  5, 10,  1020 }, {  5, 10,  1022 }, {  4, 10,   103 }, {  5, 10,   401 },
+  {  4, 11,   931 }, {  4, 10,   499 }, {  7, 10,  1421 }, {  5,  0,    55 },
+  {  7,  0,   376 }, { 12,  0,   161 }, {  5,  0,   450 }, {  6,  0,  1174 },
+  {  6,  0,  1562 }, { 10,  0,    62 }, { 13,  0,   400 }, {  7, 11,  1837 },
+  { 12,  0,   207 }, {  7,  0,   869 }, {  4, 11,   773 }, {  5, 11,   618 },
+  {  9, 11,   756 }, {  4, 10,    96 }, {  4,  0,   213 }, {  7,  0,   223 },
+  {  8,  0,    80 }, {  7, 10,   968 }, {  4, 11,    90 }, {  5, 11,   337 },
+  {  5, 11,   545 }, {  7, 11,   754 }, {  9, 11,   186 }, { 10, 11,    72 },
+  { 10, 11,   782 }, { 11, 11,   513 }, { 11, 11,   577 }, { 11, 11,   610 },
+  { 11, 11,   889 }, { 11, 11,   961 }, { 12, 11,   354 }, { 12, 11,   362 },
+  { 12, 11,   461 }, { 12, 11,   595 }, { 13, 11,    79 }, { 15, 11,   121 },
+  {  7,  0,   381 }, {  7,  0,   806 }, {  7,  0,   820 }, {  8,  0,   354 },
+  {  8,  0,   437 }, {  8,  0,   787 }, {  9,  0,   657 }, { 10,  0,    58 },
+  { 10,  0,   339 }, { 10,  0,   749 }, { 11,  0,   914 }, { 12,  0,   162 },
+  { 13,  0,    75 }, { 14,  0,   106 }, { 14,  0,   198 }, { 14,  0,   320 },
+  { 14,  0,   413 }, { 18,  0,    43 }, {  8,  0,   747 }, {  8,  0,   954 },
+  {  6,  0,  1073 }, {  7,  0,   556 }, {  7, 11,   151 }, {  9, 11,   329 },
+  { 11, 11,   254 }, {  5,  0,   692 }, {  6,  0,  1395 }, {  6, 10,   563 },
+  {  9, 10,   224 }, {  6,  0,   191 }, {  4,  0,   804 }, {  9, 11,   187 },
+  { 10, 11,    36 }, { 17, 11,    44 }, { 18, 11,    64 }, {  7, 11,   165 },
+  {  7, 11,   919 }, {  8, 11,   517 }, {  4, 11,   506 }, {  5, 11,   295 },
+  {  7, 11,  1680 }, { 15, 11,    14 }, { 16, 11,     5 }, {  4,  0,   706 },
+  {  6,  0,   162 }, {  7,  0,  1960 }, {  8,  0,   831 }, {  7, 11,  1376 },
+  {  7, 11,   987 }, {  9, 11,   688 }, { 10, 11,   522 }, { 11, 11,   788 },
+  { 12, 11,   566 }, { 22,  0,    35 }, { 10,  0,   426 }, {  7,  0,  1235 },
+  {  7, 11,  1741 }, {  7, 11,   389 }, {  7, 11,   700 }, {  7, 11,   940 },
+  {  8, 11,   514 }, {  9, 11,   116 }, {  9, 11,   535 }, { 10, 11,   118 },
+  { 11, 11,   107 }, { 11, 11,   148 }, { 11, 11,   922 }, { 12, 11,   254 },
+  { 12, 11,   421 }, { 14, 11,   238 }, {  6,  0,  1234 }, {  4, 11,   743 },
+  {  4, 10,   910 }, {  5, 10,   832 }, {  7, 11,  1335 }, { 13,  0,    96 },
+  {  7, 11,   185 }, { 18,  0,   149 }, {  4,  0,   204 }, {  9,  0,   902 },
+  {  4, 11,   784 }, {  5, 11,   745 }, {  8,  0,   833 }, {  8,  0,   949 },
+  {  7,  0,   366 }, {  9,  0,   287 }, { 12,  0,   199 }, { 12,  0,   556 },
+  { 12,  0,   577 }, {  5, 11,    81 }, {  7, 11,   146 }, {  7, 11,  1342 },
+  {  7, 11,  1446 }, {  8, 11,    53 }, {  8, 11,   561 }, {  8, 11,   694 },
+  {  8, 11,   754 }, {  9, 11,    97 }, {  9, 11,   115 }, {  9, 11,   894 },
+  { 10, 11,   462 }, { 10, 11,   813 }, { 11, 11,   230 }, { 11, 11,   657 },
+  { 11, 11,   699 }, { 11, 11,   748 }, { 12, 11,   119 }, { 12, 11,   200 },
+  { 12, 11,   283 }, { 14, 11,   273 }, { 17, 11,    15 }, {  5, 11,   408 },
+  {  9, 11,   747 }, {  9, 11,   498 }, { 12, 11,   181 }, {  6,  0,  2020 },
+  {  8,  0,   992 }, {  5,  0,   356 }, {  7,  0,   224 }, {  6,  0,   784 },
+  {  7,  0,   630 }, {  9,  0,   567 }, { 11,  0,   150 }, { 11,  0,   444 },
+  { 13,  0,   119 }, {  8, 10,   528 }, {  9, 10,   348 }, {  6,  0,   539 },
+  {  4, 10,    20 }, {  5, 10,   616 }, { 14,  0,    27 }, {  7, 11,    30 },
+  {  8, 11,    86 }, {  8, 11,   315 }, {  8, 11,   700 }, {  9, 11,   576 },
+  {  9, 11,   858 }, { 11, 11,   310 }, { 11, 11,   888 }, { 11, 11,   904 },
+  { 12, 11,   361 }, { 13, 11,   248 }, { 10, 11,   839 }, {  6,  0,   755 },
+  {  6,  0,  1063 }, {  7, 10,  1091 }, {  7, 10,  1765 }, {  6, 11,   428 },
+  {  7, 11,   524 }, {  8, 11,   169 }, {  8, 11,   234 }, {  9, 11,   480 },
+  { 10, 11,   646 }, { 11,  0,   814 }, {  7, 11,  1462 }, { 11, 11,   659 },
+  {  4, 10,    26 }, {  5, 10,   429 }, {  6, 10,   245 }, {  7, 10,   704 },
+  {  7, 10,  1379 }, {  7, 10,  1474 }, {  7, 11,  1205 }, { 10, 11,   637 },
+  { 11, 11,   803 }, {  4, 10,   621 }, {  8,  0,   987 }, {  4, 11,   266 },
+  {  8, 11,     4 }, {  9, 11,    39 }, { 10, 11,   166 }, { 11, 11,   918 },
+  { 12, 11,   635 }, { 20, 11,    10 }, { 22, 11,    27 }, { 22, 11,    43 },
+  {  4,  0,   235 }, {  7,  0,   255 }, {  4,  0,   194 }, {  5,  0,   584 },
+  {  6,  0,   384 }, {  7,  0,   583 }, { 10,  0,   761 }, { 11,  0,   760 },
+  { 11,  0,   851 }, {  5, 10,   542 }, {  6,  0,  1086 }, {  5, 10,   868 },
+  {  8,  0,  1016 }, {  8,  0,  1018 }, {  7,  0,  1396 }, {  7, 11,  1396 },
+  {  8, 10,   433 }, {  7, 10,  1495 }, { 10, 10,   215 }, { 13, 10,   124 },
+  {  7, 11,   157 }, {  8, 11,   279 }, {  9, 11,   759 }, { 16, 11,    31 },
+  { 16, 11,    39 }, { 16, 11,    75 }, { 18, 11,    24 }, { 20, 11,    42 },
+  { 24, 11,     1 }, {  5,  0,   562 }, {  6, 11,   604 }, {  6,  0,   913 },
+  {  5,  0,   191 }, {  9,  0,   271 }, {  4,  0,   470 }, {  6,  0,   153 },
+  {  7,  0,  1503 }, {  7,  0,  1923 }, { 10,  0,   701 }, { 11,  0,   132 },
+  { 11,  0,   227 }, { 11,  0,   320 }, { 11,  0,   436 }, { 11,  0,   525 },
+  { 11,  0,   855 }, { 11,  0,   873 }, { 12,  0,    41 }, { 12,  0,   286 },
+  { 13,  0,   103 }, { 13,  0,   284 }, { 14,  0,   255 }, { 14,  0,   262 },
+  { 15,  0,   117 }, { 15,  0,   127 }, {  7,  0,   475 }, { 12,  0,    45 },
+  { 19, 10,   112 }, {  4, 11,   567 }, {  9, 11,   859 }, {  6,  0,   713 },
+  {  6,  0,   969 }, {  6,  0,  1290 }, {  6,  0,  1551 }, {  5,  0,   327 },
+  {  6,  0,   552 }, {  6,  0,  1292 }, {  7,  0,  1754 }, {  9,  0,   604 },
+  {  4,  0,   223 }, {  6,  0,   359 }, { 11,  0,     3 }, { 13,  0,   108 },
+  { 14,  0,    89 }, { 16,  0,    22 }, {  5, 11,   762 }, {  7, 11,  1880 },
+  {  9, 11,   680 }, { 11, 11,   798 }, {  5,  0,    80 }, {  6,  0,   405 },
+  {  7,  0,   403 }, {  7,  0,  1502 }, {  8,  0,   456 }, {  9,  0,   487 },
+  {  9,  0,   853 }, {  9,  0,   889 }, { 10,  0,   309 }, { 11,  0,   721 },
+  { 11,  0,   994 }, { 12,  0,   430 }, { 13,  0,   165 }, {  5, 11,   298 },
+  {  4, 10,   647 }, {  6,  0,  2016 }, { 18, 10,    10 }, { 18, 11,    10 },
+  {  4,  0,   453 }, {  5,  0,   887 }, {  6,  0,   535 }, {  8,  0,     6 },
+  {  8,  0,   543 }, {  8,  0,   826 }, {  8,  0,   975 }, { 10,  0,   961 },
+  { 10,  0,   962 }, { 10, 10,   220 }, {  6,  0,  1891 }, {  6,  0,  1893 },
+  {  9,  0,   916 }, {  9,  0,   965 }, {  9,  0,   972 }, { 12,  0,   801 },
+  { 12,  0,   859 }, { 12,  0,   883 }, { 15,  0,   226 }, { 21,  0,    51 },
+  {  4, 10,   109 }, {  7, 11,   267 }, {  7, 11,    92 }, {  7, 11,   182 },
+  {  8, 11,   453 }, {  9, 11,   204 }, { 11, 11,   950 }, { 12, 11,    94 },
+  { 12, 11,   644 }, { 16, 11,    20 }, { 16, 11,    70 }, { 16, 11,    90 },
+  { 19, 11,    55 }, {  6, 10,  1746 }, {  6, 11,    71 }, {  7, 11,   845 },
+  {  7, 11,  1308 }, {  8, 11,   160 }, {  9, 11,   318 }, {  5,  0,   101 },
+  {  6,  0,    88 }, {  7,  0,   263 }, {  7,  0,   628 }, {  7,  0,  1677 },
+  {  8,  0,   349 }, {  9,  0,   100 }, { 10,  0,   677 }, { 14,  0,   169 },
+  { 14,  0,   302 }, { 14,  0,   313 }, { 15,  0,    48 }, { 15,  0,    84 },
+  {  7, 11,   237 }, {  8, 11,   664 }, {  9, 11,    42 }, {  9, 11,   266 },
+  {  9, 11,   380 }, {  9, 11,   645 }, { 10, 11,   177 }, { 10, 11,   276 },
+  { 10, 11,    69 }, {  4,  0,   310 }, {  7,  0,   708 }, {  7,  0,   996 },
+  {  9,  0,   795 }, { 10,  0,   390 }, { 10,  0,   733 }, { 11,  0,   451 },
+  { 12,  0,   249 }, { 14,  0,   115 }, { 14,  0,   286 }, { 15,  0,   100 },
+  {  5,  0,   587 }, {  4, 10,    40 }, { 10, 10,    67 }, { 11, 10,   117 },
+  { 11, 10,   768 }, { 11, 10,   935 }, {  6,  0,  1942 }, {  7,  0,   512 },
+  {  8,  0,   983 }, {  7, 10,   992 }, {  8, 10,   301 }, {  9, 10,   722 },
+  { 12, 10,    63 }, { 13, 10,    29 }, { 14, 10,   161 }, { 15, 10,    18 },
+  {  8, 11,    76 }, { 11, 10,   923 }, {  6,  0,   645 }, {  6,  0,   851 },
+  {  4,  0,   498 }, {  4, 11,   293 }, {  7,  0,   217 }, {  8,  0,   140 },
+  { 10,  0,   610 }, { 14, 11,   352 }, { 17, 11,    53 }, { 18, 11,   146 },
+  { 18, 11,   152 }, { 19, 11,    11 }, { 22, 11,    54 }, {  6,  0,  1448 },
+  { 10, 11,   841 }, {  5,  0,   905 }, {  4, 11,   605 }, {  7, 11,   518 },
+  {  7, 11,  1282 }, {  7, 11,  1918 }, { 10, 11,   180 }, { 11, 11,   218 },
+  { 11, 11,   917 }, {  7, 10,   825 }, { 12, 10,   328 }, {  4,  0,   456 },
+  {  7,  0,   105 }, {  7,  0,   358 }, {  7,  0,  1637 }, {  8,  0,   643 },
+  { 11,  0,   483 }, {  6,  0,   792 }, {  6, 11,    96 }, {  7, 11,  1426 },
+  {  9, 11,   691 }, {  4, 11,   651 }, {  5, 11,   289 }, {  7, 11,   688 },
+  {  8, 11,    35 }, {  9, 11,   511 }, { 10, 11,   767 }, { 19, 11,   118 },
+  { 22,  0,    56 }, {  5,  0,   243 }, {  5,  0,   535 }, {  6, 10,   204 },
+  { 10, 10,   320 }, { 10, 10,   583 }, { 13, 10,   502 }, { 14, 10,    72 },
+  { 14, 10,   274 }, { 14, 10,   312 }, { 14, 10,   344 }, { 15, 10,   159 },
+  { 16, 10,    62 }, { 16, 10,    69 }, { 17, 10,    30 }, { 18, 10,    42 },
+  { 18, 10,    53 }, { 18, 10,    84 }, { 18, 10,   140 }, { 19, 10,    68 },
+  { 19, 10,    85 }, { 20, 10,     5 }, { 20, 10,    45 }, { 20, 10,   101 },
+  { 22, 10,     7 }, { 22, 10,    20 }, {  4, 10,   558 }, {  6, 10,   390 },
+  {  7, 10,   162 }, {  7, 10,   689 }, {  9, 10,   360 }, { 10, 10,   653 },
+  { 18, 11,    23 }, {  7,  0,  1748 }, {  5, 10,   856 }, {  6, 10,  1672 },
+  {  6, 10,  1757 }, {  6, 10,  1781 }, {  5,  0,   539 }, {  5,  0,   754 },
+  {  6,  0,   876 }, {  4, 11,   704 }, {  7, 11,  1078 }, {  5, 10,    92 },
+  { 10, 10,   736 }, { 12, 10,   102 }, { 17,  0,    91 }, {  5, 10,   590 },
+  {  9, 10,   213 }, {  6,  0,  1565 }, {  6,  0,    91 }, {  7,  0,   435 },
+  {  4,  0,   939 }, { 12,  0,   792 }, {  6,  0,  1399 }, {  4,  0,    16 },
+  {  5,  0,   316 }, {  5,  0,   842 }, {  6,  0,   370 }, {  6,  0,  1778 },
+  {  8,  0,   166 }, { 11,  0,   812 }, { 12,  0,   206 }, { 12,  0,   351 },
+  { 14,  0,   418 }, { 16,  0,    15 }, { 16,  0,    34 }, { 18,  0,     3 },
+  { 19,  0,     3 }, { 19,  0,     7 }, { 20,  0,     4 }, { 21,  0,    21 },
+  {  4, 11,   720 }, {  5, 11,   306 }, { 16,  0,    95 }, {  5, 11,   431 },
+  {  4, 11,   234 }, {  7,  0,   551 }, {  4,  0,   999 }, {  6,  0,  1966 },
+  {  6,  0,  2042 }, {  7,  0,   619 }, { 10,  0,   547 }, { 11,  0,   122 },
+  { 12,  0,   601 }, { 15,  0,     7 }, { 20,  0,    20 }, {  5, 11,   464 },
+  {  6, 11,   236 }, {  7, 11,   276 }, {  7, 11,   696 }, {  7, 11,   914 },
+  {  7, 11,  1108 }, {  7, 11,  1448 }, {  9, 11,    15 }, {  9, 11,   564 },
+  { 10, 11,    14 }, { 12, 11,   565 }, { 13, 11,   449 }, { 14, 11,    53 },
+  { 15, 11,    13 }, { 16, 11,    64 }, { 17, 11,    41 }, {  6,  0,   884 },
+  {  6,  0,  1019 }, {  6,  0,  1150 }, {  6, 11,  1767 }, { 12, 11,   194 },
+  { 17, 11,   107 }, {  8, 10,   503 }, {  5, 11,   840 }, {  7,  0,   671 },
+  {  6, 10,   466 }, {  4,  0,   888 }, {  4,  0,   149 }, { 10,  0,   368 },
+  {  4,  0,   154 }, {  7,  0,  1134 }, {  8,  0,   105 }, {  7,  0,   983 },
+  {  9, 11,   642 }, { 11, 11,   236 }, { 14, 11,   193 }, {  4,  0,    31 },
+  {  6,  0,   429 }, {  7,  0,   962 }, {  9,  0,   458 }, { 11,  0,   691 },
+  {  6,  0,   643 }, {  6,  0,  1102 }, {  4,  0,   312 }, {  4, 11,    68 },
+  {  5, 11,   634 }, {  6, 11,   386 }, {  7, 11,   794 }, {  8, 11,   273 },
+  {  9, 11,   563 }, { 10, 11,   105 }, { 10, 11,   171 }, { 11, 11,    94 },
+  { 11, 11,   354 }, {  5,  0,   740 }, {  7,  0,  1642 }, {  4, 11,    95 },
+  {  7, 11,   416 }, {  8, 11,   211 }, { 11, 11,   830 }, {  4,  0,   236 },
+  { 10, 10,   241 }, {  7, 11,   731 }, { 13, 11,    20 }, { 15, 11,    11 },
+  {  5,  0,   836 }, {  5,  0,   857 }, {  6,  0,  1680 }, {  7,  0,    59 },
+  { 10,  0,    68 }, { 11,  0,   494 }, { 24, 11,     6 }, {  4,  0,    81 },
+  { 11,  0,   867 }, {  7,  0,   795 }, {  5, 11,   689 }, {  4,  0,  1001 },
+  {  5,  0,   282 }, {  6,  0,  1932 }, {  6,  0,  1977 }, {  6,  0,  1987 },
+  {  6,  0,  1992 }, {  8,  0,   650 }, {  8,  0,   919 }, {  8,  0,   920 },
+  {  8,  0,   923 }, {  8,  0,   926 }, {  8,  0,   927 }, {  8,  0,   931 },
+  {  8,  0,   939 }, {  8,  0,   947 }, {  8,  0,   956 }, {  8,  0,   997 },
+  {  9,  0,   907 }, { 10,  0,   950 }, { 10,  0,   953 }, { 10,  0,   954 },
+  { 10,  0,   956 }, { 10,  0,   958 }, { 10,  0,   959 }, { 10,  0,   964 },
+  { 10,  0,   970 }, { 10,  0,   972 }, { 10,  0,   973 }, { 10,  0,   975 },
+  { 10,  0,   976 }, { 10,  0,   980 }, { 10,  0,   981 }, { 10,  0,   984 },
+  { 10,  0,   988 }, { 10,  0,   990 }, { 10,  0,   995 }, { 10,  0,   999 },
+  { 10,  0,  1002 }, { 10,  0,  1003 }, { 10,  0,  1005 }, { 10,  0,  1006 },
+  { 10,  0,  1008 }, { 10,  0,  1009 }, { 10,  0,  1012 }, { 10,  0,  1014 },
+  { 10,  0,  1015 }, { 10,  0,  1019 }, { 10,  0,  1020 }, { 10,  0,  1022 },
+  { 12,  0,   959 }, { 12,  0,   961 }, { 12,  0,   962 }, { 12,  0,   963 },
+  { 12,  0,   964 }, { 12,  0,   965 }, { 12,  0,   967 }, { 12,  0,   968 },
+  { 12,  0,   969 }, { 12,  0,   970 }, { 12,  0,   971 }, { 12,  0,   972 },
+  { 12,  0,   973 }, { 12,  0,   974 }, { 12,  0,   975 }, { 12,  0,   976 },
+  { 12,  0,   977 }, { 12,  0,   979 }, { 12,  0,   981 }, { 12,  0,   982 },
+  { 12,  0,   983 }, { 12,  0,   984 }, { 12,  0,   985 }, { 12,  0,   986 },
+  { 12,  0,   987 }, { 12,  0,   989 }, { 12,  0,   990 }, { 12,  0,   992 },
+  { 12,  0,   993 }, { 12,  0,   995 }, { 12,  0,   998 }, { 12,  0,   999 },
+  { 12,  0,  1000 }, { 12,  0,  1001 }, { 12,  0,  1002 }, { 12,  0,  1004 },
+  { 12,  0,  1005 }, { 12,  0,  1006 }, { 12,  0,  1007 }, { 12,  0,  1008 },
+  { 12,  0,  1009 }, { 12,  0,  1010 }, { 12,  0,  1011 }, { 12,  0,  1012 },
+  { 12,  0,  1014 }, { 12,  0,  1015 }, { 12,  0,  1016 }, { 12,  0,  1017 },
+  { 12,  0,  1018 }, { 12,  0,  1019 }, { 12,  0,  1022 }, { 12,  0,  1023 },
+  { 14,  0,   475 }, { 14,  0,   477 }, { 14,  0,   478 }, { 14,  0,   479 },
+  { 14,  0,   480 }, { 14,  0,   482 }, { 14,  0,   483 }, { 14,  0,   484 },
+  { 14,  0,   485 }, { 14,  0,   486 }, { 14,  0,   487 }, { 14,  0,   488 },
+  { 14,  0,   489 }, { 14,  0,   490 }, { 14,  0,   491 }, { 14,  0,   492 },
+  { 14,  0,   493 }, { 14,  0,   494 }, { 14,  0,   495 }, { 14,  0,   496 },
+  { 14,  0,   497 }, { 14,  0,   498 }, { 14,  0,   499 }, { 14,  0,   500 },
+  { 14,  0,   501 }, { 14,  0,   502 }, { 14,  0,   503 }, { 14,  0,   504 },
+  { 14,  0,   506 }, { 14,  0,   507 }, { 14,  0,   508 }, { 14,  0,   509 },
+  { 14,  0,   510 }, { 14,  0,   511 }, { 16,  0,   113 }, { 16,  0,   114 },
+  { 16,  0,   115 }, { 16,  0,   117 }, { 16,  0,   118 }, { 16,  0,   119 },
+  { 16,  0,   121 }, { 16,  0,   122 }, { 16,  0,   123 }, { 16,  0,   124 },
+  { 16,  0,   125 }, { 16,  0,   126 }, { 16,  0,   127 }, { 18,  0,   242 },
+  { 18,  0,   243 }, { 18,  0,   244 }, { 18,  0,   245 }, { 18,  0,   248 },
+  { 18,  0,   249 }, { 18,  0,   250 }, { 18,  0,   251 }, { 18,  0,   252 },
+  { 18,  0,   253 }, { 18,  0,   254 }, { 18,  0,   255 }, { 20,  0,   125 },
+  { 20,  0,   126 }, { 20,  0,   127 }, {  7, 11,  1717 }, {  7, 11,  1769 },
+  { 10, 11,   546 }, {  7, 11,  1127 }, {  7, 11,  1572 }, { 10, 11,   297 },
+  { 10, 11,   422 }, { 11, 11,   764 }, { 11, 11,   810 }, { 12, 11,   264 },
+  { 13, 11,   102 }, { 13, 11,   300 }, { 13, 11,   484 }, { 14, 11,   147 },
+  { 14, 11,   229 }, { 17, 11,    71 }, { 18, 11,   118 }, { 19, 11,   120 },
+  {  6,  0,  1148 }, {  6,  0,  1586 }, {  4,  0,   775 }, {  7, 10,   954 },
+  {  5, 11,   864 }, {  5, 11,   928 }, { 10, 11,   189 }, {  7, 10,  1958 },
+  {  6, 10,   549 }, {  8, 10,    34 }, {  8, 10,   283 }, {  9, 10,   165 },
+  { 10, 10,   475 }, {  5, 10,   652 }, {  5, 10,   701 }, {  7, 10,   449 },
+  {  7, 11,   695 }, {  4, 10,   655 }, {  7, 10,   850 }, { 17, 10,    75 },
+  { 18, 10,   137 }, { 12, 11,   682 }, {  5, 11,   523 }, {  8,  0,   970 },
+  {  8, 10,   670 }, {  8, 11,   555 }, {  7, 11,    76 }, {  8, 11,    44 },
+  {  9, 11,   884 }, { 10, 11,   580 }, { 11, 11,   399 }, { 11, 11,   894 },
+  { 15, 11,   122 }, { 18, 11,   144 }, { 19, 11,    61 }, {  6, 10,   159 },
+  {  6, 10,   364 }, {  7, 10,   516 }, {  7, 10,  1439 }, {  9, 10,   518 },
+  {  4,  0,    71 }, {  5,  0,   376 }, {  7,  0,   119 }, { 10,  0,   665 },
+  { 13, 10,   151 }, { 11,  0,   827 }, { 14,  0,    34 }, { 15,  0,   148 },
+  {  5, 11,   518 }, {  4,  0,   479 }, {  7, 11,  1787 }, {  7, 11,  1852 },
+  {  7, 10,   993 }, {  7,  0,   607 }, {  8,  0,    99 }, {  6,  0,  1960 },
+  {  4,  0,   793 }, {  4,  0,    41 }, {  5,  0,    74 }, {  7,  0,  1627 },
+  { 11,  0,   871 }, { 12,  0,   619 }, {  7,  0,    94 }, { 11,  0,   329 },
+  { 11,  0,   965 }, { 12,  0,   241 }, { 14,  0,   354 }, { 15,  0,    22 },
+  { 20,  0,    63 }, {  7, 10,   501 }, {  9, 10,   111 }, { 10, 10,   141 },
+  { 11, 10,   332 }, { 13, 10,    43 }, { 13, 10,   429 }, { 14, 10,   130 },
+  { 14, 10,   415 }, { 17, 10,   102 }, {  9,  0,   209 }, {  9,  0,   300 },
+  {  6,  0,  1497 }, { 10, 11,   255 }, {  4, 11,   934 }, {  5, 11,   138 },
+  {  8, 11,   610 }, {  5,  0,    98 }, {  6,  0,  1316 }, { 10, 11,   804 },
+  { 10, 11,   832 }, {  8, 11,    96 }, {  9, 11,    36 }, { 10, 11,   607 },
+  { 11, 11,   423 }, { 11, 11,   442 }, { 12, 11,   309 }, { 14, 11,   199 },
+  { 15, 11,    90 }, { 17, 11,   110 }, {  4,  0,   463 }, {  5, 10,   149 },
+  {  8, 10,   233 }, {  5, 10,   935 }, {  4, 11,   652 }, {  8, 11,   320 },
+  {  9, 11,    13 }, {  9, 11,   398 }, {  9, 11,   727 }, { 10, 11,    75 },
+  { 10, 11,   184 }, { 10, 11,   230 }, { 10, 11,   564 }, { 10, 11,   569 },
+  { 11, 11,   973 }, { 12, 11,    70 }, { 12, 11,   189 }, { 13, 11,    57 },
+  { 13, 11,   257 }, { 22, 11,     6 }, { 22, 11,    16 }, { 14,  0,   291 },
+  { 12, 10,   582 }, { 18, 10,   131 }, {  8, 10,   801 }, {  5,  0,   984 },
+  { 17, 11,   116 }, {  4, 11,   692 }, {  5, 11,   321 }, {  4,  0,   182 },
+  {  6,  0,   205 }, {  7,  0,   220 }, {  4,  0,    42 }, {  9,  0,   205 },
+  {  9,  0,   786 }, { 10,  0,   659 }, {  6,  0,   801 }, { 11, 11,   130 },
+  { 12, 11,   609 }, {  4,  0,   635 }, {  5, 11,   345 }, {  7, 11,  1016 },
+  { 11,  0,   533 }, {  4,  0,   371 }, {  4,  0,   272 }, {  7,  0,   836 },
+  {  6,  0,  1282 }, {  7, 11,  1100 }, {  5,  0,   825 }, {  6,  0,  1640 },
+  {  7, 11,  1325 }, {  5, 11,   673 }, {  4, 11,   287 }, {  5, 11,  1018 },
+  {  7,  0,   357 }, {  6,  0,   467 }, {  9,  0,   879 }, {  7,  0,   317 },
+  {  7,  0,   569 }, {  6,  0,   924 }, {  6,  0,  1588 }, {  5, 11,    34 },
+  {  5, 10,   406 }, { 10, 11,   724 }, { 12, 11,   444 }, { 13, 11,   354 },
+  { 18, 11,    32 }, { 23, 11,    24 }, { 23, 11,    31 }, { 24, 11,     5 },
+  {  6,  0,  1795 }, {  6,  0,  1835 }, {  6,  0,  1836 }, {  6,  0,  1856 },
+  {  8,  0,   844 }, {  8,  0,   849 }, {  8,  0,   854 }, {  8,  0,   870 },
+  {  8,  0,   887 }, { 10,  0,   852 }, { 10,  0,   942 }, {  6, 10,    69 },
+  {  7, 10,   117 }, {  9,  0,   307 }, {  4,  0,   944 }, {  6,  0,  1799 },
+  {  6,  0,  1825 }, { 10,  0,   848 }, { 10,  0,   875 }, { 10,  0,   895 },
+  { 10,  0,   899 }, { 10,  0,   902 }, { 12,  0,   773 }, { 11,  0,    43 },
+  { 13,  0,    72 }, { 13,  0,   142 }, {  7, 10,  1830 }, {  6, 11,   382 },
+  {  4, 10,   432 }, {  7, 10,   824 }, {  4, 11,   329 }, {  7,  0,  1820 },
+  { 11, 11,   124 }, {  5, 10,   826 }, {  5,  0,   525 }, {  4, 11,   906 },
+  {  7, 11,  1940 }, {  8, 11,   366 }, { 10, 11,    10 }, {  4, 11,   123 },
+  {  4, 11,   649 }, {  5, 11,   605 }, {  7, 11,  1509 }, {  8, 11,    36 },
+  {  6,  0,   110 }, {  7,  0,  1681 }, {  5,  0,   493 }, {  5, 11,   767 },
+  {  4,  0,   174 }, {  7,  0,   911 }, { 10, 11,   786 }, {  8,  0,   417 },
+  {  9,  0,   782 }, {  5, 10,  1000 }, {  7,  0,   733 }, {  9,  0,   583 },
+  {  4, 10,   297 }, {  6, 10,   529 }, {  7, 10,   152 }, {  7, 10,   713 },
+  {  7, 10,  1845 }, {  8, 10,   710 }, {  8, 10,   717 }, { 12, 10,   639 },
+  { 12, 10,   685 }, {  4,  0,    32 }, {  5,  0,   215 }, {  6,  0,   269 },
+  {  7,  0,  1782 }, {  7,  0,  1892 }, { 10,  0,    16 }, { 11,  0,   822 },
+  { 11,  0,   954 }, { 13,  0,   481 }, {  4, 11,   273 }, {  5, 11,   658 },
+  {  5, 11,   995 }, {  8,  0,   477 }, {  6, 11,    72 }, {  7, 11,  1345 },
+  {  5,  0,   308 }, {  7,  0,  1088 }, {  4, 10,   520 }, {  7, 10,   575 },
+  {  5, 11,   589 }, {  5,  0,   126 }, {  8,  0,   297 }, {  9,  0,   366 },
+  { 12,  0,   374 }, {  7,  0,  1551 }, { 11,  0,   361 }, {  5, 11,   117 },
+  {  6, 11,   514 }, {  6, 11,   541 }, {  7, 11,  1164 }, {  7, 11,  1436 },
+  {  8, 11,   220 }, {  8, 11,   648 }, { 10, 11,   688 }, { 11, 11,   560 },
+  {  5, 11,   686 }, {  4,  0,   946 }, {  6,  0,  1807 }, {  8,  0,   871 },
+  { 10,  0,   854 }, { 10,  0,   870 }, { 10,  0,   888 }, { 10,  0,   897 },
+  { 10,  0,   920 }, { 12,  0,   722 }, { 12,  0,   761 }, { 12,  0,   763 },
+  { 12,  0,   764 }, { 14,  0,   454 }, { 14,  0,   465 }, { 16,  0,   107 },
+  { 18,  0,   167 }, { 18,  0,   168 }, { 18,  0,   172 }, {  4,  0,   175 },
+  {  7,  0,  1307 }, {  4,  0,   685 }, {  7, 11,  1834 }, {  5,  0,   797 },
+  {  6,  0,   745 }, {  6,  0,   858 }, {  6,  0,   963 }, {  5,  0,   565 },
+  {  5, 10,   397 }, {  6, 10,   154 }, {  7, 11,   196 }, {  7, 10,   676 },
+  {  8, 10,   443 }, {  8, 10,   609 }, {  9, 10,    24 }, {  9, 10,   325 },
+  { 10, 10,    35 }, { 10, 11,   765 }, { 11, 11,   347 }, { 11, 10,   535 },
+  { 11, 11,   552 }, { 11, 11,   576 }, { 11, 10,   672 }, { 11, 11,   790 },
+  { 11, 10,  1018 }, { 12, 11,   263 }, { 12, 10,   637 }, { 13, 11,   246 },
+  { 13, 11,   270 }, { 13, 11,   395 }, { 14, 11,    74 }, { 14, 11,   176 },
+  { 14, 11,   190 }, { 14, 11,   398 }, { 14, 11,   412 }, { 15, 11,    32 },
+  { 15, 11,    63 }, { 16, 10,    30 }, { 16, 11,    88 }, { 19, 11,   105 },
+  { 13, 11,    84 }, { 13, 11,   122 }, {  4,  0,   252 }, {  7,  0,  1068 },
+  { 10,  0,   434 }, { 11,  0,   228 }, { 11,  0,   426 }, { 13,  0,   231 },
+  { 18,  0,   106 }, { 20,  0,    87 }, {  9,  0,   826 }, {  4, 11,   589 },
+  { 11, 11,   282 }, {  5, 11,   381 }, {  7, 11,  1792 }, {  4,  0,   791 },
+  {  5,  0,   231 }, { 10,  0,   509 }, {  5, 10,   981 }, {  7,  0,   601 },
+  {  9,  0,   277 }, {  9,  0,   674 }, { 10,  0,   178 }, { 10,  0,   418 },
+  { 10,  0,   571 }, { 11,  0,   531 }, { 12,  0,   113 }, { 12,  0,   475 },
+  { 13,  0,    99 }, { 14,  0,   428 }, {  4, 10,    56 }, {  7, 11,   616 },
+  {  7, 10,  1791 }, {  8, 10,   607 }, {  8, 10,   651 }, { 10, 11,   413 },
+  { 11, 10,   465 }, { 11, 10,   835 }, { 12, 10,   337 }, { 13, 10,   480 },
+  {  7,  0,  1591 }, { 16,  0,    43 }, {  9, 10,   158 }, { 10, 10,   411 },
+  {  7,  0,  1683 }, {  8,  0,   289 }, { 11,  0,    45 }, { 12,  0,   278 },
+  { 12,  0,   537 }, {  6, 11,   120 }, {  7, 11,  1188 }, {  7, 11,  1710 },
+  {  8, 11,   286 }, {  9, 11,   667 }, { 11, 11,   592 }, { 11, 11,   730 },
+  {  8, 10,   617 }, {  7,  0,  1120 }, {  7, 11,  1146 }, { 11, 10,   563 },
+  {  4, 11,   352 }, {  4, 10,   369 }, {  7, 11,   687 }, { 15, 11,    38 },
+  {  4,  0,   399 }, {  5,  0,   119 }, {  5,  0,   494 }, {  7,  0,   751 },
+  {  9,  0,   556 }, { 14, 11,   179 }, { 15, 11,   151 }, { 22, 11,    11 },
+  {  4, 11,   192 }, {  5, 11,    49 }, {  6, 11,   200 }, {  6, 11,   293 },
+  {  6, 11,  1696 }, {  7, 11,   488 }, {  4,  0,   398 }, {  5,  0,   660 },
+  {  7,  0,  1030 }, {  6, 10,   622 }, {  7, 11,   595 }, { 13,  0,   168 },
+  {  4, 11,   147 }, {  7,  0,   973 }, { 10, 10,   624 }, { 14, 10,   279 },
+  {  4, 10,   363 }, {  4,  0,   642 }, {  5, 11,   934 }, {  6,  0,  1615 },
+  {  7, 11,   505 }, {  7, 11,   523 }, {  7,  0,   594 }, {  7,  0,   851 },
+  {  7,  0,  1858 }, {  9,  0,   411 }, {  9,  0,   574 }, {  9,  0,   666 },
+  {  9,  0,   737 }, { 10,  0,   346 }, { 10,  0,   712 }, { 11,  0,   246 },
+  { 11,  0,   432 }, { 11,  0,   517 }, { 11,  0,   647 }, { 11,  0,   679 },
+  { 11,  0,   727 }, { 12,  0,   304 }, { 12,  0,   305 }, { 12,  0,   323 },
+  { 12,  0,   483 }, { 12,  0,   572 }, { 12,  0,   593 }, { 12,  0,   602 },
+  { 13,  0,    95 }, { 13,  0,   101 }, { 13,  0,   171 }, { 13,  0,   315 },
+  { 13,  0,   378 }, { 13,  0,   425 }, { 13,  0,   475 }, { 14,  0,    63 },
+  { 14,  0,   380 }, { 14,  0,   384 }, { 15,  0,   133 }, { 18,  0,   112 },
+  { 20,  0,    72 }, {  7,  0,  1093 }, {  4,  0,   679 }, {  8,  0,   913 },
+  { 10,  0,   903 }, { 10,  0,   915 }, { 12,  0,   648 }, { 12,  0,   649 },
+  { 14,  0,   455 }, { 16,  0,   112 }, { 10, 11,   438 }, {  9,  0,   203 },
+  {  6, 10,   292 }, {  6,  0,  1492 }, {  7,  0,  1374 }, {  8,  0,   540 },
+  {  5, 10,   177 }, {  6, 10,   616 }, {  7, 10,   827 }, {  9, 10,   525 },
+  { 10, 10,   656 }, {  7,  0,  1486 }, {  9,  0,   714 }, { 10, 10,    31 },
+  {  8,  0,   825 }, {  6,  0,  1511 }, {  4, 11,   637 }, {  6,  0,   952 },
+  {  4, 10,   161 }, {  5, 10,   631 }, {  5,  0,   143 }, {  5,  0,   769 },
+  {  6,  0,  1760 }, {  7,  0,   682 }, {  7,  0,  1992 }, {  8,  0,   736 },
+  {  4,  0,   700 }, {  6,  0,  1540 }, {  4, 11,   777 }, {  9, 11,   867 },
+  { 10, 11,   837 }, {  7,  0,  1557 }, {  7, 10,  1684 }, {  5,  0,   860 },
+  {  6,  0,   422 }, {  7,  0,     0 }, {  7,  0,  1544 }, {  9,  0,   605 },
+  { 11,  0,   990 }, { 12,  0,   235 }, { 12,  0,   453 }, { 13,  0,    47 },
+  { 13,  0,   266 }, {  9, 10,   469 }, {  9, 10,   709 }, { 12, 10,   512 },
+  { 14, 10,    65 }, { 17, 10,    12 }, { 11,  0,   807 }, { 10, 10,   229 },
+  { 11, 10,    73 }, { 11, 10,   376 }, {  6, 11,   170 }, {  7, 11,  1080 },
+  {  8, 11,   395 }, {  8, 11,   487 }, { 11, 11,   125 }, { 13, 11,   147 },
+  {  5,  0,   515 }, {  9,  0,   131 }, {  7,  0,  1605 }, { 11,  0,   962 },
+  { 18,  0,   139 }, {  4,  0,   646 }, {  4,  0,   396 }, {  7,  0,   728 },
+  {  9,  0,   117 }, { 13,  0,   202 }, { 20,  0,    51 }, {  6,  0,   121 },
+  {  6,  0,   124 }, {  6,  0,   357 }, {  7,  0,  1138 }, {  7,  0,  1295 },
+  {  8,  0,   162 }, {  8,  0,   508 }, { 11,  0,   655 }, {  4, 11,   535 },
+  {  6, 10,   558 }, {  7, 10,   651 }, {  8, 11,   618 }, {  9, 10,     0 },
+  { 10, 10,    34 }, { 11, 10,  1008 }, {  7, 11,  1245 }, { 10,  0,   357 },
+  { 22, 11,    23 }, {  5,  0,   237 }, {  7,  0,  1784 }, {  7, 10,  1832 },
+  { 10, 10,   374 }, {  4,  0,   713 }, {  4, 11,    46 }, {  6,  0,  1536 },
+  { 10,  0,   348 }, {  5, 11,   811 }, {  6, 11,  1679 }, {  6, 11,  1714 },
+  {  7, 11,  2032 }, { 11, 11,   182 }, { 14, 11,   195 }, {  6,  0,   523 },
+  {  7,  0,   738 }, {  7, 10,   771 }, {  7, 10,  1731 }, {  9, 10,   405 },
+  { 10, 10,   421 }, {  7, 11,  1458 }, {  9, 11,   407 }, { 11, 11,    15 },
+  {  6, 11,    34 }, {  7, 11,    69 }, {  7, 11,   640 }, {  7, 11,  1089 },
+  {  8, 11,   708 }, {  8, 11,   721 }, {  9, 11,   363 }, {  9, 11,   643 },
+  { 10, 11,   628 }, { 20, 11,    98 }, {  5,  0,   434 }, {  7,  0,  1877 },
+  {  7,  0,   571 }, { 10,  0,   366 }, {  5, 10,   881 }, {  5, 10,   885 },
+  {  9,  0,   513 }, { 10,  0,    25 }, { 10,  0,    39 }, { 12,  0,   122 },
+  { 12,  0,   187 }, {  4,  0,   580 }, {  5, 10,   142 }, {  6, 10,   546 },
+  {  4, 11,   462 }, {  9,  0,   873 }, {  5, 10,   466 }, { 11, 10,   571 },
+  { 12, 10,   198 }, { 13, 10,   283 }, { 14, 10,   186 }, { 15, 10,    21 },
+  { 15, 10,   103 }, {  7,  0,   171 }, {  4, 10,   185 }, {  5, 10,   257 },
+  {  5, 10,   839 }, {  5, 10,   936 }, {  9, 10,   399 }, { 10, 10,   258 },
+  { 10, 10,   395 }, { 10, 10,   734 }, { 11, 10,  1014 }, { 12, 10,    23 },
+  { 13, 10,   350 }, { 14, 10,   150 }, { 19, 10,     6 }, {  6,  0,   625 },
+  {  7,  0,   107 }, {  7,  0,   838 }, {  8,  0,   550 }, { 10,  0,   401 },
+  {  5, 11,    73 }, {  6, 11,    23 }, {  6, 11,   338 }, {  4,  0,   943 },
+  {  6,  0,  1850 }, { 12,  0,   713 }, { 14,  0,   434 }, { 11,  0,   588 },
+  { 11,  0,   864 }, { 11,  0,   936 }, { 11,  0,   968 }, { 12,  0,    73 },
+  { 12,  0,   343 }, { 12,  0,   394 }, { 13,  0,   275 }, { 14,  0,   257 },
+  { 15,  0,   160 }, {  7, 10,   404 }, {  7, 10,  1377 }, {  7, 10,  1430 },
+  {  7, 10,  2017 }, {  8, 10,   149 }, {  8, 10,   239 }, {  8, 10,   512 },
+  {  8, 10,   793 }, {  8, 10,   818 }, {  9, 10,   474 }, {  9, 10,   595 },
+  { 10, 10,   122 }, { 10, 10,   565 }, { 10, 10,   649 }, { 10, 10,   783 },
+  { 11, 10,   239 }, { 11, 10,   295 }, { 11, 10,   447 }, { 11, 10,   528 },
+  { 11, 10,   639 }, { 11, 10,   800 }, { 12, 10,    25 }, { 12, 10,   157 },
+  { 12, 10,   316 }, { 12, 10,   390 }, { 12, 10,   391 }, { 12, 10,   395 },
+  { 12, 10,   478 }, { 12, 10,   503 }, { 12, 10,   592 }, { 12, 10,   680 },
+  { 13, 10,    50 }, { 13, 10,    53 }, { 13, 10,   132 }, { 13, 10,   198 },
+  { 13, 10,   322 }, { 13, 10,   415 }, { 13, 10,   511 }, { 14, 10,    71 },
+  { 14, 10,   395 }, { 15, 10,    71 }, { 15, 10,   136 }, { 17, 10,   123 },
+  { 18, 10,    93 }, { 19, 10,    58 }, {  5,  0,   768 }, { 11,  0,   103 },
+  { 14,  0,     0 }, {  8, 10,   712 }, {  4,  0,   799 }, {  4,  0,   894 },
+  {  7, 11,   725 }, {  8, 11,   498 }, { 11, 11,   268 }, {  7, 11,  1798 },
+  {  7, 11,   773 }, { 13, 11,   360 }, {  4, 10,   377 }, { 24, 10,    13 },
+  {  7,  0,  1673 }, {  4, 11,   583 }, {  6,  0,  1052 }, {  5, 11,   220 },
+  { 12, 11,    69 }, {  4, 11,   544 }, {  4, 10,   180 }, {  7, 10,  1906 },
+  {  6,  0,   272 }, {  4,  0,   441 }, {  6,  0,  1421 }, {  4,  0,     9 },
+  {  5,  0,   128 }, {  7,  0,   368 }, { 11,  0,   480 }, { 20,  0,     3 },
+  {  5, 11,   176 }, {  6, 11,   437 }, {  6, 11,   564 }, { 11, 11,   181 },
+  { 13, 11,   183 }, {  4, 10,   491 }, {  7,  0,  1182 }, { 13, 11,    67 },
+  {  6,  0,  1346 }, {  4, 10,   171 }, { 10, 10,   234 }, {  4, 10,   586 },
+  {  7, 10,  1186 }, { 10, 10,   631 }, {  8,  0,   682 }, {  6,  0,  1004 },
+  { 15,  0,    24 }, { 15, 11,    24 }, {  6,  0,   968 }, {  4,  0,     2 },
+  {  6,  0,   742 }, {  6,  0,   793 }, {  7,  0,   545 }, {  7,  0,   894 },
+  {  9, 10,   931 }, { 10, 10,   334 }, { 20, 10,    71 }, {  8, 11,   600 },
+  {  5, 10,   765 }, {  9,  0,   769 }, { 12,  0,   185 }, {  4, 11,   790 },
+  {  5, 11,   273 }, {  6, 11,   394 }, {  7,  0,   474 }, {  9,  0,   578 },
+  {  4, 11,   135 }, {  6, 11,   127 }, {  7, 11,  1185 }, {  7, 11,  1511 },
+  {  8, 11,   613 }, { 11, 11,     5 }, { 12, 11,   133 }, { 12, 11,   495 },
+  { 12, 11,   586 }, { 14, 11,   385 }, { 15, 11,   118 }, { 17, 11,    20 },
+  { 18, 11,    98 }, {  5, 10,   424 }, {  5,  0,   530 }, { 14,  0,   113 },
+  {  6, 11,   230 }, {  7, 11,   961 }, {  7, 11,  1085 }, {  8, 11,   462 },
+  {  7, 11,  1954 }, {  9, 11,   636 }, {  8, 10,   714 }, { 21, 11,     6 },
+  {  7, 10,   685 }, {  9, 10,   420 }, { 10, 10,   269 }, { 10, 10,   285 },
+  { 10, 10,   576 }, { 11, 10,   397 }, { 13, 10,   175 }, { 17, 10,    90 },
+  {  4, 10,   429 }, {  5,  0,   556 }, {  5, 11,   162 }, {  8, 11,    68 },
+  {  4, 11,   654 }, {  4, 11,   156 }, {  7, 11,   998 }, {  7, 11,  1045 },
+  {  7, 11,  1860 }, {  9, 11,    48 }, {  9, 11,   692 }, { 11, 11,   419 },
+  { 11, 11,   602 }, {  6,  0,  1317 }, {  8,  0,    16 }, {  9,  0,   825 },
+  { 12,  0,   568 }, {  7, 11,  1276 }, {  8, 11,   474 }, {  9, 11,   652 },
+  { 18,  0,    97 }, {  7, 10,    18 }, {  7, 10,   699 }, {  7, 10,  1966 },
+  {  8, 10,   752 }, {  9, 10,   273 }, {  9, 10,   412 }, {  9, 10,   703 },
+  { 10, 10,    71 }, { 10, 10,   427 }, { 10, 10,   508 }, { 10,  0,   703 },
+  {  7, 11,  1454 }, { 10, 11,   703 }, {  4, 10,    53 }, {  5, 10,   186 },
+  {  7, 10,   752 }, {  6,  0,   892 }, {  6,  0,  1571 }, {  8, 10,   575 },
+  { 10, 10,   289 }, { 11, 10,   319 }, {  6,  0,   186 }, {  9,  0,   426 },
+  {  6,  0,  1101 }, {  4, 10,   675 }, {  4,  0,   585 }, {  6,  0,  1870 },
+  {  9,  0,   937 }, { 24, 11,    10 }, {  9, 11,   197 }, { 10, 11,   300 },
+  { 12, 11,   473 }, { 13, 11,    90 }, { 13, 11,   405 }, {  4,  0,    93 },
+  {  5,  0,   252 }, {  6,  0,   229 }, {  7,  0,   291 }, {  9,  0,   550 },
+  { 11,  0,   644 }, {  9,  0,   749 }, {  9,  0,   162 }, {  6, 10,   209 },
+  {  8, 10,   468 }, {  9, 10,   210 }, { 11, 10,    36 }, { 12, 10,    28 },
+  { 12, 10,   630 }, { 13, 10,    21 }, { 13, 10,   349 }, { 14, 10,     7 },
+  { 17, 10,    13 }, {  4,  0,   381 }, {  4, 11,   606 }, {  4, 10,   342 },
+  {  7, 10,  1179 }, {  7, 11,  1587 }, {  7, 11,  1707 }, { 10, 11,   528 },
+  { 11, 11,   504 }, { 12, 11,    39 }, { 13, 11,   265 }, { 13, 11,   439 },
+  {  4, 10,   928 }, {  5, 10,   910 }, {  7, 10,  1838 }, {  7, 11,  1978 },
+  {  8, 11,   676 }, {  6,  0,   762 }, {  6,  0,   796 }, {  6,  0,   956 },
+  {  4, 10,   318 }, {  4, 10,   496 }, {  7, 10,   856 }, { 11, 10,   654 },
+  {  9, 11,   242 }, {  4, 11,   361 }, {  5, 11,   315 }, {  4, 11,   461 },
+  {  4, 11,   472 }, {  4,  0,   857 }, {  5,  0,    21 }, {  6,  0,    77 },
+  {  6,  0,   157 }, {  7,  0,   974 }, {  7,  0,  1301 }, {  7,  0,  1339 },
+  {  7,  0,  1490 }, {  7,  0,  1873 }, {  9,  0,   628 }, {  7, 10,   915 },
+  {  8, 10,   247 }, { 19, 10,     0 }, {  4, 10,   202 }, {  5, 10,   382 },
+  {  6, 10,   454 }, {  7, 10,   936 }, {  7, 10,  1803 }, {  8, 10,   758 },
+  {  9, 10,   375 }, {  9, 10,   895 }, { 10, 10,   743 }, { 10, 10,   792 },
+  { 11, 10,   978 }, { 11, 10,  1012 }, { 14, 10,   109 }, {  7, 11,   617 },
+  { 10, 11,   498 }, { 11, 11,   501 }, { 12, 11,    16 }, { 12, 11,   150 },
+  {  7, 10,  1150 }, {  7, 10,  1425 }, {  7, 10,  1453 }, { 10, 11,   747 },
+  { 12, 10,   513 }, {  5, 11,   155 }, { 11,  0,   919 }, { 13,  0,   409 },
+  { 10, 10,   791 }, { 10,  0,   633 }, { 11, 11,   729 }, {  7, 11,   163 },
+  {  8, 11,   319 }, {  9, 11,   402 }, { 10, 11,    24 }, { 10, 11,   681 },
+  { 11, 11,   200 }, { 11, 11,   567 }, { 12, 11,   253 }, { 12, 11,   410 },
+  { 14, 11,   219 }, {  5, 11,   475 }, {  7, 11,  1780 }, {  9, 11,   230 },
+  { 11, 11,   297 }, { 11, 11,   558 }, { 14, 11,   322 }, { 19, 11,    76 },
+  {  7,  0,   332 }, {  6, 10,   445 }, {  9, 10,   909 }, {  7, 11,  1956 },
+  {  8, 11,   274 }, {  6, 10,   578 }, {  7,  0,  1489 }, {  7, 11,  1848 },
+  {  5, 11,   944 }, {  6, 11,  1769 }, {  4, 11,   144 }, {  8, 10,   766 },
+  {  4,  0,   832 }, {  7, 10,   541 }, {  8,  0,   398 }, {  9,  0,   681 },
+  { 11,  0,   632 }, {  8,  0,   645 }, {  9,  0,   791 }, { 10,  0,    93 },
+  { 16,  0,    13 }, { 17,  0,    23 }, { 18,  0,   135 }, { 19,  0,    12 },
+  { 20,  0,     1 }, { 20,  0,    12 }, { 20,  0,    14 }, {  6, 11,   247 },
+  {  9, 11,   555 }, {  6,  0,    20 }, {  4,  0,   800 }, {  7,  0,  1841 },
+  { 11, 10,   983 }, {  9, 10,   768 }, {  4, 10,   584 }, { 13, 11,    51 },
+  {  6,  0,  1993 }, {  4, 11,   620 }, { 10, 11,   280 }, {  8,  0,   769 },
+  { 11,  0,   290 }, { 11,  0,   665 }, {  7, 11,  1810 }, { 11, 11,   866 },
+  { 12, 11,   103 }, { 13, 11,   495 }, { 17, 11,    67 }, { 19, 11,    74 },
+  {  6,  0,  1426 }, { 11,  0,    60 }, {  4, 10,   326 }, {  7, 10,  1770 },
+  {  7,  0,  1874 }, {  9,  0,   641 }, {  4, 10,   226 }, {  6,  0,   644 },
+  {  5, 10,   426 }, {  8, 10,    30 }, {  9, 10,     2 }, { 11, 10,   549 },
+  { 19, 10,   122 }, {  5, 11,   428 }, { 10, 11,   442 }, {  7, 11,  1871 },
+  {  7,  0,  1757 }, { 19, 10,   117 }, {  7,  0,   937 }, {  7,  0,  1652 },
+  {  6,  0,   654 }, {  6,  0,  1476 }, {  5, 11,    99 }, {  7,  0,   527 },
+  {  4, 10,   345 }, {  4, 10,   385 }, {  4, 11,   397 }, {  7, 10,   265 },
+  {  7, 10,   587 }, {  4,  0,   579 }, {  5,  0,   226 }, {  5,  0,   323 },
+  {  7,  0,   960 }, {  6,  0,  1486 }, {  8, 11,   502 }, { 16, 11,     9 },
+  {  4, 10,   347 }, {  5, 10,   423 }, {  5, 10,   996 }, {  7, 10,  1329 },
+  {  7, 11,   727 }, { 18, 11,    73 }, {  4, 11,   485 }, {  7, 11,   353 },
+  {  7, 10,  1259 }, {  7, 11,  1523 }, {  9, 10,   125 }, { 11, 10,    65 },
+  {  6,  0,   325 }, {  5, 10,   136 }, {  6, 11,   366 }, {  7, 11,  1384 },
+  {  7, 11,  1601 }, {  8, 10,   644 }, { 10, 11,   160 }, {  6,  0,  1345 },
+  {  9, 11,   282 }, { 18,  0,    91 }, { 19,  0,    70 }, {  8,  0,   404 },
+  {  4, 11,   157 }, {  5, 11,   471 }, {  5,  0,   973 }, {  6,  0,   135 },
+  {  7,  0,  1176 }, {  8, 11,   116 }, { 11, 11,   551 }, { 14, 11,   159 },
+  {  4,  0,   549 }, {  4, 10,   433 }, {  5, 10,   719 }, {  8,  0,   976 },
+  {  5, 11,   160 }, {  7, 11,   363 }, {  7, 11,   589 }, { 10, 11,   170 },
+  { 13, 11,    55 }, { 16,  0,    21 }, { 16,  0,    51 }, {  7,  0,   314 },
+  {  7, 10,  1363 }, {  4, 11,   108 }, {  7, 11,   405 }, { 10, 11,   491 },
+  { 11, 11,   498 }, { 18,  0,     4 }, {  4, 10,   555 }, {  8, 10,   536 },
+  { 10, 10,   288 }, { 11, 10,  1005 }, {  7, 11,  1005 }, {  6,  0,   281 },
+  {  7,  0,     6 }, {  8,  0,   282 }, {  8,  0,   480 }, {  8,  0,   499 },
+  {  9,  0,   198 }, { 10,  0,   143 }, { 10,  0,   169 }, { 10,  0,   211 },
+  { 10,  0,   417 }, { 10,  0,   574 }, { 11,  0,   147 }, { 11,  0,   395 },
+  { 12,  0,    75 }, { 12,  0,   407 }, { 12,  0,   608 }, { 13,  0,   500 },
+  { 14,  0,   251 }, {  6,  0,  1093 }, {  6,  0,  1405 }, {  9, 10,   370 },
+  { 10, 10,    90 }, {  4, 11,   926 }, {  5, 11,   983 }, {  7,  0,  1776 },
+  {  6,  0,  1528 }, {  4,  0,   419 }, {  4, 11,   538 }, {  6, 11,   294 },
+  {  7, 11,  1267 }, {  8, 11,   624 }, {  7, 11,  1772 }, { 10, 11,   301 },
+  {  4, 10,   257 }, {  7, 10,  2031 }, {  4,  0,   138 }, {  7,  0,  1012 },
+  {  7,  0,  1280 }, {  9,  0,    76 }, {  7, 10,  1768 }, {  4, 11,   757 },
+  {  5,  0,    29 }, { 12,  0,   638 }, {  7, 11,   655 }, {  7, 11,  1844 },
+  {  7,  0,  1418 }, {  6, 11,   257 }, {  7, 11,  1522 }, {  8, 11,   469 },
+  { 10, 11,    47 }, { 14, 11,   278 }, {  6, 10,    83 }, {  6, 10,  1733 },
+  {  7, 10,  1389 }, { 11, 11,   204 }, { 11, 11,   243 }, { 12, 11,   293 },
+  {  7, 11,  1875 }, {  6,  0,  1710 }, {  7,  0,  2038 }, {  9, 11,   299 },
+  {  4,  0,    17 }, {  5,  0,    23 }, {  7,  0,   995 }, { 11,  0,   383 },
+  { 11,  0,   437 }, { 12,  0,   460 }, { 12,  0,   532 }, {  5,  0,   862 },
+  {  9, 10,   696 }, {  6,  0,   592 }, { 10,  0,   946 }, { 10, 11,   599 },
+  {  7, 10,  1718 }, {  9, 10,    95 }, {  9, 10,   274 }, { 10, 10,   279 },
+  { 10, 10,   317 }, { 10, 10,   420 }, { 11, 10,   303 }, { 11, 10,   808 },
+  { 12, 10,   134 }, { 12, 10,   367 }, { 13, 10,   149 }, { 13, 10,   347 },
+  { 14, 10,   349 }, { 14, 10,   406 }, { 18, 10,    22 }, { 18, 10,    89 },
+  { 18, 10,   122 }, { 19, 10,    47 }, {  8,  0,    70 }, { 12,  0,   171 },
+  { 13,  0,   272 }, {  5, 10,    26 }, {  4, 10,   550 }, {  9,  0,   812 },
+  { 10,  0,   233 }, { 11,  0,    76 }, {  6,  0,   988 }, {  6,  0,   442 },
+  {  8, 10,   822 }, {  7,  0,   896 }, {  4, 10,   902 }, {  5, 10,   809 },
+  {  6, 10,   122 }, {  5, 11,   150 }, {  7, 11,   106 }, {  8, 11,   603 },
+  {  9, 11,   593 }, {  9, 11,   634 }, { 10, 11,    44 }, { 10, 11,   173 },
+  { 11, 11,   462 }, { 11, 11,   515 }, { 13, 11,   216 }, { 13, 11,   288 },
+  { 14, 11,   400 }, {  8,  0,   483 }, {  7, 10,   262 }, {  6,  0,  1709 },
+  {  5, 10,   620 }, {  4, 10,    34 }, {  5, 10,   574 }, {  7, 10,   279 },
+  {  7, 10,  1624 }, {  8, 10,   601 }, {  9, 10,   170 }, { 19,  0,   119 },
+  { 12, 11,   108 }, { 13, 11,   291 }, { 11,  0,    69 }, { 12,  0,   105 },
+  { 12,  0,   117 }, { 13,  0,   213 }, { 14,  0,    13 }, { 14,  0,    62 },
+  { 14,  0,   177 }, { 14,  0,   421 }, { 15,  0,    19 }, { 18,  0,   141 },
+  {  9,  0,   309 }, { 11, 11,   278 }, { 14, 11,    73 }, {  7,  0,   608 },
+  {  7,  0,   976 }, {  9,  0,   146 }, { 10,  0,   206 }, { 10,  0,   596 },
+  { 13,  0,   218 }, { 14,  0,   153 }, {  5, 10,   332 }, {  6, 10,   261 },
+  {  8, 10,   182 }, { 11, 10,   943 }, {  4, 11,   493 }, { 16, 11,    55 },
+  {  6, 10,  1721 }, {  4,  0,   768 }, {  4, 10,   933 }, {  5, 10,   880 },
+  {  7, 11,   555 }, {  7, 11,  1316 }, {  7, 11,  1412 }, {  7, 11,  1839 },
+  {  9, 11,   192 }, {  9, 11,   589 }, { 11, 11,   241 }, { 11, 11,   676 },
+  { 11, 11,   811 }, { 11, 11,   891 }, { 12, 11,   140 }, { 12, 11,   346 },
+  { 12, 11,   479 }, { 13, 11,    30 }, { 13, 11,    49 }, { 13, 11,   381 },
+  { 14, 11,   188 }, { 15, 11,   150 }, { 16, 11,    76 }, { 18, 11,    30 },
+  { 20, 11,    52 }, {  4,  0,   518 }, {  7,  0,  1136 }, {  6, 11,   568 },
+  {  7, 11,   112 }, {  7, 11,  1804 }, {  8, 11,   362 }, {  8, 11,   410 },
+  {  8, 11,   830 }, {  9, 11,   514 }, { 11, 11,   649 }, { 14, 11,   157 },
+  {  7, 11,   673 }, {  8,  0,   689 }, {  9,  0,   863 }, {  4,  0,    18 },
+  {  7,  0,   145 }, {  7,  0,   444 }, {  7,  0,  1278 }, {  8,  0,    49 },
+  {  8,  0,   400 }, {  9,  0,    71 }, {  9,  0,   250 }, { 10,  0,   459 },
+  { 12,  0,   160 }, { 16,  0,    24 }, {  4, 11,   625 }, { 12,  0,  1020 },
+  {  4,  0,   997 }, {  6,  0,  1946 }, {  6,  0,  1984 }, {  6,  0,  1998 },
+  {  6, 11,    16 }, {  6, 11,   158 }, {  7, 11,    43 }, {  7, 11,   129 },
+  {  7, 11,   181 }, {  8, 11,   276 }, {  8, 11,   377 }, { 10, 11,   523 },
+  { 11, 11,   816 }, { 12, 11,   455 }, { 13, 11,   303 }, { 14, 11,   135 },
+  {  5, 10,   812 }, {  6,  0,   658 }, {  4, 11,     1 }, {  7, 11,  1143 },
+  {  7, 11,  1463 }, {  8, 11,    61 }, {  9, 11,   207 }, {  9, 11,   390 },
+  {  9, 11,   467 }, { 11, 11,   836 }, { 22, 11,    26 }, { 12,  0,   106 },
+  {  6,  0,  1827 }, { 10,  0,   931 }, { 18,  0,   166 }, { 20,  0,   114 },
+  {  4, 10,   137 }, {  7, 10,  1178 }, {  7, 11,  1319 }, {  7, 10,  1520 },
+  {  5,  0,  1010 }, {  4, 11,   723 }, {  5, 11,   895 }, {  7, 11,  1031 },
+  {  8, 11,   199 }, {  8, 11,   340 }, {  9, 11,   153 }, {  9, 11,   215 },
+  { 10, 11,    21 }, { 10, 11,    59 }, { 10, 11,    80 }, { 10, 11,   224 },
+  { 11, 11,   229 }, { 11, 11,   652 }, { 12, 11,   192 }, { 13, 11,   146 },
+  { 14, 11,    91 }, {  4, 11,   295 }, {  6, 11,   619 }, {  7, 11,   898 },
+  {  7, 11,  1092 }, {  8, 11,   485 }, { 18, 11,    28 }, { 19, 11,   116 },
+  {  9, 11,    51 }, {  6, 10,  1661 }, {  7, 10,  1975 }, {  7, 10,  2009 },
+  {  7, 10,  2011 }, {  5, 11,   309 }, { 12, 11,   211 }, {  5,  0,    87 },
+  {  7,  0,   313 }, {  7,  0,  1103 }, { 10,  0,   208 }, { 10,  0,   582 },
+  { 11,  0,   389 }, { 11,  0,   813 }, { 12,  0,   385 }, { 13,  0,   286 },
+  { 14,  0,   124 }, { 18,  0,   108 }, {  5, 11,   125 }, {  8, 11,    77 },
+  { 10, 11,    15 }, {  4,  0,   267 }, {  5,  0,   703 }, {  9, 11,   155 },
+  {  5, 11,   439 }, { 11, 11,   164 }, { 12, 11,    76 }, {  9,  0,   496 },
+  {  5, 10,    89 }, {  7, 10,  1915 }, {  9, 10,   185 }, {  9, 10,   235 },
+  { 10, 10,    64 }, { 10, 10,   270 }, { 10, 10,   403 }, { 10, 10,   469 },
+  { 10, 10,   529 }, { 10, 10,   590 }, { 11, 10,   140 }, { 11, 10,   860 },
+  { 13, 10,     1 }, { 13, 10,   422 }, { 14, 10,   341 }, { 14, 10,   364 },
+  { 17, 10,    93 }, { 18, 10,   113 }, { 19, 10,    97 }, { 19, 10,   113 },
+  {  5, 10,   695 }, {  7,  0,  1121 }, {  5, 10,     6 }, {  6, 10,   183 },
+  {  7, 10,   680 }, {  7, 10,   978 }, {  7, 10,  1013 }, {  7, 10,  1055 },
+  { 12, 10,   230 }, { 13, 10,   172 }, { 18, 10,    29 }, {  4, 11,     8 },
+  {  7, 11,  1152 }, {  7, 11,  1153 }, {  7, 11,  1715 }, {  9, 11,   374 },
+  { 10, 11,   478 }, { 11, 11,   648 }, {  7, 11,  1099 }, {  6, 10,    29 },
+  { 11, 10,    63 }, {  4,  0,   561 }, { 10,  0,   249 }, { 11,  0,   209 },
+  {  4,  0,   760 }, {  7, 11,   799 }, { 10, 11,   511 }, {  8, 11,    87 },
+  {  9,  0,   154 }, { 12,  0,   485 }, {  8,  0,   255 }, {  4,  0,   323 },
+  { 12,  0,   419 }, {  4, 10,   311 }, {  6, 10,  1740 }, {  4,  0,   368 },
+  {  7,  0,   641 }, {  7, 10,   170 }, {  8, 10,    90 }, {  8, 10,   177 },
+  {  8, 10,   415 }, { 11, 10,   714 }, { 14, 10,   281 }, {  4, 11,    69 },
+  {  5, 11,   122 }, {  9, 11,   656 }, { 10, 11,   464 }, {  5, 11,   849 },
+  {  6, 11,  1633 }, {  8,  0,   522 }, { 14,  0,   328 }, { 11, 10,    91 },
+  { 13, 10,   129 }, { 15, 10,   101 }, { 17, 10,   125 }, {  7,  0,   562 },
+  {  8,  0,   551 }, {  4, 10,   494 }, {  6, 10,    74 }, {  7, 10,    44 },
+  { 11, 11,   499 }, { 12, 10,    17 }, { 15, 10,     5 }, { 20, 10,    11 },
+  {  4, 10,   276 }, {  5, 10,   296 }, {  9,  0,    92 }, { 19,  0,    91 },
+  {  4, 10,     7 }, {  5, 10,    90 }, {  5, 10,   158 }, {  6, 10,   542 },
+  {  7, 10,   221 }, {  7, 10,  1574 }, {  9, 10,   490 }, { 10, 10,   540 },
+  { 11, 10,   443 }, { 11, 10,   757 }, {  6,  0,   525 }, {  6,  0,  1976 },
+  {  8,  0,   806 }, {  9,  0,   876 }, { 12,  0,   284 }, {  5, 11,   859 },
+  {  7, 10,   588 }, {  7, 11,  1160 }, {  8, 11,   107 }, {  9, 10,   175 },
+  {  9, 11,   291 }, {  9, 11,   439 }, { 10, 10,   530 }, { 10, 11,   663 },
+  { 11, 11,   609 }, { 12, 11,   197 }, {  7, 11,   168 }, { 13, 11,   196 },
+  { 13, 11,   237 }, { 11,  0,   958 }, {  5,  0,   594 }, {  7, 10,   580 },
+  {  7, 10,    88 }, {  8, 10,   627 }, {  6,  0,   479 }, {  6,  0,   562 },
+  {  7,  0,  1060 }, { 13,  0,     6 }, {  5, 10,   872 }, {  6, 10,    57 },
+  {  7, 10,   471 }, {  9, 10,   447 }, {  9, 10,   454 }, {  8, 11,   413 },
+  { 17, 11,    19 }, {  4, 11,   117 }, {  6, 11,   372 }, {  7, 11,  1905 },
+  { 14, 11,   323 }, {  4, 11,   722 }, { 11, 11,   471 }, { 17,  0,    61 },
+  {  5, 10,    31 }, {  6, 10,   614 }, {  8, 10,   330 }, { 12, 10,   477 },
+  {  7, 10,  1200 }, { 10, 10,   460 }, {  6, 10,   424 }, {  7, 10,  1866 },
+  {  6,  0,  1641 }, {  8,  0,   820 }, {  6,  0,  1556 }, {  6,  0,  1618 },
+  {  9, 11,     5 }, { 12, 11,   216 }, { 12, 11,   294 }, { 12, 11,   298 },
+  { 12, 11,   400 }, { 12, 11,   518 }, { 13, 11,   229 }, { 15, 11,   139 },
+  { 15, 11,   155 }, { 16, 11,    79 }, {  4,  0,   302 }, {  7,  0,  1766 },
+  {  5, 10,    13 }, {  6, 10,   142 }, {  6,  0,   148 }, {  7,  0,  1313 },
+  {  7, 10,   116 }, {  8, 10,   322 }, {  8, 10,   755 }, {  9, 10,   548 },
+  { 10, 10,   714 }, { 11, 10,   884 }, { 13, 10,   324 }, {  9,  0,   676 },
+  {  9, 11,    88 }, { 11, 11,   270 }, {  5, 11,    12 }, {  7, 11,   375 },
+  {  9, 11,   438 }, {  6,  0,  1674 }, {  7, 10,  1472 }, {  7, 10,  1554 },
+  { 11,  0,   178 }, {  7, 10,  1071 }, {  7, 10,  1541 }, {  7, 10,  1767 },
+  {  7, 10,  1806 }, { 11, 10,   162 }, { 11, 10,   242 }, { 12, 10,   605 },
+  { 15, 10,    26 }, { 16, 10,    44 }, {  6,  0,   389 }, {  7,  0,   149 },
+  {  9,  0,   142 }, { 10,  0,    94 }, { 12, 11,    71 }, { 17, 10,   115 },
+  {  6,  0,     8 }, {  7,  0,  1881 }, {  8,  0,    91 }, { 11, 11,   966 },
+  { 12, 11,   287 }, { 13, 11,   342 }, { 13, 11,   402 }, { 15, 11,   110 },
+  { 15, 11,   163 }, {  4, 11,   258 }, {  8, 11,   639 }, {  6, 11,    22 },
+  {  7, 11,   903 }, { 10, 11,   577 }, {  5, 11,   681 }, {  7, 10,  1111 },
+  {  7, 11,  1286 }, {  9,  0,   112 }, {  8, 10,     1 }, { 10, 10,   326 },
+  {  5, 10,   488 }, {  6, 10,   527 }, {  7, 10,   489 }, {  7, 10,  1636 },
+  {  8, 10,   121 }, {  8, 10,   144 }, {  8, 10,   359 }, {  9, 10,   193 },
+  {  9, 10,   241 }, {  9, 10,   336 }, {  9, 10,   882 }, { 11, 10,   266 },
+  { 11, 10,   372 }, { 11, 10,   944 }, { 12, 10,   401 }, { 12, 10,   641 },
+  {  4, 11,   664 }, {  5, 11,   804 }, {  6,  0,   747 }, {  6,  0,  1015 },
+  {  7,  0,  1746 }, {  9, 10,    31 }, { 10, 10,   244 }, { 10, 10,   699 },
+  { 12, 10,   149 }, { 13, 10,   497 }, {  5, 10,   377 }, {  7,  0,    24 },
+  {  6,  0,  1352 }, {  5, 11,    32 }, { 17, 10,   101 }, {  7,  0,  1530 },
+  { 10,  0,   158 }, { 13,  0,    13 }, { 13,  0,   137 }, { 13,  0,   258 },
+  { 14,  0,   111 }, { 14,  0,   225 }, { 14,  0,   253 }, { 14,  0,   304 },
+  { 14,  0,   339 }, { 14,  0,   417 }, { 18,  0,    33 }, {  4,  0,   503 },
+  {  7,  0,  1661 }, {  5,  0,   130 }, {  6,  0,   845 }, {  7,  0,  1314 },
+  {  9,  0,   610 }, { 10,  0,   718 }, { 11,  0,   601 }, { 11,  0,   819 },
+  { 11,  0,   946 }, { 12,  0,   536 }, { 10,  0,   149 }, { 11,  0,   280 },
+  { 14,  0,   336 }, {  6,  0,  1401 }, {  7,  0,  1946 }, {  8,  0,   663 },
+  { 16,  0,     8 }, {  6,  0,  1607 }, {  7, 10,  2023 }, {  4, 11,   289 },
+  {  7, 11,   629 }, {  7, 11,  1698 }, {  7, 11,  1711 }, { 12, 11,   215 },
+  {  6, 11,   450 }, {  8, 11,   109 }, { 10,  0,   882 }, { 10,  0,   883 },
+  { 10,  0,   914 }, { 10,  0,   928 }, {  5, 10,   843 }, {  8, 11,   705 },
+  {  4, 10,   554 }, {  5, 10,   536 }, {  5,  0,   417 }, {  9, 10,    79 },
+  { 11, 10,   625 }, { 17, 10,     7 }, {  7, 11,  1238 }, { 14, 11,    37 },
+  {  4,  0,   392 }, {  7,  0,  1597 }, {  5,  0,   433 }, {  9,  0,   633 },
+  { 11,  0,   629 }, {  4, 10,   424 }, {  7, 10,   336 }, {  8, 10,   785 },
+  {  6, 11,   355 }, {  6,  0,   234 }, {  7,  0,   769 }, {  9,  0,    18 },
+  { 10,  0,   358 }, {  4, 10,   896 }, {  6, 10,  1777 }, { 10, 11,   323 },
+  {  7,  0,   140 }, {  7,  0,  1950 }, {  8,  0,   680 }, { 11,  0,   817 },
+  { 19,  0,    88 }, {  7,  0,  1222 }, { 10,  0,   386 }, { 11, 11,   908 },
+  { 11,  0,   249 }, { 12,  0,   313 }, { 16,  0,    66 }, { 17,  0,    26 },
+  {  6,  0,     5 }, {  7, 10,   750 }, {  9, 10,   223 }, { 11, 10,    27 },
+  { 11, 10,   466 }, { 12, 10,   624 }, { 14, 10,   265 }, { 18, 10,    61 },
+  {  6, 11,    26 }, {  6,  0,  1216 }, {  5,  0,   963 }, {  6,  0,  1773 },
+  {  4, 11,   414 }, {  5, 11,   467 }, {  9, 11,   654 }, { 10, 11,   451 },
+  { 12, 11,    59 }, { 13, 11,   375 }, {  7, 11,    17 }, {  4, 10,   603 },
+  {  5, 10,   661 }, {  4, 10,    11 }, {  6, 10,   128 }, {  7, 10,   231 },
+  {  7, 10,  1533 }, { 10, 10,   725 }, {  7, 11,   955 }, {  7,  0,   180 },
+  {  8,  0,   509 }, {  8,  0,   792 }, {  4, 10,   476 }, {  4,  0,  1002 },
+  {  5, 11,   538 }, {  7, 10,  1807 }, {  4,  0,   931 }, {  7,  0,   943 },
+  { 11,  0,   614 }, { 12,  0,   747 }, {  7,  0,  1837 }, {  9, 10,    20 },
+  { 10, 10,   324 }, { 10, 10,   807 }, { 11, 10,   488 }, {  6,  0,   641 },
+  {  6, 11,   280 }, { 10, 11,   502 }, { 11, 11,   344 }, { 12, 11,    38 },
+  {  5, 11,    45 }, {  7, 11,  1161 }, { 11, 11,   448 }, { 11, 11,   880 },
+  { 13, 11,   139 }, { 13, 11,   407 }, { 15, 11,    16 }, { 17, 11,    95 },
+  { 18, 11,    66 }, { 18, 11,    88 }, { 18, 11,   123 }, { 21, 11,     7 },
+  {  9,  0,   280 }, { 10,  0,   134 }, { 22,  0,    22 }, { 23,  0,     5 },
+  { 23,  0,    29 }, {  8, 11,   777 }, {  4,  0,    90 }, {  5,  0,   545 },
+  {  7,  0,   754 }, {  9,  0,   186 }, { 10,  0,    72 }, { 10,  0,   782 },
+  { 11,  0,   577 }, { 11,  0,   610 }, { 11,  0,   960 }, { 12,  0,   354 },
+  { 12,  0,   362 }, { 12,  0,   595 }, {  4, 11,   410 }, {  7, 11,   521 },
+  {  7, 11,  1778 }, {  5, 10,   112 }, {  6, 10,   103 }, {  6, 10,   150 },
+  { 10, 10,   356 }, {  4,  0,   742 }, {  7,  0,   151 }, {  9,  0,   329 },
+  { 11,  0,   254 }, {  8,  0,   853 }, {  8,  0,   881 }, {  8,  0,   911 },
+  {  8,  0,   912 }, { 10,  0,   872 }, { 12,  0,   741 }, { 12,  0,   742 },
+  { 24,  0,    18 }, {  4, 11,   573 }, {  8, 11,   655 }, {  6,  0,   921 },
+  {  6,  0,   934 }, {  9,  0,   187 }, { 10,  0,    36 }, { 11,  0,  1016 },
+  { 17,  0,    44 }, { 18,  0,    64 }, {  7,  0,   833 }, {  8,  0,   517 },
+  {  4,  0,   506 }, {  5,  0,   295 }, {  7,  0,  1680 }, {  4, 10,   708 },
+  {  8, 10,    15 }, {  9, 10,    50 }, {  9, 10,   386 }, { 11, 10,    18 },
+  { 11, 10,   529 }, { 12, 10,   228 }, {  7,  0,   251 }, {  7,  0,  1701 },
+  {  8,  0,   436 }, {  4, 10,   563 }, {  7, 10,   592 }, {  7, 10,   637 },
+  {  7, 10,   770 }, {  8, 10,   463 }, {  9, 10,    60 }, {  9, 10,   335 },
+  {  9, 10,   904 }, { 10, 10,    73 }, { 11, 10,   434 }, { 12, 10,   585 },
+  { 13, 10,   331 }, { 18, 10,   110 }, { 20, 10,    60 }, {  4, 10,   502 },
+  {  8,  0,   584 }, {  6, 10,   347 }, { 10, 10,   161 }, {  7,  0,   987 },
+  {  9,  0,   688 }, { 10,  0,   522 }, { 11,  0,   788 }, { 12,  0,   137 },
+  { 12,  0,   566 }, { 14,  0,     9 }, { 14,  0,    24 }, { 14,  0,    64 },
+  {  7, 11,   899 }, { 14, 11,   325 }, {  4,  0,   214 }, {  5,  0,   500 },
+  {  5, 10,   102 }, {  6, 10,   284 }, {  7, 10,  1079 }, {  7, 10,  1423 },
+  {  7, 10,  1702 }, {  8, 10,   470 }, {  9, 10,   554 }, {  9, 10,   723 },
+  { 11, 10,   333 }, {  7, 10,   246 }, {  7, 10,   840 }, {  6, 10,    10 },
+  {  8, 10,   571 }, {  9, 10,   739 }, { 15, 10,    91 }, {  5, 10,   626 },
+  { 18,  0,   195 }, {  6,  0,  1775 }, {  7,  0,   389 }, {  7,  0,   700 },
+  {  7,  0,   940 }, {  8,  0,   514 }, {  9,  0,   116 }, {  9,  0,   535 },
+  { 10,  0,   118 }, { 11,  0,   107 }, { 11,  0,   148 }, { 11,  0,   922 },
+  { 12,  0,   254 }, { 12,  0,   421 }, { 14,  0,   238 }, {  5, 10,    18 },
+  {  6, 10,   526 }, { 13, 10,    24 }, { 13, 10,   110 }, { 19, 10,     5 },
+  { 19, 10,    44 }, {  4,  0,   743 }, { 11,  0,   292 }, {  4, 10,   309 },
+  {  5, 10,   462 }, {  7, 10,   970 }, {  7, 10,  1097 }, { 22, 10,    30 },
+  { 22, 10,    33 }, { 11, 11,   338 }, {  7, 11,  1598 }, {  7,  0,  1283 },
+  {  9,  0,   227 }, { 11,  0,   325 }, { 11,  0,   408 }, { 14,  0,   180 },
+  { 18,  0,    47 }, {  4,  0,   953 }, {  6,  0,  1805 }, {  6,  0,  1814 },
+  {  6,  0,  1862 }, { 12,  0,   774 }, {  6, 11,   611 }, {  7, 11,  1733 },
+  {  7, 11,  1464 }, {  5,  0,    81 }, {  7,  0,   146 }, {  7,  0,  1342 },
+  {  8,  0,    53 }, {  8,  0,   561 }, {  8,  0,   694 }, {  8,  0,   754 },
+  {  9,  0,   115 }, {  9,  0,   179 }, {  9,  0,   894 }, { 10,  0,   462 },
+  { 10,  0,   813 }, { 11,  0,   230 }, { 11,  0,   657 }, { 11,  0,   699 },
+  { 11,  0,   748 }, { 12,  0,   119 }, { 12,  0,   200 }, { 12,  0,   283 },
+  { 14,  0,   273 }, {  5,  0,   408 }, {  6,  0,   789 }, {  6,  0,   877 },
+  {  6,  0,  1253 }, {  6,  0,  1413 }, {  9,  0,   747 }, {  6, 10,  1704 },
+  {  7, 11,   663 }, {  6,  0,  1910 }, {  6,  0,  1915 }, {  6,  0,  1923 },
+  {  9,  0,   913 }, {  9,  0,   928 }, {  9,  0,   950 }, {  9,  0,   954 },
+  {  9,  0,   978 }, {  9,  0,   993 }, { 12,  0,   812 }, { 12,  0,   819 },
+  { 12,  0,   831 }, { 12,  0,   833 }, { 12,  0,   838 }, { 12,  0,   909 },
+  { 12,  0,   928 }, { 12,  0,   931 }, { 12,  0,   950 }, { 15,  0,   186 },
+  { 15,  0,   187 }, { 15,  0,   195 }, { 15,  0,   196 }, { 15,  0,   209 },
+  { 15,  0,   215 }, { 15,  0,   236 }, { 15,  0,   241 }, { 15,  0,   249 },
+  { 15,  0,   253 }, { 18,  0,   180 }, { 18,  0,   221 }, { 18,  0,   224 },
+  { 18,  0,   227 }, { 18,  0,   229 }, { 21,  0,    60 }, {  7,  0,  1826 },
+  {  7,  0,  1938 }, { 11,  0,   490 }, { 18,  0,   143 }, {  5, 10,    86 },
+  {  7, 10,   743 }, {  9, 10,    85 }, { 10, 10,   281 }, { 10, 10,   432 },
+  { 12, 10,   251 }, { 13, 10,   118 }, { 14, 10,   378 }, {  5, 10,   524 },
+  {  5, 10,   744 }, { 13, 11,   442 }, { 10, 10,   107 }, { 12, 10,   436 },
+  {  7, 11,   503 }, {  6,  0,  1162 }, {  4, 10,   927 }, {  7,  0,    30 },
+  {  8,  0,    86 }, {  8,  0,   315 }, {  8,  0,   700 }, {  9,  0,   576 },
+  {  9,  0,   858 }, { 10,  0,   414 }, { 11,  0,   310 }, { 11,  0,   888 },
+  { 11,  0,   904 }, { 12,  0,   361 }, { 13,  0,   248 }, { 13,  0,   371 },
+  { 14,  0,   142 }, { 12, 10,   670 }, { 18, 10,    94 }, {  6,  0,   721 },
+  {  4, 11,   113 }, {  5, 11,   163 }, {  5, 11,   735 }, {  7, 11,  1009 },
+  {  7, 10,  1149 }, {  9, 11,     9 }, {  9, 10,   156 }, {  9, 11,   771 },
+  { 12, 11,    90 }, { 13, 11,   138 }, { 13, 11,   410 }, { 15, 11,   128 },
+  { 10,  0,   839 }, {  5, 10,   778 }, {  9,  0,   617 }, {  5, 10,   502 },
+  {  8, 10,   196 }, { 10, 10,   283 }, { 11, 10,   406 }, {  6,  0,   428 },
+  {  7,  0,   524 }, {  8,  0,   169 }, {  8,  0,   234 }, {  9,  0,   480 },
+  { 10,  0,   646 }, {  5, 10,   855 }, {  6,  0,  1648 }, {  7,  0,  1205 },
+  { 10,  0,   637 }, {  7,  0,  1596 }, {  4, 11,   935 }, {  5, 11,   823 },
+  {  5, 11,   269 }, {  7, 11,   434 }, {  7, 11,   891 }, {  8, 11,   339 },
+  {  9, 11,   702 }, { 11, 11,   594 }, { 11, 11,   718 }, { 17, 11,   100 },
+  {  7, 11,   878 }, {  9, 11,   485 }, { 13, 11,   264 }, {  4,  0,   266 },
+  {  8,  0,     4 }, {  9,  0,    39 }, { 10,  0,   166 }, { 11,  0,   918 },
+  { 12,  0,   635 }, { 20,  0,    10 }, { 22,  0,    27 }, { 22,  0,    43 },
+  { 22,  0,    52 }, {  6, 11,  1713 }, {  7, 10,  1400 }, {  9, 10,   446 },
+  { 10, 10,    45 }, {  7, 11,   900 }, {  4,  0,   862 }, {  6,  0,  1554 },
+  {  7, 11,  1033 }, { 19,  0,    16 }, { 19, 11,    16 }, {  7, 11,  1208 },
+  {  7,  0,   157 }, {  8,  0,   279 }, {  6,  0,   604 }, {  8,  0,   391 },
+  { 13, 10,   455 }, { 15, 10,    99 }, { 15, 10,   129 }, { 16, 10,    68 },
+  {  7, 10,   172 }, {  7,  0,   945 }, { 11,  0,   713 }, { 11,  0,   744 },
+  {  4,  0,   973 }, { 10,  0,   877 }, { 10,  0,   937 }, { 10,  0,   938 },
+  { 12,  0,   711 }, { 11,  0,  1022 }, {  4, 10,   568 }, { 14, 11,   143 },
+  {  4,  0,   567 }, {  9,  0,   859 }, {  4, 10,   732 }, {  7,  0,  1846 },
+  {  8,  0,   628 }, {  8, 10,   733 }, {  5,  0,   762 }, {  4, 10,   428 },
+  {  7, 10,  1789 }, { 10,  0,   784 }, { 13,  0,   191 }, {  7, 10,  2015 },
+  { 12, 10,   665 }, {  5,  0,   298 }, {  7,  0,   633 }, {  7,  0,   905 },
+  {  7,  0,   909 }, {  7,  0,  1538 }, {  9,  0,   767 }, { 12,  0,   636 },
+  { 10, 10,   806 }, {  4,  0,   795 }, { 11,  0,   301 }, {  7,  0,  1970 },
+  {  5, 11,   625 }, {  7, 11,  1617 }, {  7, 11,   275 }, {  7, 11,    37 },
+  {  8, 11,   425 }, {  8, 11,   693 }, {  9, 11,   720 }, { 10, 11,   380 },
+  { 10, 11,   638 }, { 11, 11,   273 }, { 11, 11,   307 }, { 11, 11,   473 },
+  { 12, 11,    61 }, { 15, 11,    43 }, {  7, 11,   198 }, {  6,  0,  1236 },
+  {  7,  0,   369 }, { 12,  0,   644 }, { 12,  0,   645 }, { 16,  0,    90 },
+  { 19,  0,    15 }, { 21,  0,    27 }, {  6,  0,    71 }, {  7,  0,   845 },
+  {  8,  0,   160 }, {  9,  0,   318 }, {  6, 10,  1623 }, {  6, 10,  1681 },
+  {  6,  0,  1447 }, {  6,  0,  1255 }, { 10,  0,   735 }, {  8,  0,    76 },
+  {  4, 11,   168 }, {  6, 10,  1748 }, {  8, 10,   715 }, {  9, 10,   802 },
+  { 10, 10,    46 }, { 10, 10,   819 }, { 13, 10,   308 }, { 14, 10,   351 },
+  { 14, 10,   363 }, { 18, 10,    67 }, {  7, 11,    91 }, {  6,  0,   474 },
+  {  4, 10,    63 }, {  5, 10,   347 }, {  5, 10,   749 }, { 10,  0,   841 },
+  {  5, 10,   366 }, {  6,  0,   836 }, {  4, 11,   225 }, {  7,  0,  1622 },
+  {  7, 10,    89 }, { 12,  0,   735 }, {  6,  0,  1601 }, { 10, 11,   145 },
+  {  6,  0,  1390 }, {  9,  0,   804 }, { 14,  0,   394 }, {  6, 11,    15 },
+  {  7, 11,    70 }, { 10, 11,   240 }, { 19, 11,    93 }, {  6,  0,    96 },
+  {  7,  0,  1426 }, {  4,  0,   651 }, {  5,  0,   289 }, {  7, 11,   956 },
+  {  7, 10,   977 }, {  7, 11,  1157 }, {  7, 11,  1506 }, {  7, 11,  1606 },
+  {  7, 11,  1615 }, {  7, 11,  1619 }, {  7, 11,  1736 }, {  7, 11,  1775 },
+  {  8, 11,   590 }, {  9, 11,   324 }, {  9, 11,   736 }, {  9, 11,   774 },
+  {  9, 11,   776 }, {  9, 11,   784 }, { 10, 11,   567 }, { 10, 11,   708 },
+  { 11, 11,   518 }, { 11, 11,   613 }, { 11, 11,   695 }, { 11, 11,   716 },
+  { 11, 11,   739 }, { 11, 11,   770 }, { 11, 11,   771 }, { 11, 11,   848 },
+  { 11, 11,   857 }, { 11, 11,   931 }, { 11, 11,   947 }, { 12, 11,   326 },
+  { 12, 11,   387 }, { 12, 11,   484 }, { 12, 11,   528 }, { 12, 11,   552 },
+  { 12, 11,   613 }, { 13, 11,   189 }, { 13, 11,   256 }, { 13, 11,   340 },
+  { 13, 11,   432 }, { 13, 11,   436 }, { 13, 11,   440 }, { 13, 11,   454 },
+  { 14, 11,   174 }, { 14, 11,   220 }, { 14, 11,   284 }, { 14, 11,   390 },
+  { 17, 11,   121 }, {  7,  0,   688 }, {  8,  0,    35 }, {  9,  0,   511 },
+  { 10,  0,   767 }, { 19,  0,   118 }, {  6,  0,   667 }, {  4,  0,   513 },
+  {  5, 10,   824 }, {  5, 10,   941 }, {  7, 10,   440 }, {  8, 10,   230 },
+  { 11, 10,   106 }, {  6,  0,  2034 }, {  7, 11,  1399 }, { 15, 11,    66 },
+  {  7, 11,  1529 }, {  4, 11,   145 }, {  6, 11,   176 }, {  7, 11,   395 },
+  {  9, 11,   562 }, { 16, 11,    28 }, {  4, 11,   501 }, {  4,  0,   704 },
+  {  6,  0,  1524 }, {  7,  0,  1078 }, {  6, 11,   464 }, {  6, 11,   509 },
+  { 10, 11,    82 }, { 20, 11,    91 }, { 23, 11,    13 }, {  4,  0,   720 },
+  {  5,  0,   306 }, {  5,  0,   431 }, {  7,  0,  1196 }, {  4, 10,   914 },
+  {  5, 10,   800 }, {  5, 10,   852 }, {  7, 11,  1189 }, { 10,  0,    54 },
+  { 13, 10,   115 }, {  7, 10,   564 }, { 14, 10,   168 }, {  5,  0,   464 },
+  {  6,  0,   236 }, {  7,  0,   696 }, {  7,  0,   914 }, {  7,  0,  1108 },
+  {  7,  0,  1448 }, {  9,  0,    15 }, {  9,  0,   564 }, { 10,  0,    14 },
+  { 12,  0,   565 }, { 13,  0,   449 }, { 14,  0,    53 }, { 15,  0,    13 },
+  { 16,  0,    64 }, { 17,  0,    41 }, {  4, 10,   918 }, {  5, 10,   876 },
+  {  6,  0,  1418 }, {  6, 10,  1764 }, {  4, 10,    92 }, {  5, 10,   274 },
+  {  6,  0,   907 }, {  4, 11,   114 }, {  8, 10,   501 }, {  9, 11,   492 },
+  { 13, 11,   462 }, { 14, 11,   215 }, {  4, 11,    77 }, {  5, 11,   361 },
+  {  6, 11,   139 }, {  6, 11,   401 }, {  6, 11,   404 }, {  7, 11,   413 },
+  {  7, 11,   715 }, {  7, 11,  1716 }, { 11, 11,   279 }, { 12, 11,   179 },
+  { 12, 11,   258 }, { 13, 11,   244 }, { 14, 11,   358 }, {  6,  0,  1767 },
+  { 12,  0,   194 }, { 17,  0,   107 }, {  6, 11,  1717 }, {  5, 10,   743 },
+  { 14, 11,   329 }, {  4, 10,    49 }, {  7, 10,   280 }, {  7, 10,  1633 },
+  {  5,  0,   840 }, {  7, 11,  1061 }, {  8, 11,    82 }, { 11, 11,   250 },
+  { 12, 11,   420 }, { 13, 11,   184 }, {  7, 11,   724 }, {  6,  0,   900 },
+  {  8, 10,    47 }, {  6,  0,  1436 }, { 16, 11,     0 }, {  6,  0,   675 },
+  {  7,  0,  1008 }, {  7,  0,  1560 }, {  9,  0,   642 }, { 11,  0,   236 },
+  { 14,  0,   193 }, {  5, 10,   272 }, {  5, 10,   908 }, {  5, 10,   942 },
+  {  8, 10,   197 }, {  9, 10,    47 }, { 11, 10,   538 }, { 11, 10,   742 },
+  {  4,  0,    68 }, {  5,  0,   628 }, {  5,  0,   634 }, {  6,  0,   386 },
+  {  7,  0,   794 }, {  8,  0,   273 }, {  9,  0,   563 }, { 10,  0,   105 },
+  { 10,  0,   171 }, { 11,  0,    94 }, { 11,  0,   354 }, {  7, 10,  1911 },
+  {  9, 10,   891 }, {  4,  0,    95 }, {  6,  0,  1297 }, {  6,  0,  1604 },
+  {  7,  0,   416 }, { 11,  0,   830 }, {  6, 11,   513 }, {  7, 11,  1052 },
+  {  7,  0,   731 }, { 13,  0,    20 }, { 15,  0,    11 }, {  9, 11,   899 },
+  { 10,  0,   850 }, { 12,  0,   697 }, {  4,  0,   662 }, {  7, 11,  1417 },
+  { 12, 11,   382 }, { 17, 11,    48 }, { 24, 11,    12 }, {  5,  0,   736 },
+  {  4,  0,   861 }, {  4, 10,   407 }, {  4, 10,   560 }, { 13, 10,   490 },
+  {  6, 11,   545 }, {  7, 11,   565 }, {  7, 11,  1669 }, { 10, 11,   114 },
+  { 11, 11,   642 }, { 12, 11,   618 }, {  6,  0,   871 }, {  6,  0,  1000 },
+  {  5,  0,   864 }, { 10,  0,   648 }, { 11,  0,   671 }, { 15,  0,    46 },
+  {  5, 11,     5 }, {  5,  0,   928 }, { 11,  0,    90 }, { 13,  0,     7 },
+  {  4, 10,   475 }, { 11, 10,    35 }, { 13, 10,    71 }, { 13, 10,   177 },
+  { 14, 10,   422 }, {  8,  0,   332 }, {  7, 11,   192 }, {  6,  0,  1055 },
+  {  8, 11,   763 }, { 11,  0,   986 }, { 12,  0,   682 }, {  7,  0,    76 },
+  {  8,  0,    44 }, {  9,  0,   884 }, { 10,  0,   580 }, { 11,  0,   399 },
+  { 11,  0,   894 }, { 15,  0,   122 }, {  7, 11,  1237 }, {  7, 10,   636 },
+  { 11,  0,   300 }, {  6, 10,   222 }, {  7, 10,  1620 }, {  8, 10,   409 },
+  {  9, 10,   693 }, {  4, 11,    87 }, {  5, 11,   250 }, { 10, 11,   601 },
+  { 13, 11,   298 }, { 13, 11,   353 }, { 13, 11,   376 }, {  5,  0,   518 },
+  { 10,  0,   340 }, { 11,  0,   175 }, { 21,  0,    16 }, { 12,  0,   771 },
+  {  6,  0,  1108 }, {  9,  0,   831 }, {  4,  0,   836 }, {  7,  0,  1852 },
+  {  4,  0,   957 }, {  6,  0,  1804 }, {  8,  0,   842 }, {  8,  0,   843 },
+  {  8,  0,   851 }, {  8,  0,   855 }, { 12,  0,   767 }, {  7, 11,   814 },
+  {  4, 11,    57 }, {  7, 11,  1195 }, {  7, 11,  1438 }, {  7, 11,  1548 },
+  {  7, 11,  1835 }, {  7, 11,  1904 }, {  9, 11,   757 }, { 10, 11,   604 },
+  { 11, 11,   519 }, {  5, 10,   882 }, { 10,  0,   246 }, {  4,  0,   934 },
+  {  5,  0,   202 }, {  8,  0,   610 }, {  7, 11,  1897 }, { 12, 11,   290 },
+  { 13, 11,    80 }, { 13, 11,   437 }, { 17, 11,    74 }, {  8,  0,    96 },
+  {  9,  0,    36 }, { 10,  0,   607 }, { 10,  0,   804 }, { 10,  0,   832 },
+  { 11,  0,   423 }, { 11,  0,   442 }, { 12,  0,   309 }, { 14,  0,   199 },
+  { 15,  0,    90 }, { 17,  0,   110 }, {  4, 10,   426 }, {  7,  0,   654 },
+  {  8,  0,   240 }, {  6, 10,    58 }, {  7, 10,   745 }, {  7, 10,  1969 },
+  {  8, 10,   675 }, {  9, 10,   479 }, {  9, 10,   731 }, { 10, 10,   330 },
+  { 10, 10,   593 }, { 10, 10,   817 }, { 11, 10,    32 }, { 11, 10,   133 },
+  { 11, 10,   221 }, { 17, 10,    68 }, {  9,  0,    13 }, {  9,  0,   398 },
+  {  9,  0,   727 }, { 10,  0,    75 }, { 10,  0,   184 }, { 10,  0,   230 },
+  { 10,  0,   564 }, { 10,  0,   569 }, { 11,  0,   973 }, { 12,  0,    70 },
+  { 12,  0,   189 }, { 13,  0,    57 }, { 13,  0,   257 }, {  4, 11,   209 },
+  {  7, 11,   902 }, {  7,  0,   391 }, {  9, 10,   538 }, {  6,  0,   403 },
+  {  6, 11,   303 }, {  7, 11,   335 }, {  7, 11,  1437 }, {  7, 11,  1668 },
+  {  8, 11,   553 }, {  8, 11,   652 }, {  8, 11,   656 }, {  9, 11,   558 },
+  { 11, 11,   743 }, { 21, 11,    18 }, {  4, 11,   559 }, { 11,  0,    75 },
+  { 14,  0,   267 }, {  6,  0,   815 }, { 13, 11,     2 }, { 13,  0,   366 },
+  {  9,  0,   631 }, {  5, 11,  1017 }, {  5,  0,   345 }, {  7,  0,  1016 },
+  {  5, 11,   709 }, {  6, 11,  1745 }, {  5, 10,   566 }, {  7,  0,   952 },
+  {  6, 10,    48 }, {  9, 10,   139 }, { 10, 10,   399 }, { 11, 10,   469 },
+  { 12, 10,   634 }, { 13, 10,   223 }, {  5,  0,   673 }, {  9,  0,   850 },
+  {  7, 11,     8 }, {  8, 11,   206 }, {  6,  0,   662 }, { 21,  0,    35 },
+  {  4,  0,   287 }, {  5,  0,  1018 }, {  6, 10,   114 }, {  7, 10,  1224 },
+  {  7, 10,  1556 }, {  8, 10,     3 }, {  8, 10,   576 }, {  9, 10,   267 },
+  {  4,  0,   884 }, {  5,  0,    34 }, { 10,  0,   724 }, { 12,  0,   444 },
+  { 13,  0,   354 }, { 18,  0,    32 }, { 23,  0,    24 }, { 23,  0,    31 },
+  { 24,  0,     5 }, {  5, 10,   933 }, {  4, 11,   776 }, { 10,  0,   151 },
+  {  8,  0,   427 }, {  6,  0,   382 }, {  4,  0,   329 }, {  9,  0,   846 },
+  { 10,  0,   827 }, { 10, 11,    33 }, {  9,  0,   279 }, { 10,  0,   407 },
+  { 14,  0,    84 }, { 22,  0,    18 }, {  7, 11,  1297 }, {  8, 11,   406 },
+  {  4,  0,   906 }, {  8,  0,   366 }, {  6,  0,   843 }, {  6,  0,  1443 },
+  {  7,  0,  1372 }, { 10,  0,   992 }, {  4,  0,   123 }, {  5,  0,   605 },
+  {  7,  0,  1509 }, {  8,  0,    36 }, {  4,  0,   649 }, {  8, 11,   175 },
+  { 10, 11,   168 }, { 10, 11,   573 }, {  5,  0,   767 }, {  6,  0,  1018 },
+  {  7, 11,  1305 }, { 12, 10,    30 }, { 13, 10,   148 }, { 14, 10,    87 },
+  { 14, 10,   182 }, { 16, 10,    42 }, { 20, 10,    70 }, {  6, 11,   607 },
+  {  4,  0,   273 }, {  5,  0,   658 }, {  5,  0,   995 }, {  6,  0,    72 },
+  { 11, 11,   174 }, { 10,  0,   483 }, { 12,  0,   368 }, {  7, 10,    56 },
+  {  7, 10,  1989 }, {  8, 10,   337 }, {  8, 10,   738 }, {  9, 10,   600 },
+  { 13, 10,   447 }, { 14, 10,    92 }, {  5, 11,   784 }, { 10, 10,   666 },
+  {  7,  0,  1345 }, { 11, 11,   882 }, {  6,  0,  1293 }, {  5,  0,   589 },
+  {  6,  0,  1988 }, {  5,  0,   117 }, {  6,  0,   514 }, {  6,  0,   541 },
+  {  7,  0,  1164 }, {  7,  0,  1436 }, {  8,  0,   220 }, {  8,  0,   648 },
+  { 10,  0,   688 }, { 11,  0,   560 }, {  8,  0,   379 }, {  5,  0,   686 },
+  {  7, 10,   866 }, {  7, 10,  1163 }, {  4, 10,   328 }, {  9, 11,    14 },
+  {  9, 11,   441 }, { 10, 11,   306 }, { 11, 11,     9 }, {  4, 10,   101 },
+  {  7, 10,  1171 }, {  5, 10,   833 }, {  8, 10,   744 }, {  5, 11,   161 },
+  {  7, 11,   839 }, {  7, 11,   887 }, {  7,  0,   196 }, { 10,  0,   765 },
+  { 11,  0,   347 }, { 11,  0,   552 }, { 11,  0,   790 }, { 12,  0,   263 },
+  { 13,  0,   246 }, { 13,  0,   270 }, { 13,  0,   395 }, { 14,  0,   176 },
+  { 14,  0,   190 }, { 14,  0,   398 }, { 14,  0,   412 }, { 15,  0,    32 },
+  { 15,  0,    63 }, { 16,  0,    88 }, { 19,  0,   105 }, {  6, 10,     9 },
+  {  6, 10,   397 }, {  7, 10,    53 }, {  7, 10,  1742 }, { 10, 10,   632 },
+  { 11, 10,   828 }, { 12, 10,   146 }, {  5,  0,   381 }, {  7,  0,  1792 },
+  {  6,  0,  1452 }, {  7, 11,   429 }, {  8,  0,   367 }, { 10,  0,   760 },
+  { 14,  0,    79 }, { 20,  0,    17 }, { 24,  0,     0 }, {  7,  0,   616 },
+  { 10,  0,   413 }, { 11, 10,   417 }, { 12, 10,   223 }, { 12, 10,   265 },
+  {  7, 11,  1611 }, { 13, 11,    14 }, { 15, 11,    44 }, { 19, 11,    13 },
+  { 20, 11,    76 }, {  7,  0,  1229 }, {  6,  0,   120 }, {  7,  0,  1188 },
+  {  7,  0,  1710 }, {  8,  0,   286 }, {  9,  0,   667 }, { 11,  0,   592 },
+  { 11,  0,   730 }, {  7, 11,  1814 }, {  7,  0,  1146 }, {  4, 10,   186 },
+  {  5, 10,   157 }, {  8, 10,   168 }, { 10, 10,     6 }, {  4,  0,   352 },
+  {  7,  0,   687 }, {  4,  0,   192 }, {  5,  0,    49 }, {  6,  0,   200 },
+  {  6,  0,   293 }, {  6,  0,  1696 }, {  7,  0,  1151 }, {  5, 10,   875 },
+  {  5, 10,   773 }, {  5, 10,   991 }, {  6, 10,  1635 }, {  6, 10,  1788 },
+  {  7, 10,   111 }, {  8, 10,   581 }, {  6,  0,   935 }, {  6,  0,  1151 },
+  {  6,  0,  1050 }, {  4,  0,   650 }, {  4,  0,   147 }, { 11,  0,   194 },
+  { 12,  0,    62 }, { 12,  0,    88 }, { 11, 11,   194 }, { 12, 11,    62 },
+  { 12, 11,    88 }, {  6,  0,   339 }, {  7,  0,   923 }, {  6, 10,  1747 },
+  {  7, 11,   643 }, {  8, 11,   236 }, {  5,  0,   934 }, {  7, 10,  1364 },
+  {  7, 10,  1907 }, { 13, 10,   158 }, {  4, 10,   659 }, {  4, 10,   404 },
+  {  7, 10,   675 }, {  7, 11,   581 }, {  9, 11,   644 }, {  9, 11,   699 },
+  { 13,  0,   211 }, { 14,  0,   133 }, { 14,  0,   204 }, { 15,  0,    64 },
+  { 15,  0,    69 }, { 15,  0,   114 }, { 16,  0,    10 }, { 19,  0,    23 },
+  { 19,  0,    35 }, { 19,  0,    39 }, { 19,  0,    51 }, { 19,  0,    71 },
+  { 19,  0,    75 }, { 24,  0,    15 }, {  5, 10,   391 }, {  5, 11,    54 },
+  {  7, 11,  1513 }, {  7,  0,   222 }, {  8,  0,   341 }, {  5, 10,   540 },
+  {  6, 10,  1697 }, {  6, 10,    78 }, {  4, 11,   744 }, {  8,  0,   293 },
+  {  9, 11,   701 }, {  7, 11,   930 }, { 10, 11,   402 }, { 10, 11,   476 },
+  { 13, 11,   452 }, { 18, 11,    55 }, { 19, 11,   104 }, {  4,  0,   637 },
+  {  5, 10,   460 }, {  8, 11,    50 }, {  9, 11,   624 }, {  4, 11,   572 },
+  {  6,  0,  1159 }, {  4, 10,   199 }, { 11, 10,    34 }, {  6,  0,   847 },
+  {  6, 10,   388 }, {  6, 11,    43 }, {  7, 11,    38 }, {  8, 11,   248 },
+  {  9, 11,   504 }, { 10, 11,   513 }, {  9,  0,   683 }, {  4, 10,   511 },
+  {  6, 10,   608 }, {  9, 10,   333 }, { 10, 10,   602 }, { 11, 10,   441 },
+  { 11, 10,   723 }, { 11, 10,   976 }, { 12, 10,   357 }, {  9,  0,   867 },
+  { 10,  0,   837 }, {  6,  0,   944 }, {  7, 11,   326 }, {  7,  0,  1809 },
+  {  5, 10,   938 }, {  7, 11,   783 }, {  8, 10,   707 }, {  5, 11,   766 },
+  {  5, 11,   363 }, {  6,  0,   170 }, {  7,  0,  1080 }, {  8,  0,   395 },
+  {  8,  0,   487 }, { 13,  0,   147 }, {  6, 11,   258 }, { 12, 11,   409 },
+  {  4,  0,   535 }, {  8,  0,   618 }, {  5, 11,   249 }, { 20, 11,    82 },
+  {  6,  0,  1379 }, { 21, 11,    15 }, {  7,  0,  1625 }, { 22,  0,    23 },
+  {  5, 11,   393 }, {  6, 11,   378 }, {  7, 11,  1981 }, {  9, 11,    32 },
+  {  9, 11,   591 }, { 10, 11,   685 }, { 10, 11,   741 }, { 14, 11,   382 },
+  {  5, 11,   788 }, {  7, 11,  1968 }, { 10, 11,    19 }, { 11, 11,   911 },
+  {  7, 11,  1401 }, {  7, 11,  1476 }, {  4, 11,    61 }, {  5, 11,    58 },
+  {  5, 11,   171 }, {  5, 11,   635 }, {  5, 11,   683 }, {  5, 11,   700 },
+  {  6, 11,   291 }, {  6, 11,   566 }, {  7, 11,  1650 }, { 11, 11,   523 },
+  { 12, 11,   273 }, { 12, 11,   303 }, { 15, 11,    39 }, { 15, 11,   111 },
+  {  6, 10,   469 }, {  7, 10,  1709 }, { 10, 10,   515 }, {  4,  0,   778 },
+  {  6, 11,   589 }, {  4,  0,    46 }, {  5,  0,   811 }, {  6,  0,  1679 },
+  {  6,  0,  1714 }, {  7,  0,  2032 }, {  7,  0,  1458 }, {  9,  0,   407 },
+  { 11,  0,    15 }, { 12,  0,   651 }, { 21,  0,    37 }, {  7,  0,   938 },
+  {  4, 10,   500 }, {  6,  0,    34 }, {  7,  0,    69 }, {  7,  0,  1089 },
+  {  7,  0,  1281 }, {  8,  0,   708 }, {  8,  0,   721 }, {  9,  0,   363 },
+  { 20,  0,    98 }, { 10, 11,   231 }, { 19, 11,   124 }, {  7, 11,   726 },
+  { 24, 11,     9 }, {  5, 10,    68 }, {  6, 10,   383 }, {  8, 11,   583 },
+  {  4, 11,   917 }, {  5, 11,  1005 }, { 11, 10,   216 }, { 11, 10,   340 },
+  {  7, 11,  1675 }, {  8,  0,   441 }, { 10,  0,   314 }, { 15,  0,     3 },
+  {  4, 11,   919 }, {  4, 10,   337 }, {  6, 10,   353 }, {  7, 10,  1934 },
+  {  8, 10,   488 }, {  9, 10,   429 }, {  7,  0,   889 }, {  7, 10,  1795 },
+  {  8, 10,   259 }, {  9, 10,   135 }, {  9, 10,   177 }, {  9, 10,   860 },
+  { 10, 10,   825 }, { 11, 10,   115 }, { 11, 10,   370 }, { 11, 10,   405 },
+  { 11, 10,   604 }, { 12, 10,    10 }, { 12, 10,   667 }, { 12, 10,   669 },
+  { 13, 10,    76 }, { 14, 10,   310 }, { 15, 10,    76 }, { 15, 10,   147 },
+  { 20, 10,    23 }, {  4, 10,    15 }, {  4, 11,   255 }, {  5, 10,    22 },
+  {  5, 11,   302 }, {  6, 11,   132 }, {  6, 10,   244 }, {  7, 10,    40 },
+  {  7, 11,   128 }, {  7, 10,   200 }, {  7, 11,   283 }, {  7, 10,   906 },
+  {  7, 10,  1199 }, {  7, 11,  1299 }, {  9, 10,   616 }, { 10, 11,    52 },
+  { 10, 11,   514 }, { 10, 10,   716 }, { 11, 10,   635 }, { 11, 10,   801 },
+  { 11, 11,   925 }, { 12, 10,   458 }, { 13, 11,    92 }, { 14, 11,   309 },
+  {  4,  0,   462 }, {  9, 11,   173 }, {  7, 10,  1735 }, {  8,  0,   525 },
+  {  5, 10,   598 }, {  7, 10,   791 }, {  8, 10,   108 }, {  9, 10,   123 },
+  {  5,  0,    73 }, {  6,  0,    23 }, {  6,  0,   338 }, {  4,  0,   676 },
+  {  4, 10,   683 }, {  7,  0,   725 }, {  8,  0,   498 }, { 11,  0,   268 },
+  { 12,  0,    21 }, { 23,  0,     7 }, {  7,  0,   773 }, {  4, 10,   155 },
+  {  7, 10,  1689 }, {  4,  0,   164 }, {  5,  0,   730 }, {  5, 10,   151 },
+  {  5, 10,   741 }, {  6, 11,   210 }, {  7, 10,   498 }, {  7, 10,   870 },
+  {  7, 10,  1542 }, { 12, 10,   213 }, { 14, 10,    36 }, { 14, 10,   391 },
+  { 17, 10,   111 }, { 18, 10,     6 }, { 18, 10,    46 }, { 18, 10,   151 },
+  { 19, 10,    36 }, { 20, 10,    32 }, { 20, 10,    56 }, { 20, 10,    69 },
+  { 20, 10,   102 }, { 21, 10,     4 }, { 22, 10,     8 }, { 22, 10,    10 },
+  { 22, 10,    14 }, { 22, 10,    31 }, {  4, 10,   624 }, {  7, 10,  1752 },
+  {  4,  0,   583 }, {  9,  0,   936 }, { 15,  0,   214 }, { 18,  0,   199 },
+  { 24,  0,    26 }, {  6, 11,   588 }, {  7,  0,  1462 }, { 11,  0,   659 },
+  {  4, 11,   284 }, {  6, 11,   223 }, {  5,  0,   220 }, { 11,  0,   803 },
+  {  4,  0,   544 }, {  4, 10,   492 }, {  5, 10,   451 }, { 16,  0,    98 },
+  { 20,  0,   119 }, {  4, 11,   218 }, {  7, 11,   526 }, { 15, 11,   137 },
+  {  7, 10,   835 }, {  4, 11,   270 }, {  5, 11,   192 }, {  6, 11,   332 },
+  {  7, 11,  1322 }, { 13, 11,     9 }, { 13, 10,    70 }, { 14, 11,   104 },
+  { 14, 11,   311 }, {  4, 10,   539 }, { 12, 11,   661 }, {  5,  0,   176 },
+  {  6,  0,   437 }, {  6,  0,   564 }, { 11,  0,   181 }, { 13,  0,   183 },
+  {  7,  0,  1192 }, {  6, 10,   113 }, {  7, 10,   436 }, {  8, 10,   718 },
+  {  7, 10,   520 }, {  7,  0,  1878 }, { 12, 11,   196 }, {  7, 11,   379 },
+  {  8, 11,   481 }, {  9, 11,   377 }, {  5, 11,  1003 }, {  6, 11,   149 },
+  {  9, 11,   746 }, {  8, 11,   262 }, {  9, 11,   627 }, { 10, 11,    18 },
+  { 11, 11,   214 }, { 11, 11,   404 }, { 11, 11,   457 }, { 11, 11,   780 },
+  { 11, 11,   849 }, { 11, 11,   913 }, { 13, 11,   330 }, { 13, 11,   401 },
+  { 14, 11,   200 }, { 21,  0,    26 }, {  8, 11,   304 }, {  4, 11,   142 },
+  {  7,  0,   944 }, {  4,  0,   790 }, {  5,  0,   273 }, {  6,  0,   394 },
+  {  6,  0,   855 }, {  4,  0,   135 }, {  6,  0,   127 }, {  7,  0,  1185 },
+  {  7,  0,  1511 }, {  8,  0,   613 }, { 11,  0,     5 }, { 12,  0,   336 },
+  { 12,  0,   495 }, { 12,  0,   586 }, { 12,  0,   660 }, { 12,  0,   668 },
+  { 14,  0,   385 }, { 15,  0,   118 }, { 17,  0,    20 }, { 18,  0,    98 },
+  {  6,  0,   230 }, {  9,  0,   752 }, { 18,  0,   109 }, { 12, 10,   610 },
+  { 13, 10,   431 }, { 16, 10,    59 }, {  7,  0,  1954 }, {  7, 11,   925 },
+  {  4, 11,   471 }, {  5, 11,    51 }, {  6, 11,   602 }, {  8, 11,   484 },
+  { 10, 11,   195 }, { 12, 11,   159 }, {  4, 10,   307 }, {  8, 11,   688 },
+  {  4, 11,   697 }, {  7, 11,   812 }, {  7, 11,  1261 }, {  7, 11,  1360 },
+  {  9, 11,   632 }, { 12, 11,   352 }, {  5,  0,   162 }, {  8,  0,    68 },
+  {  5, 10,   964 }, {  4,  0,   654 }, {  8, 11,   212 }, {  4,  0,   156 },
+  {  7,  0,   998 }, {  7,  0,  1045 }, {  7,  0,  1860 }, {  9,  0,    48 },
+  {  9,  0,   692 }, { 11,  0,   419 }, { 11,  0,   602 }, {  5, 11,   221 },
+  {  4, 11,   373 }, {  5, 11,   283 }, {  6, 11,   480 }, {  7, 11,   609 },
+  { 14, 11,   216 }, {  4,  0,   240 }, {  6, 11,   192 }, {  9, 11,   793 },
+  { 17, 11,    55 }, {  4, 10,    75 }, {  5, 10,   180 }, {  6, 10,   500 },
+  {  7, 10,    58 }, {  7, 10,   710 }, { 10, 10,   645 }, {  4, 11,   132 },
+  {  5, 11,    69 }, {  5, 10,   649 }, {  7, 11,  1242 }, {  6, 10,   276 },
+  {  7, 10,   282 }, {  7, 10,   879 }, {  7, 10,   924 }, {  8, 10,   459 },
+  {  9, 10,   599 }, {  9, 10,   754 }, { 11, 10,   574 }, { 12, 10,   128 },
+  { 12, 10,   494 }, { 13, 10,    52 }, { 13, 10,   301 }, { 15, 10,    30 },
+  { 15, 10,   132 }, {  4, 10,   200 }, {  4, 11,   111 }, {  7, 11,   302 },
+  {  9,  0,   197 }, { 10,  0,   300 }, { 12,  0,   473 }, { 13,  0,    90 },
+  { 13,  0,   405 }, {  4, 11,   767 }, {  6, 11,    42 }, {  7, 11,  1416 },
+  {  7, 11,  1590 }, {  7, 11,  2005 }, {  8, 11,   131 }, {  8, 11,   466 },
+  {  9, 11,   672 }, { 13, 11,   252 }, { 20, 11,   103 }, {  8,  0,   958 },
+  {  8,  0,   999 }, { 10,  0,   963 }, { 10,  0,  1001 }, {  7, 10,  1621 },
+  {  7,  0,   858 }, {  4,  0,   606 }, {  9, 11,   444 }, {  6, 11,    44 },
+  {  8, 11,   368 }, { 11, 11,   172 }, {  4, 11,   570 }, {  5, 11,   120 },
+  { 11, 11,   624 }, {  7,  0,  1978 }, {  8,  0,   676 }, {  6, 10,   225 },
+  {  9, 10,   211 }, {  7,  0,   972 }, { 11,  0,   102 }, {  8, 10,   687 },
+  {  6, 11,   227 }, {  7, 11,  1589 }, {  8, 10,    58 }, {  9, 10,   724 },
+  { 11, 10,   809 }, { 13, 10,   113 }, { 17, 10,    72 }, {  4,  0,   361 },
+  {  5,  0,   315 }, {  4,  0,   461 }, {  6, 10,   345 }, {  7, 10,  1247 },
+  {  4,  0,   472 }, {  8, 10,   767 }, {  8, 10,   803 }, {  9, 10,   301 },
+  {  9, 10,   903 }, {  7, 11,  1333 }, {  7, 11,   477 }, {  7, 10,  1949 },
+  {  8, 10,   674 }, {  6,  0,   905 }, { 10,  0,   747 }, {  5,  0,   155 },
+  {  6, 10,   259 }, {  7,  0,   163 }, {  8,  0,   319 }, {  9,  0,   402 },
+  { 10,  0,    24 }, { 10,  0,   681 }, { 11,  0,   200 }, { 12,  0,   253 },
+  { 12,  0,   410 }, { 14,  0,   219 }, {  5,  0,   475 }, {  7,  0,  1780 },
+  {  9,  0,   230 }, { 11,  0,   297 }, { 11,  0,   558 }, { 14,  0,   322 },
+  { 19,  0,    76 }, {  6, 11,  1667 }, {  7, 11,  2036 }, { 10, 11,   600 },
+  {  8, 10,   254 }, {  6,  0,   848 }, {  7,  0,  1956 }, {  6, 11,   511 },
+  { 12, 11,   132 }, {  5, 11,   568 }, {  6, 11,   138 }, {  7, 11,  1293 },
+  {  6,  0,   631 }, {  9,  0,   838 }, { 21,  0,    36 }, {  4, 11,   565 },
+  {  8, 11,    23 }, {  8, 11,   827 }, {  5,  0,   944 }, {  6,  0,  1769 },
+  {  4,  0,   144 }, {  6,  0,   842 }, {  6,  0,  1400 }, {  4, 11,   922 },
+  {  5, 11,  1023 }, {  5, 10,   248 }, {  9, 10,   800 }, { 10, 10,   693 },
+  { 11, 10,   482 }, { 11, 10,   734 }, { 11, 10,   789 }, {  7, 11,  1002 },
+  { 11, 11,   145 }, {  4, 10,   116 }, {  5, 10,    95 }, {  5, 10,   445 },
+  {  7, 10,  1688 }, {  8, 10,    29 }, {  9, 10,   272 }, { 11, 10,   509 },
+  { 11, 10,   915 }, { 14,  0,   369 }, { 18,  0,    72 }, {  7, 10,  1641 },
+  {  4, 11,   740 }, {  5, 10,   543 }, { 12, 11,   116 }, {  6,  0,   247 },
+  {  9,  0,   555 }, {  5, 10,   181 }, {  8, 10,    41 }, {  5, 10,   657 },
+  {  8,  0,   996 }, { 10, 10,   709 }, {  7,  0,   189 }, {  8, 10,   202 },
+  { 10, 10,   536 }, {  8, 11,   402 }, {  4, 11,   716 }, { 13, 11,    31 },
+  { 10,  0,   280 }, { 10,  0,   797 }, {  9, 10,   423 }, { 12, 10,    89 },
+  {  8, 10,   113 }, {  9, 10,   877 }, { 10, 10,   554 }, { 11, 10,    83 },
+  { 12, 10,   136 }, { 19, 10,   109 }, {  5, 10,   976 }, {  7,  0,   746 },
+  {  4, 10,   206 }, {  8,  0,   526 }, { 11,  0,   345 }, {  8,  0,  1017 },
+  {  8, 11,   152 }, {  9, 11,    53 }, {  9, 11,   268 }, {  9, 11,   901 },
+  { 10, 11,   518 }, { 10, 11,   829 }, { 11, 11,   188 }, { 13, 11,    74 },
+  { 14, 11,    46 }, { 15, 11,    17 }, { 15, 11,    33 }, { 17, 11,    40 },
+  { 18, 11,    36 }, { 19, 11,    20 }, { 22, 11,     1 }, { 24, 11,     2 },
+  {  5, 11,   736 }, {  8, 11,   532 }, {  5,  0,   428 }, { 10,  0,   651 },
+  {  7, 11,   681 }, {  7,  0,  1162 }, {  7,  0,   327 }, { 13,  0,   230 },
+  { 17,  0,   113 }, {  8, 10,   226 }, { 10, 10,   537 }, { 11, 10,   570 },
+  { 11, 10,   605 }, { 11, 10,   799 }, { 11, 10,   804 }, { 12, 10,    85 },
+  { 12, 10,   516 }, { 12, 10,   623 }, { 12, 11,   677 }, { 13, 10,   361 },
+  { 14, 10,    77 }, { 14, 10,    78 }, { 19, 10,   110 }, {  4,  0,   792 },
+  {  7,  0,  1717 }, { 10,  0,   546 }, {  4, 10,   769 }, {  4, 11,   684 },
+  {  8, 11,   384 }, {  4, 10,   551 }, {  6,  0,  1203 }, {  9, 10,    57 },
+  {  9, 10,   459 }, { 10, 10,   425 }, { 11, 10,   119 }, { 12, 10,   184 },
+  { 12, 10,   371 }, { 13, 10,   358 }, { 17, 10,    51 }, {  5,  0,   672 },
+  {  5, 10,   814 }, {  8, 10,    10 }, {  9, 10,   421 }, {  9, 10,   729 },
+  { 10, 10,   609 }, { 11, 10,   689 }, { 10,  0,   189 }, {  6, 10,   624 },
+  {  7, 11,   110 }, {  7, 11,   188 }, {  8, 11,   290 }, {  8, 11,   591 },
+  {  9, 11,   382 }, {  9, 11,   649 }, { 11, 11,    71 }, { 11, 11,   155 },
+  { 11, 11,   313 }, { 12, 11,     5 }, { 13, 11,   325 }, { 14, 11,   287 },
+  {  5,  0,    99 }, {  6,  0,  1053 }, {  7,  0,   298 }, {  7, 11,   360 },
+  {  7, 11,   425 }, {  9, 11,    66 }, {  9, 11,   278 }, { 10, 11,   644 },
+  {  4,  0,   397 }, {  8,  0,   555 }, {  9, 10,   269 }, {  4, 10,   528 },
+  {  4, 11,   900 }, {  5, 11,   861 }, {  6,  0,  1157 }, {  5, 11,   254 },
+  {  7, 11,   985 }, {  8, 11,    73 }, {  7, 11,  1959 }, {  8, 11,   683 },
+  { 12,  0,   398 }, { 20,  0,    39 }, { 21,  0,    11 }, { 22,  0,    41 },
+  {  4,  0,   485 }, {  7,  0,   353 }, {  7,  0,  1523 }, {  6,  0,   366 },
+  {  7,  0,  1384 }, {  7,  0,  1601 }, { 10,  0,   787 }, {  9,  0,   282 },
+  {  5, 10,   104 }, {  6, 10,   173 }, {  7, 10,  1631 }, { 11, 11,   146 },
+  {  4,  0,   157 }, {  5,  0,   471 }, {  6,  0,   941 }, {  4, 11,   725 },
+  {  7,  0,  1336 }, {  8, 10,   138 }, {  8, 10,   342 }, {  9, 10,    84 },
+  { 10, 10,   193 }, { 11, 10,   883 }, { 12, 10,   359 }, {  6, 11,   196 },
+  {  8,  0,   116 }, {  5, 11,   831 }, {  6,  0,   787 }, {  6, 10,    95 },
+  {  6, 10,   406 }, { 10, 10,   409 }, { 10, 10,   447 }, { 11, 10,    44 },
+  { 12, 10,   100 }, {  5,  0,   160 }, {  7,  0,   363 }, {  7,  0,   589 },
+  { 10,  0,   170 }, { 13,  0,    55 }, {  6,  0,  1815 }, {  4,  0,   866 },
+  {  6,  0,   889 }, {  6,  0,  1067 }, {  6,  0,  1183 }, {  4, 11,   321 },
+  {  6, 11,   569 }, {  5, 11,   848 }, {  6, 11,    66 }, {  4, 11,    36 },
+  {  6, 10,  1636 }, {  7, 11,  1387 }, { 10, 11,   205 }, { 11, 11,   755 },
+  { 13, 11,   271 }, {  4,  0,   689 }, {  9,  0,   820 }, {  4, 10,   282 },
+  {  7, 10,  1034 }, { 11, 10,   398 }, { 11, 10,   634 }, { 12, 10,     1 },
+  { 12, 10,    79 }, { 12, 10,   544 }, { 14, 10,   237 }, { 17, 10,    10 },
+  { 18, 10,    20 }, {  4,  0,   108 }, {  7,  0,   804 }, { 11,  0,   498 },
+  {  4, 11,   887 }, {  6,  0,  1119 }, {  7, 11,   620 }, {  6, 11,   165 },
+  { 10, 11,   388 }, {  5,  0,   244 }, {  5, 10,   499 }, {  6, 10,   476 },
+  {  7, 10,   600 }, {  7, 10,   888 }, {  7, 10,  1096 }, { 12,  0,   609 },
+  {  7,  0,  1005 }, {  4,  0,   412 }, {  5,  0,   581 }, {  4, 11,   719 },
+  {  7, 11,   155 }, {  7, 10,   296 }, {  7, 10,   596 }, {  8, 10,   560 },
+  {  8, 10,   586 }, {  9, 10,   612 }, { 11, 10,   304 }, { 12, 10,    46 },
+  { 13, 10,    89 }, { 14, 10,   112 }, { 17, 10,   122 }, {  4,  0,   895 },
+  {  5,  0,   772 }, { 14, 11,   307 }, {  7,  0,  1898 }, {  4,  0,   926 },
+  {  5,  0,   983 }, {  4, 11,   353 }, {  6, 11,   146 }, {  6, 11,  1789 },
+  {  7, 11,   288 }, {  7, 11,   990 }, {  7, 11,  1348 }, {  9, 11,   665 },
+  {  9, 11,   898 }, { 11, 11,   893 }, { 14, 11,   212 }, {  4,  0,   538 },
+  {  5, 11,   532 }, {  6,  0,   294 }, {  7,  0,  1267 }, {  8,  0,   624 },
+  { 13,  0,   496 }, {  7,  0,  1325 }, {  4, 11,    45 }, {  7, 11,  1257 },
+  { 10,  0,   301 }, {  9,  0,   298 }, { 12,  0,   291 }, { 13,  0,   276 },
+  { 14,  0,     6 }, { 17,  0,    18 }, { 21,  0,    32 }, {  7, 10,  1599 },
+  {  7, 10,  1723 }, {  8, 10,    79 }, {  8, 10,   106 }, {  8, 10,   190 },
+  {  8, 10,   302 }, {  8, 10,   383 }, {  8, 10,   713 }, {  9, 10,   119 },
+  {  9, 10,   233 }, {  9, 10,   419 }, {  9, 10,   471 }, { 10, 10,   181 },
+  { 10, 10,   406 }, { 11, 10,    57 }, { 11, 10,    85 }, { 11, 10,   120 },
+  { 11, 10,   177 }, { 11, 10,   296 }, { 11, 10,   382 }, { 11, 10,   454 },
+  { 11, 10,   758 }, { 11, 10,   999 }, { 12, 10,    27 }, { 12, 10,   131 },
+  { 12, 10,   245 }, { 12, 10,   312 }, { 12, 10,   446 }, { 12, 10,   454 },
+  { 13, 10,    98 }, { 13, 10,   426 }, { 13, 10,   508 }, { 14, 10,   163 },
+  { 14, 10,   272 }, { 14, 10,   277 }, { 14, 10,   370 }, { 15, 10,    95 },
+  { 15, 10,   138 }, { 15, 10,   167 }, { 17, 10,    38 }, { 20, 10,    96 },
+  {  4,  0,   757 }, {  6,  0,  1263 }, {  4,  0,   820 }, {  6, 10,  1759 },
+  {  5,  0,   722 }, {  8, 11,   816 }, { 10, 10,   372 }, { 17, 10,    16 },
+  {  6,  0,  1039 }, {  4,  0,   991 }, {  6,  0,  2028 }, {  5, 10,   258 },
+  {  7,  0,  1875 }, { 11,  0,   124 }, {  6, 11,   559 }, {  6, 11,  1691 },
+  {  7, 11,   586 }, {  5,  0,   324 }, {  7,  0,   881 }, {  8, 10,   134 },
+  {  9, 10,   788 }, { 12, 10,   438 }, {  7, 11,  1823 }, { 11, 11,   693 },
+  {  6,  0,  1348 }, {  6,  0,  1545 }, {  6,  0,   911 }, {  4,  0,   954 },
+  {  8,  0,   329 }, {  8,  0,   414 }, {  7, 10,  1948 }, {  7, 10,  2004 },
+  {  5,  0,   517 }, {  6, 10,   439 }, {  7, 10,   780 }, {  7, 10,  1040 },
+  {  4,  0,   816 }, {  5, 10,     1 }, {  6, 10,    81 }, { 10, 10,   520 },
+  {  9,  0,   713 }, { 10,  0,   222 }, {  5, 10,   482 }, {  8, 10,    98 },
+  { 10, 10,   700 }, { 10, 10,   822 }, { 11, 10,   302 }, { 11, 10,   778 },
+  { 12, 10,    50 }, { 12, 10,   127 }, { 12, 10,   396 }, { 13, 10,    62 },
+  { 13, 10,   328 }, { 14, 10,   122 }, { 19, 10,    72 }, {  9,  0,    33 },
+  {  5, 10,     2 }, {  7, 10,  1494 }, {  8, 10,   589 }, {  6, 10,   512 },
+  {  7, 10,   797 }, {  8, 10,   253 }, {  9, 10,    77 }, { 10, 10,     1 },
+  { 10, 11,   108 }, { 10, 10,   129 }, { 10, 10,   225 }, { 11, 11,   116 },
+  { 11, 10,   118 }, { 11, 10,   226 }, { 11, 10,   251 }, { 11, 10,   430 },
+  { 11, 10,   701 }, { 11, 10,   974 }, { 11, 10,   982 }, { 12, 10,    64 },
+  { 12, 10,   260 }, { 12, 10,   488 }, { 12, 10,   690 }, {  6, 11,   456 },
+  {  5, 11,   925 }, {  5,  0,   150 }, {  7,  0,   106 }, {  7,  0,   774 },
+  {  8,  0,   603 }, {  9,  0,   593 }, {  9,  0,   634 }, { 10,  0,    44 },
+  { 10,  0,   173 }, { 11,  0,   462 }, { 11,  0,   515 }, { 13,  0,   216 },
+  { 13,  0,   288 }, { 14,  0,   400 }, {  9, 10,   347 }, {  5,  0,   748 },
+  {  6,  0,   553 }, { 12,  0,   108 }, { 13,  0,   291 }, {  7,  0,   420 },
+  {  4, 10,    12 }, {  7, 10,   522 }, {  7, 10,   809 }, {  8, 10,   797 },
+  { 13, 10,    88 }, {  6, 11,   193 }, {  7, 11,   240 }, {  7, 11,  1682 },
+  { 10, 11,    51 }, { 10, 11,   640 }, { 11, 11,   410 }, { 13, 11,    82 },
+  { 14, 11,   247 }, { 14, 11,   331 }, { 14, 11,   377 }, {  5, 10,   528 },
+  {  7,  0,  1777 }, {  4,  0,   493 }, { 16,  0,    55 }, {  8, 11,   633 },
+  { 11,  0,    81 }, {  6,  0,   980 }, {  8,  0,   321 }, { 20, 10,   109 },
+  {  5, 10,   266 }, {  9, 10,   290 }, {  9, 10,   364 }, { 10, 10,   293 },
+  { 11, 10,   606 }, { 14, 10,    45 }, {  6,  0,   568 }, {  7,  0,   112 },
+  {  7,  0,  1804 }, {  8,  0,   362 }, {  8,  0,   410 }, {  8,  0,   830 },
+  {  9,  0,   514 }, { 11,  0,   649 }, { 14,  0,   157 }, {  4,  0,    74 },
+  {  6,  0,   510 }, {  6, 10,   594 }, {  9, 10,   121 }, { 10, 10,    49 },
+  { 10, 10,   412 }, { 11, 10,   834 }, {  6,  0,   838 }, {  8, 10,   748 },
+  {  4, 10,   466 }, {  4,  0,   625 }, {  7, 11,  1443 }, {  4, 11,   237 },
+  {  7, 11,   514 }, {  9, 10,   378 }, { 13, 10,   162 }, {  6,  0,    16 },
+  {  6,  0,   158 }, {  7,  0,    43 }, {  7,  0,   129 }, {  7,  0,   181 },
+  {  8,  0,   276 }, {  8,  0,   377 }, { 10,  0,   523 }, { 11,  0,   816 },
+  { 12,  0,   455 }, { 13,  0,   303 }, { 14,  0,   135 }, {  7,  0,   281 },
+  {  4,  0,     1 }, {  7,  0,  1143 }, {  7,  0,  1463 }, {  8,  0,    61 },
+  {  9,  0,   207 }, {  9,  0,   390 }, {  9,  0,   467 }, { 11,  0,   836 },
+  {  6, 11,   392 }, {  7, 11,    65 }, {  7, 11,  2019 }, {  4, 10,   667 },
+  {  4,  0,   723 }, {  5,  0,   895 }, {  7,  0,  1031 }, {  8,  0,   199 },
+  {  8,  0,   340 }, {  9,  0,   153 }, {  9,  0,   215 }, { 10,  0,    21 },
+  { 10,  0,    59 }, { 10,  0,    80 }, { 10,  0,   224 }, { 10,  0,   838 },
+  { 11,  0,   229 }, { 11,  0,   652 }, { 12,  0,   192 }, { 13,  0,   146 },
+  { 14,  0,    91 }, {  4,  0,   295 }, {  9,  0,    51 }, {  9, 11,   222 },
+  { 10, 11,    43 }, { 11, 11,   900 }, {  5,  0,   309 }, { 12,  0,   211 },
+  {  5,  0,   125 }, {  8,  0,    77 }, { 10,  0,    15 }, {  8, 11,   604 },
+  { 10,  0,   789 }, {  5,  0,   173 }, {  4, 10,    39 }, {  7, 10,  1843 },
+  {  8, 10,   407 }, { 11, 10,   144 }, { 12, 10,   523 }, { 10, 11,   265 },
+  {  5,  0,   439 }, {  4, 10,   510 }, {  7,  0,   648 }, {  7,  0,   874 },
+  { 11,  0,   164 }, { 12,  0,    76 }, { 18,  0,     9 }, {  7, 10,  1980 },
+  { 10, 10,   487 }, { 10, 10,   809 }, { 12,  0,   111 }, { 14,  0,   294 },
+  { 19,  0,    45 }, { 13, 10,   260 }, { 18, 10,    63 }, {  5, 11,   549 },
+  {  6, 10,   570 }, {  4,  0,     8 }, {  7,  0,  1152 }, {  7,  0,  1153 },
+  {  7,  0,  1715 }, {  9,  0,   374 }, { 10,  0,   478 }, { 11,  0,   648 },
+  {  7,  0,  1099 }, {  5,  0,   575 }, {  6,  0,   354 }, {  7,  0,   701 },
+  {  7, 11,    36 }, {  8, 11,   201 }, {  8, 11,   605 }, {  4, 10,   787 },
+  {  8, 11,   156 }, {  6,  0,   518 }, { 21, 11,    13 }, { 12, 11,   224 },
+  {  6,  0,   702 }, {  4, 10,   516 }, {  5, 11,   724 }, { 10, 11,   305 },
+  { 11, 11,   151 }, { 12, 11,    33 }, { 12, 11,   121 }, { 12, 11,   381 },
+  { 17, 11,     3 }, { 17, 11,    27 }, { 17, 11,    78 }, { 18, 11,    18 },
+  { 19, 11,    54 }, { 21, 11,     5 }, {  8,  0,    87 }, {  4, 11,   523 },
+  {  5, 11,   638 }, { 11, 10,   887 }, { 14, 10,   365 }, { 14, 10,   375 },
+  { 10,  0,   438 }, {  8, 10,   821 }, {  7, 11,  1908 }, {  6, 11,   242 },
+  {  7, 11,   227 }, {  7, 11,  1581 }, {  8, 11,   104 }, {  9, 11,   113 },
+  {  9, 11,   220 }, {  9, 11,   427 }, { 10, 11,    74 }, { 10, 11,   239 },
+  { 11, 11,   579 }, { 11, 11,  1023 }, { 13, 11,     4 }, { 13, 11,   204 },
+  { 13, 11,   316 }, { 18, 11,    95 }, { 20, 11,    86 }, {  4,  0,    69 },
+  {  5,  0,   122 }, {  5,  0,   849 }, {  6,  0,  1633 }, {  9,  0,   656 },
+  { 10,  0,   464 }, {  7,  0,  1802 }, {  4, 10,    10 }, { 11, 10,   786 },
+  {  7, 11,   861 }, { 11,  0,   499 }, {  7,  0,   476 }, {  7,  0,  1592 },
+  { 10,  0,    87 }, {  5, 10,   684 }, {  4,  0,   840 }, {  6, 10,    27 },
+  { 14,  0,   283 }, {  6,  0,  1620 }, {  7, 11,  1328 }, {  8, 11,   494 },
+  {  5,  0,   859 }, {  7,  0,  1160 }, {  8,  0,   107 }, {  9,  0,   291 },
+  {  9,  0,   439 }, { 10,  0,   663 }, { 11,  0,   609 }, { 12,  0,   197 },
+  {  7, 11,  1306 }, {  8, 11,   505 }, {  9, 11,   482 }, { 10, 11,   126 },
+  { 11, 11,   225 }, { 12, 11,   347 }, { 12, 11,   449 }, { 13, 11,    19 },
+  { 14, 11,   218 }, {  5, 11,   268 }, { 10, 11,   764 }, { 12, 11,   120 },
+  { 13, 11,    39 }, { 17, 11,   127 }, { 17, 10,    56 }, {  7, 11,  1672 },
+  { 10, 11,   472 }, { 11, 11,   189 }, { 15, 11,    51 }, {  6, 10,   342 },
+  {  6, 10,   496 }, {  8, 10,   275 }, {  9, 10,   206 }, {  5,  0,   600 },
+  {  4,  0,   117 }, {  6,  0,   372 }, {  7,  0,  1905 }, { 14,  0,   323 },
+  {  4, 10,   909 }, {  5, 10,   940 }, {  7, 11,  1471 }, {  4, 10,   891 },
+  {  4,  0,   722 }, { 11,  0,   471 }, {  4, 11,   384 }, {  7, 11,  1022 },
+  {  4, 10,   687 }, {  9,  0,     5 }, { 12,  0,   216 }, { 12,  0,   294 },
+  { 12,  0,   298 }, { 12,  0,   400 }, { 12,  0,   518 }, { 13,  0,   229 },
+  { 15,  0,   139 }, {  7, 11,  1703 }, {  7, 11,  1602 }, { 10, 11,   698 },
+  { 12, 11,   212 }, { 13, 11,   307 }, {  6, 10,    41 }, { 13, 10,   160 },
+  {  7, 11,  1077 }, {  9, 11,   159 }, { 11, 11,    28 }, { 12, 11,   603 },
+  {  4,  0,   514 }, {  7,  0,  1304 }, { 10,  0,   477 }, {  6,  0,  1774 },
+  {  9,  0,    88 }, { 11,  0,   270 }, {  5,  0,    12 }, {  7,  0,   375 },
+  {  9,  0,   438 }, {  6, 10,  1718 }, {  4, 11,   515 }, {  8, 10,   778 },
+  {  8, 11,   632 }, {  8, 11,   697 }, {  9, 11,   854 }, {  6,  0,   362 },
+  {  6,  0,   997 }, { 18,  0,    51 }, {  7,  0,   816 }, {  7,  0,  1241 },
+  {  9,  0,   283 }, {  9,  0,   520 }, { 10,  0,   213 }, { 10,  0,   307 },
+  { 10,  0,   463 }, { 10,  0,   671 }, { 10,  0,   746 }, { 11,  0,   401 },
+  { 11,  0,   794 }, { 12,  0,   517 }, { 18,  0,   107 }, { 19,  0,   115 },
+  {  5, 10,   115 }, { 22, 11,    28 }, {  4, 11,   136 }, {  5, 11,   551 },
+  { 14, 10,   314 }, {  4,  0,   258 }, {  6,  0,    22 }, {  7,  0,   903 },
+  {  7,  0,  1963 }, {  8,  0,   639 }, { 10,  0,   577 }, {  5,  0,   681 },
+  {  8,  0,   782 }, { 13,  0,   130 }, { 17,  0,    84 }, {  5, 10,   193 },
+  { 12, 10,   178 }, {  9, 11,    17 }, { 10, 11,   291 }, {  7, 11,  1287 },
+  {  9, 11,    44 }, { 10, 11,   552 }, { 10, 11,   642 }, { 11, 11,   839 },
+  { 12, 11,   274 }, { 12, 11,   275 }, { 12, 11,   372 }, { 13, 11,    91 },
+  { 14, 11,   125 }, {  7, 10,   174 }, {  4,  0,   664 }, {  5,  0,   804 },
+  { 11,  0,  1013 }, {  6,  0,   942 }, {  6,  0,  1349 }, {  6,  0,  1353 },
+  {  6,  0,  1450 }, {  7, 11,  1518 }, { 11, 11,   694 }, { 11,  0,   356 },
+  {  4, 10,   122 }, {  5, 10,   796 }, {  5, 10,   952 }, {  6, 10,  1660 },
+  {  6, 10,  1671 }, {  8, 10,   567 }, {  9, 10,   687 }, {  9, 10,   742 },
+  { 10, 10,   686 }, { 11, 10,   682 }, { 12, 10,   281 }, {  5,  0,    32 },
+  {  6, 11,   147 }, {  7, 11,   886 }, {  9, 11,   753 }, { 10, 11,   268 },
+  {  5, 10,   179 }, {  7, 10,  1095 }, {  7, 10,  1213 }, {  4, 10,    66 },
+  {  7, 10,   722 }, {  7, 10,   904 }, {  7, 10,   352 }, {  9, 11,   245 },
+  { 10, 11,   137 }, {  4,  0,   289 }, {  7,  0,   629 }, {  7,  0,  1698 },
+  {  7,  0,  1711 }, { 12,  0,   215 }, {  5, 11,   414 }, {  6,  0,  1975 },
+  {  7, 11,  1762 }, {  6,  0,   450 }, {  8,  0,   109 }, { 13, 10,    35 },
+  {  6, 11,   599 }, {  8,  0,   705 }, {  5,  0,   664 }, {  6, 11,  1749 },
+  { 11, 11,   402 }, { 12, 11,   109 }, { 12, 11,   431 }, { 13, 11,   179 },
+  { 13, 11,   206 }, { 14, 11,   175 }, { 14, 11,   217 }, { 16, 11,     3 },
+  { 20, 11,    53 }, {  7,  0,  1238 }, {  6, 11,  1627 }, {  4, 11,   488 },
+  { 13,  0,   318 }, { 10, 10,   592 }, { 10, 10,   753 }, { 12, 10,   317 },
+  { 12, 10,   355 }, { 12, 10,   465 }, { 12, 10,   469 }, { 12, 10,   560 },
+  { 12, 10,   578 }, {  5, 10,   564 }, {  4, 11,    83 }, { 12, 11,   676 },
+  {  6,  0,  1872 }, {  6,  0,  1906 }, {  6,  0,  1907 }, {  9,  0,   934 },
+  {  9,  0,   956 }, {  9,  0,   960 }, {  9,  0,   996 }, { 12,  0,   794 },
+  { 12,  0,   876 }, { 12,  0,   880 }, { 12,  0,   918 }, { 15,  0,   230 },
+  { 18,  0,   234 }, { 18,  0,   238 }, { 21,  0,    38 }, { 21,  0,    62 },
+  {  6, 10,   556 }, {  6, 11,   278 }, {  9,  0,   103 }, {  7, 10,   544 },
+  {  8, 10,   719 }, { 10, 10,    61 }, {  4, 10,     5 }, {  5, 10,   498 },
+  {  8, 10,   637 }, {  9, 10,   521 }, {  7,  0,   777 }, { 12,  0,   229 },
+  { 12,  0,   239 }, { 15,  0,    12 }, { 12, 11,   229 }, { 12, 11,   239 },
+  { 15, 11,    12 }, {  6,  0,    26 }, {  7, 11,   388 }, {  7, 11,   644 },
+  { 11, 11,   781 }, {  7, 11,   229 }, {  8, 11,    59 }, {  9, 11,   190 },
+  {  9, 11,   257 }, { 10, 11,   378 }, { 12, 11,   191 }, {  5, 10,   927 },
+  {  7, 10,  1441 }, {  4, 10,   893 }, {  5, 10,   780 }, {  5, 10,   893 },
+  {  4,  0,   414 }, {  5,  0,   467 }, {  9,  0,   654 }, { 10,  0,   451 },
+  { 12,  0,    59 }, { 13,  0,   375 }, { 14,  0,   173 }, {  7,  0,    17 },
+  {  7,  0,  1350 }, {  5, 10,   238 }, {  7,  0,   955 }, {  4,  0,   960 },
+  { 10,  0,   887 }, { 12,  0,   753 }, { 18,  0,   161 }, { 18,  0,   162 },
+  { 24,  0,    19 }, {  8, 11,   344 }, {  6, 10,  1729 }, {  9, 11,   288 },
+  {  4, 11,   660 }, {  4,  0,   217 }, {  5,  0,   710 }, {  7,  0,   760 },
+  {  7,  0,  1926 }, {  9,  0,   428 }, {  9,  0,   708 }, { 10,  0,   254 },
+  { 10,  0,   296 }, { 10,  0,   720 }, { 11,  0,   109 }, { 11,  0,   255 },
+  { 12,  0,   165 }, { 12,  0,   315 }, { 13,  0,   107 }, { 13,  0,   203 },
+  { 14,  0,    54 }, { 14,  0,    99 }, { 14,  0,   114 }, { 14,  0,   388 },
+  { 16,  0,    85 }, { 17,  0,     9 }, { 17,  0,    33 }, { 20,  0,    25 },
+  { 20,  0,    28 }, { 20,  0,    29 }, { 21,  0,     9 }, { 21,  0,    10 },
+  { 21,  0,    34 }, { 22,  0,    17 }, {  4, 10,    60 }, {  7, 10,  1800 },
+  {  8, 10,   314 }, {  9, 10,   700 }, { 11, 10,   487 }, {  7, 11,  1035 },
+  { 10, 11,   737 }, {  7, 11,   690 }, {  9, 11,   217 }, {  9, 11,   587 },
+  { 12, 11,   521 }, {  6,  0,   919 }, {  7, 11,   706 }, {  7, 11,  1058 },
+  { 10, 11,   538 }, {  7, 10,  1853 }, { 10, 10,   437 }, {  8, 10,   419 },
+  {  6,  0,   280 }, { 10,  0,   502 }, { 11,  0,   344 }, { 12,  0,    38 },
+  {  5,  0,    45 }, {  7,  0,  1161 }, { 11,  0,   448 }, { 11,  0,   880 },
+  { 13,  0,   139 }, { 13,  0,   407 }, { 15,  0,    16 }, { 17,  0,    95 },
+  { 18,  0,    66 }, { 18,  0,    88 }, { 18,  0,   123 }, { 21,  0,     7 },
+  { 11, 11,    92 }, { 11, 11,   196 }, { 11, 11,   409 }, { 11, 11,   450 },
+  { 11, 11,   666 }, { 11, 11,   777 }, { 12, 11,   262 }, { 13, 11,   385 },
+  { 13, 11,   393 }, { 15, 11,   115 }, { 16, 11,    45 }, { 17, 11,    82 },
+  {  8,  0,   777 }, {  6, 11,  1744 }, {  4,  0,   410 }, {  7,  0,   521 },
+  {  5, 10,   828 }, {  6,  0,   673 }, {  7,  0,  1110 }, {  7,  0,  1778 },
+  {  7, 10,   176 }, {  7, 10,   178 }, {  5, 10,   806 }, {  7, 11,   268 },
+  {  7, 10,  1976 }, {  8, 11,   569 }, {  4, 11,   733 }, {  9, 11,   194 },
+  { 10, 11,    92 }, { 11, 11,   198 }, { 12, 11,    84 }, { 12, 11,    87 },
+  { 13, 11,   128 }, { 16, 11,    74 }, {  5,  0,   341 }, {  7,  0,  1129 },
+  { 11,  0,   414 }, {  4, 10,    51 }, {  6, 10,     4 }, {  7, 10,   591 },
+  {  7, 10,   849 }, {  7, 10,   951 }, {  7, 10,  1613 }, {  7, 10,  1760 },
+  {  7, 10,  1988 }, {  9, 10,   434 }, { 10, 10,   754 }, { 11, 10,    25 },
+  { 11, 10,    37 }, {  5, 10,   902 }, {  7, 10,   928 }, {  7,  0,   787 },
+  {  4,  0,   436 }, {  6, 10,   270 }, {  7,  0,  1587 }, {  7,  0,  1707 },
+  {  6,  0,   377 }, {  7,  0,  1025 }, {  9,  0,   613 }, { 17,  0,   104 },
+  {  7, 11,   982 }, {  7, 11,  1361 }, { 10, 11,    32 }, { 15, 11,    56 },
+  { 11,  0,    96 }, {  4,  0,   451 }, {  4, 10,   416 }, { 14, 10,   372 },
+  {  5, 10,   152 }, {  5, 10,   197 }, {  7, 11,   306 }, {  7, 10,   340 },
+  {  7, 10,   867 }, { 10, 10,   548 }, { 10, 10,   581 }, { 11, 10,     6 },
+  { 12, 10,     3 }, { 12, 10,    19 }, { 14, 10,   110 }, { 14, 10,   289 },
+  {  6,  0,   680 }, {  6, 11,   609 }, {  7,  0,   483 }, {  7, 10,   190 },
+  {  8, 10,    28 }, {  8, 10,   141 }, {  8, 10,   444 }, {  8, 10,   811 },
+  {  9, 10,   468 }, { 11, 10,   334 }, { 12, 10,    24 }, { 12, 10,   386 },
+  { 12, 10,   576 }, { 10,  0,   916 }, {  5, 10,   757 }, {  5, 10,   721 },
+  {  7, 10,  1553 }, {  5, 11,   178 }, {  6,  0,   937 }, {  4, 10,   898 },
+  {  5,  0,   739 }, { 19,  0,    82 }, {  7,  0,   663 }, { 18,  0,   128 },
+  {  5, 10,   277 }, { 13, 10,   247 }, {  6,  0,  1087 }, {  4, 10,   435 },
+  {  6, 11,   381 }, {  7, 11,   645 }, {  7, 11,   694 }, {  8, 11,   546 },
+  {  7,  0,   503 }, {  7,  0,  1885 }, {  6,  0,  1965 }, {  8,  0,   925 },
+  { 10,  0,   955 }, {  4,  0,   113 }, {  5,  0,   163 }, {  5,  0,   735 },
+  {  7,  0,  1009 }, {  9,  0,     9 }, {  9,  0,   771 }, { 12,  0,    90 },
+  { 13,  0,   138 }, { 13,  0,   410 }, { 15,  0,   128 }, {  4,  0,   324 },
+  { 10,  0,   104 }, {  7,  0,   460 }, {  5, 10,   265 }, {  6, 10,   212 },
+  {  5, 11,   105 }, {  7, 11,   261 }, {  7, 11,  1107 }, {  7, 11,  1115 },
+  {  7, 11,  1354 }, {  7, 11,  1588 }, {  7, 11,  1705 }, {  7, 11,  1902 },
+  {  9, 11,   465 }, { 10, 11,   248 }, { 10, 11,   349 }, { 10, 11,   647 },
+  { 11, 11,   527 }, { 11, 11,   660 }, { 11, 11,   669 }, { 12, 11,   529 },
+  { 13, 11,   305 }, {  5, 11,   438 }, {  9, 11,   694 }, { 12, 11,   627 },
+  { 13, 11,   210 }, { 24, 11,    11 }, {  4,  0,   935 }, {  5,  0,   823 },
+  {  4, 10,   702 }, {  5,  0,   269 }, {  7,  0,   434 }, {  7,  0,   891 },
+  {  8,  0,   339 }, {  9,  0,   702 }, { 11,  0,   594 }, { 11,  0,   718 },
+  { 17,  0,   100 }, {  5, 10,   808 }, {  7, 10,  2045 }, {  7,  0,  1014 },
+  {  9,  0,   485 }, { 13,  0,   264 }, {  6,  0,  1713 }, {  7,  0,  1810 },
+  { 11,  0,   866 }, { 12,  0,   103 }, { 13,  0,   495 }, { 12, 11,   233 },
+  {  4,  0,   423 }, { 10,  0,   949 }, { 10,  0,  1013 }, {  7,  0,   900 },
+  {  8, 11,    25 }, { 10, 11,   826 }, {  5, 10,   166 }, {  8, 10,   739 },
+  { 12, 10,   511 }, {  6,  0,  2018 }, {  7, 11,  1270 }, { 11, 11,   612 },
+  {  4, 10,   119 }, {  5, 10,   170 }, {  5, 10,   447 }, {  7, 10,  1708 },
+  {  7, 10,  1889 }, {  9, 10,   357 }, {  9, 10,   719 }, { 12, 10,   486 },
+  { 12, 10,   596 }, { 12,  0,   574 }, { 12, 11,   574 }, {  4, 11,   308 },
+  {  6,  0,   964 }, {  6,  0,  1206 }, {  6,  0,  1302 }, {  4, 10,   450 },
+  {  7, 10,  1158 }, {  7, 11,   150 }, {  8, 11,   649 }, { 14,  0,   213 },
+  { 20,  0,    38 }, {  9, 11,    45 }, {  9, 11,   311 }, { 13, 11,    42 },
+  {  6, 11,   521 }, {  7, 10,  1375 }, {  7, 10,  1466 }, { 10, 10,   331 },
+  {  4, 10,   754 }, {  5, 11,   339 }, {  7, 11,  1442 }, { 14, 11,     3 },
+  { 15, 11,    41 }, { 19, 11,    66 }, {  8, 11,   378 }, {  6,  0,  1022 },
+  {  5, 10,   850 }, {  8, 10,   799 }, { 14,  0,   143 }, {  7,  0,  2029 },
+  {  6, 11,  1628 }, {  8,  0,   523 }, { 22,  0,    34 }, {  5,  0,   625 },
+  {  7,  0,  1617 }, {  7,  0,   275 }, {  7, 10,   238 }, {  7, 10,  2033 },
+  {  8, 10,   120 }, {  8, 10,   188 }, {  8, 10,   659 }, {  9, 10,   598 },
+  { 10, 10,   466 }, { 12, 10,   342 }, { 12, 10,   588 }, { 13, 10,   503 },
+  { 14, 10,   246 }, { 15, 10,    92 }, {  7,  0,    37 }, {  8,  0,   425 },
+  {  8,  0,   693 }, {  9,  0,   720 }, { 10,  0,   380 }, { 10,  0,   638 },
+  { 11,  0,   273 }, { 11,  0,   473 }, { 12,  0,    61 }, { 15,  0,    43 },
+  {  7, 11,   829 }, {  7,  0,  1943 }, {  4,  0,   765 }, {  5, 11,   486 },
+  {  7, 11,  1349 }, {  7, 11,  1635 }, {  8, 11,    17 }, { 10, 11,   217 },
+  { 10, 11,   295 }, {  4, 10,   201 }, {  7, 10,  1744 }, {  8, 10,   602 },
+  { 11, 10,   247 }, { 11, 10,   826 }, { 17, 10,    65 }, { 10, 11,   558 },
+  { 11,  0,   551 }, { 14,  0,   159 }, {  8, 10,   164 }, { 18, 10,    62 },
+  { 11, 11,   176 }, {  4,  0,   168 }, {  8,  0,  1010 }, {  6,  0,  1994 },
+  {  7,  0,    91 }, { 10,  0,   532 }, {  7, 10,  1243 }, {  7,  0,  1884 },
+  {  4, 10,   907 }, {  5, 10,   100 }, { 10, 10,   329 }, { 12, 10,   416 },
+  { 21, 10,    29 }, {  6, 11,   447 }, {  4, 10,   176 }, {  5, 10,   636 },
+  {  5, 10,   998 }, {  7, 10,     9 }, {  7, 10,  1508 }, {  8, 10,    26 },
+  {  9, 10,   317 }, {  9, 10,   358 }, { 10, 10,   210 }, { 10, 10,   292 },
+  { 10, 10,   533 }, { 11, 10,   555 }, { 12, 10,   526 }, { 12, 10,   607 },
+  { 13, 10,   263 }, { 13, 10,   459 }, { 14, 10,   271 }, {  4, 11,   609 },
+  {  7, 11,   756 }, {  6,  0,    15 }, {  7,  0,    70 }, { 10,  0,   240 },
+  { 19,  0,    93 }, {  4, 11,   930 }, {  5, 11,   947 }, {  6,  0,  1227 },
+  {  6,  0,  1534 }, {  5, 11,   939 }, {  5, 11,   962 }, {  5, 11,   651 },
+  {  8, 11,   170 }, {  9, 11,    61 }, {  9, 11,    63 }, { 10, 11,    23 },
+  { 10, 11,    37 }, { 10, 11,   834 }, { 11, 11,     4 }, { 11, 11,   187 },
+  { 11, 11,   281 }, { 11, 11,   503 }, { 11, 11,   677 }, { 12, 11,    96 },
+  { 12, 11,   130 }, { 12, 11,   244 }, { 14, 11,     5 }, { 14, 11,    40 },
+  { 14, 11,   162 }, { 14, 11,   202 }, { 18, 11,   133 }, {  4, 11,   406 },
+  {  5, 11,   579 }, { 12, 11,   492 }, { 22, 11,    15 }, { 11,  0,   392 },
+  {  6, 10,   610 }, { 10, 10,   127 }, { 13, 10,    27 }, {  7,  0,   655 },
+  {  7,  0,  1844 }, {  8, 10,   119 }, {  4,  0,   145 }, {  6,  0,   176 },
+  {  7,  0,   395 }, {  9,  0,   562 }, {  4,  0,   501 }, { 12, 11,   145 },
+  {  8,  0,  1019 }, {  6,  0,   509 }, { 11,  0,   267 }, {  6, 11,    17 },
+  {  7, 11,    16 }, {  7, 11,  1001 }, {  7, 11,  1982 }, {  9, 11,   886 },
+  { 10, 11,   489 }, { 10, 11,   800 }, { 11, 11,   782 }, { 12, 11,   320 },
+  { 13, 11,   467 }, { 14, 11,   145 }, { 14, 11,   387 }, { 15, 11,   119 },
+  { 17, 11,    17 }, {  6,  0,  1099 }, {  5, 11,   458 }, {  7, 11,  1983 },
+  {  8, 11,     0 }, {  8, 11,   171 }, {  9, 11,   120 }, {  9, 11,   732 },
+  { 10, 11,   473 }, { 11, 11,   656 }, { 11, 11,   998 }, { 18, 11,     0 },
+  { 18, 11,     2 }, { 19, 11,    21 }, { 12, 11,   427 }, { 18, 11,    38 },
+  { 10,  0,   948 }, { 10,  0,   968 }, {  7, 10,   126 }, {  8, 10,    84 },
+  {  8, 10,   790 }, {  4,  0,   114 }, {  9,  0,   492 }, { 13,  0,   462 },
+  { 14,  0,   215 }, {  6, 10,    64 }, { 12, 10,   377 }, { 13, 10,   309 },
+  {  4,  0,    77 }, {  5,  0,   361 }, {  6,  0,   139 }, {  6,  0,   401 },
+  {  6,  0,   404 }, {  7,  0,   413 }, {  7,  0,   715 }, {  7,  0,  1716 },
+  { 11,  0,   279 }, { 12,  0,   179 }, { 12,  0,   258 }, { 13,  0,   244 },
+  { 14,  0,   358 }, {  6,  0,  1717 }, {  7,  0,   772 }, {  7,  0,  1061 },
+  {  7,  0,  1647 }, {  8,  0,    82 }, { 11,  0,   250 }, { 11,  0,   607 },
+  { 12,  0,   311 }, { 12,  0,   420 }, { 13,  0,   184 }, { 13,  0,   367 },
+  {  7, 10,  1104 }, { 11, 10,   269 }, { 11, 10,   539 }, { 11, 10,   627 },
+  { 11, 10,   706 }, { 11, 10,   975 }, { 12, 10,   248 }, { 12, 10,   434 },
+  { 12, 10,   600 }, { 12, 10,   622 }, { 13, 10,   297 }, { 13, 10,   485 },
+  { 14, 10,    69 }, { 14, 10,   409 }, { 15, 10,   108 }, {  7,  0,   724 },
+  {  4, 11,   512 }, {  4, 11,   519 }, {  5, 11,   342 }, {  6,  0,  1133 },
+  { 17, 11,    29 }, { 11, 10,   977 }, { 13, 10,   507 }, {  6,  0,   841 },
+  {  6,  0,  1042 }, {  6,  0,  1194 }, { 10,  0,   993 }, { 12,  0,  1021 },
+  {  6, 11,    31 }, {  7, 11,   491 }, {  7, 11,   530 }, {  8, 11,   592 },
+  {  9, 10,    34 }, { 11, 11,    53 }, { 11, 10,   484 }, { 11, 11,   779 },
+  { 12, 11,   167 }, { 12, 11,   411 }, { 14, 11,    14 }, { 14, 11,   136 },
+  { 15, 11,    72 }, { 16, 11,    17 }, { 16, 11,    72 }, {  4,  0,  1021 },
+  {  6,  0,  2037 }, {  5, 11,   907 }, {  7,  0,   373 }, {  8,  0,   335 },
+  {  8,  0,   596 }, {  9,  0,   488 }, {  6, 10,  1700 }, {  7, 10,   293 },
+  {  7, 10,   382 }, {  7, 10,  1026 }, {  7, 10,  1087 }, {  7, 10,  2027 },
+  {  8, 10,   252 }, {  8, 10,   727 }, {  8, 10,   729 }, {  9, 10,    30 },
+  {  9, 10,   199 }, {  9, 10,   231 }, {  9, 10,   251 }, {  9, 10,   334 },
+  {  9, 10,   361 }, {  9, 10,   712 }, { 10, 10,    55 }, { 10, 10,    60 },
+  { 10, 10,   232 }, { 10, 10,   332 }, { 10, 10,   384 }, { 10, 10,   396 },
+  { 10, 10,   504 }, { 10, 10,   542 }, { 10, 10,   652 }, { 11, 10,    20 },
+  { 11, 10,    48 }, { 11, 10,   207 }, { 11, 10,   291 }, { 11, 10,   298 },
+  { 11, 10,   342 }, { 11, 10,   365 }, { 11, 10,   394 }, { 11, 10,   620 },
+  { 11, 10,   705 }, { 11, 10,  1017 }, { 12, 10,   123 }, { 12, 10,   340 },
+  { 12, 10,   406 }, { 12, 10,   643 }, { 13, 10,    61 }, { 13, 10,   269 },
+  { 13, 10,   311 }, { 13, 10,   319 }, { 13, 10,   486 }, { 14, 10,   234 },
+  { 15, 10,    62 }, { 15, 10,    85 }, { 16, 10,    71 }, { 18, 10,   119 },
+  { 20, 10,   105 }, { 22,  0,    37 }, {  4, 11,   208 }, {  5, 11,   106 },
+  {  6, 11,   531 }, {  8, 11,   408 }, {  9, 11,   188 }, { 10, 11,   572 },
+  {  4,  0,   564 }, {  6,  0,   513 }, {  7,  0,  1052 }, {  4,  0,   825 },
+  {  9,  0,   899 }, { 12, 11,   441 }, {  6,  0,   778 }, {  5, 11,   379 },
+  {  7,  0,  1417 }, { 12,  0,   382 }, { 17,  0,    48 }, { 24,  0,    12 },
+  {  4, 11,   241 }, {  7,  0,  1116 }, {  6, 10,   379 }, {  7, 10,   270 },
+  {  8, 10,   176 }, {  8, 10,   183 }, {  9, 10,   432 }, {  9, 10,   661 },
+  { 12, 10,   247 }, { 12, 10,   617 }, { 18, 10,   125 }, {  5, 10,   792 },
+  {  5, 10,   900 }, {  6,  0,   545 }, {  7,  0,   565 }, {  7,  0,  1669 },
+  { 10,  0,   114 }, { 11,  0,   642 }, { 12,  0,   618 }, {  5,  0,     5 },
+  { 10, 11,     7 }, {  4, 11,   259 }, {  7,  0,   192 }, {  6,  0,   701 },
+  {  8,  0,   763 }, {  7, 10,  1979 }, {  4, 10,   901 }, {  5, 10,   776 },
+  { 10,  0,   755 }, { 19,  0,    29 }, {  5,  0,   759 }, {  4, 11,   173 },
+  {  5, 11,   312 }, {  5, 11,   512 }, {  7, 11,  1285 }, {  7, 11,  1603 },
+  {  7, 11,  1691 }, {  9, 11,   464 }, { 11, 11,   195 }, { 12, 11,   279 },
+  { 12, 11,   448 }, { 14, 11,    11 }, { 19, 11,   102 }, {  7,  0,   370 },
+  {  7,  0,  1007 }, {  7,  0,  1177 }, {  7,  0,  1565 }, {  7,  0,  1237 },
+  {  4,  0,    87 }, {  5,  0,   250 }, { 13,  0,   298 }, {  4, 11,   452 },
+  {  5, 11,   583 }, {  5, 11,   817 }, {  6, 11,   433 }, {  7, 11,   593 },
+  {  7, 11,   720 }, {  7, 11,  1378 }, {  8, 11,   161 }, {  9, 11,   284 },
+  { 10, 11,   313 }, { 11, 11,   886 }, {  4, 11,   547 }, {  7, 11,  1409 },
+  {  8, 11,   722 }, {  4, 10,    37 }, {  5, 10,   334 }, {  7, 10,  1253 },
+  {  4, 10,   508 }, { 12,  0,   107 }, { 18,  0,    31 }, {  8, 11,   420 },
+  { 11, 11,   193 }, {  7,  0,   814 }, {  7, 11,   409 }, { 12,  0,   991 },
+  {  4,  0,    57 }, {  7,  0,  1195 }, {  7,  0,  1438 }, {  7,  0,  1548 },
+  {  7,  0,  1835 }, {  7,  0,  1904 }, {  9,  0,   757 }, { 10,  0,   604 },
+  { 11,  0,   519 }, {  4,  0,   540 }, { 10, 11,   308 }, {  4, 10,   533 },
+  {  8,  0,   608 }, { 16, 11,    65 }, {  4,  0,  1014 }, {  6,  0,  2029 },
+  {  4,  0,   209 }, {  7,  0,   902 }, {  5, 11,  1002 }, {  8, 11,   745 },
+  {  6,  0,  2030 }, {  6,  0,   303 }, {  7,  0,   335 }, {  7,  0,  1437 },
+  {  7,  0,  1668 }, {  8,  0,   553 }, {  8,  0,   652 }, {  8,  0,   656 },
+  {  9,  0,   558 }, { 11,  0,   743 }, { 21,  0,    18 }, {  5, 11,   575 },
+  {  6, 11,   354 }, {  7, 11,   701 }, {  4, 11,   239 }, {  6, 11,   477 },
+  {  7, 11,  1607 }, { 11, 11,    68 }, { 11, 11,   617 }, {  4,  0,   559 },
+  {  8,  0,   527 }, { 18,  0,    60 }, { 19,  0,    24 }, {  5, 10,   920 },
+  { 10,  0,   511 }, {  5,  0,  1017 }, {  5,  0,   675 }, { 10, 10,   391 },
+  { 11,  0,   156 }, {  7, 10,  1952 }, { 10, 11,   369 }, {  4, 11,   367 },
+  {  5,  0,   709 }, {  6,  0,   698 }, {  6,  0,   887 }, { 14, 10,   126 },
+  {  6,  0,  1745 }, {  4, 10,   483 }, { 13, 11,   299 }, { 14, 11,    75 },
+  {  5,  0,   714 }, {  7,  0,     8 }, {  8,  0,   206 }, { 10, 10,   480 },
+  {  4, 11,   694 }, {  9, 10,   495 }, { 18, 10,   104 }, {  7, 11,  1248 },
+  { 11, 11,   621 }, { 11, 11,   702 }, { 12, 11,   687 }, {  4,  0,   776 },
+  { 11, 10,  1009 }, {  7,  0,  1272 }, {  6,  0,  1059 }, {  8, 10,   653 },
+  { 13, 10,    93 }, { 19, 10,    14 }, {  7, 11,   213 }, {  8,  0,   406 },
+  {  5, 10,   172 }, {  4,  0,   947 }, {  8,  0,   175 }, { 10,  0,   168 },
+  { 10,  0,   573 }, {  4,  0,   870 }, {  6,  0,  1567 }, { 23, 11,    28 },
+  {  6, 11,   472 }, {  5, 10,   260 }, {  8, 11,   132 }, {  4, 11,   751 },
+  { 11, 11,   390 }, { 12, 11,    32 }, {  4, 11,   409 }, {  5, 11,    78 },
+  { 12,  0,   554 }, {  6, 11,   473 }, { 17, 11,   105 }, {  5,  0,   784 },
+  {  8,  0,   908 }, {  8, 11,   306 }, { 11,  0,   882 }, {  6,  0,   358 },
+  {  7,  0,  1393 }, {  8,  0,   396 }, { 10,  0,   263 }, { 14,  0,   154 },
+  { 16,  0,    48 }, { 17,  0,     8 }, {  7, 11,  1759 }, {  8, 11,   396 },
+  { 10, 11,   263 }, { 14, 11,   154 }, { 16, 11,    48 }, { 17, 11,     8 },
+  { 13, 11,   163 }, { 13, 11,   180 }, { 18, 11,    78 }, { 20, 11,    35 },
+  { 14,  0,    32 }, { 18,  0,    85 }, { 20,  0,     2 }, { 24,  0,    16 },
+  {  7,  0,   228 }, { 10,  0,   770 }, {  8, 10,   167 }, {  8, 10,   375 },
+  {  9, 10,    82 }, {  9, 10,   561 }, { 10, 10,   620 }, {  4,  0,   845 },
+  {  9,  0,    14 }, {  9,  0,   441 }, { 10,  0,   306 }, { 11,  0,     9 },
+  { 11,  0,   966 }, { 12,  0,   287 }, { 13,  0,   342 }, { 13,  0,   402 },
+  { 15,  0,   110 }, { 15,  0,   163 }, {  8, 10,   194 }, {  8, 10,   756 },
+  {  6,  0,  1578 }, {  4,  0,   967 }, {  6,  0,  1820 }, {  6,  0,  1847 },
+  { 12,  0,   716 }, {  8,  0,   594 }, {  7,  0,  1428 }, {  7,  0,  1640 },
+  {  7,  0,  1867 }, {  9,  0,   169 }, {  9,  0,   182 }, {  9,  0,   367 },
+  {  9,  0,   478 }, {  9,  0,   506 }, {  9,  0,   551 }, {  9,  0,   557 },
+  {  9,  0,   648 }, {  9,  0,   697 }, {  9,  0,   705 }, {  9,  0,   725 },
+  {  9,  0,   787 }, {  9,  0,   794 }, { 10,  0,   198 }, { 10,  0,   214 },
+  { 10,  0,   267 }, { 10,  0,   275 }, { 10,  0,   456 }, { 10,  0,   551 },
+  { 10,  0,   561 }, { 10,  0,   613 }, { 10,  0,   627 }, { 10,  0,   668 },
+  { 10,  0,   675 }, { 10,  0,   691 }, { 10,  0,   695 }, { 10,  0,   707 },
+  { 10,  0,   715 }, { 11,  0,   183 }, { 11,  0,   201 }, { 11,  0,   244 },
+  { 11,  0,   262 }, { 11,  0,   352 }, { 11,  0,   439 }, { 11,  0,   493 },
+  { 11,  0,   572 }, { 11,  0,   591 }, { 11,  0,   608 }, { 11,  0,   611 },
+  { 11,  0,   646 }, { 11,  0,   674 }, { 11,  0,   711 }, { 11,  0,   751 },
+  { 11,  0,   761 }, { 11,  0,   776 }, { 11,  0,   785 }, { 11,  0,   850 },
+  { 11,  0,   853 }, { 11,  0,   862 }, { 11,  0,   865 }, { 11,  0,   868 },
+  { 11,  0,   875 }, { 11,  0,   898 }, { 11,  0,   902 }, { 11,  0,   903 },
+  { 11,  0,   910 }, { 11,  0,   932 }, { 11,  0,   942 }, { 11,  0,   957 },
+  { 11,  0,   967 }, { 11,  0,   972 }, { 12,  0,   148 }, { 12,  0,   195 },
+  { 12,  0,   220 }, { 12,  0,   237 }, { 12,  0,   318 }, { 12,  0,   339 },
+  { 12,  0,   393 }, { 12,  0,   445 }, { 12,  0,   450 }, { 12,  0,   474 },
+  { 12,  0,   505 }, { 12,  0,   509 }, { 12,  0,   533 }, { 12,  0,   591 },
+  { 12,  0,   594 }, { 12,  0,   597 }, { 12,  0,   621 }, { 12,  0,   633 },
+  { 12,  0,   642 }, { 13,  0,    59 }, { 13,  0,    60 }, { 13,  0,   145 },
+  { 13,  0,   239 }, { 13,  0,   250 }, { 13,  0,   329 }, { 13,  0,   344 },
+  { 13,  0,   365 }, { 13,  0,   372 }, { 13,  0,   387 }, { 13,  0,   403 },
+  { 13,  0,   414 }, { 13,  0,   456 }, { 13,  0,   470 }, { 13,  0,   478 },
+  { 13,  0,   483 }, { 13,  0,   489 }, { 14,  0,    55 }, { 14,  0,    57 },
+  { 14,  0,    81 }, { 14,  0,    90 }, { 14,  0,   148 }, { 14,  0,   239 },
+  { 14,  0,   266 }, { 14,  0,   321 }, { 14,  0,   326 }, { 14,  0,   327 },
+  { 14,  0,   330 }, { 14,  0,   347 }, { 14,  0,   355 }, { 14,  0,   401 },
+  { 14,  0,   404 }, { 14,  0,   411 }, { 14,  0,   414 }, { 14,  0,   416 },
+  { 14,  0,   420 }, { 15,  0,    61 }, { 15,  0,    74 }, { 15,  0,    87 },
+  { 15,  0,    88 }, { 15,  0,    94 }, { 15,  0,    96 }, { 15,  0,   116 },
+  { 15,  0,   149 }, { 15,  0,   154 }, { 16,  0,    50 }, { 16,  0,    63 },
+  { 16,  0,    73 }, { 17,  0,     2 }, { 17,  0,    66 }, { 17,  0,    92 },
+  { 17,  0,   103 }, { 17,  0,   112 }, { 17,  0,   120 }, { 18,  0,    50 },
+  { 18,  0,    54 }, { 18,  0,    82 }, { 18,  0,    86 }, { 18,  0,    90 },
+  { 18,  0,   111 }, { 18,  0,   115 }, { 18,  0,   156 }, { 19,  0,    40 },
+  { 19,  0,    79 }, { 20,  0,    78 }, { 21,  0,    22 }, {  7, 11,   883 },
+  {  5,  0,   161 }, {  7,  0,   839 }, {  4,  0,   782 }, { 13, 11,   293 },
+  { 14, 11,    56 }, {  5, 11,   617 }, { 11, 11,    50 }, {  7, 10,    22 },
+  { 17,  0,    64 }, {  5, 10,   639 }, {  7, 10,  1249 }, { 11, 10,   896 },
+  { 10,  0,   998 }, {  7, 11,  2042 }, {  4, 11,   546 }, { 14, 11,   233 },
+  {  6,  0,  1043 }, {  6,  0,  1574 }, {  6,  0,  1496 }, {  4, 10,   102 },
+  {  7, 10,   815 }, {  7, 10,  1699 }, { 11, 10,   964 }, { 12,  0,   781 },
+  { 14,  0,   461 }, {  4, 11,   313 }, {  5, 11,   577 }, {  6,  0,   639 },
+  {  6,  0,  1114 }, {  9,  0,   817 }, {  8, 11,   184 }, { 13, 11,   433 },
+  {  7,  0,  1814 }, {  7, 11,   935 }, { 10,  0,   997 }, { 12,  0,   958 },
+  {  4,  0,   812 }, {  9, 11,   625 }, {  4, 10,   899 }, {  8, 10,   795 },
+  {  5, 11,   886 }, {  6, 11,    46 }, {  6, 11,  1790 }, {  7, 11,    14 },
+  {  7, 11,   732 }, {  7, 11,  1654 }, {  8, 11,    95 }, {  8, 11,   327 },
+  {  8, 11,   616 }, { 10, 11,   598 }, { 10, 11,   769 }, { 11, 11,   134 },
+  { 11, 11,   747 }, { 12, 11,   378 }, { 14, 11,    97 }, {  8,  0,   139 },
+  {  6, 10,    52 }, {  9, 10,   104 }, {  9, 10,   559 }, { 12, 10,   308 },
+  { 19, 10,    87 }, {  5, 11,  1021 }, {  4, 10,   604 }, {  4, 10,   301 },
+  {  8, 10,   779 }, {  7,  0,   643 }, {  8,  0,   236 }, {  4, 11,   153 },
+  {  6,  0,  1172 }, { 19, 10,    32 }, {  5, 11,   798 }, {  6,  0,  1338 },
+  {  4, 11,   587 }, {  6, 11,   598 }, {  7, 11,    42 }, {  8, 11,   695 },
+  { 10, 11,   212 }, { 11, 11,   158 }, { 14, 11,   196 }, { 17, 11,    85 },
+  {  7, 10,   508 }, {  5, 11,   957 }, {  5, 11,  1008 }, {  7, 11,   249 },
+  {  4, 11,   129 }, {  7, 11,   465 }, {  5,  0,    54 }, {  7, 11,   470 },
+  {  7, 11,  1057 }, {  7, 11,  1201 }, {  9, 11,   755 }, { 11, 11,   906 },
+  { 12, 11,   527 }, {  7, 11,   908 }, { 18, 11,     7 }, {  5, 11,   148 },
+  {  8, 11,   450 }, { 16, 11,     1 }, {  4,  0,   256 }, {  7,  0,  1488 },
+  {  9,  0,   351 }, {  6, 10,   310 }, {  7, 10,  1849 }, {  8, 10,    72 },
+  {  8, 10,   272 }, {  8, 10,   431 }, {  9, 10,    12 }, { 10, 10,   563 },
+  { 10, 10,   630 }, { 10, 10,   796 }, { 10, 10,   810 }, { 11, 10,   367 },
+  { 11, 10,   599 }, { 11, 10,   686 }, { 12, 10,   672 }, {  6,  0,  1885 },
+  {  6,  0,  1898 }, {  6,  0,  1899 }, { 12,  0,   955 }, {  4,  0,   714 },
+  {  5,  0,   469 }, {  6,  0,  1270 }, {  6,  0,  1456 }, {  4,  0,   744 },
+  {  6,  0,   313 }, {  7, 10,   537 }, {  8, 10,    64 }, {  9, 10,   127 },
+  { 10, 10,   496 }, { 12, 10,   510 }, { 13, 10,   384 }, {  4, 11,   217 },
+  {  4, 10,   244 }, {  5, 11,   710 }, {  7, 10,   233 }, {  7, 11,  1926 },
+  {  9, 11,   428 }, {  9, 11,   708 }, { 10, 11,   254 }, { 10, 11,   296 },
+  { 10, 11,   720 }, { 11, 11,   109 }, { 11, 11,   255 }, { 12, 11,   165 },
+  { 12, 11,   315 }, { 13, 11,   107 }, { 13, 11,   203 }, { 14, 11,    54 },
+  { 14, 11,    99 }, { 14, 11,   114 }, { 14, 11,   388 }, { 16, 11,    85 },
+  { 17, 11,     9 }, { 17, 11,    33 }, { 20, 11,    25 }, { 20, 11,    28 },
+  { 20, 11,    29 }, { 21, 11,     9 }, { 21, 11,    10 }, { 21, 11,    34 },
+  { 22, 11,    17 }, { 10,  0,   402 }, {  7,  0,   969 }, { 18,  0,    55 },
+  {  8,  0,    50 }, {  9,  0,   624 }, {  6,  0,  1355 }, {  4,  0,   572 },
+  {  6, 10,  1650 }, { 10, 10,   702 }, { 11, 10,   245 }, { 10,  0,   847 },
+  { 14,  0,   445 }, {  6,  0,    43 }, {  7,  0,    38 }, {  8,  0,   248 },
+  { 10,  0,   513 }, {  5,  0,   369 }, {  9, 10,   338 }, {  5,  0,   766 },
+  {  5,  0,   363 }, {  5, 10,   896 }, {  8, 11,   392 }, { 11, 11,    54 },
+  { 13, 11,   173 }, { 13, 11,   294 }, { 20, 11,     7 }, {  6,  0,   678 },
+  {  7, 11,  1230 }, {  8, 11,   531 }, {  6,  0,   258 }, { 12,  0,   409 },
+  {  5,  0,   249 }, { 20,  0,    82 }, {  7, 10,  1117 }, {  8, 10,   539 },
+  {  5,  0,   393 }, {  6,  0,   378 }, {  7,  0,  1981 }, {  9,  0,    32 },
+  {  9,  0,   591 }, { 10,  0,   685 }, { 10,  0,   741 }, { 14,  0,   382 },
+  {  5,  0,   788 }, {  6,  0,  1281 }, {  6,  0,  1295 }, {  7,  0,  1968 },
+  { 13,  0,   509 }, {  4,  0,    61 }, {  5,  0,    58 }, {  5,  0,   171 },
+  {  5,  0,   683 }, {  6,  0,   291 }, {  6,  0,   566 }, {  7,  0,  1650 },
+  { 11,  0,   523 }, { 12,  0,   273 }, { 12,  0,   303 }, { 15,  0,    39 },
+  { 15,  0,   111 }, {  6,  0,   706 }, {  6,  0,  1283 }, {  6,  0,   589 },
+  {  7, 11,  1433 }, {  5, 11,   435 }, {  7,  0,  1059 }, { 13,  0,    54 },
+  {  5, 10,     4 }, {  5, 10,   810 }, {  6, 10,    13 }, {  6, 10,   538 },
+  {  6, 10,  1690 }, {  6, 10,  1726 }, {  7, 10,  1819 }, {  8, 10,   148 },
+  {  8, 10,   696 }, {  8, 10,   791 }, { 12, 10,   125 }, { 15, 10,     9 },
+  {  7, 10,  1268 }, {  5, 11,    85 }, {  6, 11,   419 }, {  7, 11,   134 },
+  {  7, 11,   305 }, {  7, 11,   361 }, {  7, 11,  1337 }, {  8, 11,    71 },
+  { 12, 11,   519 }, {  9,  0,   824 }, { 12, 11,   688 }, {  5, 11,   691 },
+  {  7, 11,   345 }, {  7, 10,  1385 }, {  9, 11,    94 }, { 11, 10,   582 },
+  { 11, 10,   650 }, { 11, 10,   901 }, { 11, 10,   949 }, { 12, 11,   169 },
+  { 12, 10,   232 }, { 12, 10,   236 }, { 13, 10,   413 }, { 13, 10,   501 },
+  { 18, 10,   116 }, {  4,  0,   917 }, {  5,  0,  1005 }, {  7,  0,  1598 },
+  {  5, 11,   183 }, {  6, 11,   582 }, {  9, 11,   344 }, { 10, 11,   679 },
+  { 12, 11,   435 }, {  4, 10,   925 }, {  5, 10,   803 }, {  8, 10,   698 },
+  { 10, 10,   828 }, {  4,  0,   919 }, {  7, 11,   511 }, { 11, 10,   992 },
+  {  4,  0,   255 }, {  5,  0,   302 }, {  6,  0,   132 }, {  7,  0,   128 },
+  {  7,  0,   283 }, {  7,  0,  1299 }, { 10,  0,    52 }, { 10,  0,   514 },
+  { 11,  0,   925 }, { 13,  0,    92 }, { 14,  0,   309 }, {  6,  0,  1369 },
+  {  7, 10,  1847 }, {  6,  0,   328 }, {  7, 11,  1993 }, {  8, 11,   684 },
+  {  5, 10,   383 }, {  9,  0,   173 }, {  6, 11,   583 }, {  6,  0,  1411 },
+  { 19,  0,    65 }, {  5, 11,   704 }, {  8, 11,   357 }, { 10, 11,   745 },
+  { 14, 11,   426 }, { 17, 11,    94 }, { 19, 11,    57 }, {  9, 10,   660 },
+  { 10, 10,   347 }, {  4, 11,   179 }, {  5, 11,   198 }, {  5, 11,   697 },
+  {  7, 11,   347 }, {  7, 11,   971 }, {  8, 11,   181 }, { 10, 11,   711 },
+  { 13,  0,   442 }, { 11,  0,   842 }, { 11,  0,   924 }, { 13,  0,   317 },
+  { 13,  0,   370 }, { 13,  0,   469 }, { 13,  0,   471 }, { 14,  0,   397 },
+  { 18,  0,    69 }, { 18,  0,   145 }, {  7, 10,   572 }, {  9, 10,   592 },
+  { 11, 10,   680 }, { 12, 10,   356 }, { 12, 10,   550 }, { 14, 11,    19 },
+  { 14, 11,    28 }, { 16, 11,    29 }, {  8,  0,   534 }, {  4, 11,   243 },
+  {  5, 11,   203 }, {  7, 11,    19 }, {  7, 11,    71 }, {  7, 11,   113 },
+  { 10, 11,   405 }, { 11, 11,   357 }, { 14, 11,   240 }, {  6,  0,   210 },
+  { 10,  0,   845 }, { 10,  0,   862 }, {  7, 11,  1351 }, {  9, 11,   581 },
+  { 10, 11,   639 }, { 11, 11,   453 }, { 12, 11,   584 }, {  7, 11,  1450 },
+  { 11, 11,    99 }, { 10,  0,   892 }, { 12,  0,   719 }, { 16,  0,   105 },
+  {  4,  0,   284 }, {  6,  0,   223 }, {  6, 11,   492 }, {  5, 11,   134 },
+  {  6, 11,   408 }, {  6, 11,   495 }, {  7, 11,  1593 }, {  8,  0,   529 },
+  {  9,  0,   807 }, {  4,  0,   218 }, {  7,  0,   526 }, { 15,  0,   137 },
+  {  6,  0,  1444 }, { 14, 11,     4 }, {  4, 11,   665 }, {  4,  0,   270 },
+  {  5,  0,   192 }, {  6,  0,   332 }, {  7,  0,  1322 }, {  4, 11,   248 },
+  {  7, 11,   137 }, {  9, 11,   349 }, { 12,  0,   661 }, {  7,  0,  1517 },
+  { 11,  0,   597 }, { 14,  0,    76 }, { 14,  0,   335 }, { 20,  0,    33 },
+  {  7, 10,   748 }, { 11, 10,   700 }, {  5, 11,   371 }, {  7, 11,   563 },
+  { 18, 11,    57 }, {  5, 10,   127 }, {  5,  0,   418 }, {  4, 11,   374 },
+  {  7, 11,   547 }, {  7, 11,  1700 }, {  7, 11,  1833 }, { 11, 11,   858 },
+  {  6, 10,   198 }, { 12, 10,    83 }, {  7, 11,  1812 }, { 13, 11,   259 },
+  { 13, 11,   356 }, { 14, 11,   242 }, { 19, 11,   114 }, {  7,  0,   379 },
+  {  8,  0,   481 }, {  9,  0,   377 }, {  5, 10,   276 }, {  6, 10,    55 },
+  {  7, 10,  1369 }, { 10, 11,   286 }, {  5,  0,  1003 }, {  6,  0,   149 },
+  {  6, 10,  1752 }, {  8, 10,   726 }, {  8,  0,   262 }, {  9,  0,   627 },
+  { 10,  0,    18 }, { 11,  0,   214 }, { 11,  0,   404 }, { 11,  0,   457 },
+  { 11,  0,   780 }, { 11,  0,   913 }, { 13,  0,   401 }, { 14,  0,   200 },
+  {  6, 11,  1647 }, {  7, 11,  1552 }, {  7, 11,  2010 }, {  9, 11,   494 },
+  {  9, 11,   509 }, {  7,  0,   742 }, {  8,  0,   304 }, {  4,  0,   142 },
+  {  5, 10,   764 }, {  6, 10,   309 }, {  7, 10,   331 }, { 10, 10,   550 },
+  {  7, 10,  1062 }, {  6, 11,   123 }, {  7, 11,   214 }, {  7, 10,   986 },
+  {  9, 11,   728 }, { 10, 11,   157 }, { 11, 11,   346 }, { 11, 11,   662 },
+  { 15, 11,   106 }, {  7, 10,  1573 }, {  7,  0,   925 }, {  9,  0,   799 },
+  {  4,  0,   471 }, {  5,  0,    51 }, {  6,  0,   602 }, {  8,  0,   484 },
+  { 10,  0,   195 }, {  8,  0,   688 }, {  4,  0,   697 }, {  6,  0,  1169 },
+  {  6,  0,  1241 }, {  6, 10,   194 }, {  7, 10,   133 }, { 10, 10,   493 },
+  { 10, 10,   570 }, { 11, 10,   664 }, { 12,  0,   751 }, {  7,  0,   929 },
+  { 10,  0,   452 }, { 11,  0,   878 }, { 16,  0,    33 }, {  5, 10,    24 },
+  {  5, 10,   569 }, {  6, 10,     3 }, {  6, 10,   119 }, {  6, 10,   143 },
+  {  6, 10,   440 }, {  7, 10,   599 }, {  7, 10,  1686 }, {  7, 10,  1854 },
+  {  8, 10,   424 }, {  9, 10,    43 }, {  9, 10,   584 }, {  9, 10,   760 },
+  { 10, 10,   328 }, { 11, 10,   159 }, { 11, 10,   253 }, { 12, 10,   487 },
+  { 12, 10,   531 }, {  4, 11,   707 }, { 13, 11,   106 }, { 18, 11,    49 },
+  { 19, 11,    41 }, {  5,  0,   221 }, {  5, 11,   588 }, {  6, 11,   393 },
+  {  6,  0,  1437 }, {  6, 11,   211 }, {  7, 11,  1690 }, { 11, 11,   486 },
+  { 12, 11,   369 }, {  5, 10,    14 }, {  5, 10,   892 }, {  6, 10,   283 },
+  {  7, 10,   234 }, {  8, 10,   537 }, {  4,  0,   988 }, {  8,  0,   955 },
+  {  7,  0,  1251 }, {  4, 10,   126 }, {  8, 10,   635 }, { 19, 10,    34 },
+  {  4, 10,   316 }, {  7, 10,  1561 }, {  9, 10,   861 }, {  4, 10,    64 },
+  {  5, 10,   352 }, {  5, 10,   720 }, {  6, 10,   368 }, { 11, 10,   359 },
+  {  6,  0,   192 }, {  4,  0,   132 }, {  5,  0,    69 }, {  7,  0,  1242 },
+  {  7, 10,  1577 }, { 10, 10,   304 }, { 10, 10,   549 }, { 12, 10,   365 },
+  { 13, 10,   220 }, { 13, 10,   240 }, { 14, 10,    33 }, {  4,  0,   111 },
+  {  7,  0,   865 }, {  6, 11,   219 }, {  5, 11,   582 }, {  6, 11,  1646 },
+  {  7, 11,    99 }, {  7, 11,  1962 }, {  7, 11,  1986 }, {  8, 11,   515 },
+  {  8, 11,   773 }, {  9, 11,    23 }, {  9, 11,   491 }, { 12, 11,   620 },
+  { 14, 11,    52 }, { 17, 11,    50 }, {  4,  0,   767 }, {  7, 11,   568 },
+  { 20, 11,    21 }, {  6,  0,    42 }, {  7,  0,  1416 }, {  7,  0,  2005 },
+  {  8,  0,   131 }, {  8,  0,   466 }, {  9,  0,   672 }, { 13,  0,   252 },
+  { 20,  0,   103 }, {  5, 11,   851 }, {  7,  0,  1050 }, {  6, 10,   175 },
+  {  9, 10,   289 }, {  5, 10,   432 }, {  5, 10,   913 }, {  6,  0,    44 },
+  {  8,  0,   368 }, {  7, 11,   784 }, {  4,  0,   570 }, {  5,  0,   120 },
+  { 11, 10,   595 }, { 12,  0,    29 }, {  6,  0,   227 }, {  7,  0,  1589 },
+  {  4, 11,    98 }, {  7, 11,  1365 }, {  9, 11,   422 }, {  9, 11,   670 },
+  { 10, 11,   775 }, { 11, 11,   210 }, { 13, 11,    26 }, { 13, 11,   457 },
+  { 13, 11,   476 }, { 12, 10,    80 }, {  5, 10,   931 }, {  6, 10,  1698 },
+  {  5,  0,   522 }, {  6,  0,  1120 }, {  7,  0,  1529 }, { 12,  0,   739 },
+  { 14,  0,   448 }, { 14,  0,   467 }, { 11, 10,   526 }, { 11, 10,   939 },
+  { 13, 10,   290 }, {  5, 10,   774 }, {  6, 10,  1637 }, {  6, 10,  1686 },
+  {  6, 10,  1751 }, {  6,  0,  1667 }, {  7,  0,  2036 }, {  7, 10,  1167 },
+  { 11, 10,   934 }, { 13, 10,   391 }, { 17, 10,    76 }, {  9, 11,   147 },
+  {  6, 10,   260 }, {  7, 10,  1484 }, { 11, 11,   821 }, { 12, 11,   110 },
+  { 12, 11,   153 }, { 18, 11,    41 }, { 22, 11,    19 }, {  6,  0,   511 },
+  { 12,  0,   132 }, {  6, 10,   573 }, {  5,  0,   568 }, {  6,  0,   138 },
+  {  7,  0,  1293 }, {  4,  0,  1020 }, {  8,  0,   258 }, {  9,  0,   208 },
+  {  9,  0,   359 }, {  4,  0,   565 }, {  8,  0,    23 }, {  8,  0,   827 },
+  {  6,  0,   344 }, {  4,  0,   922 }, {  5,  0,  1023 }, { 13, 11,   477 },
+  { 14, 11,   120 }, { 20, 11,    61 }, {  6,  0,   240 }, {  5, 11,   209 },
+  {  6, 11,    30 }, { 11, 11,    56 }, { 11, 11,   305 }, {  6,  0,   171 },
+  {  7,  0,  1002 }, {  7,  0,  1324 }, {  9,  0,   415 }, { 14,  0,   230 },
+  { 18,  0,    68 }, {  4, 10,   292 }, {  4, 10,   736 }, {  5, 10,   871 },
+  {  6, 10,  1689 }, {  7, 10,  1944 }, {  9, 10,   580 }, {  9, 11,   635 },
+  { 11, 11,   559 }, {  4, 11,   150 }, {  5, 11,   303 }, {  6, 11,   327 },
+  {  6, 10,    63 }, {  7, 10,   920 }, {  5, 10,   793 }, {  8, 11,   192 },
+  { 10, 11,    78 }, { 10, 11,   555 }, { 11, 11,   308 }, { 13, 11,   359 },
+  { 19, 11,    95 }, {  7, 11,   786 }, {  7, 11,  1712 }, {  8,  0,   402 },
+  {  6,  0,   754 }, {  6, 11,  1638 }, {  7, 11,    79 }, {  7, 11,   496 },
+  {  9, 11,   138 }, { 10, 11,   336 }, { 11, 11,    12 }, { 12, 11,   412 },
+  { 12, 11,   440 }, { 14, 11,   305 }, {  4,  0,   716 }, { 13,  0,    31 },
+  {  5,  0,   982 }, {  8,  0,   691 }, {  8,  0,   731 }, {  5, 10,    67 },
+  {  6, 10,    62 }, {  6, 10,   374 }, {  7, 10,  1391 }, {  9, 10,   790 },
+  { 12, 10,    47 }, { 11, 11,   556 }, { 23, 11,     1 }, {  7, 11,   204 },
+  {  7, 11,   415 }, {  8, 11,    42 }, { 10, 11,    85 }, { 11, 11,    33 },
+  { 11, 11,   564 }, { 12, 11,   571 }, { 21, 11,     1 }, {  8,  0,   888 },
+  {  7, 11,   610 }, {  7, 11,  1501 }, {  4, 10,   391 }, {  7, 10,  1169 },
+  {  5,  0,   847 }, {  9,  0,   840 }, { 10,  0,   803 }, {  9,  0,   823 },
+  {  6,  0,   785 }, {  8,  0,   152 }, {  9,  0,    53 }, {  9,  0,   268 },
+  {  9,  0,   901 }, { 10,  0,   518 }, { 10,  0,   829 }, { 11,  0,   188 },
+  { 13,  0,    74 }, { 14,  0,    46 }, { 15,  0,    17 }, { 15,  0,    33 },
+  { 17,  0,    40 }, { 18,  0,    36 }, { 19,  0,    20 }, { 22,  0,     1 },
+  { 24,  0,     2 }, {  4, 11,     3 }, {  5, 11,   247 }, {  5, 11,   644 },
+  {  7, 11,   744 }, {  7, 11,  1207 }, {  7, 11,  1225 }, {  7, 11,  1909 },
+  { 18, 11,   147 }, {  8,  0,   532 }, {  7,  0,   681 }, {  4, 10,   271 },
+  { 12,  0,   314 }, { 12,  0,   677 }, {  4,  0,   684 }, {  8,  0,   384 },
+  {  5, 11,   285 }, {  9, 11,    67 }, { 13, 11,   473 }, { 15, 11,    82 },
+  {  4, 10,   253 }, {  5, 10,   544 }, {  7, 10,   300 }, {  9, 10,   340 },
+  {  7,  0,   110 }, {  7,  0,   447 }, {  8,  0,   290 }, {  8,  0,   591 },
+  {  9,  0,   382 }, {  9,  0,   649 }, { 11,  0,    71 }, { 11,  0,   155 },
+  { 11,  0,   313 }, { 12,  0,     5 }, { 13,  0,   325 }, { 14,  0,   287 },
+  {  6,  0,  1818 }, {  8,  0,  1007 }, { 10,  0,   321 }, {  7,  0,   360 },
+  {  7,  0,   425 }, {  9,  0,    66 }, {  9,  0,   278 }, { 10,  0,   644 },
+  {  5, 10,   818 }, {  5,  0,   385 }, {  5, 10,   541 }, {  6, 10,    94 },
+  {  6, 10,   499 }, {  7, 10,   230 }, { 11, 10,   321 }, {  4, 10,   920 },
+  {  5, 10,    25 }, {  5, 10,   790 }, {  6, 10,   457 }, {  7, 10,   853 },
+  {  8, 10,   788 }, {  4,  0,   900 }, {  5,  0,   861 }, {  5,  0,   254 },
+  {  7,  0,   985 }, {  8,  0,    73 }, {  7,  0,  1959 }, {  8,  0,   683 },
+  {  6, 10,  1765 }, {  5, 10,   822 }, {  4, 10,   634 }, {  4, 11,    29 },
+  {  6, 11,   532 }, {  7, 11,  1628 }, {  7, 11,  1648 }, {  9, 11,   303 },
+  {  9, 11,   350 }, { 10, 11,   433 }, { 11, 11,    97 }, { 11, 11,   557 },
+  { 11, 11,   745 }, { 12, 11,   289 }, { 12, 11,   335 }, { 12, 11,   348 },
+  { 12, 11,   606 }, { 13, 11,   116 }, { 13, 11,   233 }, { 13, 11,   466 },
+  { 14, 11,   181 }, { 14, 11,   209 }, { 14, 11,   232 }, { 14, 11,   236 },
+  { 14, 11,   300 }, { 16, 11,    41 }, { 20, 11,    97 }, { 19,  0,    86 },
+  {  6, 10,    36 }, {  7, 10,   658 }, {  8, 10,   454 }, {  7, 11,  1692 },
+  {  4,  0,   725 }, {  5, 11,   501 }, {  7, 11,  1704 }, {  9, 11,   553 },
+  { 11, 11,   520 }, { 12, 11,   557 }, { 13, 11,   249 }, {  6,  0,   196 },
+  {  5,  0,   831 }, {  8,  0,   723 }, {  7,  0,  1897 }, { 13,  0,    80 },
+  { 13,  0,   437 }, { 17,  0,    74 }, {  4,  0,   992 }, {  6,  0,   627 },
+  {  8,  0,   994 }, {  7, 11,  1294 }, {  4, 10,   104 }, {  5,  0,   848 },
+  {  6,  0,    66 }, {  8,  0,   764 }, {  4,  0,    36 }, {  7,  0,  1387 },
+  { 10,  0,   205 }, { 11,  0,   755 }, {  6,  0,  1046 }, {  6,  0,  1485 },
+  {  6,  0,   950 }, {  4,  0,   887 }, { 14,  0,   450 }, { 20,  0,   111 },
+  {  7,  0,   620 }, {  7,  0,   831 }, {  9, 10,   542 }, {  9, 10,   566 },
+  { 10, 10,   728 }, {  6,  0,   165 }, { 10,  0,   388 }, { 11, 10,   263 },
+  {  4,  0,   719 }, {  7,  0,   155 }, { 10, 10,   468 }, {  6, 11,   453 },
+  { 16, 11,    36 }, {  6, 11,   129 }, {  5,  0,   533 }, {  7,  0,   755 },
+  { 10,  0,   780 }, {  6,  0,  1465 }, {  4,  0,   353 }, {  6,  0,   146 },
+  {  6,  0,  1789 }, {  7,  0,   427 }, {  7,  0,   990 }, {  7,  0,  1348 },
+  {  9,  0,   665 }, {  9,  0,   898 }, { 11,  0,   893 }, { 14,  0,   212 },
+  {  7, 10,    87 }, { 14, 10,   288 }, {  4,  0,    45 }, {  7,  0,  1257 },
+  { 12,  0,     7 }, {  7, 10,   988 }, {  7, 10,  1939 }, {  9, 10,    64 },
+  {  9, 10,   502 }, { 12, 10,    34 }, { 13, 10,    12 }, { 13, 10,   234 },
+  { 19, 10,    77 }, {  4,  0,   607 }, {  5, 11,    60 }, {  6, 11,   504 },
+  {  7, 11,   614 }, {  7, 11,  1155 }, { 12, 11,     0 }, {  7, 10,   141 },
+  {  8, 11,   198 }, { 11, 11,    29 }, { 12, 11,   534 }, { 12,  0,    65 },
+  {  8,  0,   816 }, {  4, 10,   619 }, { 11,  0,    88 }, {  5, 10,   246 },
+  {  8, 10,   189 }, {  9, 10,   355 }, {  9, 10,   512 }, { 10, 10,   124 },
+  { 10, 10,   453 }, { 11, 10,   143 }, { 11, 10,   416 }, { 11, 10,   859 },
+  { 13, 10,   341 }, {  4, 11,   379 }, {  7, 11,  1397 }, {  4,  0,   600 },
+  {  9,  0,   621 }, {  5,  0,   367 }, {  6,  0,   561 }, {  6,  0,   559 },
+  {  6,  0,  1691 }, {  6,  0,   585 }, {  6, 11,   585 }, {  7, 11,  1228 },
+  {  4, 11,   118 }, {  5, 10,   678 }, {  6, 11,   274 }, {  6, 11,   361 },
+  {  7, 11,    75 }, { 13, 11,   441 }, {  7, 11,  1818 }, {  9, 11,   841 },
+  {  5,  0,   573 }, {  6,  0,   287 }, {  7, 10,   862 }, {  7, 10,  1886 },
+  { 10, 10,   179 }, {  4, 10,   517 }, { 12, 11,   693 }, {  5, 11,   314 },
+  {  6, 11,   221 }, {  7, 11,   419 }, { 10, 11,   650 }, { 11, 11,   396 },
+  { 12, 11,   156 }, { 13, 11,   369 }, { 14, 11,   333 }, { 17, 11,    47 },
+  { 12, 10,   540 }, {  8, 10,   667 }, { 11, 10,   403 }, { 18, 10,    83 },
+  {  6,  0,   672 }, {  5, 10,   761 }, {  9,  0,   157 }, { 10, 10,   131 },
+  { 12, 10,    72 }, {  7,  0,   714 }, {  6, 11,   460 }, {  6,  0,   456 },
+  {  5,  0,   925 }, {  5, 11,   682 }, {  7, 11,  1887 }, {  8, 11,   510 },
+  {  8, 11,   475 }, {  5, 11,  1016 }, {  9,  0,    19 }, {  7, 11,   602 },
+  {  8, 11,   179 }, { 10, 11,   781 }, { 12, 11,   126 }, {  6, 11,   329 },
+  { 10, 11,   111 }, {  6,  0,   822 }, {  6,  0,  1473 }, { 16, 11,    86 },
+  { 11,  0,   113 }, { 11, 11,   113 }, {  5, 11,   821 }, {  6, 11,  1687 },
+  {  5, 10,   449 }, {  7,  0,   463 }, { 17,  0,    69 }, {  8, 10,   103 },
+  {  7, 10,  2028 }, { 10, 10,   641 }, {  6,  0,   193 }, {  7,  0,   240 },
+  {  7,  0,  1682 }, { 10,  0,    51 }, { 10,  0,   640 }, { 11,  0,   410 },
+  { 13,  0,    82 }, { 14,  0,   247 }, { 14,  0,   331 }, { 14,  0,   377 },
+  {  6,  0,   471 }, { 11,  0,   411 }, { 14,  0,     2 }, {  5, 11,    71 },
+  {  7, 11,  1407 }, {  9, 11,   388 }, {  9, 11,   704 }, { 10, 11,   261 },
+  { 10, 11,   619 }, { 11, 11,   547 }, { 11, 11,   619 }, { 15, 11,   157 },
+  {  8,  0,   633 }, {  7,  0,  1148 }, {  6,  0,   554 }, {  7,  0,  1392 },
+  { 12,  0,   129 }, {  7, 10,  1274 }, {  7, 10,  1386 }, {  7, 11,  2008 },
+  {  9, 11,   337 }, { 10, 11,   517 }, { 18, 10,    87 }, {  7,  0,   803 },
+  {  8,  0,   542 }, {  6, 10,   187 }, {  7, 10,  1203 }, {  8, 10,   380 },
+  { 14, 10,   117 }, { 21, 10,    28 }, {  6, 10,   297 }, {  7, 10,   793 },
+  { 11, 10,   938 }, {  8,  0,   438 }, { 11,  0,   363 }, {  7, 10,   464 },
+  { 11, 10,   105 }, { 12, 10,   231 }, { 14, 10,   386 }, { 15, 10,   102 },
+  { 20, 10,    75 }, {  5, 11,    16 }, {  6, 11,    86 }, {  6, 11,   603 },
+  {  7, 11,   292 }, {  7, 11,   561 }, {  8, 11,   257 }, {  8, 11,   382 },
+  {  9, 11,   721 }, {  9, 11,   778 }, { 11, 11,   581 }, { 12, 11,   466 },
+  {  6,  0,   717 }, {  4, 11,   486 }, {  5, 11,   491 }, {  4,  0,   875 },
+  {  4, 11,    72 }, {  6, 11,   265 }, {  7, 11,   847 }, {  4,  0,   237 },
+  {  7,  0,   514 }, {  6,  0,   392 }, {  7,  0,    65 }, {  7,  0,  2019 },
+  { 12, 11,   261 }, {  7, 11,   922 }, {  9, 11,   404 }, { 12,  0,   563 },
+  { 14,  0,   101 }, { 18,  0,   129 }, {  7, 10,  1010 }, { 11, 10,   733 },
+  { 11, 10,   759 }, { 13, 10,    34 }, { 18, 10,    45 }, {  7, 10,  1656 },
+  {  9, 10,   369 }, { 10, 10,   338 }, { 10, 10,   490 }, { 11, 10,   154 },
+  { 11, 10,   545 }, { 11, 10,   775 }, { 13, 10,    77 }, { 13, 10,   274 },
+  {  4,  0,   444 }, { 10,  0,   146 }, { 12,  0,     9 }, { 11, 11,   163 },
+  {  7,  0,  1260 }, {  7,  0,  1790 }, {  9,  0,   222 }, { 10,  0,    43 },
+  { 11,  0,   900 }, {  9, 11,   234 }, { 10,  0,   971 }, {  9,  0,   761 },
+  {  6,  0,   699 }, {  8, 11,   434 }, {  6,  0,  1116 }, {  7,  0,  1366 },
+  {  5, 10,    20 }, {  6, 11,   197 }, {  6, 10,   298 }, {  7, 10,   659 },
+  {  8, 11,   205 }, {  9, 10,   219 }, {  4, 11,   490 }, { 11, 11,   820 },
+  { 22, 11,    51 }, {  7, 10,  1440 }, { 11, 10,   854 }, { 11, 10,   872 },
+  { 11, 10,   921 }, { 12, 10,   551 }, { 13, 10,   472 }, { 14, 10,   367 },
+  { 12, 11,    13 }, {  4,  0,   829 }, { 12,  0,   242 }, {  4, 10,   439 },
+  {  8, 10,   669 }, {  6,  0,   593 }, {  6, 11,   452 }, {  7, 11,   312 },
+  { 10, 11,   219 }, {  4, 11,   333 }, {  9, 11,   176 }, { 12, 11,   353 },
+  { 13, 11,   187 }, {  7,  0,    36 }, {  8,  0,   201 }, {  8,  0,   605 },
+  { 12,  0,   224 }, {  4, 10,   233 }, {  6,  0,  1430 }, {  6,  0,  1806 },
+  {  4,  0,   523 }, {  5,  0,   638 }, {  6,  0,  1889 }, {  9,  0,   958 },
+  {  9,  0,   971 }, {  9,  0,   976 }, { 12,  0,   796 }, { 12,  0,   799 },
+  { 12,  0,   808 }, { 12,  0,   835 }, { 12,  0,   836 }, { 12,  0,   914 },
+  { 12,  0,   946 }, { 15,  0,   216 }, { 15,  0,   232 }, { 18,  0,   183 },
+  { 18,  0,   187 }, { 18,  0,   194 }, { 18,  0,   212 }, { 18,  0,   232 },
+  { 21,  0,    49 }, {  4, 10,   482 }, {  6,  0,   827 }, {  6,  0,  1434 },
+  {  7, 10,   346 }, {  6,  0,  2043 }, {  6,  0,   242 }, {  7,  0,   227 },
+  {  7,  0,  1581 }, {  8,  0,   104 }, {  9,  0,   113 }, {  9,  0,   220 },
+  {  9,  0,   427 }, { 10,  0,   136 }, { 10,  0,   239 }, { 11,  0,   579 },
+  { 11,  0,  1023 }, { 13,  0,     4 }, { 13,  0,   204 }, { 13,  0,   316 },
+  { 20,  0,    86 }, {  6, 11,  1685 }, {  7,  0,   148 }, {  8,  0,   284 },
+  { 13,  0,    63 }, { 14,  0,    10 }, {  7, 11,   584 }, {  6,  0,  1249 },
+  {  7,  0,   861 }, {  7, 10,   334 }, {  5, 10,   795 }, {  6, 10,  1741 },
+  {  9, 11,    70 }, {  4,  0,   807 }, {  7, 11,   135 }, {  8, 11,     7 },
+  {  8, 11,    62 }, {  9, 11,   243 }, { 10, 11,   658 }, { 10, 11,   697 },
+  { 11, 11,   456 }, { 11, 11,   756 }, {  9, 11,   395 }, { 10, 11,    79 },
+  {  9, 11,   108 }, { 19,  0,    94 }, {  8,  0,   494 }, {  7, 11,   631 },
+  {  7, 10,   622 }, {  7,  0,  1510 }, {  7, 10,  1750 }, {  4, 10,   203 },
+  {  7, 10,  1936 }, {  7, 11,   406 }, {  7, 11,   459 }, {  8, 11,   606 },
+  { 11, 11,   726 }, {  7,  0,  1306 }, {  8,  0,   505 }, {  9,  0,   482 },
+  { 10,  0,   126 }, { 11,  0,   225 }, { 12,  0,   347 }, { 12,  0,   449 },
+  { 13,  0,    19 }, { 14,  0,   218 }, { 14,  0,   435 }, {  5,  0,   268 },
+  { 10,  0,   764 }, { 12,  0,   120 }, { 13,  0,    39 }, { 17,  0,   127 },
+  { 14, 11,    68 }, { 11, 10,   678 }, { 12, 10,   307 }, { 12, 11,   268 },
+  { 12, 11,   640 }, { 14, 11,   119 }, {  7, 10,  2044 }, {  5, 11,   612 },
+  {  4, 11,   372 }, {  7, 11,   482 }, {  8, 11,   158 }, {  9, 11,   602 },
+  {  9, 11,   615 }, { 10, 11,   245 }, { 10, 11,   678 }, { 10, 11,   744 },
+  { 11, 11,   248 }, { 11, 11,   806 }, {  7, 10,   311 }, {  9, 10,   308 },
+  { 12, 10,   255 }, {  4,  0,   384 }, {  7,  0,  1022 }, {  5, 11,   854 },
+  {  7, 11,  1991 }, {  7, 10,  1266 }, {  4, 10,   400 }, {  5, 10,   267 },
+  {  7, 10,   232 }, {  7,  0,  1703 }, {  9,  0,   159 }, { 11,  0,   661 },
+  { 12,  0,   603 }, {  4,  0,   964 }, { 14,  0,   438 }, { 14,  0,   444 },
+  { 14,  0,   456 }, { 22,  0,    60 }, { 22,  0,    63 }, {  9, 11,   106 },
+  {  9, 11,   163 }, {  9, 11,   296 }, { 10, 11,   167 }, { 10, 11,   172 },
+  { 10, 11,   777 }, { 11, 11,    16 }, {  8,  0,   583 }, {  4,  0,   515 },
+  {  8,  0,   632 }, {  8,  0,   697 }, {  9,  0,   854 }, {  5, 11,   195 },
+  {  7, 11,  1685 }, {  6,  0,  1123 }, {  6,  0,  1365 }, {  6, 11,   328 },
+  {  7, 11,  1997 }, {  8, 11,   730 }, { 11, 11,  1006 }, {  4,  0,   136 },
+  {  5,  0,   551 }, {  6,  0,  1782 }, {  7,  0,  1287 }, {  9,  0,    44 },
+  { 10,  0,   552 }, { 10,  0,   642 }, { 11,  0,   839 }, { 12,  0,   274 },
+  { 12,  0,   275 }, { 12,  0,   372 }, { 13,  0,    91 }, { 14,  0,   125 },
+  {  5, 11,   751 }, { 11, 11,   797 }, { 12, 11,   203 }, {  5,  0,   732 },
+  {  7,  0,   679 }, {  8,  0,   313 }, {  4, 10,   100 }, {  7, 11,   821 },
+  { 10,  0,   361 }, { 14,  0,   316 }, {  6,  0,   595 }, {  6,  0,   147 },
+  {  7,  0,   886 }, {  9,  0,   753 }, { 10,  0,   268 }, {  5, 10,   362 },
+  {  5, 10,   443 }, {  6, 10,   318 }, {  7, 10,  1019 }, { 11, 10,   623 },
+  {  5, 10,   463 }, {  8, 10,   296 }, {  4, 10,   454 }, {  5, 11,   950 },
+  {  5, 11,   994 }, {  6, 11,   351 }, { 10,  0,   137 }, {  5, 10,    48 },
+  {  5, 10,   404 }, {  6, 10,   557 }, {  7, 10,   458 }, {  8, 10,   597 },
+  { 10, 10,   455 }, { 10, 10,   606 }, { 11, 10,    49 }, { 11, 10,   548 },
+  { 12, 10,   476 }, { 13, 10,    18 }, { 13, 10,   450 }, {  5,  0,   414 },
+  {  7,  0,  1762 }, {  5, 11,   421 }, {  7, 11,    47 }, {  5, 10,   442 },
+  {  7, 10,  1984 }, {  6,  0,   599 }, {  6,  0,  1749 }, {  6,  0,  1627 },
+  {  4,  0,   488 }, {  4, 11,   350 }, {  9, 11,   751 }, {  4,  0,    83 },
+  { 12,  0,   676 }, {  5, 11,   967 }, {  7,  0,  1639 }, {  5, 10,    55 },
+  { 12, 10,   161 }, {  4, 11,   473 }, {  7, 11,   623 }, {  8, 11,   808 },
+  {  9, 11,   871 }, {  9, 11,   893 }, { 11, 11,    38 }, { 11, 11,   431 },
+  { 12, 11,   112 }, { 12, 11,   217 }, { 12, 11,   243 }, { 12, 11,   562 },
+  { 12, 11,   683 }, { 13, 11,   141 }, { 13, 11,   197 }, { 13, 11,   227 },
+  { 13, 11,   406 }, { 13, 11,   487 }, { 14, 11,   156 }, { 14, 11,   203 },
+  { 14, 11,   224 }, { 14, 11,   256 }, { 18, 11,    58 }, { 22, 11,     0 },
+  {  5, 10,   450 }, {  7, 11,   736 }, { 11, 11,   264 }, {  6,  0,   278 },
+  {  4, 11,   222 }, {  7, 11,   286 }, {  8, 11,   629 }, {  7, 10,   869 },
+  { 12,  0,    97 }, { 16,  0,    14 }, {  6,  0,  1085 }, {  4, 10,   213 },
+  {  7, 10,   223 }, {  8, 10,    80 }, {  7,  0,   388 }, {  7,  0,   644 },
+  { 11,  0,   781 }, {  4,  0,   849 }, {  7,  0,   229 }, {  8,  0,    59 },
+  {  9,  0,   190 }, { 10,  0,   378 }, { 12,  0,   191 }, {  7, 10,   381 },
+  {  7, 10,   806 }, {  7, 10,   820 }, {  8, 10,   354 }, {  8, 10,   437 },
+  {  8, 10,   787 }, {  9, 10,   657 }, { 10, 10,    58 }, { 10, 10,   339 },
+  { 10, 10,   749 }, { 11, 10,   914 }, { 12, 10,   162 }, { 13, 10,    75 },
+  { 14, 10,   106 }, { 14, 10,   198 }, { 14, 10,   320 }, { 14, 10,   413 },
+  { 18, 10,    43 }, { 13, 11,   306 }, {  8, 10,   747 }, {  6,  0,  1115 },
+  { 16,  0,    94 }, { 16,  0,   108 }, {  8, 11,   146 }, {  6,  0,   700 },
+  {  6,  0,   817 }, {  6,  0,  1002 }, {  5, 10,   692 }, {  4, 11,   465 },
+  {  7, 11,  1663 }, {  6, 10,   191 }, {  6,  0,  1414 }, {  7, 11,   913 },
+  {  4,  0,   660 }, {  7,  0,  1035 }, { 10,  0,   737 }, {  6, 10,   162 },
+  {  7, 10,  1960 }, {  8, 10,   831 }, {  4, 10,   706 }, {  7,  0,   690 },
+  {  9,  0,   217 }, {  9,  0,   587 }, { 12,  0,   521 }, { 10, 10,   426 },
+  {  7, 10,  1235 }, {  6, 11,    82 }, {  7, 11,   138 }, {  7, 11,   517 },
+  {  9, 11,   673 }, { 11, 11,   238 }, { 10,  0,   272 }, {  5, 11,   495 },
+  {  7, 11,   834 }, {  9, 11,   733 }, { 11, 11,   378 }, {  6,  0,  1744 },
+  {  4,  0,  1011 }, {  7, 11,   828 }, { 14, 11,   116 }, {  4,  0,   733 },
+  {  9,  0,   194 }, { 10,  0,    92 }, { 11,  0,   198 }, { 12,  0,    84 },
+  { 13,  0,   128 }, {  5, 11,   559 }, { 10,  0,    57 }, { 10,  0,   277 },
+  {  6, 11,    21 }, {  6, 11,  1737 }, {  7, 11,  1444 }, {  8, 11,   224 },
+  {  4, 10,   204 }, {  9, 10,   902 }, {  8, 10,   833 }, { 11,  0,   348 },
+  { 12,  0,    99 }, { 18,  0,     1 }, { 18,  0,    11 }, { 19,  0,     4 },
+  {  7, 10,   366 }, {  9, 10,   287 }, { 12, 10,   199 }, { 12, 10,   556 },
+  { 12, 10,   577 }, {  6,  0,  1981 }, {  8,  0,   936 }, { 21,  0,    33 },
+  { 22,  0,    40 }, {  5, 11,   519 }, { 10, 11,   204 }, {  5, 10,   356 },
+  {  7, 10,   224 }, {  6,  0,   775 }, {  7,  0,   306 }, {  7, 10,   630 },
+  {  9, 10,   567 }, { 11, 10,   150 }, { 11, 10,   444 }, { 13, 10,   119 },
+  {  5,  0,   979 }, {  6, 10,   539 }, {  5,  0,   611 }, {  4, 11,   402 },
+  {  7, 11,  1679 }, {  5,  0,   178 }, {  7, 11,     2 }, {  8, 11,   323 },
+  {  8, 11,   479 }, {  5, 11,    59 }, {  7, 11,   672 }, {  4,  0,  1010 },
+  {  6,  0,  1969 }, { 10, 11,   237 }, {  5, 11,   412 }, { 18, 11,    34 },
+  {  7, 11,  1740 }, { 18, 11,    48 }, {  6,  0,   664 }, { 11, 10,   814 },
+  {  4, 11,    85 }, {  7, 11,   549 }, {  5, 11,    94 }, {  5, 11,   457 },
+  {  4,  0,   390 }, {  6,  0,  1510 }, {  4, 10,   235 }, {  7, 10,   255 },
+  {  4, 10,   194 }, {  5, 10,   584 }, {  6, 11,    11 }, {  6, 10,   384 },
+  {  7, 11,   187 }, {  7, 10,   583 }, { 10, 10,   761 }, { 11, 10,   760 },
+  { 11, 10,   851 }, {  4, 11,   522 }, { 11, 11,   802 }, {  7,  0,   493 },
+  { 10, 11,   776 }, { 13, 11,   345 }, { 14, 11,   425 }, { 18,  0,    37 },
+  {  4, 11,    52 }, {  7, 11,   661 }, {  6,  0,   724 }, {  6,  0,   829 },
+  {  5, 11,   520 }, {  5, 10,   562 }, {  4, 11,   281 }, {  5, 11,    38 },
+  {  7, 11,   194 }, {  7, 11,   668 }, {  7, 11,  1893 }, {  9, 11,   397 },
+  {  5, 10,   191 }, {  9, 10,   271 }, {  7,  0,  1537 }, { 14,  0,    96 },
+  { 15,  0,    73 }, {  5,  0,   473 }, { 11,  0,   168 }, {  4, 10,   470 },
+  {  6, 10,   153 }, {  7, 10,  1503 }, {  7, 10,  1923 }, { 10, 10,   701 },
+  { 11, 10,   132 }, { 11, 10,   227 }, { 11, 10,   320 }, { 11, 10,   436 },
+  { 11, 10,   525 }, { 11, 10,   855 }, { 12, 10,    41 }, { 12, 10,   286 },
+  { 13, 10,   103 }, { 13, 10,   284 }, { 14, 10,   255 }, { 14, 10,   262 },
+  { 15, 10,   117 }, { 15, 10,   127 }, {  5,  0,   105 }, {  5,  0,   438 },
+  {  9,  0,   694 }, { 12,  0,   627 }, { 13,  0,   210 }, {  5, 10,   327 },
+  {  6, 10,   552 }, {  7, 10,  1754 }, {  9, 10,   604 }, {  6,  0,  1256 },
+  { 24,  0,    11 }, {  5, 11,   448 }, { 11, 11,    98 }, { 11, 11,   524 },
+  {  7,  0,  1626 }, {  5, 10,    80 }, {  6, 10,   405 }, {  7, 10,   403 },
+  {  7, 10,  1502 }, {  8, 10,   456 }, {  9, 10,   487 }, {  9, 10,   853 },
+  {  9, 10,   889 }, { 10, 10,   309 }, { 11, 10,   721 }, { 11, 10,   994 },
+  { 12, 10,   430 }, { 13, 10,   165 }, { 14, 11,    16 }, { 18, 11,    44 },
+  {  4,  0,   779 }, {  8,  0,    25 }, { 10,  0,   826 }, {  4, 10,   453 },
+  {  5, 10,   887 }, {  6, 10,   535 }, {  8, 10,     6 }, {  8, 10,   543 },
+  {  8, 10,   826 }, {  9, 11,   461 }, { 12, 11,   632 }, {  4,  0,   308 },
+  {  7,  0,   741 }, {  4,  0,   671 }, {  7,  0,   150 }, {  8,  0,   649 },
+  {  8,  0,  1020 }, {  9,  0,    99 }, {  6, 11,   336 }, {  8, 11,   552 },
+  {  9, 11,   285 }, { 10, 11,    99 }, { 11, 11,   568 }, {  6,  0,   521 },
+  {  5,  0,   339 }, { 14,  0,     3 }, { 15,  0,    41 }, { 15,  0,   166 },
+  { 19,  0,    66 }, {  6, 11,   423 }, {  7, 11,   665 }, {  7, 11,  1210 },
+  {  9, 11,   218 }, { 13, 11,   222 }, {  6,  0,   543 }, {  5, 10,   101 },
+  {  5, 11,   256 }, {  6, 10,    88 }, {  7, 10,  1677 }, {  9, 10,   100 },
+  { 10, 10,   677 }, { 14, 10,   169 }, { 14, 10,   302 }, { 14, 10,   313 },
+  { 15, 10,    48 }, { 15, 10,    84 }, {  4, 10,   310 }, {  7, 10,   708 },
+  {  7, 10,   996 }, {  9, 10,   795 }, { 10, 10,   390 }, { 10, 10,   733 },
+  { 11, 10,   451 }, { 12, 10,   249 }, { 14, 10,   115 }, { 14, 10,   286 },
+  { 15, 10,   100 }, {  5, 10,   587 }, { 13, 11,   417 }, { 14, 11,   129 },
+  { 15, 11,    15 }, {  6,  0,  1358 }, {  8, 11,   554 }, {  4, 10,   498 },
+  {  7, 10,   217 }, {  8, 10,   140 }, { 10, 10,   610 }, {  7, 11,   989 },
+  {  7, 11,   634 }, {  6,  0,   155 }, { 12,  0,   234 }, {  7, 11,   462 },
+  {  4, 11,   618 }, {  6,  0,  1628 }, {  4,  0,   766 }, {  4, 11,   339 },
+  {  5, 10,   905 }, {  7, 11,   259 }, {  7,  0,   829 }, {  4, 11,   759 },
+  { 13, 11,   169 }, {  7,  0,  1445 }, {  4, 10,   456 }, {  7, 10,   358 },
+  {  7, 10,  1637 }, {  8, 10,   643 }, { 11, 10,   483 }, {  5,  0,   486 },
+  {  7,  0,  1349 }, {  5, 11,   688 }, {  7, 11,   712 }, {  7,  0,  1635 },
+  {  8,  0,    17 }, { 10,  0,   217 }, { 10,  0,   295 }, { 12,  0,     2 },
+  { 12, 11,     2 }, { 10,  0,   558 }, { 22, 10,    56 }, {  4, 11,   278 },
+  {  5, 11,   465 }, {  7, 11,  1367 }, {  8, 11,   482 }, {  5, 10,   535 },
+  {  6,  0,  1362 }, {  6,  0,  1461 }, { 10, 11,   274 }, { 10, 11,   625 },
+  { 11, 11,   530 }, {  5,  0,   599 }, {  5, 11,   336 }, {  6, 11,   341 },
+  {  6, 11,   478 }, {  6, 11,  1763 }, {  8, 11,   386 }, {  7, 10,  1748 },
+  {  9, 11,   151 }, {  6,  0,  1376 }, {  5, 10,   539 }, {  7, 11,    73 },
+  {  7, 11,  1971 }, { 11, 11,   283 }, {  9,  0,    93 }, { 11,  0,   474 },
+  {  6, 10,    91 }, {  7, 10,   435 }, {  6,  0,   447 }, {  5, 11,   396 },
+  {  6, 11,   501 }, {  4, 10,    16 }, {  5, 10,   316 }, {  5, 10,   842 },
+  {  6, 10,   370 }, {  6, 10,  1778 }, {  8, 10,   166 }, { 11, 10,   812 },
+  { 12, 10,   206 }, { 12, 10,   351 }, { 14, 10,   418 }, { 16, 10,    15 },
+  { 16, 10,    34 }, { 18, 10,     3 }, { 19, 10,     3 }, { 19, 10,     7 },
+  { 20, 10,     4 }, { 21, 10,    21 }, {  7,  0,   577 }, {  7,  0,  1432 },
+  {  9,  0,   475 }, {  9,  0,   505 }, {  9,  0,   526 }, {  9,  0,   609 },
+  {  9,  0,   689 }, {  9,  0,   726 }, {  9,  0,   735 }, {  9,  0,   738 },
+  { 10,  0,   556 }, { 10,  0,   674 }, { 10,  0,   684 }, { 11,  0,    89 },
+  { 11,  0,   202 }, { 11,  0,   272 }, { 11,  0,   380 }, { 11,  0,   415 },
+  { 11,  0,   505 }, { 11,  0,   537 }, { 11,  0,   550 }, { 11,  0,   562 },
+  { 11,  0,   640 }, { 11,  0,   667 }, { 11,  0,   688 }, { 11,  0,   847 },
+  { 11,  0,   927 }, { 11,  0,   930 }, { 11,  0,   940 }, { 12,  0,   144 },
+  { 12,  0,   325 }, { 12,  0,   329 }, { 12,  0,   389 }, { 12,  0,   403 },
+  { 12,  0,   451 }, { 12,  0,   515 }, { 12,  0,   604 }, { 12,  0,   616 },
+  { 12,  0,   626 }, { 13,  0,    66 }, { 13,  0,   131 }, { 13,  0,   167 },
+  { 13,  0,   236 }, { 13,  0,   368 }, { 13,  0,   411 }, { 13,  0,   434 },
+  { 13,  0,   453 }, { 13,  0,   461 }, { 13,  0,   474 }, { 14,  0,    59 },
+  { 14,  0,    60 }, { 14,  0,   139 }, { 14,  0,   152 }, { 14,  0,   276 },
+  { 14,  0,   353 }, { 14,  0,   402 }, { 15,  0,    28 }, { 15,  0,    81 },
+  { 15,  0,   123 }, { 15,  0,   152 }, { 18,  0,   136 }, { 20,  0,    88 },
+  {  4, 11,   929 }, {  5, 11,   799 }, {  8, 11,    46 }, { 14,  0,   307 },
+  {  4,  0,   609 }, {  7,  0,   756 }, {  9,  0,   544 }, { 11,  0,   413 },
+  { 16,  0,    25 }, { 10,  0,   687 }, {  7, 10,   619 }, { 10, 10,   547 },
+  { 11, 10,   122 }, { 12, 10,   601 }, {  4,  0,   930 }, {  5,  0,   947 },
+  {  5,  0,   939 }, { 14,  0,    21 }, {  4, 11,   892 }, {  5, 11,   770 },
+  {  5,  0,   962 }, {  5,  0,   651 }, {  8,  0,   170 }, {  9,  0,    61 },
+  {  9,  0,    63 }, { 10,  0,    23 }, { 10,  0,    37 }, { 10,  0,   834 },
+  { 11,  0,     4 }, { 11,  0,   187 }, { 11,  0,   281 }, { 11,  0,   503 },
+  { 11,  0,   677 }, { 12,  0,    96 }, { 12,  0,   130 }, { 12,  0,   244 },
+  { 14,  0,     5 }, { 14,  0,    40 }, { 14,  0,   162 }, { 14,  0,   202 },
+  { 18,  0,   133 }, {  4,  0,   406 }, {  5,  0,   579 }, { 12,  0,   492 },
+  { 22,  0,    15 }, {  7, 11,   158 }, {  7,  0,   597 }, {  4,  0,   981 },
+  {  4, 10,   888 }, {  4, 10,   149 }, { 10, 10,   368 }, {  4,  0,   545 },
+  {  4, 10,   154 }, {  7, 10,  1134 }, {  8, 10,   105 }, {  7, 11,  2001 },
+  {  6,  0,  1558 }, {  4, 10,    31 }, {  6, 10,   429 }, {  7, 10,   962 },
+  {  9, 10,   458 }, { 11, 10,   691 }, {  4, 10,   312 }, {  7, 10,  1642 },
+  {  6,  0,    17 }, {  6,  0,  1304 }, {  7,  0,    16 }, {  7,  0,  1001 },
+  {  9,  0,   886 }, { 10,  0,   489 }, { 10,  0,   800 }, { 11,  0,   782 },
+  { 12,  0,   320 }, { 13,  0,   467 }, { 14,  0,   145 }, { 14,  0,   387 },
+  { 15,  0,   119 }, {  7,  0,  1982 }, { 17,  0,    17 }, {  7, 11,  1461 },
+  { 12, 11,    91 }, {  4, 10,   236 }, {  4, 11,   602 }, { 10,  0,   907 },
+  {  8,  0,   110 }, {  7,  0,   272 }, { 19,  0,    53 }, {  5, 10,   836 },
+  {  5, 10,   857 }, {  6, 10,  1680 }, {  5,  0,   458 }, {  7, 11,  1218 },
+  {  8, 11,   303 }, {  7,  0,  1983 }, {  8,  0,     0 }, {  8,  0,   171 },
+  {  9,  0,   120 }, {  9,  0,   732 }, { 10,  0,   473 }, { 11,  0,   656 },
+  { 11,  0,   998 }, { 18,  0,     0 }, { 18,  0,     2 }, { 19,  0,    21 },
+  { 10, 10,    68 }, { 11, 10,   494 }, {  9, 11,   662 }, {  4, 11,    13 },
+  {  5, 11,   567 }, {  7, 11,  1498 }, {  9, 11,   124 }, { 11, 11,   521 },
+  { 12, 11,   405 }, {  4, 10,    81 }, { 11, 10,   867 }, {  7, 11,  1006 },
+  {  7, 11,   800 }, {  7, 11,  1783 }, { 10, 11,    12 }, {  9,  0,   295 },
+  { 10,  0,   443 }, {  5, 10,   282 }, {  8, 10,   650 }, {  9, 10,   907 },
+  {  4, 11,   735 }, {  4, 11,   170 }, {  4, 10,   775 }, {  7, 11,   323 },
+  {  6,  0,  1844 }, { 10,  0,   924 }, { 11, 11,   844 }, { 12, 11,   104 },
+  { 12, 11,   625 }, {  5, 11,   304 }, {  7, 11,  1403 }, { 12, 11,   498 },
+  {  6,  0,  1232 }, {  4,  0,   519 }, { 10,  0,    70 }, { 12,  0,    26 },
+  { 14,  0,    17 }, { 14,  0,   178 }, { 15,  0,    34 }, { 21,  0,    12 },
+  {  4,  0,   993 }, {  4, 11,   148 }, {  5, 11,   742 }, {  6,  0,    31 },
+  {  7,  0,   491 }, {  7,  0,   530 }, {  8,  0,   592 }, { 11,  0,    53 },
+  { 11,  0,   779 }, { 12,  0,   167 }, { 12,  0,   411 }, { 14,  0,    14 },
+  { 14,  0,   136 }, { 15,  0,    72 }, { 16,  0,    17 }, { 16,  0,    72 },
+  {  5,  0,   907 }, {  6,  0,   733 }, {  5, 11,   111 }, {  4, 10,    71 },
+  {  5, 10,   376 }, {  7, 10,   119 }, { 10, 10,   665 }, {  8,  0,    55 },
+  {  8,  0,   430 }, {  8, 11,   430 }, {  4,  0,   208 }, {  5,  0,   106 },
+  {  6,  0,   531 }, {  8,  0,   408 }, {  9,  0,   188 }, { 10,  0,   572 },
+  { 12,  0,    56 }, { 11, 10,   827 }, { 14, 10,    34 }, { 15, 10,   148 },
+  {  6,  0,  1693 }, {  5, 11,   444 }, {  4, 10,   479 }, { 12,  0,   441 },
+  {  9,  0,   449 }, { 10,  0,   192 }, { 10,  0,   740 }, {  6,  0,   928 },
+  {  4,  0,   241 }, {  7, 10,   607 }, {  8, 10,    99 }, {  8, 11,   123 },
+  { 15, 11,     6 }, { 16, 11,     7 }, {  6, 11,   285 }, {  8, 11,   654 },
+  { 11, 11,   749 }, { 12, 11,   190 }, { 12, 11,   327 }, { 13, 11,   120 },
+  { 13, 11,   121 }, { 13, 11,   327 }, { 15, 11,    47 }, { 18, 11,    40 },
+  {  4, 10,    41 }, {  5, 10,    74 }, {  7, 10,  1627 }, { 11, 10,   871 },
+  { 12, 10,   619 }, {  7,  0,  1525 }, { 11, 10,   329 }, { 11, 10,   965 },
+  { 12, 10,   241 }, { 14, 10,   354 }, { 15, 10,    22 }, { 20, 10,    63 },
+  {  4,  0,   259 }, {  7, 11,   183 }, {  9, 10,   209 }, {  9, 10,   300 },
+  {  5, 11,   937 }, {  7, 11,   100 }, {  5, 10,    98 }, {  4,  0,   173 },
+  {  5,  0,   312 }, {  5,  0,   512 }, {  7,  0,  1285 }, { 13,  0,   185 },
+  {  7,  0,  1603 }, {  7,  0,  1691 }, {  9,  0,   464 }, { 11,  0,   195 },
+  { 12,  0,   279 }, { 12,  0,   448 }, { 14,  0,    11 }, { 19,  0,   102 },
+  {  7,  0,  1113 }, {  5, 10,   984 }, {  4,  0,   452 }, {  5,  0,   583 },
+  {  7,  0,   720 }, {  4,  0,   547 }, {  5,  0,   817 }, {  6,  0,   433 },
+  {  7,  0,   593 }, {  7,  0,  1378 }, {  8,  0,   161 }, {  9,  0,   284 },
+  { 10,  0,   313 }, { 11,  0,   886 }, {  8,  0,   722 }, {  4, 10,   182 },
+  {  6, 10,   205 }, {  7, 10,   220 }, { 22,  0,    13 }, {  4, 10,    42 },
+  {  9, 10,   205 }, {  9, 10,   786 }, { 10, 10,   659 }, {  6,  0,   289 },
+  {  7,  0,  1670 }, { 12,  0,    57 }, { 23,  0,     4 }, {  4, 10,   635 },
+  { 14,  0,    43 }, { 18,  0,    21 }, { 11, 10,   533 }, {  7,  0,  1694 },
+  {  8,  0,   420 }, { 11,  0,   193 }, {  7,  0,   409 }, {  4, 10,   371 },
+  {  4, 10,   272 }, {  7, 10,   836 }, {  5, 10,   825 }, {  6, 10,  1640 },
+  {  5, 11,   251 }, {  5, 11,   956 }, {  8, 11,   268 }, {  9, 11,   214 },
+  { 18, 11,   142 }, { 10,  0,   308 }, {  6,  0,  1863 }, { 13, 11,    37 },
+  {  9, 10,   879 }, {  7, 10,   317 }, {  7, 10,   569 }, {  4, 11,   294 },
+  {  6,  0,   790 }, {  5,  0,  1002 }, {  8,  0,   745 }, {  5, 11,   346 },
+  {  5, 11,   711 }, {  8, 11,   390 }, {  7,  0,   289 }, {  5,  0,   504 },
+  { 11,  0,    68 }, {  9, 10,   307 }, {  4,  0,   239 }, {  6,  0,   477 },
+  {  7,  0,  1607 }, { 11,  0,   617 }, { 21,  0,    13 }, {  5,  0,   609 },
+  {  5, 11,   624 }, {  5, 11,   783 }, {  7, 11,  1998 }, {  7, 11,  2047 },
+  {  5, 10,   525 }, {  4,  0,   367 }, {  4, 11,   594 }, {  6,  0,   528 },
+  {  5, 10,   493 }, {  4, 10,   174 }, {  7, 10,   911 }, {  8, 10,   417 },
+  {  9, 10,   782 }, {  4,  0,   694 }, {  7,  0,   548 }, {  9,  0,    58 },
+  {  4, 10,    32 }, {  5, 10,   215 }, {  6, 10,   269 }, {  7, 10,  1782 },
+  {  7, 10,  1892 }, { 10, 10,    16 }, { 11, 10,   822 }, { 11, 10,   954 },
+  { 13, 10,   481 }, { 12,  0,   687 }, {  7,  0,  1749 }, {  8, 10,   477 },
+  {  4, 11,   569 }, {  5, 10,   308 }, {  7, 10,  1088 }, {  4,  0,   661 },
+  { 10,  0,  1004 }, {  5, 11,    37 }, {  6, 11,    39 }, {  6, 11,   451 },
+  {  7, 11,   218 }, {  7, 11,   667 }, {  7, 11,  1166 }, {  7, 11,  1687 },
+  {  8, 11,   662 }, { 16, 11,     2 }, {  9,  0,   445 }, { 12,  0,    53 },
+  { 13,  0,   492 }, {  5, 10,   126 }, {  8, 10,   297 }, {  9, 10,   366 },
+  { 12, 10,   374 }, {  7, 10,  1551 }, { 11, 10,   361 }, { 20,  0,    74 },
+  {  6, 11,   508 }, {  7,  0,   213 }, {  4, 10,   175 }, {  4, 10,   685 },
+  {  6,  0,   760 }, {  6,  0,   834 }, {  6,  0,  1248 }, {  7, 11,   453 },
+  {  7, 11,   635 }, {  7, 11,   796 }, {  8, 11,   331 }, {  9, 11,   328 },
+  {  9, 11,   330 }, {  9, 11,   865 }, { 10, 11,   119 }, { 10, 11,   235 },
+  { 11, 11,   111 }, { 11, 11,   129 }, { 11, 11,   240 }, { 12, 11,    31 },
+  { 12, 11,    66 }, { 12, 11,   222 }, { 12, 11,   269 }, { 12, 11,   599 },
+  { 12, 11,   689 }, { 13, 11,   186 }, { 13, 11,   364 }, { 14, 11,   345 },
+  {  7,  0,  1672 }, { 11,  0,   189 }, {  5, 10,   797 }, {  5, 10,   565 },
+  {  6,  0,  1548 }, {  6, 11,    98 }, {  7, 11,   585 }, {  7, 11,   702 },
+  {  9,  0,   968 }, { 15,  0,   192 }, { 21,  0,    56 }, {  4, 10,   252 },
+  {  6, 11,    37 }, {  7, 11,   299 }, {  7, 10,  1068 }, {  7, 11,  1666 },
+  {  8, 11,   195 }, {  8, 11,   316 }, {  9, 11,   178 }, {  9, 11,   276 },
+  {  9, 11,   339 }, {  9, 11,   536 }, { 10, 11,   102 }, { 10, 11,   362 },
+  { 10, 10,   434 }, { 10, 11,   785 }, { 11, 11,    55 }, { 11, 11,   149 },
+  { 11, 10,   228 }, { 11, 10,   426 }, { 11, 11,   773 }, { 13, 10,   231 },
+  { 13, 11,   416 }, { 13, 11,   419 }, { 14, 11,    38 }, { 14, 11,    41 },
+  { 14, 11,   210 }, { 18, 10,   106 }, { 20, 10,    87 }, {  4,  0,   751 },
+  { 11,  0,   390 }, { 12,  0,    32 }, {  4,  0,   409 }, {  5,  0,    78 },
+  { 11, 11,   458 }, { 12, 11,    15 }, { 12, 11,   432 }, {  7,  0,  1602 },
+  { 10,  0,   257 }, { 10,  0,   698 }, { 11,  0,   544 }, { 11,  0,   585 },
+  { 12,  0,   212 }, { 13,  0,   307 }, {  5, 10,   231 }, {  7, 10,   601 },
+  {  9, 10,   277 }, {  9, 10,   674 }, { 10, 10,   178 }, { 10, 10,   418 },
+  { 10, 10,   509 }, { 11, 10,   531 }, { 12, 10,   113 }, { 12, 10,   475 },
+  { 13, 10,    99 }, { 14, 10,   428 }, {  6,  0,   473 }, { 17,  0,   105 },
+  {  6,  0,  1949 }, { 15,  0,   156 }, {  5, 11,   645 }, {  7, 10,  1591 },
+  { 16, 10,    43 }, {  7,  0,  1779 }, {  7, 10,  1683 }, {  4, 11,   290 },
+  {  7, 11,  1356 }, {  6,  0,   763 }, {  6, 11,    70 }, {  7, 11,  1292 },
+  { 10, 11,   762 }, { 11, 11,   288 }, { 14,  0,    29 }, { 12, 11,   428 },
+  {  7,  0,   883 }, {  7, 11,   131 }, {  7, 11,   422 }, {  8, 11,   210 },
+  { 12, 11,   573 }, {  6,  0,   488 }, {  4, 10,   399 }, {  5, 10,   119 },
+  {  5, 10,   494 }, {  7, 10,   751 }, {  9, 10,   556 }, {  5,  0,   617 },
+  {  4, 11,   936 }, { 11,  0,    50 }, {  7,  0,  1518 }, { 11,  0,   694 },
+  {  9,  0,   785 }, {  4,  0,   546 }, {  7,  0,  2042 }, {  7, 11,   716 },
+  { 13, 11,    97 }, { 13, 11,   251 }, {  4, 11,   653 }, { 17,  0,    22 },
+  {  6,  0,  1016 }, {  4,  0,   313 }, {  5,  0,   577 }, {  8, 11,   657 },
+  {  8,  0,   184 }, { 13,  0,   433 }, {  7,  0,   935 }, {  6,  0,   720 },
+  {  9,  0,   114 }, { 18, 11,    80 }, { 12,  0,   186 }, { 12,  0,   292 },
+  { 14,  0,   100 }, { 18,  0,    70 }, {  7, 10,   594 }, {  7, 10,   851 },
+  {  7, 10,  1858 }, {  9, 10,   411 }, {  9, 10,   574 }, {  9, 10,   666 },
+  {  9, 10,   737 }, { 10, 10,   346 }, { 10, 10,   712 }, { 11, 10,   246 },
+  { 11, 10,   432 }, { 11, 10,   517 }, { 11, 10,   647 }, { 11, 10,   679 },
+  { 11, 10,   727 }, { 12, 10,   304 }, { 12, 10,   305 }, { 12, 10,   323 },
+  { 12, 10,   483 }, { 12, 10,   572 }, { 12, 10,   593 }, { 12, 10,   602 },
+  { 13, 10,    95 }, { 13, 10,   101 }, { 13, 10,   171 }, { 13, 10,   315 },
+  { 13, 10,   378 }, { 13, 10,   425 }, { 13, 10,   475 }, { 14, 10,    63 },
+  { 14, 10,   380 }, { 14, 10,   384 }, { 15, 10,   133 }, { 18, 10,   112 },
+  { 20, 10,    72 }, {  7, 10,  1093 }, {  7, 11,  1836 }, {  4, 10,   679 },
+  {  9, 10,   203 }, { 11,  0,   402 }, { 12,  0,   109 }, { 12,  0,   431 },
+  { 13,  0,   179 }, { 13,  0,   206 }, { 14,  0,   217 }, { 16,  0,     3 },
+  { 20,  0,    53 }, {  7, 11,  1368 }, {  8, 11,   232 }, {  8, 11,   361 },
+  { 10, 11,   682 }, { 10, 11,   742 }, {  9, 10,   714 }, {  5,  0,   886 },
+  {  6,  0,    46 }, {  6,  0,  1790 }, {  7,  0,    14 }, {  7,  0,   732 },
+  {  7,  0,  1654 }, {  8,  0,    95 }, {  8,  0,   327 }, {  8,  0,   616 },
+  {  9,  0,   892 }, { 10,  0,   598 }, { 10,  0,   769 }, { 11,  0,   134 },
+  { 11,  0,   747 }, { 12,  0,   378 }, { 14,  0,    97 }, {  9, 11,   534 },
+  {  4,  0,   969 }, {  8, 10,   825 }, {  9, 11,    27 }, {  6,  0,   727 },
+  { 14, 11,    12 }, {  5,  0,  1021 }, {  6,  0,  1190 }, {  6, 11,  1657 },
+  {  5, 10,   143 }, {  5, 10,   769 }, {  6, 10,  1760 }, {  7, 10,   682 },
+  {  7, 10,  1992 }, {  8, 10,   736 }, {  4,  0,   153 }, {  7, 11,   127 },
+  {  5,  0,   798 }, {  4,  0,   587 }, {  6,  0,   598 }, {  7,  0,    42 },
+  {  8,  0,   695 }, { 10,  0,   212 }, { 11,  0,   158 }, { 14,  0,   196 },
+  { 17,  0,    85 }, {  5, 10,   860 }, {  6,  0,  1929 }, {  6,  0,  1933 },
+  {  5,  0,   957 }, {  5,  0,  1008 }, {  9,  0,   577 }, { 12,  0,   141 },
+  {  6, 10,   422 }, {  7, 10,     0 }, {  7, 10,  1544 }, {  8, 11,   364 },
+  { 11, 10,   990 }, { 12, 10,   453 }, { 13, 10,    47 }, { 13, 10,   266 },
+  {  6,  0,  1319 }, {  4,  0,   129 }, {  7,  0,   465 }, {  7,  0,   470 },
+  {  7,  0,  1057 }, {  7,  0,  1201 }, {  9,  0,   755 }, { 11,  0,   906 },
+  { 12,  0,   527 }, {  7,  0,   908 }, { 18,  0,     7 }, {  5,  0,   148 },
+  {  8,  0,   450 }, {  5, 10,   515 }, {  9, 10,   131 }, {  7, 10,  1605 },
+  { 11, 10,   962 }, { 18, 10,   139 }, {  4, 10,   646 }, {  6,  0,  1166 },
+  {  4, 10,   396 }, {  7, 10,   728 }, {  9, 10,   117 }, { 13, 10,   202 },
+  { 20, 10,    51 }, {  6, 10,   121 }, {  6, 10,   124 }, {  6, 10,   357 },
+  {  7, 10,  1138 }, {  7, 10,  1295 }, {  8, 10,   162 }, { 11, 10,   655 },
+  { 14,  0,   374 }, { 14, 11,   374 }, { 10,  0,   253 }, { 11,  0,  1003 },
+  {  5, 11,   909 }, {  9, 11,   849 }, { 10, 11,   805 }, {  5, 10,   237 },
+  {  7, 11,   525 }, {  7, 11,  1579 }, {  8, 11,   497 }, {  8, 11,   573 },
+  {  9,  0,    46 }, {  4,  0,   879 }, {  6,  0,   806 }, {  7,  0,  1868 },
+  {  6,  0,  1837 }, {  6,  0,  1846 }, {  6,  0,   730 }, {  6,  0,   881 },
+  {  7,  0,   965 }, {  7,  0,  1460 }, {  7,  0,  1604 }, {  7, 11,   193 },
+  {  7, 11,   397 }, {  7, 11,  1105 }, {  8, 11,   124 }, {  8, 11,   619 },
+  {  9, 11,   305 }, { 10, 11,   264 }, { 11, 11,    40 }, { 12, 11,   349 },
+  { 13, 11,   134 }, { 13, 11,   295 }, { 14, 11,   155 }, { 15, 11,   120 },
+  { 18, 11,   105 }, {  8,  0,   506 }, { 15,  0,    10 }, {  4, 11,   262 },
+  {  7, 11,   342 }, {  7, 10,   571 }, {  7, 10,  1877 }, { 10, 10,   366 },
+  { 13, 11,    23 }, {  5, 11,   641 }, { 10,  0,    22 }, {  9, 10,   513 },
+  { 10, 10,    39 }, { 12, 10,   122 }, { 12, 10,   187 }, {  7, 11,  1431 },
+  { 22, 11,    49 }, {  4, 11,    99 }, {  6, 11,   250 }, {  6, 11,   346 },
+  {  8, 11,   127 }, { 10, 11,    81 }, {  6,  0,  2014 }, {  8,  0,   928 },
+  { 10,  0,   960 }, { 10,  0,   979 }, { 12,  0,   996 }, {  6,  0,   296 },
+  {  4, 11,   915 }, {  5, 11,    75 }, {  9, 11,   517 }, { 10, 11,   470 },
+  { 12, 11,   155 }, { 13, 11,   224 }, {  9, 10,   873 }, {  4,  0,   854 },
+  { 12, 11,    18 }, {  6,  0,   587 }, {  7, 10,   107 }, {  7, 10,   838 },
+  {  8, 10,   550 }, { 10, 10,   401 }, { 11,  0,   636 }, { 15,  0,   145 },
+  { 17,  0,    34 }, { 19,  0,    50 }, { 23,  0,    20 }, { 11, 10,   588 },
+  { 11, 10,   864 }, { 11, 10,   968 }, { 15, 10,   160 }, {  7, 11,   216 },
+  {  7,  0,   982 }, { 10,  0,    32 }, { 15,  0,    56 }, {  5, 10,   768 },
+  {  5, 11,   954 }, {  6, 11,   304 }, {  7, 11,  1114 }, {  8, 11,   418 },
+  { 10, 11,   345 }, { 11, 11,   341 }, { 11, 11,   675 }, { 13, 11,    40 },
+  {  9, 11,   410 }, { 11, 11,   425 }, {  8,  0,   941 }, {  5,  0,   435 },
+  {  4, 10,   894 }, {  5,  0,    85 }, {  6,  0,   419 }, {  7,  0,   134 },
+  {  7,  0,   305 }, {  7,  0,   361 }, {  7,  0,  1337 }, {  8,  0,    71 },
+  { 12,  0,   519 }, { 12,  0,   688 }, {  7,  0,   740 }, {  5,  0,   691 },
+  {  7,  0,   345 }, {  9,  0,    94 }, { 12,  0,   169 }, {  5,  0,   183 },
+  {  6,  0,   582 }, { 10,  0,   679 }, { 12,  0,   435 }, {  6, 11,    14 },
+  {  6,  0,   945 }, {  7,  0,   511 }, {  6, 11,  1708 }, {  5, 11,   113 },
+  {  6, 11,   243 }, {  7, 11,  1865 }, { 11, 11,   161 }, { 16, 11,    37 },
+  { 17, 11,    99 }, {  4, 11,   274 }, {  9,  0,   539 }, {  7,  0,  1993 },
+  {  8,  0,   684 }, {  6, 10,   272 }, {  6,  0,   659 }, {  6,  0,   982 },
+  {  4, 10,     9 }, {  5, 10,   128 }, {  7, 10,   368 }, { 11, 10,   480 },
+  { 20, 10,     3 }, {  6,  0,   583 }, {  4,  0,   803 }, {  5,  0,   704 },
+  {  4,  0,   179 }, {  5,  0,   198 }, {  5,  0,   697 }, {  7,  0,   347 },
+  {  7,  0,   971 }, {  8,  0,   181 }, { 10,  0,   711 }, {  7, 11,   166 },
+  {  8, 10,   682 }, {  4, 10,     2 }, {  7, 10,   545 }, {  7, 10,   894 },
+  {  8, 11,   521 }, {  7,  0,   481 }, {  4,  0,   243 }, {  5,  0,   203 },
+  {  7,  0,    19 }, {  7,  0,    71 }, {  7,  0,   113 }, { 10,  0,   405 },
+  { 11,  0,   357 }, { 14,  0,   240 }, {  5, 11,   725 }, {  5, 11,   727 },
+  {  7, 11,  1811 }, {  6,  0,   826 }, {  9, 11,   304 }, {  7,  0,  1450 },
+  { 11,  0,    99 }, {  5, 11,   654 }, {  6,  0,   492 }, {  5,  0,   134 },
+  {  6,  0,   408 }, {  6,  0,   495 }, {  7,  0,  1593 }, {  6, 11,   273 },
+  { 10, 11,   188 }, { 13, 11,   377 }, { 18, 11,    77 }, {  9, 10,   769 },
+  { 12, 10,   185 }, {  7, 11,   410 }, { 14,  0,     4 }, {  4,  0,   665 },
+  {  6, 11,  1785 }, {  4,  0,   248 }, {  7,  0,   137 }, {  9,  0,   349 },
+  {  5, 10,   530 }, { 14, 10,   113 }, {  7,  0,  1270 }, { 11,  0,   612 },
+  {  4, 11,   780 }, {  5,  0,   371 }, {  7,  0,   563 }, {  7,  0,   826 },
+  {  6,  0,  1535 }, { 23,  0,    21 }, { 23,  0,    23 }, {  4,  0,   374 },
+  {  7,  0,   547 }, {  7,  0,  1700 }, {  7,  0,  1833 }, { 11,  0,   858 },
+  {  5, 10,   556 }, {  7, 11,   612 }, {  8, 11,   545 }, {  8, 11,   568 },
+  {  8, 11,   642 }, {  9, 11,   717 }, { 10, 11,   541 }, { 10, 11,   763 },
+  { 11, 11,   449 }, { 12, 11,   489 }, { 13, 11,   153 }, { 13, 11,   296 },
+  { 14, 11,   138 }, { 14, 11,   392 }, { 15, 11,    50 }, { 16, 11,     6 },
+  { 16, 11,    12 }, { 20, 11,     9 }, {  9,  0,   311 }, { 13,  0,    42 },
+  {  8, 10,    16 }, { 12, 10,   568 }, {  6,  0,  1968 }, {  6,  0,  2027 },
+  { 10,  0,   991 }, {  6,  0,  1647 }, {  7,  0,  1552 }, {  7,  0,  2010 },
+  {  9,  0,   494 }, {  9,  0,   509 }, {  5, 11,   948 }, {  6, 10,   186 },
+  {  9, 10,   426 }, {  6,  0,   769 }, {  6,  0,   642 }, {  4, 10,   585 },
+  {  6,  0,   123 }, {  7,  0,   214 }, {  9,  0,   728 }, { 10,  0,   157 },
+  { 11,  0,   346 }, { 11,  0,   662 }, { 15,  0,   106 }, { 14, 11,   381 },
+  {  7,  0,  1435 }, {  4, 11,   532 }, {  5, 11,   706 }, {  7, 11,   662 },
+  {  5, 11,   837 }, {  6, 11,  1651 }, {  4, 10,    93 }, {  5, 10,   252 },
+  {  6, 10,   229 }, {  7, 10,   291 }, {  9, 10,   550 }, { 11, 10,   644 },
+  { 20,  0,    79 }, {  9, 10,   749 }, {  6,  0,  1425 }, {  9, 10,   162 },
+  {  4, 11,   362 }, {  7, 11,    52 }, {  7, 11,   303 }, { 12, 11,   166 },
+  {  4, 10,   381 }, {  4, 11,   330 }, {  7, 11,   933 }, {  7, 11,  2012 },
+  {  8, 11,   292 }, {  7, 11,   767 }, {  4,  0,   707 }, {  5,  0,   588 },
+  {  6,  0,   393 }, { 13,  0,   106 }, { 18,  0,    49 }, { 19,  0,    41 },
+  {  6,  0,   211 }, {  7,  0,  1690 }, { 11,  0,   486 }, { 12,  0,   369 },
+  {  9, 11,   883 }, {  4, 11,   703 }, {  7, 11,   207 }, {  4,  0,   187 },
+  {  5,  0,   184 }, {  5,  0,   690 }, {  7,  0,  1869 }, { 10,  0,   756 },
+  { 11,  0,   783 }, {  4, 11,   571 }, {  6,  0,  1382 }, {  5,  0,   175 },
+  {  6, 10,    77 }, {  6, 10,   157 }, {  7, 10,   974 }, {  7, 10,  1301 },
+  {  7, 10,  1339 }, {  7, 10,  1490 }, {  7, 10,  1873 }, {  9, 10,   628 },
+  {  6,  0,  1493 }, {  5, 11,   873 }, {  5, 11,   960 }, {  6,  0,  1007 },
+  { 12, 11,    93 }, { 12, 11,   501 }, { 13, 11,   362 }, { 14, 11,   151 },
+  { 15, 11,    40 }, { 15, 11,    59 }, { 16, 11,    46 }, { 17, 11,    25 },
+  { 18, 11,    14 }, { 18, 11,   134 }, { 19, 11,    25 }, { 19, 11,    69 },
+  { 20, 11,    16 }, { 20, 11,    19 }, { 20, 11,    66 }, { 21, 11,    23 },
+  { 21, 11,    25 }, { 22, 11,    42 }, { 11, 10,   919 }, { 13, 10,   409 },
+  {  6,  0,   219 }, {  5,  0,   582 }, {  6,  0,  1646 }, {  7,  0,    99 },
+  {  7,  0,  1962 }, {  7,  0,  1986 }, {  8,  0,   515 }, {  8,  0,   773 },
+  {  9,  0,    23 }, {  9,  0,   491 }, { 12,  0,   620 }, { 14,  0,    93 },
+  {  5,  0,   851 }, {  5, 11,    33 }, {  6, 11,   470 }, {  7, 11,  1291 },
+  {  6,  0,  1278 }, {  7, 11,  1882 }, {  7, 10,  1489 }, {  4,  0,  1000 },
+  { 10,  0,   982 }, {  8,  0,   762 }, {  8,  0,   812 }, {  9,  0,   910 },
+  {  6, 11,    47 }, {  7, 11,    90 }, {  7, 11,   664 }, {  7, 11,   830 },
+  {  7, 11,  1380 }, {  7, 11,  2025 }, {  8, 11,   448 }, {  8, 11,   828 },
+  {  4,  0,    98 }, {  4,  0,   940 }, {  6,  0,  1819 }, {  6,  0,  1834 },
+  {  6,  0,  1841 }, {  7,  0,  1365 }, {  8,  0,   859 }, {  8,  0,   897 },
+  {  8,  0,   918 }, {  9,  0,   422 }, {  9,  0,   670 }, { 10,  0,   775 },
+  { 10,  0,   894 }, { 10,  0,   909 }, { 10,  0,   910 }, { 10,  0,   935 },
+  { 11,  0,   210 }, { 12,  0,   750 }, { 12,  0,   755 }, { 13,  0,    26 },
+  { 13,  0,   457 }, { 13,  0,   476 }, { 16,  0,   100 }, { 16,  0,   109 },
+  { 18,  0,   173 }, { 18,  0,   175 }, {  8, 10,   398 }, {  9, 10,   681 },
+  { 11, 10,   632 }, {  9, 11,   417 }, {  9, 11,   493 }, {  8, 10,   645 },
+  { 10,  0,   906 }, {  6,  0,  1730 }, {  6, 10,    20 }, {  5, 11,  1019 },
+  {  6,  0,  1185 }, { 10,  0,    40 }, {  8, 10,   769 }, {  9,  0,   147 },
+  {  6, 11,   208 }, { 12,  0,   650 }, {  5,  0,   209 }, {  6,  0,    30 },
+  { 11,  0,    56 }, { 11,  0,   305 }, {  4,  0,   553 }, { 10, 11,   344 },
+  {  6, 11,    68 }, {  7, 11,   398 }, {  7, 11,   448 }, {  7, 11,  1629 },
+  {  7, 11,  1813 }, {  8, 11,   387 }, {  8, 11,   442 }, {  9, 11,   710 },
+  { 10, 11,   282 }, { 10, 11,   722 }, {  5,  0,   597 }, { 14,  0,    20 },
+  { 14, 11,    20 }, {  7,  0,  1614 }, {  7, 10,  1757 }, {  4,  0,   150 },
+  {  5,  0,   303 }, {  6,  0,   327 }, {  7, 10,   937 }, { 16,  0,    49 },
+  {  7, 10,  1652 }, { 16, 11,    49 }, {  8,  0,   192 }, { 10,  0,    78 },
+  { 13,  0,   359 }, {  7,  0,   786 }, { 15,  0,   134 }, {  6,  0,  1638 },
+  {  7,  0,    79 }, {  7,  0,   496 }, {  9,  0,   138 }, { 10,  0,   336 },
+  { 11,  0,    12 }, { 12,  0,   412 }, { 12,  0,   440 }, { 14,  0,   305 },
+  {  8, 11,   491 }, {  4, 10,   579 }, {  5, 10,   226 }, {  5, 10,   323 },
+  {  7, 10,   960 }, {  7,  0,   204 }, {  7,  0,   415 }, {  8,  0,    42 },
+  { 10,  0,    85 }, { 11,  0,   564 }, {  4,  0,   614 }, {  4, 11,   403 },
+  {  5, 11,   441 }, {  7, 11,   450 }, { 11, 11,   101 }, { 12, 11,   193 },
+  { 13, 11,   430 }, {  7, 11,  1927 }, {  7, 11,  1330 }, {  4,  0,     3 },
+  {  5,  0,   247 }, {  5,  0,   644 }, {  7,  0,   744 }, {  7,  0,  1207 },
+  {  7,  0,  1225 }, {  7,  0,  1909 }, { 18,  0,   147 }, {  8,  0,   942 },
+  {  4,  0,  1019 }, {  6,  0,  2023 }, {  5, 11,   679 }, {  5, 10,   973 },
+  {  5,  0,   285 }, {  9,  0,    67 }, { 13,  0,   473 }, { 15,  0,    82 },
+  {  7, 11,   328 }, {  9, 11,   326 }, { 23,  0,     8 }, {  6, 10,   135 },
+  {  7, 10,  1176 }, {  7, 11,  1128 }, {  6,  0,  1309 }, {  7, 11,  1796 },
+  {  7, 10,   314 }, {  4, 11,   574 }, {  7, 11,   350 }, {  7, 11,  1024 },
+  {  8, 11,   338 }, {  9, 11,   677 }, { 10, 11,   808 }, { 11, 11,   508 },
+  {  7, 11,   818 }, { 17, 11,    14 }, { 17, 11,    45 }, { 18, 11,    75 },
+  { 20, 11,    18 }, { 18, 10,     4 }, {  7, 11,  1081 }, {  4,  0,    29 },
+  {  6,  0,   532 }, {  7,  0,  1628 }, {  7,  0,  1648 }, {  9,  0,   350 },
+  { 10,  0,   433 }, { 11,  0,    97 }, { 11,  0,   557 }, { 11,  0,   745 },
+  { 12,  0,   289 }, { 12,  0,   335 }, { 12,  0,   348 }, { 12,  0,   606 },
+  { 13,  0,   116 }, { 13,  0,   233 }, { 13,  0,   466 }, { 14,  0,   181 },
+  { 14,  0,   209 }, { 14,  0,   232 }, { 14,  0,   236 }, { 14,  0,   300 },
+  { 16,  0,    41 }, { 20,  0,    97 }, {  7,  0,   318 }, {  6, 10,   281 },
+  {  8, 10,   282 }, {  8, 10,   480 }, {  8, 10,   499 }, {  9, 10,   198 },
+  { 10, 10,   143 }, { 10, 10,   169 }, { 10, 10,   211 }, { 10, 10,   417 },
+  { 10, 10,   574 }, { 11, 10,   147 }, { 11, 10,   395 }, { 12, 10,    75 },
+  { 12, 10,   407 }, { 12, 10,   608 }, { 13, 10,   500 }, { 14, 10,   251 },
+  {  7, 11,  1676 }, {  7, 11,  2037 }, {  7,  0,  1692 }, {  5,  0,   501 },
+  {  7,  0,  1704 }, {  9,  0,   553 }, { 11,  0,   520 }, { 12,  0,   557 },
+  { 13,  0,   249 }, {  6,  0,  1527 }, { 14,  0,   324 }, { 15,  0,    55 },
+  { 15,  0,    80 }, { 14, 11,   324 }, { 15, 11,    55 }, { 15, 11,    80 },
+  {  7, 10,  1776 }, {  8,  0,   988 }, {  9, 11,   297 }, {  4, 10,   419 },
+  { 14,  0,   223 }, { 11, 11,   234 }, {  7,  0,  1123 }, { 12,  0,   508 },
+  { 14,  0,   102 }, { 14,  0,   226 }, { 16,  0,    57 }, {  4, 10,   138 },
+  {  7, 10,  1012 }, {  7, 10,  1280 }, {  9, 10,    76 }, {  7,  0,  1764 },
+  {  5, 10,    29 }, { 12, 10,   638 }, {  6,  0,  2015 }, {  6,  0,  1599 },
+  { 10, 11,    56 }, {  6, 11,   306 }, {  7, 11,  1140 }, {  7, 11,  1340 },
+  {  8, 11,   133 }, { 10, 11,   449 }, { 11, 11,  1011 }, {  6, 10,  1710 },
+  {  7, 10,  2038 }, {  7, 11,  1763 }, { 12, 11,   310 }, {  6,  0,   129 },
+  {  4, 10,    17 }, {  5, 10,    23 }, {  7, 10,   995 }, { 11, 10,   383 },
+  { 11, 10,   437 }, { 12, 10,   460 }, { 12, 10,   532 }, {  5, 11,   329 },
+  {  8, 11,   260 }, {  5, 10,   862 }, {  4,  0,   534 }, {  6,  0,   811 },
+  {  7,  0,   626 }, {  4, 11,   657 }, {  4,  0,    25 }, {  5,  0,    60 },
+  {  6,  0,   504 }, {  7,  0,   614 }, {  7,  0,  1155 }, { 12,  0,     0 },
+  { 24, 11,     7 }, {  7,  0,  1248 }, { 11,  0,   621 }, { 11,  0,   702 },
+  {  9,  0,   321 }, {  8, 10,    70 }, { 12, 10,   171 }, { 13, 10,   272 },
+  { 10, 10,   233 }, { 11, 10,    76 }, {  4,  0,   379 }, {  7,  0,  1397 },
+  {  6, 10,   442 }, {  5, 11,    66 }, {  7, 11,  1896 }, {  8, 11,   288 },
+  {  6, 11,  1643 }, {  6, 10,  1709 }, {  4, 11,    21 }, {  5, 11,    91 },
+  {  5, 11,   570 }, {  5, 11,   648 }, {  5, 11,   750 }, {  5, 11,   781 },
+  {  6, 11,    54 }, {  6, 11,   112 }, {  6, 11,   402 }, {  6, 11,  1732 },
+  {  7, 11,   315 }, {  7, 11,   749 }, {  7, 11,  1347 }, {  7, 11,  1900 },
+  {  9, 11,    78 }, {  9, 11,   508 }, { 10, 11,   611 }, { 11, 11,   510 },
+  { 11, 11,   728 }, { 13, 11,    36 }, { 14, 11,    39 }, { 16, 11,    83 },
+  { 17, 11,   124 }, { 20, 11,    30 }, {  4,  0,   118 }, {  6,  0,   274 },
+  {  6,  0,   361 }, {  7,  0,    75 }, { 13,  0,   441 }, { 10, 11,   322 },
+  { 10, 11,   719 }, { 11, 11,   407 }, { 19, 10,   119 }, { 12, 11,   549 },
+  { 14, 11,    67 }, { 19, 11,    60 }, { 11, 10,    69 }, { 12, 10,   105 },
+  { 12, 10,   117 }, { 13, 10,   213 }, { 14, 10,    13 }, { 14, 10,    62 },
+  { 14, 10,   177 }, { 14, 10,   421 }, { 15, 10,    19 }, { 18, 10,   141 },
+  {  9,  0,   841 }, {  9, 10,   309 }, {  7, 10,   608 }, {  7, 10,   976 },
+  {  8, 11,   125 }, {  8, 11,   369 }, {  8, 11,   524 }, {  9, 10,   146 },
+  { 10, 10,   206 }, { 10, 11,   486 }, { 10, 10,   596 }, { 11, 11,    13 },
+  { 11, 11,   381 }, { 11, 11,   736 }, { 11, 11,   766 }, { 11, 11,   845 },
+  { 13, 11,   114 }, { 13, 10,   218 }, { 13, 11,   292 }, { 14, 11,    47 },
+  { 14, 10,   153 }, { 12,  0,   693 }, {  7, 11,   759 }, {  5,  0,   314 },
+  {  6,  0,   221 }, {  7,  0,   419 }, { 10,  0,   650 }, { 11,  0,   396 },
+  { 12,  0,   156 }, { 13,  0,   369 }, { 14,  0,   333 }, { 17,  0,    47 },
+  {  6, 11,  1684 }, {  6, 11,  1731 }, {  7, 11,   356 }, {  7, 11,  1932 },
+  {  8, 11,    54 }, {  8, 11,   221 }, {  9, 11,   225 }, {  9, 11,   356 },
+  { 10, 11,    77 }, { 10, 11,   446 }, { 10, 11,   731 }, { 12, 11,   404 },
+  { 13, 11,   491 }, {  4, 11,   375 }, {  4, 10,   518 }, {  7, 10,  1136 },
+  {  4,  0,   913 }, {  4, 11,   411 }, { 11, 11,   643 }, { 12, 11,   115 },
+  {  4, 11,    80 }, {  5, 11,    44 }, {  8, 10,   689 }, {  9, 10,   863 },
+  { 10,  0,   880 }, {  4, 10,    18 }, {  7, 10,   145 }, {  7, 10,   444 },
+  {  7, 10,  1278 }, {  8, 10,    49 }, {  8, 10,   400 }, {  9, 10,    71 },
+  {  9, 10,   250 }, { 10, 10,   459 }, { 12, 10,   160 }, { 16, 10,    24 },
+  {  8,  0,   475 }, {  5,  0,  1016 }, {  5, 11,   299 }, {  7, 11,  1083 },
+  {  7,  0,   602 }, {  8,  0,   179 }, { 10,  0,   781 }, { 12,  0,   126 },
+  {  6,  0,   329 }, { 10,  0,   111 }, {  7,  0,  1864 }, {  4, 11,   219 },
+  {  7, 11,  1761 }, {  9, 11,    86 }, {  6,  0,  1888 }, {  6,  0,  1892 },
+  {  6,  0,  1901 }, {  6,  0,  1904 }, {  9,  0,   953 }, {  9,  0,   985 },
+  {  9,  0,   991 }, {  9,  0,  1001 }, { 12,  0,   818 }, { 12,  0,   846 },
+  { 12,  0,   847 }, { 12,  0,   861 }, { 12,  0,   862 }, { 12,  0,   873 },
+  { 12,  0,   875 }, { 12,  0,   877 }, { 12,  0,   879 }, { 12,  0,   881 },
+  { 12,  0,   884 }, { 12,  0,   903 }, { 12,  0,   915 }, { 12,  0,   926 },
+  { 12,  0,   939 }, { 15,  0,   182 }, { 15,  0,   219 }, { 15,  0,   255 },
+  { 18,  0,   191 }, { 18,  0,   209 }, { 18,  0,   211 }, { 21,  0,    41 },
+  {  5, 11,   328 }, {  7, 11,   918 }, {  9,  0,   780 }, { 12,  0,    82 },
+  { 15,  0,    36 }, {  5, 10,  1010 }, {  5,  0,   821 }, {  6,  0,  1687 },
+  {  5, 11,   514 }, {  4,  0,   956 }, {  6,  0,  1180 }, { 10,  0,   112 },
+  {  5, 10,    87 }, {  7, 10,   313 }, {  7, 10,  1103 }, { 10, 10,   582 },
+  { 11, 10,   389 }, { 11, 10,   813 }, { 12, 10,   385 }, { 13, 10,   286 },
+  { 14, 10,   124 }, { 18, 10,   108 }, {  5,  0,    71 }, {  7,  0,  1407 },
+  {  9,  0,   704 }, { 10,  0,   261 }, { 10,  0,   619 }, { 11,  0,   547 },
+  { 11,  0,   619 }, { 15,  0,   157 }, {  4,  0,   531 }, {  5,  0,   455 },
+  {  5, 11,   301 }, {  6, 11,   571 }, { 14, 11,    49 }, { 18, 11,   102 },
+  {  4, 10,   267 }, {  6,  0,   385 }, {  7,  0,  2008 }, {  9,  0,   337 },
+  { 10,  0,   517 }, {  5, 11,   726 }, {  5, 11,   364 }, {  4, 11,    76 },
+  {  7, 11,  1550 }, {  9, 11,   306 }, {  9, 11,   430 }, {  9, 11,   663 },
+  { 10, 11,   683 }, { 11, 11,   427 }, { 11, 11,   753 }, { 12, 11,   334 },
+  { 12, 11,   442 }, { 14, 11,   258 }, { 14, 11,   366 }, { 15, 11,   131 },
+  {  6,  0,  1865 }, {  6,  0,  1879 }, {  6,  0,  1881 }, {  6,  0,  1894 },
+  {  6,  0,  1908 }, {  9,  0,   915 }, {  9,  0,   926 }, {  9,  0,   940 },
+  {  9,  0,   943 }, {  9,  0,   966 }, {  9,  0,   980 }, {  9,  0,   989 },
+  {  9,  0,  1005 }, {  9,  0,  1010 }, { 12,  0,   813 }, { 12,  0,   817 },
+  { 12,  0,   840 }, { 12,  0,   843 }, { 12,  0,   855 }, { 12,  0,   864 },
+  { 12,  0,   871 }, { 12,  0,   872 }, { 12,  0,   899 }, { 12,  0,   905 },
+  { 12,  0,   924 }, { 15,  0,   171 }, { 15,  0,   181 }, { 15,  0,   224 },
+  { 15,  0,   235 }, { 15,  0,   251 }, { 18,  0,   184 }, {  9, 11,    52 },
+  {  5,  0,    16 }, {  6,  0,    86 }, {  6,  0,   603 }, {  7,  0,   292 },
+  {  7,  0,   561 }, {  8,  0,   257 }, {  8,  0,   382 }, {  9,  0,   721 },
+  {  9,  0,   778 }, { 11,  0,   581 }, { 12,  0,   466 }, {  4,  0,   486 },
+  {  5,  0,   491 }, {  7, 10,  1121 }, {  4,  0,    72 }, {  6,  0,   265 },
+  {  7,  0,  1300 }, {  7, 11,  1183 }, { 10, 10,   249 }, { 11, 10,   209 },
+  {  4, 10,   561 }, {  9, 11,   519 }, {  4, 11,   656 }, {  4, 10,   760 },
+  {  7, 11,   779 }, {  9, 10,   154 }, { 12, 10,   485 }, {  7, 11,  1793 },
+  {  7, 11,   144 }, {  8, 10,   255 }, {  5,  0,   621 }, {  4, 10,   368 },
+  {  7, 10,   641 }, {  7, 11,  1373 }, {  7, 11,   554 }, {  7, 11,   605 },
+  { 13, 11,    10 }, {  9,  0,   234 }, {  5,  0,   815 }, {  6,  0,  1688 },
+  {  6,  0,  1755 }, {  5, 11,   838 }, {  5, 11,   841 }, {  6, 11,  1649 },
+  {  7,  0,  1987 }, {  7,  0,  2040 }, {  8,  0,   743 }, {  5, 11,  1012 },
+  {  6,  0,   197 }, {  8,  0,   205 }, {  6,  0,   314 }, {  6, 11,   314 },
+  { 16, 11,    53 }, {  6, 11,   251 }, {  7, 11,   365 }, {  7, 11,  1357 },
+  {  7, 11,  1497 }, {  8, 11,   154 }, { 13, 11,   281 }, {  5, 11,   340 },
+  {  6,  0,   452 }, {  7,  0,   312 }, { 10,  0,   219 }, { 10,  0,   589 },
+  {  4,  0,   333 }, {  9,  0,   176 }, { 12,  0,   353 }, { 13,  0,   187 },
+  {  9, 10,    92 }, { 19, 10,    91 }, {  6,  0,  1110 }, { 11,  0,    47 },
+  { 11, 11,   495 }, {  6, 10,   525 }, {  8, 10,   806 }, {  9, 10,   876 },
+  { 12, 10,   284 }, {  8, 11,   261 }, {  9, 11,   144 }, {  9, 11,   466 },
+  { 10, 11,   370 }, { 12, 11,   470 }, { 13, 11,   144 }, { 14, 11,   348 },
+  {  9, 11,   897 }, {  8,  0,   863 }, {  8,  0,   864 }, {  8,  0,   868 },
+  {  8,  0,   884 }, { 10,  0,   866 }, { 10,  0,   868 }, { 10,  0,   873 },
+  { 10,  0,   911 }, { 10,  0,   912 }, { 10,  0,   944 }, { 12,  0,   727 },
+  {  6, 11,   248 }, {  9, 11,   546 }, { 10, 11,   535 }, { 11, 11,   681 },
+  { 13, 11,   135 }, {  6,  0,   300 }, {  7,  0,  1515 }, {  6,  0,  1237 },
+  { 11, 10,   958 }, {  5, 10,   594 }, { 12, 11,   250 }, {  6,  0,  1685 },
+  {  6, 11,   567 }, {  7,  0,   135 }, {  8,  0,     7 }, {  8,  0,    62 },
+  {  9,  0,   243 }, { 10,  0,   658 }, { 10,  0,   697 }, { 11,  0,   456 },
+  { 11,  0,   756 }, {  9,  0,   395 }, { 10,  0,    79 }, {  6, 10,  1641 },
+  {  8, 10,   820 }, {  4, 10,   302 }, {  7, 10,  1766 }, {  6, 11,   174 },
+  {  7, 10,  1313 }, {  7,  0,   631 }, {  6, 10,  1674 }, {  6, 11,   395 },
+  { 10,  0,   835 }, {  7,  0,   406 }, {  7,  0,   459 }, {  8,  0,   606 },
+  { 11,  0,   726 }, {  6, 11,   617 }, {  6,  0,   979 }, {  6, 10,   389 },
+  {  7, 10,   149 }, {  9, 10,   142 }, { 10, 10,    94 }, {  5, 11,   878 },
+  {  5, 11,   972 }, {  6, 10,     8 }, {  7, 10,  1881 }, {  8, 10,    91 },
+  {  8, 11,   511 }, {  5,  0,   612 }, {  4, 11,   351 }, {  4,  0,   372 },
+  {  7,  0,   482 }, {  8,  0,   158 }, {  9,  0,   602 }, {  9,  0,   615 },
+  { 10,  0,   245 }, { 10,  0,   678 }, { 10,  0,   744 }, { 11,  0,   248 },
+  { 11,  0,   806 }, {  5,  0,   854 }, {  7,  0,  1991 }, {  4, 11,   286 },
+  {  7, 11,   344 }, {  7, 11,   438 }, {  7, 11,   627 }, {  7, 11,  1516 },
+  {  8, 11,    40 }, {  9, 11,    56 }, {  9, 11,   294 }, { 10, 11,    30 },
+  { 10, 11,   259 }, { 11, 11,   969 }, { 18, 11,   148 }, {  7,  0,  1492 },
+  {  5, 11,   259 }, {  7, 11,   414 }, {  7, 11,   854 }, { 14, 11,   107 },
+  {  7, 10,  1746 }, {  6,  0,   833 }, {  6,  0,   998 }, {  7, 10,    24 },
+  {  6,  0,   750 }, {  7,  0,  1739 }, {  4, 10,   503 }, {  7, 10,  1661 },
+  {  5, 10,   130 }, {  7, 10,  1314 }, {  9, 10,   610 }, { 10, 10,   718 },
+  { 11, 10,   601 }, { 11, 10,   819 }, { 11, 10,   946 }, { 12, 10,   536 },
+  { 10, 10,   149 }, { 11, 10,   280 }, { 14, 10,   336 }, {  4, 11,   738 },
+  {  7, 10,  1946 }, {  5,  0,   195 }, {  7,  0,  1685 }, {  7,  0,  1997 },
+  {  8,  0,   730 }, { 11,  0,  1006 }, { 23, 11,    17 }, {  5, 11,   866 },
+  { 14,  0,   463 }, { 14,  0,   470 }, { 22,  0,    61 }, {  5,  0,   751 },
+  {  8,  0,   266 }, { 11,  0,   578 }, {  4, 10,   392 }, {  7, 10,  1597 },
+  {  5, 10,   433 }, {  9, 10,   633 }, { 11, 10,   629 }, {  7,  0,   821 },
+  {  6,  0,   715 }, {  6,  0,  1325 }, {  5, 11,   116 }, {  6,  0,   868 },
+  {  4, 11,   457 }, {  6,  0,   959 }, {  6, 10,   234 }, { 10, 11,   199 },
+  {  7,  0,  1053 }, {  7, 10,  1950 }, {  8, 10,   680 }, { 11, 10,   817 },
+  { 19, 10,    88 }, {  7, 10,  1222 }, { 10, 10,   386 }, {  5,  0,   950 },
+  {  5,  0,   994 }, {  6,  0,   351 }, {  6,  0,  1124 }, {  6,  0,  1081 },
+  {  7,  0,  1595 }, {  6, 10,     5 }, { 11, 10,   249 }, { 12, 10,   313 },
+  { 16, 10,    66 }, { 17, 10,    26 }, { 20,  0,    59 }, {  5, 11,   527 },
+  {  6, 11,   189 }, {  7, 11,   859 }, {  5, 10,   963 }, {  6, 10,  1773 },
+  { 11, 11,   104 }, { 11, 11,   554 }, { 15, 11,    60 }, { 15, 11,   125 },
+  {  7,  0,    47 }, {  9,  0,   684 }, {  6, 11,   116 }, {  6,  0,  1606 },
+  {  6,  0,   777 }, {  7,  0,  1020 }, {  8, 10,   509 }, {  8, 10,   792 },
+  {  7,  0,  1094 }, {  4,  0,   350 }, {  5, 11,   487 }, {  4, 11,    86 },
+  {  5, 11,   667 }, {  5, 11,   753 }, {  6, 11,   316 }, {  6, 11,   455 },
+  {  7, 11,   946 }, {  7,  0,  1812 }, { 13,  0,   259 }, { 13,  0,   356 },
+  { 14,  0,   242 }, { 19,  0,   114 }, {  4, 10,   931 }, {  5,  0,   967 },
+  {  4,  0,   473 }, {  7,  0,   623 }, {  8,  0,   808 }, {  9,  0,   871 },
+  {  9,  0,   893 }, { 11,  0,    38 }, { 11,  0,   431 }, { 12,  0,   112 },
+  { 12,  0,   217 }, { 12,  0,   243 }, { 12,  0,   562 }, { 12,  0,   663 },
+  { 12,  0,   683 }, { 13,  0,   141 }, { 13,  0,   197 }, { 13,  0,   227 },
+  { 13,  0,   406 }, { 13,  0,   487 }, { 14,  0,   156 }, { 14,  0,   203 },
+  { 14,  0,   224 }, { 14,  0,   256 }, { 18,  0,    58 }, { 22,  0,     0 },
+  { 10,  0,   286 }, {  7, 10,   943 }, { 11, 10,   614 }, {  7, 10,  1837 },
+  { 22, 11,    45 }, {  4,  0,   798 }, {  4,  0,   222 }, {  7,  0,   286 },
+  {  8,  0,   629 }, {  4, 11,    79 }, {  7, 11,  1773 }, { 10, 11,   450 },
+  { 11, 11,   589 }, { 13, 11,   332 }, { 13, 11,   493 }, { 14, 11,   183 },
+  { 14, 11,   334 }, { 14, 11,   362 }, { 14, 11,   368 }, { 14, 11,   376 },
+  { 14, 11,   379 }, { 19, 11,    90 }, { 19, 11,   103 }, { 19, 11,   127 },
+  { 20, 11,    90 }, {  5,  0,   337 }, { 11,  0,   513 }, { 11,  0,   889 },
+  { 11,  0,   961 }, { 12,  0,   461 }, { 13,  0,    79 }, { 15,  0,   121 },
+  {  4, 10,    90 }, {  5, 10,   545 }, {  7, 10,   754 }, {  9, 10,   186 },
+  { 10, 10,    72 }, { 10, 10,   782 }, { 11, 10,   577 }, { 11, 10,   610 },
+  { 12, 10,   354 }, { 12, 10,   362 }, { 12, 10,   595 }, { 13,  0,   306 },
+  {  8,  0,   146 }, {  7,  0,  1646 }, {  9, 10,   329 }, { 11, 10,   254 },
+  { 13, 11,   124 }, {  4,  0,   465 }, {  7,  0,  1663 }, {  4,  0,   525 },
+  {  5, 11,   663 }, { 10,  0,   299 }, { 18,  0,    74 }, {  9, 10,   187 },
+  { 11, 10,  1016 }, { 17, 10,    44 }, {  7,  0,   165 }, {  7,  0,   919 },
+  {  4, 10,   506 }, {  8, 10,   517 }, {  5, 10,   295 }, {  7, 10,  1680 },
+  {  5, 11,   846 }, {  6,  0,  1064 }, {  5, 11,   378 }, {  7, 11,  1402 },
+  {  7, 11,  1414 }, {  8, 11,   465 }, {  9, 11,   286 }, { 10, 11,   185 },
+  { 10, 11,   562 }, { 10, 11,   635 }, { 11, 11,    31 }, { 11, 11,   393 },
+  { 12, 11,   456 }, { 13, 11,   312 }, { 18, 11,    65 }, { 18, 11,    96 },
+  { 19, 11,    89 }, {  4,  0,   596 }, {  7, 10,   987 }, {  9, 10,   688 },
+  { 10, 10,   522 }, { 11, 10,   788 }, { 12, 10,   566 }, {  6,  0,    82 },
+  {  7,  0,   138 }, {  7,  0,   517 }, {  7,  0,  1741 }, { 11,  0,   238 },
+  {  4, 11,   648 }, {  6, 10,  1775 }, {  7,  0,  1233 }, {  7, 10,   700 },
+  {  7, 10,   940 }, {  8, 10,   514 }, {  9, 10,   116 }, {  9, 10,   535 },
+  { 10, 10,   118 }, { 11, 10,   107 }, { 11, 10,   148 }, { 11, 10,   922 },
+  { 12, 10,   254 }, { 12, 10,   421 }, { 14, 10,   238 }, {  4,  0,   962 },
+  {  6,  0,  1824 }, {  8,  0,   894 }, { 12,  0,   708 }, { 12,  0,   725 },
+  { 14,  0,   451 }, { 20,  0,    94 }, { 22,  0,    59 }, { 22,  0,    62 },
+  {  5, 11,   945 }, {  6, 11,  1656 }, {  6, 11,  1787 }, {  7, 11,   167 },
+  {  8, 11,   824 }, {  9, 11,   391 }, { 10, 11,   375 }, { 11, 11,   185 },
+  {  5,  0,   495 }, {  7,  0,   834 }, {  9,  0,   733 }, { 11,  0,   378 },
+  {  4, 10,   743 }, {  7, 11,  1273 }, {  6,  0,  1204 }, {  7, 11,  1645 },
+  {  8, 11,   352 }, {  9, 11,   249 }, { 11, 10,   292 }, {  5,  0,   559 },
+  {  4, 11,   152 }, {  9,  0,   499 }, { 10,  0,   341 }, { 15,  0,   144 },
+  { 19,  0,    49 }, {  7, 10,  1283 }, {  9, 10,   227 }, { 11, 10,   325 },
+  { 11, 10,   408 }, { 14, 10,   180 }, { 18, 10,    47 }, {  6,  0,    21 },
+  {  6,  0,  1737 }, {  7,  0,  1444 }, {  8,  0,   224 }, {  5, 11,  1006 },
+  {  7,  0,  1446 }, {  9,  0,    97 }, { 17,  0,    15 }, {  5, 10,    81 },
+  {  7, 10,   146 }, {  7, 10,  1342 }, {  8, 10,    53 }, {  8, 10,   561 },
+  {  8, 10,   694 }, {  8, 10,   754 }, {  9, 10,   115 }, {  9, 10,   894 },
+  { 10, 10,   462 }, { 10, 10,   813 }, { 11, 10,   230 }, { 11, 10,   657 },
+  { 11, 10,   699 }, { 11, 10,   748 }, { 12, 10,   119 }, { 12, 10,   200 },
+  { 12, 10,   283 }, { 14, 10,   273 }, {  5, 10,   408 }, {  9, 10,   747 },
+  {  7, 11,   431 }, {  7, 11,   832 }, {  6,  0,   729 }, {  6,  0,   953 },
+  {  4,  0,   727 }, {  8,  0,   565 }, {  5, 11,   351 }, {  7, 11,   264 },
+  {  8, 11,   565 }, {  6,  0,  1948 }, {  5,  0,   519 }, {  5, 11,    40 },
+  {  7, 11,   598 }, {  7, 11,  1638 }, {  8, 11,    78 }, {  9, 11,   166 },
+  {  9, 11,   640 }, {  9, 11,   685 }, {  9, 11,   773 }, { 11, 11,   215 },
+  { 13, 11,    65 }, { 14, 11,   172 }, { 14, 11,   317 }, { 17, 11,     6 },
+  {  8, 11,    60 }, {  9, 11,   343 }, { 11, 11,   769 }, {  9, 11,   455 },
+  {  6,  0,  1193 }, { 12,  0,   790 }, {  7, 11,  1951 }, {  8, 11,   765 },
+  {  8, 11,   772 }, { 12, 11,   671 }, {  7, 11,   108 }, {  8, 11,   219 },
+  {  8, 11,   388 }, {  9, 11,   639 }, {  9, 11,   775 }, { 11, 11,   275 },
+  { 12, 11,   464 }, {  4, 11,   468 }, {  7, 10,    30 }, {  8, 10,    86 },
+  {  8, 10,   315 }, {  8, 10,   700 }, {  9, 10,   576 }, {  9, 10,   858 },
+  { 11, 10,   310 }, { 11, 10,   888 }, { 11, 10,   904 }, { 12, 10,   361 },
+  { 13, 10,   248 }, {  5, 11,    15 }, {  6, 11,    56 }, {  7, 11,  1758 },
+  {  8, 11,   500 }, {  9, 11,   730 }, { 11, 11,   331 }, { 13, 11,   150 },
+  { 14, 11,   282 }, {  4,  0,   402 }, {  7,  0,     2 }, {  8,  0,   323 },
+  {  8,  0,   479 }, { 10, 10,   839 }, { 11,  0,   580 }, { 14,  0,   201 },
+  {  5,  0,    59 }, {  7,  0,   672 }, {  9, 10,   617 }, { 18,  0,    34 },
+  {  6, 11,  1886 }, {  4,  0,   961 }, {  8,  0,   896 }, {  6,  0,  1285 },
+  {  5, 11,   205 }, {  6, 11,   438 }, {  9, 11,   711 }, {  6, 10,   428 },
+  {  7, 10,   524 }, {  8, 10,   169 }, {  8, 10,   234 }, {  9, 10,   480 },
+  { 10, 10,   646 }, { 20,  0,    46 }, { 13,  0,   479 }, {  5, 11,   534 },
+  {  6,  0,  2019 }, {  6, 10,  1648 }, {  4,  0,    85 }, {  7,  0,   549 },
+  {  7, 10,  1205 }, { 10, 10,   637 }, {  4,  0,   663 }, {  5,  0,    94 },
+  {  7, 11,   235 }, {  7, 11,  1475 }, { 15, 11,    68 }, { 18, 11,   120 },
+  {  6, 11,   443 }, {  9, 11,   237 }, {  9, 11,   571 }, {  9, 11,   695 },
+  { 10, 11,   139 }, { 11, 11,   715 }, { 12, 11,   417 }, { 13, 11,   421 },
+  {  4,  0,   783 }, {  4,  0,   682 }, {  8,  0,    65 }, {  9, 10,    39 },
+  { 10, 10,   166 }, { 11, 10,   918 }, { 12, 10,   635 }, { 20, 10,    10 },
+  { 22, 10,    27 }, { 22, 10,    43 }, { 22, 10,    52 }, {  6,  0,    11 },
+  {  7,  0,   187 }, {  4,  0,   522 }, {  4,  0,    52 }, {  7,  0,   661 },
+  {  4,  0,   383 }, {  5,  0,   520 }, {  7, 11,   546 }, { 11,  0,   343 },
+  { 14,  0,   127 }, {  4, 11,   578 }, {  7, 10,   157 }, {  7, 11,   624 },
+  {  7, 11,   916 }, {  8, 10,   279 }, { 10, 11,   256 }, { 11, 11,    87 },
+  { 11, 11,   703 }, {  6, 10,   604 }, {  4,  0,   281 }, {  5,  0,    38 },
+  {  7,  0,   194 }, {  7,  0,   668 }, {  7,  0,  1893 }, {  9,  0,   397 },
+  {  7, 10,   945 }, { 11, 10,   713 }, { 11, 10,   744 }, { 11, 10,  1022 },
+  {  9,  0,   635 }, { 11,  0,   559 }, {  5, 11,   923 }, {  7, 11,   490 },
+  { 12, 11,   553 }, { 13, 11,   100 }, { 14, 11,   118 }, { 15, 11,    75 },
+  {  4,  0,   975 }, {  4, 10,   567 }, {  9, 10,   859 }, {  7, 10,  1846 },
+  {  7, 11,  1846 }, {  8, 10,   628 }, {  8, 11,   628 }, { 20,  0,   116 },
+  { 10, 11,   750 }, { 14,  0,    51 }, { 14, 11,    51 }, { 15, 11,     7 },
+  { 20, 11,    20 }, {  4,  0,   858 }, {  6,  0,  1075 }, {  4, 11,   924 },
+  {  5, 10,   762 }, {  8,  0,   535 }, {  5,  0,   448 }, { 10, 10,   784 },
+  { 13, 10,   191 }, {  5, 10,   298 }, {  7,  0,   610 }, {  7,  0,  1501 },
+  {  7, 10,   633 }, {  7, 10,   905 }, {  7, 10,   909 }, {  7, 10,  1538 },
+  {  9, 10,   767 }, { 12, 10,   636 }, {  4, 11,   265 }, {  7, 11,   807 },
+  {  7, 11,   950 }, {  5, 11,    93 }, { 12, 11,   267 }, { 16, 11,    26 },
+  {  8,  0,   191 }, { 11, 10,   301 }, {  7, 10,  1970 }, {  7,  0,   267 },
+  {  4,  0,   319 }, {  5,  0,   699 }, { 10,  0,   673 }, {  6,  0,   336 },
+  {  7,  0,    92 }, {  7,  0,   182 }, {  8,  0,   453 }, {  8,  0,   552 },
+  {  9,  0,   204 }, {  9,  0,   285 }, { 10,  0,    99 }, { 11,  0,   568 },
+  { 11,  0,   950 }, { 12,  0,    94 }, { 16,  0,    20 }, { 16,  0,    70 },
+  { 19,  0,    55 }, { 12, 10,   644 }, { 16, 10,    90 }, {  6,  0,   551 },
+  {  7,  0,  1308 }, {  7, 10,   845 }, {  7, 11,   994 }, {  8, 10,   160 },
+  {  9, 10,   318 }, { 19, 11,     1 }, { 19, 11,    26 }, { 22, 11,     9 },
+  {  7,  0,  1406 }, {  9,  0,   218 }, { 13,  0,   222 }, {  5,  0,   256 },
+  { 10,  0,    69 }, {  5, 11,   233 }, {  5, 11,   320 }, {  6, 11,   140 },
+  {  7, 11,   330 }, {  8, 11,   295 }, {  6,  0,  1980 }, {  8,  0,   952 },
+  {  4,  0,   833 }, {  9, 11,   678 }, {  5, 11,   978 }, {  4, 11,   905 },
+  {  6, 11,  1701 }, {  9, 11,   843 }, { 10, 10,   735 }, {  8, 10,    76 },
+  { 17,  0,    39 }, { 20,  0,    36 }, { 18,  0,    81 }, { 18, 11,    81 },
+  { 14,  0,   352 }, { 17,  0,    53 }, { 18,  0,   146 }, { 18,  0,   152 },
+  { 19,  0,    11 }, { 22,  0,    54 }, {  7,  0,   634 }, { 10, 10,   841 },
+  {  4,  0,   618 }, {  4,  0,   339 }, {  7,  0,   259 }, { 17,  0,    73 },
+  {  4, 11,   275 }, { 12, 11,   376 }, {  4, 11,   509 }, {  7, 11,   273 },
+  { 11, 11,   377 }, {  4,  0,   759 }, { 13,  0,   169 }, {  9, 10,   804 },
+  {  6, 10,    96 }, {  7, 10,  1426 }, {  4, 10,   651 }, {  5, 10,   289 },
+  {  7,  0,  1075 }, {  8, 10,    35 }, {  9, 10,   511 }, { 10, 10,   767 },
+  { 19, 10,   118 }, {  6,  0,   649 }, {  6,  0,   670 }, {  8,  0,   482 },
+  {  5,  0,   336 }, {  6,  0,   341 }, {  6,  0,   478 }, {  6,  0,  1763 },
+  {  8,  0,   386 }, {  5, 11,   802 }, {  7, 11,  2021 }, {  8, 11,   805 },
+  { 14, 11,    94 }, { 15, 11,    65 }, { 16, 11,     4 }, { 16, 11,    77 },
+  { 16, 11,    80 }, { 17, 11,     5 }, {  6,  0,  1035 }, {  5, 11,   167 },
+  {  5, 11,   899 }, {  6, 11,   410 }, {  9, 11,   777 }, {  6, 11,  1705 },
+  {  5,  0,   924 }, {  5,  0,   969 }, {  4, 10,   704 }, {  7,  0,    73 },
+  {  7, 11,    10 }, {  7, 10,  1078 }, {  5, 11,    11 }, {  6, 11,   117 },
+  {  6, 11,   485 }, {  7, 11,  1133 }, {  9, 11,   582 }, {  9, 11,   594 },
+  { 11, 11,    21 }, { 11, 11,   818 }, { 12, 11,   535 }, { 13, 11,    86 },
+  {  7,  0,  1971 }, {  4, 11,   264 }, {  7, 11,  1067 }, {  8, 11,   204 },
+  {  8, 11,   385 }, { 11, 11,   953 }, {  6,  0,  1458 }, {  7,  0,  1344 },
+  {  5,  0,   396 }, {  6,  0,   501 }, {  4, 10,   720 }, {  5, 10,   306 },
+  {  4,  0,   929 }, {  5,  0,   799 }, {  8,  0,    46 }, {  8,  0,   740 },
+  {  5, 10,   431 }, {  7, 11,   646 }, {  7, 11,  1730 }, { 11, 11,   446 },
+  { 13, 11,   178 }, {  7,  0,   276 }, {  5, 10,   464 }, {  6, 10,   236 },
+  {  7, 10,   696 }, {  7, 10,   914 }, {  7, 10,  1108 }, {  7, 10,  1448 },
+  {  9, 10,    15 }, {  9, 10,   564 }, { 10, 10,    14 }, { 12, 10,   565 },
+  { 13, 10,   449 }, { 14, 10,    53 }, { 15, 10,    13 }, { 16, 10,    64 },
+  { 17, 10,    41 }, {  4,  0,   892 }, {  5,  0,   770 }, {  6, 10,  1767 },
+  { 12, 10,   194 }, { 17, 10,   107 }, {  7,  0,   158 }, {  5, 10,   840 },
+  { 10, 11,   608 }, {  6,  0,  1432 }, { 10, 11,   250 }, {  8, 11,   794 },
+  {  9, 11,   400 }, { 10, 11,   298 }, { 14, 11,   228 }, { 23,  0,    25 },
+  {  7, 11,  1131 }, {  7, 11,  1468 }, {  7,  0,  2001 }, {  9, 10,   642 },
+  { 11, 10,   236 }, { 14, 10,   193 }, {  4, 10,    68 }, {  5, 10,   634 },
+  {  6, 10,   386 }, {  7, 10,   794 }, {  8, 10,   273 }, {  9, 10,   563 },
+  { 10, 10,   105 }, { 10, 10,   171 }, { 11, 10,    94 }, { 11, 10,   354 },
+  {  8, 11,   724 }, {  4,  0,   478 }, { 11, 11,   512 }, { 13, 11,   205 },
+  { 19, 11,    30 }, { 22, 11,    36 }, { 23, 11,    19 }, {  7,  0,  1461 },
+  { 12,  0,    91 }, {  6, 11,   190 }, {  7, 11,   768 }, {  7, 11,  1170 },
+  {  4,  0,   602 }, {  8,  0,   211 }, {  4, 10,    95 }, {  7, 10,   416 },
+  { 11, 10,   830 }, {  7, 10,   731 }, { 13, 10,    20 }, { 15, 10,    11 },
+  {  6,  0,  1068 }, {  7,  0,  1872 }, {  4,  0,    13 }, {  5,  0,   567 },
+  {  7,  0,  1498 }, {  9,  0,   124 }, { 11,  0,   521 }, { 12,  0,   405 },
+  {  7, 11,  1023 }, {  7,  0,  1006 }, {  4,  0,   735 }, { 10,  0,   812 },
+  {  4,  0,   170 }, {  7,  0,   323 }, {  6, 11,   137 }, {  9, 11,    75 },
+  {  9, 11,   253 }, { 10, 11,   194 }, { 10, 11,   444 }, {  5,  0,   304 },
+  {  7,  0,  1403 }, {  5, 10,   864 }, { 10, 10,   648 }, { 11, 10,   671 },
+  { 15, 10,    46 }, {  7, 11,  1180 }, {  5, 10,   928 }, {  4,  0,   148 },
+  {  5,  0,   742 }, { 11, 10,   986 }, { 12, 10,   682 }, {  5,  0,   523 },
+  {  7, 11,  1743 }, {  7,  0,   730 }, { 18,  0,   144 }, { 19,  0,    61 },
+  {  8, 10,    44 }, {  9, 10,   884 }, { 10, 10,   580 }, { 11, 10,   399 },
+  { 11, 10,   894 }, { 15, 10,   122 }, {  5, 11,   760 }, {  7, 11,   542 },
+  {  8, 11,   135 }, {  8, 11,   496 }, {  8,  0,   981 }, {  5,  0,   111 },
+  { 10,  0,   132 }, { 11,  0,   191 }, { 11,  0,   358 }, { 11,  0,   460 },
+  {  7, 11,   319 }, {  7, 11,   355 }, {  7, 11,   763 }, { 10, 11,   389 },
+  { 17, 11,    43 }, {  6,  0,   890 }, {  6,  0,  1420 }, {  8, 11,   557 },
+  {  5, 10,   518 }, {  5,  0,   444 }, {  7,  0,  1787 }, {  7, 10,  1852 },
+  {  8,  0,   123 }, { 15,  0,     6 }, { 16,  0,     7 }, {  6,  0,  2041 },
+  { 10, 11,    38 }, { 11, 11,   784 }, {  8,  0,   932 }, {  5,  0,   937 },
+  {  7,  0,   100 }, {  6,  0,   995 }, {  4, 11,    58 }, {  5, 11,   286 },
+  {  6, 11,   319 }, {  7, 11,   402 }, {  7, 11,  1254 }, {  7, 11,  1903 },
+  {  8, 11,   356 }, { 12, 11,   408 }, {  4, 11,   389 }, {  9, 11,   181 },
+  {  9, 11,   255 }, { 10, 11,     8 }, { 10, 11,    29 }, { 10, 11,   816 },
+  { 11, 11,   311 }, { 11, 11,   561 }, { 12, 11,    67 }, { 13, 11,   181 },
+  { 10,  0,   255 }, {  5,  0,   138 }, {  4, 10,   934 }, {  8, 10,   610 },
+  {  4,  0,   965 }, { 10,  0,   863 }, { 10,  0,   898 }, { 10, 10,   804 },
+  { 10, 10,   832 }, { 12,  0,   631 }, {  8, 10,    96 }, {  9, 10,    36 },
+  { 10, 10,   607 }, { 11, 10,   423 }, { 11, 10,   442 }, { 12, 10,   309 },
+  { 14, 10,   199 }, { 15, 10,    90 }, { 17, 10,   110 }, {  6,  0,  1394 },
+  {  4,  0,   652 }, {  8,  0,   320 }, { 22,  0,     6 }, { 22,  0,    16 },
+  {  9, 10,    13 }, {  9, 10,   398 }, {  9, 10,   727 }, { 10, 10,    75 },
+  { 10, 10,   184 }, { 10, 10,   230 }, { 10, 10,   564 }, { 10, 10,   569 },
+  { 11, 10,   973 }, { 12, 10,    70 }, { 12, 10,   189 }, { 13, 10,    57 },
+  { 13, 10,   257 }, {  6,  0,   897 }, {  6,  0,  1333 }, {  4,  0,   692 },
+  {  5,  0,   321 }, {  5, 11,   373 }, {  7,  0,   922 }, {  5,  0,   619 },
+  {  5,  0,   698 }, {  9, 10,   631 }, {  5, 10,   345 }, {  7, 10,  1016 },
+  {  9,  0,   957 }, {  9,  0,  1018 }, { 12,  0,   828 }, { 12,  0,   844 },
+  { 12,  0,   897 }, { 12,  0,   901 }, { 12,  0,   943 }, { 15,  0,   180 },
+  { 18,  0,   197 }, { 18,  0,   200 }, { 18,  0,   213 }, { 18,  0,   214 },
+  { 18,  0,   226 }, {  5,  0,   917 }, {  6,  0,  1659 }, {  7,  0,  1100 },
+  {  6,  0,  1173 }, {  6,  0,  1930 }, {  5,  0,   251 }, {  5,  0,   956 },
+  {  8,  0,   268 }, {  9,  0,   214 }, { 18,  0,   142 }, {  5, 10,   673 },
+  {  9, 10,   850 }, {  4, 10,   287 }, {  5, 10,  1018 }, {  4, 11,   672 },
+  {  5,  0,   346 }, {  5,  0,   711 }, {  8,  0,   390 }, { 11, 11,   752 },
+  { 11, 11,   885 }, {  5, 10,    34 }, { 10, 10,   724 }, { 12, 10,   444 },
+  { 13, 10,   354 }, { 18, 10,    32 }, { 23, 10,    24 }, { 23, 10,    31 },
+  { 24, 10,     5 }, {  4, 11,   710 }, {  6, 11,   606 }, {  6,  0,   744 },
+  {  6, 10,   382 }, {  5, 11,   145 }, {  4, 10,   329 }, {  7, 11,   884 },
+  { 12, 11,   124 }, {  4, 11,   467 }, {  5, 11,   405 }, {  6, 11,   544 },
+  {  9, 10,   846 }, { 10, 10,   827 }, {  5,  0,   624 }, {  9, 11,   372 },
+  { 15, 11,     2 }, { 19, 11,    10 }, { 19, 11,    18 }, {  4, 11,   387 },
+  {  7, 11,  1288 }, {  5,  0,   783 }, {  7,  0,  1998 }, {  7,  0,  2047 },
+  {  4, 10,   906 }, {  8, 10,   366 }, {  7, 11,   550 }, {  4, 10,   123 },
+  {  4, 10,   649 }, {  5, 10,   605 }, {  7, 10,  1509 }, {  8, 10,    36 },
+  {  6,  0,  1125 }, {  4,  0,   594 }, {  5, 10,   767 }, {  7, 11,  1227 },
+  {  8, 11,   467 }, {  4, 11,   576 }, {  7, 11,  1263 }, {  4,  0,   268 },
+  {  7,  0,  1534 }, {  7, 11,  1534 }, {  4, 10,   273 }, {  5, 10,   658 },
+  {  5, 11,   919 }, {  5, 10,   995 }, {  6, 11,  1673 }, {  5,  0,   563 },
+  {  6, 10,    72 }, {  7, 10,  1345 }, {  4, 11,    82 }, {  5, 11,   333 },
+  {  5, 11,   904 }, {  6, 11,   207 }, {  7, 11,   325 }, {  7, 11,  1726 },
+  {  8, 11,   101 }, { 10, 11,   778 }, { 11, 11,   220 }, {  5,  0,    37 },
+  {  6,  0,    39 }, {  6,  0,   451 }, {  7,  0,   218 }, {  7,  0,   667 },
+  {  7,  0,  1166 }, {  7,  0,  1687 }, {  8,  0,   662 }, { 16,  0,     2 },
+  {  5, 10,   589 }, {  6,  0,  1332 }, {  5, 11,   903 }, {  6,  0,   508 },
+  {  5, 10,   117 }, {  6, 10,   514 }, {  6, 10,   541 }, {  7, 10,  1164 },
+  {  7, 10,  1436 }, {  8, 10,   220 }, {  8, 10,   648 }, { 10, 10,   688 },
+  { 11, 10,   560 }, { 12, 11,   147 }, {  6, 11,   555 }, {  7, 11,   485 },
+  {  5, 10,   686 }, {  7,  0,   453 }, {  7,  0,   635 }, {  7,  0,   796 },
+  {  8,  0,   331 }, {  9,  0,   330 }, {  9,  0,   865 }, { 10,  0,   119 },
+  { 10,  0,   235 }, { 11,  0,   111 }, { 11,  0,   129 }, { 11,  0,   240 },
+  { 12,  0,    31 }, { 12,  0,    66 }, { 12,  0,   222 }, { 12,  0,   269 },
+  { 12,  0,   599 }, { 12,  0,   684 }, { 12,  0,   689 }, { 12,  0,   691 },
+  { 14,  0,   345 }, {  7,  0,  1834 }, {  4, 11,   705 }, {  7, 11,   615 },
+  { 10, 11,   251 }, {  8, 11,   345 }, {  9,  0,   527 }, {  6,  0,    98 },
+  {  7,  0,   702 }, {  7,  0,   991 }, { 11,  0,   576 }, { 14,  0,    74 },
+  {  7, 10,   196 }, { 10, 10,   765 }, { 11, 10,   347 }, { 11, 10,   552 },
+  { 11, 10,   790 }, { 12, 10,   263 }, { 13, 10,   246 }, { 13, 10,   270 },
+  { 13, 10,   395 }, { 14, 10,   176 }, { 14, 10,   190 }, { 14, 10,   398 },
+  { 14, 10,   412 }, { 15, 10,    32 }, { 15, 10,    63 }, { 16, 10,    88 },
+  { 19, 10,   105 }, {  6, 11,    90 }, { 13,  0,    84 }, { 13,  0,   122 },
+  {  6,  0,    37 }, {  7,  0,   299 }, {  7,  0,  1666 }, {  8,  0,   195 },
+  {  8,  0,   316 }, {  9,  0,   178 }, {  9,  0,   276 }, {  9,  0,   339 },
+  {  9,  0,   536 }, { 10,  0,   102 }, { 10,  0,   362 }, { 10,  0,   785 },
+  { 11,  0,    55 }, { 11,  0,   149 }, { 11,  0,   773 }, { 13,  0,   416 },
+  { 13,  0,   419 }, { 14,  0,    38 }, { 14,  0,    41 }, { 14,  0,   210 },
+  {  5, 10,   381 }, {  7, 10,  1792 }, {  7, 11,   813 }, { 12, 11,   497 },
+  { 13, 11,    56 }, {  7, 10,   616 }, { 10, 10,   413 }, {  5,  0,   645 },
+  {  6, 11,   125 }, {  7, 11,  1277 }, {  4,  0,   290 }, {  6,  0,    70 },
+  {  7,  0,  1292 }, { 10,  0,   762 }, { 11,  0,   288 }, {  6, 10,   120 },
+  {  7, 10,  1188 }, {  7, 10,  1710 }, {  8, 10,   286 }, {  9, 10,   667 },
+  { 11, 10,   592 }, { 11, 10,   730 }, {  7, 11,  1784 }, {  7,  0,  1315 },
+  {  7, 11,  1315 }, {  6,  0,  1955 }, {  7, 10,  1146 }, {  7,  0,   131 },
+  {  7,  0,   422 }, {  8,  0,   210 }, { 12,  0,   573 }, {  4, 10,   352 },
+  {  7, 10,   687 }, { 11,  0,   797 }, { 15,  0,    38 }, { 14,  0,   179 },
+  { 15,  0,   151 }, { 22,  0,    11 }, {  7,  0,   488 }, {  4, 10,   192 },
+  {  5, 10,    49 }, {  6, 10,   200 }, {  6, 10,   293 }, {  6, 10,  1696 },
+  {  4,  0,   936 }, {  7, 11,   703 }, {  6, 11,   160 }, {  7, 11,  1106 },
+  {  9, 11,   770 }, { 10, 11,   618 }, { 11, 11,   112 }, { 12, 11,   413 },
+  {  5,  0,   453 }, {  6,  0,   441 }, {  7,  0,   595 }, {  4, 10,   650 },
+  {  4, 10,   147 }, {  6,  0,   991 }, {  6,  0,  1182 }, { 12, 11,   271 },
+  { 17, 11,   109 }, {  5, 10,   934 }, { 12, 11,   221 }, {  4,  0,   653 },
+  {  7,  0,   505 }, {  7,  0,   523 }, {  6,  0,   903 }, {  7, 11,   479 },
+  {  7, 11,   304 }, {  9, 11,   646 }, {  9, 11,   862 }, { 10, 11,   262 },
+  { 11, 11,   696 }, { 12, 11,   208 }, { 15, 11,    79 }, { 19, 11,   108 },
+  { 18,  0,    80 }, {  7, 11,   981 }, { 14,  0,   432 }, {  4,  0,   314 },
+  {  9, 11,   152 }, {  7,  0,  1368 }, {  8,  0,   232 }, {  8,  0,   361 },
+  { 10,  0,   682 }, { 10,  0,   742 }, {  7, 11,  1586 }, {  9,  0,   534 },
+  {  4, 11,   434 }, { 11, 11,   663 }, { 12, 11,   210 }, { 13, 11,   166 },
+  { 13, 11,   310 }, { 14, 11,   373 }, { 19, 11,    43 }, {  7, 11,  1091 },
+  {  7, 11,  1765 }, {  6, 11,   550 }, {  7, 11,   652 }, {  9,  0,    27 },
+  { 14,  0,    12 }, {  4, 10,   637 }, {  5, 11,   553 }, {  7, 11,   766 },
+  { 10, 11,   824 }, {  7, 11,   737 }, {  8, 11,   298 }, {  8, 11,   452 },
+  {  7,  0,   736 }, { 11,  0,   264 }, {  6,  0,  1657 }, {  5, 11,   292 },
+  { 10, 11,   135 }, {  6,  0,   844 }, {  6,  0,  1117 }, {  7,  0,   127 },
+  {  9, 10,   867 }, { 10, 10,   837 }, {  6,  0,  1184 }, {  6,  0,  1208 },
+  {  6,  0,  1294 }, {  8,  0,   364 }, {  6,  0,  1415 }, {  7,  0,  1334 },
+  { 11,  0,   125 }, {  6, 10,   170 }, {  7, 11,   393 }, {  8, 10,   395 },
+  {  8, 10,   487 }, { 10, 11,   603 }, { 11, 11,   206 }, { 13, 10,   147 },
+  {  9, 11,   748 }, {  4, 11,   912 }, {  9, 11,   232 }, {  4, 10,   535 },
+  {  8, 10,   618 }, {  9,  0,   792 }, {  7, 11,  1973 }, {  8, 11,   716 },
+  {  7, 11,    98 }, {  5,  0,   909 }, {  9,  0,   849 }, { 10,  0,   805 },
+  {  4,  0,   630 }, {  4,  0,   699 }, {  5, 11,   733 }, { 14, 11,   103 },
+  { 22, 10,    23 }, { 12, 11,   158 }, { 18, 11,     8 }, { 19, 11,    62 },
+  { 20, 11,     6 }, { 22, 11,     4 }, { 23, 11,     2 }, { 23, 11,     9 },
+  {  4,  0,   968 }, {  4, 10,   778 }, {  4, 10,    46 }, {  5, 10,   811 },
+  {  6, 10,  1679 }, {  6, 10,  1714 }, {  7, 10,  2032 }, {  6,  0,  1446 },
+  {  7, 10,  1458 }, {  9, 10,   407 }, { 11, 10,    15 }, {  7,  0,   206 },
+  {  7,  0,   397 }, {  7,  0,   621 }, {  7,  0,   640 }, {  8,  0,   124 },
+  {  8,  0,   619 }, {  9,  0,   305 }, {  9,  0,   643 }, { 10,  0,   264 },
+  { 10,  0,   628 }, { 11,  0,    40 }, { 12,  0,   349 }, { 13,  0,   134 },
+  { 13,  0,   295 }, { 14,  0,   155 }, { 15,  0,   120 }, { 18,  0,   105 },
+  {  6, 10,    34 }, {  7, 10,  1089 }, {  8, 10,   708 }, {  8, 10,   721 },
+  {  9, 10,   363 }, { 20, 10,    98 }, {  4,  0,   262 }, {  5,  0,   641 },
+  {  7,  0,   342 }, {  9, 11,    72 }, {  4,  0,    99 }, {  6,  0,   250 },
+  {  6,  0,   346 }, {  8,  0,   127 }, { 10,  0,    81 }, {  4,  0,   915 },
+  {  5,  0,    75 }, {  9,  0,   517 }, { 10,  0,   470 }, { 12,  0,   155 },
+  { 13,  0,   224 }, {  4, 10,   462 }, { 11, 11,   600 }, { 11, 11,   670 },
+  { 13, 11,   245 }, { 14,  0,    83 }, {  5, 10,    73 }, {  6, 10,    23 },
+  {  6, 10,   338 }, {  6,  0,  1031 }, { 11, 11,   923 }, {  7, 11,   164 },
+  {  7, 11,  1571 }, {  9, 11,   107 }, { 12, 11,   225 }, {  6,  0,  1470 },
+  {  5,  0,   954 }, {  6,  0,   304 }, {  8,  0,   418 }, { 10,  0,   345 },
+  { 11,  0,   341 }, { 11,  0,   675 }, {  9,  0,   410 }, { 11,  0,   425 },
+  {  4, 11,    27 }, {  5, 11,   484 }, {  5, 11,   510 }, {  6, 11,   434 },
+  {  7, 11,  1000 }, {  7, 11,  1098 }, {  8, 11,     2 }, {  8, 11,   200 },
+  {  6,  0,   734 }, { 12, 11,   257 }, {  7, 10,   725 }, {  8, 10,   498 },
+  { 11, 10,   268 }, {  6,  0,  1822 }, {  7,  0,  1798 }, {  7, 10,   773 },
+  {  4, 11,   460 }, {  4, 11,   932 }, {  5, 11,   891 }, {  6,  0,    14 },
+  {  4, 10,   583 }, {  7, 10,  1462 }, {  8, 11,   625 }, { 11, 10,   659 },
+  {  5,  0,   113 }, {  6,  0,   243 }, {  6,  0,  1708 }, {  7,  0,  1865 },
+  { 11,  0,   161 }, { 16,  0,    37 }, { 17,  0,    99 }, {  5, 10,   220 },
+  {  6, 11,    76 }, {  5, 11,   461 }, {  7, 11,  1925 }, { 12,  0,    69 },
+  {  8, 11,    92 }, {  9, 11,   221 }, { 11, 10,   803 }, {  4, 10,   544 },
+  {  4,  0,   274 }, {  6,  0,   922 }, {  4,  0,   541 }, {  5,  0,   627 },
+  {  6, 10,   437 }, {  6, 10,   564 }, { 11, 10,   181 }, { 13, 10,   183 },
+  {  7, 10,  1192 }, {  7,  0,   166 }, {  4, 11,   763 }, {  5, 11,   253 },
+  {  6,  0,   849 }, {  9, 11,    73 }, { 10, 11,   110 }, { 14, 11,   185 },
+  { 17, 11,   119 }, {  5, 11,   212 }, { 12, 11,    35 }, { 13, 11,   382 },
+  {  5,  0,   717 }, {  9,  0,   304 }, {  8,  0,   600 }, {  5,  0,   654 },
+  {  6,  0,   273 }, { 10,  0,   188 }, { 13,  0,   377 }, { 18,  0,    77 },
+  {  4, 10,   790 }, {  5, 10,   273 }, {  6, 10,   394 }, {  4,  0,   543 },
+  {  7,  0,   410 }, { 11,  0,    98 }, { 11,  0,   524 }, { 13,  0,    87 },
+  {  4,  0,   941 }, {  7, 11,  1175 }, {  4,  0,   250 }, {  7,  0,  1612 },
+  { 11,  0,   186 }, { 12,  0,   133 }, {  6, 10,   127 }, {  7, 10,  1511 },
+  {  8, 10,   613 }, { 12, 10,   495 }, { 12, 10,   586 }, { 12, 10,   660 },
+  { 12, 10,   668 }, { 14, 10,   385 }, { 15, 10,   118 }, { 17, 10,    20 },
+  { 18, 10,    98 }, {  6,  0,  1785 }, {  5, 11,   816 }, {  6,  0,  1339 },
+  {  7,  0,   961 }, {  7,  0,  1085 }, {  7,  0,  1727 }, {  8,  0,   462 },
+  {  6, 10,   230 }, {  7, 11,  1727 }, {  9,  0,   636 }, {  7, 10,  1954 },
+  {  4,  0,   780 }, {  5, 11,   869 }, {  5, 11,   968 }, {  6, 11,  1626 },
+  {  8, 11,   734 }, {  8, 11,   784 }, {  4, 11,   542 }, {  6, 11,  1716 },
+  {  6, 11,  1727 }, {  7, 11,  1082 }, {  7, 11,  1545 }, {  8, 11,    56 },
+  {  8, 11,   118 }, {  8, 11,   412 }, {  8, 11,   564 }, {  9, 11,   888 },
+  {  9, 11,   908 }, { 10, 11,    50 }, { 10, 11,   423 }, { 11, 11,   685 },
+  { 11, 11,   697 }, { 11, 11,   933 }, { 12, 11,   299 }, { 13, 11,   126 },
+  { 13, 11,   136 }, { 13, 11,   170 }, { 13, 11,   190 }, {  6, 11,   226 },
+  {  4, 11,   232 }, {  9, 11,   202 }, { 10, 11,   474 }, { 12, 11,   433 },
+  {  9, 11,   500 }, {  5,  0,   529 }, {  8, 10,    68 }, {  4, 10,   654 },
+  {  4, 10,   156 }, {  7, 10,   998 }, {  7, 10,  1045 }, {  7, 10,  1860 },
+  {  9, 10,    48 }, {  9, 10,   692 }, { 11, 10,   419 }, { 11, 10,   602 },
+  {  7,  0,  1276 }, {  8,  0,   474 }, {  9,  0,   652 }, {  6, 11,   108 },
+  {  7, 11,  1003 }, {  7, 11,  1181 }, {  8, 11,   343 }, {  7, 11,  1264 },
+  {  7, 11,  1678 }, { 11, 11,   945 }, { 12, 11,   341 }, { 12, 11,   471 },
+  { 12, 11,   569 }, {  6, 11,  1712 }, {  5,  0,   948 }, { 12,  0,   468 },
+  { 19,  0,    96 }, { 20,  0,    24 }, {  4, 11,   133 }, {  7, 11,   711 },
+  {  7, 11,  1298 }, {  7, 11,  1585 }, {  7, 11,  1929 }, {  6,  0,   753 },
+  { 12,  0,   657 }, { 11,  0,   941 }, {  6, 11,    99 }, {  7, 11,  1808 },
+  { 17, 11,    57 }, {  6, 11,   574 }, {  7, 11,   428 }, {  7, 11,  1250 },
+  { 10, 11,   669 }, { 11, 11,   485 }, { 11, 11,   840 }, { 12, 11,   300 },
+  { 14, 11,   250 }, {  4,  0,   532 }, {  5,  0,   706 }, {  7,  0,   662 },
+  {  5,  0,   837 }, {  6,  0,  1651 }, { 11,  0,   985 }, {  7,  0,  1861 },
+  {  9, 10,   197 }, { 10, 10,   300 }, { 12, 10,   473 }, { 13, 10,    90 },
+  { 13, 10,   405 }, {  9, 11,   252 }, {  6, 11,   323 }, {  7, 11,  1564 },
+  {  4,  0,   330 }, {  4,  0,   863 }, {  7,  0,   933 }, {  7,  0,  2012 },
+  {  8,  0,   292 }, {  7, 11,   461 }, {  8, 11,   775 }, { 10, 11,   435 },
+  {  4, 10,   606 }, {  4, 11,   655 }, {  7, 11,   850 }, { 17, 11,    75 },
+  { 18, 11,   137 }, {  7,  0,   767 }, {  7, 10,  1978 }, {  8, 10,   676 },
+  {  4,  0,   641 }, {  7, 11,  1559 }, {  6,  0,  1233 }, {  9,  0,   242 },
+  { 17,  0,   114 }, {  4, 10,   361 }, {  5, 10,   315 }, {  9,  0,   883 },
+  {  4, 10,   461 }, { 10,  0,   274 }, {  6,  0,  2008 }, {  6,  0,  1794 },
+  {  4,  0,   703 }, {  7,  0,   207 }, { 12,  0,   285 }, {  4, 10,   472 },
+  {  4,  0,   571 }, {  5,  0,   873 }, {  5,  0,   960 }, {  8,  0,   823 },
+  {  9,  0,   881 }, {  8, 11,   577 }, {  7,  0,   617 }, { 10,  0,   498 },
+  { 11,  0,   501 }, { 12,  0,    16 }, { 12,  0,   150 }, { 10, 10,   747 },
+  {  4,  0,   431 }, {  5, 10,   155 }, { 11,  0,   283 }, { 11,  0,   567 },
+  {  7, 10,   163 }, {  8, 10,   319 }, {  9, 10,   402 }, { 10, 10,    24 },
+  { 10, 10,   681 }, { 11, 10,   200 }, { 12, 10,   253 }, { 12, 10,   410 },
+  { 14, 10,   219 }, {  4, 11,   413 }, {  5, 11,   677 }, {  8, 11,   432 },
+  { 12, 11,   280 }, {  9,  0,   401 }, {  5, 10,   475 }, {  7, 10,  1780 },
+  { 11, 10,   297 }, { 11, 10,   558 }, { 14, 10,   322 }, { 19, 10,    76 },
+  {  6,  0,   781 }, {  9,  0,   134 }, { 10,  0,     2 }, { 10,  0,    27 },
+  { 10,  0,   333 }, { 11,  0,   722 }, { 15,  0,     1 }, {  5,  0,    33 },
+  {  6,  0,   470 }, { 11,  0,   424 }, {  7,  0,  2006 }, { 12,  0,   783 },
+  {  7, 10,  1956 }, {  8,  0,   274 }, {  7,  0,  1882 }, {  4,  0,   794 },
+  {  7,  0,  1848 }, {  5, 10,   944 }, {  6, 10,  1769 }, {  6,  0,    47 },
+  {  7,  0,    90 }, {  7,  0,   664 }, {  7,  0,   830 }, {  7,  0,  1380 },
+  {  7,  0,  2025 }, {  8,  0,   448 }, {  8,  0,   828 }, {  4, 10,   144 },
+  {  6,  0,  1199 }, {  4, 11,   395 }, { 11, 11,   762 }, {  7, 11,  1504 },
+  {  9,  0,   417 }, {  9,  0,   493 }, {  9, 11,   174 }, { 10, 11,   164 },
+  { 11, 11,   440 }, { 11, 11,   841 }, { 15, 11,    98 }, {  6, 11,   426 },
+  { 11, 11,  1002 }, {  6,  0,   295 }, {  6,  0,   816 }, {  6, 10,   247 },
+  {  9, 10,   555 }, {  5,  0,  1019 }, {  4,  0,   620 }, {  5, 11,   476 },
+  { 10, 10,   280 }, { 10, 10,   797 }, { 11,  0,   464 }, {  5, 11,    76 },
+  {  6, 11,   458 }, {  6, 11,   497 }, {  7, 11,   764 }, {  7, 11,   868 },
+  {  9, 11,   658 }, { 10, 11,   594 }, { 11, 11,   173 }, { 11, 11,   566 },
+  { 12, 11,    20 }, { 12, 11,   338 }, { 13, 11,   200 }, {  6,  0,   208 },
+  {  4, 11,   526 }, {  7, 11,  1029 }, {  7, 11,  1054 }, {  4, 11,   636 },
+  {  6, 11,   233 }, {  7, 11,   660 }, {  7, 11,  1124 }, { 17, 11,    31 },
+  { 19, 11,    22 }, { 23, 11,    14 }, { 10,  0,   442 }, {  5, 10,   428 },
+  { 10,  0,   930 }, { 12,  0,   778 }, {  6,  0,    68 }, {  7,  0,   448 },
+  {  7,  0,  1629 }, {  7,  0,  1769 }, {  7,  0,  1813 }, {  8,  0,   442 },
+  {  8,  0,   516 }, {  9,  0,   710 }, { 10,  0,   282 }, { 10,  0,   722 },
+  {  7, 10,  1717 }, { 10, 10,   546 }, {  6,  0,  1128 }, { 11,  0,   844 },
+  { 12,  0,   104 }, { 12,  0,   625 }, {  4, 11,   432 }, {  7, 11,   824 },
+  { 10, 10,   189 }, {  5,  0,   787 }, {  5, 10,    99 }, {  4, 11,   279 },
+  {  7, 11,   301 }, {  9, 11,   362 }, {  8,  0,   491 }, {  4, 10,   397 },
+  {  8, 10,   555 }, {  4, 11,   178 }, {  5, 11,   399 }, {  6,  0,   711 },
+  { 16,  0,     9 }, {  4,  0,   403 }, {  5,  0,   441 }, {  7,  0,   450 },
+  { 10,  0,   840 }, { 11,  0,   101 }, { 12,  0,   193 }, { 13,  0,   430 },
+  {  7, 11,  1246 }, { 12, 10,   398 }, { 20, 10,    39 }, { 21, 10,    11 },
+  { 22, 10,    41 }, {  4, 10,   485 }, {  7, 10,   353 }, {  7, 10,  1523 },
+  {  6, 10,   366 }, {  7, 10,  1384 }, {  7, 10,  1601 }, {  7, 11,  1912 },
+  {  7,  0,   396 }, { 10,  0,   160 }, {  7, 11,   396 }, {  9, 10,   282 },
+  {  6, 11,  1692 }, {  4, 10,   157 }, {  5, 10,   471 }, {  6, 11,   202 },
+  { 10, 11,   448 }, { 11, 11,   208 }, { 12, 11,   360 }, { 17, 11,   117 },
+  { 17, 11,   118 }, { 18, 11,    27 }, { 20, 11,    67 }, {  5,  0,   679 },
+  {  9,  0,   326 }, {  8, 10,   116 }, {  7, 11,   872 }, { 10, 11,   516 },
+  { 11, 11,   167 }, {  4, 11,   224 }, {  5, 11,   546 }, {  7, 11,    35 },
+  {  8, 11,    11 }, {  8, 11,    12 }, {  9, 11,   315 }, {  9, 11,   533 },
+  { 10, 11,   802 }, { 11, 11,   166 }, { 12, 11,   525 }, { 14, 11,   243 },
+  {  7,  0,  1128 }, {  7, 11,  1920 }, {  5, 11,   241 }, {  8, 11,   242 },
+  {  9, 11,   451 }, { 10, 11,   667 }, { 11, 11,   598 }, { 12, 11,   429 },
+  {  6,  0,   737 }, {  5, 10,   160 }, {  7, 10,   363 }, {  7, 10,   589 },
+  { 10, 10,   170 }, { 13, 10,    55 }, {  7,  0,  1796 }, { 14, 11,   254 },
+  {  4,  0,   574 }, {  7,  0,   350 }, {  7,  0,  1024 }, {  8,  0,   338 },
+  {  9,  0,   677 }, { 10,  0,   808 }, {  6,  0,  1096 }, {  9, 11,   516 },
+  {  7,  0,   405 }, { 10,  0,   491 }, {  4, 10,   108 }, {  4, 11,   366 },
+  { 11, 10,   498 }, { 11, 11,   337 }, { 14, 11,   303 }, {  6, 11,  1736 },
+  {  7,  0,  1081 }, { 12, 11,   364 }, {  7, 10,  1005 }, { 12, 10,   609 },
+  {  7,  0,  1676 }, {  4, 10,   895 }, {  5, 10,   772 }, {  7,  0,  2037 },
+  {  6,  0,  1207 }, { 11, 11,   916 }, { 14, 11,   419 }, { 14, 11,   140 },
+  { 20, 11,    41 }, {  6, 11,   331 }, {  8, 11,   623 }, {  9,  0,   944 },
+  {  9,  0,   969 }, {  9,  0,  1022 }, { 12,  0,   913 }, { 12,  0,   936 },
+  { 15,  0,   177 }, { 15,  0,   193 }, {  4, 10,   926 }, {  5, 10,   983 },
+  {  5,  0,   354 }, {  7, 11,   506 }, {  8,  0,   598 }, {  9,  0,   664 },
+  { 10,  0,   441 }, {  4, 11,   640 }, {  5, 11,   513 }, {  9,  0,   297 },
+  {  4, 10,   538 }, {  6, 10,   294 }, {  7, 10,  1267 }, {  8, 10,   624 },
+  {  7,  0,  1772 }, {  7, 11,  1888 }, {  8, 11,   289 }, { 11, 11,    45 },
+  { 12, 11,   278 }, { 12, 11,   537 }, {  7, 10,  1325 }, { 10,  0,   751 },
+  { 13,  0,    37 }, {  6,  0,  1828 }, {  4, 10,   757 }, {  4, 11,   394 },
+  {  6,  0,   257 }, {  7,  0,  1522 }, {  4,  0,   582 }, {  9,  0,   191 },
+  {  7, 11,  1931 }, {  7, 11,   574 }, {  7, 11,  1719 }, {  9, 11,   145 },
+  {  4, 11,   658 }, { 10,  0,   790 }, {  4, 11,   369 }, {  9, 11,   781 },
+  { 10, 11,   144 }, { 11, 11,   385 }, { 13, 11,   161 }, { 13, 11,   228 },
+  { 13, 11,   268 }, { 20, 11,   107 }, {  8,  0,   469 }, { 10,  0,    47 },
+  {  8, 11,   374 }, {  6,  0,   306 }, {  7,  0,  1140 }, {  7,  0,  1340 },
+  {  8,  0,   133 }, { 10,  0,   449 }, { 11,  0,  1011 }, {  7, 10,  1875 },
+  { 11, 10,   124 }, {  4, 11,   344 }, {  6, 11,   498 }, { 11, 11,   323 },
+  {  9,  0,   299 }, {  4,  0,   837 }, {  5, 11,   906 }, {  5,  0,   329 },
+  {  8,  0,   260 }, { 10,  0,    10 }, {  6,  0,  1320 }, {  4,  0,   657 },
+  { 18,  0,   158 }, {  7,  0,  1191 }, { 24,  0,     7 }, {  6,  0,  1939 },
+  {  8,  0,   974 }, { 10,  0,   996 }, {  7,  0,  1665 }, { 11, 11,   126 },
+  { 11, 11,   287 }, { 15,  0,     8 }, { 14, 11,   149 }, { 14, 11,   399 },
+  { 15, 11,    57 }, {  5,  0,    66 }, {  7,  0,  1896 }, {  8,  0,   288 },
+  {  7,  0,   175 }, { 10,  0,   494 }, {  5, 10,   150 }, {  8, 10,   603 },
+  {  9, 10,   593 }, {  9, 10,   634 }, { 10, 10,   173 }, { 11, 10,   462 },
+  { 11, 10,   515 }, { 13, 10,   216 }, { 13, 10,   288 }, { 14, 10,   400 },
+  {  6,  0,  1643 }, {  8, 11,    21 }, {  4,  0,    21 }, {  5,  0,    91 },
+  {  5,  0,   648 }, {  5,  0,   750 }, {  5,  0,   781 }, {  6,  0,    54 },
+  {  6,  0,   112 }, {  6,  0,   402 }, {  6,  0,  1732 }, {  7,  0,   315 },
+  {  7,  0,   749 }, {  7,  0,  1427 }, {  7,  0,  1900 }, {  9,  0,    78 },
+  {  9,  0,   508 }, { 10,  0,   611 }, { 10,  0,   811 }, { 11,  0,   510 },
+  { 11,  0,   728 }, { 13,  0,    36 }, { 14,  0,    39 }, { 16,  0,    83 },
+  { 17,  0,   124 }, { 20,  0,    30 }, {  4,  0,   668 }, {  8,  0,   570 },
+  { 10,  0,   322 }, { 10,  0,   719 }, { 11,  0,   407 }, {  7, 11,  1381 },
+  {  8, 11,   193 }, { 12, 10,   108 }, { 13, 10,   291 }, {  4, 11,   616 },
+  {  8, 11,   692 }, {  8,  0,   125 }, {  8,  0,   369 }, {  8,  0,   524 },
+  { 10,  0,   486 }, { 11,  0,    13 }, { 11,  0,   381 }, { 11,  0,   736 },
+  { 11,  0,   766 }, { 11,  0,   845 }, { 13,  0,   114 }, { 13,  0,   292 },
+  { 14,  0,    47 }, {  6,  0,  1247 }, {  6,  0,  1684 }, {  6,  0,  1731 },
+  {  7,  0,   356 }, {  8,  0,    54 }, {  8,  0,   221 }, {  9,  0,   225 },
+  {  9,  0,   356 }, { 10,  0,    77 }, { 10,  0,   446 }, { 10,  0,   731 },
+  { 12,  0,   404 }, { 13,  0,   491 }, {  7, 10,  1777 }, {  4, 11,   305 },
+  {  4, 10,   493 }, { 16, 10,    55 }, {  4,  0,   951 }, {  6,  0,  1809 },
+  {  6,  0,  1849 }, {  8,  0,   846 }, {  8,  0,   866 }, {  8,  0,   899 },
+  { 10,  0,   896 }, { 12,  0,   694 }, { 14,  0,   468 }, {  5, 11,   214 },
+  {  7, 11,   603 }, {  8, 11,   611 }, {  9, 11,   686 }, { 10, 11,    88 },
+  { 11, 11,   459 }, { 11, 11,   496 }, { 12, 11,   463 }, { 12, 11,   590 },
+  { 13, 11,     0 }, { 14, 11,   214 }, {  4,  0,   411 }, {  4,  0,    80 },
+  {  5,  0,    44 }, { 12, 11,    74 }, { 15,  0,    31 }, {  7,  0,   669 },
+  {  6, 10,   568 }, {  7, 10,  1804 }, {  8, 10,   362 }, {  8, 10,   410 },
+  {  8, 10,   830 }, {  9, 10,   514 }, { 11, 10,   649 }, { 14, 10,   157 },
+  {  7,  0,   673 }, {  6, 11,  1703 }, {  4, 10,   625 }, {  6,  0,  1303 },
+  {  5,  0,   299 }, {  7,  0,  1083 }, { 10,  0,   704 }, {  6,  0,   275 },
+  {  7,  0,   408 }, {  6, 10,   158 }, {  7, 10,   129 }, {  7, 10,   181 },
+  {  8, 10,   276 }, {  8, 10,   377 }, { 10, 10,   523 }, { 11, 10,   816 },
+  { 12, 10,   455 }, { 13, 10,   303 }, { 14, 10,   135 }, {  4,  0,   219 },
+  {  7,  0,   367 }, {  7,  0,  1713 }, {  7,  0,  1761 }, {  9,  0,    86 },
+  {  9,  0,   537 }, { 10,  0,   165 }, { 12,  0,   219 }, { 12,  0,   561 },
+  {  8,  0,   216 }, {  4, 10,     1 }, {  4, 11,   737 }, {  6, 11,   317 },
+  {  7, 10,  1143 }, {  7, 10,  1463 }, {  9, 10,   207 }, {  9, 10,   390 },
+  {  9, 10,   467 }, { 10, 11,    98 }, { 11, 11,   294 }, { 11, 10,   836 },
+  { 12, 11,    60 }, { 12, 11,   437 }, { 13, 11,    64 }, { 13, 11,   380 },
+  { 14, 11,   430 }, {  6, 11,  1758 }, {  8, 11,   520 }, {  9, 11,   345 },
+  {  9, 11,   403 }, { 14, 11,   350 }, {  5, 11,    47 }, { 10, 11,   242 },
+  { 10, 11,   579 }, {  5, 11,   139 }, {  7, 11,  1168 }, { 10, 11,   539 },
+  {  7,  0,  1319 }, {  4, 10,   295 }, {  4, 10,   723 }, {  5, 10,   895 },
+  {  7, 10,  1031 }, {  8, 10,   199 }, {  8, 10,   340 }, {  9, 10,   153 },
+  {  9, 10,   215 }, { 10, 10,    21 }, { 10, 10,    59 }, { 10, 10,    80 },
+  { 10, 10,   224 }, { 10, 10,   838 }, { 11, 10,   229 }, { 11, 10,   652 },
+  { 12, 10,   192 }, { 13, 10,   146 }, { 14, 10,    91 }, { 12,  0,   428 },
+  {  9, 10,    51 }, {  5,  0,   514 }, {  5, 10,   309 }, { 12, 10,   211 },
+  {  6,  0,  1010 }, {  5, 10,   125 }, {  8, 10,    77 }, { 10, 10,    15 },
+  {  4,  0,    55 }, {  5,  0,   301 }, {  6,  0,   571 }, { 14,  0,    49 },
+  { 18,  0,   102 }, {  8, 11,   370 }, {  4, 11,   107 }, {  7, 11,   613 },
+  {  8, 11,   358 }, {  8, 11,   439 }, {  8, 11,   504 }, {  9, 11,   501 },
+  { 10, 11,   383 }, { 11, 11,   477 }, {  4, 11,   229 }, {  5,  0,   364 },
+  {  5, 10,   439 }, {  4, 11,   903 }, {  7, 11,  1816 }, { 11,  0,   379 },
+  { 12, 10,    76 }, {  4,  0,    76 }, {  4,  0,   971 }, {  7,  0,  1550 },
+  {  9,  0,   306 }, {  9,  0,   430 }, {  9,  0,   663 }, { 10,  0,   683 },
+  { 10,  0,   921 }, { 11,  0,   427 }, { 11,  0,   753 }, { 12,  0,   334 },
+  { 12,  0,   442 }, { 14,  0,   258 }, { 14,  0,   366 }, { 15,  0,   131 },
+  {  9,  0,    52 }, {  4, 11,    47 }, {  6, 11,   373 }, {  7, 11,   452 },
+  {  7, 11,   543 }, {  7, 11,  1714 }, {  7, 11,  1856 }, {  9, 11,     6 },
+  { 11, 11,   257 }, { 11, 11,   391 }, {  4, 10,     8 }, {  7, 10,  1152 },
+  {  7, 10,  1153 }, {  7, 10,  1715 }, {  9, 10,   374 }, { 10, 10,   478 },
+  { 11, 10,   648 }, {  4, 11,   785 }, {  5, 11,   368 }, {  7, 10,  1099 },
+  {  7, 11,   860 }, {  5, 11,   980 }, {  6, 11,  1754 }, {  6,  0,  1258 },
+  {  6,  0,  1058 }, {  6,  0,  1359 }, {  7, 11,   536 }, {  7, 11,  1331 },
+  {  8, 11,   143 }, {  4,  0,   656 }, {  7,  0,   779 }, {  8, 10,    87 },
+  {  5, 11,    19 }, {  6, 11,   533 }, { 18, 11,   126 }, {  7,  0,   144 },
+  { 10, 10,   438 }, {  5, 11,   395 }, {  5, 11,   951 }, {  6, 11,  1776 },
+  {  7,  0,  1373 }, {  7,  0,   554 }, {  7,  0,   605 }, { 13,  0,    10 },
+  {  4, 10,    69 }, {  5, 10,   122 }, {  9, 10,   656 }, { 10, 10,   464 },
+  {  5, 10,   849 }, {  6, 10,  1633 }, {  5,  0,   838 }, {  5,  0,   841 },
+  {  6,  0,  1649 }, {  5,  0,  1012 }, { 11, 10,   499 }, {  7, 10,   476 },
+  {  7, 10,  1592 }, { 10, 10,    87 }, {  6,  0,   251 }, {  7,  0,   365 },
+  {  7,  0,  1357 }, {  7,  0,  1497 }, {  8,  0,   154 }, { 13,  0,   281 },
+  {  4, 11,   441 }, {  4, 11,   695 }, {  7, 11,   497 }, {  9, 11,   387 },
+  { 19, 11,    81 }, {  5,  0,   340 }, { 14, 10,   283 }, { 14, 11,   283 },
+  {  6,  0,   810 }, {  7, 11,  1894 }, { 11,  0,   495 }, {  5, 11,   284 },
+  {  6, 11,    49 }, {  6, 11,   350 }, {  7, 11,     1 }, {  7, 11,   377 },
+  {  7, 11,  1693 }, {  8, 11,    18 }, {  8, 11,   678 }, {  9, 11,   161 },
+  {  9, 11,   585 }, {  9, 11,   671 }, {  9, 11,   839 }, { 11, 11,   912 },
+  { 13, 11,   427 }, {  5, 10,   859 }, {  7, 10,  1160 }, {  8, 10,   107 },
+  {  9, 10,   291 }, {  9, 10,   439 }, { 10, 10,   663 }, { 11, 10,   609 },
+  { 12, 10,   197 }, {  8,  0,   261 }, {  9,  0,   144 }, {  9,  0,   466 },
+  { 10,  0,   370 }, { 12,  0,   470 }, { 13,  0,   144 }, { 14,  0,   348 },
+  {  9,  0,   897 }, {  6,  0,   248 }, {  9,  0,   546 }, { 10,  0,   535 },
+  { 11,  0,   681 }, { 13,  0,   135 }, {  4,  0,   358 }, {  7,  0,  1496 },
+  {  6,  0,   567 }, {  8,  0,   445 }, {  4, 10,   117 }, {  6, 10,   372 },
+  {  7, 10,  1905 }, { 14, 10,   323 }, {  4, 10,   722 }, { 11, 10,   471 },
+  {  6,  0,   697 }, {  6,  0,   996 }, {  7, 11,  2007 }, {  9, 11,   101 },
+  {  9, 11,   450 }, { 10, 11,    66 }, { 10, 11,   842 }, { 11, 11,   536 },
+  { 12, 11,   587 }, {  4,  0,   577 }, {  6,  0,  1336 }, {  9, 10,     5 },
+  { 12, 10,   216 }, { 12, 10,   294 }, { 12, 10,   298 }, { 12, 10,   400 },
+  { 12, 10,   518 }, { 13, 10,   229 }, { 15, 10,   139 }, {  6,  0,   174 },
+  { 10,  0,   917 }, {  6, 10,  1774 }, {  5, 10,    12 }, {  7, 10,   375 },
+  {  9, 10,    88 }, {  9, 10,   438 }, { 11, 11,    62 }, { 11, 10,   270 },
+  {  6, 11,  1766 }, {  6, 11,     0 }, {  7, 11,    84 }, {  7, 10,   816 },
+  {  7, 10,  1241 }, {  9, 10,   283 }, {  9, 10,   520 }, { 10, 10,   213 },
+  { 10, 10,   307 }, { 10, 10,   463 }, { 10, 10,   671 }, { 10, 10,   746 },
+  { 11, 10,   401 }, { 11, 10,   794 }, { 11, 11,   895 }, { 12, 10,   517 },
+  { 17, 11,    11 }, { 18, 10,   107 }, { 19, 10,   115 }, {  5,  0,   878 },
+  {  5,  0,   972 }, {  6, 11,  1665 }, {  7, 11,   256 }, {  7, 11,  1388 },
+  { 10, 11,   499 }, {  4, 10,   258 }, {  8, 10,   639 }, {  4, 11,    22 },
+  {  5, 11,    10 }, {  6, 10,    22 }, {  7, 11,   848 }, {  7, 10,   903 },
+  {  7, 10,  1963 }, {  8, 11,    97 }, { 10, 10,   577 }, {  5, 10,   681 },
+  {  8, 10,   782 }, {  5, 11,   481 }, {  4,  0,   351 }, {  4, 10,   664 },
+  {  5, 10,   804 }, { 11, 10,  1013 }, {  6, 11,   134 }, {  7, 11,   437 },
+  {  7, 11,   959 }, {  9, 11,    37 }, { 14, 11,   285 }, { 14, 11,   371 },
+  { 16, 11,    60 }, {  7, 11,   486 }, {  8, 11,   155 }, { 11, 11,    93 },
+  { 12, 11,   164 }, {  4,  0,   286 }, {  7,  0,   438 }, {  7,  0,   627 },
+  {  7,  0,  1516 }, {  8,  0,    40 }, {  9,  0,    56 }, {  9,  0,   294 },
+  { 10,  0,    30 }, { 11,  0,   969 }, { 11,  0,   995 }, { 18,  0,   148 },
+  {  5, 11,   591 }, {  7, 11,   337 }, {  6,  0,  1950 }, {  5, 10,    32 },
+  { 10, 11,   500 }, {  5, 11,   380 }, {  5, 11,   650 }, {  8, 11,   310 },
+  {  4, 11,   364 }, {  7, 11,  1156 }, {  7, 11,  1187 }, {  9, 11,   409 },
+  {  4,  0,   738 }, {  6, 11,   482 }, {  4, 11,   781 }, {  6, 11,   487 },
+  {  7, 11,   926 }, {  8, 11,   263 }, { 11, 11,   500 }, {  7, 11,   418 },
+  {  6,  0,  2047 }, { 10,  0,   969 }, {  4, 10,   289 }, {  7, 10,   629 },
+  {  7, 10,  1698 }, {  7, 10,  1711 }, { 12, 10,   215 }, {  6, 10,   450 },
+  {  8, 10,   109 }, {  6,  0,   818 }, {  8, 10,   705 }, {  5,  0,   866 },
+  {  4, 11,    94 }, {  7, 11,  1265 }, {  4, 11,   417 }, {  6,  0,  1467 },
+  {  7, 10,  1238 }, {  4,  0,   972 }, {  6,  0,  1851 }, {  6,  0,  1857 },
+  {  6,  0,   355 }, {  5,  0,   116 }, {  4,  0,   457 }, {  7, 11,  1411 },
+  {  4, 11,   408 }, {  4, 11,   741 }, {  7, 11,   500 }, {  6, 10,    26 },
+  { 14, 11,   137 }, {  5,  0,   527 }, {  6,  0,   189 }, {  7,  0,   859 },
+  {  8,  0,   267 }, { 11,  0,   104 }, { 11,  0,   554 }, { 15,  0,    60 },
+  { 15,  0,   125 }, {  6,  0,  1613 }, {  4, 10,   414 }, {  5, 10,   467 },
+  {  9, 10,   654 }, { 10, 10,   451 }, { 12, 10,    59 }, { 13, 10,   375 },
+  {  7, 10,    17 }, {  6,  0,   116 }, {  7, 11,   541 }, {  7, 10,   955 },
+  {  6, 11,    73 }, {  7, 11,   177 }, {  5, 11,   576 }, {  6,  0,   886 },
+  {  5,  0,   487 }, {  4,  0,    86 }, {  5,  0,   667 }, {  5,  0,   753 },
+  {  6,  0,   316 }, {  6,  0,   455 }, {  7,  0,   946 }, { 14, 11,   231 },
+  { 22,  0,    45 }, {  6,  0,   863 }, {  6,  0,  1953 }, {  6, 10,   280 },
+  { 10, 10,   502 }, { 11, 10,   344 }, { 12, 10,    38 }, {  4,  0,    79 },
+  {  7,  0,  1773 }, { 10,  0,   450 }, { 11,  0,   589 }, { 13,  0,   332 },
+  { 13,  0,   493 }, { 14,  0,   183 }, { 14,  0,   334 }, { 14,  0,   362 },
+  { 14,  0,   368 }, { 14,  0,   376 }, { 14,  0,   379 }, { 19,  0,    90 },
+  { 19,  0,   103 }, { 19,  0,   127 }, { 20,  0,    90 }, {  5, 10,    45 },
+  {  7, 10,  1161 }, { 11, 10,   448 }, { 11, 10,   880 }, { 13, 10,   139 },
+  { 13, 10,   407 }, { 15, 10,    16 }, { 17, 10,    95 }, { 18, 10,    66 },
+  { 18, 10,    88 }, { 18, 10,   123 }, { 21, 10,     7 }, {  8, 10,   777 },
+  {  4, 10,   410 }, {  7, 10,   521 }, {  7, 10,  1778 }, {  7, 11,   538 },
+  { 14,  0,   381 }, {  5, 11,   413 }, {  6,  0,  1142 }, {  6,  0,  1189 },
+  {  8, 11,   495 }, {  5,  0,   663 }, {  6,  0,  1962 }, {  6,  0,  2003 },
+  {  7, 11,    54 }, {  8, 11,   312 }, { 10, 11,   191 }, { 10, 11,   614 },
+  { 12, 11,   567 }, {  4, 10,   436 }, {  5,  0,   846 }, { 10,  0,   528 },
+  { 11,  0,   504 }, {  7, 10,  1587 }, {  7, 10,  1707 }, {  5,  0,   378 },
+  {  8,  0,   465 }, {  9,  0,   286 }, { 10,  0,   185 }, { 10,  0,   562 },
+  { 10,  0,   635 }, { 11,  0,    31 }, { 11,  0,   393 }, { 13,  0,   312 },
+  { 18,  0,    65 }, { 18,  0,    96 }, { 19,  0,    89 }, {  7,  0,   899 },
+  { 14,  0,   325 }, {  6, 11,   468 }, {  7, 11,   567 }, {  7, 11,  1478 },
+  {  8, 11,   530 }, { 14, 11,   290 }, {  7,  0,  1880 }, {  9,  0,   680 },
+  { 11,  0,   798 }, {  6,  0,  1770 }, {  4,  0,   648 }, { 22, 11,    35 },
+  {  5,  0,   945 }, {  6,  0,  1656 }, {  6,  0,  1787 }, {  7,  0,   167 },
+  {  8,  0,   824 }, {  9,  0,   391 }, { 10,  0,   375 }, { 11,  0,   185 },
+  {  6, 11,   484 }, {  7, 11,   822 }, {  6,  0,  2046 }, {  7,  0,  1645 },
+  {  8,  0,   352 }, {  9,  0,   249 }, {  4,  0,   152 }, {  6,  0,   611 },
+  {  7,  0,  1733 }, {  6, 11,  1724 }, {  7, 11,  2022 }, {  5,  0,  1006 },
+  { 13, 11,    96 }, {  5,  0,   420 }, {  7,  0,  1449 }, { 18, 11,   149 },
+  {  7,  0,   832 }, {  7, 10,   663 }, {  5,  0,   351 }, {  5,  0,    40 },
+  {  7,  0,   598 }, {  7,  0,  1638 }, {  8,  0,    78 }, {  9,  0,   166 },
+  {  9,  0,   640 }, {  9,  0,   685 }, {  9,  0,   773 }, { 11,  0,   215 },
+  { 13,  0,    65 }, { 14,  0,   172 }, { 14,  0,   317 }, { 17,  0,     6 },
+  {  8,  0,    60 }, {  9,  0,   343 }, { 11,  0,   769 }, {  6,  0,  1354 },
+  {  4,  0,   724 }, {  9,  0,   745 }, {  4, 11,   474 }, {  7,  0,  1951 },
+  {  8,  0,   765 }, {  8,  0,   772 }, { 12,  0,   671 }, {  7,  0,   108 },
+  {  8,  0,   219 }, {  8,  0,   388 }, {  9,  0,   775 }, { 11,  0,   275 },
+  { 12,  0,   464 }, {  9,  0,   639 }, {  7, 10,   503 }, {  5, 11,   366 },
+  {  5,  0,    15 }, {  6,  0,    56 }, {  7,  0,  1758 }, {  8,  0,   500 },
+  {  9,  0,   730 }, { 11,  0,   331 }, { 13,  0,   150 }, { 14,  0,   282 },
+  {  5, 11,   305 }, {  9, 11,   560 }, { 13, 11,   208 }, {  4, 10,   113 },
+  {  5, 10,   163 }, {  5, 10,   735 }, {  7, 10,  1009 }, {  9, 10,     9 },
+  {  9, 10,   771 }, { 12, 10,    90 }, { 13, 10,   138 }, { 13, 10,   410 },
+  { 15, 10,   128 }, {  4, 10,   324 }, { 10, 10,   104 }, {  7, 11,   466 },
+  { 14, 11,    27 }, {  6,  0,  1886 }, {  5,  0,   205 }, {  6,  0,   438 },
+  {  9,  0,   711 }, {  4, 11,   480 }, {  6, 11,   167 }, {  6, 11,   302 },
+  {  6, 11,  1642 }, {  7, 11,   130 }, {  7, 11,   656 }, {  7, 11,   837 },
+  {  7, 11,  1547 }, {  7, 11,  1657 }, {  8, 11,   429 }, {  9, 11,   228 },
+  { 10, 11,   643 }, { 13, 11,   289 }, { 13, 11,   343 }, { 19, 11,   101 },
+  {  6,  0,   865 }, {  6,  0,  2025 }, {  8,  0,   965 }, {  7, 11,   278 },
+  { 10, 11,   739 }, { 11, 11,   708 }, { 13, 11,   348 }, {  5,  0,   534 },
+  {  7, 11,  1922 }, {  9,  0,   691 }, {  4, 10,   935 }, {  5, 10,   823 },
+  {  6,  0,   443 }, {  9,  0,   237 }, {  9,  0,   571 }, {  9,  0,   695 },
+  { 10,  0,   139 }, { 11,  0,   715 }, { 12,  0,   417 }, { 13,  0,   421 },
+  {  5, 10,   269 }, {  7, 10,   434 }, {  7, 10,   891 }, {  8, 10,   339 },
+  {  9, 10,   702 }, { 11, 10,   594 }, { 11, 10,   718 }, { 17, 10,   100 },
+  {  6,  0,  1555 }, {  7,  0,   878 }, {  9, 10,   485 }, { 13, 10,   264 },
+  {  6, 10,  1713 }, {  7, 10,  1810 }, { 11, 10,   866 }, { 12, 10,   103 },
+  { 13, 10,   495 }, {  7, 10,   900 }, {  6,  0,  1410 }, {  9, 11,   316 },
+  { 11, 11,   256 }, {  4,  0,   995 }, {  7,  0,  1033 }, {  4,  0,   578 },
+  { 10,  0,   881 }, { 12,  0,   740 }, { 12,  0,   743 }, { 12,  0,   759 },
+  {  4,  0,   822 }, {  5,  0,   923 }, { 14, 10,   143 }, {  7, 11,  1696 },
+  {  6, 11,   363 }, {  7, 11,  1955 }, {  8, 11,   725 }, {  4,  0,   924 },
+  {  5,  0,   665 }, {  7, 10,  2029 }, {  7,  0,  1901 }, {  4,  0,   265 },
+  {  6,  0,  1092 }, {  6,  0,  1417 }, {  7,  0,   807 }, {  7,  0,   950 },
+  {  5,  0,    93 }, { 12,  0,   267 }, { 13,  0,   498 }, {  7,  0,  1451 },
+  {  5, 11,   813 }, {  7, 11,  2046 }, {  5, 10,   625 }, {  7, 10,  1617 },
+  {  7,  0,   747 }, {  6,  0,   788 }, {  9,  0,   828 }, {  7,  0,   184 },
+  { 11,  0,   307 }, { 11,  0,   400 }, { 15,  0,   130 }, {  5, 11,   712 },
+  {  7, 11,  1855 }, {  8, 10,   425 }, {  8, 10,   693 }, {  9, 10,   720 },
+  { 10, 10,   380 }, { 10, 10,   638 }, { 11, 11,    17 }, { 11, 10,   473 },
+  { 12, 10,    61 }, { 13, 11,   321 }, { 16, 11,    67 }, {  7,  0,   198 },
+  {  6, 11,   320 }, {  7, 11,   781 }, {  7, 11,  1921 }, {  9, 11,    55 },
+  { 10, 11,   186 }, { 10, 11,   273 }, { 10, 11,   664 }, { 10, 11,   801 },
+  { 11, 11,   996 }, { 11, 11,   997 }, { 13, 11,   157 }, { 14, 11,   170 },
+  {  8, 11,   271 }, {  7,  0,   994 }, {  7, 11,   103 }, {  7, 11,   863 },
+  { 11, 11,   184 }, { 14, 11,   299 }, { 17, 11,    62 }, { 11, 10,   551 },
+  { 14, 10,   159 }, {  5,  0,   233 }, {  5,  0,   320 }, {  6,  0,   140 },
+  {  8,  0,   295 }, {  8,  0,   615 }, {  8, 11,   615 }, {  5,  0,   978 },
+  {  4,  0,   905 }, {  6,  0,  1701 }, {  9,  0,   843 }, {  4, 10,   168 },
+  {  4,  0,   974 }, {  8,  0,   850 }, { 12,  0,   709 }, { 12,  0,   768 },
+  { 12,  0,   786 }, {  7, 10,    91 }, { 24,  0,     6 }, { 10, 10,   532 },
+  {  7, 10,  1884 }, {  4,  0,   509 }, {  6,  0,  1307 }, {  7,  0,   273 },
+  {  5, 11,    77 }, {  7, 11,  1455 }, { 10, 11,   843 }, { 19, 11,    73 },
+  { 22, 11,     5 }, {  4, 11,   458 }, {  7, 11,  1420 }, {  6, 11,   109 },
+  { 10, 11,   382 }, {  6,  0,   201 }, {  6, 11,   330 }, {  7, 10,    70 },
+  {  7, 11,  1084 }, { 10, 10,   240 }, { 11, 11,   142 }, { 19, 10,    93 },
+  {  7,  0,  1041 }, { 12, 11,   328 }, {  5, 11,   354 }, {  6,  0,  1040 },
+  {  5,  0,   693 }, {  6,  0,   774 }, { 11,  0,   234 }, {  4,  0,   336 },
+  {  7,  0,  1399 }, { 11, 10,   392 }, { 20,  0,    22 }, { 20, 11,    22 },
+  {  5,  0,   802 }, {  7,  0,  2021 }, {  8,  0,   805 }, {  5,  0,   167 },
+  {  5,  0,   899 }, {  6,  0,   410 }, {  9,  0,   777 }, {  9,  0,   789 },
+  {  6,  0,  1705 }, {  7, 10,   655 }, {  7, 10,  1844 }, {  4, 10,   145 },
+  {  6, 10,   176 }, {  7, 10,   395 }, {  9, 10,   562 }, {  4, 10,   501 },
+  {  7,  0,    10 }, {  5,  0,    11 }, {  6,  0,   117 }, {  6,  0,   485 },
+  {  7,  0,  1133 }, {  9,  0,   582 }, {  9,  0,   594 }, { 10,  0,    82 },
+  { 11,  0,    21 }, { 11,  0,   818 }, { 12,  0,   535 }, { 13,  0,    86 },
+  { 20,  0,    91 }, { 23,  0,    13 }, {  6, 10,   509 }, {  4,  0,   264 },
+  {  7,  0,  1067 }, {  8,  0,   204 }, {  8,  0,   385 }, { 11,  0,   953 },
+  { 11, 11,   737 }, { 10,  0,    56 }, {  6,  0,  1917 }, {  5,  0,   470 },
+  { 10, 11,   657 }, { 14, 11,   297 }, { 14, 11,   361 }, {  7, 11,   412 },
+  {  7,  0,  1198 }, {  7, 11,  1198 }, {  8, 11,   556 }, { 14, 11,   123 },
+  { 14, 11,   192 }, { 15, 11,    27 }, {  7, 11,  1985 }, { 14, 11,   146 },
+  { 15, 11,    42 }, { 16, 11,    23 }, { 17, 11,    86 }, { 18, 11,    17 },
+  { 11,  0,  1015 }, {  8, 11,   122 }, {  4, 10,   114 }, {  9, 10,   492 },
+  { 13, 10,   462 }, { 14, 10,   215 }, {  4, 10,    77 }, {  5, 10,   361 },
+  {  6, 10,   139 }, {  6, 10,   401 }, {  6, 10,   404 }, {  7, 10,   413 },
+  {  7, 10,   715 }, {  7, 10,  1716 }, { 11, 10,   279 }, { 12, 10,   179 },
+  { 12, 10,   258 }, { 13, 10,   244 }, { 14, 10,   358 }, {  6, 10,  1717 },
+  {  7, 10,  1061 }, {  8, 10,    82 }, { 11, 10,   250 }, { 12, 10,   420 },
+  { 13, 10,   184 }, {  5,  0,   715 }, {  7, 10,   724 }, {  9,  0,   919 },
+  {  9,  0,   922 }, {  9,  0,   927 }, {  9,  0,   933 }, {  9,  0,   962 },
+  {  9,  0,  1000 }, {  9,  0,  1002 }, {  9,  0,  1021 }, { 12,  0,   890 },
+  { 12,  0,   907 }, { 12,  0,   930 }, { 15,  0,   207 }, { 15,  0,   228 },
+  { 15,  0,   238 }, { 21,  0,    61 }, {  8,  0,   794 }, {  9,  0,   400 },
+  { 10,  0,   298 }, { 14,  0,   228 }, {  5, 11,   430 }, {  5, 11,   932 },
+  {  6, 11,   131 }, {  7, 11,   417 }, {  9, 11,   522 }, { 11, 11,   314 },
+  { 13, 11,   390 }, {  4,  0,   867 }, {  8,  0,   724 }, {  4, 11,   507 },
+  {  9, 11,   261 }, {  4, 11,   343 }, {  5, 11,   511 }, {  6,  0,   190 },
+  {  7,  0,   768 }, {  7,  0,  1170 }, {  6, 10,   513 }, {  7, 10,  1052 },
+  {  7, 11,   455 }, { 10, 11,   591 }, {  6,  0,  1066 }, {  9, 10,   899 },
+  { 14,  0,    67 }, { 19,  0,    60 }, {  4,  0,   948 }, { 18,  0,   174 },
+  { 18,  0,   176 }, {  7,  0,  1023 }, {  7, 10,  1417 }, { 12, 10,   382 },
+  { 17, 10,    48 }, { 24, 10,    12 }, {  6, 11,   575 }, {  4,  0,   764 },
+  {  6, 10,   545 }, {  7, 10,   565 }, {  7, 10,  1669 }, { 10, 10,   114 },
+  { 11, 10,   642 }, { 12, 10,   618 }, {  6,  0,   137 }, {  9,  0,    75 },
+  {  9,  0,   253 }, { 10,  0,   194 }, { 10,  0,   444 }, {  4,  0,   756 },
+  {  5, 10,     5 }, {  8,  0,  1008 }, {  7, 10,   192 }, {  4,  0,   842 },
+  { 11,  0,   643 }, { 12,  0,   115 }, {  8, 10,   763 }, { 11,  0,    67 },
+  {  5, 10,   759 }, {  4,  0,   821 }, {  5,  0,   760 }, {  7,  0,   542 },
+  {  8,  0,   135 }, {  8,  0,   496 }, {  7, 11,   580 }, {  7, 10,   370 },
+  {  7, 10,  1007 }, {  7, 10,  1177 }, {  7, 10,  1565 }, {  7, 10,  1237 },
+  { 12,  0,   736 }, {  7,  0,   319 }, {  7,  0,   355 }, {  7,  0,   763 },
+  { 10,  0,   389 }, { 17,  0,    43 }, {  8, 11,   333 }, { 10, 11,   182 },
+  {  4, 10,    87 }, {  5, 10,   250 }, { 13, 10,   298 }, { 10,  0,   786 },
+  {  6,  0,  2044 }, {  8, 11,   330 }, { 12, 11,   477 }, {  7, 11,  1338 },
+  {  4, 11,   125 }, {  6,  0,  1030 }, {  6,  0,  1083 }, {  4, 11,   721 },
+  {  7, 10,   814 }, {  7, 11,   776 }, {  8, 11,   145 }, { 19, 11,    56 },
+  {  6,  0,  1226 }, {  4, 10,    57 }, {  7, 10,  1195 }, {  7, 10,  1438 },
+  {  7, 10,  1548 }, {  7, 10,  1835 }, {  7, 10,  1904 }, {  9, 10,   757 },
+  { 10, 10,   604 }, { 11, 10,   519 }, {  7, 11,   792 }, {  8, 11,   147 },
+  { 10, 11,   821 }, { 11, 11,  1021 }, {  9, 11,   797 }, {  4,  0,    58 },
+  {  5,  0,   286 }, {  6,  0,   319 }, {  7,  0,   402 }, {  7,  0,  1254 },
+  {  7,  0,  1903 }, {  8,  0,   356 }, { 12,  0,   408 }, {  4,  0,   389 },
+  {  4,  0,   815 }, {  9,  0,   181 }, {  9,  0,   255 }, { 10,  0,     8 },
+  { 10,  0,    29 }, { 10,  0,   816 }, { 11,  0,   311 }, { 11,  0,   561 },
+  { 12,  0,    67 }, { 13,  0,   181 }, {  7, 11,  1472 }, {  7, 11,  1554 },
+  {  7, 11,  1071 }, {  7, 11,  1541 }, {  7, 11,  1767 }, {  7, 11,  1806 },
+  {  7, 11,  1999 }, {  9, 11,   248 }, { 10, 11,   400 }, { 11, 11,   162 },
+  { 11, 11,   178 }, { 11, 11,   242 }, { 12, 11,   605 }, { 15, 11,    26 },
+  { 16, 11,    44 }, {  5, 11,   168 }, {  5, 11,   930 }, {  8, 11,    74 },
+  {  9, 11,   623 }, { 12, 11,   500 }, { 12, 11,   579 }, { 13, 11,    41 },
+  { 15, 11,    93 }, {  6, 11,   220 }, {  7, 11,  1101 }, { 13, 11,   105 },
+  {  5,  0,   474 }, {  7,  0,   507 }, {  4, 10,   209 }, {  7, 11,   507 },
+  {  7, 10,   902 }, {  4,  0,   427 }, {  6,  0,   413 }, {  7, 10,   335 },
+  {  7, 10,  1437 }, {  7, 10,  1668 }, {  8, 10,   553 }, {  8, 10,   652 },
+  {  8, 10,   656 }, {  9, 10,   558 }, { 11, 10,   743 }, { 21, 10,    18 },
+  {  4,  0,   730 }, {  6, 11,    19 }, {  7, 11,  1413 }, { 11, 11,   428 },
+  {  5,  0,   373 }, {  4, 10,   559 }, {  7, 11,    96 }, {  8, 11,   401 },
+  {  9, 11,   896 }, {  7,  0,   799 }, {  7,  0,  1972 }, {  5, 10,  1017 },
+  { 10, 10,   511 }, {  7,  0,  1793 }, {  7, 11,  1961 }, {  7, 11,  1965 },
+  {  8, 11,   702 }, {  8, 11,   750 }, {  8, 11,   150 }, {  8, 11,   737 },
+  { 12, 11,   366 }, {  4,  0,   322 }, {  5, 10,   709 }, {  8, 11,   800 },
+  {  9, 11,   148 }, {  9, 11,   872 }, {  9, 11,   890 }, { 11, 11,   309 },
+  { 11, 11,  1001 }, { 13, 11,   267 }, { 13, 11,   323 }, {  6, 10,  1745 },
+  {  7,  0,   290 }, {  8, 10,   206 }, {  7,  0,  1651 }, { 17,  0,    89 },
+  { 11,  0,     2 }, {  4,  0,   672 }, {  6,  0,  1860 }, {  8,  0,   905 },
+  { 10,  0,   844 }, { 10,  0,   846 }, { 10,  0,   858 }, { 12,  0,   699 },
+  { 12,  0,   746 }, { 12,  0,   772 }, {  7, 11,   424 }, {  5, 11,   547 },
+  {  5,  0,   737 }, {  5, 11,   490 }, {  6, 11,   615 }, {  6, 11,   620 },
+  {  7, 11,   683 }, {  6,  0,   746 }, {  6,  0,  1612 }, {  4, 10,   776 },
+  {  9, 11,   385 }, { 21, 11,    17 }, {  5,  0,   145 }, {  7, 10,  1272 },
+  {  7,  0,   884 }, { 12,  0,   124 }, {  4,  0,   387 }, {  7,  0,  1288 },
+  {  5, 11,   133 }, {  8, 10,   406 }, {  8, 11,   187 }, {  6,  0,   679 },
+  {  8, 11,     8 }, { 10, 11,     0 }, {  7,  0,   550 }, {  7, 11,   798 },
+  {  8, 11,   685 }, {  7, 11,  1086 }, { 17, 11,    46 }, {  8, 10,   175 },
+  { 10, 10,   168 }, { 10, 10,   573 }, {  7,  0,  1305 }, {  4,  0,   576 },
+  {  7,  0,  1263 }, {  6,  0,   686 }, {  6,  0,  1563 }, {  6,  0,   607 },
+  {  5,  0,   919 }, {  6,  0,  1673 }, { 20,  0,    37 }, {  8, 11,   774 },
+  { 10, 11,   670 }, { 12, 11,    51 }, {  5, 10,   784 }, { 11, 10,   882 },
+  {  4,  0,    82 }, {  5,  0,   333 }, {  5,  0,   904 }, {  6,  0,   207 },
+  {  7,  0,   325 }, {  7,  0,  1726 }, {  8,  0,   101 }, { 10,  0,   778 },
+  { 11,  0,   220 }, {  7, 11,   371 }, {  4,  0,   958 }, {  5,  0,   903 },
+  {  4, 11,   127 }, {  5, 11,   350 }, {  6, 11,   356 }, {  8, 11,   426 },
+  {  9, 11,   572 }, { 10, 11,   247 }, { 11, 11,   312 }, { 12,  0,   147 },
+  {  6, 11,    59 }, {  7, 11,   885 }, {  9, 11,   603 }, { 13, 11,   397 },
+  { 10,  0,   367 }, {  9, 10,    14 }, {  9, 10,   441 }, { 11, 10,     9 },
+  { 11, 10,   966 }, { 12, 10,   287 }, { 13, 10,   342 }, { 13, 10,   402 },
+  { 15, 10,   110 }, { 15, 10,   163 }, {  6,  0,   690 }, {  4,  0,   705 },
+  {  9,  0,   651 }, { 11,  0,   971 }, { 13,  0,   273 }, {  7, 10,  1428 },
+  {  7, 10,  1640 }, {  7, 10,  1867 }, {  9, 10,   169 }, {  9, 10,   182 },
+  {  9, 10,   367 }, {  9, 10,   478 }, {  9, 10,   506 }, {  9, 10,   551 },
+  {  9, 10,   557 }, {  9, 10,   648 }, {  9, 10,   697 }, {  9, 10,   705 },
+  {  9, 10,   725 }, {  9, 10,   787 }, {  9, 10,   794 }, { 10, 10,   198 },
+  { 10, 10,   214 }, { 10, 10,   267 }, { 10, 10,   275 }, { 10, 10,   456 },
+  { 10, 10,   551 }, { 10, 10,   561 }, { 10, 10,   613 }, { 10, 10,   627 },
+  { 10, 10,   668 }, { 10, 10,   675 }, { 10, 10,   691 }, { 10, 10,   695 },
+  { 10, 10,   707 }, { 10, 10,   715 }, { 11, 10,   183 }, { 11, 10,   201 },
+  { 11, 10,   262 }, { 11, 10,   352 }, { 11, 10,   439 }, { 11, 10,   493 },
+  { 11, 10,   572 }, { 11, 10,   591 }, { 11, 10,   608 }, { 11, 10,   611 },
+  { 11, 10,   646 }, { 11, 10,   674 }, { 11, 10,   711 }, { 11, 10,   751 },
+  { 11, 10,   761 }, { 11, 10,   776 }, { 11, 10,   785 }, { 11, 10,   850 },
+  { 11, 10,   853 }, { 11, 10,   862 }, { 11, 10,   865 }, { 11, 10,   868 },
+  { 11, 10,   875 }, { 11, 10,   898 }, { 11, 10,   902 }, { 11, 10,   903 },
+  { 11, 10,   910 }, { 11, 10,   932 }, { 11, 10,   942 }, { 11, 10,   957 },
+  { 11, 10,   967 }, { 11, 10,   972 }, { 12, 10,   148 }, { 12, 10,   195 },
+  { 12, 10,   220 }, { 12, 10,   237 }, { 12, 10,   318 }, { 12, 10,   339 },
+  { 12, 10,   393 }, { 12, 10,   445 }, { 12, 10,   450 }, { 12, 10,   474 },
+  { 12, 10,   505 }, { 12, 10,   509 }, { 12, 10,   533 }, { 12, 10,   591 },
+  { 12, 10,   594 }, { 12, 10,   597 }, { 12, 10,   621 }, { 12, 10,   633 },
+  { 12, 10,   642 }, { 13, 10,    59 }, { 13, 10,    60 }, { 13, 10,   145 },
+  { 13, 10,   239 }, { 13, 10,   250 }, { 13, 10,   329 }, { 13, 10,   344 },
+  { 13, 10,   365 }, { 13, 10,   372 }, { 13, 10,   387 }, { 13, 10,   403 },
+  { 13, 10,   414 }, { 13, 10,   456 }, { 13, 10,   470 }, { 13, 10,   478 },
+  { 13, 10,   483 }, { 13, 10,   489 }, { 14, 10,    55 }, { 14, 10,    57 },
+  { 14, 10,    81 }, { 14, 10,    90 }, { 14, 10,   148 }, { 14, 10,   239 },
+  { 14, 10,   266 }, { 14, 10,   321 }, { 14, 10,   326 }, { 14, 10,   327 },
+  { 14, 10,   330 }, { 14, 10,   347 }, { 14, 10,   355 }, { 14, 10,   401 },
+  { 14, 10,   404 }, { 14, 10,   411 }, { 14, 10,   414 }, { 14, 10,   416 },
+  { 14, 10,   420 }, { 15, 10,    61 }, { 15, 10,    74 }, { 15, 10,    87 },
+  { 15, 10,    88 }, { 15, 10,    94 }, { 15, 10,    96 }, { 15, 10,   116 },
+  { 15, 10,   149 }, { 15, 10,   154 }, { 16, 10,    50 }, { 16, 10,    63 },
+  { 16, 10,    73 }, { 17, 10,     2 }, { 17, 10,    66 }, { 17, 10,    92 },
+  { 17, 10,   103 }, { 17, 10,   112 }, { 17, 10,   120 }, { 18, 10,    50 },
+  { 18, 10,    54 }, { 18, 10,    82 }, { 18, 10,    86 }, { 18, 10,    90 },
+  { 18, 10,   111 }, { 18, 10,   115 }, { 18, 10,   156 }, { 19, 10,    40 },
+  { 19, 10,    79 }, { 20, 10,    78 }, { 21, 10,    22 }, {  7,  0,   887 },
+  {  5, 10,   161 }, {  7, 10,   839 }, { 14, 11,    98 }, {  6,  0,    90 },
+  { 10, 11,   356 }, {  7, 11,   441 }, {  6, 11,   111 }, {  7, 11,     4 },
+  {  8, 11,   163 }, {  8, 11,   776 }, { 10, 11,   566 }, {  6,  0,   908 },
+  {  6,  0,  1261 }, {  7,  0,   813 }, { 12,  0,   497 }, { 13,  0,    56 },
+  {  6,  0,  1235 }, {  7,  0,   429 }, {  7, 11,  1994 }, { 10,  0,   904 },
+  {  6,  0,   125 }, {  7,  0,  1277 }, {  9,  0,   772 }, { 23,  0,    12 },
+  {  4,  0,   841 }, {  5,  0,   386 }, {  5, 11,   386 }, {  5, 11,   297 },
+  {  7, 11,  1038 }, {  6,  0,   860 }, {  6,  0,  1069 }, {  7, 11,   309 },
+  {  8,  0,   946 }, {  7, 10,  1814 }, { 13, 11,   418 }, {  8, 11,   363 },
+  { 10,  0,   768 }, { 11,  0,   787 }, { 22, 11,    30 }, { 22, 11,    33 },
+  {  6,  0,   160 }, {  7,  0,  1106 }, {  9,  0,   770 }, { 11,  0,   112 },
+  { 12,  0,   413 }, { 11, 11,   216 }, { 11, 11,   340 }, {  8, 10,   139 },
+  {  7, 11,  1390 }, {  7, 11,   808 }, {  4, 11,   280 }, { 12,  0,   271 },
+  { 17,  0,   109 }, {  7, 10,   643 }, {  8, 10,   236 }, { 12, 11,    54 },
+  {  4, 11,   421 }, {  5, 11,   548 }, { 11,  0,   719 }, { 12,  0,    36 },
+  { 13,  0,   337 }, {  7,  0,   581 }, {  9,  0,   644 }, {  9,  0,   699 },
+  { 11, 11,   511 }, { 13, 11,   394 }, { 14, 11,   298 }, { 14, 11,   318 },
+  { 18, 11,   103 }, {  7,  0,   304 }, {  9,  0,   646 }, {  9,  0,   862 },
+  { 11,  0,   696 }, { 12,  0,   208 }, { 15,  0,    79 }, { 19,  0,   108 },
+  {  4,  0,   631 }, {  7,  0,  1126 }, {  7,  0,  1536 }, {  7, 11,  1527 },
+  {  8,  0,   880 }, { 10,  0,   869 }, { 10,  0,   913 }, {  7,  0,  1513 },
+  {  5, 10,    54 }, {  6, 11,   254 }, {  9, 11,   109 }, { 10, 11,   103 },
+  {  7,  0,   981 }, {  5, 11,   729 }, {  4, 10,   744 }, {  4,  0,   434 },
+  {  6,  0,   550 }, {  7,  0,   930 }, { 10,  0,   476 }, { 13,  0,   452 },
+  { 19,  0,   104 }, {  6, 11,  1630 }, { 10, 10,   402 }, { 18, 10,    55 },
+  {  5,  0,   553 }, { 10,  0,   824 }, {  8,  0,   452 }, {  8,  0,   151 },
+  {  9, 10,   624 }, {  4, 10,   572 }, {  4,  0,   772 }, {  5, 11,   671 },
+  {  5,  0,   292 }, { 10,  0,   135 }, {  4, 11,   889 }, { 12, 11,   207 },
+  {  9,  0,   504 }, {  6, 10,    43 }, {  7, 10,    38 }, {  8, 10,   248 },
+  { 10, 10,   513 }, {  6,  0,  1089 }, {  7, 11,  1910 }, {  4, 11,   627 },
+  {  5, 11,   775 }, {  7,  0,   783 }, {  5, 10,   766 }, {  5, 10,   363 },
+  {  7,  0,   387 }, {  7, 11,   387 }, {  7,  0,   393 }, { 10,  0,   603 },
+  { 11,  0,   206 }, {  7, 11,   202 }, { 11, 11,   362 }, { 11, 11,   948 },
+  { 12, 11,   388 }, {  6, 11,   507 }, {  7, 11,   451 }, {  8, 11,   389 },
+  { 12, 11,   490 }, { 13, 11,    16 }, { 13, 11,   215 }, { 13, 11,   351 },
+  { 18, 11,   132 }, { 19, 11,   125 }, {  4,  0,   912 }, {  9,  0,   232 },
+  {  7, 11,   841 }, {  6, 10,   258 }, { 12, 10,   409 }, {  5, 10,   249 },
+  { 20, 10,    82 }, {  8, 11,   566 }, {  6,  0,   977 }, {  7, 11,  1214 },
+  {  7,  0,  1973 }, {  8,  0,   716 }, {  7,  0,    98 }, {  5,  0,   733 },
+  {  5, 11,   912 }, {  6, 11,  1695 }, {  5, 10,   393 }, {  6, 10,   378 },
+  {  7, 10,  1981 }, {  9, 10,    32 }, {  9, 10,   591 }, { 10, 10,   685 },
+  { 10, 10,   741 }, { 14, 10,   382 }, {  5, 10,   788 }, { 10,  0,    19 },
+  { 11,  0,   911 }, {  7, 10,  1968 }, { 13, 10,   509 }, {  5,  0,   668 },
+  {  5, 11,   236 }, {  6, 11,   572 }, {  8, 11,   492 }, { 11, 11,   618 },
+  { 16, 11,    56 }, {  7, 11,  1789 }, {  4,  0,   360 }, {  5,  0,   635 },
+  {  5,  0,   700 }, {  5, 10,    58 }, {  5, 10,   171 }, {  5, 10,   683 },
+  {  6, 10,   291 }, {  6, 10,   566 }, {  7, 10,  1650 }, { 11, 10,   523 },
+  { 12, 10,   273 }, { 12, 10,   303 }, { 15, 10,    39 }, { 15, 10,   111 },
+  {  5,  0,   901 }, {  6, 10,   589 }, {  5, 11,   190 }, {  8, 11,   318 },
+  { 12,  0,   656 }, {  7,  0,   726 }, { 24,  0,     9 }, {  4, 10,   917 },
+  {  5, 10,  1005 }, {  7, 10,  1598 }, {  6, 11,   491 }, {  4, 10,   919 },
+  {  5, 11,   434 }, {  9,  0,    72 }, {  6,  0,  1269 }, {  6,  0,  1566 },
+  {  6,  0,  1621 }, {  9,  0,   463 }, { 10,  0,   595 }, {  4, 10,   255 },
+  {  5, 10,   302 }, {  6, 10,   132 }, {  7, 10,   128 }, {  7, 10,   283 },
+  {  7, 10,  1299 }, { 10, 10,    52 }, { 10, 10,   514 }, { 11, 10,   925 },
+  { 13, 10,    92 }, { 14, 10,   309 }, {  7,  0,  1454 }, {  6,  0,  1287 },
+  { 11,  0,   600 }, { 13,  0,   245 }, {  9, 10,   173 }, {  8,  0,   989 },
+  {  7,  0,   164 }, {  7,  0,  1571 }, {  9,  0,   107 }, { 12,  0,   225 },
+  {  6,  0,  1061 }, { 13, 10,   442 }, {  4,  0,    27 }, {  5,  0,   484 },
+  {  5,  0,   510 }, {  6,  0,   434 }, {  7,  0,  1000 }, {  7,  0,  1098 },
+  {  8,  0,     2 }, {  7, 11,    85 }, {  7, 11,   247 }, {  8, 11,   585 },
+  { 10, 11,   163 }, { 10, 11,   316 }, { 11, 11,   103 }, { 14, 11,     0 },
+  {  6,  0,  1127 }, {  4,  0,   460 }, {  6,  0,   852 }, {  6, 10,   210 },
+  {  4,  0,   932 }, {  5,  0,   891 }, {  6,  0,   588 }, { 19, 11,    83 },
+  {  8,  0,   625 }, {  4, 10,   284 }, {  6, 10,   223 }, {  6,  0,    76 },
+  {  8,  0,    92 }, {  9,  0,   221 }, {  4, 11,   124 }, { 10, 11,   457 },
+  { 11, 11,   121 }, { 11, 11,   169 }, { 11, 11,   422 }, { 11, 11,   870 },
+  { 12, 11,   214 }, { 13, 11,   389 }, { 14, 11,   187 }, { 15, 11,    77 },
+  {  9, 11,   618 }, { 10, 11,   482 }, {  4, 10,   218 }, {  7, 10,   526 },
+  { 15, 10,   137 }, { 13,  0,     9 }, { 14,  0,   104 }, { 14,  0,   311 },
+  {  4, 10,   270 }, {  5, 10,   192 }, {  6, 10,   332 }, {  7, 10,  1322 },
+  { 12, 10,   661 }, {  7, 11,  1193 }, {  6, 11,   107 }, {  7, 11,   638 },
+  {  7, 11,  1632 }, {  9, 11,   396 }, {  4,  0,   763 }, {  4,  0,   622 },
+  {  5, 11,   370 }, {  6, 11,  1756 }, {  5,  0,   253 }, {  7,  0,   546 },
+  {  9,  0,    73 }, { 10,  0,   110 }, { 14,  0,   185 }, { 17,  0,   119 },
+  {  5, 11,   204 }, {  7,  0,   624 }, {  7,  0,   916 }, { 10,  0,   256 },
+  { 11,  0,    87 }, {  7, 10,   379 }, {  8, 10,   481 }, {  9, 10,   377 },
+  {  5,  0,   212 }, { 12,  0,    35 }, { 13,  0,   382 }, {  5, 11,   970 },
+  {  6, 11,  1706 }, {  9,  0,   746 }, {  5, 10,  1003 }, {  6, 10,   149 },
+  { 10,  0,   150 }, { 11,  0,   849 }, { 13,  0,   330 }, {  8, 10,   262 },
+  {  9, 10,   627 }, { 11, 10,   214 }, { 11, 10,   404 }, { 11, 10,   457 },
+  { 11, 10,   780 }, { 11, 10,   913 }, { 13, 10,   401 }, { 14, 10,   200 },
+  {  6,  0,  1466 }, {  7, 11,     3 }, {  6,  0,  1299 }, {  4, 11,    35 },
+  {  5, 11,   121 }, {  5, 11,   483 }, {  5, 11,   685 }, {  6, 11,   489 },
+  {  7, 11,  1204 }, {  8, 11,   394 }, {  7, 10,   742 }, {  4, 10,   142 },
+  {  8, 10,   304 }, {  4, 11,   921 }, {  5, 11,  1007 }, {  6,  0,  1518 },
+  {  6,  0,  1229 }, {  7,  0,  1175 }, {  5,  0,   816 }, { 12,  0,   159 },
+  {  4, 10,   471 }, {  4, 11,   712 }, {  5, 10,    51 }, {  6, 10,   602 },
+  {  7, 10,   925 }, {  8, 10,   484 }, { 10, 10,   195 }, {  6, 11,  1629 },
+  {  5,  0,   869 }, {  5,  0,   968 }, {  6,  0,  1626 }, {  8,  0,   734 },
+  {  8,  0,   784 }, {  4,  0,   542 }, {  6,  0,  1716 }, {  6,  0,  1727 },
+  {  7,  0,  1082 }, {  7,  0,  1545 }, {  8,  0,    56 }, {  8,  0,   118 },
+  {  8,  0,   412 }, {  8,  0,   564 }, {  9,  0,   888 }, {  9,  0,   908 },
+  { 10,  0,    50 }, { 10,  0,   423 }, { 11,  0,   685 }, { 11,  0,   697 },
+  { 11,  0,   933 }, { 12,  0,   299 }, { 13,  0,   126 }, { 13,  0,   136 },
+  { 13,  0,   170 }, { 13,  0,   190 }, {  8, 10,   688 }, {  4, 10,   697 },
+  {  4,  0,   232 }, {  9,  0,   202 }, { 10,  0,   474 }, { 12,  0,   433 },
+  {  8,  0,   212 }, {  6,  0,   108 }, {  7,  0,  1003 }, {  7,  0,  1181 },
+  {  8,  0,   111 }, {  8,  0,   343 }, {  5, 10,   221 }, {  7, 11,  1255 },
+  {  5, 11,   485 }, {  6,  0,  1712 }, { 14,  0,   216 }, {  5,  0,   643 },
+  {  6,  0,   516 }, {  4, 11,   285 }, {  5, 11,   317 }, {  6, 11,   301 },
+  {  7, 11,     7 }, {  8, 11,   153 }, { 10, 11,   766 }, { 11, 11,   468 },
+  { 12, 11,   467 }, { 13, 11,   143 }, {  4,  0,   133 }, {  7,  0,   711 },
+  {  7,  0,  1298 }, {  7,  0,  1585 }, {  6,  0,   650 }, {  7, 11,   512 },
+  {  6,  0,    99 }, {  7,  0,  1808 }, { 17,  0,    57 }, {  6,  0,   246 },
+  {  6,  0,   574 }, {  7,  0,   428 }, {  9,  0,   793 }, { 10,  0,   669 },
+  { 11,  0,   485 }, { 11,  0,   840 }, { 12,  0,   300 }, { 14,  0,   250 },
+  { 17,  0,    55 }, {  4, 10,   132 }, {  5, 10,    69 }, {  7, 10,  1242 },
+  {  8,  0,  1023 }, {  7,  0,   302 }, {  4, 10,   111 }, {  7,  0,  1871 },
+  {  4,  0,   728 }, {  9,  0,   252 }, {  4, 10,   767 }, {  6,  0,   461 },
+  {  7,  0,  1590 }, {  7, 10,  1416 }, {  7, 10,  2005 }, {  8, 10,   131 },
+  {  8, 10,   466 }, {  9, 10,   672 }, { 13, 10,   252 }, { 20, 10,   103 },
+  {  6,  0,   323 }, {  7,  0,  1564 }, {  7,  0,   461 }, {  8,  0,   775 },
+  {  6, 10,    44 }, {  8, 10,   368 }, { 11,  0,   172 }, {  4,  0,   464 },
+  {  4, 10,   570 }, {  5, 10,   120 }, {  9, 11,   269 }, {  6, 10,   227 },
+  {  7, 10,  1589 }, {  6, 11,  1719 }, {  6, 11,  1735 }, {  7, 11,  2016 },
+  {  7, 11,  2020 }, {  8, 11,   837 }, {  9, 11,   852 }, {  7,  0,   727 },
+  { 18,  0,    73 }, {  4,  0,  1023 }, {  7, 11,   852 }, {  7, 10,  1529 },
+  {  8,  0,   577 }, { 10, 11,   568 }, {  6,  0,  1037 }, {  8, 11,    67 },
+  { 10, 11,   419 }, {  4,  0,   413 }, {  5,  0,   677 }, {  8,  0,   432 },
+  { 12,  0,   280 }, { 10,  0,   600 }, {  6, 10,  1667 }, {  7, 11,   967 },
+  {  7, 10,  2036 }, { 13, 11,    11 }, {  6, 10,   511 }, { 12, 10,   132 },
+  {  6,  0,   799 }, {  5, 10,   568 }, {  6, 10,   138 }, {  7, 10,  1293 },
+  {  8,  0,   159 }, {  4, 10,   565 }, {  8, 10,   827 }, {  7,  0,   646 },
+  {  7,  0,  1730 }, { 11,  0,   446 }, { 13,  0,   178 }, {  4, 10,   922 },
+  {  5, 10,  1023 }, {  7, 11,    11 }, {  4,  0,   395 }, { 11,  0,   145 },
+  {  7, 10,  1002 }, {  9,  0,   174 }, { 10,  0,   164 }, { 11,  0,   440 },
+  { 11,  0,   514 }, { 11,  0,   841 }, { 15,  0,    98 }, { 21,  0,    20 },
+  {  6,  0,   426 }, { 10,  0,   608 }, { 11,  0,  1002 }, {  7, 11,   320 },
+  {  8, 11,    51 }, { 12, 11,   481 }, { 12, 11,   570 }, { 20, 11,   106 },
+  {  9,  0,   977 }, {  9,  0,   983 }, {  4, 11,   445 }, { 10,  0,   250 },
+  { 11,  0,   100 }, {  6,  0,  1982 }, {  8, 10,   402 }, {  5, 11,   239 },
+  {  4, 10,   716 }, { 13, 10,    31 }, {  5,  0,   476 }, {  7, 11,    83 },
+  {  7, 11,  1990 }, {  8, 11,   130 }, { 11, 11,   720 }, {  8, 10,   691 },
+  {  8, 10,   731 }, {  5, 11,   123 }, {  6, 11,   530 }, {  7, 11,   348 },
+  {  7, 11,  1419 }, {  5,  0,    76 }, {  6,  0,   458 }, {  6,  0,   497 },
+  {  7,  0,   868 }, {  9,  0,   658 }, { 10,  0,   594 }, { 11,  0,   173 },
+  { 11,  0,   566 }, { 12,  0,    20 }, { 12,  0,   338 }, { 13,  0,   200 },
+  {  9, 11,   139 }, { 10, 11,   399 }, { 11, 11,   469 }, { 12, 11,   634 },
+  { 13, 11,   223 }, {  9, 10,   840 }, { 10, 10,   803 }, {  5, 10,   847 },
+  { 11, 11,   223 }, { 12, 11,   168 }, {  4, 11,   210 }, {  8,  0,   447 },
+  {  9, 10,    53 }, {  9, 10,   268 }, {  9, 10,   901 }, { 10, 10,   518 },
+  { 10, 10,   829 }, { 11, 10,   188 }, { 13, 10,    74 }, { 14, 10,    46 },
+  { 15, 10,    17 }, { 15, 10,    33 }, { 17, 10,    40 }, { 18, 10,    36 },
+  { 19, 10,    20 }, { 22, 10,     1 }, { 24, 10,     2 }, {  4,  0,   526 },
+  {  7,  0,  1029 }, {  7,  0,  1054 }, { 19, 11,    59 }, { 22, 11,     2 },
+  {  4,  0,   636 }, {  6,  0,  1875 }, {  6,  0,  1920 }, {  9,  0,   999 },
+  { 12,  0,   807 }, { 12,  0,   825 }, { 15,  0,   179 }, { 15,  0,   190 },
+  { 18,  0,   182 }, {  8, 10,   532 }, {  6,  0,  1699 }, {  7,  0,   660 },
+  {  7,  0,  1124 }, { 17,  0,    31 }, { 19,  0,    22 }, { 23,  0,    14 },
+  {  7, 10,   681 }, {  4, 11,   430 }, { 12, 10,   677 }, {  4, 10,   684 },
+  {  8, 10,   384 }, {  4, 11,   756 }, {  5, 11,   213 }, {  7,  0,   188 },
+  {  7, 10,   110 }, {  8, 10,   290 }, {  8, 10,   591 }, {  9, 10,   382 },
+  {  9, 10,   649 }, { 11, 10,    71 }, { 11, 10,   155 }, { 11, 10,   313 },
+  { 12, 10,     5 }, { 13, 10,   325 }, { 14, 10,   287 }, {  7, 10,   360 },
+  {  7, 10,   425 }, {  9, 10,    66 }, {  9, 10,   278 }, { 10, 10,   644 },
+  { 14, 11,   164 }, {  4,  0,   279 }, {  7,  0,   301 }, {  9,  0,   362 },
+  {  6, 11,   586 }, {  7,  0,  1743 }, {  4,  0,   178 }, {  5,  0,   399 },
+  {  4, 10,   900 }, {  5, 10,   861 }, {  5, 10,   254 }, {  7, 10,   985 },
+  {  8, 10,    73 }, {  5, 11,   108 }, {  7, 10,  1959 }, {  8, 10,   683 },
+  {  5, 11,   219 }, {  4, 11,   193 }, {  5, 11,   916 }, {  7, 11,   364 },
+  { 10, 11,   398 }, { 10, 11,   726 }, { 11, 11,   317 }, { 11, 11,   626 },
+  { 12, 11,   142 }, { 12, 11,   288 }, { 12, 11,   678 }, { 13, 11,   313 },
+  { 15, 11,   113 }, { 18, 11,   114 }, { 21, 11,    30 }, { 22, 11,    53 },
+  {  6, 11,   241 }, {  7, 11,   907 }, {  8, 11,   832 }, {  9, 11,   342 },
+  { 10, 11,   729 }, { 11, 11,   284 }, { 11, 11,   445 }, { 11, 11,   651 },
+  { 11, 11,   863 }, { 13, 11,   398 }, { 18, 11,    99 }, {  4,  0,   872 },
+  {  6,  0,   831 }, {  6,  0,  1692 }, {  6,  0,   202 }, {  6,  0,  1006 },
+  {  9,  0,   832 }, { 10,  0,   636 }, { 11,  0,   208 }, { 12,  0,   360 },
+  { 17,  0,   118 }, { 18,  0,    27 }, { 20,  0,    67 }, {  9, 11,   734 },
+  {  4, 10,   725 }, {  7, 11,   993 }, { 10, 11,   666 }, {  6,  0,  1954 },
+  {  6, 10,   196 }, {  7,  0,   872 }, { 10,  0,   516 }, { 11,  0,   167 },
+  {  5, 10,   831 }, {  4, 11,   562 }, {  9, 11,   254 }, { 11, 11,   879 },
+  {  9,  0,   313 }, {  4,  0,   224 }, {  4, 11,   786 }, { 11,  0,    24 },
+  { 12,  0,   170 }, {  8, 10,   723 }, {  5,  0,   546 }, {  7,  0,    35 },
+  {  8,  0,    11 }, {  8,  0,    12 }, {  9,  0,   315 }, {  9,  0,   533 },
+  { 10,  0,   802 }, { 11,  0,   166 }, { 12,  0,   525 }, { 14,  0,   243 },
+  {  7,  0,  1937 }, { 13, 10,    80 }, { 13, 10,   437 }, { 17, 10,    74 },
+  {  5,  0,   241 }, {  8,  0,   242 }, {  9,  0,   451 }, { 10,  0,   667 },
+  { 11,  0,   598 }, { 12,  0,   429 }, { 22,  0,    46 }, {  6,  0,  1273 },
+  {  9,  0,   830 }, {  5, 10,   848 }, {  6, 10,    66 }, {  8, 10,   764 },
+  {  6,  0,   825 }, {  6,  0,   993 }, {  4,  0,  1006 }, { 10,  0,   327 },
+  { 13,  0,   271 }, {  4, 10,    36 }, {  7, 10,  1387 }, { 11, 10,   755 },
+  {  6,  0,  1023 }, {  7,  0,  1580 }, {  4,  0,   366 }, {  9,  0,   516 },
+  {  4, 10,   887 }, {  6,  0,  1736 }, {  7,  0,  1891 }, {  6, 11,   216 },
+  {  7, 11,   901 }, {  7, 11,  1343 }, {  8, 11,   493 }, {  6, 10,   165 },
+  { 10, 10,   388 }, {  7, 11,   341 }, { 11, 11,   219 }, {  4, 10,   719 },
+  {  7, 10,   155 }, {  6,  0,  1935 }, {  4,  0,   826 }, {  6,  0,   331 },
+  {  6,  0,  1605 }, {  8,  0,   623 }, { 11,  0,   139 }, { 11,  0,   171 },
+  {  7, 11,  1734 }, { 10, 11,   115 }, { 11, 11,   420 }, { 12, 11,   154 },
+  { 13, 11,   404 }, { 14, 11,   346 }, { 15, 11,    54 }, { 15, 11,   112 },
+  {  7,  0,   288 }, {  4, 10,   353 }, {  6, 10,   146 }, {  6, 10,  1789 },
+  {  7, 10,   990 }, {  7, 10,  1348 }, {  9, 10,   665 }, {  9, 10,   898 },
+  { 11, 10,   893 }, { 14, 10,   212 }, {  6,  0,   916 }, {  6,  0,  1592 },
+  {  7,  0,  1888 }, {  4, 10,    45 }, {  7, 10,  1257 }, {  5, 11,  1011 },
+  {  8, 11,   701 }, { 11, 11,   596 }, {  4, 11,    54 }, {  5, 11,   666 },
+  {  7, 11,  1039 }, {  7, 11,  1130 }, {  9, 11,   195 }, { 10, 11,   302 },
+  {  6,  0,  1471 }, {  6,  0,  1570 }, {  4,  0,   394 }, { 12, 10,    65 },
+  {  8, 10,   816 }, {  7,  0,  1931 }, {  7,  0,   574 }, {  7,  0,  1719 },
+  {  6, 11,   467 }, {  4,  0,   658 }, {  9,  0,   781 }, { 10,  0,   144 },
+  { 11,  0,   385 }, { 13,  0,   161 }, { 13,  0,   228 }, { 13,  0,   268 },
+  { 20,  0,   107 }, {  6, 11,  1669 }, {  8,  0,   374 }, {  7,  0,   735 },
+  {  4,  0,   344 }, {  6,  0,   498 }, { 11,  0,   323 }, {  7,  0,   586 },
+  {  7,  0,  1063 }, {  6, 10,   559 }, {  6, 10,  1691 }, {  9,  0,   155 },
+  {  5,  0,   906 }, {  7, 11,   122 }, {  9, 11,   259 }, { 10, 11,    84 },
+  { 11, 11,   470 }, { 12, 11,   541 }, { 13, 11,   379 }, {  6,  0,  1139 },
+  { 10,  0,   108 }, { 11,  0,   116 }, {  6, 10,   456 }, {  5, 10,   925 },
+  {  5, 11,    82 }, {  5, 11,   131 }, {  7, 11,  1755 }, {  8, 11,    31 },
+  {  9, 11,   168 }, {  9, 11,   764 }, { 11, 11,   869 }, {  6, 11,   605 },
+  {  5, 11,   278 }, {  9, 11,    68 }, {  4, 11,   163 }, {  5, 11,   201 },
+  {  5, 11,   307 }, {  5, 11,   310 }, {  6, 11,   335 }, {  7, 11,   284 },
+  {  8, 11,   165 }, {  7, 11,  1660 }, {  6, 11,    33 }, {  7, 11,  1244 },
+  {  4,  0,   616 }, {  8, 11,   483 }, {  8,  0,   857 }, {  8,  0,   902 },
+  {  8,  0,   910 }, { 10,  0,   879 }, { 12,  0,   726 }, {  4, 11,   199 },
+  { 11, 11,    34 }, {  8,  0,   692 }, {  6, 10,   193 }, {  7, 10,   240 },
+  {  7, 10,  1682 }, { 10, 10,    51 }, { 10, 10,   640 }, { 11, 10,   410 },
+  { 13, 10,    82 }, { 14, 10,   247 }, { 14, 10,   331 }, { 14, 10,   377 },
+  {  6,  0,   823 }, {  6,  0,   983 }, { 11, 10,   411 }, {  4,  0,   305 },
+  {  8, 10,   633 }, { 10, 11,   203 }, {  6,  0,   681 }, {  6, 11,   326 },
+  {  7, 11,   677 }, {  9, 11,   425 }, {  5,  0,   214 }, {  7,  0,   603 },
+  {  8,  0,   611 }, {  9,  0,   686 }, { 10,  0,    88 }, { 11,  0,   459 },
+  { 11,  0,   496 }, { 12,  0,   463 }, { 12,  0,   590 }, { 13,  0,     0 },
+  {  8,  0,  1004 }, { 14,  0,    23 }, {  6,  0,  1703 }, { 19, 11,     8 },
+  { 17, 11,    56 }, {  7,  0,  1443 }, {  4, 10,   237 }, {  7, 10,   514 },
+  {  6,  0,   714 }, { 17,  0,    19 }, {  5, 11,   358 }, {  7, 11,   473 },
+  {  7, 11,  1184 }, { 10, 11,   662 }, { 13, 11,   212 }, { 13, 11,   304 },
+  { 13, 11,   333 }, { 17, 11,    98 }, {  4,  0,   737 }, { 10,  0,    98 },
+  { 11,  0,   294 }, { 12,  0,    60 }, { 12,  0,   437 }, { 13,  0,    64 },
+  { 13,  0,   380 }, { 14,  0,   430 }, {  6, 10,   392 }, {  7, 10,    65 },
+  {  7, 10,  2019 }, {  6,  0,  1758 }, {  8,  0,   520 }, {  9,  0,   345 },
+  {  9,  0,   403 }, { 14,  0,   350 }, {  5,  0,    47 }, { 10,  0,   242 },
+  { 10,  0,   579 }, {  5,  0,   139 }, {  7,  0,  1168 }, { 10,  0,   539 },
+  {  6,  0,  1459 }, { 13,  0,   388 }, { 13, 11,   388 }, {  6,  0,   253 },
+  {  7, 10,  1260 }, {  7, 10,  1790 }, { 10,  0,   252 }, {  9, 10,   222 },
+  { 11, 10,   900 }, { 12,  0,   745 }, {  5, 11,   946 }, {  4,  0,   107 },
+  {  7,  0,   613 }, {  8,  0,   439 }, {  8,  0,   504 }, {  9,  0,   501 },
+  { 10,  0,   383 }, { 11,  0,   477 }, {  7, 11,  1485 }, {  4,  0,   871 },
+  {  7, 11,   411 }, {  7, 11,   590 }, {  8, 11,   631 }, {  9, 11,   323 },
+  { 10, 11,   355 }, { 11, 11,   491 }, { 12, 11,   143 }, { 12, 11,   402 },
+  { 13, 11,    73 }, { 14, 11,   408 }, { 15, 11,   107 }, { 18, 11,    71 },
+  {  4,  0,   229 }, {  4,  0,   903 }, { 12,  0,    71 }, {  5,  0,   549 },
+  {  4,  0,    47 }, {  6,  0,   373 }, {  7,  0,   452 }, {  7,  0,   543 },
+  {  7,  0,  1828 }, {  7,  0,  1856 }, {  9,  0,     6 }, { 11,  0,   257 },
+  { 11,  0,   391 }, {  7, 11,  1467 }, {  8, 11,   328 }, { 10, 11,   544 },
+  { 11, 11,   955 }, { 13, 11,   320 }, { 17, 11,    83 }, {  5,  0,   980 },
+  {  6,  0,  1754 }, {  8,  0,   865 }, {  5,  0,   705 }, {  9,  0,   606 },
+  {  7,  0,   161 }, {  8, 10,   201 }, {  8, 10,   605 }, { 15, 11,    35 },
+  {  5, 11,   835 }, {  6, 11,   483 }, { 12, 10,   224 }, {  7,  0,   536 },
+  {  7,  0,  1331 }, {  8,  0,   143 }, {  6,  0,  1388 }, {  5,  0,   724 },
+  { 10,  0,   305 }, { 11,  0,   151 }, { 12,  0,    33 }, { 12,  0,   121 },
+  { 12,  0,   381 }, { 17,  0,     3 }, { 17,  0,    27 }, { 17,  0,    78 },
+  { 18,  0,    18 }, { 19,  0,    54 }, { 21,  0,     5 }, {  4, 10,   523 },
+  {  5, 10,   638 }, {  5,  0,    19 }, {  6,  0,   533 }, {  5,  0,   395 },
+  {  5,  0,   951 }, {  6,  0,  1776 }, {  7,  0,  1908 }, {  4,  0,   846 },
+  { 10,  0,    74 }, { 11,  0,   663 }, { 12,  0,   210 }, { 13,  0,   166 },
+  { 13,  0,   310 }, { 14,  0,   373 }, { 18,  0,    95 }, { 19,  0,    43 },
+  {  6, 10,   242 }, {  7, 10,   227 }, {  7, 10,  1581 }, {  8, 10,   104 },
+  {  9, 10,   113 }, {  9, 10,   220 }, {  9, 10,   427 }, { 10, 10,   239 },
+  { 11, 10,   579 }, { 11, 10,  1023 }, { 13, 10,     4 }, { 13, 10,   204 },
+  { 13, 10,   316 }, { 20, 10,    86 }, {  9, 11,   716 }, { 11, 11,   108 },
+  { 13, 11,   123 }, { 14, 11,   252 }, { 19, 11,    38 }, { 21, 11,     3 },
+  { 23, 11,    11 }, {  8,  0,   372 }, {  9,  0,   122 }, { 10,  0,   175 },
+  {  4, 11,   677 }, {  7, 11,  1374 }, {  8, 11,   540 }, {  7, 10,   861 },
+  {  4,  0,   695 }, {  7,  0,   497 }, {  9,  0,   387 }, { 19,  0,    81 },
+  {  8,  0,   937 }, {  6,  0,   718 }, {  7,  0,  1328 }, {  8, 10,   494 },
+  {  4, 11,   331 }, {  6,  0,  1581 }, {  5, 11,   747 }, {  5,  0,   284 },
+  {  6,  0,    49 }, {  6,  0,   350 }, {  7,  0,     1 }, {  7,  0,   377 },
+  {  7,  0,  1693 }, {  8,  0,    18 }, {  8,  0,   678 }, {  9,  0,   161 },
+  {  9,  0,   585 }, {  9,  0,   671 }, {  9,  0,   839 }, { 11,  0,   912 },
+  { 13,  0,   427 }, {  7, 10,  1306 }, {  8, 10,   505 }, {  9, 10,   482 },
+  { 10, 10,   126 }, { 11, 10,   225 }, { 12, 10,   347 }, { 12, 10,   449 },
+  { 13, 10,    19 }, { 14, 10,   218 }, { 14, 10,   435 }, { 10, 10,   764 },
+  { 12, 10,   120 }, { 13, 10,    39 }, { 17, 10,   127 }, {  4,  0,   597 },
+  {  5, 10,   268 }, {  6,  0,  1094 }, {  4,  0,  1008 }, {  6,  0,  1973 },
+  {  4,  0,   811 }, { 11,  0,   908 }, {  7,  0,  1471 }, {  5, 11,   326 },
+  {  4, 10,   384 }, {  7, 10,  1022 }, {  7,  0,  1935 }, {  8,  0,   324 },
+  { 12,  0,    42 }, {  4, 11,   691 }, {  7, 11,  1935 }, {  8, 11,   324 },
+  {  9, 11,    35 }, { 10, 11,   680 }, { 11, 11,   364 }, { 12, 11,    42 },
+  { 13, 11,   357 }, { 18, 11,    16 }, {  7,  0,  2014 }, {  7,  0,  2007 },
+  {  9,  0,   101 }, {  9,  0,   450 }, { 10,  0,    66 }, { 10,  0,   842 },
+  { 11,  0,   536 }, { 12,  0,   587 }, {  6, 11,    32 }, {  7, 11,   385 },
+  {  7, 11,   757 }, {  7, 11,  1916 }, {  8, 11,    37 }, {  8, 11,    94 },
+  {  8, 11,   711 }, {  9, 11,   541 }, { 10, 11,   162 }, { 10, 11,   795 },
+  { 11, 11,   989 }, { 11, 11,  1010 }, { 12, 11,    14 }, { 14, 11,   308 },
+  { 11,  0,   586 }, {  7, 10,  1703 }, {  7,  0,  1077 }, { 11,  0,    28 },
+  {  9, 10,   159 }, { 12, 10,   603 }, {  6,  0,  1221 }, {  8, 10,   583 },
+  {  6, 11,   152 }, {  6, 11,   349 }, {  6, 11,  1682 }, {  7, 11,  1252 },
+  {  8, 11,   112 }, {  9, 11,   435 }, {  9, 11,   668 }, { 10, 11,   290 },
+  { 10, 11,   319 }, { 10, 11,   815 }, { 11, 11,   180 }, { 11, 11,   837 },
+  { 12, 11,   240 }, { 13, 11,   152 }, { 13, 11,   219 }, { 14, 11,   158 },
+  { 11,  0,    62 }, {  4, 10,   515 }, {  8, 10,   632 }, {  8, 10,   697 },
+  {  9, 10,   854 }, {  6,  0,  1766 }, {  4, 11,   581 }, {  6, 11,   126 },
+  {  7, 11,   573 }, {  8, 11,   397 }, { 14, 11,    44 }, { 22,  0,    28 },
+  { 11,  0,   670 }, { 22,  0,    25 }, {  4, 10,   136 }, {  5, 10,   551 },
+  {  6,  0,  1665 }, {  7,  0,   256 }, {  7,  0,  1388 }, { 10,  0,   499 },
+  {  4,  0,    22 }, {  5,  0,    10 }, {  7,  0,  1576 }, {  8,  0,    97 },
+  {  6, 10,  1782 }, {  5,  0,   481 }, {  7, 10,  1287 }, {  9, 10,    44 },
+  { 10, 10,   552 }, { 10, 10,   642 }, { 11, 10,   839 }, { 12, 10,   274 },
+  { 12, 10,   275 }, { 12, 10,   372 }, { 13, 10,    91 }, { 14, 10,   125 },
+  {  5, 11,   926 }, {  7, 11,  1232 }, {  9, 11,   531 }, {  6,  0,   134 },
+  {  7,  0,   437 }, {  7,  0,  1824 }, {  9,  0,    37 }, { 14,  0,   285 },
+  { 14,  0,   371 }, {  7,  0,   486 }, {  8,  0,   155 }, { 11,  0,    93 },
+  { 12,  0,   164 }, {  6,  0,  1391 }, {  6,  0,  1442 }, {  5, 11,   670 },
+  {  5,  0,   591 }, {  6, 10,   147 }, {  7, 10,   886 }, {  7, 11,  1957 },
+  {  9, 10,   753 }, { 10, 10,   268 }, {  5,  0,   380 }, {  5,  0,   650 },
+  {  7,  0,  1173 }, {  8,  0,   310 }, {  4,  0,   364 }, {  7,  0,  1156 },
+  {  7,  0,  1187 }, {  9,  0,   409 }, {  7, 11,  1621 }, {  6,  0,   482 },
+  {  5, 11,   506 }, {  4,  0,   781 }, {  6,  0,   487 }, {  7,  0,   926 },
+  {  8,  0,   263 }, { 11,  0,   500 }, { 10, 10,   137 }, {  7, 11,   242 },
+  { 11, 11,    96 }, {  5, 10,   414 }, {  7, 10,  1762 }, {  6,  0,   804 },
+  {  5, 11,   834 }, {  7, 11,  1202 }, {  8, 11,    14 }, {  9, 11,   481 },
+  {  9, 11,   880 }, {  6, 10,   599 }, {  4,  0,    94 }, {  7,  0,  1265 },
+  {  4,  0,   415 }, {  4,  0,   417 }, {  5,  0,   348 }, {  6,  0,   522 },
+  {  6, 10,  1749 }, {  7, 11,  1526 }, { 10, 11,   465 }, {  6, 10,  1627 },
+  {  4,  0,  1012 }, {  4, 10,   488 }, {  4, 11,   357 }, {  6, 11,   172 },
+  {  7, 11,   143 }, {  9, 11,   413 }, {  4, 10,    83 }, {  4, 11,   590 },
+  { 18, 11,    76 }, { 12, 10,   676 }, {  7, 11,   287 }, {  8, 11,   355 },
+  {  9, 11,   293 }, {  9, 11,   743 }, {  6, 10,   278 }, {  6,  0,  1803 },
+  { 18,  0,   165 }, { 24,  0,    21 }, {  5, 11,   169 }, {  7, 11,   333 },
+  {  8, 11,    45 }, { 12, 10,    97 }, { 12, 11,    97 }, {  4,  0,   408 },
+  {  4,  0,   741 }, {  7,  0,   500 }, {  4, 11,   198 }, {  7, 10,   388 },
+  {  7, 10,   644 }, { 11, 10,   781 }, {  4, 11,    24 }, {  5, 11,   140 },
+  {  5, 11,   185 }, {  7, 11,  1500 }, { 11, 11,   565 }, { 11, 11,   838 },
+  {  6,  0,  1321 }, {  9,  0,   257 }, {  7, 10,   229 }, {  8, 10,    59 },
+  {  9, 10,   190 }, { 10, 10,   378 }, { 12, 10,   191 }, {  4, 11,   334 },
+  {  5, 11,   593 }, {  7, 11,  1885 }, {  6,  0,  1138 }, {  4,  0,   249 },
+  {  6,  0,    73 }, {  7,  0,   177 }, {  5,  0,   576 }, { 14,  0,   231 },
+  {  9,  0,   288 }, {  4, 10,   660 }, {  7, 10,  1035 }, { 10, 10,   737 },
+  {  7,  0,  1487 }, {  6,  0,   989 }, {  9,  0,   433 }, {  7, 10,   690 },
+  {  9, 10,   587 }, { 12, 10,   521 }, {  7,  0,  1264 }, {  7,  0,  1678 },
+  { 11,  0,   945 }, { 12,  0,   341 }, { 12,  0,   471 }, { 12,  0,   569 },
+  {  4, 11,   709 }, {  5, 11,   897 }, {  5, 11,   224 }, { 13, 11,   174 },
+  { 18, 11,    52 }, {  7, 11,  1840 }, {  6, 10,  1744 }, { 12,  0,    87 },
+  { 16,  0,    74 }, {  4, 10,   733 }, {  9, 10,   194 }, { 10, 10,    92 },
+  { 11, 10,   198 }, { 12, 10,    84 }, { 13, 10,   128 }, { 12,  0,   779 },
+  {  7,  0,   538 }, {  4, 11,   608 }, {  5, 11,   497 }, {  5,  0,   413 },
+  {  7, 11,  1375 }, {  7, 11,  1466 }, { 10, 11,   331 }, {  8,  0,   495 },
+  {  6, 11,   540 }, {  8, 11,   136 }, {  7,  0,    54 }, {  8,  0,   312 },
+  { 10,  0,   191 }, { 10,  0,   614 }, { 12,  0,   567 }, {  6,  0,   468 },
+  {  7,  0,   567 }, {  7,  0,  1478 }, {  8,  0,   530 }, { 14,  0,   290 },
+  {  5, 11,   999 }, {  4, 11,   299 }, {  7, 10,   306 }, {  7, 11,  1004 },
+  { 14, 11,   296 }, {  6,  0,  1484 }, {  5, 10,   979 }, {  6,  0,   609 },
+  {  9,  0,   815 }, { 12, 11,   137 }, { 14, 11,     9 }, { 14, 11,    24 },
+  { 14, 11,    64 }, {  5, 11,   456 }, {  6,  0,   484 }, {  7,  0,   822 },
+  {  5, 10,   178 }, {  8, 11,   180 }, {  4, 11,   755 }, {  9,  0,   900 },
+  {  7,  0,  1335 }, {  6,  0,  1724 }, {  7,  0,  2022 }, {  7, 11,  1139 },
+  {  5,  0,   640 }, {  4, 10,   390 }, {  6,  0,  1831 }, { 10, 11,   633 },
+  {  7, 11,   566 }, {  4, 11,   890 }, {  5, 11,   805 }, {  5, 11,   819 },
+  {  5, 11,   961 }, {  6, 11,   396 }, {  6, 11,  1631 }, {  6, 11,  1678 },
+  {  7, 11,  1967 }, {  7, 11,  2041 }, {  9, 11,   630 }, { 11, 11,     8 },
+  { 11, 11,  1019 }, { 12, 11,   176 }, { 13, 11,   225 }, { 14, 11,   292 },
+  { 21, 11,    24 }, {  4,  0,   474 }, {  6,  0,  1103 }, {  7,  0,  1504 },
+  {  6,  0,  1576 }, {  6,  0,   961 }, {  6,  0,  1034 }, { 12,  0,   655 },
+  { 11, 11,   514 }, { 21, 11,    20 }, {  5,  0,   305 }, {  7, 11,  1815 },
+  {  7, 11,  1505 }, { 10, 11,   190 }, { 10, 11,   634 }, { 11, 11,   792 },
+  { 12, 11,   358 }, { 12, 11,   447 }, {  5, 11,     0 }, {  6, 11,   536 },
+  {  7, 11,   604 }, { 13, 11,   445 }, { 17, 11,   126 }, {  7,  0,  1236 },
+  {  5, 10,   105 }, {  4,  0,   480 }, {  6,  0,   217 }, {  6,  0,   302 },
+  {  6,  0,  1642 }, {  7,  0,   130 }, {  7,  0,   837 }, {  7,  0,  1321 },
+  {  7,  0,  1547 }, {  7,  0,  1657 }, {  8,  0,   429 }, {  9,  0,   228 },
+  { 13,  0,   289 }, { 13,  0,   343 }, { 19,  0,   101 }, {  6, 11,   232 },
+  {  6, 11,   412 }, {  7, 11,  1074 }, {  8, 11,     9 }, {  8, 11,   157 },
+  {  8, 11,   786 }, {  9, 11,   196 }, {  9, 11,   352 }, {  9, 11,   457 },
+  { 10, 11,   337 }, { 11, 11,   232 }, { 11, 11,   877 }, { 12, 11,   480 },
+  { 12, 11,   546 }, {  5, 10,   438 }, {  7, 11,   958 }, {  9, 10,   694 },
+  { 12, 10,   627 }, { 13, 11,    38 }, { 13, 10,   210 }, {  4, 11,   382 },
+  {  8, 11,   579 }, {  7,  0,   278 }, { 10,  0,   739 }, { 11,  0,   708 },
+  { 13,  0,   348 }, {  4, 11,   212 }, {  7, 11,  1206 }, {  7, 11,  1898 },
+  {  6,  0,   708 }, {  6,  0,  1344 }, { 24, 10,    11 }, {  9, 11,   768 },
+  {  6,  0,  1840 }, { 12,  0,   233 }, {  8, 10,    25 }, { 10, 10,   826 },
+  {  6,  0,  2017 }, {  5, 11,   655 }, {  6,  0,  1488 }, { 11, 11,   290 },
+  {  4, 10,   308 }, {  6,  0,  1590 }, {  6,  0,  1800 }, {  6,  0,  1259 },
+  { 16,  0,    28 }, {  6, 11,   231 }, {  7, 11,    95 }, {  8, 11,   423 },
+  {  5, 11,   300 }, {  7, 10,   150 }, {  8, 10,   649 }, {  7, 11,  1874 },
+  {  9, 11,   641 }, {  6, 11,   237 }, {  7, 11,   611 }, {  8, 11,   100 },
+  {  9, 11,   416 }, { 11, 11,   335 }, { 12, 11,   173 }, { 18, 11,   101 },
+  {  9,  0,    45 }, {  6, 10,   521 }, { 17,  0,    36 }, { 14, 11,    26 },
+  { 18, 11,   150 }, {  7,  0,  1442 }, { 14,  0,    22 }, {  5, 10,   339 },
+  { 15, 10,    41 }, { 15, 10,   166 }, { 19, 10,    66 }, {  8,  0,   378 },
+  {  6, 11,   581 }, {  7, 11,  1119 }, {  6,  0,  1507 }, { 19, 11,   117 },
+  { 11,  0,    39 }, {  6,  0,  1054 }, {  6,  0,   363 }, {  7,  0,  1955 },
+  {  8,  0,   725 }, {  6,  0,  2036 }, {  5, 11,   199 }, {  6,  0,  1871 },
+  {  9,  0,   935 }, {  9,  0,   961 }, {  9,  0,  1004 }, {  9,  0,  1016 },
+  { 12,  0,   805 }, { 12,  0,   852 }, { 12,  0,   853 }, { 12,  0,   869 },
+  { 12,  0,   882 }, { 12,  0,   896 }, { 12,  0,   906 }, { 12,  0,   917 },
+  { 12,  0,   940 }, { 15,  0,   170 }, { 15,  0,   176 }, { 15,  0,   188 },
+  { 15,  0,   201 }, { 15,  0,   205 }, { 15,  0,   212 }, { 15,  0,   234 },
+  { 15,  0,   244 }, { 18,  0,   181 }, { 18,  0,   193 }, { 18,  0,   196 },
+  { 18,  0,   201 }, { 18,  0,   202 }, { 18,  0,   210 }, { 18,  0,   217 },
+  { 18,  0,   235 }, { 18,  0,   236 }, { 18,  0,   237 }, { 21,  0,    54 },
+  { 21,  0,    55 }, { 21,  0,    58 }, { 21,  0,    59 }, { 24,  0,    22 },
+  {  6, 10,  1628 }, {  9,  0,   805 }, {  5,  0,   813 }, {  7,  0,  2046 },
+  { 14, 11,    42 }, {  5,  0,   712 }, {  6,  0,  1240 }, { 11,  0,    17 },
+  { 13,  0,   321 }, { 16,  0,    67 }, {  4,  0,   617 }, {  7, 10,   829 },
+  {  6,  0,   320 }, {  7,  0,   781 }, {  7,  0,  1921 }, {  9,  0,    55 },
+  { 10,  0,   186 }, { 10,  0,   273 }, { 10,  0,   664 }, { 10,  0,   801 },
+  { 11,  0,   996 }, { 11,  0,   997 }, { 13,  0,   157 }, { 14,  0,   170 },
+  {  8,  0,   271 }, {  5, 10,   486 }, {  7, 10,  1349 }, { 18, 11,    91 },
+  { 19, 11,    70 }, { 10,  0,   445 }, {  7, 10,  1635 }, {  8, 10,    17 },
+  { 10, 10,   295 }, {  8, 11,   404 }, {  7,  0,   103 }, {  7,  0,   863 },
+  { 11,  0,   184 }, { 17,  0,    62 }, { 10, 10,   558 }, {  9,  0,   659 },
+  {  6, 11,   312 }, {  6, 11,  1715 }, { 10, 11,   584 }, { 11, 11,   546 },
+  { 11, 11,   692 }, { 12, 11,   259 }, { 12, 11,   295 }, { 13, 11,    46 },
+  { 13, 11,   154 }, {  6,  0,   676 }, {  4, 11,   588 }, {  4, 11,   231 },
+  {  5, 11,    61 }, {  6, 11,   104 }, {  7, 11,   729 }, {  7, 11,   964 },
+  {  7, 11,  1658 }, { 12, 11,   414 }, {  6, 11,   263 }, { 10, 11,   757 },
+  { 11,  0,   337 }, { 14,  0,   303 }, {  7, 11,  1363 }, {  4, 11,   320 },
+  { 12,  0,   506 }, {  6, 10,   447 }, {  5,  0,    77 }, {  7,  0,  1455 },
+  { 10,  0,   843 }, { 19,  0,    73 }, {  7, 10,   577 }, {  7, 10,  1432 },
+  {  9, 10,   475 }, {  9, 10,   505 }, {  9, 10,   526 }, {  9, 10,   609 },
+  {  9, 10,   689 }, {  9, 10,   726 }, {  9, 10,   735 }, {  9, 10,   738 },
+  { 10, 10,   556 }, { 10, 10,   674 }, { 10, 10,   684 }, { 11, 10,    89 },
+  { 11, 10,   202 }, { 11, 10,   272 }, { 11, 10,   380 }, { 11, 10,   415 },
+  { 11, 10,   505 }, { 11, 10,   537 }, { 11, 10,   550 }, { 11, 10,   562 },
+  { 11, 10,   640 }, { 11, 10,   667 }, { 11, 10,   688 }, { 11, 10,   847 },
+  { 11, 10,   927 }, { 11, 10,   930 }, { 11, 10,   940 }, { 12, 10,   144 },
+  { 12, 10,   325 }, { 12, 10,   329 }, { 12, 10,   389 }, { 12, 10,   403 },
+  { 12, 10,   451 }, { 12, 10,   515 }, { 12, 10,   604 }, { 12, 10,   616 },
+  { 12, 10,   626 }, { 13, 10,    66 }, { 13, 10,   131 }, { 13, 10,   167 },
+  { 13, 10,   236 }, { 13, 10,   368 }, { 13, 10,   411 }, { 13, 10,   434 },
+  { 13, 10,   453 }, { 13, 10,   461 }, { 13, 10,   474 }, { 14, 10,    59 },
+  { 14, 10,    60 }, { 14, 10,   139 }, { 14, 10,   152 }, { 14, 10,   276 },
+  { 14, 10,   353 }, { 14, 10,   402 }, { 15, 10,    28 }, { 15, 10,    81 },
+  { 15, 10,   123 }, { 15, 10,   152 }, { 18, 10,   136 }, { 20, 10,    88 },
+  {  4,  0,   458 }, {  7,  0,  1420 }, {  6,  0,   109 }, { 10,  0,   382 },
+  {  4, 11,   405 }, {  4, 10,   609 }, {  7, 10,   756 }, {  7, 11,   817 },
+  {  9, 10,   544 }, { 11, 10,   413 }, { 14, 11,    58 }, { 14, 10,   307 },
+  { 16, 10,    25 }, { 17, 11,    37 }, { 18, 11,   124 }, {  6,  0,   330 },
+  {  7,  0,  1084 }, { 11,  0,   142 }, {  5, 11,   974 }, {  4, 10,   930 },
+  {  5, 10,   947 }, {  5, 10,   939 }, { 14, 11,   394 }, { 16,  0,    91 },
+  { 17,  0,    87 }, {  5, 11,   235 }, {  5, 10,   962 }, {  7, 11,  1239 },
+  { 11, 11,   131 }, { 12, 11,   370 }, { 11,  0,   492 }, {  5, 10,   651 },
+  {  8, 10,   170 }, {  9, 10,    61 }, {  9, 10,    63 }, { 10, 10,    23 },
+  { 10, 10,    37 }, { 10, 10,   834 }, { 11, 10,     4 }, { 11, 10,   281 },
+  { 11, 10,   503 }, { 11, 10,   677 }, { 12, 10,    96 }, { 12, 10,   130 },
+  { 12, 10,   244 }, { 14, 10,     5 }, { 14, 10,    40 }, { 14, 10,   162 },
+  { 14, 10,   202 }, { 18, 10,   133 }, {  4, 10,   406 }, {  5, 10,   579 },
+  { 12, 10,   492 }, { 22, 10,    15 }, {  9, 11,   137 }, { 10, 11,   221 },
+  {  6,  0,  1239 }, { 11,  0,   211 }, { 12,  0,   145 }, {  7, 11,   390 },
+  { 10, 11,   140 }, {  7, 11,  1418 }, {  7, 11,  1144 }, {  6,  0,  1049 },
+  {  7,  0,   321 }, {  6, 10,    17 }, {  7, 10,  1001 }, {  7, 10,  1982 },
+  {  9, 10,   886 }, { 10, 10,   489 }, { 10, 10,   800 }, { 11, 10,   782 },
+  { 12, 10,   320 }, { 13, 10,   467 }, { 14, 10,   145 }, { 14, 10,   387 },
+  { 15, 10,   119 }, { 17, 10,    17 }, {  5, 11,   407 }, { 11, 11,   489 },
+  { 19, 11,    37 }, { 20, 11,    73 }, { 22, 11,    38 }, {  5, 10,   458 },
+  {  7,  0,  1985 }, {  7, 10,  1983 }, {  8, 10,     0 }, {  8, 10,   171 },
+  {  9, 10,   120 }, {  9, 10,   732 }, { 10, 10,   473 }, { 11, 10,   656 },
+  { 11, 10,   998 }, { 18, 10,     0 }, { 18, 10,     2 }, { 19, 10,    21 },
+  {  5, 11,   325 }, {  7, 11,  1483 }, {  8, 11,     5 }, {  8, 11,   227 },
+  {  9, 11,   105 }, { 10, 11,   585 }, { 12, 11,   614 }, {  8,  0,   122 },
+  {  4,  0,   234 }, {  7, 11,  1196 }, {  6,  0,   976 }, {  6,  0,  1098 },
+  {  6,  0,  1441 }, {  7,  0,   253 }, {  8,  0,   549 }, {  6, 11,   621 },
+  { 13, 11,   504 }, { 16, 11,    19 }, {  4, 10,   519 }, {  5,  0,   430 },
+  {  5,  0,   932 }, {  6,  0,   131 }, {  7,  0,   417 }, {  9,  0,   522 },
+  { 11,  0,   314 }, { 13,  0,   390 }, { 14,  0,   149 }, { 14,  0,   399 },
+  { 15,  0,    57 }, {  5, 10,   907 }, {  6, 10,    31 }, {  6, 11,   218 },
+  {  7, 10,   491 }, {  7, 10,   530 }, {  8, 10,   592 }, { 11, 10,    53 },
+  { 11, 10,   779 }, { 12, 10,   167 }, { 12, 10,   411 }, { 14, 10,    14 },
+  { 14, 10,   136 }, { 15, 10,    72 }, { 16, 10,    17 }, { 16, 10,    72 },
+  { 12, 11,   330 }, {  7, 11,   454 }, {  7, 11,   782 }, {  8, 11,   768 },
+  {  4,  0,   507 }, { 10, 11,   676 }, { 12, 11,   462 }, {  6,  0,   630 },
+  {  9,  0,   811 }, {  4, 10,   208 }, {  5, 10,   106 }, {  6, 10,   531 },
+  {  8, 10,   408 }, {  9, 10,   188 }, { 10, 10,   572 }, {  4,  0,   343 },
+  {  5,  0,   511 }, {  6, 10,  1693 }, {  6, 11,   164 }, {  4,  0,   448 },
+  {  7,  0,   455 }, { 10,  0,   591 }, {  7,  0,  1381 }, { 12, 10,   441 },
+  { 22, 11,    50 }, {  9, 10,   449 }, { 10, 10,   192 }, { 10, 10,   740 },
+  {  6,  0,   575 }, {  4, 10,   241 }, {  6,  0,  1175 }, {  6,  0,   653 },
+  {  6,  0,  1761 }, {  6,  0,  1198 }, {  4, 10,   259 }, {  6, 11,   343 },
+  {  7, 11,   195 }, {  9, 11,   226 }, { 10, 11,   197 }, { 10, 11,   575 },
+  { 11, 11,   502 }, { 11, 11,   899 }, {  7,  0,  1127 }, {  7,  0,  1572 },
+  { 10,  0,   297 }, { 10,  0,   422 }, { 11,  0,   764 }, { 11,  0,   810 },
+  { 12,  0,   264 }, { 13,  0,   102 }, { 13,  0,   300 }, { 13,  0,   484 },
+  { 14,  0,   147 }, { 14,  0,   229 }, { 17,  0,    71 }, { 18,  0,   118 },
+  { 19,  0,   120 }, {  7, 11,   666 }, {  4,  0,   678 }, {  4, 10,   173 },
+  {  5, 10,   312 }, {  5, 10,   512 }, {  7, 10,  1285 }, {  7, 10,  1603 },
+  {  7, 10,  1691 }, {  9, 10,   464 }, { 11, 10,   195 }, { 12, 10,   279 },
+  { 12, 10,   448 }, { 14, 10,    11 }, { 19, 10,   102 }, { 16,  0,    99 },
+  { 18,  0,   164 }, {  7, 11,  1125 }, {  9, 11,   143 }, { 11, 11,    61 },
+  { 14, 11,   405 }, { 22, 11,    21 }, {  9, 11,   260 }, {  4, 10,   452 },
+  {  5, 10,   583 }, {  5, 10,   817 }, {  6, 10,   433 }, {  7, 10,   593 },
+  {  7, 10,   720 }, {  7, 10,  1378 }, {  8, 10,   161 }, {  9, 10,   284 },
+  { 10, 10,   313 }, { 11, 10,   886 }, {  4, 10,   547 }, {  8, 10,   722 },
+  { 14,  0,    35 }, { 14,  0,   191 }, { 13,  0,    45 }, { 10,  0,   121 },
+  {  4,  0,   125 }, {  6,  0,  1622 }, {  5, 11,   959 }, {  8, 10,   420 },
+  { 11, 10,   193 }, {  4,  0,   721 }, {  7, 10,   409 }, {  8,  0,   145 },
+  {  7,  0,   792 }, {  8,  0,   147 }, { 10,  0,   821 }, { 11,  0,   970 },
+  { 11,  0,  1021 }, {  8, 11,   173 }, {  6, 11,   266 }, {  4,  0,   715 },
+  {  7,  0,  1999 }, { 10, 10,   308 }, {  5,  0,   531 }, {  5,  0,   168 },
+  {  5,  0,   930 }, {  8,  0,    74 }, {  9,  0,   623 }, { 12,  0,   500 },
+  { 12,  0,   579 }, { 16,  0,    65 }, { 10, 11,   246 }, {  6,  0,   220 },
+  {  7,  0,  1101 }, { 13,  0,   105 }, { 14, 11,   314 }, {  5, 10,  1002 },
+  {  8, 10,   745 }, {  6,  0,   960 }, { 20,  0,     0 }, { 20, 11,     0 },
+  {  4,  0,  1005 }, {  4, 10,   239 }, {  6, 10,   477 }, {  7, 10,  1607 },
+  { 11, 10,    68 }, { 11, 10,   617 }, {  6,  0,    19 }, {  7,  0,  1413 },
+  { 11,  0,   428 }, { 21, 10,    13 }, {  7,  0,    96 }, {  8,  0,   401 },
+  {  8,  0,   703 }, {  9,  0,   896 }, {  8, 11,   300 }, {  6,  0,  1595 },
+  { 17,  0,   116 }, {  8,  0,  1021 }, {  7,  0,  1961 }, {  7,  0,  1965 },
+  {  7,  0,  2030 }, {  8,  0,   150 }, {  8,  0,   702 }, {  8,  0,   737 },
+  {  8,  0,   750 }, { 12,  0,   366 }, { 11, 11,    75 }, { 14, 11,   267 },
+  {  4, 10,   367 }, {  8,  0,   800 }, {  9,  0,   148 }, {  9,  0,   872 },
+  {  9,  0,   890 }, { 11,  0,   309 }, { 11,  0,  1001 }, { 13,  0,   267 },
+  { 13,  0,   323 }, {  5, 11,   427 }, {  5, 11,   734 }, {  7, 11,   478 },
+  {  8, 11,    52 }, {  7, 11,   239 }, { 11, 11,   217 }, { 14, 11,   165 },
+  {  4, 11,   323 }, { 12, 11,   419 }, { 13,  0,   299 }, { 14,  0,    75 },
+  {  6, 11,    87 }, {  6, 11,  1734 }, {  7, 11,    20 }, {  7, 11,  1056 },
+  {  8, 11,   732 }, {  9, 11,   406 }, {  9, 11,   911 }, { 10, 11,   694 },
+  {  6,  0,  1383 }, {  4, 10,   694 }, {  5, 11,   613 }, {  9,  0,   779 },
+  {  4,  0,   598 }, { 12, 10,   687 }, {  6,  0,   970 }, {  7,  0,   424 },
+  {  5,  0,   547 }, {  7, 11,    32 }, {  7, 11,   984 }, {  8, 11,    85 },
+  {  8, 11,   709 }, {  9, 11,   579 }, {  9, 11,   847 }, {  9, 11,   856 },
+  { 10, 11,   799 }, { 11, 11,   258 }, { 11, 11,  1007 }, { 12, 11,   331 },
+  { 12, 11,   615 }, { 13, 11,   188 }, { 13, 11,   435 }, { 14, 11,     8 },
+  { 15, 11,   165 }, { 16, 11,    27 }, { 20, 11,    40 }, {  6,  0,  1222 },
+  {  6,  0,  1385 }, {  4,  0,   876 }, { 10, 11,   151 }, {  7, 10,   213 },
+  {  4, 11,   167 }, {  7, 11,    82 }, {  5,  0,   133 }, {  6, 11,    24 },
+  {  7, 11,    74 }, {  7, 11,   678 }, {  9, 11,   258 }, {  5, 11,    62 },
+  {  6, 11,   534 }, {  7, 11,   684 }, {  7, 11,  1043 }, {  7, 11,  1072 },
+  {  8, 11,   280 }, {  8, 11,   541 }, {  8, 11,   686 }, { 10, 11,   519 },
+  { 11, 11,   252 }, { 12, 11,   282 }, {  8,  0,   187 }, {  8,  0,     8 },
+  { 10,  0,     0 }, { 10,  0,   818 }, { 11,  0,   988 }, {  4, 11,   359 },
+  { 11,  0,   429 }, { 15,  0,    51 }, {  7, 10,  1672 }, {  8,  0,   685 },
+  {  5, 11,   211 }, {  7, 11,    88 }, {  8, 11,   627 }, {  6,  0,   472 },
+  {  8,  0,   132 }, {  6, 11,   145 }, { 13, 11,   336 }, {  4, 10,   751 },
+  { 11, 10,   390 }, { 12, 10,    32 }, {  6,  0,   938 }, {  6,  0,  1060 },
+  {  4, 11,   263 }, {  4, 10,   409 }, {  5, 10,    78 }, {  9,  0,   874 },
+  {  8,  0,   774 }, { 10,  0,   670 }, { 12,  0,    51 }, {  4, 11,   916 },
+  {  6, 10,   473 }, {  7, 10,  1602 }, { 10, 10,   698 }, { 12, 10,   212 },
+  { 13, 10,   307 }, { 17, 10,   105 }, { 18,  0,    92 }, { 15, 10,   156 },
+  {  4,  0,   830 }, {  9,  0,   701 }, {  4, 11,   599 }, {  6, 11,  1634 },
+  {  7, 11,     5 }, {  7, 11,    55 }, {  7, 11,    67 }, {  7, 11,    97 },
+  {  7, 11,   691 }, {  7, 11,   979 }, {  7, 11,  1697 }, {  8, 11,   207 },
+  {  8, 11,   214 }, {  8, 11,   231 }, {  8, 11,   294 }, {  8, 11,   336 },
+  {  8, 11,   428 }, {  8, 11,   451 }, {  8, 11,   460 }, {  8, 11,   471 },
+  {  8, 11,   622 }, {  8, 11,   626 }, {  8, 11,   679 }, {  8, 11,   759 },
+  {  8, 11,   829 }, {  9, 11,    11 }, {  9, 11,   246 }, {  9, 11,   484 },
+  {  9, 11,   573 }, {  9, 11,   706 }, {  9, 11,   762 }, {  9, 11,   798 },
+  {  9, 11,   855 }, {  9, 11,   870 }, {  9, 11,   912 }, { 10, 11,   303 },
+  { 10, 11,   335 }, { 10, 11,   424 }, { 10, 11,   461 }, { 10, 11,   543 },
+  { 10, 11,   759 }, { 10, 11,   814 }, { 11, 11,    59 }, { 11, 11,   199 },
+  { 11, 11,   235 }, { 11, 11,   475 }, { 11, 11,   590 }, { 11, 11,   929 },
+  { 11, 11,   963 }, { 12, 11,   114 }, { 12, 11,   182 }, { 12, 11,   226 },
+  { 12, 11,   332 }, { 12, 11,   439 }, { 12, 11,   575 }, { 12, 11,   598 },
+  { 13, 11,     8 }, { 13, 11,   125 }, { 13, 11,   194 }, { 13, 11,   287 },
+  { 14, 11,   197 }, { 14, 11,   383 }, { 15, 11,    53 }, { 17, 11,    63 },
+  { 19, 11,    46 }, { 19, 11,    98 }, { 19, 11,   106 }, { 20, 11,    85 },
+  {  4,  0,   127 }, {  5,  0,   350 }, {  6,  0,   356 }, {  8,  0,   426 },
+  {  9,  0,   572 }, { 10,  0,   247 }, { 11,  0,   312 }, {  6,  0,  1215 },
+  {  6,  0,    59 }, {  9,  0,   603 }, { 13,  0,   397 }, {  7, 11,  1853 },
+  { 10, 11,   437 }, {  6,  0,  1762 }, { 19, 11,   126 }, {  7, 10,   883 },
+  { 13,  0,   293 }, { 14,  0,    56 }, {  5, 10,   617 }, { 11, 10,    50 },
+  {  5, 11,   187 }, {  7, 10,  1518 }, { 11, 10,   694 }, {  7,  0,   441 },
+  {  6,  0,   111 }, {  7,  0,     4 }, {  8,  0,   163 }, {  8,  0,   776 },
+  { 10,  0,   566 }, {  4,  0,   806 }, {  4, 11,   215 }, {  9, 11,    38 },
+  { 10, 11,     3 }, { 11, 11,    23 }, { 11, 11,   127 }, { 11, 11,   796 },
+  { 14,  0,   233 }, {  4, 10,   546 }, {  7, 10,  2042 }, {  7,  0,  1994 },
+  {  6,  0,  1739 }, {  7, 11,  1530 }, {  8,  0,   393 }, {  5,  0,   297 },
+  {  7,  0,  1038 }, { 14,  0,   359 }, { 19,  0,    52 }, { 20,  0,    47 },
+  {  7,  0,   309 }, {  4, 10,   313 }, {  5, 10,   577 }, {  8, 10,   184 },
+  { 13, 10,   433 }, {  7, 10,   935 }, { 12, 10,   186 }, { 12, 10,   292 },
+  { 14, 10,   100 }, { 18, 10,    70 }, {  8,  0,   363 }, { 14,  0,   175 },
+  { 11, 10,   402 }, { 12, 10,   109 }, { 12, 10,   431 }, { 13, 10,   179 },
+  { 13, 10,   206 }, { 14, 10,   217 }, { 16, 10,     3 }, { 20, 10,    53 },
+  {  5, 10,   886 }, {  6, 10,    46 }, {  6, 10,  1790 }, {  7, 10,    14 },
+  {  7, 10,   732 }, {  7, 10,  1654 }, {  8, 10,    95 }, {  8, 10,   327 },
+  {  8, 10,   616 }, {  9, 10,   892 }, { 10, 10,   598 }, { 10, 10,   769 },
+  { 11, 10,   134 }, { 11, 10,   747 }, { 12, 10,   378 }, { 14, 10,    97 },
+  {  8,  0,   666 }, {  7,  0,  1675 }, {  6,  0,   655 }, {  6,  0,  1600 },
+  {  7,  0,   808 }, {  5, 10,  1021 }, {  4, 11,    28 }, {  5, 11,   440 },
+  {  7, 11,   248 }, { 11, 11,   833 }, { 12, 11,   344 }, {  6, 11,  1654 },
+  {  4,  0,   280 }, { 12,  0,    54 }, {  4,  0,   421 }, {  5,  0,   548 },
+  {  4, 10,   153 }, {  6, 11,   339 }, {  7, 11,   923 }, {  5, 11,   853 },
+  {  5, 10,   798 }, {  4, 10,   587 }, {  6, 11,   249 }, {  7, 11,  1234 },
+  { 11, 11,   573 }, {  6, 10,   598 }, {  7, 10,    42 }, {  8, 10,   695 },
+  { 10, 10,   212 }, { 11, 10,   158 }, { 14, 10,   196 }, { 17, 10,    85 },
+  {  7,  0,   249 }, {  5, 10,   957 }, {  5, 10,  1008 }, {  4, 10,   129 },
+  {  7, 10,   465 }, {  6,  0,   254 }, {  7,  0,   842 }, {  7,  0,  1659 },
+  {  9,  0,   109 }, { 10,  0,   103 }, {  7, 10,   908 }, {  7, 10,  1201 },
+  {  9, 10,   755 }, { 11, 10,   906 }, { 12, 10,   527 }, { 18, 10,     7 },
+  {  5,  0,   262 }, {  8, 10,   450 }, { 16,  0,     1 }, { 10, 11,   201 },
+  { 14, 11,   319 }, {  7, 11,    49 }, {  7, 11,   392 }, {  8, 11,    20 },
+  {  8, 11,   172 }, {  8, 11,   690 }, {  9, 11,   383 }, {  9, 11,   845 },
+  { 10, 11,    48 }, { 11, 11,   293 }, { 11, 11,   832 }, { 11, 11,   920 },
+  { 13, 11,   221 }, {  5, 11,   858 }, {  5, 11,   992 }, {  6,  0,   805 },
+  { 11, 10,  1003 }, {  6,  0,  1630 }, {  6, 11,   307 }, {  7, 11,  1512 },
+  {  7, 11,  1794 }, {  6, 11,   268 }, {  9, 11,    62 }, {  7, 10,  1868 },
+  {  5,  0,   671 }, {  4,  0,   989 }, {  8,  0,   972 }, {  8,  0,   998 },
+  {  4, 11,   423 }, {  4,  0,   889 }, {  7,  0,  1382 }, {  7,  0,  1910 },
+  {  7, 10,   965 }, {  7, 10,  1460 }, {  7, 10,  1604 }, {  4,  0,   627 },
+  {  5,  0,   775 }, { 10, 11,   106 }, {  6, 11,   348 }, {  7,  0,   202 },
+  { 11,  0,   362 }, { 11,  0,   948 }, { 12,  0,   388 }, { 10, 11,   771 },
+  {  6, 11,   613 }, {  8, 11,   223 }, {  6,  0,   560 }, {  7,  0,   451 },
+  {  8,  0,   389 }, { 12,  0,   490 }, { 13,  0,    16 }, { 13,  0,   215 },
+  { 13,  0,   351 }, { 18,  0,   132 }, { 19,  0,   125 }, {  7,  0,   841 },
+  {  8,  0,   566 }, {  8,  0,   938 }, {  4, 11,   670 }, {  5,  0,   912 },
+  {  6,  0,  1695 }, { 12, 11,    55 }, {  9, 11,    40 }, { 11, 11,   136 },
+  {  7,  0,  1361 }, {  7, 10,   982 }, { 10, 10,    32 }, { 15, 10,    56 },
+  { 11, 11,   259 }, { 12, 11,   270 }, {  5,  0,   236 }, {  6,  0,   572 },
+  {  8,  0,   492 }, { 11,  0,   618 }, { 16,  0,    56 }, {  8, 11,   572 },
+  {  9, 11,   310 }, {  9, 11,   682 }, {  9, 11,   698 }, {  6,  0,  1854 },
+  {  5,  0,   190 }, {  8,  0,   318 }, {  5, 10,   435 }, {  7,  0,  1376 },
+  {  4, 11,   296 }, {  6, 11,   352 }, {  7, 11,   401 }, {  7, 11,  1410 },
+  {  7, 11,  1594 }, {  7, 11,  1674 }, {  8, 11,    63 }, {  8, 11,   660 },
+  {  9, 11,    74 }, {  7,  0,   349 }, {  5, 10,    85 }, {  6, 10,   419 },
+  {  7, 10,   305 }, {  7, 10,   361 }, {  7, 10,  1337 }, {  8, 10,    71 },
+  { 12, 10,   519 }, {  4, 11,   139 }, {  4, 11,   388 }, { 12, 11,   188 },
+  {  6,  0,  1972 }, {  6,  0,  2013 }, {  8,  0,   951 }, { 10,  0,   947 },
+  { 10,  0,   974 }, { 10,  0,  1018 }, { 14,  0,   476 }, { 12, 10,   688 },
+  {  7, 10,   740 }, {  5, 10,   691 }, {  7, 10,   345 }, {  9, 10,    94 },
+  { 12, 10,   169 }, {  9,  0,   344 }, {  5, 10,   183 }, {  6, 10,   582 },
+  { 10, 10,   679 }, { 12, 10,   435 }, {  7, 10,   511 }, {  4,  0,   850 },
+  {  8, 11,   441 }, { 10, 11,   314 }, { 15, 11,     3 }, {  7, 10,  1993 },
+  {  8, 10,   684 }, {  4, 11,   747 }, {  6, 11,   290 }, {  6, 10,   583 },
+  {  7, 11,   649 }, {  7, 11,  1479 }, {  7, 11,  1583 }, {  5, 11,   232 },
+  {  5, 10,   704 }, {  6,  0,   910 }, {  4, 10,   179 }, {  5, 10,   198 },
+  {  5, 10,   697 }, {  7, 10,   347 }, {  7, 10,   971 }, {  8, 10,   181 },
+  { 10, 10,   711 }, {  8, 11,   525 }, { 14,  0,    19 }, { 14,  0,    28 },
+  { 16,  0,    29 }, {  7,  0,    85 }, {  7,  0,   247 }, {  8,  0,   585 },
+  { 10,  0,   163 }, {  4,  0,   487 }, {  7, 11,   472 }, {  7, 11,  1801 },
+  { 10, 11,   748 }, { 13, 11,   458 }, {  4, 10,   243 }, {  5, 10,   203 },
+  {  7, 10,    19 }, {  7, 10,    71 }, {  7, 10,   113 }, { 10, 10,   405 },
+  { 11, 10,   357 }, { 14, 10,   240 }, {  7, 10,  1450 }, { 11, 10,    99 },
+  {  4, 11,   425 }, { 10,  0,   145 }, { 19,  0,    83 }, {  6, 10,   492 },
+  {  9, 11,   247 }, {  4,  0,  1013 }, {  6,  0,  2033 }, {  5, 10,   134 },
+  {  6, 10,   408 }, {  6, 10,   495 }, {  7, 10,  1593 }, {  7,  0,  1922 },
+  {  6, 11,  1768 }, {  4,  0,   124 }, { 10,  0,   457 }, { 11,  0,   121 },
+  { 11,  0,   169 }, { 11,  0,   870 }, { 11,  0,   874 }, { 12,  0,   214 },
+  { 14,  0,   187 }, { 15,  0,    77 }, {  5,  0,   557 }, {  7,  0,  1457 },
+  { 11,  0,    66 }, {  5, 11,   943 }, {  6, 11,  1779 }, { 14, 10,     4 },
+  {  4, 10,   248 }, {  4, 10,   665 }, {  7, 10,   137 }, {  9, 10,   349 },
+  {  7,  0,  1193 }, {  5, 11,   245 }, {  6, 11,   576 }, {  7, 11,   582 },
+  {  8, 11,   225 }, { 16,  0,    82 }, {  7, 10,  1270 }, { 11, 10,   612 },
+  {  5,  0,   454 }, { 10,  0,   352 }, { 10, 11,   352 }, { 18,  0,    57 },
+  {  5, 10,   371 }, {  7, 10,   563 }, {  7,  0,  1333 }, {  6,  0,   107 },
+  {  7,  0,   638 }, {  7,  0,  1632 }, {  9,  0,   396 }, {  6, 11,   610 },
+  {  5,  0,   370 }, {  6,  0,  1756 }, {  4, 10,   374 }, {  7, 10,   547 },
+  {  7, 10,  1700 }, {  7, 10,  1833 }, { 11, 10,   858 }, {  5,  0,   204 },
+  {  6,  0,  1305 }, {  9, 10,   311 }, { 13, 10,    42 }, {  5,  0,   970 },
+  {  6,  0,  1706 }, {  6, 10,  1647 }, {  7, 10,  1552 }, {  7, 10,  2010 },
+  {  9, 10,   494 }, {  9, 10,   509 }, { 13, 11,   455 }, { 15, 11,    99 },
+  { 15, 11,   129 }, { 16, 11,    68 }, {  7,  0,     3 }, {  4,  0,    35 },
+  {  5,  0,   121 }, {  5,  0,   483 }, {  5,  0,   685 }, {  6,  0,   489 },
+  {  6,  0,   782 }, {  6,  0,  1032 }, {  7,  0,  1204 }, {  8,  0,   394 },
+  {  4,  0,   921 }, {  5,  0,  1007 }, {  8, 11,   360 }, { 10, 11,    63 },
+  {  7,  0,  1696 }, {  6,  0,  1519 }, {  4, 11,   443 }, {  7, 11,   944 },
+  {  6, 10,   123 }, {  7, 10,   214 }, {  9, 10,   728 }, { 10, 10,   157 },
+  { 11, 10,   346 }, { 11, 10,   662 }, { 15, 10,   106 }, {  9,  0,   981 },
+  {  7, 10,  1435 }, {  6,  0,  1072 }, {  4,  0,   712 }, {  6,  0,  1629 },
+  {  6,  0,   728 }, {  4, 11,   298 }, {  9, 11,   483 }, {  6,  0,  1177 },
+  {  6,  0,  1271 }, {  5, 11,   164 }, {  7, 11,   121 }, { 14, 11,   189 },
+  {  7,  0,  1608 }, {  4, 10,   707 }, {  5, 10,   588 }, {  6, 10,   393 },
+  { 13, 10,   106 }, { 18, 10,    49 }, { 19, 10,    41 }, { 23,  0,    16 },
+  { 23, 11,    16 }, {  6, 10,   211 }, {  7, 10,  1690 }, { 11, 10,   486 },
+  { 12, 10,   369 }, {  5,  0,   485 }, { 19, 11,    15 }, { 21, 11,    27 },
+  {  4, 11,   172 }, {  9, 11,   611 }, { 10, 11,   436 }, { 12, 11,   673 },
+  { 13, 11,   255 }, {  5, 11,   844 }, { 10, 11,   484 }, { 11, 11,   754 },
+  { 12, 11,   457 }, { 14, 11,   171 }, { 14, 11,   389 }, { 18, 11,   153 },
+  {  4,  0,   285 }, {  5,  0,    27 }, {  5,  0,   317 }, {  6,  0,   301 },
+  {  7,  0,     7 }, {  8,  0,   153 }, { 10,  0,   766 }, { 11,  0,   468 },
+  { 12,  0,   467 }, { 13,  0,   143 }, {  6,  0,  1462 }, {  9, 11,   263 },
+  { 10, 11,   147 }, { 10, 11,   492 }, {  5, 11,   537 }, {  6,  0,  1945 },
+  {  6,  0,  1986 }, {  6,  0,  1991 }, {  6,  0,  2038 }, {  6, 10,   219 },
+  {  9, 11,   842 }, { 14,  0,    52 }, { 17,  0,    50 }, {  5, 10,   582 },
+  {  6, 10,  1646 }, {  7, 10,    99 }, {  7, 10,  1962 }, {  7, 10,  1986 },
+  {  8, 10,   515 }, {  8, 10,   773 }, {  9, 10,    23 }, {  9, 10,   491 },
+  { 12, 10,   620 }, { 14, 10,    93 }, { 10, 11,    97 }, { 20,  0,    21 },
+  { 20,  0,    44 }, {  5, 10,   851 }, {  8,  0,   819 }, { 11,  0,   917 },
+  {  5, 11,   230 }, {  5, 11,   392 }, {  6, 11,   420 }, {  8, 10,   762 },
+  {  8, 10,   812 }, {  9, 11,   568 }, {  9, 10,   910 }, { 12, 11,   612 },
+  {  7,  0,   784 }, { 15,  0,   135 }, { 15, 11,   135 }, { 10,  0,   454 },
+  { 12,  0,   324 }, {  4, 11,     0 }, {  5, 11,    41 }, {  7, 11,  1459 },
+  {  7, 11,  1469 }, {  7, 11,  1618 }, {  7, 11,  1859 }, {  9, 11,   549 },
+  { 11, 11,   905 }, {  4, 10,    98 }, {  7, 10,  1365 }, {  9, 10,   422 },
+  {  9, 10,   670 }, { 10, 10,   775 }, { 11, 10,   210 }, { 13, 10,    26 },
+  { 13, 10,   457 }, { 13, 10,   476 }, {  6,  0,  1719 }, {  6,  0,  1735 },
+  {  7,  0,  2016 }, {  7,  0,  2020 }, {  8,  0,   837 }, {  9,  0,   852 },
+  {  5, 11,   696 }, {  7,  0,   852 }, {  4,  0,   952 }, {  6, 10,  1730 },
+  {  4, 11,   771 }, { 10,  0,   568 }, {  9,  0,   448 }, { 11,  0,   146 },
+  {  8,  0,    67 }, { 10,  0,   419 }, {  5, 11,   921 }, {  9, 10,   147 },
+  {  6,  0,  1826 }, { 10,  0,   657 }, { 14,  0,   297 }, { 14,  0,   361 },
+  {  6,  0,   666 }, {  6,  0,   767 }, {  6,  0,  1542 }, { 11,  0,   729 },
+  {  6, 11,   180 }, {  7, 11,  1137 }, {  8, 11,   751 }, { 11, 11,   805 },
+  {  4, 11,   183 }, {  7, 11,   271 }, { 11, 11,   824 }, { 11, 11,   952 },
+  { 13, 11,   278 }, { 13, 11,   339 }, { 13, 11,   482 }, { 14, 11,   424 },
+  { 20, 11,    99 }, {  4,  0,   669 }, {  5, 11,   477 }, {  5, 11,   596 },
+  {  6, 11,   505 }, {  7, 11,  1221 }, { 11, 11,   907 }, { 12, 11,   209 },
+  { 13, 11,   214 }, {  7, 11,  1215 }, {  5,  0,   402 }, {  6, 10,    30 },
+  { 11, 10,    56 }, { 11, 10,   305 }, {  7, 11,   564 }, { 14, 11,   168 },
+  { 11,  0,   152 }, {  7,  0,   912 }, {  7, 10,  1614 }, {  4, 10,   150 },
+  {  5, 10,   303 }, {  6, 10,   327 }, {  7,  0,   320 }, {  8,  0,    51 },
+  {  9,  0,   868 }, { 10,  0,   833 }, { 12,  0,   481 }, { 12,  0,   570 },
+  { 20,  0,   106 }, {  4,  0,   445 }, {  7, 11,   274 }, { 11, 11,   263 },
+  { 11, 11,   479 }, { 11, 11,   507 }, { 12, 11,   277 }, { 10,  0,   555 },
+  { 11,  0,   308 }, { 19,  0,    95 }, {  6, 11,  1645 }, {  8, 10,   192 },
+  { 10, 10,    78 }, { 13, 10,   359 }, {  7, 10,   786 }, {  6, 11,    92 },
+  {  6, 11,   188 }, {  7, 11,  1269 }, {  7, 11,  1524 }, {  7, 11,  1876 },
+  { 10, 11,   228 }, { 11, 11,  1020 }, {  4, 11,   459 }, {  5, 11,   966 },
+  { 11,  0,   386 }, {  6, 10,  1638 }, {  7, 10,    79 }, {  7, 10,   496 },
+  {  9, 10,   138 }, { 10, 10,   336 }, { 12, 10,   412 }, { 12, 10,   440 },
+  { 14, 10,   305 }, {  5,  0,   239 }, {  7,  0,    83 }, {  7,  0,  1990 },
+  {  8,  0,   130 }, { 11,  0,   720 }, { 10, 11,   709 }, {  4,  0,   143 },
+  {  5,  0,   550 }, {  5,  0,   752 }, {  5,  0,   123 }, {  6,  0,   530 },
+  {  7,  0,   348 }, {  7,  0,  1419 }, {  7,  0,  2024 }, {  6, 11,    18 },
+  {  7, 11,   179 }, {  7, 11,   721 }, {  7, 11,   932 }, {  8, 11,   548 },
+  {  8, 11,   757 }, {  9, 11,    54 }, {  9, 11,    65 }, {  9, 11,   532 },
+  {  9, 11,   844 }, { 10, 11,   113 }, { 10, 11,   117 }, { 10, 11,   236 },
+  { 10, 11,   315 }, { 10, 11,   430 }, { 10, 11,   798 }, { 11, 11,   153 },
+  { 11, 11,   351 }, { 11, 11,   375 }, { 12, 11,    78 }, { 12, 11,   151 },
+  { 12, 11,   392 }, { 14, 11,   248 }, { 15, 11,    23 }, {  7, 10,   204 },
+  {  7, 10,   415 }, {  8, 10,    42 }, { 10, 10,    85 }, { 11, 10,   564 },
+  {  6,  0,   958 }, {  5, 11,   965 }, {  4,  0,   210 }, {  7, 11,  1429 },
+  { 10, 11,   480 }, {  6, 11,   182 }, { 11, 11,   345 }, { 10, 11,    65 },
+  { 10, 11,   488 }, { 10, 11,   497 }, {  4, 10,     3 }, {  5, 10,   247 },
+  {  5, 10,   644 }, {  7, 10,   744 }, {  7, 10,  1207 }, {  7, 10,  1225 },
+  {  7, 10,  1909 }, { 18, 10,   147 }, {  4,  0,   430 }, {  5, 10,   285 },
+  {  9, 10,    67 }, { 13, 10,   473 }, { 15, 10,    82 }, { 16, 11,    16 },
+  {  7, 11,  1162 }, {  9, 11,   588 }, { 10, 11,   260 }, { 23, 10,     8 },
+  {  5,  0,   213 }, { 10,  0,     7 }, {  7,  0,   801 }, {  6, 11,  1786 },
+  {  7, 11,   308 }, {  6,  0,   936 }, {  6,  0,  1289 }, {  5,  0,   108 },
+  {  4,  0,   885 }, {  5,  0,   219 }, { 11,  0,   587 }, {  4,  0,   193 },
+  {  5,  0,   916 }, {  6,  0,  1041 }, {  7,  0,   364 }, { 10,  0,   398 },
+  { 10,  0,   726 }, { 11,  0,   317 }, { 11,  0,   626 }, { 12,  0,   142 },
+  { 12,  0,   288 }, { 12,  0,   678 }, { 13,  0,   313 }, { 15,  0,   113 },
+  { 18,  0,   114 }, {  7,  0,  1165 }, {  6,  0,   241 }, {  9,  0,   342 },
+  { 10,  0,   729 }, { 11,  0,   284 }, { 11,  0,   445 }, { 11,  0,   651 },
+  { 11,  0,   863 }, { 13,  0,   398 }, { 18,  0,    99 }, {  7,  0,   907 },
+  {  8,  0,   832 }, {  9,  0,   303 }, {  4, 10,    29 }, {  6, 10,   532 },
+  {  7, 10,  1628 }, {  7, 10,  1648 }, {  9, 10,   350 }, { 10, 10,   433 },
+  { 11, 10,    97 }, { 11, 10,   557 }, { 11, 10,   745 }, { 12, 10,   289 },
+  { 12, 10,   335 }, { 12, 10,   348 }, { 12, 10,   606 }, { 13, 10,   116 },
+  { 13, 10,   233 }, { 13, 10,   466 }, { 14, 10,   181 }, { 14, 10,   209 },
+  { 14, 10,   232 }, { 14, 10,   236 }, { 14, 10,   300 }, { 16, 10,    41 },
+  { 20, 10,    97 }, {  7, 11,   423 }, {  7, 10,  1692 }, {  8, 11,   588 },
+  {  6,  0,   931 }, {  6,  0,  1454 }, {  5, 10,   501 }, {  7, 10,  1704 },
+  {  9, 10,   553 }, { 11, 10,   520 }, { 12, 10,   557 }, { 13, 10,   249 },
+  {  8, 11,   287 }, {  4,  0,   562 }, {  9,  0,   254 }, { 11,  0,   879 },
+  {  4,  0,   786 }, { 14, 11,    32 }, { 18, 11,    85 }, { 20, 11,     2 },
+  { 24, 11,    16 }, {  7,  0,  1294 }, {  7, 11,   723 }, {  7, 11,  1135 },
+  {  6,  0,   216 }, {  7,  0,   901 }, {  7,  0,  1343 }, {  8,  0,   493 },
+  {  6, 11,   403 }, {  7, 11,   719 }, {  8, 11,   809 }, {  8, 11,   834 },
+  {  5, 11,   210 }, {  6, 11,   213 }, {  7, 11,    60 }, { 10, 11,   364 },
+  { 11, 11,   135 }, {  7,  0,   341 }, { 11,  0,   219 }, {  5, 11,   607 },
+  {  8, 11,   326 }, {  8, 11,   490 }, {  4, 11,   701 }, {  5, 11,   472 },
+  {  5, 11,   639 }, {  7, 11,  1249 }, {  9, 11,   758 }, { 11, 11,   896 },
+  {  7, 11,   380 }, {  7, 11,  1947 }, { 11,  0,   130 }, {  7,  0,  1734 },
+  { 10,  0,   115 }, { 11,  0,   420 }, { 12,  0,   154 }, { 13,  0,   404 },
+  { 14,  0,   346 }, { 15,  0,    54 }, {  6, 10,   129 }, {  4, 11,   386 },
+  {  7, 11,    41 }, {  8, 11,   405 }, {  9, 11,   497 }, { 11, 11,   110 },
+  { 11, 11,   360 }, { 15, 11,    37 }, { 16, 11,    84 }, { 13, 11,   282 },
+  {  5, 11,    46 }, {  7, 11,  1452 }, {  7, 11,  1480 }, {  8, 11,   634 },
+  { 12, 11,   472 }, {  4, 11,   524 }, {  8, 11,   810 }, { 10, 11,   238 },
+  { 13, 11,    33 }, {  5,  0,   604 }, {  5,  0,  1011 }, {  8,  0,   701 },
+  {  8,  0,   856 }, {  8,  0,   858 }, {  8,  0,   879 }, { 12,  0,   702 },
+  { 14,  0,   447 }, {  4,  0,    54 }, {  5,  0,   666 }, {  7,  0,  1039 },
+  {  7,  0,  1130 }, {  9,  0,   195 }, { 10,  0,   302 }, {  4, 10,    25 },
+  {  5, 10,    60 }, {  6, 10,   504 }, {  7, 10,   614 }, {  7, 10,  1155 },
+  { 12, 10,     0 }, {  7, 10,  1248 }, { 11, 10,   621 }, { 11, 10,   702 },
+  {  5, 11,   997 }, {  9, 10,   321 }, {  6,  0,  1669 }, {  6,  0,  1791 },
+  {  4, 10,   379 }, {  7, 10,  1397 }, { 10, 11,   372 }, {  5, 11,   782 },
+  {  5, 11,   829 }, {  6, 11,  1738 }, {  7,  0,  1228 }, {  4, 10,   118 },
+  {  6, 10,   274 }, {  6, 10,   361 }, {  7, 10,    75 }, { 13, 10,   441 },
+  {  4,  0,   623 }, {  9, 11,   279 }, { 10, 11,   407 }, { 14, 11,    84 },
+  { 22, 11,    18 }, {  9, 10,   841 }, {  7,  0,   798 }, { 12, 10,   693 },
+  {  5, 10,   314 }, {  6, 10,   221 }, {  7, 10,   419 }, { 10, 10,   650 },
+  { 11, 10,   396 }, { 12, 10,   156 }, { 13, 10,   369 }, { 14, 10,   333 },
+  { 17, 10,    47 }, {  7, 11,  1372 }, {  7,  0,   122 }, {  9,  0,   259 },
+  { 10,  0,    84 }, { 11,  0,   470 }, { 12,  0,   541 }, { 13,  0,   379 },
+  {  6,  0,   837 }, {  8,  0,  1013 }, {  4, 11,    78 }, {  5, 11,    96 },
+  {  5, 11,   182 }, {  7, 11,  1724 }, {  7, 11,  1825 }, { 10, 11,   394 },
+  { 10, 11,   471 }, { 11, 11,   532 }, { 14, 11,   340 }, { 17, 11,    88 },
+  {  6,  0,   577 }, {  7, 11,  1964 }, {  4, 10,   913 }, {  6,  0,   460 },
+  {  8,  0,   891 }, { 10,  0,   901 }, { 10,  0,   919 }, { 10,  0,   932 },
+  { 12,  0,   715 }, { 12,  0,   728 }, { 12,  0,   777 }, { 14,  0,   457 },
+  { 16,  0,   103 }, {  5,  0,    82 }, {  5,  0,   131 }, {  7,  0,  1755 },
+  {  8,  0,    31 }, {  9,  0,   168 }, {  9,  0,   764 }, { 11,  0,   869 },
+  {  8, 10,   475 }, {  6,  0,   605 }, {  5, 10,  1016 }, {  9, 11,   601 },
+  {  9, 11,   619 }, { 10, 11,   505 }, { 10, 11,   732 }, { 11, 11,   355 },
+  { 12, 11,   139 }, {  7, 10,   602 }, {  8, 10,   179 }, { 10, 10,   781 },
+  { 12, 10,   126 }, {  6,  0,  1246 }, {  6, 10,   329 }, { 10, 10,   111 },
+  {  6, 11,   215 }, {  7, 11,  1028 }, {  7, 11,  1473 }, {  7, 11,  1721 },
+  {  9, 11,   424 }, { 10, 11,   779 }, {  5,  0,   278 }, {  9,  0,    68 },
+  {  6,  0,   932 }, {  6,  0,  1084 }, { 16,  0,    86 }, {  4,  0,   163 },
+  {  5,  0,   201 }, {  5,  0,   307 }, {  5,  0,   310 }, {  6,  0,   335 },
+  {  7,  0,   284 }, {  7,  0,  1660 }, {  8,  0,   165 }, {  8,  0,   781 },
+  {  6,  0,   707 }, {  6,  0,    33 }, {  7,  0,  1244 }, {  5, 10,   821 },
+  {  6, 11,    67 }, {  6, 10,  1687 }, {  7, 11,   258 }, {  7, 11,  1630 },
+  {  9, 11,   354 }, {  9, 11,   675 }, { 10, 11,   830 }, { 14, 11,    80 },
+  { 17, 11,    80 }, {  6, 11,   141 }, {  7, 11,   225 }, {  9, 11,    59 },
+  {  9, 11,   607 }, { 10, 11,   312 }, { 11, 11,   687 }, { 12, 11,   555 },
+  { 13, 11,   373 }, { 13, 11,   494 }, { 20, 11,    58 }, {  6,  0,  1113 },
+  {  9,  0,   388 }, {  5, 10,    71 }, {  7, 10,  1407 }, {  9, 10,   704 },
+  { 10, 10,   261 }, { 10, 10,   619 }, { 11, 10,   547 }, { 11, 10,   619 },
+  { 15, 10,   157 }, {  7,  0,  1953 }, {  8,  0,   720 }, { 10,  0,   203 },
+  {  7, 10,  2008 }, {  9, 10,   337 }, { 10, 10,   517 }, {  6,  0,   326 },
+  {  7,  0,   677 }, {  9,  0,   425 }, { 11, 11,    81 }, {  7,  0,  1316 },
+  {  7,  0,  1412 }, {  7,  0,  1839 }, {  9,  0,   589 }, { 11,  0,   241 },
+  { 11,  0,   676 }, { 11,  0,   811 }, { 11,  0,   891 }, { 12,  0,   140 },
+  { 12,  0,   346 }, { 12,  0,   479 }, { 13,  0,   140 }, { 13,  0,   381 },
+  { 14,  0,   188 }, { 18,  0,    30 }, { 20,  0,   108 }, {  5,  0,   416 },
+  {  6, 10,    86 }, {  6, 10,   603 }, {  7, 10,   292 }, {  7, 10,   561 },
+  {  8, 10,   257 }, {  8, 10,   382 }, {  9, 10,   721 }, {  9, 10,   778 },
+  { 11, 10,   581 }, { 12, 10,   466 }, {  4, 10,   486 }, {  5, 10,   491 },
+  {  6,  0,  1300 }, {  4, 10,    72 }, {  7,  0,   847 }, {  6, 10,   265 },
+  {  7, 11,   430 }, { 11, 11,    46 }, {  5, 11,   602 }, {  6, 11,   106 },
+  {  7, 11,  1786 }, {  7, 11,  1821 }, {  7, 11,  2018 }, {  9, 11,   418 },
+  {  9, 11,   763 }, {  5,  0,   358 }, {  7,  0,   535 }, {  7,  0,  1184 },
+  { 10,  0,   662 }, { 13,  0,   212 }, { 13,  0,   304 }, { 13,  0,   333 },
+  { 17,  0,    98 }, {  5, 11,    65 }, {  6, 11,   416 }, {  7, 11,  1720 },
+  {  7, 11,  1924 }, {  8, 11,   677 }, { 10, 11,   109 }, { 11, 11,    14 },
+  { 11, 11,    70 }, { 11, 11,   569 }, { 11, 11,   735 }, { 15, 11,   153 },
+  { 20, 11,    80 }, {  6,  0,  1823 }, {  8,  0,   839 }, {  8,  0,   852 },
+  {  8,  0,   903 }, { 10,  0,   940 }, { 12,  0,   707 }, { 12,  0,   775 },
+  {  7, 11,  1229 }, {  6,  0,  1522 }, { 12,  0,   654 }, {  8, 11,   595 },
+  { 11,  0,   163 }, { 13,  0,   314 }, {  4,  0,   978 }, {  4,  0,   601 },
+  {  6,  0,  2035 }, {  9, 10,   234 }, {  5, 10,   815 }, {  6, 10,  1688 },
+  {  6, 10,  1755 }, {  5,  0,   946 }, {  8,  0,   434 }, {  6, 10,   197 },
+  {  8, 10,   205 }, {  7,  0,   411 }, {  7,  0,   590 }, {  8,  0,   631 },
+  {  9,  0,   323 }, { 10,  0,   355 }, { 11,  0,   491 }, { 12,  0,   143 },
+  { 12,  0,   402 }, { 13,  0,    73 }, { 14,  0,   408 }, { 15,  0,   107 },
+  { 18,  0,    71 }, {  7,  0,  1467 }, {  8,  0,   328 }, { 10,  0,   544 },
+  { 11,  0,   955 }, { 12,  0,    13 }, { 13,  0,   320 }, { 17,  0,    83 },
+  { 14,  0,   410 }, { 11,  0,   511 }, { 13,  0,   394 }, { 14,  0,   298 },
+  { 14,  0,   318 }, { 18,  0,   103 }, {  6, 10,   452 }, {  7, 10,   312 },
+  { 10, 10,   219 }, { 10, 10,   589 }, {  4, 10,   333 }, {  9, 10,   176 },
+  { 12, 10,   353 }, { 13, 10,   187 }, {  7, 11,   329 }, {  4, 11,   469 },
+  {  5,  0,   835 }, {  6,  0,   483 }, {  6, 11,  1743 }, {  5, 11,   929 },
+  {  6, 11,   340 }, {  8, 11,   376 }, {  8, 11,   807 }, {  6, 10,  1685 },
+  {  4,  0,   677 }, {  5, 11,   218 }, {  7, 11,  1610 }, { 10, 11,    83 },
+  {  5, 11,   571 }, {  7, 11,  1842 }, {  4, 11,   455 }, {  9,  0,    70 },
+  {  7,  0,  1405 }, {  7, 10,   135 }, {  8, 10,     7 }, {  8, 10,    62 },
+  {  9, 10,   243 }, { 10, 10,   658 }, { 10, 10,   697 }, { 11, 10,   456 },
+  { 11, 10,   756 }, {  9, 10,   395 }, { 10, 10,    79 }, {  9,  0,   108 },
+  {  6, 11,   161 }, {  7, 11,   372 }, {  9, 11,   597 }, {  4, 11,   349 },
+  {  4,  0,   777 }, {  4,  0,   331 }, {  7, 10,   631 }, {  5,  0,   747 },
+  {  6, 11,   432 }, {  6, 11,   608 }, { 11, 11,   322 }, { 10, 10,   835 },
+  {  5, 11,   468 }, {  7, 11,  1809 }, { 10, 11,   325 }, { 11, 11,   856 },
+  { 12, 11,   345 }, { 15, 11,   104 }, {  5, 11,   223 }, {  7, 10,   406 },
+  {  7, 10,   459 }, {  8, 10,   606 }, { 11, 10,   726 }, {  4, 11,   566 },
+  { 14,  0,    68 }, {  4, 11,    59 }, {  7, 11,  1394 }, {  6, 11,   436 },
+  { 11, 11,   481 }, {  4, 11,    48 }, {  5, 11,   271 }, {  7, 11,   953 },
+  { 11, 11,   170 }, {  5, 11,   610 }, {  8, 11,   457 }, {  5, 11,   755 },
+  {  7, 11,  1217 }, {  5, 10,   612 }, {  4, 11,   197 }, {  4,  0,   505 },
+  {  4, 10,   372 }, {  7, 10,   482 }, {  8, 10,   158 }, {  9, 10,   602 },
+  {  9, 10,   615 }, { 10, 10,   245 }, { 10, 10,   678 }, { 10, 10,   744 },
+  { 11, 10,   248 }, { 11, 10,   806 }, {  5,  0,   326 }, {  5, 10,   854 },
+  {  7, 10,  1991 }, {  4,  0,   691 }, { 18,  0,    16 }, {  6,  0,   628 },
+  {  9,  0,    35 }, { 10,  0,   680 }, { 10,  0,   793 }, { 11,  0,   364 },
+  { 13,  0,   357 }, { 15,  0,   164 }, { 10,  0,   654 }, {  6,  0,    32 },
+  {  7,  0,   385 }, {  7,  0,   757 }, {  7,  0,  1916 }, {  8,  0,    37 },
+  {  8,  0,    94 }, {  8,  0,   711 }, {  9,  0,   541 }, { 10,  0,   162 },
+  { 10,  0,   795 }, { 11,  0,   989 }, { 11,  0,  1010 }, { 12,  0,    14 },
+  { 14,  0,   308 }, {  5, 11,   217 }, {  6,  0,   152 }, {  6,  0,   349 },
+  {  6,  0,  1682 }, {  7,  0,  1252 }, {  8,  0,   112 }, {  9,  0,   435 },
+  {  9,  0,   668 }, { 10,  0,   290 }, { 10,  0,   319 }, { 10,  0,   815 },
+  { 11,  0,   180 }, { 11,  0,   837 }, { 12,  0,   240 }, { 13,  0,   152 },
+  { 13,  0,   219 }, { 14,  0,   158 }, {  4,  0,   581 }, {  6,  0,   726 },
+  {  5, 10,   195 }, {  7, 10,  1685 }, {  6,  0,   126 }, {  7,  0,   573 },
+  {  8,  0,   397 }, { 14,  0,    44 }, { 10,  0,    89 }, {  7, 10,  1997 },
+  {  8, 10,   730 }, { 11, 10,  1006 }, {  6,  0,  1531 }, {  6,  0,  1167 },
+  {  5,  0,   926 }, { 12,  0,   203 }, {  5, 10,   751 }, {  4, 11,   165 },
+  {  7, 11,  1398 }, {  7, 11,  1829 }, {  7,  0,  1232 }, {  9,  0,   531 },
+  {  7, 10,   821 }, {  6,  0,   943 }, {  5,  0,   670 }, {  4,  0,   880 },
+  { 11,  0,   231 }, {  6,  0,  1617 }, {  7,  0,  1957 }, {  5, 11,     9 },
+  {  7, 11,   297 }, {  7, 11,   966 }, { 12, 11,   306 }, {  6,  0,   975 },
+  {  6,  0,   985 }, {  5, 10,   950 }, {  5, 10,   994 }, {  6, 10,   351 },
+  { 12, 11,    21 }, { 23, 11,     7 }, {  5, 11,   146 }, {  6, 11,   411 },
+  { 10, 11,   721 }, {  7,  0,   242 }, {  7,  0,  1942 }, {  6, 11,   177 },
+  {  7, 11,   467 }, {  5,  0,   421 }, {  7, 10,    47 }, {  9, 10,   684 },
+  {  5,  0,   834 }, {  7,  0,  1202 }, {  8,  0,    14 }, {  9,  0,   481 },
+  {  9,  0,   880 }, { 10,  0,   465 }, {  6,  0,   688 }, {  9,  0,   834 },
+  {  4, 10,   350 }, {  4,  0,   855 }, {  4,  0,   357 }, {  6,  0,   172 },
+  {  7,  0,   143 }, {  9,  0,   413 }, {  5, 11,   200 }, {  4,  0,   590 },
+  {  7, 10,  1812 }, { 13, 10,   259 }, { 13, 10,   356 }, { 14, 10,   242 },
+  { 19, 10,   114 }, {  5, 10,   967 }, { 11,  0,   114 }, {  4, 10,   473 },
+  {  7, 10,   623 }, {  8, 10,   808 }, {  9, 10,   871 }, {  9, 10,   893 },
+  { 11, 10,   431 }, { 12, 10,   112 }, { 12, 10,   217 }, { 12, 10,   243 },
+  { 12, 10,   562 }, { 12, 10,   663 }, { 12, 10,   683 }, { 13, 10,   141 },
+  { 13, 10,   197 }, { 13, 10,   227 }, { 13, 10,   406 }, { 13, 10,   487 },
+  { 14, 10,   156 }, { 14, 10,   203 }, { 14, 10,   224 }, { 14, 10,   256 },
+  { 18, 10,    58 }, { 22, 10,     0 }, { 10, 10,   286 }, {  4, 10,   222 },
+  {  7, 10,   286 }, {  8, 10,   629 }, {  5,  0,   169 }, {  7,  0,   333 },
+  {  8,  0,    45 }, {  6, 11,   481 }, {  4,  0,   198 }, {  4,  0,    24 },
+  {  5,  0,   140 }, {  5,  0,   185 }, {  7,  0,  1500 }, { 11,  0,   565 },
+  { 11,  0,   838 }, {  4, 11,    84 }, {  7, 11,  1482 }, { 10, 11,    76 },
+  { 10, 11,   142 }, {  5,  0,   585 }, { 13, 10,   306 }, {  5, 11,  1015 },
+  {  4, 11,   315 }, {  5, 11,   507 }, {  7, 11,  1370 }, {  8, 10,   146 },
+  {  6,  0,   691 }, {  6,  0,  1503 }, {  4,  0,   334 }, {  5,  0,   593 },
+  {  4, 10,   465 }, {  7, 10,  1663 }, { 14, 11,   173 }, {  7,  0,   913 },
+  { 12,  0,   116 }, {  6, 11,  1722 }, {  6,  0,  1360 }, {  4,  0,   802 },
+  {  8, 11,   222 }, {  8, 11,   476 }, {  9, 11,   238 }, { 11, 11,   516 },
+  { 11, 11,   575 }, { 15, 11,   109 }, { 18, 11,   100 }, {  6,  0,   308 },
+  {  9,  0,   673 }, {  7, 10,   138 }, {  7, 10,   517 }, { 11, 10,   238 },
+  {  4,  0,   709 }, {  6,  0,  1876 }, {  6,  0,  1895 }, {  9,  0,   994 },
+  {  9,  0,  1006 }, { 12,  0,   829 }, { 12,  0,   888 }, { 12,  0,   891 },
+  { 18,  0,   185 }, { 20, 10,    94 }, {  4,  0,   228 }, {  5,  0,   897 },
+  {  7,  0,  1840 }, {  5, 10,   495 }, {  7, 10,   834 }, {  9, 10,   733 },
+  { 11, 10,   378 }, {  5, 10,   559 }, {  6, 10,    21 }, {  6, 10,  1737 },
+  {  7, 10,  1444 }, {  8, 10,   224 }, {  4,  0,   608 }, {  5,  0,   497 },
+  {  6, 11,    40 }, {  7, 11,  1781 }, {  6,  0,  1573 }, {  7,  0,  2039 },
+  {  6,  0,   540 }, {  8,  0,   136 }, {  4,  0,   897 }, {  5,  0,   786 },
+  {  5, 10,   519 }, {  6,  0,  1878 }, {  6,  0,  1884 }, {  9,  0,   938 },
+  {  9,  0,   948 }, {  9,  0,   955 }, {  9,  0,   973 }, {  9,  0,  1012 },
+  { 12,  0,   895 }, { 12,  0,   927 }, { 15,  0,   254 }, {  6,  0,  1469 },
+  {  5,  0,   999 }, {  4,  0,   299 }, {  7,  0,  1004 }, {  4,  0,   745 },
+  {  5,  0,   578 }, {  8, 11,   574 }, {  5,  0,   456 }, {  6,  0,  1457 },
+  {  7,  0,  1679 }, {  4, 10,   402 }, {  7,  0,   693 }, {  8,  0,   180 },
+  { 12,  0,   163 }, {  8, 10,   323 }, {  8, 10,   479 }, { 11, 10,   580 },
+  { 14, 10,   201 }, {  5, 10,    59 }, {  7, 10,   672 }, {  4, 11,   354 },
+  { 18, 10,    34 }, {  4,  0,   755 }, {  7, 11,  1558 }, {  7,  0,  1740 },
+  { 18,  0,    48 }, {  4, 10,    85 }, {  7, 10,   549 }, { 11,  0,   338 },
+  {  5, 10,    94 }, {  6,  0,  1091 }, {  7, 11,   469 }, { 12,  0,   695 },
+  { 12,  0,   704 }, { 20,  0,   113 }, {  5, 11,   830 }, { 14, 11,   338 },
+  { 20, 11,    81 }, {  7,  0,  1464 }, {  6, 10,    11 }, {  7, 10,   187 },
+  {  7,  0,   975 }, { 13,  0,   335 }, {  4, 10,   522 }, {  6,  0,  1979 },
+  {  5, 11,   496 }, {  7, 11,   203 }, {  4, 10,    52 }, {  7, 10,   661 },
+  {  7,  0,  1566 }, {  8,  0,   269 }, {  9,  0,   212 }, {  9,  0,   718 },
+  { 14,  0,    15 }, { 14,  0,   132 }, { 14,  0,   227 }, {  4,  0,   890 },
+  {  5,  0,   805 }, {  5,  0,   819 }, {  5,  0,   961 }, {  6,  0,   396 },
+  {  6,  0,  1631 }, {  6,  0,  1678 }, {  7,  0,  1967 }, {  7,  0,  2041 },
+  {  9,  0,   630 }, { 11,  0,     8 }, { 11,  0,  1019 }, { 12,  0,   176 },
+  { 13,  0,   225 }, { 14,  0,   292 }, { 21,  0,    24 }, {  4, 10,   383 },
+  {  5, 10,   520 }, {  6, 11,   547 }, {  7, 11,  1748 }, {  5, 11,    88 },
+  {  9, 11,   239 }, { 18, 11,   128 }, {  7, 11,   650 }, {  7, 11,  1310 },
+  {  4, 10,   281 }, {  5, 10,    38 }, {  7, 10,   194 }, {  7, 10,   668 },
+  {  7, 10,  1893 }, {  9, 10,   397 }, {  7,  0,  1815 }, {  9, 10,   635 },
+  { 11, 10,   559 }, {  7,  0,  1505 }, { 10,  0,   190 }, { 10,  0,   634 },
+  { 11,  0,   792 }, { 12,  0,   358 }, { 12,  0,   447 }, {  5,  0,     0 },
+  {  6,  0,   536 }, {  7,  0,   604 }, { 13,  0,   445 }, { 17,  0,   126 },
+  {  7, 11,  1076 }, {  9, 11,    80 }, { 11, 11,    78 }, { 11, 11,   421 },
+  { 11, 11,   534 }, { 12, 11,   545 }, {  8,  0,   966 }, { 10,  0,  1023 },
+  { 14, 11,   369 }, { 18, 11,    72 }, {  7, 11,  1641 }, {  6,  0,   232 },
+  {  6,  0,   412 }, {  7,  0,  1074 }, {  8,  0,     9 }, {  8,  0,   157 },
+  {  8,  0,   786 }, {  9,  0,   196 }, {  9,  0,   352 }, {  9,  0,   457 },
+  { 10,  0,   337 }, { 11,  0,   232 }, { 11,  0,   877 }, { 12,  0,   480 },
+  { 12,  0,   546 }, {  7,  0,   958 }, {  4,  0,   382 }, {  8,  0,   579 },
+  {  4,  0,   212 }, {  7,  0,  1206 }, {  4, 11,   497 }, {  5, 11,   657 },
+  {  7, 11,  1584 }, {  4,  0,   681 }, {  8,  0,   971 }, { 10,  0,   965 },
+  {  5, 10,   448 }, {  8, 10,   535 }, { 14,  0,    16 }, { 18,  0,    44 },
+  { 11,  0,   584 }, { 11,  0,   616 }, { 14,  0,   275 }, { 11, 11,   584 },
+  { 11, 11,   616 }, { 14, 11,   275 }, {  8, 11,    13 }, {  7, 10,   610 },
+  {  7, 10,  1501 }, {  7, 11,   642 }, {  8, 11,   250 }, { 11, 11,   123 },
+  { 11, 11,   137 }, { 13, 11,    48 }, { 14, 11,    95 }, {  5,  0,   655 },
+  { 17,  0,    67 }, { 19,  0,    74 }, {  6,  0,   751 }, {  6,  0,  1967 },
+  {  6,  0,   231 }, {  8,  0,   423 }, {  5,  0,   300 }, { 10,  0,  1016 },
+  {  4, 10,   319 }, {  5, 10,   699 }, { 10, 10,   673 }, {  6,  0,   237 },
+  {  7,  0,   611 }, {  8,  0,   100 }, {  9,  0,   416 }, { 11,  0,   335 },
+  { 12,  0,   173 }, { 18,  0,   101 }, {  6, 10,   336 }, {  8, 10,   552 },
+  {  9, 10,   285 }, { 10, 10,    99 }, { 11, 10,   568 }, {  6,  0,  1370 },
+  {  7, 10,  1406 }, {  9, 10,   218 }, { 13, 10,   222 }, {  5, 10,   256 },
+  {  7,  0,  1208 }, { 14, 11,   213 }, { 20, 11,    38 }, {  6,  0,  1219 },
+  {  7, 11,  1642 }, { 13,  0,   417 }, { 14,  0,   129 }, { 15,  0,    15 },
+  { 10, 11,   545 }, { 12, 11,   301 }, { 17, 10,    39 }, { 20, 10,    36 },
+  {  5,  0,   199 }, {  4, 11,   904 }, {  5, 11,   794 }, { 12,  0,   427 },
+  { 18,  0,    38 }, {  6,  0,   949 }, {  8,  0,   665 }, {  7, 10,   634 },
+  {  4, 10,   618 }, {  7, 10,   259 }, {  4, 10,   339 }, {  5, 11,   761 },
+  { 13, 10,   169 }, {  4, 10,   759 }, {  5,  0,   688 }, {  7,  0,   539 },
+  {  7,  0,   712 }, {  7, 11,   386 }, { 10, 11,   713 }, {  6,  0,  1186 },
+  {  6, 11,     7 }, {  6, 11,    35 }, {  7, 11,   147 }, {  7, 11,  1069 },
+  {  7, 11,  1568 }, {  7, 11,  1575 }, {  7, 11,  1917 }, {  8, 11,    43 },
+  {  8, 11,   208 }, {  9, 11,   128 }, {  9, 11,   866 }, { 10, 11,    20 },
+  { 11, 11,   981 }, { 19, 11,    33 }, {  7, 11,   893 }, {  8, 10,   482 },
+  { 13, 11,   424 }, {  6,  0,   312 }, {  6,  0,  1715 }, { 10,  0,   584 },
+  { 11,  0,   546 }, { 11,  0,   692 }, { 12,  0,   259 }, { 12,  0,   295 },
+  { 13,  0,    46 }, { 13,  0,   154 }, {  5, 10,   336 }, {  6, 10,   341 },
+  {  6, 10,   478 }, {  6, 10,  1763 }, {  8, 10,   386 }, {  9,  0,   151 },
+  {  4,  0,   588 }, { 24,  0,     4 }, {  6, 11,   322 }, {  9, 11,   552 },
+  { 11, 11,   274 }, { 13, 11,   209 }, { 13, 11,   499 }, { 14, 11,    85 },
+  { 15, 11,   126 }, { 17, 11,    70 }, {  7, 10,    73 }, {  4,  0,   231 },
+  {  5,  0,    61 }, {  6,  0,   104 }, {  7,  0,   729 }, {  7,  0,   964 },
+  {  7,  0,  1658 }, { 12,  0,   414 }, {  6,  0,   263 }, { 10,  0,   757 },
+  {  7, 10,  1971 }, {  4,  0,   612 }, {  5,  0,   561 }, {  4,  0,   320 },
+  {  7, 10,  1344 }, {  8, 11,    83 }, {  8, 11,   817 }, {  9, 11,    28 },
+  {  9, 11,    29 }, {  9, 11,   885 }, { 10, 11,   387 }, { 11, 11,   633 },
+  { 11, 11,   740 }, { 13, 11,   235 }, { 13, 11,   254 }, { 15, 11,   143 },
+  { 15, 11,   146 }, {  5, 10,   396 }, {  6, 10,   501 }, { 12, 11,    49 },
+  {  4,  0,   225 }, {  4, 10,   929 }, {  5, 10,   799 }, {  8, 10,    46 },
+  {  8, 10,   740 }, {  4,  0,   405 }, {  7,  0,   817 }, { 14,  0,    58 },
+  { 17,  0,    37 }, { 18,  0,   124 }, {  5,  0,   974 }, {  4, 11,   412 },
+  {  5, 11,   581 }, {  4, 10,   892 }, {  5, 10,   770 }, {  4,  0,   996 },
+  {  6,  0,  2026 }, {  4,  0,   527 }, {  5,  0,   235 }, {  7,  0,  1239 },
+  { 11,  0,   131 }, { 12,  0,   370 }, {  9,  0,    16 }, { 13,  0,   386 },
+  {  7, 11,   421 }, {  7,  0,   956 }, {  7,  0,  1157 }, {  7,  0,  1506 },
+  {  7,  0,  1606 }, {  7,  0,  1615 }, {  7,  0,  1619 }, {  7,  0,  1736 },
+  {  7,  0,  1775 }, {  8,  0,   590 }, {  9,  0,   324 }, {  9,  0,   736 },
+  {  9,  0,   774 }, {  9,  0,   776 }, {  9,  0,   784 }, { 10,  0,   567 },
+  { 10,  0,   708 }, { 11,  0,   518 }, { 11,  0,   613 }, { 11,  0,   695 },
+  { 11,  0,   716 }, { 11,  0,   739 }, { 11,  0,   770 }, { 11,  0,   771 },
+  { 11,  0,   848 }, { 11,  0,   857 }, { 11,  0,   931 }, { 11,  0,   947 },
+  { 12,  0,   326 }, { 12,  0,   387 }, { 12,  0,   484 }, { 12,  0,   528 },
+  { 12,  0,   552 }, { 12,  0,   613 }, { 13,  0,   189 }, { 13,  0,   256 },
+  { 13,  0,   340 }, { 13,  0,   432 }, { 13,  0,   436 }, { 13,  0,   440 },
+  { 13,  0,   454 }, { 14,  0,   174 }, { 14,  0,   220 }, { 14,  0,   284 },
+  { 14,  0,   390 }, { 17,  0,   121 }, {  7, 10,   158 }, {  9,  0,   137 },
+  { 10,  0,   221 }, {  4, 11,   110 }, { 10, 11,   415 }, { 10, 11,   597 },
+  { 14, 11,   206 }, { 13, 11,   496 }, {  7, 11,   205 }, { 23, 10,    25 },
+  {  7, 11,   778 }, {  7, 11,  1656 }, {  7, 10,  2001 }, {  9, 11,   369 },
+  { 10, 11,   338 }, { 10, 11,   490 }, { 11, 11,   154 }, { 11, 11,   545 },
+  { 11, 11,   775 }, { 13, 11,    77 }, { 13, 11,   274 }, {  4, 11,   444 },
+  { 10, 11,   146 }, { 12, 11,     9 }, {  7,  0,   390 }, { 10,  0,   140 },
+  {  7,  0,  1144 }, {  6,  0,   464 }, {  7, 10,  1461 }, { 12, 10,    91 },
+  {  4, 10,   602 }, {  4, 11,   283 }, {  7, 11,  1194 }, {  5,  0,   407 },
+  { 11,  0,   204 }, { 11,  0,   243 }, { 11,  0,   489 }, { 12,  0,   293 },
+  { 19,  0,    37 }, { 20,  0,    73 }, { 22,  0,    38 }, {  7,  0,  1218 },
+  {  8,  0,   303 }, {  5,  0,   325 }, {  8,  0,     5 }, {  8,  0,   227 },
+  {  9,  0,   105 }, { 10,  0,   585 }, { 12,  0,   614 }, {  4, 10,    13 },
+  {  5, 10,   567 }, {  7, 10,  1498 }, {  9, 10,   124 }, { 11, 10,   521 },
+  { 12, 10,   405 }, {  7, 10,  1006 }, {  7,  0,   800 }, { 10,  0,    12 },
+  {  6, 11,  1720 }, {  7,  0,  1783 }, {  4, 10,   735 }, { 10, 10,   812 },
+  {  4, 10,   170 }, {  7, 10,   323 }, {  6,  0,   621 }, { 13,  0,   504 },
+  { 16,  0,    89 }, {  5, 10,   304 }, {  7, 10,  1403 }, {  9, 11,   216 },
+  {  6,  0,   920 }, {  6,  0,  1104 }, {  9, 11,   183 }, { 11, 11,   286 },
+  {  4,  0,   376 }, {  5, 10,   742 }, {  6,  0,   218 }, {  8,  0,   641 },
+  { 11,  0,   388 }, { 12,  0,   580 }, {  7,  0,   454 }, {  7,  0,   782 },
+  {  8,  0,   768 }, { 12,  0,   686 }, {  9, 11,    33 }, {  5, 10,   111 },
+  { 16,  0,     0 }, { 10,  0,   676 }, { 12,  0,   462 }, {  6,  0,   164 },
+  {  8, 11,   735 }, {  5, 10,   444 }, { 22,  0,    50 }, {  7, 11,  1862 },
+  { 12, 11,   491 }, { 12, 11,   520 }, { 13, 11,   383 }, { 14, 11,   244 },
+  { 18, 11,    12 }, {  5, 11,   132 }, {  9, 11,   486 }, {  9, 11,   715 },
+  { 10, 11,   458 }, { 11, 11,   373 }, { 11, 11,   668 }, { 11, 11,   795 },
+  { 11, 11,   897 }, { 12, 11,   272 }, { 12, 11,   424 }, { 12, 11,   539 },
+  { 12, 11,   558 }, { 14, 11,   245 }, { 14, 11,   263 }, { 14, 11,   264 },
+  { 14, 11,   393 }, { 14, 11,   403 }, {  8, 10,   123 }, { 15, 10,     6 },
+  { 16, 10,     7 }, {  6,  0,   285 }, {  8,  0,   654 }, { 11,  0,   749 },
+  { 12,  0,   190 }, { 12,  0,   327 }, { 13,  0,   120 }, { 13,  0,   121 },
+  { 13,  0,   327 }, { 15,  0,    47 }, { 18,  0,    40 }, {  5, 11,     8 },
+  {  6, 11,    89 }, {  6, 11,   400 }, {  7, 11,  1569 }, {  7, 11,  1623 },
+  {  7, 11,  1850 }, {  8, 11,   218 }, {  8, 11,   422 }, {  9, 11,   570 },
+  { 10, 11,   626 }, {  6, 11,   387 }, {  7, 11,   882 }, { 13, 11,   111 },
+  {  6,  0,   343 }, {  7,  0,   195 }, {  9,  0,   226 }, { 10,  0,   197 },
+  { 10,  0,   575 }, { 11,  0,   502 }, { 11,  0,   899 }, {  6, 11,   224 },
+  {  7, 11,   877 }, {  9, 11,   647 }, {  5, 10,   937 }, {  7, 10,   100 },
+  {  7, 11,   790 }, { 22,  0,    29 }, { 19,  0,     8 }, {  6,  0,  1812 },
+  { 21,  0,     8 }, {  7, 11,   394 }, {  7,  0,  1125 }, {  9,  0,   143 },
+  { 11,  0,    61 }, { 14,  0,   405 }, { 22,  0,    21 }, { 10, 11,   755 },
+  { 19, 11,    29 }, {  9, 11,   378 }, { 13, 11,   162 }, {  7, 10,   922 },
+  {  5, 10,   619 }, {  5, 10,   698 }, {  6,  0,  1327 }, {  6,  0,  1598 },
+  {  9,  0,   575 }, {  9, 11,   569 }, { 12, 11,    12 }, { 12, 11,    81 },
+  { 12, 11,   319 }, { 13, 11,    69 }, { 14, 11,   259 }, { 16, 11,    87 },
+  { 17, 11,     1 }, { 17, 11,    21 }, { 17, 11,    24 }, { 18, 11,    15 },
+  { 18, 11,    56 }, { 18, 11,    59 }, { 18, 11,   127 }, { 18, 11,   154 },
+  { 19, 11,    19 }, { 20, 11,    31 }, {  6,  0,   895 }, {  7, 11,  1231 },
+  {  5,  0,   959 }, {  7, 11,   124 }, {  8, 11,    38 }, {  5, 11,   261 },
+  {  7, 11,    78 }, {  7, 11,   199 }, {  8, 11,   815 }, {  9, 11,   126 },
+  { 10, 11,   342 }, {  5, 10,   917 }, {  6, 10,  1659 }, {  7,  0,  1759 },
+  {  5, 11,   595 }, {  7, 11,  1863 }, {  8,  0,   173 }, {  6,  0,   266 },
+  { 14,  0,   261 }, {  4, 11,   628 }, {  5, 10,   251 }, {  5, 10,   956 },
+  {  8, 10,   268 }, {  9, 10,   214 }, { 18, 10,   142 }, {  7, 11,   266 },
+  {  8, 11,   804 }, {  7, 11,   208 }, {  6, 11,    79 }, {  7, 11,  1021 },
+  {  7, 11,  1519 }, { 11, 11,   704 }, { 13, 11,   396 }, {  5, 10,   346 },
+  {  5, 10,   711 }, {  8, 10,   390 }, {  8, 11,   741 }, {  6, 11,   376 },
+  {  6,  0,  1427 }, {  6,  0,  1033 }, {  6,  0,  1217 }, {  8,  0,   300 },
+  {  5, 10,   624 }, {  6, 11,   100 }, {  7, 11,   244 }, {  7, 11,   632 },
+  {  7, 11,  1609 }, {  8, 11,   178 }, {  8, 11,   638 }, { 13, 11,    58 },
+  {  6,  0,   584 }, {  5, 10,   783 }, {  7, 10,  1998 }, {  7, 10,  2047 },
+  {  5,  0,   427 }, {  5,  0,   734 }, {  7,  0,   478 }, {  8,  0,    52 },
+  {  7,  0,   239 }, { 11,  0,   217 }, { 14,  0,   165 }, {  6,  0,  1129 },
+  {  6,  0,   168 }, {  6,  0,  1734 }, {  7,  0,    20 }, {  7,  0,  1056 },
+  {  8,  0,   732 }, {  9,  0,   406 }, {  9,  0,   911 }, { 10,  0,   694 },
+  {  4, 10,   594 }, {  5, 11,   791 }, {  7, 11,   686 }, {  8, 11,    33 },
+  {  8, 11,   238 }, { 10, 11,   616 }, { 11, 11,   467 }, { 11, 11,   881 },
+  { 13, 11,   217 }, { 13, 11,   253 }, { 14, 11,   268 }, {  9, 11,   476 },
+  {  6,  0,   418 }, {  5,  0,   613 }, {  4,  0,   632 }, {  4, 11,   447 },
+  {  7,  0,    32 }, {  7,  0,   984 }, {  8,  0,    85 }, {  8,  0,   709 },
+  {  9,  0,   579 }, {  9,  0,   847 }, {  9,  0,   856 }, { 10,  0,   799 },
+  { 11,  0,   258 }, { 11,  0,  1007 }, { 12,  0,   331 }, { 12,  0,   615 },
+  { 13,  0,   188 }, { 13,  0,   435 }, { 14,  0,     8 }, { 15,  0,   165 },
+  { 16,  0,    27 }, { 20,  0,    40 }, { 16, 11,    35 }, {  4, 11,   128 },
+  {  5, 11,   415 }, {  6, 11,   462 }, {  7, 11,   294 }, {  7, 11,   578 },
+  { 10, 11,   710 }, { 11, 11,    86 }, {  5,  0,   694 }, {  8,  0,   909 },
+  {  7,  0,  1109 }, { 11,  0,     7 }, {  5, 10,    37 }, {  6, 10,    39 },
+  {  6, 10,   451 }, {  7, 10,   218 }, {  7, 10,  1166 }, {  7, 10,  1687 },
+  {  8, 10,   662 }, { 16, 10,     2 }, {  8, 11,   587 }, {  6, 11,   427 },
+  {  7, 11,  1018 }, { 10, 11,   692 }, {  4, 11,   195 }, {  6, 10,   508 },
+  {  7, 11,   802 }, {  4,  0,   167 }, {  7,  0,    82 }, {  5,  0,    62 },
+  {  6,  0,    24 }, {  6,  0,   534 }, {  7,  0,    74 }, {  7,  0,   678 },
+  {  7,  0,   684 }, {  7,  0,  1043 }, {  7,  0,  1072 }, {  8,  0,   280 },
+  {  8,  0,   541 }, {  8,  0,   686 }, {  9,  0,   258 }, { 10,  0,   519 },
+  { 11,  0,   252 }, { 12,  0,   282 }, { 10,  0,    33 }, {  4,  0,   359 },
+  {  5, 11,   738 }, {  7,  0,   980 }, {  9,  0,   328 }, { 13,  0,   186 },
+  { 13,  0,   364 }, {  7, 10,   635 }, {  7, 10,   796 }, {  8, 10,   331 },
+  {  9, 10,   330 }, {  9, 10,   865 }, { 10, 10,   119 }, { 10, 10,   235 },
+  { 11, 10,   111 }, { 11, 10,   129 }, { 11, 10,   240 }, { 12, 10,    31 },
+  { 12, 10,    66 }, { 12, 10,   222 }, { 12, 10,   269 }, { 12, 10,   599 },
+  { 12, 10,   684 }, { 12, 10,   689 }, { 12, 10,   691 }, { 14, 10,   345 },
+  {  9, 10,   527 }, {  6,  0,   596 }, {  7,  0,   585 }, {  7, 10,   702 },
+  {  6, 11,  1683 }, {  5,  0,   211 }, {  6,  0,   145 }, { 13,  0,   336 },
+  {  6,  0,  1130 }, {  7,  0,   873 }, {  6, 10,    37 }, {  7, 10,  1666 },
+  {  8, 10,   195 }, {  8, 10,   316 }, {  9, 10,   178 }, {  9, 10,   276 },
+  {  9, 10,   339 }, {  9, 10,   536 }, { 10, 10,   102 }, { 10, 10,   362 },
+  { 10, 10,   785 }, { 11, 10,    55 }, { 11, 10,   149 }, { 11, 10,   773 },
+  { 13, 10,   416 }, { 13, 10,   419 }, { 14, 10,    38 }, { 14, 10,    41 },
+  { 14, 10,   210 }, {  8,  0,   840 }, {  8,  0,   841 }, {  4,  0,   263 },
+  {  5, 11,     3 }, {  8, 11,   578 }, {  9, 11,   118 }, { 10, 11,   705 },
+  { 12, 11,   383 }, { 13, 11,   279 }, {  4,  0,   916 }, {  5, 11,   229 },
+  {  5, 10,   645 }, { 15,  0,   155 }, { 16,  0,    79 }, {  8, 11,   102 },
+  { 10, 11,   578 }, { 10, 11,   672 }, { 12, 11,   496 }, { 13, 11,   408 },
+  { 14, 11,   121 }, { 17, 11,   106 }, {  4,  0,   599 }, {  5,  0,   592 },
+  {  6,  0,  1634 }, {  7,  0,     5 }, {  7,  0,    55 }, {  7,  0,    67 },
+  {  7,  0,    97 }, {  7,  0,   691 }, {  7,  0,   979 }, {  7,  0,  1600 },
+  {  7,  0,  1697 }, {  8,  0,   207 }, {  8,  0,   214 }, {  8,  0,   231 },
+  {  8,  0,   294 }, {  8,  0,   336 }, {  8,  0,   428 }, {  8,  0,   471 },
+  {  8,  0,   622 }, {  8,  0,   626 }, {  8,  0,   679 }, {  8,  0,   759 },
+  {  8,  0,   829 }, {  9,  0,    11 }, {  9,  0,   246 }, {  9,  0,   484 },
+  {  9,  0,   573 }, {  9,  0,   706 }, {  9,  0,   762 }, {  9,  0,   798 },
+  {  9,  0,   855 }, {  9,  0,   870 }, {  9,  0,   912 }, { 10,  0,   303 },
+  { 10,  0,   335 }, { 10,  0,   424 }, { 10,  0,   461 }, { 10,  0,   543 },
+  { 10,  0,   759 }, { 10,  0,   814 }, { 11,  0,    59 }, { 11,  0,   199 },
+  { 11,  0,   235 }, { 11,  0,   590 }, { 11,  0,   631 }, { 11,  0,   929 },
+  { 11,  0,   963 }, { 11,  0,   987 }, { 12,  0,   114 }, { 12,  0,   182 },
+  { 12,  0,   226 }, { 12,  0,   332 }, { 12,  0,   439 }, { 12,  0,   575 },
+  { 12,  0,   598 }, { 12,  0,   675 }, { 13,  0,     8 }, { 13,  0,   125 },
+  { 13,  0,   194 }, { 13,  0,   287 }, { 14,  0,   197 }, { 14,  0,   383 },
+  { 15,  0,    53 }, { 17,  0,    63 }, { 19,  0,    46 }, { 19,  0,    98 },
+  { 19,  0,   106 }, { 20,  0,    85 }, {  7,  0,  1356 }, {  4, 10,   290 },
+  {  6, 10,    70 }, {  7, 10,  1292 }, { 10, 10,   762 }, { 11, 10,   288 },
+  { 22, 11,    55 }, {  4,  0,   593 }, {  8, 11,   115 }, {  8, 11,   350 },
+  {  9, 11,   489 }, { 10, 11,   128 }, { 11, 11,   306 }, { 12, 11,   373 },
+  { 14, 11,    30 }, { 17, 11,    79 }, { 19, 11,    80 }, {  7, 11,  1235 },
+  {  6,  0,  1392 }, {  4, 11,   230 }, {  5, 11,   702 }, { 19,  0,   126 },
+  {  7, 10,   131 }, {  7, 10,   422 }, {  8, 10,   210 }, { 12, 10,   573 },
+  {  6,  0,  1179 }, { 11, 11,   435 }, { 11, 10,   797 }, {  6, 11,  1728 },
+  {  4,  0,   162 }, { 18, 11,    26 }, { 19, 11,    42 }, { 20, 11,    43 },
+  { 21, 11,     0 }, { 23, 11,    27 }, { 24, 11,    14 }, {  4, 10,   936 },
+  {  6,  0,   765 }, {  5, 10,   453 }, {  6, 10,   441 }, {  5,  0,   187 },
+  {  7,  0,  1286 }, {  6,  0,   635 }, {  6,  0,   904 }, {  6,  0,  1210 },
+  {  6,  0,  1489 }, {  4,  0,   215 }, {  8,  0,   890 }, {  9,  0,    38 },
+  { 10,  0,   923 }, { 11,  0,    23 }, { 11,  0,   127 }, { 11,  0,   796 },
+  {  6,  0,  1165 }, {  6,  0,  1306 }, {  7,  0,   716 }, { 13,  0,    97 },
+  { 13,  0,   251 }, {  4, 10,   653 }, {  8,  0,   657 }, { 18, 10,    80 },
+  {  5, 11,   622 }, {  7, 11,  1032 }, { 11, 11,    26 }, { 11, 11,   213 },
+  { 11, 11,   707 }, { 12, 11,   380 }, { 13, 11,   226 }, { 13, 11,   355 },
+  {  6,  0,   299 }, {  5, 11,    70 }, {  6, 11,   334 }, {  9, 11,   171 },
+  { 11, 11,   637 }, { 12, 11,   202 }, { 14, 11,   222 }, { 17, 11,    42 },
+  { 14,  0,   134 }, {  4, 11,    23 }, {  5, 11,   313 }, {  5, 11,  1014 },
+  {  6, 11,    50 }, {  6, 11,    51 }, {  7, 11,   142 }, {  7, 11,   384 },
+  {  9, 11,   783 }, { 11, 11,   741 }, {  4, 11,   141 }, {  7, 11,   559 },
+  {  8, 11,   640 }, {  9, 11,   460 }, { 12, 11,   183 }, { 13, 11,   488 },
+  {  8, 11,   614 }, {  7, 10,  1368 }, {  8, 10,   232 }, {  8, 10,   361 },
+  { 10, 10,   682 }, { 10, 10,   742 }, {  9, 10,   534 }, {  6,  0,  1082 },
+  { 12,  0,   658 }, {  9, 10,    27 }, {  7,  0,  2002 }, { 14, 10,    12 },
+  {  4,  0,    28 }, {  5,  0,   440 }, {  7,  0,   248 }, { 11,  0,   833 },
+  { 12,  0,   344 }, {  7, 10,   736 }, { 11, 10,   264 }, {  6, 10,  1657 },
+  {  6,  0,  1654 }, { 10,  0,   531 }, {  5, 11,   222 }, {  9, 11,   140 },
+  { 10, 11,   534 }, {  6,  0,   634 }, {  6,  0,   798 }, {  6,  0,   840 },
+  { 10, 11,   503 }, {  7, 10,   127 }, {  5,  0,   853 }, {  5, 11,   154 },
+  {  7, 11,  1491 }, { 10, 11,   379 }, { 10, 11,   485 }, {  6,  0,   249 },
+  {  7,  0,  1234 }, { 11,  0,   573 }, {  5, 11,   716 }, {  7, 11,  1570 },
+  { 12, 11,   542 }, {  8, 10,   364 }, { 10,  0,   527 }, {  4, 11,    91 },
+  {  5, 11,   388 }, {  5, 11,   845 }, {  6, 11,   206 }, {  6, 11,   252 },
+  {  6, 11,   365 }, {  7, 11,   136 }, {  7, 11,   531 }, {  8, 11,   264 },
+  {  8, 11,   621 }, {  6,  0,  1419 }, {  7, 11,  1441 }, {  7,  0,    49 },
+  {  7,  0,   392 }, {  8,  0,    20 }, {  8,  0,   172 }, {  8,  0,   690 },
+  {  9,  0,   383 }, {  9,  0,   845 }, { 10,  0,    48 }, { 11,  0,   293 },
+  { 11,  0,   832 }, { 11,  0,   920 }, { 11,  0,   984 }, { 13,  0,   221 },
+  {  5,  0,   858 }, {  5,  0,   992 }, {  5,  0,   728 }, {  9, 10,   792 },
+  {  5, 10,   909 }, {  9, 10,   849 }, { 10, 10,   805 }, {  7,  0,   525 },
+  {  7,  0,  1579 }, {  8,  0,   497 }, {  8,  0,   573 }, {  6,  0,   268 },
+  {  9,  0,    62 }, {  7, 11,   576 }, {  6,  0,  1201 }, {  5, 11,   771 },
+  {  5, 11,   863 }, {  5, 11,   898 }, {  6, 11,  1632 }, {  6, 11,  1644 },
+  {  6, 11,  1780 }, {  5, 11,   331 }, {  7,  0,   193 }, {  7,  0,  1105 },
+  { 10,  0,   495 }, {  7, 10,   397 }, {  8, 10,   124 }, {  8, 10,   619 },
+  {  9, 10,   305 }, { 11, 10,    40 }, { 12, 10,   349 }, { 13, 10,   134 },
+  { 13, 10,   295 }, { 14, 10,   155 }, { 15, 10,   120 }, { 18, 10,   105 },
+  { 10,  0,   106 }, {  6,  0,   859 }, {  5, 11,   107 }, {  7, 11,   201 },
+  {  8, 11,   518 }, {  6, 11,   446 }, {  7, 11,  1817 }, { 13,  0,    23 },
+  {  4, 10,   262 }, {  7, 10,   342 }, {  5, 10,   641 }, {  9, 11,   851 },
+  {  6,  0,   925 }, {  9,  0,   813 }, {  4, 11,   504 }, {  6,  0,   613 },
+  {  8,  0,   223 }, {  4, 10,    99 }, {  6, 10,   250 }, {  6, 10,   346 },
+  {  8, 10,   127 }, { 10, 10,    81 }, {  8,  0,   953 }, {  4, 10,   915 },
+  { 11, 11,   892 }, {  5, 10,    75 }, {  9, 10,   517 }, { 10, 10,   470 },
+  { 12, 10,   155 }, { 13, 10,   224 }, {  4,  0,   666 }, {  7,  0,  1017 },
+  {  7, 11,   996 }, { 10, 11,   390 }, {  5, 11,   883 }, {  5, 11,   975 },
+  { 14, 10,    83 }, { 14, 11,    83 }, {  4,  0,   670 }, {  5, 11,   922 },
+  {  6, 11,  1707 }, {  7,  0,   216 }, {  9,  0,    40 }, { 11,  0,   136 },
+  {  7, 11,   787 }, {  5, 10,   954 }, {  5, 11,   993 }, {  7, 11,   515 },
+  {  9, 11,    91 }, { 11,  0,   259 }, {  7,  0,  1114 }, {  9,  0,   310 },
+  {  9,  0,   682 }, { 10,  0,   440 }, { 13,  0,    40 }, {  6, 10,   304 },
+  {  8, 10,   418 }, { 11, 10,   341 }, { 11, 10,   675 }, { 14,  0,   296 },
+  {  9, 10,   410 }, { 11, 10,   425 }, { 10, 11,   377 }, { 12, 11,   363 },
+  { 13, 11,    68 }, { 13, 11,    94 }, { 14, 11,   108 }, { 14, 11,   306 },
+  {  7,  0,  1401 }, {  7,  0,  1476 }, {  4,  0,   296 }, {  6,  0,   475 },
+  {  7,  0,   401 }, {  7,  0,  1410 }, {  7,  0,  1594 }, {  7,  0,  1674 },
+  {  8,  0,    63 }, {  8,  0,   660 }, {  9,  0,    74 }, {  4,  0,   139 },
+  {  4,  0,   388 }, { 12,  0,   188 }, {  4,  0,   797 }, {  4, 11,   766 },
+  {  5, 11,   103 }, {  7, 11,   921 }, {  8, 11,   580 }, {  8, 11,   593 },
+  {  8, 11,   630 }, { 10, 11,    28 }, {  4, 11,   911 }, {  5, 11,   867 },
+  {  5, 11,  1013 }, {  6, 10,    14 }, {  6,  0,  1572 }, {  6, 10,  1708 },
+  { 21,  0,    39 }, {  5, 10,   113 }, {  6, 10,   243 }, {  7, 10,  1865 },
+  { 11, 10,   161 }, { 16, 10,    37 }, { 17, 10,    99 }, {  7, 11,  1563 },
+  { 13, 11,   182 }, {  5, 11,   135 }, {  6, 11,   519 }, {  7, 11,  1722 },
+  { 10, 11,   271 }, { 11, 11,   261 }, { 17, 11,    54 }, {  4, 10,   274 },
+  {  6,  0,  1594 }, {  4, 11,   300 }, {  5, 11,   436 }, {  7, 11,   484 },
+  {  4,  0,   747 }, {  6,  0,   290 }, {  7,  0,   649 }, {  7,  0,  1479 },
+  {  7,  0,  1583 }, {  5, 11,   535 }, { 19, 11,    82 }, {  5,  0,   232 },
+  {  9,  0,   887 }, {  7, 10,   166 }, {  8,  0,   521 }, {  4,  0,    14 },
+  {  7,  0,   472 }, {  7,  0,  1801 }, { 10,  0,   748 }, { 13,  0,   458 },
+  {  6,  0,   741 }, {  6,  0,   992 }, { 16,  0,   111 }, {  9, 10,   304 },
+  {  4,  0,   425 }, {  5, 11,   387 }, {  7, 11,   557 }, { 12, 11,   547 },
+  { 14, 11,    86 }, {  7, 11,  1747 }, {  5, 10,   654 }, {  7, 11,  1489 },
+  {  7,  0,   789 }, {  4, 11,     6 }, {  5, 11,   708 }, {  8, 11,    75 },
+  {  6, 10,   273 }, { 10, 10,   188 }, { 13, 10,   377 }, { 18, 10,    77 },
+  {  6,  0,  1593 }, {  4, 11,   303 }, {  7, 11,   619 }, { 10, 11,   547 },
+  { 10, 11,   687 }, { 11, 11,   122 }, { 12, 11,   601 }, {  6,  0,  1768 },
+  {  7, 10,   410 }, { 10, 11,   772 }, { 11,  0,   233 }, { 11, 10,   524 },
+  {  5,  0,   943 }, {  6,  0,  1779 }, {  6, 10,  1785 }, {  8, 11,   529 },
+  {  4,  0,   955 }, {  5,  0,   245 }, {  6,  0,   576 }, {  7,  0,   582 },
+  {  8,  0,   225 }, {  4, 10,   780 }, { 14,  0,   241 }, {  6,  0,  1943 },
+  {  4, 11,   106 }, {  7, 11,   310 }, {  7, 11,  1785 }, { 10, 11,   690 },
+  { 11, 11,   717 }, {  6,  0,  1284 }, {  5, 11,   890 }, {  5, 11,   988 },
+  {  6, 11,   626 }, { 14, 11,   431 }, { 10, 11,   706 }, { 17, 11,    32 },
+  {  9, 11,   332 }, {  4, 11,   698 }, {  7,  0,   709 }, {  5, 10,   948 },
+  { 10, 11,    17 }, {  8,  0,   554 }, {  6,  0,  1564 }, { 11, 10,   941 },
+  {  4,  0,   443 }, {  6,  0,   909 }, {  6, 11,    84 }, { 14,  0,   280 },
+  {  4, 10,   532 }, {  5, 10,   706 }, {  7, 10,   662 }, {  4,  0,   729 },
+  {  5, 10,   837 }, {  6, 10,  1651 }, { 11, 10,   985 }, {  7, 10,  1861 },
+  {  4,  0,   348 }, { 24, 11,     3 }, {  5, 11,   986 }, {  6, 11,   130 },
+  {  7, 11,  1582 }, {  8, 11,   458 }, { 10, 11,   101 }, { 10, 11,   318 },
+  { 10, 11,   823 }, {  6,  0,   758 }, {  4,  0,   298 }, {  9,  0,   848 },
+  {  4, 10,   330 }, {  7, 10,   933 }, {  7, 10,  2012 }, {  8, 10,   292 },
+  {  7, 11,  1644 }, {  9, 11,   129 }, {  6,  0,  1422 }, {  9,  0,   829 },
+  {  7, 10,   767 }, {  5,  0,   164 }, {  7,  0,   121 }, { 14,  0,   189 },
+  {  7,  0,   812 }, {  7,  0,  1261 }, {  7,  0,  1360 }, {  9,  0,   632 },
+  { 12,  0,   352 }, {  7, 11,  1788 }, { 11,  0,   556 }, {  7, 11,   997 },
+  { 17, 10,   114 }, {  4,  0,   172 }, {  9,  0,   611 }, { 10,  0,   436 },
+  { 12,  0,   673 }, { 13,  0,   255 }, {  9, 10,   883 }, { 11,  0,   530 },
+  { 10, 10,   274 }, {  5,  0,   844 }, {  6,  0,   984 }, { 13,  0,   232 },
+  { 18,  0,    35 }, {  4, 10,   703 }, {  7, 10,   207 }, {  4, 10,   571 },
+  {  9,  0,   263 }, { 10,  0,   147 }, { 10,  0,   492 }, {  7, 11,  1756 },
+  {  9, 11,    98 }, {  5, 10,   873 }, {  5, 10,   960 }, {  8, 10,   823 },
+  {  9, 10,   881 }, {  5,  0,   537 }, {  4,  0,   859 }, {  7, 11,  1046 },
+  { 11, 11,   160 }, {  9,  0,   842 }, { 11, 10,   283 }, {  5, 10,    33 },
+  {  6, 10,   470 }, { 11, 10,   424 }, {  6, 11,    45 }, {  7, 11,   433 },
+  {  8, 11,   129 }, {  9, 11,    21 }, { 10, 11,   392 }, { 11, 11,    79 },
+  { 12, 11,   499 }, { 13, 11,   199 }, { 13, 11,   451 }, {  7,  0,  1291 },
+  {  7, 10,  1882 }, {  7, 11,   558 }, {  8, 11,   353 }, {  6,  0,  1482 },
+  {  5,  0,   230 }, {  5,  0,   392 }, {  6,  0,   420 }, {  9,  0,   568 },
+  { 12,  0,   612 }, {  6,  0,   262 }, {  7, 10,    90 }, {  7, 10,   664 },
+  {  7, 10,   830 }, {  7, 10,  1380 }, {  7, 10,  2025 }, {  8, 11,    81 },
+  {  8, 10,   448 }, {  8, 10,   828 }, {  9, 11,   189 }, {  9, 11,   201 },
+  { 11, 11,   478 }, { 11, 11,   712 }, { 13, 11,   338 }, { 14,  0,    31 },
+  {  5, 11,   353 }, { 23, 11,    26 }, {  4,  0,   753 }, {  4,  0,     0 },
+  {  5,  0,    41 }, {  7,  0,  1459 }, {  7,  0,  1469 }, {  7,  0,  1859 },
+  {  9,  0,   549 }, { 11,  0,   905 }, {  9, 10,   417 }, {  9, 10,   493 },
+  {  7, 11,  1113 }, {  5,  0,   696 }, { 13, 11,   448 }, {  6, 10,   295 },
+  {  4,  0,   834 }, {  4,  0,   771 }, {  5, 10,  1019 }, {  6, 11,    25 },
+  {  7, 11,   855 }, {  7, 11,  1258 }, { 16, 11,    32 }, {  6,  0,  1076 },
+  {  5,  0,   921 }, {  5,  0,   674 }, {  4, 11,     4 }, {  7, 11,  1118 },
+  {  7, 11,  1320 }, {  7, 11,  1706 }, {  8, 11,   277 }, {  9, 11,   622 },
+  { 10, 11,     9 }, { 11, 11,   724 }, { 12, 11,   350 }, { 12, 11,   397 },
+  { 13, 11,    28 }, { 13, 11,   159 }, { 15, 11,    89 }, { 18, 11,     5 },
+  { 19, 11,     9 }, { 20, 11,    34 }, { 22, 11,    47 }, {  6, 10,   208 },
+  {  6,  0,   444 }, {  8,  0,   308 }, {  6,  0,   180 }, {  7,  0,  1137 },
+  {  8,  0,   751 }, { 11,  0,   805 }, {  4,  0,   183 }, {  7,  0,   271 },
+  { 11,  0,   824 }, { 11,  0,   952 }, { 13,  0,   278 }, { 13,  0,   339 },
+  { 13,  0,   482 }, { 14,  0,   424 }, { 20,  0,    99 }, {  7, 11,   317 },
+  {  7, 11,   569 }, {  4,  0,    19 }, {  5,  0,   477 }, {  5,  0,   596 },
+  {  6,  0,   505 }, {  7,  0,  1221 }, { 11,  0,   907 }, { 12,  0,   209 },
+  { 13,  0,   214 }, {  7,  0,  1215 }, {  6,  0,   271 }, {  7,  0,   398 },
+  {  8,  0,   387 }, { 10,  0,   344 }, {  7, 10,   448 }, {  7, 10,  1629 },
+  {  7, 10,  1813 }, {  8, 10,   442 }, {  9, 10,   710 }, { 10, 10,   282 },
+  { 10, 10,   722 }, { 11, 10,   844 }, { 12, 10,   104 }, { 12, 10,   625 },
+  {  6, 11,   255 }, {  5, 10,   787 }, {  6,  0,  1645 }, { 11, 11,   956 },
+  { 23, 11,     3 }, {  6,  0,    92 }, {  6,  0,   188 }, {  7,  0,   209 },
+  {  7,  0,  1269 }, {  7,  0,  1524 }, {  7,  0,  1876 }, {  8,  0,   661 },
+  { 10,  0,    42 }, { 10,  0,   228 }, { 11,  0,    58 }, { 11,  0,  1020 },
+  { 12,  0,    58 }, { 12,  0,   118 }, { 13,  0,    32 }, {  4,  0,   459 },
+  {  5,  0,   966 }, {  4, 11,   536 }, {  7, 11,  1141 }, { 10, 11,   723 },
+  { 11, 11,   371 }, { 12,  0,   330 }, {  6,  0,  1557 }, {  7, 11,   285 },
+  {  7, 11,   876 }, {  8, 10,   491 }, {  7, 11,   560 }, {  6,  0,    18 },
+  {  7,  0,   179 }, {  7,  0,   932 }, {  8,  0,   548 }, {  8,  0,   757 },
+  {  9,  0,    54 }, {  9,  0,    65 }, {  9,  0,   532 }, {  9,  0,   844 },
+  { 10,  0,   113 }, { 10,  0,   117 }, { 10,  0,   315 }, { 10,  0,   560 },
+  { 10,  0,   622 }, { 10,  0,   798 }, { 11,  0,   153 }, { 11,  0,   351 },
+  { 11,  0,   375 }, { 12,  0,    78 }, { 12,  0,   151 }, { 12,  0,   392 },
+  { 12,  0,   666 }, { 14,  0,   248 }, { 15,  0,    23 }, {  6,  0,  1742 },
+  {  4, 11,   690 }, {  4, 10,   403 }, {  5, 10,   441 }, {  7, 10,   450 },
+  { 10, 10,   840 }, { 11, 10,   101 }, { 12, 10,   193 }, { 13, 10,   430 },
+  {  5,  0,   965 }, {  6,  0,   182 }, { 10,  0,    65 }, { 10,  0,   488 },
+  { 10,  0,   497 }, {  7, 11,  1346 }, {  6,  0,   973 }, {  6,  0,  1158 },
+  { 10, 11,   200 }, { 19, 11,     2 }, { 23, 11,    22 }, {  4, 11,   190 },
+  {  5, 11,   554 }, {  5, 10,   679 }, {  7,  0,   328 }, {  9, 10,   326 },
+  {  5, 11,  1001 }, {  9,  0,   588 }, { 10,  0,   260 }, {  5, 11,   446 },
+  {  7, 10,  1128 }, {  7, 10,  1796 }, { 19, 11,   119 }, {  6,  0,  1786 },
+  {  6,  0,  1328 }, {  6,  0,  1985 }, {  8,  0,   962 }, { 10,  0,  1017 },
+  {  7,  0,   308 }, { 11,  0,   508 }, {  4, 10,   574 }, {  7, 10,   350 },
+  {  7, 10,  1024 }, {  8, 10,   338 }, {  9, 10,   677 }, { 10, 10,   808 },
+  { 10, 11,   752 }, {  7, 10,  1081 }, {  9, 11,    96 }, {  7, 10,  1676 },
+  {  7, 10,  2037 }, {  8,  0,   588 }, {  4, 11,   304 }, {  5,  0,   614 },
+  { 12,  0,   793 }, {  8,  0,   287 }, {  9, 10,   297 }, { 13, 10,    37 },
+  {  6, 11,    53 }, {  6, 11,   199 }, {  7, 11,  1408 }, {  8, 11,    32 },
+  {  8, 11,    93 }, {  9, 11,   437 }, { 10, 11,   397 }, { 10, 11,   629 },
+  { 11, 11,   593 }, { 11, 11,   763 }, { 13, 11,   326 }, { 17, 11,    35 },
+  {  6, 11,   105 }, {  9, 11,   320 }, { 10, 11,   506 }, { 10, 11,   794 },
+  {  5, 11,   114 }, {  5, 11,   255 }, { 13, 11,   285 }, { 12,  0,   290 },
+  {  7, 11,  2035 }, {  8, 11,    19 }, {  9, 11,    89 }, { 10, 11,   831 },
+  {  6,  0,  1136 }, {  7,  0,   719 }, {  8,  0,   796 }, {  8,  0,   809 },
+  {  8,  0,   834 }, {  6, 10,   306 }, {  7, 10,  1140 }, {  7, 10,  1340 },
+  {  8, 10,   133 }, { 10, 10,   449 }, { 11, 10,  1011 }, {  5,  0,   210 },
+  {  6,  0,   213 }, {  7,  0,    60 }, { 10,  0,   364 }, { 11,  0,   135 },
+  {  5,  0,   607 }, {  8,  0,   326 }, {  8,  0,   490 }, { 10, 11,   176 },
+  {  4,  0,   701 }, {  5,  0,   472 }, {  7,  0,   380 }, {  9,  0,   758 },
+  {  7,  0,  1947 }, {  6,  0,  1079 }, { 10,  0,   278 }, { 10, 11,   391 },
+  {  5, 10,   329 }, {  8, 10,   260 }, { 11, 11,   156 }, {  4,  0,   386 },
+  {  7,  0,    41 }, {  8,  0,   405 }, {  8,  0,   728 }, {  9,  0,   497 },
+  { 11,  0,   110 }, { 11,  0,   360 }, { 15,  0,    37 }, { 16,  0,    84 },
+  {  5,  0,    46 }, {  7,  0,  1452 }, {  7,  0,  1480 }, {  8,  0,   634 },
+  { 12,  0,   472 }, {  8,  0,   961 }, {  4,  0,   524 }, {  8,  0,   810 },
+  { 10,  0,   238 }, { 13,  0,    33 }, {  4, 10,   657 }, { 24, 10,     7 },
+  {  5,  0,   532 }, {  5,  0,   997 }, {  7, 10,  1665 }, {  7, 11,   594 },
+  {  7, 11,   851 }, {  7, 11,  1858 }, {  9, 11,   411 }, {  9, 11,   574 },
+  {  9, 11,   666 }, {  9, 11,   737 }, { 10, 11,   346 }, { 10, 11,   712 },
+  { 11, 11,   246 }, { 11, 11,   432 }, { 11, 11,   517 }, { 11, 11,   647 },
+  { 11, 11,   679 }, { 11, 11,   727 }, { 12, 11,   304 }, { 12, 11,   305 },
+  { 12, 11,   323 }, { 12, 11,   483 }, { 12, 11,   572 }, { 12, 11,   593 },
+  { 12, 11,   602 }, { 13, 11,    95 }, { 13, 11,   101 }, { 13, 11,   171 },
+  { 13, 11,   315 }, { 13, 11,   378 }, { 13, 11,   425 }, { 13, 11,   475 },
+  { 14, 11,    63 }, { 14, 11,   380 }, { 14, 11,   384 }, { 15, 11,   133 },
+  { 18, 11,   112 }, { 20, 11,    72 }, {  5, 11,   955 }, {  8, 11,   814 },
+  {  6,  0,  1301 }, {  5, 10,    66 }, {  7, 10,  1896 }, {  8, 10,   288 },
+  {  5, 11,    56 }, {  6, 10,  1643 }, {  6,  0,  1298 }, { 20, 11,   100 },
+  {  5,  0,   782 }, {  5,  0,   829 }, {  6,  0,   671 }, {  6,  0,  1156 },
+  {  6,  0,  1738 }, {  9, 11,   621 }, {  4,  0,   306 }, {  5,  0,   570 },
+  {  7,  0,  1347 }, {  5, 10,    91 }, {  5, 10,   648 }, {  5, 10,   750 },
+  {  5, 10,   781 }, {  6, 10,    54 }, {  6, 10,   112 }, {  6, 10,   402 },
+  {  6, 10,  1732 }, {  7, 10,   315 }, {  7, 10,   749 }, {  7, 10,  1900 },
+  {  9, 10,    78 }, {  9, 10,   508 }, { 10, 10,   611 }, { 10, 10,   811 },
+  { 11, 10,   510 }, { 11, 10,   728 }, { 13, 10,    36 }, { 14, 10,    39 },
+  { 16, 10,    83 }, { 17, 10,   124 }, { 20, 10,    30 }, {  8, 10,   570 },
+  {  9, 11,   477 }, { 13, 11,    78 }, {  4, 11,   639 }, { 10, 11,     4 },
+  { 10, 10,   322 }, { 10, 10,   719 }, { 11, 10,   407 }, { 11, 11,   638 },
+  { 12, 11,   177 }, { 20, 11,    57 }, {  7,  0,  1823 }, { 11,  0,   693 },
+  {  7,  0,   759 }, {  5, 11,   758 }, {  8, 10,   125 }, {  8, 10,   369 },
+  {  8, 10,   524 }, { 10, 10,   486 }, { 11, 10,    13 }, { 11, 10,   381 },
+  { 11, 10,   736 }, { 11, 10,   766 }, { 11, 10,   845 }, { 13, 10,   114 },
+  { 13, 10,   292 }, { 14, 10,    47 }, {  7,  0,  1932 }, {  6, 10,  1684 },
+  {  6, 10,  1731 }, {  7, 10,   356 }, {  8, 10,    54 }, {  8, 10,   221 },
+  {  9, 10,   225 }, {  9, 10,   356 }, { 10, 10,    77 }, { 10, 10,   446 },
+  { 10, 10,   731 }, { 12, 10,   404 }, { 13, 10,   491 }, {  7, 11,   552 },
+  {  7, 11,  1112 }, {  4,  0,    78 }, {  5,  0,    96 }, {  5,  0,   182 },
+  {  6,  0,  1257 }, {  7,  0,  1724 }, {  7,  0,  1825 }, { 10,  0,   394 },
+  { 10,  0,   471 }, { 11,  0,   532 }, { 14,  0,   340 }, { 17,  0,    88 },
+  { 11, 11,   328 }, {  7,  0,  1964 }, {  4, 10,   411 }, {  4, 10,    80 },
+  {  5, 10,    44 }, {  9, 11,   133 }, {  5, 11,   110 }, {  6, 11,   169 },
+  {  6, 11,  1702 }, {  7, 11,   400 }, {  8, 11,   538 }, {  9, 11,   184 },
+  {  9, 11,   524 }, { 12, 11,   218 }, {  4,  0,   521 }, {  5, 10,   299 },
+  {  7, 10,  1083 }, { 12, 11,   554 }, {  6, 11,   133 }, {  9, 11,   353 },
+  { 12, 11,   628 }, { 18, 11,    79 }, {  6,  0,   215 }, {  7,  0,   584 },
+  {  7,  0,  1028 }, {  7,  0,  1473 }, {  7,  0,  1721 }, {  9,  0,   424 },
+  { 10,  0,   779 }, {  7,  0,   857 }, {  7,  0,  1209 }, {  7, 10,  1713 },
+  {  9, 10,   537 }, { 10, 10,   165 }, { 12, 10,   219 }, { 12, 10,   561 },
+  {  4, 10,   219 }, {  6, 11,    93 }, {  7, 11,  1422 }, {  7, 10,  1761 },
+  {  7, 11,  1851 }, {  8, 11,   673 }, {  9, 10,    86 }, {  9, 11,   529 },
+  { 12, 11,    43 }, {  9, 11,   371 }, {  8,  0,   671 }, {  5,  0,   328 },
+  {  7,  0,   918 }, {  4,  0,   529 }, {  9, 11,    25 }, { 10, 11,   467 },
+  { 10, 11,   559 }, {  4, 11,   335 }, {  7, 11,   942 }, {  6,  0,   716 },
+  {  6,  0,  1509 }, {  6,  0,    67 }, {  7,  0,   258 }, {  7,  0,  1630 },
+  {  9,  0,   354 }, {  9,  0,   675 }, { 10,  0,   830 }, { 14,  0,    80 },
+  { 17,  0,    80 }, { 12, 10,   428 }, {  6,  0,  1112 }, {  6,  0,   141 },
+  {  7,  0,   225 }, {  9,  0,    59 }, {  9,  0,   607 }, { 10,  0,   312 },
+  { 11,  0,   687 }, { 12,  0,   555 }, { 13,  0,   373 }, { 13,  0,   494 },
+  { 20,  0,    58 }, {  5, 10,   514 }, {  8, 11,    39 }, { 10, 11,   773 },
+  { 11, 11,    84 }, { 12, 11,   205 }, { 14, 11,     1 }, {  8,  0,   783 },
+  {  5, 11,   601 }, {  5, 11,   870 }, {  8, 11,   594 }, {  4, 10,    55 },
+  {  5, 10,   301 }, {  6, 10,   571 }, { 14, 10,    49 }, { 18, 10,   102 },
+  {  4, 11,   181 }, {  6, 11,  1652 }, {  5, 10,   364 }, {  4, 11,    97 },
+  {  5, 11,   147 }, {  6, 11,   286 }, {  7, 11,  1362 }, { 13, 11,   176 },
+  {  4, 10,    76 }, {  7, 10,  1550 }, {  9, 10,   306 }, {  9, 10,   430 },
+  {  9, 10,   663 }, { 10, 10,   683 }, { 11, 10,   427 }, { 11, 10,   753 },
+  { 12, 10,   334 }, { 12, 10,   442 }, { 14, 10,   258 }, { 14, 10,   366 },
+  { 15, 10,   131 }, {  9, 10,    52 }, {  6,  0,   955 }, {  6,  0,  1498 },
+  {  6, 11,   375 }, {  7, 11,   169 }, {  7, 11,   254 }, {  8, 11,   780 },
+  {  7,  0,   430 }, { 11,  0,    46 }, { 14,  0,   343 }, { 14, 11,   343 },
+  {  7,  0,  1183 }, {  5,  0,   602 }, {  7,  0,  2018 }, {  9,  0,   418 },
+  {  9,  0,   803 }, {  7, 11,  1447 }, {  8,  0,   677 }, {  7, 11,  1044 },
+  { 11, 11,   285 }, {  4, 10,   656 }, {  7, 10,   779 }, {  7, 10,   144 },
+  {  5, 11,   629 }, {  7, 11,  1549 }, {  7, 10,  1373 }, { 10, 11,   209 },
+  {  7, 10,   554 }, {  7, 10,   605 }, { 13, 10,    10 }, {  5, 10,   838 },
+  {  5, 10,   841 }, {  6, 10,  1649 }, {  5, 10,  1012 }, {  6,  0,  1357 },
+  {  6,  0,  1380 }, { 16,  0,    53 }, {  6,  0,   590 }, {  7, 10,   365 },
+  {  7, 10,  1357 }, {  7, 10,  1497 }, {  8, 10,   154 }, { 13, 10,   281 },
+  {  5, 10,   340 }, {  4, 11,   420 }, {  7,  0,   329 }, { 19, 11,    32 },
+  {  4,  0,   469 }, { 10, 11,   429 }, { 11, 10,   495 }, {  8, 10,   261 },
+  {  9, 10,   144 }, {  9, 10,   466 }, { 10, 10,   370 }, { 12, 10,   470 },
+  { 13, 10,   144 }, { 14, 10,   348 }, { 14,  0,   460 }, {  4, 11,   325 },
+  {  9, 10,   897 }, { 10, 11,   125 }, {  6,  0,  1743 }, {  6, 10,   248 },
+  {  9, 10,   546 }, { 10, 10,   535 }, { 11, 10,   681 }, { 13, 10,   135 },
+  {  4,  0,   990 }, {  5,  0,   929 }, {  6,  0,   340 }, {  8,  0,   376 },
+  {  8,  0,   807 }, {  8,  0,   963 }, {  8,  0,   980 }, { 10,  0,  1007 },
+  {  6,  0,  1603 }, { 12,  0,   250 }, {  4, 11,   714 }, {  5, 11,   469 },
+  {  6, 10,   567 }, {  8, 10,   445 }, {  5,  0,   218 }, {  7,  0,  1610 },
+  {  8,  0,   646 }, { 10,  0,    83 }, { 11, 11,   138 }, { 12, 11,    40 },
+  {  7,  0,  1512 }, {  7,  0,  1794 }, {  7, 11,  1216 }, { 11,  0,     0 },
+  { 16,  0,    78 }, {  4, 11,   718 }, {  5,  0,   571 }, {  4,  0,   455 },
+  {  6,  0,  1012 }, {  5, 11,   124 }, {  5, 11,   144 }, {  6, 11,   548 },
+  {  7, 11,    15 }, {  7, 11,   153 }, {  9, 11,   629 }, { 14, 11,    10 },
+  {  6, 11,    75 }, {  7, 11,  1531 }, {  8, 11,   416 }, {  9, 11,   240 },
+  {  9, 11,   275 }, { 10, 11,   100 }, { 11, 11,   658 }, { 11, 11,   979 },
+  { 12, 11,    86 }, { 13, 11,   468 }, { 14, 11,    66 }, { 14, 11,   207 },
+  { 15, 11,    20 }, { 15, 11,    25 }, { 16, 11,    58 }, {  4, 10,   577 },
+  {  5, 11,   141 }, {  5, 11,   915 }, {  6, 11,  1783 }, {  7, 11,   211 },
+  {  7, 11,   698 }, {  7, 11,  1353 }, {  9, 11,    83 }, {  9, 11,   281 },
+  { 10, 11,   376 }, { 10, 11,   431 }, { 11, 11,   543 }, { 12, 11,   664 },
+  { 13, 11,   280 }, { 13, 11,   428 }, { 14, 11,    61 }, { 14, 11,   128 },
+  { 17, 11,    52 }, { 17, 11,    81 }, {  6,  0,   161 }, {  7,  0,   372 },
+  {  9,  0,   597 }, {  4,  0,   349 }, { 10, 11,   702 }, { 11, 11,   245 },
+  {  6,  0,   524 }, {  6, 10,   174 }, {  6,  0,   432 }, {  9,  0,   751 },
+  { 11,  0,   322 }, { 19, 11,    94 }, {  4, 11,   338 }, {  5, 11,   400 },
+  {  5,  0,   468 }, { 10,  0,   325 }, { 11,  0,   856 }, { 12,  0,   345 },
+  { 15,  0,   104 }, {  5,  0,   223 }, {  4,  0,   566 }, {  4, 11,   221 },
+  {  5, 11,   659 }, {  5, 11,   989 }, {  7, 11,   697 }, {  7, 11,  1211 },
+  { 10, 11,   284 }, {  7, 11,  1070 }, {  4,  0,    59 }, {  7,  0,  1394 },
+  {  6,  0,   436 }, { 11,  0,   481 }, {  5, 10,   878 }, {  5, 10,   972 },
+  {  4,  0,    48 }, {  5,  0,   271 }, {  7,  0,   953 }, {  5,  0,   610 },
+  {  8,  0,   457 }, {  4,  0,   773 }, {  5,  0,   618 }, {  9,  0,   756 },
+  {  5,  0,   755 }, {  7,  0,  1217 }, { 10, 11,   507 }, {  4, 10,   351 },
+  {  4,  0,   197 }, { 15, 11,    78 }, {  4, 11,   188 }, {  7, 11,   805 },
+  { 11, 11,   276 }, { 14, 11,   293 }, {  5, 11,   884 }, { 11, 11,   991 },
+  {  4, 10,   286 }, { 10,  0,   259 }, { 10,  0,   428 }, {  7, 10,   438 },
+  {  7, 10,   627 }, {  7, 10,  1516 }, {  8, 10,    40 }, {  9, 10,    56 },
+  {  9, 10,   294 }, { 11, 10,   969 }, { 11, 10,   995 }, { 18, 10,   148 },
+  {  4,  0,   356 }, {  5,  0,   217 }, {  5,  0,   492 }, {  5,  0,   656 },
+  {  8,  0,   544 }, {  8, 11,   544 }, {  5,  0,   259 }, {  6,  0,  1230 },
+  {  7,  0,   414 }, {  7,  0,   854 }, { 14,  0,   107 }, {  4,  0,  1007 },
+  { 15,  0,    14 }, { 16,  0,     5 }, {  6,  0,  1580 }, {  4, 10,   738 },
+  {  4, 11,   596 }, {  4,  0,   673 }, {  5, 10,   866 }, {  6,  0,  1843 },
+  {  7, 11,  1847 }, {  4,  0,   165 }, {  7,  0,  1398 }, {  7,  0,  1829 },
+  {  7, 11,  1634 }, { 19, 11,    65 }, {  6,  0,   885 }, {  6,  0,  1009 },
+  {  9,  0,   809 }, {  5, 10,   116 }, {  4, 10,   457 }, {  8, 11,   770 },
+  {  9,  0,   498 }, { 12,  0,   181 }, { 10, 11,   361 }, { 14, 11,   316 },
+  {  6, 11,   595 }, {  5,  0,     9 }, {  7,  0,   297 }, {  7,  0,   966 },
+  { 12,  0,   306 }, {  4, 11,    89 }, {  5, 11,   489 }, {  6, 11,   315 },
+  {  7, 11,   553 }, {  7, 11,  1745 }, { 10, 11,   243 }, {  6,  0,  1487 },
+  {  4,  0,   437 }, {  5,  0,   146 }, {  6,  0,   411 }, { 10,  0,   721 },
+  {  5, 10,   527 }, {  6, 10,   189 }, {  7, 10,   859 }, { 11, 10,   104 },
+  { 11, 10,   554 }, { 15, 10,    60 }, { 15, 10,   125 }, {  6, 11,  1658 },
+  {  9, 11,     3 }, { 10, 11,   154 }, { 11, 11,   641 }, { 13, 11,    85 },
+  { 13, 11,   201 }, { 13, 11,   346 }, {  6,  0,   177 }, {  7,  0,   467 },
+  {  6,  0,  1377 }, {  6, 10,   116 }, {  8, 11,   645 }, {  4, 11,   166 },
+  {  5, 11,   505 }, {  6, 11,  1670 }, {  9, 11,   110 }, {  5, 10,   487 },
+  {  4, 10,    86 }, {  5, 10,   667 }, {  5, 10,   753 }, {  6, 10,   316 },
+  {  6, 10,   455 }, {  7, 10,   946 }, {  5,  0,   200 }, {  4,  0,   959 },
+  {  6,  0,  1928 }, {  6,  0,  1957 }, { 11, 11,   203 }, { 22, 10,    45 },
+  {  4, 10,    79 }, {  7, 10,  1773 }, { 10, 10,   450 }, { 11, 10,   589 },
+  { 13, 10,   332 }, { 13, 10,   493 }, { 14, 10,   183 }, { 14, 10,   334 },
+  { 14, 10,   362 }, { 14, 10,   368 }, { 14, 10,   376 }, { 14, 10,   379 },
+  { 19, 10,    90 }, { 19, 10,   103 }, { 19, 10,   127 }, { 20, 10,    90 },
+  {  6,  0,  1435 }, {  7, 11,  1275 }, {  6,  0,   481 }, {  7, 11,   445 },
+  {  8, 11,   307 }, {  8, 11,   704 }, { 10, 11,    41 }, { 10, 11,   439 },
+  { 11, 11,   237 }, { 11, 11,   622 }, { 12, 11,   201 }, {  7, 11,   869 },
+  {  4,  0,    84 }, {  7,  0,  1482 }, { 10,  0,    76 }, { 10,  0,   142 },
+  { 11, 11,   277 }, { 16, 11,    14 }, {  7, 11,  1977 }, {  4, 11,   189 },
+  {  5, 11,   713 }, {  8, 11,    57 }, {  5,  0,  1015 }, { 10, 11,   371 },
+  {  4,  0,   315 }, {  5,  0,   507 }, {  7,  0,  1370 }, {  4, 11,   552 },
+  { 14, 10,   381 }, {  9,  0,   759 }, { 16,  0,    31 }, { 16,  0,    39 },
+  { 16,  0,    75 }, { 18,  0,    24 }, { 20,  0,    42 }, { 24,  0,     1 },
+  {  6,  0,   712 }, {  6,  0,  1722 }, {  5, 10,   663 }, {  5, 10,   846 },
+  {  8,  0,   222 }, {  8,  0,   476 }, {  9,  0,   238 }, { 11,  0,   516 },
+  { 11,  0,   575 }, { 15,  0,   109 }, { 18,  0,   100 }, {  7,  0,  1402 },
+  {  7,  0,  1414 }, { 12,  0,   456 }, {  5, 10,   378 }, {  8, 10,   465 },
+  {  9, 10,   286 }, { 10, 10,   185 }, { 10, 10,   562 }, { 10, 10,   635 },
+  { 11, 10,    31 }, { 11, 10,   393 }, { 13, 10,   312 }, { 18, 10,    65 },
+  { 18, 10,    96 }, { 19, 10,    89 }, {  4,  0,   986 }, {  6,  0,  1958 },
+  {  6,  0,  2032 }, {  8,  0,   934 }, { 10,  0,   985 }, {  7, 10,  1880 },
+  {  9, 10,   680 }, { 11, 10,   798 }, {  6, 10,  1770 }, { 17, 11,    49 },
+  {  4, 11,   614 }, {  4, 10,   648 }, {  5, 10,   945 }, {  6, 10,  1656 },
+  {  6, 10,  1787 }, {  7, 10,   167 }, {  8, 10,   824 }, {  9, 10,   391 },
+  { 10, 10,   375 }, { 11, 10,   185 }, { 10, 11,   661 }, {  7,  0,  1273 },
+  {  7, 11,  1945 }, {  7,  0,   706 }, {  7,  0,  1058 }, { 10,  0,   538 },
+  {  7, 10,  1645 }, {  8, 10,   352 }, {  9, 10,   249 }, {  4, 10,   152 },
+  { 11,  0,    92 }, { 11,  0,   196 }, { 11,  0,   409 }, { 11,  0,   450 },
+  { 11,  0,   666 }, { 11,  0,   777 }, { 12,  0,   262 }, { 13,  0,   385 },
+  { 13,  0,   393 }, { 15,  0,   115 }, { 16,  0,    45 }, { 17,  0,    82 },
+  {  5, 10,  1006 }, {  6,  0,    40 }, {  7,  0,  1781 }, {  9, 11,   614 },
+  { 11, 11,   327 }, {  5, 10,   420 }, {  7, 10,  1449 }, {  7,  0,   431 },
+  { 10,  0,    97 }, {  7, 10,   832 }, {  6,  0,   423 }, {  7,  0,   665 },
+  {  7,  0,  1210 }, {  7,  0,   237 }, {  8,  0,   664 }, {  9,  0,    42 },
+  {  9,  0,   266 }, {  9,  0,   380 }, {  9,  0,   645 }, { 10,  0,   177 },
+  { 10,  0,   276 }, {  7,  0,   264 }, {  5, 10,   351 }, {  8,  0,   213 },
+  {  5, 10,    40 }, {  7, 10,   598 }, {  7, 10,  1638 }, {  9, 10,   166 },
+  {  9, 10,   640 }, {  9, 10,   685 }, {  9, 10,   773 }, { 11, 10,   215 },
+  { 13, 10,    65 }, { 14, 10,   172 }, { 14, 10,   317 }, { 17, 10,     6 },
+  {  5, 11,    84 }, {  6, 11,   163 }, {  8, 10,    60 }, {  9, 10,   343 },
+  { 11, 10,   769 }, {  9,  0,   455 }, {  5, 11,   410 }, {  8,  0,   906 },
+  { 12,  0,   700 }, { 12,  0,   706 }, { 12,  0,   729 }, { 21, 11,    33 },
+  { 22, 11,    40 }, {  7, 10,  1951 }, {  8, 10,   765 }, {  8, 10,   772 },
+  { 12, 10,   671 }, {  7, 10,   108 }, {  8, 10,   219 }, {  8, 10,   388 },
+  {  9, 10,   639 }, {  9, 10,   775 }, { 11, 10,   275 }, { 12, 10,   464 },
+  {  5, 11,   322 }, {  7, 11,  1941 }, {  8, 11,   186 }, {  9, 11,   262 },
+  { 10, 11,   187 }, { 14, 11,   208 }, { 18, 11,   130 }, { 11,  0,   624 },
+  {  8,  0,   574 }, {  5, 11,   227 }, { 12, 11,    29 }, {  7, 11,  1546 },
+  { 11, 11,   299 }, { 14, 11,   407 }, {  5, 10,    15 }, {  6, 10,    56 },
+  {  7, 10,  1758 }, {  8, 10,   500 }, {  9, 10,   730 }, { 11, 10,   331 },
+  { 13, 10,   150 }, { 14, 10,   282 }, {  7, 11,  1395 }, {  8, 11,   486 },
+  {  9, 11,   236 }, {  9, 11,   878 }, { 10, 11,   218 }, { 11, 11,    95 },
+  { 19, 11,    17 }, { 19, 11,    31 }, {  7, 11,  2043 }, {  4,  0,   354 },
+  { 18, 11,     4 }, { 12, 11,    80 }, {  7,  0,  1558 }, {  6, 10,  1886 },
+  {  5, 10,   205 }, {  6, 10,   438 }, {  9, 10,   711 }, {  5, 11,   522 },
+  {  5, 10,   534 }, {  7,  0,   235 }, {  7,  0,  1475 }, { 15,  0,    68 },
+  { 18,  0,   120 }, {  9, 10,   691 }, {  4,  0,   942 }, {  6,  0,  1813 },
+  {  8,  0,   917 }, { 10,  0,   884 }, { 12,  0,   696 }, { 12,  0,   717 },
+  { 12,  0,   723 }, { 12,  0,   738 }, { 12,  0,   749 }, { 12,  0,   780 },
+  { 16,  0,    97 }, { 18,  0,   169 }, {  6, 10,   443 }, {  8, 11,   562 },
+  {  9, 10,   237 }, {  9, 10,   571 }, {  9, 10,   695 }, { 10, 10,   139 },
+  { 11, 10,   715 }, { 12, 10,   417 }, { 13, 10,   421 }, {  7,  0,   957 },
+  {  5,  0,   830 }, {  6, 11,  1771 }, { 18,  0,    23 }, {  5,  0,   496 },
+  {  6,  0,   694 }, {  7,  0,   203 }, {  7, 11,  1190 }, {  9, 11,   620 },
+  {  9, 11,   132 }, {  6,  0,   547 }, {  6,  0,  1549 }, {  8, 11,   258 },
+  {  9, 11,   208 }, {  9, 11,   359 }, {  4,  0,   864 }, {  5,  0,    88 },
+  {  9,  0,   239 }, {  7, 11,   493 }, {  4, 11,   317 }, {  7, 11,  1279 },
+  {  4, 11,   477 }, {  4, 10,   578 }, {  5, 11,    63 }, {  5, 11,   509 },
+  {  7,  0,   650 }, {  7,  0,  1310 }, {  7,  0,  1076 }, {  9,  0,    80 },
+  { 11,  0,    78 }, { 11,  0,   421 }, { 11,  0,   534 }, { 12,  0,   545 },
+  {  4, 11,   288 }, { 12,  0,   553 }, { 14,  0,   118 }, {  5, 10,   923 },
+  {  7,  0,   274 }, { 11,  0,   479 }, { 11,  0,   507 }, {  8, 11,    89 },
+  {  8, 11,   620 }, {  9, 11,    49 }, { 10, 11,   774 }, { 11, 11,   628 },
+  { 12, 11,   322 }, { 15, 11,   124 }, {  4,  0,   497 }, {  7,  0,  1584 },
+  {  7,  0,   261 }, {  7,  0,  1115 }, {  7,  0,  1354 }, {  7,  0,  1404 },
+  {  7,  0,  1588 }, {  7,  0,  1705 }, {  7,  0,  1902 }, {  9,  0,   465 },
+  { 10,  0,   248 }, { 10,  0,   349 }, { 10,  0,   647 }, { 11,  0,   527 },
+  { 11,  0,   660 }, { 11,  0,   669 }, { 12,  0,   529 }, { 13,  0,   305 },
+  {  4, 10,   924 }, {  5, 10,   665 }, {  8,  0,    13 }, {  6,  0,   791 },
+  { 10, 11,   120 }, {  7,  0,   642 }, {  8,  0,   250 }, { 11,  0,   123 },
+  { 11,  0,   137 }, { 13,  0,    48 }, { 14,  0,    95 }, {  4, 10,   265 },
+  {  7, 10,   807 }, {  7, 10,   950 }, {  5, 10,    93 }, { 12, 10,   267 },
+  {  7,  0,  1429 }, {  4,  0,   949 }, { 10,  0,   885 }, { 10,  0,   891 },
+  { 10,  0,   900 }, { 10,  0,   939 }, { 12,  0,   760 }, { 14,  0,   449 },
+  { 11, 11,   366 }, {  4,  0,   818 }, {  6, 11,    85 }, {  7, 10,   994 },
+  {  7,  0,   330 }, {  5, 10,   233 }, {  5, 10,   320 }, {  6, 10,   140 },
+  {  8, 10,   295 }, {  4,  0,  1004 }, {  8,  0,   982 }, {  8,  0,   993 },
+  {  5, 10,   978 }, {  4, 10,   905 }, {  6, 10,  1701 }, {  9, 10,   843 },
+  { 10,  0,   545 }, { 12,  0,   301 }, {  6,  0,   947 }, {  6,  0,  1062 },
+  {  6,  0,  1188 }, {  4,  0,   904 }, {  5,  0,   794 }, { 24, 10,     6 },
+  {  6,  0,  1372 }, {  7, 11,   608 }, {  5, 11,   279 }, {  6, 11,   235 },
+  {  7, 11,   468 }, {  8, 11,   446 }, {  9, 11,   637 }, { 10, 11,   717 },
+  { 11, 11,   738 }, { 12, 11,   514 }, {  4, 10,   509 }, {  5, 11,    17 },
+  {  6, 11,   371 }, {  9, 11,   528 }, {  4,  0,   693 }, {  4, 11,   115 },
+  {  5, 11,   669 }, {  6, 11,   407 }, {  8, 11,   311 }, { 11, 11,    10 },
+  { 13, 11,     5 }, { 11,  0,   377 }, {  7, 10,   273 }, {  9, 11,   381 },
+  {  7,  0,   695 }, {  7,  0,   386 }, { 10,  0,   713 }, {  7, 10,  1041 },
+  {  6,  0,  1291 }, {  6,  0,     7 }, {  6,  0,    35 }, {  7,  0,   147 },
+  {  7,  0,  1069 }, {  7,  0,  1568 }, {  7,  0,  1575 }, {  7,  0,  1917 },
+  {  8,  0,    43 }, {  8,  0,   208 }, {  9,  0,   128 }, {  9,  0,   866 },
+  { 10,  0,    20 }, { 11,  0,   981 }, { 19,  0,    33 }, {  7,  0,   893 },
+  { 13,  0,   424 }, { 11, 10,   234 }, { 22, 11,    56 }, {  5, 11,   779 },
+  {  5, 11,   807 }, {  6, 11,  1655 }, {  6, 11,  1676 }, {  5, 10,   802 },
+  {  7, 10,  2021 }, {  8, 10,   805 }, {  4, 11,   196 }, {  5, 10,   167 },
+  {  5, 11,   558 }, {  5, 10,   899 }, {  5, 11,   949 }, {  6, 10,   410 },
+  {  9, 10,   777 }, {  9, 10,   789 }, {  6, 10,  1705 }, {  8,  0,   904 },
+  { 12,  0,   787 }, {  6,  0,   322 }, {  9,  0,   552 }, { 11,  0,   274 },
+  { 13,  0,   209 }, { 13,  0,   499 }, { 14,  0,    85 }, { 15,  0,   126 },
+  { 17,  0,    70 }, {  7, 10,    10 }, {  5, 10,    11 }, {  6, 10,   117 },
+  {  6, 10,   485 }, {  7, 10,  1133 }, {  9, 10,   582 }, {  9, 10,   594 },
+  { 11, 10,    21 }, { 11, 10,   818 }, { 12, 10,   535 }, { 13, 10,    86 },
+  {  4, 10,   264 }, {  7, 10,  1067 }, {  8, 10,   204 }, {  8, 10,   385 },
+  { 11, 10,   953 }, {  4, 11,   752 }, { 10, 10,    56 }, {  5, 10,   470 },
+  {  6,  0,  1808 }, {  8,  0,    83 }, {  8,  0,   742 }, {  8,  0,   817 },
+  {  9,  0,    28 }, {  9,  0,    29 }, {  9,  0,   885 }, { 10,  0,   387 },
+  { 11,  0,   633 }, { 11,  0,   740 }, { 13,  0,   235 }, { 13,  0,   254 },
+  { 15,  0,   143 }, { 15,  0,   146 }, { 12,  0,    49 }, {  6,  0,  1832 },
+  {  4, 11,   227 }, {  5, 11,   159 }, {  5, 11,   409 }, {  7, 11,    80 },
+  { 10, 11,   294 }, { 10, 11,   479 }, { 12, 11,   418 }, { 14, 11,    50 },
+  { 14, 11,   249 }, { 14, 11,   295 }, {  7, 11,  1470 }, {  8, 11,    66 },
+  {  8, 11,   137 }, {  8, 11,   761 }, {  9, 11,   638 }, { 11, 11,    80 },
+  { 11, 11,   212 }, { 11, 11,   368 }, { 11, 11,   418 }, { 12, 11,     8 },
+  { 13, 11,    15 }, { 16, 11,    61 }, { 17, 11,    59 }, { 19, 11,    28 },
+  { 20, 11,    84 }, { 11, 10,  1015 }, { 10, 11,   468 }, {  7,  0,   421 },
+  {  6,  0,   415 }, {  7,  0,  1049 }, {  9,  0,   442 }, {  6, 11,    38 },
+  {  7, 11,  1220 }, {  8, 11,   185 }, {  8, 11,   256 }, {  9, 11,    22 },
+  {  9, 11,   331 }, { 10, 11,   738 }, { 11, 11,   205 }, { 11, 11,   540 },
+  { 11, 11,   746 }, { 13, 11,   399 }, { 13, 11,   465 }, { 14, 11,    88 },
+  { 14, 11,   194 }, { 11,  0,   289 }, {  5, 10,   715 }, {  4,  0,   110 },
+  { 10,  0,   415 }, { 10,  0,   597 }, { 14,  0,   206 }, {  4, 11,   159 },
+  {  6, 11,   115 }, {  7, 11,   252 }, {  7, 11,   257 }, {  7, 11,  1928 },
+  {  8, 11,    69 }, {  9, 11,   384 }, { 10, 11,    91 }, { 10, 11,   615 },
+  { 12, 11,   375 }, { 14, 11,   235 }, { 18, 11,   117 }, { 19, 11,   123 },
+  {  5, 11,   911 }, {  8, 11,   278 }, {  7,  0,   205 }, {  7,  0,  2000 },
+  {  8, 10,   794 }, {  9, 10,   400 }, { 10, 10,   298 }, { 14, 10,   228 },
+  {  7, 11,  1774 }, {  4, 11,   151 }, {  7, 11,  1567 }, {  8, 11,   351 },
+  {  9, 11,   322 }, {  8, 10,   724 }, {  5, 11,   990 }, {  7,  0,  1539 },
+  { 11,  0,   512 }, { 13,  0,   205 }, { 19,  0,    30 }, { 22,  0,    36 },
+  { 23,  0,    19 }, {  7, 11,  1539 }, {  5, 11,   194 }, {  7, 11,  1662 },
+  {  9, 11,    90 }, { 12, 11,   180 }, {  6, 10,   190 }, {  7, 10,   768 },
+  {  7, 10,  1170 }, {  6,  0,  1340 }, {  4,  0,   283 }, {  7,  0,  1194 },
+  {  5, 11,   425 }, {  5, 11,   971 }, { 12,  0,   549 }, { 14, 10,    67 },
+  { 19, 10,    60 }, {  7, 10,  1023 }, {  6,  0,  1720 }, { 10, 11,   587 },
+  {  5, 11,    72 }, {  6, 11,   264 }, {  7, 11,    21 }, {  7, 11,    46 },
+  {  7, 11,  2013 }, {  8, 11,   215 }, {  8, 11,   513 }, { 10, 11,   266 },
+  { 11, 11,    22 }, {  5,  0,   319 }, {  7,  0,   534 }, {  6, 10,   137 },
+  {  9, 10,    75 }, {  9, 10,   253 }, { 10, 10,   194 }, { 10, 10,   444 },
+  {  7,  0,  1180 }, { 20,  0,   112 }, {  6, 11,   239 }, {  7, 11,   118 },
+  { 10, 11,    95 }, { 11, 11,   603 }, { 13, 11,   443 }, { 14, 11,   160 },
+  { 15, 11,     4 }, {  6, 11,   431 }, {  5, 11,   874 }, {  6, 11,  1677 },
+  { 11, 10,   643 }, { 12, 10,   115 }, { 15, 11,     0 }, {  6,  0,   967 },
+  {  6, 11,    65 }, {  7, 11,   939 }, {  7, 11,  1172 }, {  7, 11,  1671 },
+  {  9, 11,   540 }, { 10, 11,   696 }, { 11, 11,   265 }, { 11, 11,   732 },
+  { 11, 11,   928 }, { 11, 11,   937 }, { 12, 11,   399 }, { 13, 11,   438 },
+  { 21, 11,    19 }, {  9, 11,   200 }, {  7,  0,  1940 }, {  5, 10,   760 },
+  {  7, 10,   542 }, {  8, 10,   135 }, {  8, 10,   496 }, { 12, 11,    44 },
+  {  7, 11,  1655 }, {  8, 11,   305 }, {  7, 10,   319 }, {  7, 10,   355 },
+  {  7, 10,   763 }, { 10, 10,   389 }, { 17, 10,    43 }, {  8,  0,   735 },
+  { 10, 10,   786 }, {  9, 11,    19 }, {  4, 11,   696 }, {  5,  0,   132 },
+  {  9,  0,   486 }, {  9,  0,   715 }, { 10,  0,   458 }, { 11,  0,   373 },
+  { 11,  0,   668 }, { 11,  0,   795 }, { 11,  0,   897 }, { 12,  0,   272 },
+  { 12,  0,   424 }, { 12,  0,   539 }, { 12,  0,   558 }, { 14,  0,   245 },
+  { 14,  0,   263 }, { 14,  0,   264 }, { 14,  0,   393 }, { 14,  0,   403 },
+  { 10,  0,    38 }, { 11,  0,   784 }, {  4,  0,   838 }, {  4, 11,   302 },
+  {  7, 11,  1766 }, {  5,  0,   379 }, {  5,  0,     8 }, {  6,  0,    89 },
+  {  6,  0,   400 }, {  7,  0,  1569 }, {  7,  0,  1623 }, {  7,  0,  1850 },
+  {  8,  0,   218 }, {  8,  0,   422 }, {  9,  0,   570 }, { 10,  0,   626 },
+  {  4, 11,   726 }, {  5, 11,   630 }, {  4,  0,  1017 }, { 10,  0,   660 },
+  {  6,  0,   387 }, {  7,  0,   882 }, { 13,  0,   111 }, {  6,  0,   224 },
+  {  7,  0,   877 }, {  9,  0,   647 }, {  4, 10,    58 }, {  5, 10,   286 },
+  {  6, 10,   319 }, {  7, 10,   402 }, {  7, 10,  1254 }, {  7, 10,  1903 },
+  {  8, 10,   356 }, { 12, 10,   408 }, {  7,  0,   790 }, {  9,  0,   510 },
+  { 10,  0,    53 }, {  4, 10,   389 }, {  9, 10,   181 }, { 10, 10,    29 },
+  { 10, 10,   816 }, { 11, 10,   311 }, { 11, 10,   561 }, { 12, 10,    67 },
+  { 13, 10,   181 }, { 14,  0,   458 }, {  6, 11,   118 }, {  7, 11,   215 },
+  {  7, 11,  1521 }, { 12, 11,    11 }, {  6,  0,   954 }, {  7,  0,   394 },
+  {  6,  0,  1367 }, {  5, 11,   225 }, {  5, 10,   373 }, {  4,  0,   882 },
+  {  7,  0,  1409 }, {  7, 10,  1972 }, {  7, 10,  1793 }, {  4, 11,   370 },
+  {  5, 11,   756 }, {  7, 11,  1326 }, { 22, 11,    13 }, {  7, 11,   354 },
+  { 10, 11,   410 }, { 11, 11,   815 }, {  6, 11,  1662 }, {  7, 11,    48 },
+  {  8, 11,   771 }, { 10, 11,   116 }, { 13, 11,   104 }, { 14, 11,   105 },
+  { 14, 11,   184 }, { 15, 11,   168 }, { 19, 11,    92 }, { 20, 11,    68 },
+  {  7,  0,   124 }, {  8,  0,    38 }, {  5,  0,   261 }, {  7,  0,    78 },
+  {  7,  0,   199 }, {  8,  0,   815 }, {  9,  0,   126 }, { 10,  0,   342 },
+  { 12,  0,   647 }, {  4,  0,   628 }, { 12,  0,   724 }, {  7,  0,   266 },
+  {  8,  0,   804 }, {  7, 10,  1651 }, { 17, 10,    89 }, {  7,  0,   208 },
+  {  6,  0,  1178 }, {  6,  0,    79 }, {  7,  0,  1519 }, {  4, 10,   672 },
+  {  5, 10,   737 }, {  8,  0,   741 }, {  4, 11,   120 }, {  4,  0,   710 },
+  {  6,  0,   376 }, {  6,  0,   606 }, {  6,  0,  1347 }, {  6,  0,  1494 },
+  {  6,  0,   850 }, {  6,  0,  1553 }, {  9,  0,   821 }, {  5, 10,   145 },
+  {  6, 11,   593 }, {  7,  0,  1311 }, { 12,  0,   135 }, {  4,  0,   467 },
+  {  5,  0,   405 }, {  6,  0,   544 }, {  5, 11,   820 }, {  7, 11,   931 },
+  {  6,  0,   100 }, {  7,  0,   244 }, {  7,  0,   632 }, {  7,  0,  1609 },
+  {  8,  0,   178 }, {  8,  0,   638 }, { 13,  0,    58 }, {  4, 10,   387 },
+  {  7, 10,  1288 }, {  6, 11,   151 }, {  6, 11,  1675 }, {  7, 11,   383 },
+  { 23, 11,    10 }, {  4,  0,   481 }, {  7, 10,   550 }, {  6,  0,  1378 },
+  {  6, 11,  1624 }, { 11, 11,    11 }, { 12, 11,   422 }, { 13, 11,   262 },
+  { 14, 11,   360 }, {  5,  0,   791 }, {  4, 11,    43 }, {  5, 11,   344 },
+  {  5, 11,   357 }, {  7,  0,  1227 }, { 12,  0,   978 }, {  7,  0,   686 },
+  {  8,  0,    33 }, {  8,  0,   238 }, { 10,  0,   616 }, { 11,  0,   467 },
+  { 11,  0,   881 }, { 13,  0,   217 }, { 13,  0,   253 }, { 14,  0,   268 },
+  {  9,  0,   857 }, {  8,  0,   467 }, {  8,  0,  1006 }, {  7, 11,   148 },
+  {  8, 11,   284 }, { 13, 11,    63 }, {  4, 10,   576 }, {  7, 10,  1263 },
+  {  5, 11,   888 }, {  5, 10,   919 }, {  6, 10,  1673 }, { 20, 10,    37 },
+  { 20, 11,    37 }, {  4,  0,   447 }, {  4, 11,   711 }, {  4,  0,   128 },
+  {  5,  0,   415 }, {  6,  0,   462 }, {  7,  0,   294 }, {  7,  0,   578 },
+  { 10,  0,   710 }, { 11,  0,    86 }, {  4, 10,    82 }, {  5, 10,   333 },
+  {  5, 10,   904 }, {  6, 10,   207 }, {  7, 10,   325 }, {  7, 10,  1726 },
+  {  8, 10,   101 }, { 10, 10,   778 }, { 11, 10,   220 }, {  8,  0,   587 },
+  {  9, 11,   440 }, {  5, 10,   903 }, {  6,  0,   427 }, {  7,  0,  1018 },
+  { 10,  0,   692 }, {  4,  0,   195 }, {  7,  0,   802 }, { 12, 10,   147 },
+  {  6,  0,  1546 }, {  6,  0,   684 }, {  4, 10,   705 }, {  8,  0,   345 },
+  { 11, 11,   678 }, { 12, 11,   307 }, {  5,  0,   365 }, {  6,  0,  1683 },
+  {  4, 11,    65 }, {  5, 11,   479 }, {  5, 11,  1004 }, {  7, 11,  1913 },
+  {  8, 11,   317 }, {  9, 11,   302 }, { 10, 11,   612 }, { 13, 11,    22 },
+  { 10,  0,   472 }, {  4, 11,   261 }, {  7, 11,   510 }, {  6, 10,    90 },
+  { 14,  0,   433 }, { 23,  0,    28 }, {  4, 11,   291 }, {  7, 11,   101 },
+  {  9, 11,   515 }, { 12, 11,   152 }, { 12, 11,   443 }, { 13, 11,   392 },
+  { 14, 11,   357 }, { 12,  0,   997 }, {  5,  0,     3 }, {  8,  0,   578 },
+  {  9,  0,   118 }, { 10,  0,   705 }, { 13,  0,   279 }, {  7, 11,  1266 },
+  {  7, 10,   813 }, { 12, 10,   497 }, { 13, 10,    56 }, {  5,  0,   229 },
+  {  6, 10,   125 }, {  7, 10,  1277 }, {  8,  0,   102 }, { 10,  0,   578 },
+  { 10,  0,   672 }, { 12,  0,   496 }, { 13,  0,   408 }, { 14,  0,   121 },
+  { 17,  0,   106 }, { 23, 10,    12 }, {  6,  0,   866 }, {  6,  0,  1080 },
+  {  8,  0,  1022 }, {  4, 11,   130 }, {  7, 11,   843 }, {  5, 11,    42 },
+  {  5, 11,   879 }, {  7, 11,   245 }, {  7, 11,   324 }, {  7, 11,  1532 },
+  { 11, 11,   463 }, { 11, 11,   472 }, { 13, 11,   363 }, { 16, 11,    52 },
+  { 22,  0,    55 }, {  8,  0,   115 }, {  8,  0,   350 }, {  9,  0,   489 },
+  { 10,  0,   128 }, { 11,  0,   306 }, { 12,  0,   373 }, { 14,  0,    30 },
+  { 17,  0,    79 }, { 19,  0,    80 }, {  4, 11,   134 }, {  5, 11,   372 },
+  {  6,  0,   657 }, {  6,  0,   933 }, {  7, 11,  1147 }, {  4,  0,   230 },
+  {  5,  0,   702 }, {  6,  0,  1728 }, {  4,  0,   484 }, { 18,  0,    26 },
+  { 19,  0,    42 }, { 20,  0,    43 }, { 21,  0,     0 }, { 23,  0,    27 },
+  { 24,  0,    14 }, {  7,  0,   185 }, {  7,  0,   703 }, {  6,  0,   417 },
+  { 10,  0,   618 }, {  7, 10,  1106 }, {  9, 10,   770 }, { 11, 10,   112 },
+  { 12, 10,   413 }, {  6,  0,   803 }, {  4, 11,   644 }, {  6,  0,  1262 },
+  {  7, 11,   540 }, { 12, 10,   271 }, { 17, 10,   109 }, {  7, 11,   123 },
+  {  4,  0,   633 }, {  6, 11,   623 }, {  4, 11,   908 }, {  5, 11,   359 },
+  {  5, 11,   508 }, {  6, 11,  1723 }, {  7, 11,   343 }, {  7, 11,  1996 },
+  {  7, 11,  2026 }, {  7,  0,   479 }, { 10,  0,   262 }, {  7, 10,   304 },
+  {  9, 10,   646 }, {  9, 10,   862 }, { 11, 10,   696 }, { 12, 10,   208 },
+  { 15, 10,    79 }, { 19, 10,   108 }, {  4, 11,   341 }, {  7, 11,   480 },
+  {  6,  0,   830 }, {  5,  0,    70 }, {  5,  0,   622 }, {  6,  0,   334 },
+  {  7,  0,  1032 }, {  9,  0,   171 }, { 11,  0,    26 }, { 11,  0,   213 },
+  { 11,  0,   637 }, { 11,  0,   707 }, { 12,  0,   202 }, { 12,  0,   380 },
+  { 13,  0,   226 }, { 13,  0,   355 }, { 14,  0,   222 }, { 17,  0,    42 },
+  {  7, 10,   981 }, { 15,  0,   217 }, {  9, 11,   114 }, {  4,  0,    23 },
+  {  4,  0,   141 }, {  5,  0,   313 }, {  5,  0,  1014 }, {  6,  0,    50 },
+  {  6,  0,    51 }, {  7,  0,   142 }, {  7,  0,   384 }, {  7,  0,   559 },
+  {  8,  0,   640 }, {  9,  0,   460 }, {  9,  0,   783 }, { 11,  0,   741 },
+  { 12,  0,   183 }, { 13,  0,   488 }, { 13,  0,   360 }, {  7,  0,  1586 },
+  {  7, 11,  1995 }, {  8, 11,   299 }, { 11, 11,   890 }, { 12, 11,   674 },
+  {  4, 10,   434 }, {  7,  0,   652 }, {  6, 10,   550 }, {  7,  0,   766 },
+  {  5, 10,   553 }, { 10, 10,   824 }, {  7,  0,   737 }, {  8,  0,   298 },
+  {  8, 10,   452 }, {  4, 11,   238 }, {  5, 11,   503 }, {  6, 11,   179 },
+  {  7, 11,  2003 }, {  8, 11,   381 }, {  8, 11,   473 }, {  9, 11,   149 },
+  { 10, 11,   183 }, { 15, 11,    45 }, { 15, 11,    86 }, {  5, 10,   292 },
+  {  5,  0,   222 }, {  9,  0,   655 }, { 10,  0,   534 }, { 10, 10,   135 },
+  {  4, 11,   121 }, {  5, 11,   156 }, {  5, 11,   349 }, {  9, 11,   136 },
+  { 10, 11,   605 }, { 14, 11,   342 }, { 19, 11,   107 }, {  9,  0,   906 },
+  {  6,  0,  1013 }, {  6,  0,  1250 }, {  6,  0,  1956 }, {  6,  0,  2009 },
+  {  8,  0,   991 }, { 16,  0,   120 }, {  7, 11,  1192 }, { 10,  0,   503 },
+  {  5,  0,   154 }, {  7,  0,  1491 }, { 10,  0,   379 }, { 10,  0,   485 },
+  {  6,  0,  1867 }, {  6,  0,  1914 }, {  6,  0,  1925 }, {  9,  0,   917 },
+  {  9,  0,   925 }, {  9,  0,   932 }, {  9,  0,   951 }, {  9,  0,  1007 },
+  {  9,  0,  1013 }, { 12,  0,   806 }, { 12,  0,   810 }, { 12,  0,   814 },
+  { 12,  0,   816 }, { 12,  0,   824 }, { 12,  0,   832 }, { 12,  0,   837 },
+  { 12,  0,   863 }, { 12,  0,   868 }, { 12,  0,   870 }, { 12,  0,   889 },
+  { 12,  0,   892 }, { 12,  0,   900 }, { 12,  0,   902 }, { 12,  0,   908 },
+  { 12,  0,   933 }, { 12,  0,   942 }, { 12,  0,   949 }, { 12,  0,   954 },
+  { 15,  0,   175 }, { 15,  0,   203 }, { 15,  0,   213 }, { 15,  0,   218 },
+  { 15,  0,   225 }, { 15,  0,   231 }, { 15,  0,   239 }, { 15,  0,   248 },
+  { 15,  0,   252 }, { 18,  0,   190 }, { 18,  0,   204 }, { 18,  0,   215 },
+  { 18,  0,   216 }, { 18,  0,   222 }, { 18,  0,   225 }, { 18,  0,   230 },
+  { 18,  0,   239 }, { 18,  0,   241 }, { 21,  0,    42 }, { 21,  0,    43 },
+  { 21,  0,    44 }, { 21,  0,    45 }, { 21,  0,    46 }, { 21,  0,    53 },
+  { 24,  0,    27 }, { 24,  0,    31 }, {  5,  0,   716 }, {  7,  0,   844 },
+  {  4,  0,    91 }, {  5,  0,   388 }, {  5,  0,   845 }, {  6,  0,   206 },
+  {  6,  0,   252 }, {  6,  0,   365 }, {  7,  0,   136 }, {  7,  0,   531 },
+  {  8,  0,   621 }, {  7, 10,   393 }, { 10, 10,   603 }, { 11, 10,   206 },
+  {  6, 11,    80 }, {  6, 11,  1694 }, {  7, 11,   173 }, {  7, 11,  1974 },
+  {  9, 11,   547 }, { 10, 11,   730 }, { 14, 11,    18 }, { 22, 11,    39 },
+  {  9,  0,   748 }, {  4, 11,   923 }, {  6, 11,  1711 }, {  4, 10,   912 },
+  {  9, 10,   232 }, {  7, 10,    98 }, {  7, 10,  1973 }, {  8, 10,   716 },
+  { 14,  0,   103 }, {  5, 10,   733 }, {  4, 11,   595 }, { 12,  0,   158 },
+  { 18,  0,     8 }, { 19,  0,    62 }, { 20,  0,     6 }, { 22,  0,     4 },
+  { 23,  0,     2 }, { 23,  0,     9 }, {  5, 11,   240 }, {  6, 11,   459 },
+  {  7, 11,    12 }, {  7, 11,   114 }, {  7, 11,   502 }, {  7, 11,  1751 },
+  {  7, 11,  1753 }, {  7, 11,  1805 }, {  8, 11,   658 }, {  9, 11,     1 },
+  { 11, 11,   959 }, { 13, 11,   446 }, { 14, 11,   211 }, {  7,  0,   576 },
+  {  5,  0,   771 }, {  5,  0,   863 }, {  5,  0,   898 }, {  6,  0,   648 },
+  {  6,  0,  1632 }, {  6,  0,  1644 }, {  6,  0,  1780 }, {  5,  0,   331 },
+  {  7, 11,   633 }, {  7, 11,   905 }, {  7, 11,   909 }, {  7, 11,  1538 },
+  {  9, 11,   767 }, { 12, 11,   636 }, { 12,  0,   632 }, {  5,  0,   107 },
+  {  7,  0,   201 }, {  8,  0,   518 }, {  6,  0,   446 }, {  7,  0,  1817 },
+  {  6, 11,   490 }, {  9,  0,   851 }, { 13,  0,   510 }, {  7, 11,   250 },
+  {  8, 11,   506 }, {  8, 11,   507 }, {  4,  0,   504 }, {  9, 10,    72 },
+  {  4, 11,   158 }, {  4, 11,   140 }, {  7, 11,   362 }, {  8, 11,   209 },
+  {  9, 11,    10 }, {  9, 11,   160 }, {  9, 11,   503 }, { 10, 11,   689 },
+  { 11, 11,   350 }, { 11, 11,   553 }, { 11, 11,   725 }, { 12, 11,   252 },
+  { 12, 11,   583 }, { 13, 11,   192 }, { 13, 11,   352 }, { 14, 11,   269 },
+  { 14, 11,   356 }, { 20, 11,    50 }, {  6, 11,   597 }, {  7, 11,  1318 },
+  {  7, 10,  1454 }, {  5,  0,   883 }, {  5,  0,   975 }, {  8,  0,   392 },
+  { 20,  0,     7 }, {  6, 11,   228 }, {  7, 11,  1341 }, {  9, 11,   408 },
+  { 10, 11,   343 }, { 11, 11,   348 }, { 11, 10,   600 }, { 12, 11,    99 },
+  { 13, 10,   245 }, { 18, 11,     1 }, { 18, 11,    11 }, { 19, 11,     4 },
+  {  6, 11,   296 }, {  5,  0,   922 }, {  6,  0,  1707 }, {  4, 11,   557 },
+  {  4, 11,   548 }, {  7, 10,   164 }, {  7, 10,  1571 }, {  9, 10,   107 },
+  { 12, 10,   225 }, {  7, 11,   197 }, {  8, 11,   142 }, {  8, 11,   325 },
+  {  9, 11,   150 }, {  9, 11,   596 }, { 10, 11,   350 }, { 10, 11,   353 },
+  { 11, 11,    74 }, { 11, 11,   315 }, { 14, 11,   423 }, { 15, 11,   141 },
+  {  5,  0,   993 }, {  7,  0,   515 }, {  9,  0,    91 }, {  4,  0,   131 },
+  {  8,  0,   200 }, {  5, 10,   484 }, {  5, 10,   510 }, {  6, 10,   434 },
+  {  7, 10,  1000 }, {  7, 10,  1098 }, {  8, 10,     2 }, { 24,  0,    10 },
+  {  4, 11,    62 }, {  5, 11,    83 }, {  6, 11,   399 }, {  6, 11,   579 },
+  {  7, 11,   692 }, {  7, 11,   846 }, {  7, 11,  1015 }, {  7, 11,  1799 },
+  {  8, 11,   403 }, {  9, 11,   394 }, { 10, 11,   133 }, { 12, 11,     4 },
+  { 12, 11,   297 }, { 12, 11,   452 }, { 16, 11,    81 }, { 18, 11,    19 },
+  { 18, 11,    25 }, { 21, 11,    14 }, { 22, 11,    12 }, { 23, 11,    18 },
+  { 12, 11,   459 }, {  4, 11,   177 }, {  7,  0,  1433 }, {  9,  0,   365 },
+  {  9, 11,   365 }, {  4, 10,   460 }, {  5,  0,   103 }, {  6,  0,  2004 },
+  {  7,  0,   921 }, {  8,  0,   580 }, {  8,  0,   593 }, {  8,  0,   630 },
+  { 10,  0,    28 }, {  5, 11,   411 }, {  7, 11,   653 }, {  4, 10,   932 },
+  {  5, 10,   891 }, {  4,  0,   911 }, {  5,  0,   867 }, {  5,  0,  1013 },
+  {  7,  0,  2034 }, {  8,  0,   798 }, {  8,  0,   813 }, {  7, 11,   439 },
+  { 10, 11,   727 }, { 11, 11,   260 }, { 11, 11,   684 }, {  8, 10,   625 },
+  {  5, 11,   208 }, {  7, 11,   753 }, {  7, 11,  1528 }, {  5,  0,   461 },
+  {  7,  0,  1925 }, { 12,  0,    39 }, { 13,  0,   265 }, { 13,  0,   439 },
+  {  6, 10,    76 }, {  6,  0,   853 }, {  8, 10,    92 }, {  9, 10,   221 },
+  {  5,  0,   135 }, {  6,  0,   519 }, {  7,  0,  1722 }, { 10,  0,   271 },
+  { 11,  0,   261 }, { 17,  0,    54 }, { 11, 11,   814 }, { 14,  0,   338 },
+  { 20,  0,    81 }, {  4,  0,   300 }, {  5,  0,   436 }, {  5,  0,   419 },
+  {  5,  0,   687 }, {  7,  0,   864 }, {  9,  0,   470 }, {  7, 11,   864 },
+  {  9,  0,   836 }, {  5, 11,   242 }, {  6,  0,  1937 }, {  4, 10,   763 },
+  {  5, 11,   953 }, {  4, 10,   622 }, {  4,  0,   393 }, {  5, 10,   253 },
+  {  8,  0,   357 }, { 10,  0,   745 }, { 14,  0,   426 }, { 17,  0,    94 },
+  { 19,  0,    57 }, {  7, 10,   546 }, {  5, 11,   615 }, { 18, 11,    37 },
+  {  9, 10,    73 }, { 10, 10,   110 }, { 14, 10,   185 }, { 17, 10,   119 },
+  { 11,  0,   703 }, {  7, 10,   624 }, {  7, 10,   916 }, { 10, 10,   256 },
+  { 11, 10,    87 }, {  5, 11,   290 }, {  5, 10,   212 }, { 12, 10,    35 },
+  { 13, 10,   382 }, {  4, 11,   380 }, {  5, 11,    52 }, {  7, 11,   277 },
+  {  9, 11,   368 }, { 11, 11,   791 }, {  5,  0,   387 }, { 10, 11,   138 },
+  { 11, 11,   476 }, {  4,  0,     6 }, {  5,  0,   708 }, {  8,  0,    75 },
+  {  7,  0,  1351 }, {  9,  0,   581 }, { 10,  0,   639 }, { 11,  0,   453 },
+  { 12,  0,   584 }, {  4,  0,   303 }, { 10,  0,   772 }, {  7, 10,  1175 },
+  {  4,  0,   749 }, {  5, 10,   816 }, {  6, 11,   256 }, {  7, 11,   307 },
+  {  7, 11,   999 }, {  7, 11,  1481 }, {  7, 11,  1732 }, {  7, 11,  1738 },
+  {  8, 11,   265 }, {  9, 11,   414 }, { 11, 11,   316 }, { 12, 11,    52 },
+  { 13, 11,   420 }, { 19, 11,   100 }, {  7, 11,  1296 }, {  6,  0,  1065 },
+  {  5, 10,   869 }, {  5, 10,   968 }, {  6, 10,  1626 }, {  8, 10,   734 },
+  {  8, 10,   784 }, {  4, 10,   542 }, {  6, 10,  1716 }, {  6, 10,  1727 },
+  {  7, 10,  1082 }, {  7, 10,  1545 }, {  8, 10,    56 }, {  8, 10,   118 },
+  {  8, 10,   412 }, {  8, 10,   564 }, {  9, 10,   888 }, {  9, 10,   908 },
+  { 10, 10,    50 }, { 10, 10,   423 }, { 11, 10,   685 }, { 11, 10,   697 },
+  { 11, 10,   933 }, { 12, 10,   299 }, { 13, 10,   126 }, { 13, 10,   136 },
+  { 13, 10,   170 }, { 13, 10,   190 }, {  6,  0,   226 }, {  4,  0,   106 },
+  {  7,  0,   310 }, { 11,  0,   717 }, {  5, 11,   723 }, {  5,  0,   890 },
+  {  5,  0,   988 }, {  4, 10,   232 }, {  9, 10,   202 }, { 10, 10,   474 },
+  { 12, 10,   433 }, {  6,  0,   626 }, { 14,  0,   431 }, { 10,  0,   706 },
+  { 22,  0,    44 }, { 13,  0,    51 }, {  6, 10,   108 }, {  7, 10,  1003 },
+  {  7, 10,  1181 }, {  8, 10,   111 }, {  8, 10,   343 }, {  4,  0,   698 },
+  {  5, 11,   109 }, {  6, 11,  1784 }, {  7, 11,  1895 }, { 12, 11,   296 },
+  { 12, 11,   302 }, {  6,  0,   828 }, {  6, 10,  1712 }, { 10,  0,    17 },
+  {  7,  0,  1929 }, {  4, 10,   133 }, {  5, 11,   216 }, {  7, 10,   711 },
+  {  7, 10,  1298 }, {  7, 10,  1585 }, {  7, 11,  1879 }, {  9, 11,   141 },
+  {  9, 11,   270 }, {  9, 11,   679 }, { 10, 11,   159 }, { 10, 11,   553 },
+  { 11, 11,   197 }, { 11, 11,   438 }, { 12, 11,   538 }, { 12, 11,   559 },
+  { 13, 11,   193 }, { 13, 11,   423 }, { 14, 11,   144 }, { 14, 11,   166 },
+  { 14, 11,   167 }, { 15, 11,    67 }, { 19, 11,    84 }, { 13, 11,   127 },
+  {  7, 11,  1872 }, {  9, 11,    81 }, {  6, 10,    99 }, {  7, 10,  1808 },
+  { 17, 10,    57 }, {  6, 11,   391 }, {  5,  0,   689 }, {  6,  0,    84 },
+  {  7,  0,  1250 }, {  6, 10,   574 }, {  7, 10,   428 }, { 10, 10,   669 },
+  { 11, 10,   485 }, { 11, 10,   840 }, { 12, 10,   300 }, { 14, 10,   250 },
+  {  7, 11,   322 }, {  8, 11,   249 }, {  7, 11,   432 }, {  7, 11,  1649 },
+  {  7, 10,  1871 }, {  9, 10,   252 }, {  6, 11,   155 }, { 12, 11,   234 },
+  {  7,  0,   871 }, { 19,  0,    27 }, { 19, 11,    27 }, { 12,  0,   498 },
+  {  5,  0,   986 }, {  6,  0,   130 }, { 10,  0,   823 }, {  6,  0,  1793 },
+  {  7,  0,  1582 }, {  8,  0,   458 }, { 10,  0,   101 }, { 10,  0,   318 },
+  { 10,  0,   945 }, { 12,  0,   734 }, { 16,  0,   104 }, { 18,  0,   177 },
+  {  6, 10,   323 }, {  7, 10,  1564 }, {  5, 11,   632 }, { 10, 11,   526 },
+  { 10,  0,   435 }, {  7, 10,   461 }, {  8, 10,   775 }, {  6, 11,   144 },
+  {  7, 11,   948 }, {  7, 11,  1042 }, {  7, 11,  1857 }, {  8, 11,   235 },
+  {  8, 11,   461 }, {  9, 11,   453 }, {  9, 11,   530 }, { 10, 11,   354 },
+  { 17, 11,    77 }, { 19, 11,    99 }, { 20, 11,    79 }, { 10,  0,   966 },
+  {  7,  0,  1644 }, {  9,  0,   129 }, {  7,  0,   997 }, {  8,  0,   502 },
+  {  5, 11,   196 }, {  6, 11,   486 }, {  7, 11,   212 }, {  8, 11,   309 },
+  {  8, 11,   346 }, {  7, 10,   727 }, { 18, 10,    73 }, {  4,  0,   823 },
+  {  4, 11,   686 }, {  7,  0,  1927 }, {  4,  0,   762 }, {  7,  0,  1756 },
+  {  9,  0,    98 }, {  8, 10,   577 }, { 24,  0,     8 }, {  4, 11,    30 },
+  {  5, 11,    43 }, { 24, 11,     8 }, {  7,  0,  1046 }, { 11,  0,   160 },
+  {  7,  0,   492 }, {  4, 10,   413 }, {  5, 10,   677 }, {  7, 11,   492 },
+  {  8, 10,   432 }, { 12, 10,   280 }, {  6,  0,    45 }, {  7,  0,   433 },
+  {  8,  0,   129 }, {  9,  0,    21 }, { 10,  0,   392 }, { 11,  0,    79 },
+  { 12,  0,   499 }, { 13,  0,   199 }, { 13,  0,   451 }, {  7,  0,   558 },
+  {  8,  0,   353 }, {  4, 11,   220 }, {  7, 11,  1535 }, {  9, 11,    93 },
+  { 11, 11,   474 }, {  7, 10,   646 }, {  7, 10,  1730 }, { 11, 10,   446 },
+  { 13, 10,   178 }, {  5,  0,   785 }, {  6,  0,  1145 }, {  8,  0,    81 },
+  {  9,  0,   189 }, {  9,  0,   201 }, { 11,  0,   478 }, { 11,  0,   712 },
+  { 13,  0,   338 }, {  5,  0,   353 }, { 23,  0,    26 }, { 11,  0,   762 },
+  {  4, 10,   395 }, {  6,  0,  2024 }, {  4,  0,   611 }, {  5,  0,   606 },
+  {  9, 10,   174 }, { 10, 10,   164 }, { 11, 10,   440 }, { 11, 10,   841 },
+  { 15, 10,    98 }, {  6, 10,   426 }, { 10, 10,   608 }, { 11, 10,  1002 },
+  { 10, 10,   250 }, {  6,  0,    25 }, {  7,  0,   855 }, {  7,  0,  1258 },
+  { 16,  0,    32 }, {  7, 11,  1725 }, { 10, 11,   393 }, {  5, 11,   263 },
+  {  6, 11,   414 }, {  6,  0,  2011 }, {  5, 10,   476 }, {  4,  0,     4 },
+  {  7,  0,  1118 }, {  7,  0,  1320 }, {  7,  0,  1706 }, {  8,  0,   277 },
+  {  9,  0,   622 }, { 10,  0,     9 }, { 11,  0,   724 }, { 12,  0,   350 },
+  { 12,  0,   397 }, { 13,  0,    28 }, { 13,  0,   159 }, { 15,  0,    89 },
+  { 18,  0,     5 }, { 19,  0,     9 }, { 20,  0,    34 }, { 22,  0,    47 },
+  {  6, 11,   178 }, {  6, 11,  1750 }, {  8, 11,   251 }, {  9, 11,   690 },
+  { 10, 11,   155 }, { 10, 11,   196 }, { 10, 11,   373 }, { 11, 11,   698 },
+  { 13, 11,   155 }, { 20, 11,    93 }, {  5, 11,    97 }, {  9, 11,   393 },
+  {  7,  0,   764 }, { 11,  0,   461 }, { 12,  0,   172 }, {  5, 10,    76 },
+  {  6, 10,   458 }, {  6, 10,   497 }, {  7, 10,   868 }, {  9, 10,   658 },
+  { 10, 10,   594 }, { 11, 10,   566 }, { 12, 10,   338 }, { 13, 10,   200 },
+  {  6,  0,  1449 }, { 10, 11,    40 }, {  6, 11,  1639 }, {  6,  0,  1445 },
+  {  6,  0,  1168 }, {  4, 10,   526 }, {  7, 10,  1029 }, {  7, 10,  1054 },
+  {  4, 11,   191 }, {  7, 11,   934 }, {  8, 11,   647 }, { 17, 11,    97 },
+  {  4, 10,   636 }, {  6,  0,   233 }, {  7, 10,   660 }, {  7, 10,  1124 },
+  { 17, 10,    31 }, { 19, 10,    22 }, { 23, 10,    14 }, {  6, 10,  1699 },
+  {  8, 11,   110 }, { 12, 11,   246 }, { 15, 11,   162 }, { 19, 11,    64 },
+  { 20, 11,     8 }, { 20, 11,    95 }, { 22, 11,    24 }, { 24, 11,    17 },
+  {  5, 11,   165 }, {  9, 11,   346 }, { 10, 11,   655 }, {  5, 11,   319 },
+  {  7, 11,   534 }, {  6,  0,   255 }, {  9,  0,   216 }, {  8, 11,   128 },
+  { 11, 11,   179 }, {  9,  0,   183 }, { 11,  0,   286 }, { 11,  0,   956 },
+  { 23,  0,     3 }, {  4,  0,   536 }, {  7,  0,  1141 }, { 10,  0,   723 },
+  { 11,  0,   371 }, {  4, 10,   279 }, {  7, 10,   301 }, {  9, 10,   362 },
+  {  7,  0,   285 }, {  5, 11,    57 }, {  6, 11,   101 }, {  6, 11,  1663 },
+  {  7, 11,   132 }, {  7, 11,  1048 }, {  7, 11,  1154 }, {  7, 11,  1415 },
+  {  7, 11,  1507 }, { 12, 11,   493 }, { 15, 11,   105 }, { 23, 11,    15 },
+  {  5, 11,   459 }, {  7, 11,  1073 }, {  7, 10,  1743 }, {  8, 11,   241 },
+  {  8, 11,   334 }, {  4, 10,   178 }, {  5, 10,   399 }, {  7,  0,   560 },
+  {  4,  0,   690 }, {  7,  0,  1246 }, { 18,  0,   157 }, { 19,  0,    63 },
+  { 10,  0,   599 }, { 11,  0,    33 }, { 12,  0,   571 }, { 21,  0,     1 },
+  {  6, 11,   324 }, {  6, 11,   520 }, {  7, 11,   338 }, {  7, 11,  1616 },
+  {  7, 11,  1729 }, {  8, 11,   228 }, {  9, 11,    69 }, { 11, 11,   750 },
+  {  7,  0,  1862 }, { 12,  0,   491 }, { 12,  0,   520 }, { 13,  0,   383 },
+  { 14,  0,   244 }, {  7, 11,   734 }, {  6, 10,  1692 }, { 10,  0,   448 },
+  { 11,  0,   630 }, { 17,  0,   117 }, {  6, 10,   202 }, {  7, 11,   705 },
+  { 12, 10,   360 }, { 17, 10,   118 }, { 18, 10,    27 }, { 20, 10,    67 },
+  {  4, 11,    73 }, {  6, 11,   612 }, {  7, 11,   927 }, {  7, 11,  1822 },
+  {  8, 11,   217 }, {  9, 11,   472 }, {  9, 11,   765 }, {  9, 11,   766 },
+  { 10, 11,   408 }, { 11, 11,    51 }, { 11, 11,   793 }, { 12, 11,   266 },
+  { 15, 11,   158 }, { 20, 11,    89 }, { 22, 11,    32 }, {  4,  0,   190 },
+  {  5,  0,   554 }, {  5,  0,  1001 }, {  5, 11,   389 }, {  8, 11,   636 },
+  {  9, 11,   229 }, {  5,  0,   446 }, {  7, 10,   872 }, { 10, 10,   516 },
+  { 11, 10,   167 }, {  9, 10,   313 }, {  4, 10,   224 }, {  6,  0,  1313 },
+  {  5, 10,   546 }, {  7, 10,    35 }, {  8, 10,    11 }, {  8, 10,    12 },
+  {  9, 10,   315 }, {  9, 10,   533 }, { 10, 10,   802 }, { 11, 10,   166 },
+  { 12, 10,   525 }, { 14, 10,   243 }, {  6,  0,   636 }, {  9,  0,   837 },
+  {  5, 10,   241 }, {  8, 10,   242 }, {  9, 10,   451 }, { 10, 10,   667 },
+  { 11, 10,   598 }, { 12, 10,   429 }, { 22, 10,    46 }, { 22, 11,    46 },
+  {  8, 11,   472 }, { 11,  0,   278 }, { 14,  0,    73 }, { 13, 11,   185 },
+  {  4,  0,   868 }, {  6,  0,   972 }, {  4, 10,   366 }, {  9, 10,   516 },
+  { 10,  0,  1010 }, {  5, 11,   189 }, {  6, 10,  1736 }, {  7, 11,   442 },
+  {  7, 11,   443 }, {  8, 11,   281 }, { 12, 11,   174 }, { 13, 11,    83 },
+  { 13, 11,   261 }, { 11, 11,   384 }, {  6, 11,     2 }, {  7, 11,   191 },
+  {  7, 11,   446 }, {  7, 11,   758 }, {  7, 11,  1262 }, {  7, 11,  1737 },
+  {  8, 11,    22 }, {  8, 11,   270 }, {  8, 11,   612 }, {  9, 11,     4 },
+  {  9, 11,   167 }, {  9, 11,   312 }, {  9, 11,   436 }, { 10, 11,   156 },
+  { 10, 11,   216 }, { 10, 11,   311 }, { 10, 11,   623 }, { 11, 11,    72 },
+  { 11, 11,   330 }, { 11, 11,   455 }, { 12, 11,   101 }, { 12, 11,   321 },
+  { 12, 11,   504 }, { 12, 11,   530 }, { 12, 11,   543 }, { 13, 11,    17 },
+  { 13, 11,   156 }, { 13, 11,   334 }, { 14, 11,    48 }, { 15, 11,    70 },
+  { 17, 11,    60 }, { 20, 11,    64 }, {  6, 10,   331 }, {  8, 10,   623 },
+  {  7,  0,  1231 }, {  4,  0,   304 }, {  6, 11,    60 }, {  7, 11,   670 },
+  {  7, 11,  1327 }, {  8, 11,   411 }, {  8, 11,   435 }, {  9, 11,   653 },
+  {  9, 11,   740 }, { 10, 11,   385 }, { 11, 11,   222 }, { 11, 11,   324 },
+  { 11, 11,   829 }, { 12, 11,   611 }, {  7,  0,   506 }, {  6, 11,   166 },
+  {  7, 11,   374 }, {  7, 11,  1174 }, { 14, 11,    43 }, { 18, 11,    21 },
+  {  7, 11,  1694 }, {  7, 10,  1888 }, {  5, 11,   206 }, {  6, 11,   398 },
+  {  7, 11,    50 }, { 22,  0,    26 }, {  6,  0,    53 }, {  6,  0,   199 },
+  {  7,  0,  1408 }, {  8,  0,    32 }, {  8,  0,    93 }, { 10,  0,   397 },
+  { 10,  0,   629 }, { 11,  0,   593 }, { 11,  0,   763 }, { 13,  0,   326 },
+  { 17,  0,    35 }, {  6,  0,   105 }, {  4, 10,   394 }, {  4,  0,   843 },
+  { 10,  0,   794 }, { 11,  0,   704 }, { 13,  0,   396 }, {  5,  0,   114 },
+  {  5,  0,   255 }, { 13,  0,   285 }, {  6,  0,   619 }, {  7,  0,   898 },
+  {  7,  0,  1092 }, {  8,  0,   485 }, { 18,  0,    28 }, { 19,  0,   116 },
+  {  7, 10,  1931 }, {  9,  0,   145 }, {  7, 10,   574 }, {  7, 10,  1719 },
+  {  7,  0,  2035 }, {  8,  0,    19 }, {  9,  0,    89 }, { 10,  0,   831 },
+  {  4, 10,   658 }, {  6, 11,   517 }, {  7, 11,  1159 }, { 10, 11,   621 },
+  { 11, 11,   192 }, {  7,  0,  1933 }, {  7, 11,  1933 }, {  9, 10,   781 },
+  { 10, 10,   144 }, { 11, 10,   385 }, { 13, 10,   161 }, { 13, 10,   228 },
+  { 13, 10,   268 }, { 20, 10,   107 }, {  8, 10,   374 }, { 10, 11,   223 },
+  { 11, 11,   645 }, {  7,  0,  1728 }, {  7, 11,    64 }, {  7, 11,   289 },
+  {  8, 11,   245 }, {  4, 10,   344 }, {  6, 10,   498 }, { 11, 10,   323 },
+  {  8,  0,   746 }, {  7, 10,  1063 }, {  9, 10,   155 }, {  4,  0,   987 },
+  {  6,  0,  1964 }, {  6,  0,  1974 }, {  6,  0,  1990 }, {  8,  0,   995 },
+  {  5, 11,   609 }, {  5, 10,   906 }, {  6,  0,  1550 }, {  6,  0,   874 },
+  {  5, 11,   129 }, {  6, 11,    61 }, {  7, 11,   947 }, {  4,  0,  1018 },
+  {  6,  0,  1938 }, {  6,  0,  2021 }, {  6,  0,  2039 }, {  4,  0,   814 },
+  { 11,  0,   126 }, { 11,  0,   287 }, {  6,  0,  1264 }, {  5,  0,   955 },
+  {  8,  0,   814 }, { 13, 11,   506 }, {  4, 11,   314 }, {  6,  0,   981 },
+  { 11, 11,  1000 }, {  5,  0,    56 }, {  8,  0,   892 }, {  8,  0,   915 },
+  { 12,  0,   776 }, { 20,  0,   100 }, { 10,  0,     4 }, { 10,  0,    13 },
+  { 11,  0,   638 }, { 20,  0,    57 }, { 20, 11,    74 }, {  5,  0,   738 },
+  {  4, 10,   616 }, {  5, 11,   637 }, {  8, 10,   692 }, {  5,  0,   758 },
+  {  4, 10,   305 }, {  9, 11,   590 }, {  5, 11,   280 }, {  7, 11,  1226 },
+  {  6, 11,   494 }, {  7,  0,  1112 }, {  5, 11,   281 }, { 13,  0,    44 },
+  { 14,  0,   214 }, {  5, 10,   214 }, {  7, 10,   603 }, {  8, 10,   611 },
+  {  9, 10,   686 }, { 10, 10,    88 }, { 11, 10,   459 }, { 11, 10,   496 },
+  { 12, 10,   463 }, { 12, 10,   590 }, { 11,  0,   328 }, {  7, 11,  1064 },
+  {  9,  0,   133 }, {  7,  0,   168 }, { 13,  0,   196 }, { 13,  0,   237 },
+  {  6, 10,  1703 }, {  6,  0,  1152 }, {  7,  0,  1245 }, {  5,  0,   110 },
+  {  6,  0,   169 }, {  6,  0,  1702 }, {  7,  0,   400 }, {  8,  0,   538 },
+  {  9,  0,   184 }, {  9,  0,   524 }, { 12,  0,   218 }, {  6,  0,  1816 },
+  { 10,  0,   871 }, { 12,  0,   769 }, { 12,  0,   785 }, {  4, 11,   630 },
+  {  7, 11,    33 }, {  7, 11,   120 }, {  8, 11,   489 }, {  9, 11,   319 },
+  { 10, 11,   820 }, { 11, 11,  1004 }, { 12, 11,   379 }, { 13, 11,   117 },
+  { 13, 11,   412 }, { 14, 11,    25 }, { 15, 11,    52 }, { 15, 11,   161 },
+  { 16, 11,    47 }, { 21, 11,     2 }, {  6,  0,   133 }, {  8,  0,   413 },
+  {  9,  0,   353 }, { 11,  0,   993 }, { 17, 10,    19 }, {  4, 11,   937 },
+  {  5, 11,   801 }, {  6,  0,   978 }, {  6,  0,    93 }, {  6,  0,  1508 },
+  {  7,  0,  1422 }, {  7,  0,  1851 }, {  8,  0,   673 }, {  9,  0,   529 },
+  { 12,  0,    43 }, {  6,  0,   317 }, { 10,  0,   512 }, {  4, 10,   737 },
+  { 11, 10,   294 }, { 12, 10,    60 }, { 12, 10,   437 }, { 13, 10,    64 },
+  { 13, 10,   380 }, { 14, 10,   430 }, {  9,  0,   371 }, {  7, 11,  1591 },
+  { 16, 11,    43 }, {  6, 10,  1758 }, {  8, 10,   520 }, {  9, 10,   345 },
+  {  9, 10,   403 }, { 14, 10,   350 }, {  5,  0,   526 }, { 10, 10,   242 },
+  { 10, 10,   579 }, {  9,  0,    25 }, { 10,  0,   467 }, { 10,  0,   559 },
+  {  5, 10,   139 }, {  7, 10,  1168 }, { 10, 10,   539 }, {  4,  0,   335 },
+  {  7,  0,   942 }, { 12,  0,   754 }, {  4, 11,   365 }, { 11,  0,   182 },
+  { 14,  0,   195 }, { 14, 11,    29 }, {  5, 11,     7 }, { 11, 11,   774 },
+  {  4, 11,   746 }, {  7, 11,  1090 }, {  8,  0,    39 }, { 10,  0,   773 },
+  { 11,  0,    84 }, { 12,  0,   205 }, { 14,  0,     1 }, {  5,  0,   601 },
+  {  5,  0,   870 }, {  5, 11,   360 }, {  8, 11,   237 }, {  4,  0,   181 },
+  {  8,  0,   370 }, {  6,  0,  1652 }, {  8,  0,   358 }, {  4, 10,   107 },
+  {  7, 10,   613 }, {  8, 10,   439 }, {  8, 10,   504 }, {  9, 10,   501 },
+  { 10, 10,   383 }, { 11, 10,   477 }, {  4, 10,   229 }, {  9, 11,   785 },
+  {  4,  0,    97 }, {  5,  0,   147 }, {  6,  0,   286 }, {  7,  0,  1362 },
+  { 13,  0,   176 }, {  6,  0,   537 }, {  7,  0,   788 }, {  7,  0,  1816 },
+  {  4, 10,   903 }, { 12, 10,    71 }, {  6,  0,   743 }, {  6,  0,  1223 },
+  {  6,  0,   375 }, {  7,  0,   169 }, {  7,  0,   254 }, {  8,  0,   780 },
+  {  7, 11,  1493 }, {  7,  0,  1714 }, {  4, 10,    47 }, {  6, 10,   373 },
+  {  7, 10,   452 }, {  7, 10,   543 }, {  7, 10,  1856 }, {  9, 10,     6 },
+  { 11, 10,   257 }, { 11, 10,   391 }, {  6,  0,   896 }, {  8,  0,  1003 },
+  {  7,  0,  1447 }, {  9, 11,   341 }, {  5, 10,   980 }, {  6, 10,  1754 },
+  { 17, 11,    22 }, {  4, 11,   277 }, {  5, 11,   608 }, {  6, 11,   493 },
+  {  7, 11,   457 }, { 12, 11,   384 }, {  7, 10,   536 }, {  7, 10,  1331 },
+  {  8, 10,   143 }, { 12,  0,   744 }, {  7, 11,    27 }, {  7, 11,   316 },
+  { 18,  0,   126 }, {  5, 10,    19 }, {  6, 10,   533 }, {  4,  0,   788 },
+  { 11,  0,    41 }, {  5, 11,   552 }, {  5, 11,   586 }, {  5, 11,   676 },
+  {  6, 11,   448 }, {  8, 11,   244 }, { 11, 11,     1 }, { 11, 11,    41 },
+  { 13, 11,     3 }, { 16, 11,    54 }, { 17, 11,     4 }, { 18, 11,    13 },
+  {  4,  0,   985 }, {  6,  0,  1801 }, {  4, 11,   401 }, {  9, 11,   264 },
+  {  5, 10,   395 }, {  5, 10,   951 }, {  6, 10,  1776 }, {  5,  0,   629 },
+  {  7,  0,  1549 }, { 11, 10,   663 }, { 12, 10,   210 }, { 13, 10,   166 },
+  { 13, 10,   310 }, { 14, 10,   373 }, { 19, 10,    43 }, {  9, 11,   543 },
+  { 10, 11,   524 }, { 11, 11,    30 }, { 12, 11,   524 }, { 14, 11,   315 },
+  { 16, 11,    18 }, { 20, 11,    26 }, { 20, 11,    65 }, {  4, 11,   205 },
+  {  5, 11,   623 }, {  7, 11,   104 }, {  8, 11,   519 }, {  5,  0,   293 },
+  {  6,  0,   601 }, {  7, 11,   579 }, {  9, 11,    41 }, {  9, 11,   244 },
+  {  9, 11,   669 }, { 10, 11,     5 }, { 11, 11,   861 }, { 11, 11,   951 },
+  { 11, 11,   980 }, {  4, 11,   717 }, {  4, 10,   695 }, {  7, 10,   497 },
+  {  9, 10,   387 }, { 19, 10,    81 }, {  4,  0,   420 }, { 14,  0,    37 },
+  {  6,  0,  1134 }, {  6,  0,  1900 }, { 12,  0,   830 }, { 12,  0,   878 },
+  { 12,  0,   894 }, { 15,  0,   221 }, { 15,  0,   245 }, {  4, 11,   489 },
+  {  7,  0,  1570 }, { 12,  0,   542 }, {  8,  0,   933 }, {  8,  0,   957 },
+  {  6,  0,  1371 }, {  7,  0,    31 }, {  8,  0,   373 }, {  5, 10,   284 },
+  {  6, 10,    49 }, {  6, 10,   350 }, {  7, 10,   377 }, {  7, 10,  1693 },
+  {  8, 10,   678 }, {  9, 10,   161 }, {  9, 10,   585 }, {  9, 10,   671 },
+  {  9, 10,   839 }, { 11, 10,   912 }, { 13, 10,   427 }, {  7, 11,   892 },
+  {  4,  0,   325 }, { 10,  0,   125 }, { 11, 11,    47 }, {  4, 10,   597 },
+  { 10,  0,   323 }, {  6,  0,  1547 }, {  7, 11,  1605 }, {  9, 11,   473 },
+  { 11, 11,   962 }, { 18, 11,   139 }, { 11, 10,   908 }, {  7, 11,   819 },
+  {  9, 11,    26 }, {  9, 11,   392 }, { 10, 11,   152 }, { 10, 11,   226 },
+  { 11, 11,    19 }, { 12, 11,   276 }, { 12, 11,   426 }, { 12, 11,   589 },
+  { 13, 11,   460 }, { 15, 11,    97 }, { 19, 11,    48 }, { 20, 11,   104 },
+  {  7, 11,    51 }, {  4,  0,   718 }, {  7,  0,  1216 }, {  6,  0,  1896 },
+  {  6,  0,  1905 }, {  6,  0,  1912 }, {  9,  0,   947 }, {  9,  0,   974 },
+  { 12,  0,   809 }, { 12,  0,   850 }, { 12,  0,   858 }, { 12,  0,   874 },
+  { 12,  0,   887 }, { 12,  0,   904 }, { 12,  0,   929 }, { 12,  0,   948 },
+  { 12,  0,   952 }, { 15,  0,   198 }, { 15,  0,   206 }, { 15,  0,   220 },
+  { 15,  0,   227 }, { 15,  0,   247 }, { 18,  0,   188 }, { 21,  0,    48 },
+  { 21,  0,    50 }, { 24,  0,    25 }, { 24,  0,    29 }, {  7, 11,   761 },
+  {  7, 11,  1051 }, {  9, 11,   545 }, {  5,  0,   124 }, {  5,  0,   144 },
+  {  6,  0,   548 }, {  7,  0,    15 }, {  7,  0,   153 }, {  9,  0,   629 },
+  {  7, 11,   606 }, {  7, 10,  2014 }, {  7, 10,  2007 }, {  9, 11,    46 },
+  {  9, 10,   101 }, {  9, 10,   450 }, { 10, 10,    66 }, { 10, 10,   842 },
+  { 11, 10,   536 }, { 12, 10,   587 }, {  6,  0,    75 }, {  7,  0,  1531 },
+  {  8,  0,   416 }, {  9,  0,   240 }, {  9,  0,   275 }, { 10,  0,   100 },
+  { 11,  0,   658 }, { 11,  0,   979 }, { 12,  0,    86 }, { 14,  0,   207 },
+  { 15,  0,    20 }, { 15,  0,    25 }, {  5,  0,   141 }, {  5,  0,   915 },
+  {  6,  0,  1783 }, {  7,  0,   211 }, {  7,  0,   698 }, {  7,  0,  1353 },
+  {  9,  0,    83 }, {  9,  0,   281 }, { 10,  0,   376 }, { 10,  0,   431 },
+  { 11,  0,   543 }, { 12,  0,   664 }, { 13,  0,   280 }, { 13,  0,   428 },
+  { 14,  0,    61 }, { 14,  0,   128 }, { 17,  0,    52 }, { 17,  0,    81 },
+  {  4, 11,   674 }, {  7,  0,   533 }, { 21,  0,     6 }, {  4, 11,   770 },
+  {  5,  0,   538 }, {  5, 11,    79 }, {  7, 11,  1027 }, {  7, 11,  1477 },
+  { 11, 11,    52 }, { 11, 10,    62 }, {  4,  0,   338 }, {  5,  0,   400 },
+  {  5, 11,   789 }, {  6, 11,   195 }, {  4, 11,   251 }, {  4, 11,   688 },
+  {  7, 11,   513 }, {  7, 11,  1284 }, {  9, 11,    87 }, { 10, 11,   365 },
+  {  6, 10,  1766 }, {  6,  0,     0 }, {  7,  0,    84 }, { 11,  0,   895 },
+  { 17,  0,    11 }, { 11,  0,   892 }, {  4,  0,   221 }, {  5,  0,   659 },
+  {  7,  0,   697 }, {  7,  0,  1211 }, { 10,  0,   284 }, {  5,  0,   989 },
+  {  5, 11,   889 }, {  4, 11,   160 }, {  5, 11,   330 }, {  7, 11,  1434 },
+  {  8, 11,   174 }, {  6, 10,  1665 }, {  7, 10,   256 }, {  7, 10,  1388 },
+  { 10, 10,   499 }, { 11, 10,   670 }, {  7,  0,   848 }, {  4, 10,    22 },
+  {  5, 10,    10 }, {  8, 10,    97 }, { 10,  0,   507 }, {  5, 10,   481 },
+  {  4,  0,   188 }, {  7,  0,   805 }, {  5,  0,   884 }, {  6,  0,   732 },
+  { 11,  0,   991 }, {  7, 11,   968 }, { 11, 11,   636 }, { 15, 11,   145 },
+  { 17, 11,    34 }, { 19, 11,    50 }, { 23, 11,    20 }, {  7,  0,   959 },
+  { 16,  0,    60 }, {  6, 10,   134 }, {  7, 10,   437 }, {  9, 10,    37 },
+  { 14, 10,   285 }, { 14, 10,   371 }, {  7, 10,   486 }, {  8, 10,   155 },
+  { 11, 10,    93 }, { 12, 10,   164 }, {  6,  0,  1653 }, {  7,  0,   337 },
+  {  5, 10,   591 }, {  6,  0,  1989 }, {  8,  0,   922 }, {  8,  0,   978 },
+  {  5, 11,   374 }, {  4,  0,   638 }, { 10,  0,   500 }, {  5, 11,   731 },
+  {  5, 10,   380 }, {  5, 10,   650 }, {  8, 10,   310 }, { 10, 11,   381 },
+  {  4, 10,   364 }, {  7, 10,  1156 }, {  7, 10,  1187 }, {  9, 10,   409 },
+  {  9, 11,   224 }, { 12,  0,   166 }, {  6, 10,   482 }, {  4, 11,   626 },
+  {  5, 11,   642 }, {  6, 11,   425 }, { 10, 11,   202 }, { 11, 11,   141 },
+  {  4, 10,   781 }, {  6, 10,   487 }, {  7, 10,   926 }, {  8, 10,   263 },
+  { 11, 10,   500 }, {  7,  0,   418 }, {  4, 10,    94 }, {  7, 10,  1265 },
+  {  8,  0,   760 }, {  4, 10,   417 }, {  8, 11,   835 }, {  5, 10,   348 },
+  {  6, 10,   522 }, {  6,  0,  1277 }, {  6,  0,  1538 }, { 11, 11,   541 },
+  {  7, 11,  1597 }, {  5, 11,   384 }, {  8, 11,   455 }, { 12, 11,    48 },
+  {  8,  0,   770 }, {  5, 11,   264 }, {  6, 11,   184 }, {  4,  0,    89 },
+  {  5,  0,   489 }, {  6,  0,   315 }, {  7,  0,   553 }, {  7,  0,  1745 },
+  { 10,  0,   243 }, {  4, 10,   408 }, {  4, 10,   741 }, {  7, 10,   500 },
+  {  6,  0,  1396 }, {  5,  0,   560 }, {  6,  0,  1658 }, {  9,  0,     3 },
+  { 10,  0,   154 }, { 11,  0,   641 }, { 13,  0,    85 }, { 13,  0,   201 },
+  { 13,  0,   346 }, {  7, 11,  1595 }, {  5, 11,   633 }, {  6, 11,    28 },
+  {  7, 11,   219 }, {  7, 11,  1323 }, {  9, 11,   769 }, { 12, 11,   185 },
+  {  7, 11,   785 }, {  7, 11,   359 }, {  8, 11,   243 }, { 12, 11,   175 },
+  { 10,  0,   586 }, {  7,  0,  1271 }, {  6, 10,    73 }, {  4, 11,   105 },
+  {  4,  0,   166 }, {  5,  0,   505 }, {  6,  0,  1670 }, {  5, 10,   576 },
+  {  4, 11,   324 }, { 10, 11,   104 }, { 14, 10,   231 }, {  6,  0,   637 },
+  {  7, 10,  1264 }, {  7, 10,  1678 }, { 11, 10,   945 }, { 12, 10,   341 },
+  { 12, 10,   471 }, { 12, 10,   569 }, { 23, 11,    21 }, { 23, 11,    23 },
+  {  8, 11,   559 }, { 13, 11,   109 }, {  6,  0,  1947 }, {  7,  0,   445 },
+  {  8,  0,   307 }, {  8,  0,   704 }, { 10,  0,    41 }, { 10,  0,   439 },
+  { 11,  0,   237 }, { 11,  0,   622 }, { 12,  0,   201 }, {  7, 11,   963 },
+  {  7,  0,  1977 }, {  4,  0,   189 }, {  5,  0,   713 }, {  8,  0,    57 },
+  { 10,  0,   371 }, {  7, 10,   538 }, {  4,  0,   552 }, {  6,  0,   883 },
+  {  5, 10,   413 }, {  6,  0,   923 }, {  4, 11,   758 }, { 10, 11,   215 },
+  {  8, 10,   495 }, {  7, 10,    54 }, {  8, 10,   312 }, { 10, 10,   191 },
+  { 10, 10,   614 }, { 12, 10,   567 }, {  7, 11,   351 }, { 11, 11,   128 },
+  {  7,  0,   875 }, {  6, 10,   468 }, {  7, 10,  1478 }, {  8, 10,   530 },
+  { 14, 10,   290 }, {  7,  0,  1788 }, { 17,  0,    49 }, {  5, 11,   918 },
+  { 12, 11,   398 }, { 20, 11,    39 }, { 21, 11,    11 }, { 22, 11,    41 },
+  { 10,  0,   661 }, {  6, 10,   484 }, {  7, 10,   822 }, {  7,  0,  1945 },
+  {  6,  0,   794 }, {  9, 10,   900 }, {  7, 10,  1335 }, {  6, 10,  1724 },
+  {  7, 10,  2022 }, {  4, 11,   340 }, {  6,  0,  1135 }, {  4,  0,   784 },
+  {  5,  0,   745 }, {  5,  0,    84 }, {  6,  0,   163 }, {  5,  0,   410 },
+  {  4,  0,   976 }, {  5, 11,   985 }, {  7, 11,   509 }, {  7, 11,   529 },
+  { 17, 11,    96 }, {  4, 10,   474 }, {  6,  0,   703 }, {  7, 11,  1919 },
+  {  5,  0,   322 }, {  8,  0,   186 }, {  9,  0,   262 }, { 10,  0,   187 },
+  { 14,  0,   208 }, {  7, 10,  1504 }, {  5,  0,   227 }, {  9,  0,   560 },
+  { 13,  0,   208 }, {  5, 10,   305 }, {  4, 11,   247 }, {  7,  0,  1395 },
+  {  8,  0,   486 }, {  9,  0,   236 }, {  9,  0,   878 }, { 10,  0,   218 },
+  { 11,  0,    95 }, { 19,  0,    17 }, { 19,  0,    31 }, {  7,  0,  2043 },
+  {  8,  0,   672 }, { 13,  0,   448 }, {  4, 11,   184 }, {  5, 11,   390 },
+  {  6, 11,   337 }, {  7, 11,    23 }, {  7, 11,   494 }, {  7, 11,   618 },
+  {  7, 11,  1456 }, {  8, 11,    27 }, {  8, 11,   599 }, { 10, 11,   153 },
+  { 11, 11,   710 }, {  7,  0,   466 }, {  7, 10,  1236 }, {  6,  0,   167 },
+  {  7,  0,   186 }, {  7,  0,   656 }, { 10,  0,   643 }, {  4, 10,   480 },
+  {  6, 10,   302 }, {  6, 10,  1642 }, {  7, 10,   837 }, {  7, 10,  1547 },
+  {  7, 10,  1657 }, {  8, 10,   429 }, {  9, 10,   228 }, { 13, 10,   289 },
+  { 13, 10,   343 }, { 19, 10,   101 }, {  6,  0,  1428 }, {  6,  0,  1440 },
+  {  5,  0,   412 }, {  7, 10,   278 }, { 10, 10,   739 }, { 11, 10,   708 },
+  { 13, 10,   348 }, {  6,  0,  1118 }, {  8,  0,   562 }, { 20, 11,    46 },
+  {  9,  0,   316 }, { 11,  0,   256 }, {  6,  0,  1771 }, {  7,  0,  1190 },
+  {  9,  0,   132 }, { 10, 11,   227 }, { 11, 11,   497 }, { 11, 11,   709 },
+  { 12, 11,   415 }, { 15,  0,    66 }, {  6, 11,   360 }, {  7, 11,  1664 },
+  {  8, 11,   478 }, { 16, 10,    28 }, {  4,  0,   317 }, {  7,  0,  1279 },
+  {  5,  0,    63 }, {  5,  0,   509 }, {  8, 11,   699 }, { 17, 10,    36 },
+  {  6,  0,  1475 }, { 11, 11,   343 }, { 14, 11,   127 }, {  4, 11,   739 },
+  {  4,  0,   288 }, {  7, 11,  1757 }, {  8,  0,    89 }, {  8,  0,   620 },
+  {  9,  0,   608 }, { 11,  0,   628 }, { 12,  0,   322 }, { 15,  0,   124 },
+  {  6,  0,  1225 }, {  7,  0,  1189 }, {  4, 11,    67 }, {  5, 11,   422 },
+  {  6, 10,   363 }, {  7, 11,  1037 }, {  7, 11,  1289 }, {  7, 11,  1555 },
+  {  7, 10,  1955 }, {  8, 10,   725 }, {  9, 11,   741 }, { 17, 11,   108 },
+  {  6,  0,  1468 }, {  6,  0,   689 }, {  6,  0,  1451 }, { 10,  0,   120 },
+  { 23,  0,     1 }, {  9, 10,   805 }, { 14,  0,   329 }, {  5, 10,   813 },
+  {  7, 10,  2046 }, {  7,  0,   226 }, { 10, 11,    96 }, {  7,  0,  1855 },
+  {  5, 10,   712 }, { 11, 10,    17 }, { 13, 10,   321 }, { 16, 10,    67 },
+  {  9,  0,   461 }, {  6, 10,   320 }, {  7, 10,   781 }, {  7, 10,  1921 },
+  {  9, 10,    55 }, { 10, 10,   186 }, { 10, 10,   273 }, { 10, 10,   664 },
+  { 10, 10,   801 }, { 11, 10,   996 }, { 11, 10,   997 }, { 13, 10,   157 },
+  { 14, 10,   170 }, {  8, 11,   203 }, {  8, 10,   271 }, { 11, 11,   823 },
+  { 11, 11,   846 }, { 12, 11,   482 }, { 13, 11,   133 }, { 13, 11,   277 },
+  { 13, 11,   302 }, { 13, 11,   464 }, { 14, 11,   205 }, { 14, 11,   221 },
+  {  7,  0,  1346 }, {  4, 11,   449 }, {  5, 11,   718 }, {  6,  0,    85 },
+  { 14,  0,   299 }, {  7, 10,   103 }, {  7, 10,   863 }, { 11, 10,   184 },
+  { 17, 10,    62 }, {  4, 11,   355 }, {  6, 11,   311 }, {  9, 11,   256 },
+  { 10, 11,   404 }, {  9, 10,   659 }, { 10, 11,   758 }, {  5, 11,   827 },
+  {  5, 11,    64 }, { 12, 11,   581 }, {  6,  0,  1171 }, {  4, 11,   442 },
+  {  7, 11,  1047 }, {  7, 11,  1352 }, {  7, 11,  1643 }, {  4,  0,   980 },
+  {  5, 11,   977 }, {  6, 11,   288 }, {  7, 11,   528 }, {  7, 11,  1065 },
+  {  5,  0,   279 }, {  6,  0,   235 }, {  7,  0,   468 }, {  8,  0,   446 },
+  {  9,  0,   637 }, { 10,  0,   717 }, { 11,  0,   738 }, { 12,  0,   514 },
+  {  4,  0,   293 }, { 11, 10,   337 }, { 14, 10,   303 }, {  8, 11,   285 },
+  {  5,  0,    17 }, {  6,  0,   371 }, {  9,  0,   528 }, { 12,  0,   364 },
+  {  4, 11,   254 }, {  5, 10,    77 }, {  7, 10,  1455 }, { 10, 10,   843 },
+  { 19, 10,    73 }, { 22,  0,     5 }, {  4, 10,   458 }, {  6, 11,    12 },
+  {  7, 11,  1219 }, { 17, 11,    73 }, {  7, 10,  1420 }, {  6, 10,   109 },
+  { 10, 10,   382 }, {  7, 11,   125 }, {  6, 10,   330 }, {  7, 10,  1084 },
+  { 11, 10,   142 }, {  6, 11,   369 }, {  6, 11,   502 }, {  7, 11,  1036 },
+  {  8, 11,   348 }, {  9, 11,   452 }, { 10, 11,    26 }, { 11, 11,   224 },
+  { 11, 11,   387 }, { 11, 11,   772 }, { 12, 11,    95 }, { 12, 11,   629 },
+  { 13, 11,   195 }, { 13, 11,   207 }, { 13, 11,   241 }, { 14, 11,   260 },
+  { 14, 11,   270 }, { 15, 11,   140 }, {  4, 11,   269 }, {  5, 11,   480 },
+  {  7, 11,   532 }, {  7, 11,  1197 }, {  7, 11,  1358 }, {  8, 11,   291 },
+  { 11, 11,   349 }, { 14, 11,   396 }, { 22,  0,    48 }, { 10,  0,   601 },
+  { 13,  0,   353 }, { 13,  0,   376 }, {  5,  0,   779 }, {  5,  0,   807 },
+  {  6,  0,  1655 }, {  6,  0,  1676 }, { 14, 11,   223 }, {  4,  0,   196 },
+  {  5,  0,   558 }, {  5,  0,   949 }, { 20, 11,    15 }, {  7, 11,  1764 },
+  {  6,  0,  1322 }, {  4,  0,   752 }, { 11,  0,   737 }, {  7, 11,   657 },
+  {  8, 11,   533 }, {  7,  0,   412 }, {  4,  0,   227 }, {  5,  0,   159 },
+  {  5,  0,   409 }, {  7,  0,    80 }, {  8,  0,   556 }, { 10,  0,   479 },
+  { 12,  0,   418 }, { 14,  0,    50 }, { 14,  0,   123 }, { 14,  0,   192 },
+  { 14,  0,   249 }, { 14,  0,   295 }, { 15,  0,    27 }, {  7,  0,  1470 },
+  {  8,  0,    66 }, {  8,  0,   137 }, {  8,  0,   761 }, {  9,  0,   638 },
+  { 11,  0,    80 }, { 11,  0,   212 }, { 11,  0,   368 }, { 11,  0,   418 },
+  { 12,  0,     8 }, { 13,  0,    15 }, { 16,  0,    61 }, { 17,  0,    59 },
+  { 19,  0,    28 }, { 20,  0,    84 }, {  7, 10,  1985 }, {  4, 11,   211 },
+  {  4, 11,   332 }, {  5, 11,   335 }, {  6, 11,   238 }, {  7, 11,   269 },
+  {  7, 11,   811 }, {  7, 11,  1797 }, {  8, 10,   122 }, {  8, 11,   836 },
+  {  9, 11,   507 }, { 13, 11,   242 }, {  6,  0,   683 }, {  6,  0,  1252 },
+  {  4,  0,   873 }, {  4, 10,   234 }, {  6,  0,   835 }, {  6,  0,    38 },
+  {  7,  0,  1220 }, {  8,  0,   185 }, {  8,  0,   256 }, {  9,  0,    22 },
+  {  9,  0,   331 }, { 10,  0,   738 }, { 11,  0,   205 }, { 11,  0,   540 },
+  { 11,  0,   746 }, { 13,  0,   465 }, { 14,  0,    88 }, { 14,  0,   194 },
+  { 10,  0,   986 }, {  5, 11,  1009 }, { 12, 11,   582 }, { 18, 11,   131 },
+  {  4,  0,   159 }, {  6,  0,   115 }, {  7,  0,   252 }, {  7,  0,   257 },
+  {  7,  0,  1928 }, {  8,  0,    69 }, {  9,  0,   384 }, { 10,  0,    91 },
+  { 10,  0,   615 }, { 12,  0,   375 }, { 14,  0,   235 }, { 18,  0,   117 },
+  { 19,  0,   123 }, {  5,  0,   911 }, {  8,  0,   278 }, {  5, 10,   430 },
+  {  5, 10,   932 }, {  6, 10,   131 }, {  7, 10,   417 }, {  9, 10,   522 },
+  { 11, 10,   314 }, { 13, 10,   390 }, { 14, 10,   149 }, { 14, 10,   399 },
+  { 15, 10,    57 }, {  4,  0,   151 }, {  7,  0,  1567 }, {  8,  0,   749 },
+  {  5, 11,   228 }, {  6, 11,   203 }, {  7, 11,   156 }, {  8, 11,   347 },
+  {  9, 11,   265 }, {  4, 10,   507 }, { 10,  0,   989 }, { 12,  0,   956 },
+  {  5,  0,   990 }, {  5,  0,   194 }, {  6,  0,   927 }, {  7,  0,  1662 },
+  {  9,  0,    90 }, { 12,  0,   564 }, {  4, 10,   343 }, {  5, 10,   511 },
+  {  5,  0,   425 }, {  7, 10,   455 }, { 10, 10,   591 }, {  4,  0,   774 },
+  {  7, 11,   476 }, {  7, 11,  1592 }, { 10, 11,    87 }, {  5,  0,   971 },
+  {  7, 10,  1381 }, {  5, 11,   318 }, { 19, 11,   121 }, {  5, 11,   291 },
+  {  7, 11,   765 }, {  9, 11,   389 }, { 12, 11,   548 }, {  6, 10,   575 },
+  {  4,  0,   827 }, { 12,  0,   646 }, { 12,  0,   705 }, { 12,  0,   712 },
+  { 12,  0,   714 }, { 11,  0,   752 }, {  9,  0,   662 }, {  5,  0,    72 },
+  {  6,  0,   264 }, {  7,  0,    21 }, {  7,  0,    46 }, {  7,  0,  2013 },
+  {  8,  0,   215 }, {  8,  0,   513 }, { 10,  0,   266 }, { 11,  0,    22 },
+  { 11, 11,   522 }, {  6,  0,   239 }, {  7,  0,   118 }, { 10,  0,    95 },
+  { 11,  0,   603 }, { 13,  0,   443 }, { 14,  0,   160 }, { 15,  0,     4 },
+  {  6,  0,   431 }, {  6,  0,   669 }, {  7, 10,  1127 }, {  7, 10,  1572 },
+  { 10, 10,   297 }, { 10, 10,   422 }, { 11, 10,   764 }, { 11, 10,   810 },
+  { 12, 10,   264 }, { 13, 10,   102 }, { 13, 10,   300 }, { 13, 10,   484 },
+  { 14, 10,   147 }, { 14, 10,   229 }, { 17, 10,    71 }, { 18, 10,   118 },
+  { 19, 10,   120 }, {  5,  0,   874 }, {  6,  0,  1677 }, { 15,  0,     0 },
+  { 10, 11,   525 }, { 11, 11,    82 }, {  6,  0,    65 }, {  7,  0,   939 },
+  {  7,  0,  1172 }, {  7,  0,  1671 }, {  9,  0,   540 }, { 10,  0,   696 },
+  { 11,  0,   265 }, { 11,  0,   732 }, { 11,  0,   928 }, { 11,  0,   937 },
+  { 13,  0,   438 }, {  6,  0,  1350 }, {  8, 11,   547 }, {  4, 11,   422 },
+  {  5, 11,   355 }, { 17, 11,     0 }, {  9, 11,   905 }, {  5,  0,   682 },
+  {  7,  0,  1887 }, {  4,  0,   809 }, {  4,  0,   696 }, {  5, 11,   865 },
+  {  6,  0,  1074 }, {  6,  0,  1472 }, { 14, 10,    35 }, { 14, 10,   191 },
+  {  5, 11,   914 }, {  6, 11,  1625 }, {  5, 11,   234 }, {  7, 11,  1383 },
+  {  9, 11,   780 }, {  4, 10,   125 }, {  4,  0,   726 }, {  5,  0,   630 },
+  {  8,  0,   802 }, {  8,  0,   838 }, {  4, 10,   721 }, {  6,  0,  1337 },
+  {  7,  0,   776 }, { 19,  0,    56 }, {  8, 10,   145 }, {  4,  0,   970 },
+  {  7, 10,   792 }, {  8, 10,   147 }, { 10, 10,   821 }, { 11, 10,  1021 },
+  { 11, 10,   970 }, {  8,  0,   940 }, {  9,  0,   797 }, {  7, 11,  1312 },
+  {  9,  0,   248 }, { 10,  0,   400 }, {  7, 11,   816 }, {  7, 11,  1241 },
+  {  7, 10,  1999 }, {  9, 11,   283 }, {  9, 11,   520 }, { 10, 11,   213 },
+  { 10, 11,   307 }, { 10, 11,   463 }, { 10, 11,   671 }, { 10, 11,   746 },
+  { 11, 11,   401 }, { 11, 11,   794 }, { 12, 11,   517 }, { 18, 11,   107 },
+  { 19, 11,   115 }, {  6,  0,  1951 }, {  6,  0,  2040 }, {  7, 11,   339 },
+  { 13,  0,    41 }, { 15,  0,    93 }, {  5, 10,   168 }, {  5, 10,   930 },
+  {  8, 10,    74 }, {  9, 10,   623 }, { 12, 10,   500 }, { 12, 10,   579 },
+  {  6,  0,   118 }, {  7,  0,   215 }, {  7,  0,  1521 }, { 12,  0,    11 },
+  {  6, 10,   220 }, {  7, 10,  1101 }, { 13, 10,   105 }, {  6, 11,   421 },
+  {  7, 11,    61 }, {  7, 11,  1540 }, { 10, 11,    11 }, { 10, 11,   501 },
+  {  7,  0,   615 }, { 10,  0,   251 }, { 12, 11,   631 }, {  7,  0,  1044 },
+  {  6, 10,    19 }, {  7, 10,  1413 }, { 11, 10,   428 }, {  5,  0,   225 },
+  {  7, 10,    96 }, {  8, 10,   401 }, {  8, 10,   703 }, {  9, 10,   896 },
+  { 17, 10,   116 }, {  6, 11,   102 }, {  7, 11,    72 }, { 15, 11,   142 },
+  { 19, 11,    67 }, {  7, 10,  1961 }, {  7, 10,  1965 }, {  8, 10,   702 },
+  {  8, 10,   750 }, {  7, 10,  2030 }, {  8, 10,   150 }, {  8, 10,   737 },
+  { 12, 10,   366 }, { 23, 11,    30 }, {  4,  0,   370 }, {  5,  0,   756 },
+  {  7,  0,  1326 }, {  7, 11,   823 }, {  8, 10,   800 }, {  9, 10,   148 },
+  {  9, 10,   872 }, {  9, 10,   890 }, { 11, 10,   309 }, { 11, 10,  1001 },
+  { 13, 10,   267 }, { 13, 10,   323 }, {  6,  0,  1662 }, {  7,  0,    48 },
+  {  8,  0,   771 }, { 10,  0,   116 }, { 13,  0,   104 }, { 14,  0,   105 },
+  { 14,  0,   184 }, { 15,  0,   168 }, { 19,  0,    92 }, { 20,  0,    68 },
+  { 10,  0,   209 }, {  7, 11,  1870 }, {  7, 11,    68 }, {  8, 11,    48 },
+  {  8, 11,    88 }, {  8, 11,   582 }, {  8, 11,   681 }, {  9, 11,   373 },
+  {  9, 11,   864 }, { 11, 11,   157 }, { 11, 11,   336 }, { 11, 11,   843 },
+  { 20, 11,    27 }, {  6,  0,   930 }, {  4, 11,    88 }, {  5, 11,   137 },
+  {  5, 11,   174 }, {  5, 11,   777 }, {  6, 11,  1664 }, {  6, 11,  1725 },
+  {  7, 11,    77 }, {  7, 11,   426 }, {  7, 11,  1317 }, {  7, 11,  1355 },
+  {  8, 11,   126 }, {  8, 11,   563 }, {  9, 11,   523 }, {  9, 11,   750 },
+  { 10, 11,   310 }, { 10, 11,   836 }, { 11, 11,    42 }, { 11, 11,   318 },
+  { 11, 11,   731 }, { 12, 11,    68 }, { 12, 11,    92 }, { 12, 11,   507 },
+  { 12, 11,   692 }, { 13, 11,    81 }, { 13, 11,   238 }, { 13, 11,   374 },
+  { 18, 11,   138 }, { 19, 11,    78 }, { 19, 11,   111 }, { 20, 11,    55 },
+  { 20, 11,    77 }, { 20, 11,    92 }, {  4, 11,   938 }, {  7, 11,  1831 },
+  {  5, 10,   547 }, {  7, 10,   424 }, {  8, 11,   617 }, { 10, 11,   351 },
+  {  6,  0,  1286 }, {  6, 11,  1668 }, {  7, 11,  1499 }, {  8, 11,   117 },
+  {  9, 11,   314 }, { 10, 11,   174 }, {  6,  0,   759 }, {  6,  0,   894 },
+  {  7, 11,   707 }, { 11, 11,   563 }, {  4,  0,   120 }, {  7,  0,  1894 },
+  {  9,  0,   385 }, { 21,  0,    17 }, { 10,  0,   429 }, {  5, 11,   403 },
+  {  5,  0,   820 }, {  7,  0,   931 }, { 10,  0,   199 }, {  5, 10,   133 },
+  {  6,  0,   151 }, {  6,  0,  1675 }, {  7,  0,   383 }, { 23,  0,    10 },
+  {  6,  0,   761 }, {  8, 10,   187 }, {  8,  0,   365 }, { 10, 10,     0 },
+  { 10, 10,   818 }, { 11, 10,   988 }, {  4, 11,    44 }, {  5, 11,   311 },
+  {  6, 11,   156 }, {  7, 11,   639 }, {  7, 11,   762 }, {  7, 11,  1827 },
+  {  9, 11,     8 }, {  9, 11,   462 }, { 20, 11,    83 }, {  4, 11,   346 },
+  {  7, 11,   115 }, {  9, 11,   180 }, {  9, 11,   456 }, { 10, 11,   363 },
+  {  8, 10,   685 }, {  7,  0,  1086 }, { 17,  0,    46 }, {  6,  0,  1624 },
+  { 11,  0,    11 }, { 12,  0,   422 }, { 13,  0,   444 }, { 14,  0,   360 },
+  {  6,  0,  1020 }, {  6,  0,  1260 }, {  6,  0,  1589 }, {  4,  0,    43 },
+  {  5,  0,   344 }, {  5,  0,   357 }, { 14,  0,   472 }, { 22,  0,    58 },
+  {  6,  0,  1864 }, {  6,  0,  1866 }, {  6,  0,  1868 }, {  6,  0,  1869 },
+  {  6,  0,  1874 }, {  6,  0,  1877 }, {  6,  0,  1903 }, {  6,  0,  1911 },
+  {  9,  0,   920 }, {  9,  0,   921 }, {  9,  0,   924 }, {  9,  0,   946 },
+  {  9,  0,   959 }, {  9,  0,   963 }, {  9,  0,   970 }, {  9,  0,   997 },
+  {  9,  0,  1008 }, {  9,  0,  1017 }, { 12,  0,   795 }, { 12,  0,   797 },
+  { 12,  0,   798 }, { 12,  0,   800 }, { 12,  0,   803 }, { 12,  0,   811 },
+  { 12,  0,   820 }, { 12,  0,   821 }, { 12,  0,   839 }, { 12,  0,   841 },
+  { 12,  0,   848 }, { 12,  0,   911 }, { 12,  0,   921 }, { 12,  0,   922 },
+  { 12,  0,   925 }, { 12,  0,   937 }, { 12,  0,   944 }, { 12,  0,   945 },
+  { 12,  0,   953 }, { 15,  0,   184 }, { 15,  0,   191 }, { 15,  0,   199 },
+  { 15,  0,   237 }, { 15,  0,   240 }, { 15,  0,   243 }, { 15,  0,   246 },
+  { 18,  0,   203 }, { 21,  0,    40 }, { 21,  0,    52 }, { 21,  0,    57 },
+  { 24,  0,    23 }, { 24,  0,    28 }, { 24,  0,    30 }, {  6,  0,   725 },
+  { 17, 11,    58 }, {  5,  0,   888 }, {  9, 10,   874 }, {  4,  0,   711 },
+  {  8, 10,   774 }, { 10, 10,   670 }, { 12, 10,    51 }, { 16, 11,    40 },
+  {  6, 11,   185 }, {  7, 11,  1899 }, { 11, 11,   673 }, {  9, 10,   701 },
+  {  9,  0,   440 }, {  4, 11,   327 }, {  5, 11,   478 }, {  7, 11,  1332 },
+  {  8, 11,   753 }, { 12, 11,   227 }, {  4, 10,   127 }, {  5, 10,   350 },
+  {  6, 10,   356 }, {  8, 10,   426 }, {  9, 10,   572 }, { 10, 10,   247 },
+  { 11, 10,   312 }, {  5, 11,  1020 }, {  5, 11,  1022 }, {  4, 11,   103 },
+  {  5, 11,   401 }, {  6,  0,  1913 }, {  6,  0,  1926 }, {  6,  0,  1959 },
+  {  9,  0,   914 }, {  9,  0,   939 }, {  9,  0,   952 }, {  9,  0,   979 },
+  {  9,  0,   990 }, {  9,  0,   998 }, {  9,  0,  1003 }, {  9,  0,  1023 },
+  { 12,  0,   827 }, { 12,  0,   834 }, { 12,  0,   845 }, { 12,  0,   912 },
+  { 12,  0,   935 }, { 12,  0,   951 }, { 15,  0,   172 }, { 15,  0,   174 },
+  { 18,  0,   198 }, { 21,  0,    63 }, {  5,  0,   958 }, {  5,  0,   987 },
+  {  4, 11,   499 }, {  7, 11,  1421 }, {  7,  0,   885 }, {  6, 10,    59 },
+  {  6, 10,  1762 }, {  9, 10,   603 }, { 13, 10,   397 }, { 10, 11,    62 },
+  { 13, 11,   164 }, {  4,  0,   847 }, {  7,  0,   326 }, { 11,  0,   276 },
+  { 14,  0,   293 }, {  4,  0,    65 }, {  5,  0,   479 }, {  5,  0,  1004 },
+  {  7,  0,  1913 }, {  8,  0,   317 }, {  9,  0,   302 }, { 10,  0,   612 },
+  { 13,  0,    22 }, {  4, 11,    96 }, {  4,  0,   261 }, {  7,  0,   510 },
+  {  7,  0,  1514 }, {  6, 10,   111 }, {  7, 10,     4 }, {  8, 10,   163 },
+  {  8, 10,   776 }, { 10, 10,   566 }, {  4,  0,   291 }, {  9,  0,   515 },
+  { 12,  0,   152 }, { 12,  0,   443 }, { 13,  0,   392 }, { 14,  0,   357 },
+  {  7, 11,   399 }, {  7, 11,  1492 }, {  4,  0,   589 }, { 11,  0,   282 },
+  {  6, 11,   563 }, {  7, 10,  1994 }, {  5, 10,   297 }, {  7, 10,  1038 },
+  {  4,  0,   130 }, {  7,  0,   843 }, {  7,  0,  1562 }, {  5,  0,    42 },
+  {  5,  0,   879 }, {  7,  0,   245 }, {  7,  0,   324 }, {  7,  0,  1532 },
+  { 11,  0,   463 }, { 11,  0,   472 }, { 13,  0,   363 }, { 16,  0,    52 },
+  {  4,  0,   134 }, {  5,  0,   372 }, {  5,  0,   680 }, {  8, 10,   363 },
+  {  6,  0,  1997 }, {  8,  0,   935 }, {  8,  0,   977 }, {  4,  0,   810 },
+  {  7,  0,  1634 }, {  7, 10,  1675 }, {  7,  0,  1390 }, {  4, 11,   910 },
+  {  5, 11,   832 }, {  7, 10,   808 }, {  8, 11,   266 }, { 11, 11,   578 },
+  {  4,  0,   644 }, {  4,  0,   982 }, { 10,  0,   867 }, {  4, 10,   280 },
+  {  7,  0,   540 }, { 12, 10,    54 }, {  7,  0,   123 }, {  6,  0,  1978 },
+  {  4, 10,   421 }, {  5, 10,   548 }, {  6,  0,   623 }, {  8,  0,   789 },
+  {  4,  0,   908 }, {  5,  0,   359 }, {  5,  0,   508 }, {  6,  0,  1723 },
+  {  7,  0,   343 }, {  7,  0,  1996 }, {  7,  0,  2026 }, {  6,  0,  1220 },
+  {  4,  0,   341 }, {  7,  0,   480 }, {  6, 10,   254 }, {  9, 10,   109 },
+  { 10, 10,   103 }, {  6,  0,   888 }, {  8, 11,   528 }, {  9, 11,   348 },
+  {  7,  0,  1995 }, {  8,  0,   299 }, { 11,  0,   890 }, { 12,  0,   674 },
+  {  4, 11,    20 }, {  5, 11,   616 }, {  7, 11,  1094 }, {  6, 10,  1630 },
+  {  4,  0,   238 }, {  5,  0,   503 }, {  6,  0,   179 }, {  7,  0,  2003 },
+  {  8,  0,   381 }, {  8,  0,   473 }, {  9,  0,   149 }, { 10,  0,   788 },
+  { 15,  0,    45 }, { 15,  0,    86 }, { 20,  0,   110 }, { 22,  0,    57 },
+  {  5, 10,   671 }, {  4, 11,    26 }, {  5, 11,   429 }, {  6, 11,   245 },
+  {  7, 11,   704 }, {  7, 11,  1379 }, {  7, 11,  1474 }, {  4,  0,   121 },
+  {  5,  0,   156 }, {  5,  0,   349 }, {  9,  0,   431 }, { 10,  0,   605 },
+  { 14,  0,   342 }, {  7, 11,   943 }, { 11, 11,   614 }, {  4, 10,   889 },
+  {  4, 11,   621 }, {  7, 10,  1382 }, {  7, 11,  1382 }, {  7, 10,  1910 },
+  {  4, 10,   627 }, {  5, 10,   775 }, {  5, 11,   542 }, {  5, 11,   868 },
+  {  8, 11,   433 }, {  6,  0,  1373 }, {  7,  0,  1011 }, { 11, 10,   362 },
+  { 11, 10,   948 }, { 12, 10,   388 }, {  6,  0,    80 }, {  7,  0,   173 },
+  {  9,  0,   547 }, { 10,  0,   730 }, { 14,  0,    18 }, { 22,  0,    39 },
+  {  7, 11,  1495 }, {  6,  0,  1694 }, {  7,  0,  1974 }, { 12,  0,   196 },
+  {  4,  0,   923 }, {  6,  0,   507 }, {  6,  0,  1711 }, {  7, 10,   451 },
+  {  8, 10,   389 }, { 12, 10,   490 }, { 13, 10,    16 }, { 13, 10,   215 },
+  { 13, 10,   351 }, { 18, 10,   132 }, { 19, 10,   125 }, {  6,  0,   646 },
+  {  6,  0,  1047 }, {  7, 10,   841 }, {  8, 10,   566 }, {  6,  0,  1611 },
+  {  7,  0,  1214 }, { 11,  0,   926 }, {  4, 11,   525 }, {  4,  0,   595 },
+  {  5,  0,   240 }, {  6,  0,   459 }, {  7,  0,    12 }, {  7,  0,   114 },
+  {  7,  0,   949 }, {  7,  0,  1753 }, {  7,  0,  1805 }, {  8,  0,   658 },
+  {  9,  0,     1 }, { 11,  0,   959 }, { 13,  0,   446 }, {  5, 10,   912 },
+  {  6, 10,  1695 }, {  4,  0,   446 }, {  7, 11,    62 }, { 12, 11,    45 },
+  { 19, 11,   112 }, {  5, 10,   236 }, {  6, 10,   572 }, {  8, 10,   492 },
+  { 11, 10,   618 }, { 16, 10,    56 }, {  5, 10,   190 }, {  8, 10,   318 },
+  {  7, 10,  1376 }, {  4, 11,   223 }, {  6, 11,   359 }, { 11, 11,     3 },
+  { 13, 11,   108 }, { 14, 11,    89 }, { 16, 11,    22 }, {  4, 11,   647 },
+  {  6,  0,   490 }, {  6,  0,   491 }, {  6,  0,  1584 }, {  7, 11,   685 },
+  { 10, 11,   220 }, {  7,  0,   250 }, {  8,  0,   507 }, {  4,  0,   158 },
+  {  4,  0,   140 }, {  7,  0,   362 }, {  8,  0,   209 }, {  9,  0,    10 },
+  {  9,  0,   160 }, {  9,  0,   503 }, {  9,  0,   614 }, { 10,  0,   689 },
+  { 11,  0,   327 }, { 11,  0,   553 }, { 11,  0,   725 }, { 11,  0,   767 },
+  { 12,  0,   252 }, { 12,  0,   583 }, { 13,  0,   192 }, { 14,  0,   269 },
+  { 14,  0,   356 }, { 20,  0,    50 }, { 19,  0,     1 }, { 19,  0,    26 },
+  { 22,  0,     9 }, {  4, 11,   109 }, {  6,  0,   228 }, {  7,  0,  1341 },
+  {  9,  0,   408 }, { 10,  0,   343 }, {  4,  0,   373 }, {  5,  0,   283 },
+  {  6,  0,   480 }, {  7,  0,   609 }, { 10,  0,   860 }, { 10,  0,   878 },
+  {  6,  0,   779 }, {  6,  0,  1209 }, {  4,  0,   557 }, {  7, 11,   263 },
+  {  7, 11,   628 }, {  8, 11,   349 }, {  4,  0,   548 }, {  7,  0,   197 },
+  {  8,  0,   142 }, {  8,  0,   325 }, {  9,  0,   150 }, {  9,  0,   596 },
+  { 10,  0,   350 }, { 10,  0,   353 }, { 11,  0,    74 }, { 11,  0,   315 },
+  { 12,  0,   662 }, { 12,  0,   681 }, { 14,  0,   423 }, { 15,  0,   141 },
+  {  4, 11,    40 }, { 10, 11,    67 }, { 11, 11,   117 }, { 11, 11,   768 },
+  { 11, 11,   935 }, {  7, 11,   992 }, {  8, 11,   301 }, {  9, 11,   722 },
+  { 12, 11,    63 }, { 13, 11,    29 }, { 14, 11,   161 }, { 15, 11,    18 },
+  {  6,  0,  1490 }, { 10, 11,   532 }, {  5,  0,   580 }, {  7,  0,   378 },
+  {  7,  0,   674 }, {  7,  0,  1424 }, { 15,  0,    83 }, { 16,  0,    11 },
+  { 15, 11,    83 }, { 16, 11,    11 }, {  6,  0,  1057 }, {  6,  0,  1335 },
+  { 10,  0,   316 }, {  7, 10,    85 }, {  7, 10,   247 }, {  8, 10,   585 },
+  { 10, 10,   163 }, {  4,  0,   169 }, {  5,  0,    83 }, {  6,  0,   399 },
+  {  6,  0,   579 }, {  6,  0,  1513 }, {  7,  0,   692 }, {  7,  0,   846 },
+  {  7,  0,  1015 }, {  7,  0,  1799 }, {  8,  0,   403 }, {  9,  0,   394 },
+  { 10,  0,   133 }, { 12,  0,     4 }, { 12,  0,   297 }, { 12,  0,   452 },
+  { 16,  0,    81 }, { 18,  0,    25 }, { 21,  0,    14 }, { 22,  0,    12 },
+  { 23,  0,    18 }, {  6,  0,  1106 }, {  7,  0,  1546 }, { 11,  0,   299 },
+  { 14,  0,   407 }, {  6,  0,  1192 }, {  4,  0,   177 }, {  5,  0,   411 },
+  {  7,  0,   653 }, {  7,  0,   439 }, { 10,  0,   727 }, { 11,  0,   260 },
+  { 11,  0,   684 }, { 10, 10,   145 }, { 19, 10,    83 }, {  5,  0,   208 },
+  {  7,  0,   753 }, {  7,  0,  1528 }, {  9, 11,   617 }, {  7, 10,  1922 },
+  {  7, 11,   825 }, { 11,  0,   422 }, { 13,  0,   389 }, {  4, 10,   124 },
+  { 10, 10,   457 }, { 11, 10,   121 }, { 11, 10,   169 }, { 11, 10,   870 },
+  { 12, 10,   214 }, { 14, 10,   187 }, { 15, 10,    77 }, { 11,  0,   615 },
+  { 15,  0,    58 }, { 11, 11,   615 }, { 15, 11,    58 }, {  9,  0,   618 },
+  { 10,  0,   482 }, {  6,  0,  1952 }, {  6,  0,  1970 }, { 14,  0,   505 },
+  {  7, 10,  1193 }, {  7, 11,  1838 }, {  5,  0,   242 }, {  7, 10,  1333 },
+  {  6, 10,   107 }, {  7, 10,   638 }, {  7, 10,  1632 }, {  9, 10,   396 },
+  {  5,  0,   953 }, {  5, 10,   370 }, {  6, 10,  1756 }, {  5, 11,    28 },
+  {  6, 11,   204 }, { 10, 11,   320 }, { 10, 11,   583 }, { 13, 11,   502 },
+  { 14, 11,    72 }, { 14, 11,   274 }, { 14, 11,   312 }, { 14, 11,   344 },
+  { 15, 11,   159 }, { 16, 11,    62 }, { 16, 11,    69 }, { 17, 11,    30 },
+  { 18, 11,    42 }, { 18, 11,    53 }, { 18, 11,    84 }, { 18, 11,   140 },
+  { 19, 11,    68 }, { 19, 11,    85 }, { 20, 11,     5 }, { 20, 11,    45 },
+  { 20, 11,   101 }, { 22, 11,     7 }, { 22, 11,    20 }, {  4, 11,   558 },
+  {  6, 11,   390 }, {  7, 11,   162 }, {  7, 11,   689 }, {  9, 11,   360 },
+  { 10, 11,   653 }, { 11,  0,   802 }, { 13,  0,    67 }, {  5, 10,   204 },
+  {  5,  0,   290 }, {  5, 10,   970 }, {  6, 10,  1706 }, {  4,  0,   380 },
+  {  5,  0,    52 }, {  7,  0,   277 }, {  9,  0,   368 }, { 11,  0,   791 },
+  {  5, 11,   856 }, {  6, 11,  1672 }, {  6, 11,  1757 }, {  6, 11,  1781 },
+  {  7, 11,  1150 }, {  7, 11,  1425 }, {  7, 11,  1453 }, { 12, 11,   513 },
+  {  5, 11,    92 }, {  7, 10,     3 }, { 10, 11,   736 }, { 12, 11,   102 },
+  {  4,  0,   112 }, {  5,  0,   653 }, {  5, 10,   483 }, {  5, 10,   685 },
+  {  6, 10,   489 }, {  7, 10,  1204 }, {  8, 10,   394 }, {  4, 10,   921 },
+  {  6,  0,  1028 }, {  5, 10,  1007 }, {  5, 11,   590 }, {  9, 11,   213 },
+  { 17, 11,    91 }, {  7, 10,  1696 }, { 10,  0,   138 }, { 11,  0,   476 },
+  {  5,  0,   725 }, {  5,  0,   727 }, {  7,  0,  1811 }, {  4,  0,   979 },
+  {  6,  0,  1821 }, {  6,  0,  1838 }, {  8,  0,   876 }, {  8,  0,   883 },
+  {  8,  0,   889 }, {  8,  0,   893 }, {  8,  0,   895 }, { 10,  0,   934 },
+  { 12,  0,   720 }, { 14,  0,   459 }, { 20,  0,   123 }, {  7, 11,   551 },
+  {  4,  0,    38 }, {  6,  0,   435 }, {  7,  0,   307 }, {  7,  0,   999 },
+  {  7,  0,  1481 }, {  7,  0,  1732 }, {  7,  0,  1738 }, {  8,  0,   371 },
+  {  9,  0,   414 }, { 11,  0,   316 }, { 12,  0,    52 }, { 13,  0,   420 },
+  { 19,  0,   100 }, {  7,  0,  1296 }, {  4, 10,   712 }, {  6, 10,  1629 },
+  {  5,  0,   723 }, {  6,  0,   651 }, {  8, 11,   191 }, {  9, 11,   791 },
+  { 10, 11,    93 }, { 11, 11,   301 }, { 16, 11,    13 }, { 17, 11,    23 },
+  { 18, 11,   135 }, { 19, 11,    12 }, { 20, 11,     1 }, { 20, 11,    12 },
+  { 20, 11,    14 }, {  8, 11,   503 }, {  6, 11,   466 }, {  7, 11,   671 },
+  {  6,  0,  1200 }, {  6,  0,  1330 }, {  7,  0,  1255 }, {  6,  0,   986 },
+  {  5,  0,   109 }, {  6,  0,  1784 }, {  7,  0,  1895 }, { 12,  0,   296 },
+  { 12,  0,   302 }, {  7, 11,   983 }, {  5, 10,   485 }, {  6,  0,   660 },
+  {  6,  0,   800 }, {  5,  0,   216 }, {  5,  0,   294 }, {  6,  0,   591 },
+  {  7,  0,  1879 }, {  9,  0,   141 }, {  9,  0,   270 }, {  9,  0,   679 },
+  { 10,  0,   159 }, { 11,  0,   197 }, { 11,  0,   438 }, { 12,  0,   538 },
+  { 12,  0,   559 }, { 14,  0,   144 }, { 14,  0,   167 }, { 15,  0,    67 },
+  {  4, 10,   285 }, {  5, 10,   317 }, {  6, 10,   301 }, {  7, 10,     7 },
+  {  8, 10,   153 }, { 10, 10,   766 }, { 11, 10,   468 }, { 12, 10,   467 },
+  { 13, 10,   143 }, {  8,  0,   945 }, {  6,  0,  1090 }, {  9,  0,    81 },
+  { 12, 11,   468 }, { 19, 11,    96 }, { 20, 11,    24 }, {  6,  0,   391 },
+  { 10, 11,   241 }, {  7,  0,   322 }, {  8,  0,   249 }, {  6,  0,  1412 },
+  {  7, 11,   795 }, {  5,  0,   632 }, { 10,  0,   526 }, {  8, 10,   819 },
+  {  6,  0,   144 }, {  7,  0,   948 }, {  7,  0,  1042 }, {  8,  0,   235 },
+  {  8,  0,   461 }, {  9,  0,   453 }, {  9,  0,   796 }, { 10,  0,   354 },
+  { 17,  0,    77 }, {  7, 11,   954 }, { 11, 10,   917 }, {  6,  0,   940 },
+  {  6,  0,  1228 }, {  4,  0,   362 }, {  7,  0,    52 }, {  7,  0,   303 },
+  {  6, 11,   549 }, {  8, 11,    34 }, {  8, 11,   283 }, {  9, 11,   165 },
+  { 10, 11,   475 }, {  7, 11,   370 }, {  7, 11,  1007 }, {  7, 11,  1177 },
+  {  7, 11,  1565 }, {  5, 11,   652 }, {  5, 11,   701 }, {  7, 11,   449 },
+  {  5,  0,   196 }, {  6,  0,   486 }, {  7,  0,   212 }, {  8,  0,   309 },
+  {  8,  0,   346 }, {  6, 10,  1719 }, {  6, 10,  1735 }, {  7, 10,  2016 },
+  {  7, 10,  2020 }, {  8, 10,   837 }, {  9, 10,   852 }, {  6, 11,   159 },
+  {  6, 11,   364 }, {  7, 11,   516 }, {  7, 11,  1439 }, {  9, 11,   518 },
+  {  7,  0,  1912 }, {  7,  0,  1290 }, {  4,  0,   686 }, { 13, 11,   151 },
+  { 10,  0,   625 }, {  8,  0,   706 }, { 10, 10,   568 }, { 11,  0,   412 },
+  {  4,  0,    30 }, {  5,  0,    43 }, {  8, 10,    67 }, { 10, 10,   419 },
+  {  7,  0,   967 }, { 13,  0,    11 }, { 12,  0,   758 }, { 14,  0,   441 },
+  { 14,  0,   462 }, { 10, 10,   657 }, { 14, 10,   297 }, { 14, 10,   361 },
+  { 11, 10,   729 }, {  4,  0,   220 }, {  7,  0,  1535 }, {  7, 11,   501 },
+  {  9, 11,   111 }, { 10, 11,   141 }, { 11, 11,   332 }, { 13, 11,    43 },
+  { 13, 11,   429 }, { 14, 11,   130 }, { 14, 11,   415 }, { 17, 11,   102 },
+  {  4,  0,   950 }, {  6,  0,  1859 }, {  7,  0,    11 }, {  8,  0,   873 },
+  { 12,  0,   710 }, { 12,  0,   718 }, { 12,  0,   748 }, { 12,  0,   765 },
+  { 20,  0,   124 }, {  5, 11,   149 }, {  5, 11,   935 }, {  8, 11,   233 },
+  { 14, 11,   291 }, {  6,  0,  1579 }, {  7,  0,   890 }, {  8, 10,    51 },
+  {  9, 10,   868 }, { 10, 10,   833 }, { 12, 10,   481 }, { 12, 10,   570 },
+  { 20, 10,   106 }, { 13,  0,     2 }, {  4, 10,   445 }, {  8, 11,   801 },
+  {  7,  0,  1774 }, {  7,  0,  1725 }, { 10,  0,   393 }, {  5,  0,   263 },
+  {  6,  0,   414 }, {  4, 11,   322 }, {  5, 10,   239 }, {  7,  0,   456 },
+  {  7, 10,  1990 }, {  8, 10,   130 }, { 11, 10,   720 }, {  9,  0,   818 },
+  {  5, 10,   123 }, {  6, 10,   530 }, {  7, 10,   348 }, {  7, 10,  1419 },
+  {  7, 10,  2024 }, {  6,  0,   178 }, {  6,  0,  1750 }, {  8,  0,   251 },
+  {  9,  0,   690 }, { 10,  0,   155 }, { 10,  0,   196 }, { 10,  0,   373 },
+  { 11,  0,   698 }, { 13,  0,   155 }, { 20,  0,    93 }, {  5,  0,    97 },
+  {  9,  0,   393 }, {  6,  0,   674 }, { 11,  0,   223 }, { 12,  0,   168 },
+  {  4, 10,   210 }, { 11, 11,   464 }, {  6,  0,  1639 }, { 18,  0,   159 },
+  { 11, 11,     2 }, {  7,  0,   934 }, {  8,  0,   647 }, { 17,  0,    97 },
+  { 19,  0,    59 }, { 22,  0,     2 }, {  4,  0,   191 }, {  5,  0,   165 },
+  {  9,  0,   346 }, { 10,  0,   655 }, { 11,  0,   885 }, {  4, 10,   430 },
+  {  7, 11,   357 }, {  5,  0,   877 }, {  5, 10,   213 }, {  5, 11,   406 },
+  {  8,  0,   128 }, { 11,  0,   179 }, {  6, 11,    69 }, {  7, 11,   117 },
+  {  7,  0,  1297 }, { 11, 11,    43 }, { 13, 11,    72 }, { 13, 11,   142 },
+  {  7, 11,  1830 }, { 14,  0,   164 }, {  5,  0,    57 }, {  6,  0,   101 },
+  {  6,  0,   586 }, {  6,  0,  1663 }, {  7,  0,   132 }, {  7,  0,  1154 },
+  {  7,  0,  1415 }, {  7,  0,  1507 }, { 12,  0,   493 }, { 15,  0,   105 },
+  { 23,  0,    15 }, {  5,  0,   459 }, {  7,  0,  1073 }, {  8,  0,   241 },
+  {  8,  0,   334 }, {  5, 11,   826 }, {  5, 10,   108 }, {  5, 10,   219 },
+  { 10, 11,   132 }, { 11, 11,   191 }, { 11, 11,   358 }, { 11, 11,   460 },
+  {  6,  0,   324 }, {  6,  0,   520 }, {  7,  0,   338 }, {  7,  0,  1729 },
+  {  8,  0,   228 }, { 11,  0,   750 }, { 21,  0,    30 }, { 22,  0,    53 },
+  {  4, 10,   193 }, {  5, 10,   916 }, {  7, 10,   364 }, { 10, 10,   398 },
+  { 10, 10,   726 }, { 11, 10,   317 }, { 11, 10,   626 }, { 12, 10,   142 },
+  { 12, 10,   288 }, { 12, 10,   678 }, { 13, 10,   313 }, { 15, 10,   113 },
+  { 18, 10,   114 }, {  6, 11,   110 }, {  7, 11,  1681 }, {  7,  0,   910 },
+  {  6, 10,   241 }, {  7, 10,   907 }, {  8, 10,   832 }, {  9, 10,   342 },
+  { 10, 10,   729 }, { 11, 10,   284 }, { 11, 10,   445 }, { 11, 10,   651 },
+  { 11, 10,   863 }, { 13, 10,   398 }, { 18, 10,    99 }, {  7,  0,   705 },
+  {  9,  0,   734 }, {  5, 11,  1000 }, {  7, 11,   733 }, {  9, 11,   583 },
+  {  4,  0,    73 }, {  6,  0,   612 }, {  7,  0,   927 }, {  7,  0,  1822 },
+  {  8,  0,   217 }, {  9,  0,   765 }, {  9,  0,   766 }, { 10,  0,   408 },
+  { 11,  0,    51 }, { 11,  0,   793 }, { 12,  0,   266 }, { 15,  0,   158 },
+  { 20,  0,    89 }, { 22,  0,    32 }, {  7,  0,  1330 }, {  4, 11,   297 },
+  {  6, 11,   529 }, {  7, 11,   152 }, {  7, 11,   713 }, {  7, 11,  1845 },
+  {  8, 11,   710 }, {  8, 11,   717 }, { 12, 11,   639 }, {  5,  0,   389 },
+  {  8,  0,   636 }, {  6,  0,  1409 }, {  4, 10,   562 }, {  9, 10,   254 },
+  { 11, 10,   879 }, {  6,  0,   893 }, {  4, 10,   786 }, {  4, 11,   520 },
+  {  7, 11,   575 }, {  8,  0,    21 }, { 12,  0,   721 }, {  8,  0,   959 },
+  {  7, 11,  1428 }, {  7, 11,  1640 }, {  9, 11,   169 }, {  9, 11,   182 },
+  {  9, 11,   367 }, {  9, 11,   478 }, {  9, 11,   506 }, {  9, 11,   551 },
+  {  9, 11,   648 }, {  9, 11,   651 }, {  9, 11,   697 }, {  9, 11,   705 },
+  {  9, 11,   725 }, {  9, 11,   787 }, {  9, 11,   794 }, { 10, 11,   198 },
+  { 10, 11,   214 }, { 10, 11,   267 }, { 10, 11,   275 }, { 10, 11,   456 },
+  { 10, 11,   551 }, { 10, 11,   561 }, { 10, 11,   613 }, { 10, 11,   627 },
+  { 10, 11,   668 }, { 10, 11,   675 }, { 10, 11,   691 }, { 10, 11,   695 },
+  { 10, 11,   707 }, { 10, 11,   715 }, { 11, 11,   183 }, { 11, 11,   201 },
+  { 11, 11,   244 }, { 11, 11,   262 }, { 11, 11,   352 }, { 11, 11,   439 },
+  { 11, 11,   493 }, { 11, 11,   572 }, { 11, 11,   591 }, { 11, 11,   608 },
+  { 11, 11,   611 }, { 11, 11,   646 }, { 11, 11,   674 }, { 11, 11,   711 },
+  { 11, 11,   751 }, { 11, 11,   761 }, { 11, 11,   776 }, { 11, 11,   785 },
+  { 11, 11,   850 }, { 11, 11,   853 }, { 11, 11,   862 }, { 11, 11,   865 },
+  { 11, 11,   868 }, { 11, 11,   898 }, { 11, 11,   902 }, { 11, 11,   903 },
+  { 11, 11,   910 }, { 11, 11,   932 }, { 11, 11,   942 }, { 11, 11,   957 },
+  { 11, 11,   967 }, { 11, 11,   972 }, { 12, 11,   148 }, { 12, 11,   195 },
+  { 12, 11,   220 }, { 12, 11,   237 }, { 12, 11,   318 }, { 12, 11,   339 },
+  { 12, 11,   393 }, { 12, 11,   445 }, { 12, 11,   450 }, { 12, 11,   474 },
+  { 12, 11,   509 }, { 12, 11,   533 }, { 12, 11,   591 }, { 12, 11,   594 },
+  { 12, 11,   597 }, { 12, 11,   621 }, { 12, 11,   633 }, { 12, 11,   642 },
+  { 13, 11,    59 }, { 13, 11,    60 }, { 13, 11,   145 }, { 13, 11,   239 },
+  { 13, 11,   250 }, { 13, 11,   273 }, { 13, 11,   329 }, { 13, 11,   344 },
+  { 13, 11,   365 }, { 13, 11,   372 }, { 13, 11,   387 }, { 13, 11,   403 },
+  { 13, 11,   414 }, { 13, 11,   456 }, { 13, 11,   478 }, { 13, 11,   483 },
+  { 13, 11,   489 }, { 14, 11,    55 }, { 14, 11,    57 }, { 14, 11,    81 },
+  { 14, 11,    90 }, { 14, 11,   148 }, { 14, 11,   239 }, { 14, 11,   266 },
+  { 14, 11,   321 }, { 14, 11,   326 }, { 14, 11,   327 }, { 14, 11,   330 },
+  { 14, 11,   347 }, { 14, 11,   355 }, { 14, 11,   401 }, { 14, 11,   411 },
+  { 14, 11,   414 }, { 14, 11,   416 }, { 14, 11,   420 }, { 15, 11,    61 },
+  { 15, 11,    74 }, { 15, 11,    87 }, { 15, 11,    88 }, { 15, 11,    94 },
+  { 15, 11,    96 }, { 15, 11,   116 }, { 15, 11,   149 }, { 15, 11,   154 },
+  { 16, 11,    50 }, { 16, 11,    63 }, { 16, 11,    73 }, { 17, 11,     2 },
+  { 17, 11,    66 }, { 17, 11,    92 }, { 17, 11,   103 }, { 17, 11,   112 },
+  { 18, 11,    50 }, { 18, 11,    54 }, { 18, 11,    82 }, { 18, 11,    86 },
+  { 18, 11,    90 }, { 18, 11,   111 }, { 18, 11,   115 }, { 18, 11,   156 },
+  { 19, 11,    40 }, { 19, 11,    79 }, { 20, 11,    78 }, { 21, 11,    22 },
+  {  9, 11,   170 }, {  6,  0,  1433 }, {  7, 11,  1307 }, { 11, 11,   411 },
+  {  5,  0,   189 }, {  7,  0,   442 }, {  7,  0,   443 }, {  8,  0,   281 },
+  { 12,  0,   174 }, { 13,  0,   261 }, {  6, 10,   216 }, {  7, 10,   901 },
+  {  7, 10,  1343 }, {  8, 10,   493 }, {  5, 11,   397 }, {  6, 11,   154 },
+  {  7, 10,   341 }, {  7, 11,   676 }, {  8, 11,   443 }, {  8, 11,   609 },
+  {  9, 11,    24 }, {  9, 11,   325 }, { 10, 11,    35 }, { 11, 10,   219 },
+  { 11, 11,   535 }, { 11, 11,   672 }, { 11, 11,  1018 }, { 12, 11,   637 },
+  { 16, 11,    30 }, {  6,  0,     2 }, {  7,  0,   191 }, {  7,  0,   446 },
+  {  7,  0,  1262 }, {  7,  0,  1737 }, {  8,  0,    22 }, {  8,  0,   270 },
+  {  8,  0,   612 }, {  9,  0,     4 }, {  9,  0,   312 }, {  9,  0,   436 },
+  {  9,  0,   626 }, { 10,  0,   216 }, { 10,  0,   311 }, { 10,  0,   521 },
+  { 10,  0,   623 }, { 11,  0,    72 }, { 11,  0,   330 }, { 11,  0,   455 },
+  { 12,  0,   321 }, { 12,  0,   504 }, { 12,  0,   530 }, { 12,  0,   543 },
+  { 13,  0,    17 }, { 13,  0,   156 }, { 13,  0,   334 }, { 14,  0,   131 },
+  { 17,  0,    60 }, { 20,  0,    64 }, {  7,  0,   354 }, { 10,  0,   410 },
+  { 11,  0,   815 }, { 11, 10,   130 }, {  7, 10,  1734 }, {  9, 11,   631 },
+  { 12,  0,   425 }, { 15,  0,   112 }, { 10, 10,   115 }, { 11, 10,   420 },
+  { 13, 10,   404 }, { 14, 10,   346 }, { 15, 10,    54 }, {  6,  0,    60 },
+  {  6,  0,   166 }, {  7,  0,   374 }, {  7,  0,   670 }, {  7,  0,  1327 },
+  {  8,  0,   411 }, {  8,  0,   435 }, {  9,  0,   653 }, {  9,  0,   740 },
+  { 10,  0,   385 }, { 11,  0,   222 }, { 11,  0,   324 }, { 11,  0,   829 },
+  { 12,  0,   611 }, {  7,  0,  1611 }, { 13,  0,    14 }, { 15,  0,    44 },
+  { 19,  0,    13 }, { 20,  0,    76 }, {  5, 11,   981 }, {  4, 11,    56 },
+  {  7, 11,  1791 }, {  8, 11,   607 }, {  8, 11,   651 }, { 11, 11,   465 },
+  { 11, 11,   835 }, { 12, 11,   337 }, { 13, 11,   480 }, {  6,  0,  1478 },
+  {  5, 10,  1011 }, {  8, 10,   701 }, { 11,  0,   596 }, {  5,  0,   206 },
+  {  6,  0,   398 }, {  4, 10,    54 }, {  5, 10,   666 }, {  7, 10,  1039 },
+  {  7, 10,  1130 }, {  9, 10,   195 }, { 10, 10,   302 }, {  7,  0,    50 },
+  {  9, 11,   158 }, { 10, 11,   411 }, {  7, 11,  1120 }, {  6,  0,   517 },
+  {  7,  0,  1159 }, { 10,  0,   621 }, { 11,  0,   192 }, {  6, 10,  1669 },
+  {  4,  0,   592 }, {  6,  0,   600 }, {  7,  0,  1653 }, { 10,  0,   223 },
+  { 11,  0,   645 }, {  8, 11,   139 }, {  7,  0,    64 }, {  8,  0,   245 },
+  { 14,  0,   278 }, {  6, 11,   622 }, {  7, 11,  1030 }, {  8,  0,   604 },
+  {  6,  0,  1502 }, { 10,  0,   265 }, { 13, 11,   168 }, {  7,  0,  1763 },
+  { 12,  0,   310 }, {  7, 10,   798 }, { 11, 11,   719 }, {  7, 11,   160 },
+  { 10, 11,   624 }, { 14, 11,   279 }, {  4, 11,   363 }, {  7, 10,   122 },
+  {  9, 10,   259 }, { 10, 10,    84 }, { 11, 10,   470 }, { 12, 10,   541 },
+  { 13, 10,   379 }, {  5,  0,   129 }, {  6,  0,    61 }, {  7,  0,   947 },
+  {  6,  0,  1356 }, {  7, 11,  1191 }, { 13,  0,   505 }, { 13,  0,   506 },
+  { 11,  0,  1000 }, {  5, 10,    82 }, {  5, 10,   131 }, {  7, 10,  1755 },
+  {  8, 10,    31 }, {  9, 10,   168 }, {  9, 10,   764 }, { 11, 10,   869 },
+  {  6,  0,   966 }, {  6, 10,   605 }, {  6, 11,   292 }, {  5, 11,   177 },
+  {  6, 11,   616 }, {  7, 11,   827 }, {  9, 11,   525 }, { 10, 11,   656 },
+  {  7, 11,  1486 }, { 10, 11,    31 }, {  5, 10,   278 }, {  9, 10,    68 },
+  {  4, 10,   163 }, {  5, 10,   201 }, {  5, 10,   307 }, {  5, 10,   310 },
+  {  6, 10,   335 }, {  7, 10,   284 }, {  8, 10,   165 }, {  6,  0,   839 },
+  {  7, 10,  1660 }, {  8, 10,   781 }, {  6, 10,    33 }, {  7, 10,  1244 },
+  {  5,  0,   637 }, {  4, 11,   161 }, {  5, 11,   631 }, {  9,  0,   590 },
+  {  7, 10,  1953 }, {  8, 10,   720 }, {  5,  0,   280 }, {  7,  0,  1226 },
+  { 10, 10,   203 }, {  6,  0,  1386 }, {  5,  0,   281 }, {  6,  0,  1026 },
+  {  6, 10,   326 }, {  7, 10,   677 }, {  9, 10,   425 }, {  7, 11,  1557 },
+  {  7, 11,  1684 }, {  7,  0,  1064 }, {  9, 11,   469 }, {  9, 11,   709 },
+  { 12, 11,   512 }, { 14, 11,    65 }, { 17, 11,    12 }, {  6,  0,   917 },
+  { 10, 11,   229 }, { 11, 11,    73 }, { 11, 11,   376 }, { 11, 11,   433 },
+  {  7,  0,   555 }, {  9,  0,   192 }, { 13,  0,    30 }, { 13,  0,    49 },
+  { 15,  0,   150 }, { 16,  0,    76 }, { 20,  0,    52 }, {  7, 10,  1316 },
+  {  7, 10,  1412 }, {  7, 10,  1839 }, {  9, 10,   589 }, { 11, 10,   241 },
+  { 11, 10,   676 }, { 11, 10,   811 }, { 11, 10,   891 }, { 12, 10,   140 },
+  { 12, 10,   346 }, { 12, 10,   479 }, { 13, 10,   381 }, { 14, 10,   188 },
+  { 18, 10,    30 }, { 21,  0,    15 }, {  6,  0,  1882 }, {  6,  0,  1883 },
+  {  6,  0,  1897 }, {  9,  0,   945 }, {  9,  0,  1014 }, {  9,  0,  1020 },
+  { 12,  0,   823 }, { 12,  0,   842 }, { 12,  0,   866 }, { 12,  0,   934 },
+  { 15,  0,   242 }, { 18,  0,   208 }, {  6,  0,   965 }, {  6,  0,  1499 },
+  {  7,  0,    33 }, {  7,  0,   120 }, {  8,  0,   489 }, {  9,  0,   319 },
+  { 10,  0,   820 }, { 11,  0,  1004 }, { 12,  0,   379 }, { 12,  0,   679 },
+  { 13,  0,   117 }, { 13,  0,   412 }, { 14,  0,    25 }, { 15,  0,    52 },
+  { 15,  0,   161 }, { 16,  0,    47 }, { 21,  0,     2 }, {  6, 11,   558 },
+  {  7, 11,   651 }, {  8, 11,   421 }, {  9, 11,     0 }, { 10, 11,    34 },
+  {  4,  0,   937 }, {  5,  0,   801 }, {  7,  0,   473 }, {  5, 10,   358 },
+  {  7, 10,  1184 }, { 10, 10,   662 }, { 13, 10,   212 }, { 13, 10,   304 },
+  { 13, 10,   333 }, { 17, 10,    98 }, {  4,  0,   877 }, {  6,  0,   693 },
+  {  6,  0,   824 }, {  4,  0,   365 }, {  7, 11,  1832 }, { 10, 11,   374 },
+  {  5,  0,     7 }, { 11,  0,   774 }, {  4,  0,   734 }, {  5,  0,   662 },
+  {  6,  0,   430 }, {  4,  0,   746 }, {  7,  0,  1090 }, {  5,  0,   360 },
+  {  8,  0,   237 }, { 10,  0,   231 }, { 19,  0,   124 }, { 10, 11,   348 },
+  {  6, 11,     6 }, {  7, 11,    81 }, {  7, 11,   771 }, {  7, 11,  1731 },
+  {  9, 11,   405 }, { 10, 11,   421 }, {  6,  0,   740 }, {  9,  0,   822 },
+  {  5, 10,   946 }, {  7,  0,  1485 }, {  8,  0,   929 }, {  7, 10,   411 },
+  {  8, 10,   631 }, {  9, 10,   323 }, { 10, 10,   355 }, { 11, 10,   491 },
+  { 12, 10,   143 }, { 12, 10,   402 }, { 13, 10,    73 }, { 14, 10,   408 },
+  { 15, 10,   107 }, { 18, 10,    71 }, {  7, 10,   590 }, {  5, 11,   881 },
+  {  5, 11,   885 }, { 22, 11,    25 }, {  4,  0,   852 }, {  5, 11,   142 },
+  {  6, 11,   546 }, {  7, 10,  1467 }, {  8, 10,   328 }, { 10, 10,   544 },
+  { 11, 10,   955 }, { 13, 10,   320 }, { 17, 10,    83 }, {  9,  0,    17 },
+  { 10,  0,   291 }, { 11, 10,   511 }, { 13, 10,   394 }, { 14, 10,   298 },
+  { 14, 10,   318 }, { 18, 10,   103 }, {  5, 11,   466 }, { 11, 11,   571 },
+  { 12, 11,   198 }, { 13, 11,   283 }, { 14, 11,   186 }, { 15, 11,    21 },
+  { 15, 11,   103 }, {  6,  0,  1001 }, {  4, 11,   185 }, {  5, 11,   257 },
+  {  5, 11,   839 }, {  5, 11,   936 }, {  7, 11,   171 }, {  9, 11,   399 },
+  { 10, 11,   258 }, { 10, 11,   395 }, { 10, 11,   734 }, { 11, 11,  1014 },
+  { 12, 11,    23 }, { 13, 11,   350 }, { 14, 11,   150 }, { 19, 11,     6 },
+  { 15,  0,    35 }, {  4,  0,   831 }, {  5, 10,   835 }, {  6, 10,   483 },
+  {  4,  0,   277 }, {  5,  0,   608 }, {  6,  0,   493 }, {  7,  0,   457 },
+  { 12,  0,   384 }, {  7, 11,   404 }, {  7, 11,  1377 }, {  7, 11,  1430 },
+  {  7, 11,  2017 }, {  8, 11,   149 }, {  8, 11,   239 }, {  8, 11,   512 },
+  {  8, 11,   793 }, {  8, 11,   818 }, {  9, 11,   474 }, {  9, 11,   595 },
+  { 10, 11,   122 }, { 10, 11,   565 }, { 10, 11,   649 }, { 10, 11,   783 },
+  { 11, 11,   239 }, { 11, 11,   295 }, { 11, 11,   447 }, { 11, 11,   528 },
+  { 11, 11,   639 }, { 11, 11,   800 }, { 11, 11,   936 }, { 12, 11,    25 },
+  { 12, 11,    73 }, { 12, 11,    77 }, { 12, 11,   157 }, { 12, 11,   316 },
+  { 12, 11,   390 }, { 12, 11,   391 }, { 12, 11,   394 }, { 12, 11,   395 },
+  { 12, 11,   478 }, { 12, 11,   503 }, { 12, 11,   592 }, { 12, 11,   680 },
+  { 13, 11,    50 }, { 13, 11,    53 }, { 13, 11,   132 }, { 13, 11,   198 },
+  { 13, 11,   275 }, { 13, 11,   322 }, { 13, 11,   415 }, { 14, 11,    71 },
+  { 14, 11,   257 }, { 14, 11,   395 }, { 15, 11,    71 }, { 15, 11,   136 },
+  { 17, 11,   123 }, { 18, 11,    93 }, { 19, 11,    58 }, {  6,  0,  1351 },
+  {  7,  0,    27 }, {  7,  0,   316 }, {  8, 11,   712 }, {  8,  0,   984 },
+  {  5,  0,   552 }, {  9,  0,   264 }, {  4,  0,   401 }, {  6,  0,   710 },
+  {  6,  0,  1111 }, {  6,  0,  1343 }, {  6,  0,  1211 }, {  9,  0,   543 },
+  { 10,  0,   524 }, { 11,  0,   108 }, { 11,  0,   653 }, { 12,  0,   524 },
+  { 13,  0,   123 }, { 14,  0,   252 }, { 16,  0,    18 }, { 19,  0,    38 },
+  { 20,  0,    26 }, { 20,  0,    65 }, { 21,  0,     3 }, { 23,  0,    11 },
+  {  4,  0,   205 }, {  5,  0,   623 }, {  7,  0,   104 }, {  8,  0,   519 },
+  {  9,  0,   716 }, {  4, 10,   677 }, {  4, 11,   377 }, { 24, 11,    13 },
+  {  7, 11,  1673 }, {  7,  0,   579 }, {  9,  0,    41 }, {  9,  0,   244 },
+  {  9,  0,   669 }, { 10,  0,     5 }, { 11,  0,   861 }, { 11,  0,   951 },
+  { 11,  0,   980 }, {  4,  0,   717 }, {  8,  0,  1011 }, {  4,  0,   805 },
+  {  4, 11,   180 }, {  7, 11,  1906 }, {  4, 10,   777 }, {  4, 10,   331 },
+  {  4,  0,   489 }, {  6,  0,  1024 }, {  4, 11,   491 }, {  5, 10,   747 },
+  {  7, 11,  1182 }, {  4, 11,   171 }, { 10, 11,   234 }, {  4, 11,   586 },
+  {  7, 11,  1186 }, { 10, 11,   631 }, {  7,  0,   892 }, {  7, 11,   336 },
+  {  9, 11,   931 }, { 10, 11,   334 }, { 20, 11,    71 }, {  9,  0,   473 },
+  {  6,  0,   864 }, { 12,  0,   659 }, { 11, 11,   926 }, {  7,  0,   819 },
+  {  9,  0,    26 }, {  9,  0,   392 }, { 10,  0,   152 }, { 10,  0,   226 },
+  { 11,  0,    19 }, { 12,  0,   276 }, { 12,  0,   426 }, { 12,  0,   589 },
+  { 13,  0,   460 }, { 15,  0,    97 }, { 19,  0,    48 }, { 20,  0,   104 },
+  {  7,  0,    51 }, {  5, 10,   326 }, {  4, 10,   691 }, { 18, 10,    16 },
+  {  9,  0,   130 }, { 11,  0,   765 }, { 10, 10,   680 }, { 10, 10,   793 },
+  { 13, 10,   357 }, {  5, 11,   765 }, {  8,  0,   229 }, {  6, 10,    32 },
+  {  7, 10,   385 }, {  7, 10,   757 }, {  7, 10,  1916 }, {  8, 10,    94 },
+  {  8, 10,   711 }, {  9, 10,   541 }, { 10, 10,   162 }, { 10, 10,   795 },
+  { 11, 10,   989 }, { 11, 10,  1010 }, { 12, 10,    14 }, { 14, 10,   308 },
+  {  7, 11,   474 }, {  9, 11,   578 }, {  4,  0,   674 }, {  4,  0,   770 },
+  {  5,  0,    79 }, {  7,  0,  1027 }, {  7,  0,  1477 }, { 11,  0,    52 },
+  {  5, 11,   424 }, {  6,  0,  1666 }, {  6,  0,   409 }, {  6, 10,   349 },
+  {  6, 10,  1682 }, {  7, 10,  1252 }, {  8, 10,   112 }, {  8, 11,   714 },
+  {  9, 10,   435 }, {  9, 10,   668 }, { 10, 10,   290 }, { 10, 10,   319 },
+  { 10, 10,   815 }, { 11, 10,   180 }, { 11, 10,   837 }, { 12, 10,   240 },
+  { 13, 10,   152 }, { 13, 10,   219 }, { 14, 10,   158 }, {  5,  0,   789 },
+  {  6,  0,   195 }, {  4,  0,   251 }, {  4,  0,   688 }, {  7,  0,   513 },
+  {  7,  0,  1284 }, {  4, 10,   581 }, {  9, 11,   420 }, { 10, 11,   269 },
+  { 10, 11,   285 }, { 10, 11,   576 }, { 11, 11,   397 }, { 13, 11,   175 },
+  { 17, 11,    90 }, {  6, 10,   126 }, {  7, 10,   573 }, {  8, 10,   397 },
+  { 14, 10,    44 }, {  4, 11,   429 }, {  5,  0,   889 }, {  4,  0,   160 },
+  {  5,  0,   330 }, {  7,  0,  1434 }, {  8,  0,   174 }, {  7, 11,    18 },
+  {  7, 11,   699 }, {  7, 11,  1966 }, {  8, 11,   752 }, {  9, 11,   273 },
+  {  9, 11,   412 }, {  9, 11,   703 }, { 10, 11,    71 }, { 10, 11,   427 },
+  { 10, 11,   508 }, { 18, 11,    97 }, {  6,  0,   872 }, {  6,  0,   899 },
+  {  5, 10,   926 }, {  6,  0,  1126 }, {  6,  0,   918 }, {  4, 11,    53 },
+  {  5, 11,   186 }, {  7, 11,   752 }, {  7,  0,   268 }, {  8,  0,   569 },
+  {  6,  0,  1224 }, {  6,  0,  1361 }, {  7, 10,  1232 }, {  9, 10,   531 },
+  {  8, 11,   575 }, { 10, 11,   289 }, { 11, 11,   319 }, {  5, 10,   670 },
+  {  4, 11,   675 }, {  5,  0,   374 }, {  7, 10,  1957 }, {  5,  0,   731 },
+  { 11,  0,   190 }, { 15,  0,    49 }, { 11, 11,   190 }, { 15, 11,    49 },
+  {  4,  0,   626 }, {  5,  0,   506 }, {  5,  0,   642 }, {  6,  0,   425 },
+  { 10,  0,   202 }, { 11,  0,   141 }, {  9,  0,   444 }, {  7, 10,   242 },
+  {  7, 10,  1942 }, {  6, 11,   209 }, {  8, 11,   468 }, {  9, 11,   210 },
+  { 11, 11,    36 }, { 12, 11,    28 }, { 12, 11,   630 }, { 13, 11,    21 },
+  { 13, 11,   349 }, { 14, 11,     7 }, { 17, 11,    13 }, {  4, 11,   342 },
+  {  7, 11,  1179 }, {  5, 10,   834 }, {  7, 10,  1202 }, {  8, 10,    14 },
+  {  9, 10,   481 }, {  9, 10,   880 }, {  4, 11,   928 }, {  5, 11,   910 },
+  {  4, 11,   318 }, {  4, 11,   496 }, {  7, 11,   856 }, { 11, 11,   654 },
+  {  8,  0,   835 }, {  7,  0,  1526 }, { 10, 10,   465 }, { 23,  0,    17 },
+  {  7,  0,   477 }, {  4, 10,   357 }, {  6, 10,   172 }, {  7, 10,   143 },
+  {  9, 10,   413 }, {  6,  0,  1374 }, { 10,  0,   994 }, { 18,  0,    76 },
+  {  4, 10,   590 }, {  7,  0,   287 }, {  8,  0,   355 }, {  9,  0,   293 },
+  {  9,  0,   743 }, {  6,  0,  1389 }, {  7, 11,   915 }, {  8, 11,   247 },
+  { 19, 11,     0 }, {  4, 11,   202 }, {  5, 11,   382 }, {  6, 11,   454 },
+  {  7, 11,   936 }, {  7, 11,  1803 }, {  8, 11,   758 }, {  9, 11,   375 },
+  {  9, 11,   895 }, { 10, 11,   743 }, { 10, 11,   792 }, { 11, 11,   978 },
+  { 11, 11,  1012 }, { 14, 11,   109 }, {  5,  0,   384 }, {  8,  0,   455 },
+  { 12,  0,    48 }, {  4, 11,   390 }, {  5, 10,   169 }, {  7, 10,   333 },
+  {  8, 10,    45 }, {  5,  0,   264 }, {  6,  0,   184 }, { 10, 11,   791 },
+  {  5, 11,   717 }, {  4, 10,   198 }, {  6, 11,   445 }, {  7, 11,   332 },
+  {  9, 11,   909 }, {  8,  0,  1001 }, {  4, 10,    24 }, {  5, 10,   140 },
+  {  5, 10,   185 }, {  7, 10,  1500 }, { 11, 10,   565 }, { 11, 10,   838 },
+  {  6, 11,   578 }, {  5,  0,   633 }, {  6,  0,    28 }, {  7,  0,  1323 },
+  {  4,  0,   851 }, {  8, 11,   267 }, {  7,  0,   359 }, {  8,  0,   243 },
+  { 12,  0,   175 }, {  4, 10,   334 }, {  5, 10,   593 }, { 13, 11,    87 },
+  {  8, 11,   766 }, { 10,  0,   287 }, { 12,  0,   138 }, { 10, 11,   287 },
+  { 12, 11,   138 }, {  4,  0,   105 }, {  4,  0,   740 }, { 12, 10,   116 },
+  {  6,  0,   857 }, {  7, 11,  1841 }, {  6,  0,  1402 }, {  9,  0,   819 },
+  {  4, 11,   584 }, {  4, 10,   709 }, {  5, 10,   897 }, {  5,  0,   224 },
+  { 13,  0,   174 }, { 18,  0,    52 }, {  7, 10,  1840 }, {  4, 10,   608 },
+  {  5, 10,   497 }, { 11, 11,    60 }, {  4,  0,   758 }, {  7,  0,  1649 },
+  {  4, 11,   226 }, {  4, 11,   326 }, {  7, 11,  1770 }, {  5, 11,   426 },
+  {  8, 11,    30 }, {  9, 11,     2 }, { 11, 11,   549 }, { 19, 11,   122 },
+  {  7, 10,  2039 }, {  6, 10,   540 }, {  8, 10,   136 }, {  4,  0,   573 },
+  {  8,  0,   655 }, {  4, 10,   897 }, {  5, 10,   786 }, {  7,  0,   351 },
+  { 11,  0,   128 }, {  5, 10,   999 }, {  4, 10,   299 }, {  7, 10,  1004 },
+  {  5,  0,   918 }, {  4, 11,   345 }, {  4, 11,   385 }, {  7, 11,   265 },
+  {  7, 11,   587 }, {  5, 10,   456 }, {  8, 10,   180 }, {  6,  0,   687 },
+  {  6,  0,  1537 }, {  4, 11,   347 }, {  5, 11,   423 }, {  5, 11,   996 },
+  {  7, 11,  1329 }, {  4, 10,   755 }, {  7, 11,  1259 }, {  9, 11,   125 },
+  { 11, 11,    65 }, { 12, 11,   285 }, {  5, 11,   136 }, {  6, 11,   136 },
+  {  8, 11,   644 }, {  6,  0,  1525 }, {  4,  0,  1009 }, {  7,  0,  1139 },
+  { 11, 10,   338 }, {  4,  0,   340 }, {  7, 10,  1464 }, {  8,  0,   847 },
+  { 10,  0,   861 }, { 10,  0,   876 }, { 10,  0,   889 }, { 10,  0,   922 },
+  { 10,  0,   929 }, { 10,  0,   933 }, { 12,  0,   784 }, { 12,  0,   791 },
+  { 11,  0,   176 }, {  9, 11,   134 }, { 10, 11,     2 }, { 10, 11,    27 },
+  { 10, 11,   333 }, { 11, 11,   722 }, { 15, 11,     1 }, {  4, 11,   433 },
+  {  5, 11,   719 }, {  5,  0,   985 }, {  7,  0,   509 }, {  7,  0,   529 },
+  { 17,  0,    96 }, {  4,  0,   615 }, {  4, 10,   890 }, {  5, 10,   805 },
+  {  5, 10,   819 }, {  5, 10,   961 }, {  6, 10,   396 }, {  6, 10,  1631 },
+  {  6, 10,  1678 }, {  7, 10,  1967 }, {  7, 10,  2041 }, {  9, 10,   630 },
+  { 11, 10,     8 }, { 11, 10,  1019 }, { 12, 10,   176 }, { 13, 10,   225 },
+  { 14, 10,   292 }, { 21, 10,    24 }, {  7,  0,  1919 }, {  6,  0,  1131 },
+  { 16, 11,    21 }, { 16, 11,    51 }, {  7, 10,  1815 }, {  4,  0,   247 },
+  {  7, 10,  1505 }, { 10, 10,   190 }, { 10, 10,   634 }, { 11, 10,   792 },
+  { 12, 10,   358 }, { 12, 10,   447 }, {  5, 10,     0 }, {  6, 10,   536 },
+  {  7, 10,   604 }, { 13, 10,   445 }, { 17, 10,   126 }, {  4,  0,   184 },
+  {  5,  0,   390 }, {  6,  0,   337 }, {  7,  0,    23 }, {  7,  0,   494 },
+  {  7,  0,   618 }, {  7,  0,  1456 }, {  8,  0,    27 }, {  8,  0,   599 },
+  { 10,  0,   153 }, { 11,  0,   710 }, {  6, 10,   232 }, {  6, 10,   412 },
+  {  7, 10,  1074 }, {  8, 10,     9 }, {  8, 10,   157 }, {  8, 10,   786 },
+  {  9, 10,   196 }, {  9, 10,   352 }, {  9, 10,   457 }, { 10, 10,   337 },
+  { 11, 10,   232 }, { 11, 10,   877 }, { 12, 10,   480 }, { 12, 10,   546 },
+  { 13,  0,    38 }, {  7, 10,   958 }, {  4, 10,   382 }, {  8, 10,   579 },
+  {  4, 10,   212 }, {  7, 10,  1206 }, {  4, 11,   555 }, {  8, 11,   536 },
+  { 10, 11,   288 }, { 11, 11,   139 }, { 11, 11,   171 }, {  9, 11,   370 },
+  { 10, 11,    90 }, {  4,  0,  1015 }, {  6,  0,  1088 }, {  5, 10,   655 },
+  {  7, 11,   977 }, {  6,  0,  1585 }, { 17, 10,    67 }, { 19, 10,    74 },
+  { 10,  0,   227 }, { 11,  0,   497 }, { 11,  0,   709 }, { 12,  0,   415 },
+  {  6,  0,   360 }, {  7,  0,  1664 }, {  8,  0,   478 }, {  7,  0,    95 },
+  {  6, 10,   231 }, {  8, 10,   423 }, { 12, 11,    65 }, {  4, 11,   257 },
+  {  7, 11,  2031 }, {  7, 11,  1768 }, {  5, 10,   300 }, { 11, 11,   211 },
+  {  8,  0,   699 }, {  6, 10,   237 }, {  7, 10,   611 }, {  8, 10,   100 },
+  {  9, 10,   416 }, { 11, 10,   335 }, { 12, 10,   173 }, { 18, 10,   101 },
+  { 14,  0,    26 }, { 18,  0,   150 }, {  6,  0,   581 }, {  7,  0,  1119 },
+  {  7, 10,  1208 }, {  4,  0,   739 }, {  6, 11,    83 }, {  6, 11,  1733 },
+  {  7, 11,  1389 }, {  9,  0,   869 }, {  4,  0,    67 }, {  5,  0,   422 },
+  {  7,  0,  1037 }, {  7,  0,  1289 }, {  7,  0,  1555 }, {  9,  0,   741 },
+  { 17,  0,   108 }, {  5, 10,   199 }, { 12, 10,   427 }, { 18, 10,    38 },
+  {  8,  0,   464 }, { 14,  0,    42 }, { 10,  0,    96 }, {  8, 11,   501 },
+  {  9, 11,   696 }, {  6, 11,   592 }, {  4,  0,   512 }, {  4,  0,   966 },
+  {  5,  0,   342 }, {  6,  0,  1855 }, {  8,  0,   869 }, {  8,  0,   875 },
+  {  8,  0,   901 }, { 16,  0,    26 }, {  8,  0,   203 }, { 11,  0,   823 },
+  { 11,  0,   846 }, { 12,  0,   482 }, { 13,  0,   277 }, { 13,  0,   302 },
+  { 13,  0,   464 }, { 14,  0,   205 }, { 14,  0,   221 }, {  4,  0,   449 },
+  {  5,  0,   718 }, {  7, 11,  1718 }, {  9, 11,    95 }, {  9, 11,   274 },
+  { 10, 11,   279 }, { 10, 11,   317 }, { 10, 11,   420 }, { 11, 11,   303 },
+  { 11, 11,   808 }, { 12, 11,   134 }, { 12, 11,   367 }, { 13, 11,   149 },
+  { 13, 11,   347 }, { 14, 11,   349 }, { 14, 11,   406 }, { 18, 11,    22 },
+  { 18, 11,    89 }, { 18, 11,   122 }, { 19, 11,    47 }, {  5, 11,    26 },
+  {  4,  0,   355 }, {  6,  0,   311 }, {  9,  0,   256 }, { 10,  0,   404 },
+  {  4, 11,   550 }, { 10,  0,   758 }, {  6, 10,   312 }, {  6, 10,  1715 },
+  { 10, 10,   584 }, { 11, 10,   546 }, { 11, 10,   692 }, { 12, 10,   259 },
+  { 12, 10,   295 }, { 13, 10,    46 }, { 13, 10,   154 }, {  8, 11,   822 },
+  {  5,  0,   827 }, {  4, 11,   902 }, {  5, 11,   809 }, {  6, 11,   122 },
+  {  7, 11,   896 }, {  5,  0,    64 }, { 12,  0,   581 }, {  4,  0,   442 },
+  {  6,  0,   739 }, {  7,  0,  1047 }, {  7,  0,  1352 }, {  7,  0,  1643 },
+  {  7, 11,  1911 }, {  9, 11,   449 }, { 10, 11,   192 }, { 10, 11,   740 },
+  {  7, 11,   262 }, {  4, 10,   588 }, {  5, 11,   620 }, {  5,  0,   977 },
+  {  6,  0,   288 }, {  7,  0,   528 }, {  4, 11,    34 }, {  5, 11,   574 },
+  {  7, 11,   279 }, {  7, 11,  1624 }, {  8, 11,   601 }, {  6,  0,  1375 },
+  {  4, 10,   231 }, {  5, 10,    61 }, {  6, 10,   104 }, {  7, 10,   729 },
+  {  7, 10,   964 }, {  7, 10,  1658 }, { 12, 10,   414 }, {  6, 10,   263 },
+  { 10, 10,   757 }, {  4, 10,   320 }, {  4,  0,   254 }, {  7,  0,  1309 },
+  {  5, 11,   332 }, {  7, 11,  1309 }, {  6, 11,   261 }, {  8, 11,   182 },
+  { 11, 11,   943 }, {  4, 10,   225 }, {  6,  0,    12 }, {  7,  0,  1219 },
+  {  4,  0,   275 }, { 12,  0,   376 }, {  6, 11,  1721 }, { 13, 11,   490 },
+  {  4, 11,   933 }, {  5, 11,   880 }, {  6,  0,   951 }, {  6,  0,  1109 },
+  {  6,  0,  1181 }, {  7,  0,   154 }, {  4, 10,   405 }, {  7, 10,   817 },
+  { 14, 10,    58 }, { 17, 10,    37 }, { 18, 10,   124 }, {  6,  0,  1520 },
+  {  5, 10,   974 }, {  6,  0,  1753 }, {  6,  0,   369 }, {  6,  0,   502 },
+  {  7,  0,  1036 }, {  8,  0,   348 }, {  9,  0,   452 }, { 10,  0,    26 },
+  { 11,  0,   224 }, { 11,  0,   387 }, { 11,  0,   772 }, { 12,  0,    95 },
+  { 12,  0,   629 }, { 13,  0,   195 }, { 13,  0,   207 }, { 13,  0,   241 },
+  { 14,  0,   260 }, { 14,  0,   270 }, { 15,  0,   140 }, {  4,  0,   269 },
+  {  5,  0,   480 }, {  7,  0,   532 }, {  7,  0,  1197 }, {  7,  0,  1358 },
+  {  8,  0,   291 }, { 11,  0,   349 }, { 14,  0,   396 }, {  5, 10,   235 },
+  {  7, 10,  1239 }, { 11, 10,   131 }, { 12, 10,   370 }, {  7, 10,   956 },
+  {  7, 10,  1157 }, {  7, 10,  1506 }, {  7, 10,  1606 }, {  7, 10,  1615 },
+  {  7, 10,  1619 }, {  7, 10,  1736 }, {  7, 10,  1775 }, {  8, 10,   590 },
+  {  9, 10,   324 }, {  9, 10,   736 }, {  9, 10,   774 }, {  9, 10,   776 },
+  {  9, 10,   784 }, { 10, 10,   567 }, { 10, 10,   708 }, { 11, 10,   518 },
+  { 11, 10,   613 }, { 11, 10,   695 }, { 11, 10,   716 }, { 11, 10,   739 },
+  { 11, 10,   770 }, { 11, 10,   771 }, { 11, 10,   848 }, { 11, 10,   857 },
+  { 11, 10,   931 }, { 11, 10,   947 }, { 12, 10,   326 }, { 12, 10,   387 },
+  { 12, 10,   484 }, { 12, 10,   528 }, { 12, 10,   552 }, { 12, 10,   613 },
+  { 13, 10,   189 }, { 13, 10,   256 }, { 13, 10,   340 }, { 13, 10,   432 },
+  { 13, 10,   436 }, { 13, 10,   440 }, { 13, 10,   454 }, { 14, 10,   174 },
+  { 14, 10,   220 }, { 14, 10,   284 }, { 14, 10,   390 }, { 17, 10,   121 },
+  {  8, 11,   598 }, {  9, 11,   664 }, { 10, 11,   441 }, {  9, 10,   137 },
+  { 10, 10,   221 }, {  5, 11,   812 }, { 20,  0,    15 }, {  6,  0,  1341 },
+  {  6,  0,  1017 }, {  4, 11,   137 }, {  7, 11,  1178 }, {  7, 11,  1520 },
+  {  7, 10,   390 }, { 10, 10,   140 }, {  7, 11,  1260 }, {  7, 11,  1790 },
+  {  9, 11,   191 }, {  7, 10,  1144 }, {  6,  0,  1810 }, {  7,  0,   657 },
+  {  8,  0,   886 }, { 10,  0,   857 }, { 14,  0,   440 }, { 16,  0,    96 },
+  {  8,  0,   533 }, {  6, 11,  1661 }, {  7, 11,  1975 }, {  7, 11,  2009 },
+  {  7, 11,  2011 }, {  6,  0,  1453 }, {  6, 10,   464 }, {  4, 11,   715 },
+  {  5, 10,   407 }, { 11, 10,   204 }, { 11, 10,   243 }, { 11, 10,   489 },
+  { 12, 10,   293 }, { 19, 10,    37 }, { 20, 10,    73 }, { 22, 10,    38 },
+  {  5, 11,   703 }, {  4,  0,   211 }, {  7,  0,  1483 }, {  5, 10,   325 },
+  {  8, 10,     5 }, {  8, 10,   227 }, {  9, 10,   105 }, { 10, 10,   585 },
+  { 12, 10,   614 }, {  4,  0,   332 }, {  5,  0,   335 }, {  6,  0,   238 },
+  {  7,  0,   269 }, {  7,  0,   811 }, {  7,  0,  1797 }, {  8,  0,   836 },
+  {  9,  0,   507 }, { 13,  0,   242 }, {  5, 11,    89 }, {  7, 11,  1915 },
+  {  9, 11,   185 }, {  9, 11,   235 }, {  9, 11,   496 }, { 10, 11,    64 },
+  { 10, 11,   270 }, { 10, 11,   403 }, { 10, 11,   469 }, { 10, 11,   529 },
+  { 10, 11,   590 }, { 11, 11,   140 }, { 11, 11,   860 }, { 13, 11,     1 },
+  { 13, 11,   422 }, { 14, 11,   341 }, { 14, 11,   364 }, { 17, 11,    93 },
+  { 18, 11,   113 }, { 19, 11,    97 }, { 19, 11,   113 }, {  5, 11,   695 },
+  { 16,  0,    19 }, {  5, 11,     6 }, {  6, 11,   183 }, {  6, 10,   621 },
+  {  7, 11,   680 }, {  7, 11,   978 }, {  7, 11,  1013 }, {  7, 11,  1055 },
+  { 12, 11,   230 }, { 13, 11,   172 }, { 13, 10,   504 }, { 18, 11,    29 },
+  {  8,  0,   156 }, {  5,  0,  1009 }, {  6, 11,    29 }, { 11, 11,    63 },
+  {  6,  0,   820 }, {  6, 10,   218 }, {  7, 10,   454 }, {  7, 10,   782 },
+  {  8, 10,   768 }, { 12, 10,   686 }, {  5,  0,   228 }, {  6,  0,   203 },
+  {  7,  0,   156 }, {  8,  0,   347 }, {  9,  0,   265 }, { 18,  0,    39 },
+  { 20,  0,    54 }, { 21,  0,    31 }, { 22,  0,     3 }, { 23,  0,     0 },
+  { 15, 11,     8 }, { 18, 11,    39 }, { 20, 11,    54 }, { 21, 11,    31 },
+  { 22, 11,     3 }, { 23, 11,     0 }, {  7,  0,  1131 }, {  7,  0,  1468 },
+  { 16, 10,     0 }, {  6,  0,  1276 }, { 10, 10,   676 }, { 12, 10,   462 },
+  {  4, 11,   311 }, {  6, 11,  1740 }, {  7, 11,   170 }, {  8, 11,    90 },
+  {  8, 11,   177 }, {  8, 11,   415 }, { 11, 11,   714 }, { 14, 11,   281 },
+  {  6, 10,   164 }, {  6,  0,  1792 }, { 10,  0,   849 }, { 22, 10,    50 },
+  {  5,  0,   291 }, {  5,  0,   318 }, {  7,  0,   765 }, {  9,  0,   389 },
+  { 12,  0,   548 }, {  8, 11,   522 }, { 14, 11,   328 }, { 11, 11,    91 },
+  { 13, 11,   129 }, { 15, 11,   101 }, { 17, 11,   125 }, {  4, 11,   494 },
+  {  6, 11,    74 }, {  7, 11,    44 }, {  7, 11,   407 }, {  8, 11,   551 },
+  { 12, 11,    17 }, { 15, 11,     5 }, { 20, 11,    11 }, {  4, 11,   276 },
+  {  5, 11,   296 }, {  6, 10,   343 }, {  7, 10,   195 }, {  7, 11,  1777 },
+  {  9, 10,   226 }, { 10, 10,   197 }, { 10, 10,   575 }, { 11, 10,   502 },
+  { 11, 10,   899 }, { 10,  0,   525 }, { 11,  0,    82 }, { 14,  0,   453 },
+  {  4, 11,     7 }, {  5, 11,    90 }, {  5, 11,   158 }, {  6, 11,   542 },
+  {  7, 11,   221 }, {  7, 11,  1574 }, {  9, 11,   490 }, { 10, 11,   540 },
+  { 11, 11,   443 }, { 11, 11,   757 }, {  7,  0,   666 }, { 22, 10,    29 },
+  { 22, 11,    29 }, {  4,  0,   422 }, { 19, 10,     8 }, {  5,  0,   355 },
+  { 17,  0,     0 }, {  6,  0,  1873 }, {  9,  0,   918 }, {  7, 11,   588 },
+  {  9, 11,   175 }, { 10, 11,   530 }, { 15, 11,    31 }, { 11,  0,   165 },
+  {  7, 10,  1125 }, {  9, 10,   143 }, { 14, 10,   405 }, { 22, 10,    21 },
+  {  9,  0,   260 }, {  9,  0,   905 }, {  5, 11,   872 }, {  6, 11,    57 },
+  {  6, 11,   479 }, {  6, 11,   562 }, {  7, 11,   471 }, {  7, 11,  1060 },
+  {  9, 11,   447 }, {  9, 11,   454 }, { 13, 11,     6 }, { 10, 11,   704 },
+  {  5,  0,   865 }, {  5,  0,   914 }, {  6,  0,  1625 }, {  5,  0,   234 },
+  {  7,  0,  1383 }, {  5, 11,    31 }, {  6, 11,   614 }, { 17, 11,    61 },
+  {  7, 11,  1200 }, { 10, 11,   460 }, {  6, 11,   424 }, {  7, 11,  1866 },
+  {  8,  0,   306 }, {  5, 10,   959 }, { 12, 11,    30 }, { 13, 11,   148 },
+  { 14, 11,    87 }, { 14, 11,   182 }, { 16, 11,    42 }, { 18, 11,    92 },
+  { 20, 11,    70 }, {  6,  0,  1919 }, {  6,  0,  1921 }, {  9,  0,   923 },
+  {  9,  0,   930 }, {  9,  0,   941 }, {  9,  0,   949 }, {  9,  0,   987 },
+  {  9,  0,   988 }, {  9,  0,   992 }, { 12,  0,   802 }, { 12,  0,   815 },
+  { 12,  0,   856 }, { 12,  0,   885 }, { 12,  0,   893 }, { 12,  0,   898 },
+  { 12,  0,   919 }, { 12,  0,   920 }, { 12,  0,   941 }, { 12,  0,   947 },
+  { 15,  0,   183 }, { 15,  0,   185 }, { 15,  0,   189 }, { 15,  0,   197 },
+  { 15,  0,   202 }, { 15,  0,   233 }, { 18,  0,   218 }, { 18,  0,   219 },
+  { 18,  0,   233 }, { 15, 11,   156 }, {  7, 10,  1759 }, {  8, 10,   173 },
+  { 13,  0,   163 }, { 13,  0,   180 }, { 18,  0,    78 }, { 20,  0,    35 },
+  {  5, 11,    13 }, {  6, 11,   142 }, {  6, 10,   266 }, {  6, 11,    97 },
+  {  7, 11,   116 }, {  8, 11,   322 }, {  8, 11,   755 }, {  9, 11,   548 },
+  { 10, 11,   714 }, { 11, 11,   884 }, { 13, 11,   324 }, {  7,  0,  1312 },
+  {  9,  0,   814 }, {  9, 11,   676 }, {  5,  0,   707 }, {  7,  0,  1493 },
+  {  6,  0,   421 }, {  7,  0,    61 }, {  7,  0,  1540 }, { 10,  0,    11 },
+  { 10,  0,   501 }, { 12,  0,   733 }, { 12,  0,   766 }, {  7, 11,   866 },
+  {  7, 11,  1163 }, {  9,  0,   341 }, { 14,  0,    98 }, { 17, 11,   115 },
+  {  7, 11,  1111 }, {  8, 10,   300 }, {  8,  0,  1014 }, {  8, 11,     1 },
+  {  9, 11,   112 }, { 10, 11,   326 }, {  4, 11,   730 }, {  5, 11,   488 },
+  {  6, 11,   527 }, {  7, 11,   489 }, {  7, 11,  1636 }, {  8, 11,   121 },
+  {  8, 11,   144 }, {  8, 11,   359 }, {  9, 11,   193 }, {  9, 11,   241 },
+  {  9, 11,   336 }, {  9, 11,   882 }, { 11, 11,   266 }, { 11, 11,   372 },
+  { 11, 11,   944 }, { 12, 11,   401 }, { 12, 11,   641 }, {  6,  0,   971 },
+  {  6,  0,  1121 }, {  6,  0,   102 }, {  7,  0,    72 }, { 15,  0,   142 },
+  { 19,  0,    67 }, { 23,  0,    30 }, {  7,  0,   823 }, {  6,  0,  1045 },
+  {  5, 10,   427 }, {  5, 10,   734 }, {  7, 10,   478 }, {  8, 10,    52 },
+  {  7,  0,  1930 }, { 11, 10,   217 }, { 14, 10,   165 }, {  6,  0,  1512 },
+  {  7,  0,  1870 }, {  9, 11,    31 }, { 10, 11,   244 }, { 10, 11,   699 },
+  { 12, 11,   149 }, { 13, 11,   497 }, {  5, 11,   377 }, { 17, 11,   101 },
+  { 10, 11,   158 }, { 13, 11,    13 }, { 13, 11,   137 }, { 13, 11,   258 },
+  { 14, 11,   111 }, { 14, 11,   225 }, { 14, 11,   253 }, { 14, 11,   304 },
+  { 14, 11,   339 }, { 14, 11,   417 }, { 18, 11,    33 }, {  6,  0,    87 },
+  {  6, 10,  1734 }, {  7, 10,    20 }, {  7, 10,  1056 }, {  8, 10,   732 },
+  {  9, 10,   406 }, {  9, 10,   911 }, { 10, 10,   694 }, {  6,  0,  1243 },
+  {  9,  0,   245 }, {  7,  0,    68 }, {  8,  0,    48 }, {  8,  0,    88 },
+  {  8,  0,   582 }, {  8,  0,   681 }, {  9,  0,   373 }, {  9,  0,   864 },
+  { 11,  0,   157 }, { 11,  0,   336 }, { 11,  0,   843 }, { 20,  0,    27 },
+  {  8, 11,   663 }, { 16, 11,     8 }, {  5, 10,   613 }, {  4,  0,    88 },
+  {  5,  0,   137 }, {  5,  0,   174 }, {  5,  0,   777 }, {  6,  0,  1664 },
+  {  6,  0,  1725 }, {  7,  0,    77 }, {  7,  0,   426 }, {  7,  0,  1317 },
+  {  7,  0,  1355 }, {  8,  0,   126 }, {  8,  0,   563 }, {  9,  0,   523 },
+  {  9,  0,   750 }, { 10,  0,   310 }, { 10,  0,   836 }, { 11,  0,    42 },
+  { 11,  0,   318 }, { 11,  0,   731 }, { 12,  0,    68 }, { 12,  0,    92 },
+  { 12,  0,   507 }, { 12,  0,   692 }, { 13,  0,    81 }, { 13,  0,   238 },
+  { 13,  0,   374 }, { 14,  0,   436 }, { 18,  0,   138 }, { 19,  0,    78 },
+  { 19,  0,   111 }, { 20,  0,    55 }, { 20,  0,    77 }, { 20,  0,    92 },
+  { 13,  0,   418 }, {  4,  0,   938 }, {  9,  0,   625 }, { 10,  0,   351 },
+  {  5, 11,   843 }, {  7, 10,    32 }, {  7, 10,   984 }, {  8, 10,    85 },
+  {  8, 10,   709 }, {  9, 10,   579 }, {  9, 10,   847 }, {  9, 10,   856 },
+  { 10, 10,   799 }, { 11, 10,   258 }, { 11, 10,  1007 }, { 12, 10,   331 },
+  { 12, 10,   615 }, { 13, 10,   188 }, { 13, 10,   435 }, { 14, 10,     8 },
+  { 15, 10,   165 }, { 16, 10,    27 }, { 20, 10,    40 }, {  6,  0,  1668 },
+  {  7,  0,  1499 }, {  8,  0,   117 }, {  9,  0,   314 }, { 10,  0,   174 },
+  {  7,  0,   707 }, {  4, 11,   554 }, {  5, 11,   536 }, {  5,  0,   403 },
+  {  5, 11,   207 }, {  9, 11,    79 }, { 11, 11,   625 }, { 17, 11,     7 },
+  {  4, 11,   424 }, {  8, 11,   785 }, {  4, 10,   167 }, {  7, 10,    82 },
+  {  9,  0,     7 }, { 23,  0,     6 }, {  9, 11,     7 }, { 23, 11,     6 },
+  {  6,  0,   282 }, {  5, 10,    62 }, {  6, 10,   534 }, {  7, 10,    74 },
+  {  7, 10,   678 }, {  7, 10,   684 }, {  7, 10,  1043 }, {  7, 10,  1072 },
+  {  8, 10,   280 }, {  8, 10,   541 }, {  8, 10,   686 }, {  9, 10,   258 },
+  { 10, 10,   519 }, { 11, 10,   252 }, { 12, 10,   282 }, { 10, 10,    33 },
+  {  4, 10,   359 }, {  4,  0,    44 }, {  5,  0,   311 }, {  6,  0,   156 },
+  {  7,  0,   639 }, {  7,  0,   762 }, {  7,  0,  1827 }, {  9,  0,     8 },
+  {  9,  0,   462 }, { 20,  0,    83 }, {  7, 11,   769 }, {  9, 11,    18 },
+  { 10, 11,   358 }, {  4,  0,   346 }, {  7,  0,   115 }, {  9,  0,   180 },
+  {  9,  0,   456 }, { 10,  0,   363 }, {  4, 11,   896 }, {  6, 11,  1777 },
+  {  5, 10,   211 }, {  7,  0,   761 }, {  7,  0,  1051 }, {  9,  0,   545 },
+  {  6, 10,   145 }, { 13, 10,   336 }, {  7, 11,   750 }, {  9, 11,   223 },
+  { 11, 11,    27 }, { 11, 11,   466 }, { 12, 11,   624 }, { 14, 11,   265 },
+  { 18, 11,    61 }, {  6,  0,   752 }, {  6,  0,   768 }, {  6,  0,  1195 },
+  {  6,  0,  1254 }, {  6,  0,  1619 }, {  9,  0,   835 }, {  6,  0,  1936 },
+  {  8,  0,   930 }, {  8,  0,   960 }, {  4, 10,   263 }, {  4, 11,   249 },
+  { 12,  0,   653 }, {  4, 10,   916 }, {  4, 11,   603 }, {  5, 11,   661 },
+  {  8,  0,   344 }, {  4, 11,    11 }, {  6, 11,   128 }, {  7, 11,   231 },
+  {  7, 11,  1533 }, { 10, 11,   725 }, {  6,  0,  1483 }, {  6,  0,   875 },
+  {  6,  0,   185 }, {  7,  0,  1899 }, {  9,  0,   875 }, { 11,  0,   673 },
+  { 15, 10,   155 }, { 16, 10,    79 }, {  7,  0,    93 }, {  7,  0,   210 },
+  {  7,  0,  1223 }, {  8,  0,   451 }, {  8,  0,   460 }, { 11,  0,   353 },
+  { 11,  0,   475 }, {  4, 10,   599 }, {  6, 10,  1634 }, {  7, 10,    67 },
+  {  7, 10,   691 }, {  7, 10,   979 }, {  7, 10,  1697 }, {  8, 10,   207 },
+  {  8, 10,   214 }, {  8, 10,   231 }, {  8, 10,   294 }, {  8, 10,   336 },
+  {  8, 10,   428 }, {  8, 10,   471 }, {  8, 10,   622 }, {  8, 10,   626 },
+  {  8, 10,   679 }, {  8, 10,   759 }, {  8, 10,   829 }, {  9, 10,    11 },
+  {  9, 10,   246 }, {  9, 10,   484 }, {  9, 10,   573 }, {  9, 10,   706 },
+  {  9, 10,   762 }, {  9, 10,   798 }, {  9, 10,   855 }, {  9, 10,   870 },
+  {  9, 10,   912 }, { 10, 10,   303 }, { 10, 10,   335 }, { 10, 10,   424 },
+  { 10, 10,   461 }, { 10, 10,   543 }, { 10, 10,   759 }, { 10, 10,   814 },
+  { 11, 10,    59 }, { 11, 10,   235 }, { 11, 10,   590 }, { 11, 10,   929 },
+  { 11, 10,   963 }, { 11, 10,   987 }, { 12, 10,   114 }, { 12, 10,   182 },
+  { 12, 10,   226 }, { 12, 10,   332 }, { 12, 10,   439 }, { 12, 10,   575 },
+  { 12, 10,   598 }, { 12, 10,   675 }, { 13, 10,     8 }, { 13, 10,   125 },
+  { 13, 10,   194 }, { 13, 10,   287 }, { 14, 10,   197 }, { 14, 10,   383 },
+  { 15, 10,    53 }, { 17, 10,    63 }, { 19, 10,    46 }, { 19, 10,    98 },
+  { 19, 10,   106 }, { 20, 10,    85 }, {  4, 11,   476 }, {  4,  0,   327 },
+  {  5,  0,   478 }, {  7,  0,  1332 }, {  8,  0,   753 }, {  5,  0,  1020 },
+  {  5,  0,  1022 }, {  7, 11,  1807 }, {  4,  0,   103 }, {  5,  0,   401 },
+  {  4,  0,   499 }, {  7,  0,  1421 }, { 10,  0,   207 }, { 13,  0,   164 },
+  { 19, 10,   126 }, {  9, 11,    20 }, { 10, 11,   324 }, { 11, 11,   488 },
+  {  4,  0,    96 }, {  9, 11,   280 }, { 10, 11,   134 }, {  7,  0,   968 },
+  {  5, 10,   187 }, {  7, 10,  1286 }, {  5, 11,   112 }, {  6, 11,   103 },
+  {  6, 11,   150 }, {  8,  0,   914 }, { 10,  0,     3 }, {  4, 10,   215 },
+  {  9, 10,    38 }, { 11, 10,    23 }, { 11, 10,   127 }, { 11, 10,   796 },
+  {  7,  0,   399 }, {  6,  0,   563 }, {  9,  0,   224 }, {  6,  0,   704 },
+  {  6,  0,  1214 }, {  4, 11,   708 }, {  8, 11,    15 }, {  9, 11,    50 },
+  {  9, 11,   386 }, { 11, 11,    18 }, { 11, 11,   529 }, { 12, 11,   228 },
+  {  4, 11,   563 }, {  7, 11,   109 }, {  7, 11,   592 }, {  7, 11,   637 },
+  {  7, 11,   770 }, {  7, 11,  1701 }, {  8, 11,   436 }, {  8, 11,   463 },
+  {  9, 11,    60 }, {  9, 11,   335 }, {  9, 11,   904 }, { 10, 11,    73 },
+  { 11, 11,   434 }, { 12, 11,   585 }, { 13, 11,   331 }, { 18, 11,   110 },
+  { 20, 11,    60 }, {  6,  0,  1559 }, {  4, 11,   502 }, {  6, 11,   347 },
+  { 10, 11,   161 }, {  4, 11,    33 }, {  5, 11,   102 }, {  5, 11,   500 },
+  {  6, 11,   284 }, {  7, 11,  1079 }, {  7, 11,  1423 }, {  7, 11,  1702 },
+  {  8, 11,   470 }, {  9, 11,   554 }, {  9, 11,   723 }, { 11, 11,   333 },
+  {  7, 11,   246 }, {  7, 11,   840 }, {  6, 11,    10 }, {  8, 11,   571 },
+  {  9, 11,   739 }, { 15, 11,    91 }, {  8,  0,   861 }, { 10,  0,   905 },
+  { 12,  0,   730 }, { 12,  0,   789 }, {  5, 11,   626 }, {  6,  0,   946 },
+  {  5,  0,   746 }, { 12,  0,   333 }, { 14,  0,   332 }, { 12, 11,   333 },
+  { 14, 11,   332 }, {  5, 11,    18 }, {  6, 11,   526 }, { 13, 11,    24 },
+  { 13, 11,   110 }, { 19, 11,     5 }, { 19, 11,    44 }, {  4,  0,   910 },
+  {  5,  0,   832 }, {  7, 10,  2002 }, { 10, 11,   768 }, { 11, 11,   787 },
+  {  4, 11,   309 }, {  5, 11,   462 }, {  7, 11,   970 }, {  7, 11,  1097 },
+  {  4, 10,    28 }, {  5, 10,   440 }, {  7, 10,   248 }, { 11, 10,   833 },
+  { 12, 10,   344 }, {  6, 10,  1654 }, {  6,  0,   632 }, {  6,  0,   652 },
+  {  6,  0,  1272 }, {  6,  0,  1384 }, {  6,  0,  1560 }, {  6, 11,  1704 },
+  {  6,  0,  1393 }, {  5, 10,   853 }, {  6, 10,   249 }, {  7, 10,  1234 },
+  { 11, 10,   573 }, {  5, 11,    86 }, {  7, 11,   743 }, {  9, 11,    85 },
+  { 10, 11,   281 }, { 10, 11,   432 }, { 11, 11,   490 }, { 12, 11,   251 },
+  { 13, 11,   118 }, { 14, 11,   378 }, { 18, 11,   143 }, {  5, 11,   524 },
+  {  5, 11,   744 }, {  6,  0,  1514 }, { 10,  0,   201 }, { 14,  0,   319 },
+  {  7,  0,   717 }, { 10,  0,   510 }, {  7, 10,   392 }, {  8, 10,    20 },
+  {  8, 10,   172 }, {  8, 10,   690 }, {  9, 10,   383 }, {  9, 10,   845 },
+  { 11, 10,   293 }, { 11, 10,   832 }, { 11, 10,   920 }, { 11, 10,   984 },
+  { 13, 10,   221 }, {  6,  0,  1381 }, {  5, 10,   858 }, {  5, 10,   992 },
+  {  8,  0,   528 }, {  9,  0,   348 }, { 10, 11,   107 }, { 12, 11,   436 },
+  {  4,  0,    20 }, {  5,  0,   616 }, {  6,  0,  1251 }, {  4, 11,   927 },
+  { 10, 11,   123 }, { 12, 11,   670 }, { 13, 11,   371 }, { 14, 11,   142 },
+  { 18, 11,    94 }, {  6,  0,  1163 }, {  7, 11,  1149 }, {  9, 11,   156 },
+  {  6,  0,   307 }, {  5, 11,   778 }, {  7,  0,  1091 }, {  7,  0,  1765 },
+  {  5, 11,   502 }, {  6, 10,   268 }, {  9, 10,    62 }, {  8, 11,   196 },
+  { 10, 11,   283 }, { 11, 11,   406 }, {  4,  0,    26 }, {  5,  0,   429 },
+  {  6,  0,   245 }, {  7,  0,   704 }, {  7,  0,  1379 }, {  7,  0,  1474 },
+  {  5, 11,   855 }, {  4,  0,   881 }, {  4,  0,   621 }, {  7, 11,  1596 },
+  {  7, 11,  1400 }, {  9, 11,   446 }, { 10, 11,    45 }, {  6,  0,   736 },
+  { 10, 10,   106 }, {  5,  0,   542 }, {  6,  0,   348 }, {  5,  0,   868 },
+  {  8,  0,   433 }, {  7,  0,  1495 }, { 10,  0,   771 }, {  6, 10,   613 },
+  {  8, 10,   223 }, { 10,  0,   215 }, { 13,  0,   124 }, {  8, 11,   391 },
+  {  7, 11,   172 }, {  4, 10,   670 }, { 12,  0,    55 }, {  9, 10,    40 },
+  { 11, 10,   136 }, {  7,  0,    62 }, { 19,  0,   112 }, {  4,  0,   856 },
+  {  4, 11,   568 }, { 12,  0,   270 }, { 11, 10,   259 }, {  8,  0,   572 },
+  {  9,  0,   698 }, {  4, 11,   732 }, {  9, 10,   310 }, {  9, 10,   682 },
+  { 14, 10,   296 }, {  6,  0,   939 }, {  8, 11,   733 }, {  7, 11,  1435 },
+  {  7, 10,  1401 }, {  7, 10,  1476 }, {  6,  0,   352 }, {  4, 10,   296 },
+  {  7, 10,   401 }, {  7, 10,  1410 }, {  7, 10,  1594 }, {  7, 10,  1674 },
+  {  8, 10,    63 }, {  8, 10,   660 }, {  9, 10,    74 }, {  4, 11,   428 },
+  {  5, 11,   668 }, {  4, 10,   139 }, {  4, 10,   388 }, { 12, 10,   188 },
+  {  7, 11,  2015 }, { 12, 11,   665 }, {  4,  0,   647 }, { 18,  0,    10 },
+  { 10,  0,   220 }, { 14,  0,   464 }, {  4,  0,   109 }, {  6,  0,  1746 },
+  {  6,  0,   515 }, {  4, 10,   747 }, {  6, 11,  1623 }, {  6, 11,  1681 },
+  {  7, 10,   649 }, {  7, 10,  1479 }, {  7, 10,  1583 }, {  5, 10,   232 },
+  {  7,  0,   566 }, {  9, 10,   887 }, {  4,  0,    40 }, { 10,  0,    67 },
+  { 11,  0,   117 }, { 11,  0,   768 }, { 11,  0,   935 }, {  4,  0,   801 },
+  {  7,  0,   992 }, {  8,  0,   301 }, {  9,  0,   722 }, { 12,  0,    63 },
+  { 13,  0,    29 }, { 14,  0,   161 }, { 15,  0,    18 }, { 11,  0,   923 },
+  {  6, 11,  1748 }, {  8, 11,   715 }, {  9, 11,   802 }, { 10, 11,    46 },
+  { 10, 11,   819 }, { 13, 11,   308 }, { 14, 11,   351 }, { 14, 11,   363 },
+  { 18, 11,    67 }, {  9, 11,   745 }, {  7,  0,  1145 }, {  4, 10,    14 },
+  {  7, 10,  1801 }, { 10, 10,   748 }, { 13, 10,   458 }, {  4, 11,    63 },
+  {  5, 11,   347 }, {  6, 11,   474 }, {  7,  0,   568 }, {  4, 10,   425 },
+  {  7, 11,   577 }, {  7, 11,  1432 }, {  9, 11,   475 }, {  9, 11,   505 },
+  {  9, 11,   526 }, {  9, 11,   609 }, {  9, 11,   689 }, {  9, 11,   726 },
+  {  9, 11,   735 }, {  9, 11,   738 }, { 10, 11,   556 }, { 10, 11,   674 },
+  { 10, 11,   684 }, { 11, 11,    89 }, { 11, 11,   202 }, { 11, 11,   272 },
+  { 11, 11,   380 }, { 11, 11,   415 }, { 11, 11,   505 }, { 11, 11,   537 },
+  { 11, 11,   550 }, { 11, 11,   562 }, { 11, 11,   640 }, { 11, 11,   667 },
+  { 11, 11,   688 }, { 11, 11,   847 }, { 11, 11,   927 }, { 11, 11,   930 },
+  { 11, 11,   940 }, { 12, 11,   144 }, { 12, 11,   325 }, { 12, 11,   329 },
+  { 12, 11,   389 }, { 12, 11,   403 }, { 12, 11,   451 }, { 12, 11,   515 },
+  { 12, 11,   604 }, { 12, 11,   616 }, { 12, 11,   626 }, { 13, 11,    66 },
+  { 13, 11,   131 }, { 13, 11,   167 }, { 13, 11,   236 }, { 13, 11,   368 },
+  { 13, 11,   411 }, { 13, 11,   434 }, { 13, 11,   453 }, { 13, 11,   461 },
+  { 13, 11,   474 }, { 14, 11,    59 }, { 14, 11,    60 }, { 14, 11,   139 },
+  { 14, 11,   152 }, { 14, 11,   276 }, { 14, 11,   353 }, { 14, 11,   402 },
+  { 15, 11,    28 }, { 15, 11,    81 }, { 15, 11,   123 }, { 15, 11,   152 },
+  { 18, 11,   136 }, { 20, 11,    88 }, {  9,  0,   247 }, {  7, 11,  1622 },
+  {  9, 11,   544 }, { 11, 11,   413 }, { 16, 11,    25 }, {  4,  0,   645 },
+  {  7,  0,   825 }, {  6, 10,  1768 }, {  7, 11,    89 }, { 12,  0,   328 },
+  {  5, 10,   943 }, {  6, 10,  1779 }, {  6,  0,  1363 }, {  5, 10,   245 },
+  {  6, 10,   576 }, {  7, 10,   582 }, {  8, 10,   225 }, {  6,  0,  1280 },
+  {  5, 11,   824 }, {  5, 11,   941 }, {  7, 11,   440 }, {  8, 11,   230 },
+  { 11, 11,   106 }, {  5,  0,    28 }, {  6,  0,   204 }, { 10,  0,   320 },
+  { 10,  0,   583 }, { 13,  0,   502 }, { 14,  0,    72 }, { 14,  0,   274 },
+  { 14,  0,   312 }, { 14,  0,   344 }, { 15,  0,   159 }, { 16,  0,    62 },
+  { 16,  0,    69 }, { 17,  0,    30 }, { 18,  0,    42 }, { 18,  0,    53 },
+  { 18,  0,    84 }, { 18,  0,   140 }, { 19,  0,    68 }, { 19,  0,    85 },
+  { 20,  0,     5 }, { 20,  0,    45 }, { 20,  0,   101 }, { 22,  0,     7 },
+  { 22,  0,    20 }, {  4,  0,   558 }, {  6,  0,   390 }, {  7,  0,   162 },
+  {  7,  0,   689 }, {  9,  0,   360 }, { 10,  0,   653 }, {  6,  0,   764 },
+  {  6,  0,   862 }, {  9,  0,   833 }, {  5,  0,   856 }, {  6,  0,  1672 },
+  {  6,  0,  1757 }, {  6,  0,  1781 }, {  5,  0,    92 }, { 10,  0,   736 },
+  { 12,  0,   102 }, {  6,  0,  1927 }, {  6,  0,  1944 }, {  8,  0,   924 },
+  {  8,  0,   948 }, { 10,  0,   967 }, { 10,  0,   978 }, {  6,  0,  1479 },
+  {  5,  0,   590 }, {  8,  0,   360 }, {  9,  0,   213 }, { 10,  0,    63 },
+  {  6,  0,  1521 }, {  6,  0,   709 }, {  6,  0,   891 }, {  4, 10,   443 },
+  { 13,  0,   477 }, { 14,  0,   120 }, { 20,  0,    61 }, {  4, 11,   914 },
+  {  5, 11,   800 }, {  5, 11,   852 }, { 10, 11,    54 }, { 13, 11,   115 },
+  {  4, 11,   918 }, {  5, 11,   876 }, { 11, 11,   152 }, {  4, 11,    92 },
+  {  5, 11,   274 }, {  7, 11,  1901 }, {  9, 11,   800 }, { 10, 11,   693 },
+  { 11, 11,   482 }, { 11, 11,   734 }, { 11, 11,   789 }, {  9,  0,   483 },
+  {  4, 10,   298 }, {  6,  0,  1213 }, { 13, 11,   498 }, {  7, 11,  1451 },
+  {  5, 11,   743 }, {  4,  0,  1022 }, { 10,  0,  1000 }, { 12,  0,   957 },
+  { 12,  0,   980 }, { 12,  0,  1013 }, { 14,  0,   481 }, { 16,  0,   116 },
+  {  8,  0,   503 }, { 17,  0,    29 }, {  4, 11,    49 }, {  7, 11,   280 },
+  {  7, 11,  1633 }, {  7,  0,  1712 }, {  6,  0,   466 }, {  8, 11,    47 },
+  {  5, 10,   164 }, {  7, 10,   121 }, { 14, 10,   189 }, {  7, 10,   812 },
+  {  7, 10,  1261 }, {  7, 10,  1360 }, {  9, 10,   632 }, { 12, 10,   352 },
+  { 11, 10,   556 }, {  4,  0,   731 }, {  5, 11,   272 }, {  5, 11,   908 },
+  {  5, 11,   942 }, {  7, 11,  1008 }, {  7, 11,  1560 }, {  8, 11,   197 },
+  {  9, 11,    47 }, { 11, 11,   538 }, { 11, 11,   742 }, {  4, 10,   172 },
+  {  9, 10,   611 }, { 10, 10,   436 }, { 12, 10,   673 }, { 13, 10,   255 },
+  {  5, 10,   844 }, { 10,  0,   484 }, { 11,  0,   754 }, { 12,  0,   457 },
+  { 14,  0,   171 }, { 14,  0,   389 }, { 18,  0,   153 }, {  9, 10,   263 },
+  { 10, 10,   147 }, { 10, 10,   492 }, {  9, 11,   891 }, { 10,  0,   241 },
+  {  5, 10,   537 }, {  6,  0,  2005 }, {  8,  0,   964 }, {  9, 10,   842 },
+  { 23, 11,     8 }, {  4, 11,   407 }, {  4, 11,   560 }, {  7, 11,  1884 },
+  {  6,  0,  1100 }, {  6,  0,  1242 }, {  7,  0,   954 }, {  5, 10,   230 },
+  {  5, 10,   392 }, {  6, 10,   420 }, {  9, 10,   568 }, { 12, 10,   612 },
+  {  4, 11,   475 }, { 11, 11,    35 }, { 11, 11,    90 }, { 13, 11,     7 },
+  { 13, 11,    71 }, { 13, 11,   177 }, { 14, 11,   422 }, {  8, 11,   332 },
+  {  7,  0,  1958 }, {  6,  0,   549 }, {  8,  0,    34 }, {  8,  0,   283 },
+  {  9,  0,   165 }, { 10,  0,   475 }, { 10,  0,   952 }, { 12,  0,   966 },
+  { 12,  0,   994 }, {  5,  0,   652 }, {  5,  0,   701 }, {  7,  0,   449 },
+  {  4,  0,   655 }, {  7,  0,   850 }, { 17,  0,    75 }, { 18,  0,   137 },
+  {  4,  0,   146 }, {  7,  0,  1618 }, {  8,  0,   670 }, {  5, 10,    41 },
+  {  7, 10,  1459 }, {  7, 10,  1469 }, {  7, 10,  1859 }, {  9, 10,   549 },
+  { 11, 10,   905 }, {  5, 10,   696 }, {  6,  0,   159 }, {  6,  0,   364 },
+  {  7,  0,   516 }, {  9,  0,   518 }, {  7,  0,  1439 }, {  6, 11,   222 },
+  {  7, 11,   636 }, {  7, 11,  1620 }, {  8, 11,   409 }, {  9, 11,   693 },
+  { 11, 11,    77 }, { 13,  0,   151 }, { 13, 11,    45 }, {  6,  0,  1027 },
+  {  4, 11,   336 }, {  4, 10,   771 }, { 11, 11,   392 }, { 10, 11,   121 },
+  { 11, 11,   175 }, { 21, 11,    16 }, {  8,  0,   950 }, { 10,  0,   983 },
+  {  5, 10,   921 }, {  7,  0,   993 }, {  6, 10,   180 }, {  7, 10,  1137 },
+  {  8, 10,   751 }, { 11, 10,   805 }, {  7,  0,   501 }, {  9,  0,   111 },
+  { 10,  0,   141 }, { 11,  0,   332 }, { 13,  0,    43 }, { 13,  0,   429 },
+  { 14,  0,   130 }, { 14,  0,   415 }, { 17,  0,   102 }, {  4, 10,   183 },
+  {  5, 11,   882 }, {  7, 10,   271 }, { 11, 10,   824 }, { 11, 10,   952 },
+  { 13, 10,   278 }, { 13, 10,   339 }, { 13, 10,   482 }, { 14, 10,   424 },
+  { 20, 10,    99 }, {  4, 10,    19 }, {  5, 10,   477 }, {  5, 10,   596 },
+  {  6, 10,   505 }, {  7, 10,  1221 }, { 11, 10,   907 }, { 12, 10,   209 },
+  { 13, 10,   214 }, {  7, 10,  1215 }, {  5,  0,   452 }, {  4, 11,   426 },
+  {  5,  0,   149 }, {  8,  0,   233 }, {  5,  0,   935 }, {  6, 11,    58 },
+  {  7, 11,   654 }, {  7, 11,   745 }, {  7, 11,  1969 }, {  8, 11,   240 },
+  {  8, 11,   675 }, {  9, 11,   479 }, {  9, 11,   731 }, { 10, 11,   330 },
+  { 10, 11,   593 }, { 10, 11,   817 }, { 11, 11,    32 }, { 11, 11,   133 },
+  { 11, 11,   221 }, { 17, 11,    68 }, { 12,  0,   582 }, { 18,  0,   131 },
+  {  7, 11,   102 }, {  9, 11,   538 }, {  8,  0,   801 }, {  6, 10,  1645 },
+  {  4,  0,    70 }, {  6, 10,    92 }, {  6, 10,   188 }, {  7, 10,  1269 },
+  {  7, 10,  1524 }, {  7, 10,  1876 }, { 10, 10,   228 }, { 11, 10,  1020 },
+  {  4, 10,   459 }, {  5, 10,   966 }, { 10,  0,   369 }, { 16,  0,    36 },
+  { 12, 10,   330 }, { 13, 11,   366 }, {  7,  0,   721 }, { 10,  0,   236 },
+  { 12,  0,   204 }, {  6, 10,    18 }, {  7, 10,   932 }, {  8, 10,   757 },
+  {  9, 10,    54 }, {  9, 10,    65 }, {  9, 10,   844 }, { 10, 10,   113 },
+  { 10, 10,   315 }, { 10, 10,   798 }, { 11, 10,   153 }, { 12, 10,   151 },
+  { 12, 10,   392 }, { 12, 10,   666 }, { 14, 10,   248 }, {  7,  0,   241 },
+  { 10,  0,   430 }, {  8, 10,   548 }, {  9, 10,   532 }, { 10, 10,   117 },
+  { 11, 10,   351 }, { 11, 10,   375 }, { 15, 10,    23 }, {  6, 10,  1742 },
+  {  5, 10,   965 }, {  5, 11,   566 }, {  6, 11,    48 }, {  7, 11,    63 },
+  {  6, 10,   182 }, { 10, 10,    65 }, { 10, 10,   488 }, { 10, 10,   497 },
+  {  6, 11,   114 }, {  7, 11,  1224 }, {  7, 11,  1556 }, {  8, 11,     3 },
+  {  6,  0,  1817 }, {  8, 11,   576 }, {  9, 11,   267 }, {  6,  0,  1078 },
+  { 16,  0,    16 }, {  9, 10,   588 }, { 10, 10,   260 }, { 10,  0,  1021 },
+  {  5,  0,   406 }, {  6,  0,  2022 }, {  5, 11,   933 }, {  6,  0,    69 },
+  {  7,  0,   117 }, {  7,  0,  1830 }, {  8, 11,   427 }, {  4,  0,   432 },
+  {  7,  0,   824 }, {  6, 10,  1786 }, {  5,  0,   826 }, { 11, 11,    67 },
+  {  5, 11,   759 }, {  7, 10,   308 }, {  9,  0,   816 }, {  5,  0,  1000 },
+  {  4,  0,   297 }, {  6,  0,   529 }, {  7,  0,   152 }, {  7,  0,   713 },
+  {  7,  0,  1845 }, {  8,  0,   710 }, {  8,  0,   717 }, { 12,  0,   639 },
+  { 12,  0,   685 }, {  7,  0,   423 }, {  8, 10,   588 }, {  8, 10,   287 },
+  {  8,  0,   510 }, {  6,  0,  1048 }, {  6,  0,   618 }, {  7, 11,    56 },
+  {  7, 11,  1989 }, {  8, 11,   337 }, {  8, 11,   738 }, {  9, 11,   600 },
+  { 10, 11,   483 }, { 12, 11,    37 }, { 13, 11,   447 }, { 14, 11,    92 },
+  {  4,  0,   520 }, {  7,  0,   575 }, {  8,  0,   990 }, { 10,  0,   977 },
+  {  7, 11,   774 }, {  9, 11,   347 }, { 11, 11,    24 }, { 12, 11,   170 },
+  {  8, 11,   379 }, { 12, 10,   290 }, {  4, 11,   328 }, {  4,  0,   321 },
+  {  6,  0,   569 }, {  4, 11,   101 }, {  7, 11,  1171 }, {  7,  0,   723 },
+  {  7,  0,  1135 }, {  5, 11,   833 }, {  8, 11,   744 }, {  7, 10,   719 },
+  {  8, 10,   809 }, {  8, 10,   834 }, {  8,  0,   921 }, {  8, 10,   796 },
+  {  5, 10,   210 }, {  6, 10,   213 }, {  7, 10,    60 }, { 10, 10,   364 },
+  { 11, 10,   135 }, {  5,  0,   397 }, {  6,  0,   154 }, {  7,  0,   676 },
+  {  8,  0,   443 }, {  8,  0,   609 }, {  9,  0,    24 }, {  9,  0,   325 },
+  { 10,  0,    35 }, { 11,  0,   535 }, { 11,  0,   672 }, { 11,  0,  1018 },
+  { 12,  0,   637 }, { 16,  0,    30 }, {  5, 10,   607 }, {  8, 10,   326 },
+  {  8, 10,   490 }, {  4, 10,   701 }, {  5, 10,   472 }, {  6, 11,     9 },
+  {  6, 11,   397 }, {  7, 11,    53 }, {  7, 11,  1742 }, {  9, 10,   758 },
+  { 10, 11,   632 }, { 11, 11,   828 }, { 12, 11,   146 }, {  7, 10,   380 },
+  {  7, 10,  1947 }, { 20, 11,   109 }, { 10, 10,   278 }, { 10, 11,   278 },
+  {  6,  0,   856 }, {  7,  0,   139 }, {  4, 10,   386 }, {  8, 10,   405 },
+  {  8, 10,   728 }, {  9, 10,   497 }, { 11, 10,   110 }, { 11, 10,   360 },
+  { 15, 10,    37 }, { 16, 10,    84 }, { 13,  0,   282 }, {  5,  0,   981 },
+  {  5,  0,   288 }, {  7, 10,  1452 }, {  7, 10,  1480 }, {  8, 10,   634 },
+  { 12, 10,   472 }, {  7,  0,  1890 }, {  8, 11,   367 }, { 10, 11,   760 },
+  { 14, 11,    79 }, { 20, 11,    17 }, { 24, 11,     0 }, {  4, 10,   524 },
+  {  8, 10,   810 }, {  4,  0,    56 }, {  7,  0,  1791 }, {  8,  0,   607 },
+  {  8,  0,   651 }, { 11,  0,   465 }, { 11,  0,   835 }, { 12,  0,   337 },
+  { 13,  0,   480 }, { 10, 10,   238 }, { 13, 10,    33 }, { 11, 11,   417 },
+  { 12, 11,   223 }, { 12, 11,   265 }, {  9,  0,   158 }, { 10,  0,   411 },
+  { 12,  0,   261 }, {  5, 10,   532 }, {  5, 10,   997 }, { 12, 11,   186 },
+  { 12, 11,   292 }, { 14, 11,   100 }, { 18, 11,    70 }, {  6,  0,  1403 },
+  {  8,  0,   617 }, {  6,  0,  1205 }, { 11,  0,   563 }, {  4,  0,   242 },
+  {  6,  0,   333 }, {  4, 11,   186 }, {  5, 11,   157 }, {  8, 11,   168 },
+  { 10, 11,     6 }, {  4,  0,   369 }, {  5, 11,   875 }, {  5, 10,   782 },
+  {  5, 10,   829 }, {  6, 10,  1738 }, {  6,  0,   622 }, {  7, 11,  1272 },
+  {  6,  0,  1407 }, {  7, 11,   111 }, {  8, 11,   581 }, {  7, 10,  1823 },
+  { 11, 10,   693 }, {  7,  0,   160 }, { 10,  0,   624 }, { 14,  0,   279 },
+  {  4,  0,   363 }, { 10, 11,   589 }, { 12, 11,   111 }, { 13, 11,   260 },
+  { 14, 11,    82 }, { 18, 11,    63 }, { 19, 11,    45 }, {  7, 11,  1364 },
+  {  7, 11,  1907 }, { 13, 11,   158 }, {  4, 11,   404 }, {  4, 11,   659 },
+  {  7, 11,   675 }, { 13, 11,   211 }, { 14, 11,   133 }, { 14, 11,   204 },
+  { 15, 11,    64 }, { 15, 11,    69 }, { 15, 11,   114 }, { 16, 11,    10 },
+  { 19, 11,    23 }, { 19, 11,    35 }, { 19, 11,    39 }, { 19, 11,    51 },
+  { 19, 11,    71 }, { 19, 11,    75 }, { 24, 11,    15 }, {  4, 10,    78 },
+  {  5, 10,    96 }, {  5, 10,   182 }, {  7, 10,  1724 }, {  7, 10,  1825 },
+  { 10, 10,   394 }, { 10, 10,   471 }, { 11, 10,   532 }, { 14, 10,   340 },
+  { 17, 10,    88 }, {  7, 10,  1964 }, {  5, 11,   391 }, { 11, 11,   887 },
+  { 14, 11,   365 }, { 14, 11,   375 }, {  5, 11,   540 }, {  6, 11,  1697 },
+  {  7, 11,   222 }, {  8, 11,   341 }, {  6, 11,    78 }, {  9,  0,   601 },
+  {  9,  0,   619 }, { 10,  0,   505 }, { 10,  0,   732 }, { 11,  0,   355 },
+  { 12,  0,   139 }, {  6,  0,   292 }, { 11,  0,   174 }, {  5,  0,   177 },
+  {  6,  0,   616 }, {  7,  0,   827 }, {  9,  0,   525 }, { 10,  0,   656 },
+  { 10,  0,    31 }, {  6, 10,   215 }, {  7, 10,  1028 }, {  7, 10,  1473 },
+  {  7, 10,  1721 }, {  9, 10,   424 }, { 10, 10,   779 }, {  7, 10,   584 },
+  {  8, 11,   293 }, {  6,  0,   685 }, {  7, 11,  1868 }, {  5, 11,   460 },
+  {  7,  0,   647 }, {  6, 10,    67 }, {  7, 10,  1630 }, {  9, 10,   354 },
+  {  9, 10,   675 }, { 10, 10,   830 }, { 14, 10,    80 }, { 17, 10,    80 },
+  {  4,  0,   161 }, {  5,  0,   631 }, {  6, 10,   141 }, {  7, 10,   225 },
+  {  9, 10,    59 }, {  9, 10,   607 }, { 10, 10,   312 }, { 11, 10,   687 },
+  { 12, 10,   555 }, { 13, 10,   373 }, { 13, 10,   494 }, { 20, 10,    58 },
+  {  7, 11,   965 }, {  7, 11,  1460 }, {  7, 11,  1604 }, {  8, 10,   783 },
+  {  6, 11,   388 }, {  6,  0,   722 }, {  6,  0,  1267 }, {  4, 11,   511 },
+  {  9, 11,   333 }, {  9, 11,   379 }, { 10, 11,   602 }, { 11, 11,   441 },
+  { 11, 11,   723 }, { 11, 11,   976 }, { 12, 11,   357 }, {  6,  0,  1797 },
+  {  7,  0,  1684 }, {  9,  0,   469 }, {  9,  0,   709 }, { 12,  0,   512 },
+  { 14,  0,    65 }, { 17,  0,    12 }, {  5, 11,   938 }, {  8, 11,   707 },
+  {  7,  0,  1230 }, {  8,  0,   531 }, { 10,  0,   229 }, { 11,  0,    73 },
+  { 11,  0,   376 }, { 11,  0,   433 }, { 12,  0,   268 }, { 12,  0,   640 },
+  { 14,  0,   119 }, {  7, 10,   430 }, { 11, 10,    46 }, {  6,  0,   558 },
+  {  7,  0,   651 }, {  8,  0,   421 }, {  9,  0,     0 }, { 10,  0,    34 },
+  { 11,  0,  1008 }, {  6,  0,   106 }, {  7,  0,  1786 }, {  7,  0,  1821 },
+  {  9,  0,   102 }, {  9,  0,   763 }, {  5, 10,   602 }, {  7, 10,  2018 },
+  {  9, 10,   418 }, {  5,  0,    65 }, {  6,  0,   416 }, {  7,  0,  1720 },
+  {  7,  0,  1924 }, { 10,  0,   109 }, { 11,  0,    14 }, { 11,  0,    70 },
+  { 11,  0,   569 }, { 11,  0,   735 }, { 15,  0,   153 }, { 20,  0,    80 },
+  {  8, 10,   677 }, {  7, 11,  1625 }, {  9, 11,   772 }, {  8,  0,   595 },
+  {  6, 11,   469 }, {  7, 11,  1709 }, { 10, 11,   515 }, {  7,  0,  1832 },
+  { 10,  0,   374 }, {  9,  0,   106 }, {  9,  0,   163 }, {  9,  0,   296 },
+  { 10,  0,   167 }, { 10,  0,   172 }, { 10,  0,   777 }, { 11,  0,    16 },
+  {  6,  0,     6 }, {  7,  0,    81 }, {  7,  0,   771 }, {  7,  0,  1731 },
+  {  9,  0,   405 }, { 10,  0,   421 }, {  4, 11,   500 }, {  7, 11,   938 },
+  {  5, 11,    68 }, {  6, 11,   383 }, {  5,  0,   881 }, {  5,  0,   885 },
+  {  6,  0,   854 }, {  6,  0,  1132 }, {  6,  0,  1495 }, {  6,  0,  1526 },
+  {  6,  0,  1533 }, {  6,  0,  1577 }, {  4, 11,   337 }, {  6, 11,   353 },
+  {  7, 11,  1934 }, {  8, 11,   488 }, {  9, 11,   429 }, {  7, 11,   236 },
+  {  7, 11,  1795 }, {  8, 11,   259 }, {  9, 11,   135 }, {  9, 11,   177 },
+  { 10, 11,   825 }, { 11, 11,   115 }, { 11, 11,   370 }, { 11, 11,   405 },
+  { 11, 11,   604 }, { 12, 11,    10 }, { 12, 11,   667 }, { 12, 11,   669 },
+  { 13, 11,    76 }, { 14, 11,   310 }, { 15, 11,    76 }, { 15, 11,   147 },
+  { 20, 11,    23 }, {  5,  0,   142 }, {  6,  0,   546 }, {  4, 11,    15 },
+  {  5, 11,    22 }, {  6, 11,   244 }, {  7, 11,    40 }, {  7, 11,   200 },
+  {  7, 11,   906 }, {  7, 11,  1199 }, {  9, 11,   616 }, { 10, 11,   716 },
+  { 11, 11,   635 }, { 11, 11,   801 }, { 12, 11,   458 }, {  5,  0,   466 },
+  { 11,  0,   571 }, { 12,  0,   198 }, { 13,  0,   283 }, { 14,  0,   186 },
+  { 15,  0,    21 }, { 15,  0,   103 }, {  7, 10,   329 }, {  4,  0,   185 },
+  {  5,  0,   257 }, {  5,  0,   839 }, {  5,  0,   936 }, {  9,  0,   399 },
+  { 10,  0,   258 }, { 10,  0,   395 }, { 10,  0,   734 }, { 11,  0,  1014 },
+  { 12,  0,    23 }, { 13,  0,   350 }, { 14,  0,   150 }, { 19,  0,     6 },
+  {  7, 11,  1735 }, { 12, 11,    36 }, { 13, 11,   337 }, {  5, 11,   598 },
+  {  7, 11,   791 }, {  8, 11,   108 }, {  9, 11,   123 }, {  4, 10,   469 },
+  {  7,  0,   404 }, {  7,  0,  1377 }, {  7,  0,  1430 }, {  7,  0,  2017 },
+  {  8,  0,   149 }, {  8,  0,   239 }, {  8,  0,   512 }, {  8,  0,   793 },
+  {  8,  0,   818 }, {  9,  0,   474 }, {  9,  0,   595 }, { 10,  0,   122 },
+  { 10,  0,   565 }, { 10,  0,   649 }, { 10,  0,   783 }, { 11,  0,   239 },
+  { 11,  0,   295 }, { 11,  0,   447 }, { 11,  0,   528 }, { 11,  0,   639 },
+  { 11,  0,   800 }, { 12,  0,    25 }, { 12,  0,    77 }, { 12,  0,   157 },
+  { 12,  0,   256 }, { 12,  0,   316 }, { 12,  0,   390 }, { 12,  0,   391 },
+  { 12,  0,   395 }, { 12,  0,   478 }, { 12,  0,   503 }, { 12,  0,   592 },
+  { 12,  0,   680 }, { 13,  0,    50 }, { 13,  0,    53 }, { 13,  0,   132 },
+  { 13,  0,   198 }, { 13,  0,   322 }, { 13,  0,   415 }, { 13,  0,   511 },
+  { 14,  0,    71 }, { 14,  0,   395 }, { 15,  0,    71 }, { 15,  0,   136 },
+  { 17,  0,   123 }, { 18,  0,    93 }, { 19,  0,    58 }, {  8,  0,   712 },
+  {  6, 10,  1743 }, {  5, 10,   929 }, {  6, 10,   340 }, {  8, 10,   376 },
+  {  8, 10,   807 }, {  6,  0,  1848 }, {  8,  0,   860 }, { 10,  0,   856 },
+  { 10,  0,   859 }, { 10,  0,   925 }, { 10,  0,   941 }, { 12,  0,   762 },
+  {  6,  0,   629 }, {  6,  0,   906 }, {  9,  0,   810 }, { 12,  0,   652 },
+  {  5, 10,   218 }, {  7, 10,  1610 }, { 10, 10,    83 }, {  7, 10,  1512 },
+  {  7, 10,  1794 }, {  4,  0,   377 }, { 24,  0,    13 }, {  4, 11,   155 },
+  {  7, 11,  1689 }, { 11, 10,     0 }, { 16, 10,    78 }, {  4, 11,   164 },
+  {  5, 11,   151 }, {  5, 11,   730 }, {  5, 11,   741 }, {  7, 11,   498 },
+  {  7, 11,   870 }, {  7, 11,  1542 }, { 12, 11,   213 }, { 14, 11,    36 },
+  { 14, 11,   391 }, { 17, 11,   111 }, { 18, 11,     6 }, { 18, 11,    46 },
+  { 18, 11,   151 }, { 19, 11,    36 }, { 20, 11,    32 }, { 20, 11,    56 },
+  { 20, 11,    69 }, { 20, 11,   102 }, { 21, 11,     4 }, { 22, 11,     8 },
+  { 22, 11,    10 }, { 22, 11,    14 }, { 22, 11,    31 }, {  7,  0,  1842 },
+  {  5, 10,   571 }, {  4, 10,   455 }, {  4, 11,   624 }, {  7, 11,  1752 },
+  {  6,  0,  1501 }, {  4, 11,   492 }, {  5, 11,   451 }, {  6, 10,   161 },
+  {  7, 10,   372 }, {  9, 10,   597 }, {  4, 10,   349 }, {  4,  0,   180 },
+  {  7,  0,  1906 }, {  7, 11,   835 }, { 13, 11,    70 }, {  4,  0,   491 },
+  {  9, 10,   751 }, {  6, 10,   432 }, { 11, 10,   322 }, {  4,  0,   171 },
+  { 10,  0,   234 }, {  6, 11,   113 }, {  7, 11,   436 }, {  4,  0,   586 },
+  {  7,  0,  1186 }, { 10,  0,   631 }, {  5, 10,   468 }, { 10, 10,   325 },
+  { 11, 10,   856 }, { 12, 10,   345 }, { 15, 10,   104 }, {  5, 10,   223 },
+  { 10, 11,   592 }, { 10, 11,   753 }, { 12, 11,   317 }, { 12, 11,   355 },
+  { 12, 11,   465 }, { 12, 11,   469 }, { 12, 11,   560 }, { 12, 11,   578 },
+  { 13, 11,   243 }, {  4, 10,   566 }, {  7, 11,   520 }, {  4, 10,    59 },
+  {  7, 10,  1394 }, {  6, 10,   436 }, { 11, 10,   481 }, {  9,  0,   931 },
+  { 10,  0,   334 }, { 20,  0,    71 }, {  4, 10,    48 }, {  5, 10,   271 },
+  {  7, 10,   953 }, {  7, 11,  1878 }, { 11,  0,   170 }, {  5, 10,   610 },
+  {  8, 10,   457 }, {  5, 10,   755 }, {  6,  0,  1587 }, {  7, 10,  1217 },
+  {  4, 10,   197 }, { 21, 11,    26 }, {  5, 11,   585 }, {  9, 11,   521 },
+  {  5,  0,   765 }, {  5, 10,   217 }, { 11, 11,   586 }, {  5,  0,   424 },
+  {  9, 11,   752 }, { 12, 11,   610 }, { 13, 11,   431 }, { 16, 11,    59 },
+  { 18, 11,   109 }, {  8,  0,   714 }, {  7,  0,   685 }, {  4, 11,   307 },
+  {  9,  0,   420 }, { 10,  0,   269 }, { 10,  0,   285 }, { 10,  0,   576 },
+  { 11,  0,   397 }, { 13,  0,   175 }, { 17,  0,    90 }, {  4,  0,   429 },
+  {  5, 11,   964 }, {  9, 11,   463 }, { 10, 11,   595 }, {  7,  0,    18 },
+  {  7,  0,   699 }, {  7,  0,  1966 }, {  8,  0,   752 }, {  9,  0,   273 },
+  {  9,  0,   412 }, {  9,  0,   703 }, { 10,  0,    71 }, { 10,  0,   427 },
+  { 10,  0,   508 }, {  4, 10,   165 }, {  7, 10,  1398 }, {  7, 10,  1829 },
+  {  4,  0,    53 }, {  5,  0,   186 }, {  7,  0,   752 }, {  7,  0,   828 },
+  { 14,  0,   116 }, {  8,  0,   575 }, { 10,  0,   289 }, { 11,  0,   319 },
+  {  4,  0,   675 }, {  6,  0,  1424 }, {  4, 11,    75 }, {  5, 11,   180 },
+  {  6, 11,   500 }, {  7, 11,    58 }, {  7, 11,   710 }, { 10, 11,   645 },
+  {  5, 11,   649 }, {  6, 11,   276 }, {  7, 11,   282 }, {  7, 11,   879 },
+  {  7, 11,   924 }, {  8, 11,   459 }, {  9, 11,   599 }, {  9, 11,   754 },
+  { 11, 11,   574 }, { 12, 11,   128 }, { 12, 11,   494 }, { 13, 11,    52 },
+  { 13, 11,   301 }, { 15, 11,    30 }, { 15, 11,   132 }, {  6,  0,   647 },
+  {  6,  0,  1095 }, {  5, 10,     9 }, {  7, 10,   297 }, {  7, 10,   966 },
+  { 12, 10,   306 }, {  4, 11,   200 }, {  6,  0,  1334 }, {  5, 10,   146 },
+  {  6, 10,   411 }, { 10, 10,   721 }, {  6,  0,   209 }, {  6,  0,  1141 },
+  {  6,  0,  1288 }, {  8,  0,   468 }, {  9,  0,   210 }, { 11,  0,    36 },
+  { 12,  0,    28 }, { 12,  0,   630 }, { 13,  0,    21 }, { 13,  0,   349 },
+  { 14,  0,     7 }, { 17,  0,    13 }, {  6, 10,   177 }, {  7, 10,   467 },
+  {  4,  0,   342 }, {  7,  0,  1179 }, { 10, 11,   454 }, { 12, 11,   324 },
+  {  4,  0,   928 }, {  5,  0,   910 }, {  7,  0,  1838 }, {  6, 11,   225 },
+  {  9, 11,   211 }, { 16,  0,   101 }, { 20,  0,   115 }, { 20,  0,   118 },
+  { 20,  0,   122 }, {  4,  0,   496 }, {  7,  0,   856 }, {  4,  0,   318 },
+  { 11,  0,   654 }, {  7, 11,   718 }, { 11, 11,   102 }, {  8, 11,    58 },
+  {  9, 11,   724 }, { 11, 11,   809 }, { 13, 11,   113 }, { 17, 11,    72 },
+  {  5, 10,   200 }, {  6, 11,   345 }, {  7, 11,  1247 }, {  8, 11,   767 },
+  {  8, 11,   803 }, {  9, 11,   301 }, {  9, 11,   903 }, {  7,  0,   915 },
+  {  8,  0,   247 }, { 19,  0,     0 }, {  7, 11,  1949 }, {  8, 11,   674 },
+  {  4,  0,   202 }, {  5,  0,   382 }, {  6,  0,   454 }, {  7,  0,   936 },
+  {  7,  0,  1803 }, {  8,  0,   758 }, {  9,  0,   375 }, {  9,  0,   895 },
+  { 10,  0,   743 }, { 10,  0,   792 }, { 11,  0,   978 }, { 11,  0,  1012 },
+  { 14,  0,   109 }, {  7,  0,  1150 }, {  7,  0,  1425 }, {  7,  0,  1453 },
+  { 12,  0,   513 }, {  6, 11,   259 }, { 10,  0,   791 }, { 11,  0,   821 },
+  { 12,  0,   110 }, { 12,  0,   153 }, { 18,  0,    41 }, { 22,  0,    19 },
+  {  6, 10,   481 }, {  4,  0,   796 }, {  6,  0,   445 }, {  9,  0,   909 },
+  {  8, 11,   254 }, { 10,  0,   776 }, { 13,  0,   345 }, { 14,  0,   425 },
+  {  4, 10,    84 }, {  7, 10,  1482 }, { 10, 10,    76 }, { 10, 10,   142 },
+  {  7, 11,   742 }, {  6,  0,   578 }, {  5, 10,  1015 }, {  6,  0,  1387 },
+  {  4, 10,   315 }, {  5, 10,   507 }, {  7, 10,  1370 }, {  4,  0,   438 },
+  {  5,  0,   555 }, {  8,  0,   766 }, {  5, 11,   248 }, {  6, 10,  1722 },
+  {  4, 11,   116 }, {  5, 11,    95 }, {  5, 11,   445 }, {  7, 11,  1688 },
+  {  8, 11,    29 }, {  9, 11,   272 }, { 11, 11,   509 }, { 11, 11,   915 },
+  {  7,  0,   541 }, {  5, 11,   543 }, {  8, 10,   222 }, {  8, 10,   476 },
+  {  9, 10,   238 }, { 11, 10,   516 }, { 11, 10,   575 }, { 15, 10,   109 },
+  { 18, 10,   100 }, {  6,  0,   880 }, {  6,  0,  1191 }, {  5, 11,   181 },
+  {  8, 11,    41 }, {  6,  0,  1506 }, {  4, 11,   681 }, {  7, 11,    25 },
+  {  8, 11,   202 }, { 10, 11,   536 }, { 11,  0,   983 }, {  9,  0,   768 },
+  {  4,  0,   584 }, {  9, 11,   423 }, { 12, 11,    89 }, {  8, 11,   113 },
+  {  9, 11,   877 }, { 10, 11,   554 }, { 11, 11,    83 }, { 12, 11,   136 },
+  { 19, 11,   109 }, {  7, 10,   706 }, {  7, 10,  1058 }, { 10, 10,   538 },
+  {  5, 11,   976 }, {  4, 11,   206 }, {  7, 11,   746 }, {  8, 11,   526 },
+  { 12,  0,   737 }, { 11, 10,    92 }, { 11, 10,   196 }, { 11, 10,   409 },
+  { 11, 10,   450 }, { 11, 10,   666 }, { 11, 10,   777 }, { 12, 10,   262 },
+  { 13, 10,   385 }, { 13, 10,   393 }, { 15, 10,   115 }, { 16, 10,    45 },
+  { 17, 10,    82 }, {  4,  0,   226 }, {  4,  0,   326 }, {  7,  0,  1770 },
+  {  4, 11,   319 }, {  5, 11,   699 }, { 10, 11,   673 }, {  6, 10,    40 },
+  {  7, 10,  1781 }, {  5,  0,   426 }, {  8,  0,    30 }, {  9,  0,     2 },
+  { 11,  0,   549 }, { 19,  0,   122 }, {  6,  0,  1161 }, {  6,  0,  1329 },
+  { 10, 10,    97 }, {  6, 10,   423 }, {  7, 10,   665 }, {  7, 10,  1210 },
+  {  7, 11,    13 }, {  8, 11,   226 }, { 10, 11,   537 }, { 11, 11,   570 },
+  { 11, 11,   605 }, { 11, 11,   799 }, { 11, 11,   804 }, { 12, 11,    85 },
+  { 12, 11,   516 }, { 12, 11,   623 }, { 13, 11,   112 }, { 13, 11,   361 },
+  { 14, 11,    77 }, { 14, 11,    78 }, { 17, 11,    28 }, { 19, 11,   110 },
+  {  4, 11,   769 }, {  4, 11,   551 }, {  4, 11,   728 }, { 19,  0,   117 },
+  {  9, 11,    57 }, {  9, 11,   459 }, { 10, 11,   425 }, { 11, 11,   119 },
+  { 12, 11,   184 }, { 12, 11,   371 }, { 13, 11,   358 }, { 17, 11,    51 },
+  {  5, 11,   188 }, {  5, 11,   814 }, {  8, 11,    10 }, {  9, 11,   421 },
+  {  9, 11,   729 }, { 10, 11,   609 }, { 11, 11,   689 }, {  6, 11,   624 },
+  {  7, 11,   298 }, {  7,  0,   462 }, {  4,  0,   345 }, { 11, 10,   624 },
+  {  8, 10,   574 }, {  4,  0,   385 }, {  7,  0,   265 }, {  7,  0,   587 },
+  {  6,  0,   808 }, {  4, 11,   528 }, {  5,  0,   398 }, {  4, 10,   354 },
+  {  4,  0,   347 }, {  5,  0,   423 }, {  5,  0,   996 }, {  7,  0,  1329 },
+  {  7, 10,  1558 }, {  7,  0,  1259 }, {  9,  0,   125 }, { 11,  0,    65 },
+  {  5,  0,   136 }, {  6,  0,   136 }, {  8,  0,   644 }, {  5, 11,   104 },
+  {  6, 11,   173 }, {  7, 11,  1631 }, {  7,  0,   469 }, {  5, 10,   830 },
+  {  4,  0,   278 }, {  5,  0,   465 }, {  7,  0,  1367 }, {  7, 11,   810 },
+  {  8, 11,   138 }, {  8, 11,   342 }, {  9, 11,    84 }, { 10, 11,   193 },
+  { 11, 11,   883 }, { 12, 11,   359 }, {  5, 10,   496 }, {  7, 10,   203 },
+  {  4,  0,   433 }, {  5,  0,   719 }, {  6, 11,    95 }, {  6, 10,   547 },
+  {  5, 10,    88 }, {  9, 10,   239 }, {  6, 11,   406 }, { 10, 11,   409 },
+  { 10, 11,   447 }, { 11, 11,    44 }, { 12, 11,   100 }, {  6,  0,  1423 },
+  {  7, 10,   650 }, {  7, 10,  1310 }, {  6,  0,   749 }, {  7, 11,  1243 },
+  {  7,  0,  1363 }, {  6,  0,   381 }, {  7,  0,   645 }, {  7,  0,   694 },
+  {  8,  0,   546 }, {  7, 10,  1076 }, {  9, 10,    80 }, { 11, 10,    78 },
+  { 11, 10,   421 }, { 11, 10,   534 }, { 12, 10,   545 }, {  6, 11,  1636 },
+  {  7, 11,  1344 }, { 12,  0,   277 }, {  7, 10,   274 }, { 11, 10,   479 },
+  { 11, 10,   507 }, {  6,  0,   705 }, {  6,  0,   783 }, {  6,  0,  1275 },
+  {  6,  0,  1481 }, {  4, 11,   282 }, {  7, 11,  1034 }, { 11, 11,   398 },
+  { 11, 11,   634 }, { 12, 11,     1 }, { 12, 11,    79 }, { 12, 11,   544 },
+  { 14, 11,   237 }, { 17, 11,    10 }, { 18, 11,    20 }, {  6,  0,   453 },
+  {  4,  0,   555 }, {  8,  0,   536 }, { 10,  0,   288 }, { 11,  0,  1005 },
+  {  4, 10,   497 }, {  7, 10,  1584 }, {  5, 11,   118 }, {  5, 11,   499 },
+  {  6, 11,   476 }, {  7, 11,   600 }, {  7, 11,   888 }, {  7, 11,  1096 },
+  { 10,  0,   987 }, {  7,  0,  1107 }, {  7, 10,   261 }, {  7, 10,  1115 },
+  {  7, 10,  1354 }, {  7, 10,  1588 }, {  7, 10,  1705 }, {  7, 10,  1902 },
+  {  9, 10,   465 }, { 10, 10,   248 }, { 10, 10,   349 }, { 10, 10,   647 },
+  { 11, 10,   527 }, { 11, 10,   660 }, { 11, 10,   669 }, { 12, 10,   529 },
+  { 13, 10,   305 }, {  7, 11,   296 }, {  7, 11,   596 }, {  8, 11,   560 },
+  {  8, 11,   586 }, {  9, 11,   612 }, { 11, 11,   100 }, { 11, 11,   304 },
+  { 12, 11,    46 }, { 13, 11,    89 }, { 14, 11,   112 }, { 17, 11,   122 },
+  {  9,  0,   370 }, { 10,  0,    90 }, {  8, 10,    13 }, {  4,  0,   860 },
+  {  7, 10,   642 }, {  8, 10,   250 }, { 11, 10,   123 }, { 11, 10,   137 },
+  { 13, 10,    48 }, { 14, 10,    95 }, {  7, 10,  1429 }, {  9, 11,   321 },
+  {  4,  0,   257 }, {  7,  0,  2031 }, {  7,  0,  1768 }, {  7, 11,  1599 },
+  {  7, 11,  1723 }, {  8, 11,    79 }, {  8, 11,   106 }, {  8, 11,   190 },
+  {  8, 11,   302 }, {  8, 11,   383 }, {  9, 11,   119 }, {  9, 11,   233 },
+  {  9, 11,   298 }, {  9, 11,   419 }, {  9, 11,   471 }, { 10, 11,   181 },
+  { 10, 11,   406 }, { 11, 11,    57 }, { 11, 11,    85 }, { 11, 11,   120 },
+  { 11, 11,   177 }, { 11, 11,   296 }, { 11, 11,   382 }, { 11, 11,   454 },
+  { 11, 11,   758 }, { 11, 11,   999 }, { 12, 11,    27 }, { 12, 11,    98 },
+  { 12, 11,   131 }, { 12, 11,   245 }, { 12, 11,   312 }, { 12, 11,   446 },
+  { 12, 11,   454 }, { 13, 11,    25 }, { 13, 11,    98 }, { 13, 11,   426 },
+  { 13, 11,   508 }, { 14, 11,     6 }, { 14, 11,   163 }, { 14, 11,   272 },
+  { 14, 11,   277 }, { 14, 11,   370 }, { 15, 11,    95 }, { 15, 11,   138 },
+  { 15, 11,   167 }, { 17, 11,    18 }, { 17, 11,    38 }, { 20, 11,    96 },
+  { 21, 11,    32 }, {  5, 11,   722 }, {  6, 11,  1759 }, { 17, 11,    16 },
+  {  6,  0,  1071 }, {  6,  0,  1561 }, { 10, 10,   545 }, { 12, 10,   301 },
+  {  6,  0,    83 }, {  6,  0,  1733 }, {  7,  0,  1389 }, {  4,  0,   835 },
+  {  7,  0,  1818 }, {  5, 11,   258 }, {  4, 10,   904 }, {  5, 10,   794 },
+  {  6,  0,  2006 }, {  5, 11,    30 }, {  7, 11,   495 }, {  8, 11,   134 },
+  {  9, 11,   788 }, { 12, 11,   438 }, {  7, 11,  2004 }, {  9,  0,   696 },
+  {  5, 11,    50 }, {  6, 11,   439 }, {  7, 11,   780 }, {  7, 11,  1040 },
+  {  7, 11,   772 }, {  7, 11,  1104 }, {  7, 11,  1647 }, { 11, 11,   269 },
+  { 11, 11,   539 }, { 11, 11,   607 }, { 11, 11,   627 }, { 11, 11,   706 },
+  { 11, 11,   975 }, { 12, 11,   248 }, { 12, 11,   311 }, { 12, 11,   434 },
+  { 12, 11,   600 }, { 12, 11,   622 }, { 13, 11,   297 }, { 13, 11,   367 },
+  { 13, 11,   485 }, { 14, 11,    69 }, { 14, 11,   409 }, { 15, 11,   108 },
+  {  5, 11,     1 }, {  6, 11,    81 }, { 10, 11,   520 }, {  7,  0,  1718 },
+  {  9,  0,    95 }, {  9,  0,   274 }, { 10,  0,   279 }, { 10,  0,   317 },
+  { 10,  0,   420 }, { 11,  0,   303 }, { 11,  0,   808 }, { 12,  0,   134 },
+  { 12,  0,   367 }, { 13,  0,   149 }, { 13,  0,   347 }, { 14,  0,   349 },
+  { 14,  0,   406 }, { 18,  0,    22 }, { 18,  0,    89 }, { 18,  0,   122 },
+  { 19,  0,    47 }, {  5, 11,   482 }, {  8, 11,    98 }, {  9, 11,   172 },
+  { 10, 11,   222 }, { 10, 11,   700 }, { 10, 11,   822 }, { 11, 11,   302 },
+  { 11, 11,   778 }, { 12, 11,    50 }, { 12, 11,   127 }, { 12, 11,   396 },
+  { 13, 11,    62 }, { 13, 11,   328 }, { 14, 11,   122 }, { 19, 11,    72 },
+  {  7, 10,   386 }, { 10, 10,   713 }, {  6, 10,     7 }, {  6, 10,    35 },
+  {  7, 10,   147 }, {  7, 10,  1069 }, {  7, 10,  1568 }, {  7, 10,  1575 },
+  {  7, 10,  1917 }, {  8, 10,    43 }, {  8, 10,   208 }, {  9, 10,   128 },
+  {  9, 10,   866 }, { 10, 10,    20 }, { 11, 10,   981 }, { 19, 10,    33 },
+  {  5,  0,    26 }, {  4,  0,   550 }, {  5, 11,     2 }, {  7, 11,  1494 },
+  {  8, 11,   589 }, {  6, 11,   512 }, {  7, 11,   797 }, {  8, 11,   253 },
+  {  9, 11,    77 }, { 10, 11,     1 }, { 10, 11,   129 }, { 10, 11,   225 },
+  { 11, 11,   118 }, { 11, 11,   226 }, { 11, 11,   251 }, { 11, 11,   430 },
+  { 11, 11,   701 }, { 11, 11,   974 }, { 11, 11,   982 }, { 12, 11,    64 },
+  { 12, 11,   260 }, { 12, 11,   488 }, { 12, 11,   690 }, {  7, 10,   893 },
+  { 13, 10,   424 }, {  6,  0,   901 }, {  8,  0,   822 }, {  4,  0,   902 },
+  {  5,  0,   809 }, {  6,  0,   122 }, {  6,  0,   807 }, {  6,  0,  1366 },
+  {  7,  0,   262 }, {  5, 11,   748 }, {  6, 11,   553 }, {  5,  0,   620 },
+  {  4,  0,    34 }, {  5,  0,   574 }, {  7,  0,   279 }, {  7,  0,  1624 },
+  {  8,  0,   601 }, {  9,  0,   170 }, {  6, 10,   322 }, {  9, 10,   552 },
+  { 11, 10,   274 }, { 13, 10,   209 }, { 13, 10,   499 }, { 14, 10,    85 },
+  { 15, 10,   126 }, { 17, 10,    70 }, {  4,  0,   537 }, {  4, 11,    12 },
+  {  7, 11,   420 }, {  7, 11,   522 }, {  7, 11,   809 }, {  8, 11,   797 },
+  { 13, 11,    88 }, {  5,  0,   332 }, {  8, 10,    83 }, {  8, 10,   742 },
+  {  8, 10,   817 }, {  9, 10,    28 }, {  9, 10,    29 }, {  9, 10,   885 },
+  { 10, 10,   387 }, { 11, 10,   633 }, { 11, 10,   740 }, { 13, 10,   235 },
+  { 13, 10,   254 }, { 15, 10,   143 }, { 15, 10,   146 }, {  6,  0,  1909 },
+  {  9,  0,   964 }, { 12,  0,   822 }, { 12,  0,   854 }, { 12,  0,   865 },
+  { 12,  0,   910 }, { 12,  0,   938 }, { 15,  0,   169 }, { 15,  0,   208 },
+  { 15,  0,   211 }, { 18,  0,   205 }, { 18,  0,   206 }, { 18,  0,   220 },
+  { 18,  0,   223 }, { 24,  0,    24 }, { 12, 10,    49 }, {  5, 11,   528 },
+  {  7, 11,  1580 }, {  6,  0,   261 }, {  8,  0,   182 }, { 11,  0,   943 },
+  {  6,  0,  1721 }, {  4,  0,   933 }, {  5,  0,   880 }, {  8, 11,   321 },
+  {  5, 11,   266 }, {  9, 11,   290 }, {  9, 11,   364 }, { 10, 11,   293 },
+  { 11, 11,   606 }, { 14, 11,    45 }, {  6,  0,  1609 }, {  4, 11,    50 },
+  {  6, 11,   510 }, {  6, 11,   594 }, {  9, 11,   121 }, { 10, 11,    49 },
+  { 10, 11,   412 }, { 11, 11,   834 }, {  7,  0,   895 }, {  8, 11,   748 },
+  {  4, 11,   466 }, {  4, 10,   110 }, { 10, 10,   415 }, { 10, 10,   597 },
+  { 14, 10,   206 }, {  5,  0,   812 }, {  7, 11,   281 }, {  6,  0,  1890 },
+  {  6,  0,  1902 }, {  6,  0,  1916 }, {  9,  0,   929 }, {  9,  0,   942 },
+  {  9,  0,   975 }, {  9,  0,   984 }, {  9,  0,   986 }, {  9,  0,  1011 },
+  {  9,  0,  1019 }, { 12,  0,   804 }, { 12,  0,   851 }, { 12,  0,   867 },
+  { 12,  0,   916 }, { 12,  0,   923 }, { 15,  0,   194 }, { 15,  0,   204 },
+  { 15,  0,   210 }, { 15,  0,   222 }, { 15,  0,   223 }, { 15,  0,   229 },
+  { 15,  0,   250 }, { 18,  0,   179 }, { 18,  0,   186 }, { 18,  0,   192 },
+  {  7, 10,   205 }, {  7, 10,  2000 }, {  4, 11,   667 }, {  7,  0,   778 },
+  {  4,  0,   137 }, {  7,  0,  1178 }, {  7,  0,  1520 }, {  6,  0,  1314 },
+  {  4, 11,   242 }, {  6, 11,   333 }, {  6,  0,  1661 }, {  7,  0,  1975 },
+  {  7,  0,  2009 }, {  7,  0,  2011 }, {  6,  0,  1591 }, {  4, 10,   283 },
+  {  7, 10,  1194 }, { 11,  0,   820 }, { 22,  0,    51 }, {  4, 11,    39 },
+  {  5, 11,    36 }, {  7, 11,  1843 }, {  8, 11,   407 }, { 11, 11,   144 },
+  { 12, 11,   523 }, {  6, 10,  1720 }, {  4, 11,   510 }, {  7, 11,    29 },
+  {  7, 11,    66 }, {  7, 11,  1980 }, { 10, 11,   487 }, { 10, 11,   809 },
+  { 18, 11,     9 }, {  5,  0,    89 }, {  7,  0,  1915 }, {  9,  0,   185 },
+  {  9,  0,   235 }, { 10,  0,    64 }, { 10,  0,   270 }, { 10,  0,   403 },
+  { 10,  0,   469 }, { 10,  0,   529 }, { 10,  0,   590 }, { 11,  0,   140 },
+  { 11,  0,   860 }, { 13,  0,     1 }, { 13,  0,   422 }, { 14,  0,   341 },
+  { 14,  0,   364 }, { 17,  0,    93 }, { 18,  0,   113 }, { 19,  0,    97 },
+  { 19,  0,   113 }, {  5,  0,   695 }, {  6,  0,   987 }, {  6,  0,  1160 },
+  {  5,  0,     6 }, {  6,  0,   183 }, {  7,  0,   680 }, {  7,  0,   978 },
+  {  7,  0,  1013 }, {  7,  0,  1055 }, { 12,  0,   230 }, { 13,  0,   172 },
+  { 18,  0,    29 }, {  6, 11,   570 }, {  4, 11,   787 }, {  6, 11,   518 },
+  {  6,  0,    29 }, { 11,  0,    63 }, {  4, 11,   516 }, {  8, 11,   821 },
+  {  4,  0,   311 }, {  6,  0,  1740 }, {  7,  0,   170 }, {  8,  0,    90 },
+  {  8,  0,   177 }, {  8,  0,   415 }, { 11,  0,   714 }, { 14,  0,   281 },
+  {  8, 10,   735 }, {  6,  0,  1961 }, {  7, 11,  1405 }, {  4, 11,    10 },
+  {  7, 11,   917 }, { 11, 11,   786 }, {  5, 10,   132 }, {  9, 10,   486 },
+  {  9, 10,   715 }, { 10, 10,   458 }, { 11, 10,   373 }, { 11, 10,   668 },
+  { 11, 10,   795 }, { 11, 10,   897 }, { 12, 10,   272 }, { 12, 10,   424 },
+  { 12, 10,   539 }, { 12, 10,   558 }, { 14, 10,   245 }, { 14, 10,   263 },
+  { 14, 10,   264 }, { 14, 10,   393 }, { 14, 10,   403 }, { 11,  0,    91 },
+  { 13,  0,   129 }, { 15,  0,   101 }, { 17,  0,   125 }, {  7,  0,  1132 },
+  {  4,  0,   494 }, {  6,  0,    74 }, {  7,  0,    44 }, {  7,  0,   407 },
+  { 12,  0,    17 }, { 15,  0,     5 }, { 20,  0,    11 }, {  5, 10,   379 },
+  {  5,  0,   270 }, {  5, 11,   684 }, {  6, 10,    89 }, {  6, 10,   400 },
+  {  7, 10,  1569 }, {  7, 10,  1623 }, {  7, 10,  1850 }, {  8, 10,   218 },
+  {  8, 10,   422 }, {  9, 10,   570 }, { 10, 10,   626 }, {  4,  0,   276 },
+  {  5,  0,   296 }, {  6,  0,  1523 }, {  6, 11,    27 }, {  6, 10,   387 },
+  {  7, 10,   882 }, { 13, 10,   111 }, {  6, 10,   224 }, {  7, 10,   877 },
+  {  9, 10,   647 }, {  7, 10,   790 }, {  4,  0,     7 }, {  5,  0,    90 },
+  {  5,  0,   158 }, {  6,  0,   542 }, {  7,  0,   221 }, {  7,  0,  1574 },
+  {  9,  0,   490 }, { 10,  0,   540 }, { 11,  0,   443 }, { 11,  0,   757 },
+  {  7,  0,   588 }, {  9,  0,   175 }, { 10,  0,   530 }, {  7, 10,   394 },
+  { 14, 11,    23 }, {  6,  0,   786 }, {  7,  0,   580 }, {  7,  0,    88 },
+  {  8,  0,   627 }, {  5,  0,   872 }, {  6,  0,    57 }, {  7,  0,   471 },
+  {  9,  0,   447 }, {  9,  0,   454 }, {  6, 11,   342 }, {  6, 11,   496 },
+  {  8, 11,   275 }, {  9, 11,   206 }, {  4, 11,   909 }, {  5, 11,   940 },
+  {  6,  0,   735 }, {  4, 11,   891 }, {  8,  0,   845 }, {  8,  0,   916 },
+  {  7, 10,  1409 }, {  5,  0,    31 }, {  6,  0,   614 }, { 11,  0,   458 },
+  { 12,  0,    15 }, { 12,  0,   432 }, {  8,  0,   330 }, { 12,  0,   477 },
+  {  4,  0,   530 }, {  5,  0,   521 }, {  7,  0,  1200 }, { 10,  0,   460 },
+  {  4, 11,   687 }, {  6,  0,   424 }, {  7,  0,  1866 }, {  9,  0,   569 },
+  { 12,  0,    12 }, { 12,  0,    81 }, { 12,  0,   319 }, { 13,  0,    69 },
+  { 14,  0,   259 }, { 16,  0,    87 }, { 17,  0,     1 }, { 17,  0,    21 },
+  { 17,  0,    24 }, { 18,  0,    15 }, { 18,  0,    56 }, { 18,  0,    59 },
+  { 18,  0,   127 }, { 18,  0,   154 }, { 19,  0,    19 }, { 20,  0,    31 },
+  {  7,  0,  1302 }, {  8, 10,    38 }, {  6, 11,   253 }, {  5, 10,   261 },
+  {  7, 10,    78 }, {  7, 10,   199 }, {  8, 10,   815 }, {  9, 10,   126 },
+  { 10, 10,   342 }, {  5,  0,   595 }, {  7,  0,  1863 }, {  6, 11,    41 },
+  { 13, 11,   160 }, {  5,  0,    13 }, {  6,  0,   142 }, {  6,  0,    97 },
+  {  7,  0,   116 }, {  8,  0,   322 }, {  8,  0,   755 }, {  9,  0,   548 },
+  { 10,  0,   714 }, { 11,  0,   884 }, { 13,  0,   324 }, {  7, 11,  1304 },
+  { 10, 11,   477 }, {  4, 10,   628 }, {  6, 11,  1718 }, {  7, 10,   266 },
+  {  8, 10,   804 }, {  7, 10,   208 }, {  7,  0,  1021 }, {  6, 10,    79 },
+  {  7, 10,  1519 }, {  7,  0,  1472 }, {  7,  0,  1554 }, {  6, 11,   362 },
+  { 18, 11,    51 }, {  7,  0,  1071 }, {  7,  0,  1541 }, {  7,  0,  1767 },
+  {  7,  0,  1806 }, { 11,  0,   162 }, { 11,  0,   242 }, { 11,  0,   452 },
+  { 12,  0,   605 }, { 15,  0,    26 }, { 16,  0,    44 }, {  8, 10,   741 },
+  {  5, 11,   115 }, { 17,  0,   115 }, {  6, 10,   376 }, {  6,  0,  1406 },
+  {  6,  0,  1543 }, {  5, 11,   193 }, { 12, 11,   178 }, { 13, 11,   130 },
+  { 17, 11,    84 }, {  7,  0,  1111 }, {  8,  0,     1 }, {  9,  0,   650 },
+  { 10,  0,   326 }, {  5, 11,   705 }, {  9, 11,   606 }, {  5,  0,   488 },
+  {  6,  0,   527 }, {  7,  0,   489 }, {  7,  0,  1636 }, {  8,  0,   121 },
+  {  8,  0,   144 }, {  8,  0,   359 }, {  9,  0,   193 }, {  9,  0,   241 },
+  {  9,  0,   336 }, {  9,  0,   882 }, { 11,  0,   266 }, { 11,  0,   372 },
+  { 11,  0,   944 }, { 12,  0,   401 }, { 12,  0,   641 }, {  7, 11,   174 },
+  {  6,  0,   267 }, {  7, 10,   244 }, {  7, 10,   632 }, {  7, 10,  1609 },
+  {  8, 10,   178 }, {  8, 10,   638 }, { 13, 10,    58 }, {  6,  0,  1983 },
+  {  6,  0,  1155 }, {  6,  0,  1575 }, {  6,  0,  1438 }, {  9,  0,    31 },
+  { 10,  0,   244 }, { 10,  0,   699 }, { 12,  0,   149 }, { 13,  0,   497 },
+  {  5,  0,   377 }, {  4, 11,   122 }, {  5, 11,   796 }, {  5, 11,   952 },
+  {  6, 11,  1660 }, {  6, 11,  1671 }, {  8, 11,   567 }, {  9, 11,   687 },
+  {  9, 11,   742 }, { 10, 11,   686 }, { 11, 11,   356 }, { 11, 11,   682 },
+  { 12, 11,   281 }, { 17,  0,   101 }, { 11, 11,     0 }, { 16, 11,    78 },
+  {  5, 11,   179 }, {  5, 10,   791 }, {  7, 11,  1095 }, {  7, 11,  1213 },
+  {  8, 11,   372 }, {  9, 11,   122 }, { 10, 11,   175 }, {  7, 10,   686 },
+  {  8, 10,    33 }, {  8, 10,   238 }, { 10, 10,   616 }, { 11, 10,   467 },
+  { 11, 10,   881 }, { 13, 10,   217 }, { 13, 10,   253 }, { 14, 10,   268 },
+  {  9,  0,   476 }, {  4, 11,    66 }, {  7, 11,   722 }, {  7, 11,   904 },
+  {  7, 11,   352 }, {  9, 11,   684 }, {  7,  0,  2023 }, {  7,  0,  1836 },
+  {  4, 10,   447 }, {  5,  0,   843 }, { 16,  0,    35 }, {  9, 11,   779 },
+  { 13, 11,    35 }, {  4, 10,   128 }, {  5, 10,   415 }, {  6, 10,   462 },
+  {  7, 10,   294 }, {  7, 10,   578 }, { 10, 10,   710 }, { 11, 10,    86 },
+  {  4,  0,   554 }, {  5,  0,   536 }, {  8, 10,   587 }, {  5,  0,   207 },
+  {  9,  0,    79 }, { 11,  0,   625 }, { 17,  0,     7 }, {  7,  0,  1371 },
+  {  6, 10,   427 }, { 10, 10,   692 }, {  4,  0,   424 }, {  4, 10,   195 },
+  {  7, 10,   802 }, {  8,  0,   785 }, {  5, 11,   564 }, {  7,  0,   336 },
+  {  4,  0,   896 }, {  6,  0,  1777 }, {  6, 11,   556 }, {  9, 11,   103 },
+  {  6, 10,  1683 }, {  7, 11,   544 }, {  8, 11,   719 }, { 10, 11,    61 },
+  { 10, 10,   472 }, {  4, 11,     5 }, {  5, 11,   498 }, {  8, 11,   637 },
+  {  7,  0,   750 }, {  9,  0,   223 }, { 11,  0,    27 }, { 11,  0,   466 },
+  { 12,  0,   624 }, { 14,  0,   265 }, { 18,  0,    61 }, { 12,  0,   238 },
+  { 18,  0,   155 }, { 12, 11,   238 }, { 18, 11,   155 }, { 23, 10,    28 },
+  {  5, 11,   927 }, { 12,  0,   383 }, {  5, 10,     3 }, {  8, 10,   578 },
+  {  9, 10,   118 }, { 10, 10,   705 }, { 13, 10,   279 }, {  4, 11,   893 },
+  {  5, 11,   780 }, {  5, 11,   893 }, {  4,  0,   603 }, {  5,  0,   661 },
+  {  4,  0,    11 }, {  6,  0,   128 }, {  7,  0,   231 }, {  7,  0,  1533 },
+  { 10,  0,   725 }, {  5, 10,   229 }, {  5, 11,   238 }, {  7, 11,  1350 },
+  {  8, 10,   102 }, { 10, 10,   578 }, { 10, 10,   672 }, { 12, 10,   496 },
+  { 13, 10,   408 }, { 14, 10,   121 }, { 17, 10,   106 }, {  4,  0,   476 },
+  {  6,  0,  1552 }, {  6, 11,  1729 }, {  8, 10,   115 }, {  8, 10,   350 },
+  {  9, 10,   489 }, { 10, 10,   128 }, { 11, 10,   306 }, { 12, 10,   373 },
+  { 14, 10,    30 }, { 17, 10,    79 }, { 19, 10,    80 }, { 22, 10,    55 },
+  {  7,  0,  1807 }, {  4,  0,   680 }, {  4, 11,    60 }, {  7, 11,   760 },
+  {  7, 11,  1800 }, {  8, 11,   314 }, {  9, 11,   700 }, { 11, 11,   487 },
+  {  4, 10,   230 }, {  5, 10,   702 }, { 20, 11,    94 }, {  4, 11,   228 },
+  { 11,  0,   435 }, {  9,  0,    20 }, { 10,  0,   324 }, { 10,  0,   807 },
+  { 11,  0,   488 }, {  6, 10,  1728 }, {  8, 11,   419 }, {  4, 10,   484 },
+  { 18, 10,    26 }, { 19, 10,    42 }, { 20, 10,    43 }, { 21, 10,     0 },
+  { 23, 10,    27 }, { 24, 10,    14 }, {  7,  0,  1431 }, {  5, 11,   828 },
+  {  5,  0,   112 }, {  6,  0,   103 }, {  6,  0,   150 }, {  7,  0,  1303 },
+  {  9,  0,   292 }, { 10,  0,   481 }, { 20,  0,    13 }, {  7, 11,   176 },
+  {  7, 11,   178 }, {  7, 11,  1110 }, { 10, 11,   481 }, { 20, 11,    13 },
+  { 10,  0,   356 }, {  4, 11,    51 }, {  5, 11,    39 }, {  6, 11,     4 },
+  {  7, 11,   591 }, {  7, 11,   849 }, {  7, 11,   951 }, {  7, 11,  1129 },
+  {  7, 11,  1613 }, {  7, 11,  1760 }, {  7, 11,  1988 }, {  9, 11,   434 },
+  { 10, 11,   754 }, { 11, 11,    25 }, { 11, 11,    37 }, { 11, 11,   414 },
+  {  6,  0,  1963 }, {  6,  0,  2000 }, {  4, 10,   633 }, {  6,  0,  1244 },
+  {  5, 11,   902 }, {  7, 11,   928 }, { 12,  0,    18 }, { 10,  0,   204 },
+  {  7, 11,  1173 }, {  6,  0,   867 }, {  4,  0,   708 }, {  8,  0,    15 },
+  {  9,  0,    50 }, {  9,  0,   386 }, { 11,  0,    18 }, { 11,  0,   529 },
+  { 12,  0,   228 }, {  6, 11,   270 }, {  4,  0,   563 }, {  7,  0,   109 },
+  {  7,  0,   592 }, {  7,  0,   637 }, {  7,  0,   770 }, {  8,  0,   463 },
+  {  9,  0,    60 }, {  9,  0,   335 }, {  9,  0,   904 }, { 10,  0,    73 },
+  { 11,  0,   434 }, { 12,  0,   585 }, { 13,  0,   331 }, { 18,  0,   110 },
+  { 20,  0,    60 }, {  4,  0,   502 }, { 14, 11,   359 }, { 19, 11,    52 },
+  { 20, 11,    47 }, {  6, 11,   377 }, {  7, 11,  1025 }, {  9, 11,   613 },
+  { 17, 11,   104 }, {  6,  0,   347 }, { 10,  0,   161 }, {  5, 10,    70 },
+  {  5, 10,   622 }, {  6, 10,   334 }, {  7, 10,  1032 }, {  9, 10,   171 },
+  { 11, 10,    26 }, { 11, 10,   213 }, { 11, 10,   637 }, { 11, 10,   707 },
+  { 12, 10,   202 }, { 12, 10,   380 }, { 13, 10,   226 }, { 13, 10,   355 },
+  { 14, 10,   222 }, { 17, 10,    42 }, {  4, 11,   416 }, {  4,  0,    33 },
+  {  5,  0,   102 }, {  6,  0,   284 }, {  7,  0,  1079 }, {  7,  0,  1423 },
+  {  7,  0,  1702 }, {  8,  0,   470 }, {  9,  0,   554 }, {  9,  0,   723 },
+  { 11,  0,   333 }, { 14, 11,   372 }, {  5, 11,   152 }, {  5, 11,   197 },
+  {  7, 11,   340 }, {  7, 11,   867 }, { 10, 11,   548 }, { 10, 11,   581 },
+  { 11, 11,     6 }, { 12, 11,     3 }, { 12, 11,    19 }, { 14, 11,   110 },
+  { 14, 11,   289 }, {  7,  0,   246 }, {  7,  0,   840 }, {  6,  0,    10 },
+  {  8,  0,   571 }, {  9,  0,   739 }, { 15,  0,    91 }, {  6,  0,   465 },
+  {  7,  0,  1465 }, {  4, 10,    23 }, {  4, 10,   141 }, {  5, 10,   313 },
+  {  5, 10,  1014 }, {  6, 10,    50 }, {  7, 10,   142 }, {  7, 10,   559 },
+  {  8, 10,   640 }, {  9, 10,   460 }, {  9, 10,   783 }, { 11, 10,   741 },
+  { 12, 10,   183 }, { 13, 10,   488 }, {  5,  0,   626 }, {  8,  0,   614 },
+  { 10,  0,   237 }, {  7, 11,    34 }, {  7, 11,   190 }, {  8, 11,    28 },
+  {  8, 11,   141 }, {  8, 11,   444 }, {  8, 11,   811 }, {  9, 11,   468 },
+  { 11, 11,   334 }, { 12, 11,    24 }, { 12, 11,   386 }, { 12, 11,   576 },
+  {  5, 11,   757 }, {  5,  0,    18 }, {  6,  0,   526 }, { 13,  0,    24 },
+  { 13,  0,   110 }, { 19,  0,     5 }, { 19,  0,    44 }, {  6,  0,   506 },
+  {  6, 11,   506 }, {  7, 11,  1553 }, {  4,  0,   309 }, {  5,  0,   462 },
+  {  7,  0,   970 }, {  7,  0,  1097 }, { 22,  0,    30 }, { 22,  0,    33 },
+  {  7, 11,  1385 }, { 11, 11,   582 }, { 11, 11,   650 }, { 11, 11,   901 },
+  { 11, 11,   949 }, { 12, 11,   232 }, { 12, 11,   236 }, { 13, 11,   413 },
+  { 13, 11,   501 }, { 18, 11,   116 }, {  9,  0,   140 }, {  5, 10,   222 },
+  { 10, 10,   534 }, {  6,  0,  1056 }, {  9, 10,   906 }, {  6,  0,  1704 },
+  { 10, 10,   503 }, {  6,  0,  1036 }, {  5, 10,   154 }, {  7, 10,  1491 },
+  { 10, 10,   379 }, { 10, 10,   485 }, {  4, 11,   383 }, {  5, 10,   716 },
+  {  6,  0,  1315 }, {  5,  0,    86 }, {  7,  0,   743 }, {  9,  0,    85 },
+  { 10,  0,   281 }, { 10,  0,   432 }, { 11,  0,   825 }, { 12,  0,   251 },
+  { 13,  0,   118 }, { 14,  0,   378 }, {  8,  0,   264 }, {  4, 10,    91 },
+  {  5, 10,   388 }, {  5, 10,   845 }, {  6, 10,   206 }, {  6, 10,   252 },
+  {  6, 10,   365 }, {  7, 10,   136 }, {  7, 10,   531 }, {  8, 10,   621 },
+  {  5,  0,   524 }, {  5,  0,   744 }, {  5, 11,   277 }, { 13, 11,   247 },
+  {  4, 11,   435 }, { 10,  0,   107 }, { 12,  0,   436 }, {  4,  0,   927 },
+  { 10,  0,   123 }, { 12,  0,   670 }, { 18,  0,    94 }, {  7,  0,  1149 },
+  {  9,  0,   156 }, { 10,  0,   957 }, {  5, 11,   265 }, {  6, 11,   212 },
+  {  7, 11,    28 }, {  5,  0,   778 }, {  5,  0,   502 }, {  8,  0,   196 },
+  { 10,  0,   283 }, { 11,  0,   406 }, {  7, 10,   576 }, {  8, 11,   535 },
+  {  6,  0,  1312 }, {  5, 10,   771 }, {  5, 10,   863 }, {  5, 10,   898 },
+  {  6, 10,  1632 }, {  6, 10,  1644 }, {  6, 10,  1780 }, {  5,  0,   855 },
+  {  5, 10,   331 }, {  7, 11,  1487 }, {  4, 11,   702 }, {  5, 11,   808 },
+  {  7, 11,  2045 }, {  7,  0,  1400 }, {  9,  0,   446 }, { 10,  0,    45 },
+  { 12, 10,   632 }, {  4,  0,  1003 }, {  5, 11,   166 }, {  8, 11,   739 },
+  { 12, 11,   511 }, {  5, 10,   107 }, {  7, 10,   201 }, {  8, 10,   518 },
+  {  6, 10,   446 }, {  7, 10,  1817 }, {  6,  0,  1532 }, {  6,  0,  1097 },
+  {  4, 11,   119 }, {  5, 11,   170 }, {  5, 11,   447 }, {  7, 11,  1708 },
+  {  7, 11,  1889 }, {  9, 11,   357 }, {  9, 11,   719 }, { 12, 11,   486 },
+  { 12, 11,   596 }, {  9, 10,   851 }, { 13, 10,   510 }, {  7,  0,   612 },
+  {  8,  0,   545 }, {  8,  0,   568 }, {  8,  0,   642 }, {  9,  0,   717 },
+  { 10,  0,   541 }, { 10,  0,   763 }, { 11,  0,   449 }, { 12,  0,   489 },
+  { 13,  0,   153 }, { 13,  0,   296 }, { 14,  0,   138 }, { 14,  0,   392 },
+  { 15,  0,    50 }, { 16,  0,     6 }, { 16,  0,    12 }, { 20,  0,     9 },
+  {  4, 10,   504 }, {  4, 11,   450 }, {  7, 11,  1158 }, { 11,  0,    54 },
+  { 13,  0,   173 }, { 13,  0,   294 }, {  5, 10,   883 }, {  5, 10,   975 },
+  {  8, 10,   392 }, { 20, 10,     7 }, { 13,  0,   455 }, { 15,  0,    99 },
+  { 15,  0,   129 }, { 16,  0,    68 }, {  7,  0,   172 }, {  4, 11,   754 },
+  {  5, 10,   922 }, {  6, 10,  1707 }, {  6,  0,  1029 }, { 17, 11,    39 },
+  { 20, 11,    36 }, {  4,  0,   568 }, {  5, 10,   993 }, {  7, 10,   515 },
+  {  9, 10,    91 }, {  4,  0,   732 }, { 10,  0,   617 }, { 10, 11,   617 },
+  {  6,  0,   974 }, {  7,  0,   989 }, { 10,  0,   377 }, { 12,  0,   363 },
+  { 13,  0,    68 }, { 13,  0,    94 }, { 14,  0,   108 }, { 14,  0,   306 },
+  {  8,  0,   733 }, {  4,  0,   428 }, {  7,  0,  1789 }, {  7, 11,  1062 },
+  {  7,  0,  2015 }, { 12,  0,   665 }, {  7, 10,  1433 }, {  5,  0,   287 },
+  {  7, 10,   921 }, {  8, 10,   580 }, {  8, 10,   593 }, {  8, 10,   630 },
+  { 10, 10,    28 }, { 10,  0,   806 }, {  4, 10,   911 }, {  5, 10,   867 },
+  {  5, 10,  1013 }, {  7, 10,  2034 }, {  8, 10,   798 }, {  8, 10,   813 },
+  {  6,  0,  1539 }, {  8, 11,   523 }, { 22, 11,    34 }, {  7, 11,   740 },
+  {  7, 11,   238 }, {  7, 11,  2033 }, {  8, 11,   120 }, {  8, 11,   188 },
+  {  8, 11,   659 }, {  9, 11,   598 }, { 10, 11,   466 }, { 12, 11,   342 },
+  { 12, 11,   588 }, { 13, 11,   503 }, { 14, 11,   246 }, { 15, 11,    92 },
+  {  7,  0,  1563 }, { 13,  0,   182 }, {  5, 10,   135 }, {  6, 10,   519 },
+  {  7, 10,  1722 }, { 10, 10,   271 }, { 11, 10,   261 }, { 17, 10,    54 },
+  { 14, 10,   338 }, { 20, 10,    81 }, {  7,  0,   484 }, {  4, 10,   300 },
+  {  5, 10,   436 }, { 17, 11,   114 }, {  6,  0,  1623 }, {  6,  0,  1681 },
+  {  5, 11,   640 }, {  4, 11,   201 }, {  7, 11,  1744 }, {  8, 11,   602 },
+  { 11, 11,   247 }, { 11, 11,   826 }, { 17, 11,    65 }, {  8, 11,   164 },
+  { 18, 11,    62 }, {  6,  0,  1833 }, {  6,  0,  1861 }, {  8,  0,   878 },
+  {  6,  0,  1569 }, {  8, 10,   357 }, { 10, 10,   745 }, { 14, 10,   426 },
+  { 17, 10,    94 }, { 19, 10,    57 }, { 12,  0,    93 }, { 12,  0,   501 },
+  { 13,  0,   362 }, { 14,  0,   151 }, { 15,  0,    40 }, { 15,  0,    59 },
+  { 16,  0,    46 }, { 17,  0,    25 }, { 18,  0,    14 }, { 18,  0,   134 },
+  { 19,  0,    25 }, { 19,  0,    69 }, { 20,  0,    16 }, { 20,  0,    19 },
+  { 20,  0,    66 }, { 21,  0,    23 }, { 21,  0,    25 }, { 22,  0,    42 },
+  {  6,  0,  1748 }, {  8,  0,   715 }, {  9,  0,   802 }, { 10,  0,    46 },
+  { 10,  0,   819 }, { 13,  0,   308 }, { 14,  0,   351 }, { 14,  0,   363 },
+  { 18,  0,    67 }, {  4,  0,   994 }, {  4,  0,    63 }, {  5,  0,   347 },
+  {  4,  0,   591 }, {  5,  0,   749 }, {  7, 11,  1577 }, { 10, 11,   304 },
+  { 10, 11,   549 }, { 11, 11,   424 }, { 12, 11,   365 }, { 13, 11,   220 },
+  { 13, 11,   240 }, { 14, 11,    33 }, {  5,  0,   366 }, {  7,  0,   557 },
+  { 12,  0,   547 }, { 14,  0,    86 }, {  5, 10,   387 }, {  7,  0,  1747 },
+  {  4, 11,   907 }, {  5, 11,   100 }, { 10, 11,   329 }, { 12, 11,   416 },
+  { 21, 11,    29 }, {  4, 10,     6 }, {  5, 10,   708 }, {  8, 10,    75 },
+  {  7, 10,  1351 }, {  9, 10,   581 }, { 10, 10,   639 }, { 11, 10,   453 },
+  { 12, 10,   584 }, {  7,  0,    89 }, {  4, 10,   303 }, { 10, 10,   772 },
+  {  4, 11,   176 }, {  5, 11,   636 }, {  5, 11,   998 }, {  8, 11,    26 },
+  {  9, 11,   358 }, {  7, 11,     9 }, {  7, 11,  1508 }, {  9, 11,   317 },
+  { 10, 11,   210 }, { 10, 11,   292 }, { 10, 11,   533 }, { 11, 11,   555 },
+  { 12, 11,   526 }, { 12, 11,   607 }, { 13, 11,   263 }, { 13, 11,   459 },
+  { 14, 11,   271 }, {  6,  0,  1463 }, {  6,  0,   772 }, {  6,  0,  1137 },
+  { 11, 11,   595 }, {  7,  0,   977 }, { 11, 11,    66 }, { 10,  0,   893 },
+  { 20,  0,    48 }, { 20, 11,    48 }, {  5,  0,   824 }, {  5,  0,   941 },
+  {  6, 11,   295 }, {  7,  0,  1543 }, {  7,  0,  1785 }, { 10,  0,   690 },
+  {  4, 10,   106 }, { 11, 10,   717 }, {  7,  0,   440 }, {  8,  0,   230 },
+  { 11,  0,   106 }, {  5, 10,   890 }, {  5, 10,   988 }, {  6, 10,   626 },
+  { 14, 10,   431 }, { 10, 11,   127 }, { 13, 11,    27 }, { 17,  0,    32 },
+  { 10, 10,   706 }, { 22, 10,    44 }, {  4,  0,   216 }, {  9,  0,   332 },
+  {  4, 10,   698 }, {  8, 11,   119 }, { 11, 11,   267 }, { 10, 10,    17 },
+  { 11, 11,   526 }, { 11, 11,   939 }, { 13, 11,   290 }, {  7, 11,  1167 },
+  { 11, 11,   934 }, { 13, 11,   391 }, { 17, 11,    76 }, { 11, 11,    39 },
+  {  6, 10,    84 }, {  4,  0,   914 }, {  5,  0,   800 }, {  5,  0,   852 },
+  { 10,  0,   416 }, { 13,  0,   115 }, {  7,  0,   564 }, { 14,  0,   168 },
+  {  4,  0,   918 }, {  5,  0,   876 }, {  6,  0,  1764 }, { 24,  0,     3 },
+  {  4,  0,    92 }, {  5,  0,   274 }, {  7, 11,   126 }, {  8, 11,    84 },
+  { 12, 10,   498 }, {  8, 11,   790 }, {  8,  0,   501 }, {  5, 10,   986 },
+  {  6, 10,   130 }, {  7, 10,  1582 }, {  8, 10,   458 }, { 10, 10,   101 },
+  { 10, 10,   318 }, { 10, 10,   823 }, {  6, 11,    64 }, { 12, 11,   377 },
+  { 13, 11,   309 }, {  5,  0,   743 }, { 10,  0,   851 }, {  4,  0,    49 },
+  {  7,  0,   280 }, {  7,  0,  1633 }, {  6,  0,   879 }, {  8,  0,    47 },
+  {  7, 10,  1644 }, {  9, 10,   129 }, {  4,  0,   865 }, {  6,  0,  1202 },
+  {  9, 11,    34 }, { 11, 11,   484 }, {  7, 10,   997 }, {  5,  0,   272 },
+  {  5,  0,   908 }, {  5,  0,   942 }, {  8,  0,   197 }, {  9,  0,    47 },
+  { 11,  0,   538 }, { 11,  0,   742 }, {  6, 11,  1700 }, {  7, 11,    26 },
+  {  7, 11,   293 }, {  7, 11,   382 }, {  7, 11,  1026 }, {  7, 11,  1087 },
+  {  7, 11,  2027 }, {  8, 11,    24 }, {  8, 11,   114 }, {  8, 11,   252 },
+  {  8, 11,   727 }, {  8, 11,   729 }, {  9, 11,    30 }, {  9, 11,   199 },
+  {  9, 11,   231 }, {  9, 11,   251 }, {  9, 11,   334 }, {  9, 11,   361 },
+  {  9, 11,   488 }, {  9, 11,   712 }, { 10, 11,    55 }, { 10, 11,    60 },
+  { 10, 11,   232 }, { 10, 11,   332 }, { 10, 11,   384 }, { 10, 11,   396 },
+  { 10, 11,   504 }, { 10, 11,   542 }, { 10, 11,   652 }, { 11, 11,    20 },
+  { 11, 11,    48 }, { 11, 11,   207 }, { 11, 11,   291 }, { 11, 11,   298 },
+  { 11, 11,   342 }, { 11, 11,   365 }, { 11, 11,   394 }, { 11, 11,   620 },
+  { 11, 11,   705 }, { 11, 11,  1017 }, { 12, 11,   123 }, { 12, 11,   340 },
+  { 12, 11,   406 }, { 12, 11,   643 }, { 13, 11,    61 }, { 13, 11,   269 },
+  { 13, 11,   311 }, { 13, 11,   319 }, { 13, 11,   486 }, { 14, 11,   234 },
+  { 15, 11,    62 }, { 15, 11,    85 }, { 16, 11,    71 }, { 18, 11,   119 },
+  { 20, 11,   105 }, {  6,  0,  1455 }, { 22, 11,    37 }, {  7, 10,  1927 },
+  {  7,  0,  1911 }, {  9,  0,   891 }, {  7, 10,  1756 }, {  9, 10,    98 },
+  {  7, 10,  1046 }, { 11, 10,   160 }, {  4,  0,   761 }, {  6, 11,   379 },
+  {  7, 11,   270 }, {  7, 11,  1116 }, {  8, 11,   176 }, {  8, 11,   183 },
+  {  9, 11,   432 }, {  9, 11,   661 }, { 12, 11,   247 }, { 12, 11,   617 },
+  { 18, 11,   125 }, {  6, 10,    45 }, {  7, 10,   433 }, {  8, 10,   129 },
+  {  9, 10,    21 }, { 10, 10,   392 }, { 11, 10,    79 }, { 12, 10,   499 },
+  { 13, 10,   199 }, { 13, 10,   451 }, {  4,  0,   407 }, {  5, 11,   792 },
+  {  5, 11,   900 }, {  4,  0,   560 }, {  7,  0,   183 }, { 13,  0,   490 },
+  {  7, 10,   558 }, {  8, 10,   353 }, {  4,  0,   475 }, {  6,  0,   731 },
+  { 11,  0,    35 }, { 13,  0,    71 }, { 13,  0,   177 }, { 14,  0,   422 },
+  {  5, 10,   785 }, {  8, 10,    81 }, {  9, 10,   189 }, {  9, 10,   201 },
+  { 11, 10,   478 }, { 11, 10,   712 }, { 13, 10,   338 }, {  4,  0,   418 },
+  {  4,  0,   819 }, {  5, 10,   353 }, { 23, 10,    26 }, {  4, 11,   901 },
+  {  5, 11,   776 }, {  4,  0,   575 }, {  7,  0,   818 }, { 16,  0,    92 },
+  { 17,  0,    14 }, { 17,  0,    45 }, { 18,  0,    75 }, { 20,  0,    18 },
+  {  6,  0,   222 }, {  7,  0,   636 }, {  7,  0,  1620 }, {  8,  0,   409 },
+  {  9,  0,   693 }, { 11,  0,    77 }, {  6, 10,    25 }, {  7, 10,   855 },
+  {  7, 10,  1258 }, { 16, 10,    32 }, {  6,  0,  1880 }, {  6,  0,  1887 },
+  {  6,  0,  1918 }, {  6,  0,  1924 }, {  9,  0,   967 }, {  9,  0,   995 },
+  {  9,  0,  1015 }, { 12,  0,   826 }, { 12,  0,   849 }, { 12,  0,   857 },
+  { 12,  0,   860 }, { 12,  0,   886 }, { 12,  0,   932 }, { 18,  0,   228 },
+  { 18,  0,   231 }, { 18,  0,   240 }, {  6,  0,   633 }, {  6,  0,  1308 },
+  {  4, 11,    37 }, {  5, 11,   334 }, {  7, 11,  1253 }, { 10,  0,    86 },
+  {  4, 10,     4 }, {  7, 10,  1118 }, {  7, 10,  1320 }, {  7, 10,  1706 },
+  {  8, 10,   277 }, {  9, 10,   622 }, { 11, 10,   724 }, { 12, 10,   350 },
+  { 12, 10,   397 }, { 13, 10,    28 }, { 13, 10,   159 }, { 15, 10,    89 },
+  { 18, 10,     5 }, { 19, 10,     9 }, { 20, 10,    34 }, { 22, 10,    47 },
+  {  4, 11,   508 }, {  9, 11,   448 }, { 12, 11,   107 }, { 18, 11,    31 },
+  {  4,  0,   817 }, {  6,  0,   663 }, {  5,  0,   882 }, {  6,  0,   914 },
+  {  4, 11,   540 }, {  4, 11,   533 }, {  8, 11,   608 }, {  8,  0,   885 },
+  { 10,  0,   865 }, {  4,  0,   426 }, {  6,  0,    58 }, {  7,  0,   745 },
+  {  7,  0,  1969 }, {  8,  0,   399 }, {  8,  0,   675 }, {  9,  0,   479 },
+  {  9,  0,   731 }, { 10,  0,   330 }, { 10,  0,   593 }, { 10,  0,   817 },
+  { 11,  0,    32 }, { 11,  0,   133 }, { 11,  0,   221 }, { 17,  0,    68 },
+  {  6, 10,   255 }, {  7,  0,   102 }, {  9,  0,   538 }, {  9, 10,   216 },
+  {  7, 11,   253 }, {  8, 11,   549 }, {  7, 11,   912 }, {  9, 10,   183 },
+  { 11, 10,   286 }, { 11, 10,   956 }, { 23, 10,     3 }, {  8, 11,   527 },
+  { 18, 11,    60 }, { 19, 11,    24 }, {  4, 10,   536 }, {  7, 10,  1141 },
+  { 10, 10,   723 }, { 11, 10,   371 }, {  5, 11,   920 }, {  7,  0,   876 },
+  {  7, 10,   285 }, {  7, 10,   560 }, {  4, 10,   690 }, { 14, 11,   126 },
+  { 11, 10,    33 }, { 12, 10,   571 }, { 21, 10,     1 }, {  5,  0,   566 },
+  {  9,  0,   139 }, { 10,  0,   399 }, { 11,  0,   469 }, { 12,  0,   634 },
+  { 13,  0,   223 }, {  4, 11,   483 }, {  6,  0,    48 }, {  7,  0,    63 },
+  { 18,  0,    12 }, {  7, 10,  1862 }, { 12, 10,   491 }, { 12, 10,   520 },
+  { 13, 10,   383 }, { 14, 10,   244 }, {  7, 11,  1665 }, {  4, 11,   448 },
+  {  9, 11,   495 }, { 18, 11,   104 }, {  6,  0,   114 }, {  7,  0,  1224 },
+  {  7,  0,  1556 }, {  8,  0,     3 }, {  4, 10,   190 }, {  5, 10,   554 },
+  {  8,  0,   576 }, {  9,  0,   267 }, {  5, 10,  1001 }, {  5, 10,   446 },
+  {  5,  0,   933 }, { 11, 11,  1009 }, {  8, 11,   653 }, { 13, 11,    93 },
+  { 19, 11,    14 }, {  6,  0,   692 }, {  6,  0,   821 }, {  6,  0,  1077 },
+  {  5, 11,   172 }, {  7, 11,   801 }, { 10,  0,   752 }, {  4,  0,   375 },
+  {  6,  0,   638 }, {  6,  0,  1011 }, { 12, 11,   540 }, {  9,  0,    96 },
+  {  5, 11,   260 }, { 11, 11,   587 }, {  7, 10,  1231 }, { 12,  0,    30 },
+  { 13,  0,   148 }, { 14,  0,    87 }, { 14,  0,   182 }, { 16,  0,    42 },
+  { 20,  0,    70 }, {  4, 10,   304 }, {  6,  0,  1398 }, {  7,  0,    56 },
+  {  7,  0,  1989 }, {  8,  0,   337 }, {  8,  0,   738 }, {  9,  0,   600 },
+  { 12,  0,    37 }, { 13,  0,   447 }, { 14,  0,    92 }, { 10,  0,   666 },
+  {  5,  0,   394 }, {  7,  0,   487 }, {  8,  0,   246 }, {  9,  0,   437 },
+  {  6, 10,    53 }, {  6, 10,   199 }, {  7, 10,  1408 }, {  8, 10,    32 },
+  {  8, 10,    93 }, { 10, 10,   397 }, { 10, 10,   629 }, { 11, 10,   593 },
+  { 11, 10,   763 }, { 13, 10,   326 }, { 17, 10,    35 }, {  6, 10,   105 },
+  {  9,  0,   320 }, { 10,  0,   506 }, { 10, 10,   794 }, {  7, 11,    57 },
+  {  8, 11,   167 }, {  8, 11,   375 }, {  9, 11,    82 }, {  9, 11,   561 },
+  { 10, 11,   620 }, { 10, 11,   770 }, { 11, 10,   704 }, { 13, 10,   396 },
+  {  6,  0,  1003 }, {  5, 10,   114 }, {  5, 10,   255 }, { 13, 10,   285 },
+  {  7,  0,   866 }, {  7,  0,  1163 }, {  5, 11,   531 }, {  4,  0,   328 },
+  {  7, 10,  2035 }, {  8, 10,    19 }, {  9, 10,    89 }, { 10, 10,   831 },
+  {  8, 11,   194 }, {  8, 11,   756 }, {  8,  0,  1000 }, {  5, 11,   453 },
+  {  6, 11,   441 }, {  4,  0,   101 }, {  5,  0,   833 }, {  7,  0,  1171 },
+  {  8,  0,   744 }, {  5,  0,   726 }, {  8, 10,   746 }, { 10,  0,   176 },
+  {  6,  0,     9 }, {  6,  0,   397 }, {  7,  0,    53 }, {  7,  0,  1742 },
+  { 10,  0,   632 }, { 11,  0,   828 }, { 12,  0,   146 }, {  7, 11,    22 },
+  { 17, 11,    64 }, {  4,  0,   839 }, { 11,  0,   417 }, { 12,  0,   223 },
+  { 12,  0,   265 }, {  4, 11,   102 }, {  7, 11,   815 }, {  7, 11,  1699 },
+  { 11, 11,   964 }, {  5, 10,   955 }, {  8, 10,   814 }, {  6,  0,  1931 },
+  {  6,  0,  2007 }, { 18,  0,   246 }, { 18,  0,   247 }, {  8,  0,   198 },
+  { 11,  0,    29 }, { 12,  0,   534 }, {  7,  0,  1771 }, {  6,  0,   846 },
+  {  7, 11,  1010 }, { 11, 11,   733 }, { 11, 11,   759 }, { 12, 11,   563 },
+  { 13, 11,    34 }, { 14, 11,   101 }, { 18, 11,    45 }, { 18, 11,   129 },
+  {  4,  0,   186 }, {  5,  0,   157 }, {  8,  0,   168 }, { 10,  0,     6 },
+  {  4, 11,   899 }, {  5, 10,    56 }, { 20, 10,   100 }, {  5,  0,   875 },
+  {  5,  0,   773 }, {  5,  0,   991 }, {  6,  0,  1635 }, {  6,  0,  1788 },
+  {  6,  0,  1274 }, {  9,  0,   477 }, { 13,  0,    78 }, {  4,  0,   639 },
+  {  7,  0,   111 }, {  8,  0,   581 }, { 12,  0,   177 }, {  6, 11,    52 },
+  {  9, 11,   104 }, {  9, 11,   559 }, { 10, 10,     4 }, { 10, 10,    13 },
+  { 11, 10,   638 }, { 12, 11,   308 }, { 19, 11,    87 }, { 20, 10,    57 },
+  {  4, 11,   604 }, {  4, 11,   301 }, {  5, 10,   738 }, {  5, 10,   758 },
+  {  6,  0,  1747 }, {  7, 11,  1440 }, { 11, 11,   854 }, { 11, 11,   872 },
+  { 11, 11,   921 }, { 12, 11,   551 }, { 13, 11,   472 }, { 14, 11,   367 },
+  {  7,  0,  1364 }, {  7,  0,  1907 }, { 13,  0,   158 }, {  6,  0,   873 },
+  {  4,  0,   404 }, {  4,  0,   659 }, {  7,  0,   552 }, {  7,  0,   675 },
+  {  7, 10,  1112 }, { 11, 10,   328 }, {  7, 11,   508 }, {  9, 10,   133 },
+  {  5,  0,   391 }, {  5, 10,   110 }, {  6, 10,   169 }, {  6, 10,  1702 },
+  {  7, 10,   400 }, {  8, 10,   538 }, {  9, 10,   184 }, {  9, 10,   524 },
+  { 12, 10,   218 }, {  6, 11,   310 }, {  7, 11,  1849 }, {  8, 11,    72 },
+  {  8, 11,   272 }, {  8, 11,   431 }, {  9, 11,    12 }, {  9, 11,   351 },
+  { 10, 11,   563 }, { 10, 11,   630 }, { 10, 11,   810 }, { 11, 11,   367 },
+  { 11, 11,   599 }, { 11, 11,   686 }, { 12, 11,   672 }, {  5,  0,   540 },
+  {  6,  0,  1697 }, {  8,  0,   668 }, {  4,  0,   883 }, {  6,  0,    78 },
+  { 12,  0,   628 }, { 18,  0,    79 }, {  6, 10,   133 }, {  9, 10,   353 },
+  { 11, 10,   993 }, {  6, 11,   181 }, {  7, 11,   537 }, {  8, 11,    64 },
+  {  9, 11,   127 }, { 10, 11,   496 }, { 12, 11,   510 }, { 13, 11,   384 },
+  {  6, 10,    93 }, {  7, 10,  1422 }, {  7, 10,  1851 }, {  8, 10,   673 },
+  {  9, 10,   529 }, { 12, 10,    43 }, {  9, 10,   371 }, {  6,  0,  1460 },
+  {  6,  0,   962 }, {  4, 11,   244 }, {  7, 11,   233 }, {  9, 10,    25 },
+  { 10, 10,   467 }, { 10, 10,   559 }, {  4, 10,   335 }, {  7, 10,   942 },
+  {  5,  0,   460 }, {  7, 11,   334 }, {  6, 11,  1650 }, {  4,  0,   199 },
+  { 11,  0,    34 }, {  5, 10,   601 }, {  8, 10,    39 }, { 10, 10,   773 },
+  { 11, 10,    84 }, { 12, 10,   205 }, { 14, 10,     1 }, {  5, 10,   870 },
+  {  6,  0,   388 }, { 14,  0,   474 }, { 20,  0,   120 }, {  5, 11,   369 },
+  { 11,  0,   271 }, {  4,  0,   511 }, {  9,  0,   333 }, {  9,  0,   379 },
+  { 10,  0,   602 }, { 11,  0,   441 }, { 11,  0,   723 }, { 11,  0,   976 },
+  { 12,  0,   357 }, {  4, 10,   181 }, {  6,  0,   608 }, {  6, 10,  1652 },
+  { 22,  0,    49 }, {  9, 11,   338 }, { 12,  0,   988 }, {  6,  0,   617 },
+  {  5,  0,   938 }, {  8,  0,   707 }, {  4, 10,    97 }, {  5, 10,   147 },
+  {  6, 10,   286 }, {  7, 10,  1362 }, { 13, 10,   176 }, {  6,  0,   756 },
+  {  6,  0,  1149 }, {  5, 11,   896 }, {  6, 10,   375 }, {  7, 10,   169 },
+  {  7, 10,   254 }, {  8, 10,   780 }, {  6,  0,  1583 }, {  7, 10,  1447 },
+  { 11,  0,   285 }, {  7, 11,  1117 }, {  8, 11,   393 }, {  8, 11,   539 },
+  {  7,  0,   344 }, {  6,  0,   469 }, {  7,  0,  1709 }, { 10,  0,   515 },
+  {  5, 10,   629 }, {  7, 10,  1549 }, {  5, 11,     4 }, {  5, 11,   810 },
+  {  6, 11,    13 }, {  6, 11,   538 }, {  6, 11,  1690 }, {  6, 11,  1726 },
+  {  7, 11,   499 }, {  7, 11,  1819 }, {  8, 11,   148 }, {  8, 11,   696 },
+  {  8, 11,   791 }, { 12, 11,   125 }, { 13, 11,    54 }, { 15, 11,     9 },
+  {  7, 11,  1268 }, {  9,  0,   404 }, {  4,  0,   500 }, {  5,  0,    68 },
+  {  6,  0,   383 }, { 11,  0,   216 }, { 11,  0,   340 }, {  4, 11,   925 },
+  {  5, 11,   803 }, {  8, 11,   698 }, { 10, 11,   828 }, {  4,  0,   337 },
+  {  6,  0,   353 }, {  7,  0,  1934 }, {  8,  0,   488 }, {  9,  0,   429 },
+  {  7,  0,   236 }, {  7,  0,  1795 }, {  8,  0,   259 }, {  9,  0,   135 },
+  {  9,  0,   177 }, {  9,  0,   860 }, { 10,  0,   825 }, { 11,  0,   115 },
+  { 11,  0,   370 }, { 11,  0,   405 }, { 11,  0,   604 }, { 12,  0,    10 },
+  { 12,  0,   667 }, { 12,  0,   669 }, { 13,  0,    76 }, { 14,  0,   310 },
+  { 15,  0,    76 }, { 15,  0,   147 }, { 20,  0,    23 }, {  4,  0,    15 },
+  {  4,  0,   490 }, {  5,  0,    22 }, {  6,  0,   244 }, {  7,  0,    40 },
+  {  7,  0,   200 }, {  7,  0,   906 }, {  7,  0,  1199 }, {  9,  0,   616 },
+  { 10,  0,   716 }, { 11,  0,   635 }, { 11,  0,   801 }, { 12,  0,   458 },
+  { 12,  0,   756 }, {  4, 10,   420 }, {  6,  0,  1504 }, {  6,  0,   757 },
+  {  5, 11,   383 }, {  6,  0,  1266 }, {  7,  0,  1735 }, {  5,  0,   598 },
+  {  7,  0,   791 }, {  8,  0,   108 }, {  9,  0,   123 }, {  7, 10,  1570 },
+  { 12, 10,   542 }, { 14, 11,   410 }, {  9, 11,   660 }, { 10, 11,   347 },
+};
diff --git a/third_party/brotli/enc/streams.cc b/third_party/brotli/enc/streams.cc
new file mode 100644
index 0000000..17eda2d
--- /dev/null
+++ b/third_party/brotli/enc/streams.cc
@@ -0,0 +1,114 @@
+/* Copyright 2009 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Convience routines to make Brotli I/O classes from some memory containers and
+// files.
+
+#include "./streams.h"
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+namespace brotli {
+
+BrotliMemOut::BrotliMemOut(void* buf, size_t len)
+    : buf_(buf),
+      len_(len),
+      pos_(0) {}
+
+void BrotliMemOut::Reset(void* buf, size_t len) {
+  buf_ = buf;
+  len_ = len;
+  pos_ = 0;
+}
+
+// Brotli output routine: copy n bytes to the output buffer.
+bool BrotliMemOut::Write(const void *buf, size_t n) {
+  if (n + pos_ > len_)
+    return false;
+  char* p = reinterpret_cast<char*>(buf_) + pos_;
+  memcpy(p, buf, n);
+  pos_ += n;
+  return true;
+}
+
+BrotliStringOut::BrotliStringOut(std::string* buf, size_t max_size)
+    : buf_(buf),
+      max_size_(max_size) {
+  assert(buf->empty());
+}
+
+void BrotliStringOut::Reset(std::string* buf, size_t max_size) {
+  buf_ = buf;
+  max_size_ = max_size;
+}
+
+// Brotli output routine: add n bytes to a string.
+bool BrotliStringOut::Write(const void *buf, size_t n) {
+  if (buf_->size() + n > max_size_)
+    return false;
+  buf_->append(static_cast<const char*>(buf), n);
+  return true;
+}
+
+BrotliMemIn::BrotliMemIn(const void* buf, size_t len)
+    : buf_(buf),
+      len_(len),
+      pos_(0) {}
+
+void BrotliMemIn::Reset(const void* buf, size_t len) {
+  buf_ = buf;
+  len_ = len;
+  pos_ = 0;
+}
+
+// Brotli input routine: read the next chunk of memory.
+const void* BrotliMemIn::Read(size_t n, size_t* output) {
+  if (pos_ == len_) {
+    return NULL;
+  }
+  if (n > len_ - pos_)
+    n = len_ - pos_;
+  const char* p = reinterpret_cast<const char*>(buf_) + pos_;
+  pos_ += n;
+  *output = n;
+  return p;
+}
+
+BrotliFileIn::BrotliFileIn(FILE* f, size_t max_read_size)
+    : f_(f),
+      buf_(new char[max_read_size]),
+      buf_size_(max_read_size) { }
+
+BrotliFileIn::~BrotliFileIn(void) {
+  delete[] buf_;
+}
+
+const void* BrotliFileIn::Read(size_t n, size_t* bytes_read) {
+  if (n > buf_size_) {
+    n = buf_size_;
+  } else if (n == 0) {
+    return feof(f_) ? NULL : buf_;
+  }
+  *bytes_read = fread(buf_, 1, n, f_);
+  if (*bytes_read == 0) {
+    return NULL;
+  } else {
+    return buf_;
+  }
+}
+
+BrotliFileOut::BrotliFileOut(FILE* f) : f_(f) {}
+
+bool BrotliFileOut::Write(const void* buf, size_t n) {
+  if (fwrite(buf, n, 1, f_) != 1) {
+    return false;
+  }
+  return true;
+}
+
+}  // namespace brotli
diff --git a/third_party/brotli/enc/streams.h b/third_party/brotli/enc/streams.h
new file mode 100644
index 0000000..7fb28092
--- /dev/null
+++ b/third_party/brotli/enc/streams.h
@@ -0,0 +1,121 @@
+/* Copyright 2009 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Input and output classes for streaming brotli compression.
+
+#ifndef BROTLI_ENC_STREAMS_H_
+#define BROTLI_ENC_STREAMS_H_
+
+#include <stdio.h>
+#include <string>
+#include "./port.h"
+#include "./types.h"
+
+namespace brotli {
+
+// Input interface for the compression routines.
+class BrotliIn {
+ public:
+  virtual ~BrotliIn(void) {}
+
+  // Return a pointer to the next block of input of at most n bytes.
+  // Return the actual length in *nread.
+  // At end of data, return NULL. Don't return NULL if there is more data
+  // to read, even if called with n == 0.
+  // Read will only be called if some of its bytes are needed.
+  virtual const void* Read(size_t n, size_t* nread) = 0;
+};
+
+// Output interface for the compression routines.
+class BrotliOut {
+ public:
+  virtual ~BrotliOut(void) {}
+
+  // Write n bytes of data from buf.
+  // Return true if all written, false otherwise.
+  virtual bool Write(const void *buf, size_t n) = 0;
+};
+
+// Adapter class to make BrotliIn objects from raw memory.
+class BrotliMemIn : public BrotliIn {
+ public:
+  BrotliMemIn(const void* buf, size_t len);
+
+  void Reset(const void* buf, size_t len);
+
+  // returns the amount of data consumed
+  size_t position(void) const { return pos_; }
+
+  const void* Read(size_t n, size_t* OUTPUT);
+
+ private:
+  const void* buf_;  // start of input buffer
+  size_t len_;  // length of input
+  size_t pos_;  // current read position within input
+};
+
+// Adapter class to make BrotliOut objects from raw memory.
+class BrotliMemOut : public BrotliOut {
+ public:
+  BrotliMemOut(void* buf, size_t len);
+
+  void Reset(void* buf, size_t len);
+
+  // returns the amount of data written
+  size_t position(void) const { return pos_; }
+
+  bool Write(const void* buf, size_t n);
+
+ private:
+  void* buf_;  // start of output buffer
+  size_t len_;  // length of output
+  size_t pos_;  // current write position within output
+};
+
+// Adapter class to make BrotliOut objects from a string.
+class BrotliStringOut : public BrotliOut {
+ public:
+  // Create a writer that appends its data to buf.
+  // buf->size() will grow to at most max_size
+  // buf is expected to be empty when constructing BrotliStringOut.
+  BrotliStringOut(std::string* buf, size_t max_size);
+
+  void Reset(std::string* buf, size_t max_len);
+
+  bool Write(const void* buf, size_t n);
+
+ private:
+  std::string* buf_;  // start of output buffer
+  size_t max_size_;  // max length of output
+};
+
+// Adapter class to make BrotliIn object from a file.
+class BrotliFileIn : public BrotliIn {
+ public:
+  BrotliFileIn(FILE* f, size_t max_read_size);
+  ~BrotliFileIn(void);
+
+  const void* Read(size_t n, size_t* bytes_read);
+
+ private:
+  FILE* f_;
+  char* buf_;
+  size_t buf_size_;
+};
+
+// Adapter class to make BrotliOut object from a file.
+class BrotliFileOut : public BrotliOut {
+ public:
+  explicit BrotliFileOut(FILE* f);
+
+  bool Write(const void* buf, size_t n);
+ private:
+  FILE* f_;
+};
+
+}  // namespace brotli
+
+#endif  // BROTLI_ENC_STREAMS_H_
diff --git a/third_party/brotli/enc/transform.h b/third_party/brotli/enc/transform.h
new file mode 100644
index 0000000..1ec3849
--- /dev/null
+++ b/third_party/brotli/enc/transform.h
@@ -0,0 +1,248 @@
+/* Copyright 2010 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Transformations on dictionary words.
+
+#ifndef BROTLI_ENC_TRANSFORM_H_
+#define BROTLI_ENC_TRANSFORM_H_
+
+#include <string>
+
+#include "./dictionary.h"
+
+namespace brotli {
+
+enum WordTransformType {
+  kIdentity       = 0,
+  kOmitLast1      = 1,
+  kOmitLast2      = 2,
+  kOmitLast3      = 3,
+  kOmitLast4      = 4,
+  kOmitLast5      = 5,
+  kOmitLast6      = 6,
+  kOmitLast7      = 7,
+  kOmitLast8      = 8,
+  kOmitLast9      = 9,
+  kUppercaseFirst = 10,
+  kUppercaseAll   = 11,
+  kOmitFirst1     = 12,
+  kOmitFirst2     = 13,
+  kOmitFirst3     = 14,
+  kOmitFirst4     = 15,
+  kOmitFirst5     = 16,
+  kOmitFirst6     = 17,
+  kOmitFirst7     = 18,
+  kOmitFirst8     = 19,
+  kOmitFirst9     = 20
+};
+
+struct Transform {
+  const char* prefix;
+  WordTransformType word_transform;
+  const char* suffix;
+};
+
+static const Transform kTransforms[] = {
+     {         "", kIdentity,       ""           },
+     {         "", kIdentity,       " "          },
+     {        " ", kIdentity,       " "          },
+     {         "", kOmitFirst1,     ""           },
+     {         "", kUppercaseFirst, " "          },
+     {         "", kIdentity,       " the "      },
+     {        " ", kIdentity,       ""           },
+     {       "s ", kIdentity,       " "          },
+     {         "", kIdentity,       " of "       },
+     {         "", kUppercaseFirst, ""           },
+     {         "", kIdentity,       " and "      },
+     {         "", kOmitFirst2,     ""           },
+     {         "", kOmitLast1,      ""           },
+     {       ", ", kIdentity,       " "          },
+     {         "", kIdentity,       ", "         },
+     {        " ", kUppercaseFirst, " "          },
+     {         "", kIdentity,       " in "       },
+     {         "", kIdentity,       " to "       },
+     {       "e ", kIdentity,       " "          },
+     {         "", kIdentity,       "\""         },
+     {         "", kIdentity,       "."          },
+     {         "", kIdentity,       "\">"        },
+     {         "", kIdentity,       "\n"         },
+     {         "", kOmitLast3,      ""           },
+     {         "", kIdentity,       "]"          },
+     {         "", kIdentity,       " for "      },
+     {         "", kOmitFirst3,     ""           },
+     {         "", kOmitLast2,      ""           },
+     {         "", kIdentity,       " a "        },
+     {         "", kIdentity,       " that "     },
+     {        " ", kUppercaseFirst, ""           },
+     {         "", kIdentity,       ". "         },
+     {        ".", kIdentity,       ""           },
+     {        " ", kIdentity,       ", "         },
+     {         "", kOmitFirst4,     ""           },
+     {         "", kIdentity,       " with "     },
+     {         "", kIdentity,       "'"          },
+     {         "", kIdentity,       " from "     },
+     {         "", kIdentity,       " by "       },
+     {         "", kOmitFirst5,     ""           },
+     {         "", kOmitFirst6,     ""           },
+     {    " the ", kIdentity,       ""           },
+     {         "", kOmitLast4,      ""           },
+     {         "", kIdentity,       ". The "     },
+     {         "", kUppercaseAll,   ""           },
+     {         "", kIdentity,       " on "       },
+     {         "", kIdentity,       " as "       },
+     {         "", kIdentity,       " is "       },
+     {         "", kOmitLast7,      ""           },
+     {         "", kOmitLast1,      "ing "       },
+     {         "", kIdentity,       "\n\t"       },
+     {         "", kIdentity,       ":"          },
+     {        " ", kIdentity,       ". "         },
+     {         "", kIdentity,       "ed "        },
+     {         "", kOmitFirst9,     ""           },
+     {         "", kOmitFirst7,     ""           },
+     {         "", kOmitLast6,      ""           },
+     {         "", kIdentity,       "("          },
+     {         "", kUppercaseFirst, ", "         },
+     {         "", kOmitLast8,      ""           },
+     {         "", kIdentity,       " at "       },
+     {         "", kIdentity,       "ly "        },
+     {    " the ", kIdentity,       " of "       },
+     {         "", kOmitLast5,      ""           },
+     {         "", kOmitLast9,      ""           },
+     {        " ", kUppercaseFirst, ", "         },
+     {         "", kUppercaseFirst, "\""         },
+     {        ".", kIdentity,       "("          },
+     {         "", kUppercaseAll,   " "          },
+     {         "", kUppercaseFirst, "\">"        },
+     {         "", kIdentity,       "=\""        },
+     {        " ", kIdentity,       "."          },
+     {    ".com/", kIdentity,       ""           },
+     {    " the ", kIdentity,       " of the "   },
+     {         "", kUppercaseFirst, "'"          },
+     {         "", kIdentity,       ". This "    },
+     {         "", kIdentity,       ","          },
+     {        ".", kIdentity,       " "          },
+     {         "", kUppercaseFirst, "("          },
+     {         "", kUppercaseFirst, "."          },
+     {         "", kIdentity,       " not "      },
+     {        " ", kIdentity,       "=\""        },
+     {         "", kIdentity,       "er "        },
+     {        " ", kUppercaseAll,   " "          },
+     {         "", kIdentity,       "al "        },
+     {        " ", kUppercaseAll,   ""           },
+     {         "", kIdentity,       "='"         },
+     {         "", kUppercaseAll,   "\""         },
+     {         "", kUppercaseFirst, ". "         },
+     {        " ", kIdentity,       "("          },
+     {         "", kIdentity,       "ful "       },
+     {        " ", kUppercaseFirst, ". "         },
+     {         "", kIdentity,       "ive "       },
+     {         "", kIdentity,       "less "      },
+     {         "", kUppercaseAll,   "'"          },
+     {         "", kIdentity,       "est "       },
+     {        " ", kUppercaseFirst, "."          },
+     {         "", kUppercaseAll,   "\">"        },
+     {        " ", kIdentity,       "='"         },
+     {         "", kUppercaseFirst, ","          },
+     {         "", kIdentity,       "ize "       },
+     {         "", kUppercaseAll,   "."          },
+     { "\xc2\xa0", kIdentity,       ""           },
+     {        " ", kIdentity,       ","          },
+     {         "", kUppercaseFirst, "=\""        },
+     {         "", kUppercaseAll,   "=\""        },
+     {         "", kIdentity,       "ous "       },
+     {         "", kUppercaseAll,   ", "         },
+     {         "", kUppercaseFirst, "='"         },
+     {        " ", kUppercaseFirst, ","          },
+     {        " ", kUppercaseAll,   "=\""        },
+     {        " ", kUppercaseAll,   ", "         },
+     {         "", kUppercaseAll,   ","          },
+     {         "", kUppercaseAll,   "("          },
+     {         "", kUppercaseAll,   ". "         },
+     {        " ", kUppercaseAll,   "."          },
+     {         "", kUppercaseAll,   "='"         },
+     {        " ", kUppercaseAll,   ". "         },
+     {        " ", kUppercaseFirst, "=\""        },
+     {        " ", kUppercaseAll,   "='"         },
+     {        " ", kUppercaseFirst, "='"         },
+};
+
+static const size_t kNumTransforms =
+    sizeof(kTransforms) / sizeof(kTransforms[0]);
+
+static const size_t kOmitLastNTransforms[10] = {
+  0, 12, 27, 23, 42, 63, 56, 48, 59, 64,
+};
+
+static size_t ToUpperCase(uint8_t *p, size_t len) {
+  if (len == 1 || p[0] < 0xc0) {
+    if (p[0] >= 'a' && p[0] <= 'z') {
+      p[0] ^= 32;
+    }
+    return 1;
+  }
+  if (p[0] < 0xe0) {
+    p[1] ^= 32;
+    return 2;
+  }
+  if (len == 2) {
+    return 2;
+  }
+  p[2] ^= 5;
+  return 3;
+}
+
+inline std::string TransformWord(
+    WordTransformType transform_type, const uint8_t* word, size_t len) {
+  if (transform_type <= kOmitLast9) {
+    if (len <= static_cast<size_t>(transform_type)) {
+      return std::string();
+    }
+    return std::string(word, word + len - transform_type);
+  }
+
+  if (transform_type >= kOmitFirst1) {
+    const size_t skip = transform_type - (kOmitFirst1 - 1);
+    if (len <= skip) {
+      return std::string();
+    }
+    return std::string(word + skip, word + len);
+  }
+
+  std::string ret = std::string(word, word + len);
+  uint8_t *uppercase = reinterpret_cast<uint8_t*>(&ret[0]);
+  if (transform_type == kUppercaseFirst) {
+    ToUpperCase(uppercase, len);
+  } else if (transform_type == kUppercaseAll) {
+    size_t position = 0;
+    while (position < len) {
+      size_t step = ToUpperCase(uppercase, len - position);
+      uppercase += step;
+      position += step;
+    }
+  }
+  return ret;
+}
+
+inline std::string ApplyTransform(
+    const Transform& t, const uint8_t* word, size_t len) {
+  return std::string(t.prefix) +
+      TransformWord(t.word_transform, word, len) + std::string(t.suffix);
+}
+
+inline std::string GetTransformedDictionaryWord(size_t len_code,
+                                                size_t word_id) {
+  size_t num_words = 1u << kBrotliDictionarySizeBitsByLength[len_code];
+  size_t offset = kBrotliDictionaryOffsetsByLength[len_code];
+  size_t t = word_id / num_words;
+  size_t word_idx = word_id % num_words;
+  offset += len_code * word_idx;
+  const uint8_t* word = &kBrotliDictionary[offset];
+  return ApplyTransform(kTransforms[t], word, len_code);
+}
+
+}  // namespace brotli
+
+#endif  // BROTLI_ENC_TRANSFORM_H_
diff --git a/third_party/brotli/enc/types.h b/third_party/brotli/enc/types.h
new file mode 100644
index 0000000..266a9cd
--- /dev/null
+++ b/third_party/brotli/enc/types.h
@@ -0,0 +1,29 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Common types */
+
+#ifndef BROTLI_ENC_TYPES_H_
+#define BROTLI_ENC_TYPES_H_
+
+#include <stddef.h>  /* for size_t */
+
+#if defined(_MSC_VER) && (_MSC_VER < 1600)
+typedef __int8 int8_t;
+typedef unsigned __int8 uint8_t;
+typedef __int16 int16_t;
+typedef unsigned __int16 uint16_t;
+typedef __int32 int32_t;
+typedef unsigned __int32 uint32_t;
+typedef unsigned __int64 uint64_t;
+typedef __int64 int64_t;
+#else
+#include <stdint.h>
+#endif  /* defined(_MSC_VER) && (_MSC_VER < 1600) */
+
+#define MAKE_UINT64_T(high, low) ((((uint64_t)(high)) << 32) | low)
+
+#endif  /* BROTLI_ENC_TYPES_H_ */
diff --git a/third_party/brotli/enc/utf8_util.cc b/third_party/brotli/enc/utf8_util.cc
new file mode 100644
index 0000000..a2b5c3a6
--- /dev/null
+++ b/third_party/brotli/enc/utf8_util.cc
@@ -0,0 +1,83 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Heuristics for deciding about the UTF8-ness of strings.
+
+#include "./utf8_util.h"
+
+#include "./types.h"
+
+namespace brotli {
+
+namespace {
+
+size_t ParseAsUTF8(int* symbol, const uint8_t* input, size_t size) {
+  // ASCII
+  if ((input[0] & 0x80) == 0) {
+    *symbol = input[0];
+    if (*symbol > 0) {
+      return 1;
+    }
+  }
+  // 2-byte UTF8
+  if (size > 1u &&
+      (input[0] & 0xe0) == 0xc0 &&
+      (input[1] & 0xc0) == 0x80) {
+    *symbol = (((input[0] & 0x1f) << 6) |
+               (input[1] & 0x3f));
+    if (*symbol > 0x7f) {
+      return 2;
+    }
+  }
+  // 3-byte UFT8
+  if (size > 2u &&
+      (input[0] & 0xf0) == 0xe0 &&
+      (input[1] & 0xc0) == 0x80 &&
+      (input[2] & 0xc0) == 0x80) {
+    *symbol = (((input[0] & 0x0f) << 12) |
+               ((input[1] & 0x3f) << 6) |
+               (input[2] & 0x3f));
+    if (*symbol > 0x7ff) {
+      return 3;
+    }
+  }
+  // 4-byte UFT8
+  if (size > 3u &&
+      (input[0] & 0xf8) == 0xf0 &&
+      (input[1] & 0xc0) == 0x80 &&
+      (input[2] & 0xc0) == 0x80 &&
+      (input[3] & 0xc0) == 0x80) {
+    *symbol = (((input[0] & 0x07) << 18) |
+               ((input[1] & 0x3f) << 12) |
+               ((input[2] & 0x3f) << 6) |
+               (input[3] & 0x3f));
+    if (*symbol > 0xffff && *symbol <= 0x10ffff) {
+      return 4;
+    }
+  }
+  // Not UTF8, emit a special symbol above the UTF8-code space
+  *symbol = 0x110000 | input[0];
+  return 1;
+}
+
+}  // namespace
+
+// Returns true if at least min_fraction of the data is UTF8-encoded.
+bool IsMostlyUTF8(const uint8_t* data, const size_t pos, const size_t mask,
+                  const size_t length, const double min_fraction) {
+  size_t size_utf8 = 0;
+  size_t i = 0;
+  while (i < length) {
+    int symbol;
+    size_t bytes_read = ParseAsUTF8(
+        &symbol, &data[(pos + i) & mask], length - i);
+    i += bytes_read;
+    if (symbol < 0x110000) size_utf8 += bytes_read;
+  }
+  return size_utf8 > min_fraction * static_cast<double>(length);
+}
+
+}  // namespace brotli
diff --git a/third_party/brotli/enc/utf8_util.h b/third_party/brotli/enc/utf8_util.h
new file mode 100644
index 0000000..74f22b6a
--- /dev/null
+++ b/third_party/brotli/enc/utf8_util.h
@@ -0,0 +1,25 @@
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Heuristics for deciding about the UTF8-ness of strings.
+
+#ifndef BROTLI_ENC_UTF8_UTIL_H_
+#define BROTLI_ENC_UTF8_UTIL_H_
+
+#include "./types.h"
+
+namespace brotli {
+
+static const double kMinUTF8Ratio = 0.75;
+
+// Returns true if at least min_fraction of the bytes between pos and
+// pos + length in the (data, mask) ringbuffer is UTF8-encoded.
+bool IsMostlyUTF8(const uint8_t* data, const size_t pos, const size_t mask,
+                  const size_t length, const double min_fraction);
+
+}  // namespace brotli
+
+#endif  // BROTLI_ENC_UTF8_UTIL_H_
diff --git a/third_party/brotli/enc/write_bits.h b/third_party/brotli/enc/write_bits.h
new file mode 100644
index 0000000..b605203a
--- /dev/null
+++ b/third_party/brotli/enc/write_bits.h
@@ -0,0 +1,84 @@
+/* Copyright 2010 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+// Write bits into a byte array.
+
+#ifndef BROTLI_ENC_WRITE_BITS_H_
+#define BROTLI_ENC_WRITE_BITS_H_
+
+#include <assert.h>
+#include <stdio.h>
+
+#include "./port.h"
+#include "./types.h"
+
+namespace brotli {
+
+//#define BIT_WRITER_DEBUG
+
+// This function writes bits into bytes in increasing addresses, and within
+// a byte least-significant-bit first.
+//
+// The function can write up to 56 bits in one go with WriteBits
+// Example: let's assume that 3 bits (Rs below) have been written already:
+//
+// BYTE-0     BYTE+1       BYTE+2
+//
+// 0000 0RRR    0000 0000    0000 0000
+//
+// Now, we could write 5 or less bits in MSB by just sifting by 3
+// and OR'ing to BYTE-0.
+//
+// For n bits, we take the last 5 bits, OR that with high bits in BYTE-0,
+// and locate the rest in BYTE+1, BYTE+2, etc.
+inline void WriteBits(size_t n_bits,
+                      uint64_t bits,
+                      size_t * __restrict pos,
+                      uint8_t * __restrict array) {
+#ifdef BIT_WRITER_DEBUG
+  printf("WriteBits  %2d  0x%016llx  %10d\n", n_bits, bits, *pos);
+#endif
+  assert((bits >> n_bits) == 0);
+  assert(n_bits <= 56);
+#ifdef IS_LITTLE_ENDIAN
+  // This branch of the code can write up to 56 bits at a time,
+  // 7 bits are lost by being perhaps already in *p and at least
+  // 1 bit is needed to initialize the bit-stream ahead (i.e. if 7
+  // bits are in *p and we write 57 bits, then the next write will
+  // access a byte that was never initialized).
+  uint8_t *p = &array[*pos >> 3];
+  uint64_t v = *p;
+  v |= bits << (*pos & 7);
+  BROTLI_UNALIGNED_STORE64(p, v);  // Set some bits.
+  *pos += n_bits;
+#else
+  // implicit & 0xff is assumed for uint8_t arithmetics
+  uint8_t *array_pos = &array[*pos >> 3];
+  const size_t bits_reserved_in_first_byte = (*pos & 7);
+  bits <<= bits_reserved_in_first_byte;
+  *array_pos++ |= static_cast<uint8_t>(bits);
+  for (size_t bits_left_to_write = n_bits + bits_reserved_in_first_byte;
+       bits_left_to_write >= 9;
+       bits_left_to_write -= 8) {
+    bits >>= 8;
+    *array_pos++ = static_cast<uint8_t>(bits);
+  }
+  *array_pos = 0;
+  *pos += n_bits;
+#endif
+}
+
+inline void WriteBitsPrepareStorage(size_t pos, uint8_t *array) {
+#ifdef BIT_WRITER_DEBUG
+  printf("WriteBitsPrepareStorage            %10d\n", pos);
+#endif
+  assert((pos & 7) == 0);
+  array[pos >> 3] = 0;
+}
+
+}  // namespace brotli
+
+#endif  // BROTLI_ENC_WRITE_BITS_H_
diff --git a/third_party/brotli/tools/DEPS b/third_party/brotli/tools/DEPS
new file mode 100644
index 0000000..71354679
--- /dev/null
+++ b/third_party/brotli/tools/DEPS
@@ -0,0 +1,4 @@
+include_rules = [
+  "+third_party/brotli/enc",
+  "+third_party/brotli/dec",
+]
diff --git a/third_party/brotli/tools/bro.cc b/third_party/brotli/tools/bro.cc
new file mode 100644
index 0000000..b254f0f
--- /dev/null
+++ b/third_party/brotli/tools/bro.cc
@@ -0,0 +1,335 @@
+/* Copyright 2014 Google Inc. All Rights Reserved.
+
+   Distributed under MIT license.
+   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Example main() function for Brotli library. */
+
+#include <fcntl.h>
+#include <stdio.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include <cstdlib>
+#include <cstring>
+#include <ctime>
+#include <string>
+
+#include "../dec/decode.h"
+#include "../enc/compressor.h"
+
+#if !defined(_WIN32)
+#include <unistd.h>
+#else
+#include <io.h>
+
+#define STDIN_FILENO _fileno(stdin)
+#define STDOUT_FILENO _fileno(stdout)
+#define S_IRUSR S_IREAD
+#define S_IWUSR S_IWRITE
+#define fdopen _fdopen
+#define unlink _unlink
+
+#define fopen ms_fopen
+#define open ms_open
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1400)
+#define fseek _fseeki64
+#define ftell _ftelli64
+#endif
+
+static inline FILE* ms_fopen(const char *filename, const char *mode) {
+  FILE* result = 0;
+  fopen_s(&result, filename, mode);
+  return result;
+}
+
+static inline int ms_open(const char *filename, int oflag, int pmode) {
+  int result = -1;
+  _sopen_s(&result, filename, oflag | O_BINARY, _SH_DENYNO, pmode);
+  return result;
+}
+#endif  /* WIN32 */
+
+
+static bool ParseQuality(const char* s, int* quality) {
+  if (s[0] >= '0' && s[0] <= '9') {
+    *quality = s[0] - '0';
+    if (s[1] >= '0' && s[1] <= '9') {
+      *quality = *quality * 10 + s[1] - '0';
+      return s[2] == 0;
+    }
+    return s[1] == 0;
+  }
+  return false;
+}
+
+static void ParseArgv(int argc, char **argv,
+                      char **input_path,
+                      char **output_path,
+                      int *force,
+                      int *quality,
+                      int *decompress,
+                      int *repeat,
+                      int *verbose,
+                      int *lgwin) {
+  *force = 0;
+  *input_path = 0;
+  *output_path = 0;
+  *repeat = 1;
+  *verbose = 0;
+  *lgwin = 22;
+  {
+    size_t argv0_len = strlen(argv[0]);
+    *decompress =
+        argv0_len >= 5 && strcmp(&argv[0][argv0_len - 5], "unbro") == 0;
+  }
+  for (int k = 1; k < argc; ++k) {
+    if (!strcmp("--force", argv[k]) ||
+        !strcmp("-f", argv[k])) {
+      if (*force != 0) {
+        goto error;
+      }
+      *force = 1;
+      continue;
+    } else if (!strcmp("--decompress", argv[k]) ||
+               !strcmp("--uncompress", argv[k]) ||
+               !strcmp("-d", argv[k])) {
+      *decompress = 1;
+      continue;
+    } else if (!strcmp("--verbose", argv[k]) ||
+               !strcmp("-v", argv[k])) {
+      if (*verbose != 0) {
+        goto error;
+      }
+      *verbose = 1;
+      continue;
+    }
+    if (k < argc - 1) {
+      if (!strcmp("--input", argv[k]) ||
+          !strcmp("--in", argv[k]) ||
+          !strcmp("-i", argv[k])) {
+        if (*input_path != 0) {
+          goto error;
+        }
+        *input_path = argv[k + 1];
+        ++k;
+        continue;
+      } else if (!strcmp("--output", argv[k]) ||
+                 !strcmp("--out", argv[k]) ||
+                 !strcmp("-o", argv[k])) {
+        if (*output_path != 0) {
+          goto error;
+        }
+        *output_path = argv[k + 1];
+        ++k;
+        continue;
+      } else if (!strcmp("--quality", argv[k]) ||
+                 !strcmp("-q", argv[k])) {
+        if (!ParseQuality(argv[k + 1], quality)) {
+          goto error;
+        }
+        ++k;
+        continue;
+      } else if (!strcmp("--repeat", argv[k]) ||
+                 !strcmp("-r", argv[k])) {
+        if (!ParseQuality(argv[k + 1], repeat)) {
+          goto error;
+        }
+        ++k;
+        continue;
+      }  else if (!strcmp("--window", argv[k]) ||
+                  !strcmp("-w", argv[k])) {
+        if (!ParseQuality(argv[k + 1], lgwin)) {
+          goto error;
+        }
+        if (*lgwin < 10 || *lgwin >= 25) {
+          goto error;
+        }
+        ++k;
+        continue;
+      }
+    }
+    goto error;
+  }
+  return;
+error:
+  fprintf(stderr,
+          "Usage: %s [--force] [--quality n] [--decompress]"
+          " [--input filename] [--output filename] [--repeat iters]"
+          " [--verbose] [--window n]\n",
+          argv[0]);
+  exit(1);
+}
+
+static FILE* OpenInputFile(const char* input_path) {
+  if (input_path == 0) {
+    return fdopen(STDIN_FILENO, "rb");
+  }
+  FILE* f = fopen(input_path, "rb");
+  if (f == 0) {
+    perror("fopen");
+    exit(1);
+  }
+  return f;
+}
+
+static FILE *OpenOutputFile(const char *output_path, const int force) {
+  if (output_path == 0) {
+    return fdopen(STDOUT_FILENO, "wb");
+  }
+  int excl = force ? 0 : O_EXCL;
+  int fd = open(output_path, O_CREAT | excl | O_WRONLY | O_TRUNC,
+                S_IRUSR | S_IWUSR);
+  if (fd < 0) {
+    if (!force) {
+      struct stat statbuf;
+      if (stat(output_path, &statbuf) == 0) {
+        fprintf(stderr, "output file exists\n");
+        exit(1);
+      }
+    }
+    perror("open");
+    exit(1);
+  }
+  return fdopen(fd, "wb");
+}
+
+static int64_t FileSize(char *path) {
+  FILE *f = fopen(path, "rb");
+  if (f == NULL) {
+    return -1;
+  }
+  if (fseek(f, 0L, SEEK_END) != 0) {
+    fclose(f);
+    return -1;
+  }
+  int64_t retval = ftell(f);
+  if (fclose(f) != 0) {
+    return -1;
+  }
+  return retval;
+}
+
+static const size_t kFileBufferSize = 65536;
+
+static void Decompresss(FILE* fin, FILE* fout) {
+  BrotliState* s = BrotliCreateState(NULL, NULL, NULL);
+  if (!s) {
+    fprintf(stderr, "out of memory\n");
+    exit(1);
+  }
+  uint8_t* input = new uint8_t[kFileBufferSize];
+  uint8_t* output = new uint8_t[kFileBufferSize];
+  size_t total_out;
+  size_t available_in;
+  const uint8_t* next_in;
+  size_t available_out = kFileBufferSize;
+  uint8_t* next_out = output;
+  BrotliResult result = BROTLI_RESULT_NEEDS_MORE_INPUT;
+  while (1) {
+    if (result == BROTLI_RESULT_NEEDS_MORE_INPUT) {
+      if (feof(fin)) {
+        break;
+      }
+      available_in = fread(input, 1, kFileBufferSize, fin);
+      next_in = input;
+      if (ferror(fin)) {
+        break;
+      }
+    } else if (result == BROTLI_RESULT_NEEDS_MORE_OUTPUT) {
+      fwrite(output, 1, kFileBufferSize, fout);
+      if (ferror(fout)) {
+        break;
+      }
+      available_out = kFileBufferSize;
+      next_out = output;
+    } else {
+      break; /* Error or success. */
+    }
+    result = BrotliDecompressStream(&available_in, &next_in,
+        &available_out, &next_out, &total_out, s);
+  }
+  if (next_out != output) {
+    fwrite(output, 1, static_cast<size_t>(next_out - output), fout);
+  }
+  delete[] input;
+  delete[] output;
+  BrotliDestroyState(s);
+  if ((result == BROTLI_RESULT_NEEDS_MORE_OUTPUT) || ferror(fout)) {
+    fprintf(stderr, "failed to write output\n");
+    exit(1);
+  } else if (result != BROTLI_RESULT_SUCCESS) { /* Error or needs more input. */
+    fprintf(stderr, "corrupt input\n");
+    exit(1);
+  }
+}
+
+int main(int argc, char** argv) {
+  char *input_path = 0;
+  char *output_path = 0;
+  int force = 0;
+  int quality = 11;
+  int decompress = 0;
+  int repeat = 1;
+  int verbose = 0;
+  int lgwin = 0;
+  ParseArgv(argc, argv, &input_path, &output_path, &force,
+            &quality, &decompress, &repeat, &verbose, &lgwin);
+  const clock_t clock_start = clock();
+  for (int i = 0; i < repeat; ++i) {
+    FILE* fin = OpenInputFile(input_path);
+    FILE* fout = OpenOutputFile(output_path, force);
+    if (decompress) {
+      Decompresss(fin, fout);
+    } else {
+      brotli::BrotliParams params;
+      params.lgwin = lgwin;
+      params.quality = quality;
+      try {
+        brotli::BrotliFileIn in(fin, 1 << 16);
+        brotli::BrotliFileOut out(fout);
+        if (!BrotliCompress(params, &in, &out)) {
+          fprintf(stderr, "compression failed\n");
+          unlink(output_path);
+          exit(1);
+        }
+      } catch (std::bad_alloc&) {
+        fprintf(stderr, "not enough memory\n");
+        unlink(output_path);
+        exit(1);
+      }
+    }
+    if (fclose(fin) != 0) {
+      perror("fclose");
+      exit(1);
+    }
+    if (fclose(fout) != 0) {
+      perror("fclose");
+      exit(1);
+    }
+  }
+  if (verbose) {
+    const clock_t clock_end = clock();
+    double duration =
+        static_cast<double>(clock_end - clock_start) / CLOCKS_PER_SEC;
+    if (duration < 1e-9) {
+      duration = 1e-9;
+    }
+    int64_t uncompressed_size = FileSize(decompress ? output_path : input_path);
+    if (uncompressed_size == -1) {
+      fprintf(stderr, "failed to determine uncompressed file size\n");
+      exit(1);
+    }
+    double uncompressed_bytes_in_MB =
+        static_cast<double>(repeat * uncompressed_size) / (1024.0 * 1024.0);
+    if (decompress) {
+      printf("Brotli decompression speed: ");
+    } else {
+      printf("Brotli compression speed: ");
+    }
+    printf("%g MB/s\n", uncompressed_bytes_in_MB / duration);
+  }
+  return 0;
+}
diff --git a/third_party/kasko/kasko.gyp b/third_party/kasko/kasko.gyp
index 4acbdb6..686915d 100644
--- a/third_party/kasko/kasko.gyp
+++ b/third_party/kasko/kasko.gyp
@@ -43,6 +43,7 @@
           # GN: //third_party/kasko
           'target_name': 'kasko',
           'type': 'none',
+          'hard_dependency': 1,
           'dependencies': [
             'copy_kasko_dll',
             'kasko_features',
diff --git a/third_party/libjingle/BUILD.gn b/third_party/libjingle/BUILD.gn
index 5b9bbe1..8c6acfdd 100644
--- a/third_party/libjingle/BUILD.gn
+++ b/third_party/libjingle/BUILD.gn
@@ -11,6 +11,7 @@
     "FEATURE_ENABLE_SSL",
     "GTEST_RELATIVE_PATH",
     "HAVE_OPENSSL_SSL_H",
+    "HAVE_SCTP",
     "HAVE_SRTP",
     "HAVE_WEBRTC_VIDEO",
     "HAVE_WEBRTC_VOICE",
@@ -379,6 +380,8 @@
       "../webrtc/media/engine/webrtcvoe.h",
       "../webrtc/media/engine/webrtcvoiceengine.cc",
       "../webrtc/media/engine/webrtcvoiceengine.h",
+      "../webrtc/media/sctp/sctpdataengine.cc",
+      "../webrtc/media/sctp/sctpdataengine.h",
       "../webrtc/pc/audiomonitor.cc",
       "../webrtc/pc/audiomonitor.h",
       "../webrtc/pc/bundlefilter.cc",
@@ -412,22 +415,13 @@
     deps = [
       ":libjingle",
       "//third_party/libsrtp",
+      "//third_party/usrsctp",
       "//third_party/webrtc",
       "//third_party/webrtc/modules/media_file",
       "//third_party/webrtc/modules/video_capture",
       "//third_party/webrtc/system_wrappers",
       "//third_party/webrtc/voice_engine",
     ]
-
-    if (!is_ios) {
-      # TODO(mallinath) - Enable SCTP for iOS.
-      sources += [
-        "../webrtc/media/sctp/sctpdataengine.cc",
-        "../webrtc/media/sctp/sctpdataengine.h",
-      ]
-      defines = [ "HAVE_SCTP" ]
-      deps += [ "//third_party/usrsctp" ]
-    }
   }
 
   source_set("libstunprober") {
diff --git a/third_party/libjingle/README.chromium b/third_party/libjingle/README.chromium
index 3a96cd9..d56dcf86 100644
--- a/third_party/libjingle/README.chromium
+++ b/third_party/libjingle/README.chromium
@@ -3,7 +3,7 @@
 Version: unknown
 Revision: 12750
 License: BSD
-License File: source/talk/COPYING
+License File: ../webrtc/LICENSE
 Security Critical: yes
 
 Description:
diff --git a/tools/cfi/blacklist.txt b/tools/cfi/blacklist.txt
index aa72a248..cb0b24f13 100644
--- a/tools/cfi/blacklist.txt
+++ b/tools/cfi/blacklist.txt
@@ -18,17 +18,6 @@
 # https://crbug.com/517959
 type:*NoAddRefRelease*
 
-# All types and sources from libclearkeycdm.so.
-# See https://crbug.com/557969
-type:media::CdmVideoDecoder
-type:media::ClearKeyCdm
-type:media::FakeCdmVideoDecoder
-type:media::FFmpegCdmAudioDecoder
-type:media::FFmpegCdmVideoDecoder
-type:media::LibvpxCdmVideoDecoder
-src:*external_clear_key*
-type:cdm::*
-
 # invalid downcasts for IPC messages
 # https://crbug.com/520760
 src:*nacl_message_scanner.cc*
diff --git a/tools/checklicenses/checklicenses.py b/tools/checklicenses/checklicenses.py
index f89428e..80c9615f 100755
--- a/tools/checklicenses/checklicenses.py
+++ b/tools/checklicenses/checklicenses.py
@@ -419,9 +419,6 @@
     'third_party/lcov/contrib/galaxy/genflat.pl': [
         'GPL (v2 or later)',
     ],
-    'third_party/libjingle/source/talk': [  # http://crbug.com/98310
-        'UNKNOWN',
-    ],
     'third_party/libjpeg_turbo': [  # http://crbug.com/98314
         'UNKNOWN',
     ],
diff --git a/tools/export_tarball/export_tarball.py b/tools/export_tarball/export_tarball.py
deleted file mode 100755
index 876b3d89..0000000
--- a/tools/export_tarball/export_tarball.py
+++ /dev/null
@@ -1,197 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2012 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""
-This tool creates a tarball with all the sources, but without .svn directories.
-
-It can also remove files which are not strictly required for build, so that
-the resulting tarball can be reasonably small (last time it was ~110 MB).
-
-Example usage:
-
-export_tarball.py /foo/bar
-
-The above will create file /foo/bar.tar.bz2.
-"""
-
-import optparse
-import os
-import subprocess
-import sys
-import tarfile
-
-
-NONESSENTIAL_DIRS = (
-    'breakpad/src/processor/testdata',
-    'chrome/browser/resources/tracing/tests',
-    'chrome/common/extensions/docs',
-    'courgette/testdata',
-    'data',
-    'native_client/src/trusted/service_runtime/testdata',
-    'src/chrome/test/data',
-    'o3d/documentation',
-    'o3d/samples',
-    'o3d/tests',
-    'ppapi/examples',
-    'ppapi/native_client/tests',
-    'third_party/angle/samples/gles2_book',
-    'third_party/findbugs',
-    'third_party/hunspell_dictionaries',
-    'third_party/hunspell/tests',
-    'third_party/lighttpd',
-    'third_party/sqlite/src/test',
-    'third_party/sqlite/test',
-    'third_party/vc_80',
-    'third_party/xdg-utils/tests',
-    'third_party/yasm/source/patched-yasm/modules/arch/x86/tests',
-    'third_party/yasm/source/patched-yasm/modules/dbgfmts/dwarf2/tests',
-    'third_party/yasm/source/patched-yasm/modules/objfmts/bin/tests',
-    'third_party/yasm/source/patched-yasm/modules/objfmts/coff/tests',
-    'third_party/yasm/source/patched-yasm/modules/objfmts/elf/tests',
-    'third_party/yasm/source/patched-yasm/modules/objfmts/macho/tests',
-    'third_party/yasm/source/patched-yasm/modules/objfmts/rdf/tests',
-    'third_party/yasm/source/patched-yasm/modules/objfmts/win32/tests',
-    'third_party/yasm/source/patched-yasm/modules/objfmts/win64/tests',
-    'third_party/yasm/source/patched-yasm/modules/objfmts/xdf/tests',
-    'third_party/WebKit/LayoutTests',
-    'third_party/WebKit/Source/JavaScriptCore/tests',
-    'third_party/WebKit/Source/WebCore/ChangeLog',
-    'third_party/WebKit/Source/WebKit2',
-    'third_party/WebKit/Tools/Scripts',
-    'tools/gyp/test',
-    'v8/test',
-    'webkit/data/layout_tests',
-    'webkit/tools/test/reference_build',
-)
-
-TESTDIRS = (
-    'chrome/test/data',
-    'content/test/data',
-    'media/test/data',
-    'net/data',
-)
-
-
-def GetSourceDirectory():
-  return os.path.realpath(
-    os.path.join(os.path.dirname(__file__), '..', '..', '..', 'src'))
-
-
-# Workaround lack of the exclude parameter in add method in python-2.4.
-# TODO(phajdan.jr): remove the workaround when it's not needed on the bot.
-class MyTarFile(tarfile.TarFile):
-  def set_remove_nonessential_files(self, remove):
-    self.__remove_nonessential_files = remove
-
-  def set_verbose(self, verbose):
-    self.__verbose = verbose
-
-  def __report_skipped(self, name):
-    if self.__verbose:
-      print 'D\t%s' % name
-
-  def __report_added(self, name):
-    if self.__verbose:
-      print 'A\t%s' % name
-
-  def add(self, name, arcname=None, recursive=True, exclude=None, filter=None):
-    head, tail = os.path.split(name)
-    if tail in ('.svn', '.git'):
-      self.__report_skipped(name)
-      return
-
-    if self.__remove_nonessential_files:
-      # WebKit change logs take quite a lot of space. This saves ~10 MB
-      # in a bzip2-compressed tarball.
-      if 'ChangeLog' in name:
-        self.__report_skipped(name)
-        return
-
-      # Remove contents of non-essential directories, but preserve gyp files,
-      # so that build/gyp_chromium can work.
-      for nonessential_dir in (NONESSENTIAL_DIRS + TESTDIRS):
-        dir_path = os.path.join(GetSourceDirectory(), nonessential_dir)
-        if (name.startswith(dir_path) and
-            os.path.isfile(name) and
-            'gyp' not in name):
-          self.__report_skipped(name)
-          return
-
-    self.__report_added(name)
-    tarfile.TarFile.add(self, name, arcname=arcname, recursive=recursive)
-
-
-def main(argv):
-  parser = optparse.OptionParser()
-  parser.add_option("--basename")
-  parser.add_option("--remove-nonessential-files",
-                    dest="remove_nonessential_files",
-                    action="store_true", default=False)
-  parser.add_option("--test-data", action="store_true")
-  # TODO(phajdan.jr): Remove --xz option when it's not needed for compatibility.
-  parser.add_option("--xz", action="store_true")
-  parser.add_option("--verbose", action="store_true", default=False)
-  parser.add_option("--progress", action="store_true", default=False)
-
-  options, args = parser.parse_args(argv)
-
-  if len(args) != 1:
-    print 'You must provide only one argument: output file name'
-    print '(without .tar.xz extension).'
-    return 1
-
-  if not os.path.exists(GetSourceDirectory()):
-    print 'Cannot find the src directory ' + GetSourceDirectory()
-    return 1
-
-  # These two commands are from src/DEPS; please keep them in sync.
-  if subprocess.call(['python', 'build/util/lastchange.py', '-o',
-                      'build/util/LASTCHANGE'], cwd=GetSourceDirectory()) != 0:
-    print 'Could not run build/util/lastchange.py to update LASTCHANGE.'
-    return 1
-  if subprocess.call(['python', 'build/util/lastchange.py', '-s',
-                      'third_party/WebKit', '-o',
-                      'build/util/LASTCHANGE.blink'],
-                     cwd=GetSourceDirectory()) != 0:
-    print 'Could not run build/util/lastchange.py to update LASTCHANGE.blink.'
-    return 1
-
-  output_fullname = args[0] + '.tar'
-  output_basename = options.basename or os.path.basename(args[0])
-
-  archive = MyTarFile.open(output_fullname, 'w')
-  archive.set_remove_nonessential_files(options.remove_nonessential_files)
-  archive.set_verbose(options.verbose)
-  try:
-    if options.test_data:
-      for directory in TESTDIRS:
-        archive.add(os.path.join(GetSourceDirectory(), directory),
-                    arcname=os.path.join(output_basename, directory))
-    else:
-      archive.add(GetSourceDirectory(), arcname=output_basename)
-  finally:
-    archive.close()
-
-  if options.progress:
-    sys.stdout.flush()
-    pv = subprocess.Popen(
-        ['pv', '--force', output_fullname],
-        stdout=subprocess.PIPE,
-        stderr=sys.stdout)
-    with open(output_fullname + '.xz', 'w') as f:
-      rc = subprocess.call(['xz', '-9', '-'], stdin=pv.stdout, stdout=f)
-    pv.wait()
-  else:
-    rc = subprocess.call(['xz', '-9', output_fullname])
-
-  if rc != 0:
-    print 'xz -9 failed!'
-    return 1
-
-  return 0
-
-
-if __name__ == "__main__":
-  sys.exit(main(sys.argv[1:]))
diff --git a/tools/export_tarball/export_v8_tarball.py b/tools/export_tarball/export_v8_tarball.py
deleted file mode 100755
index b232c0a..0000000
--- a/tools/export_tarball/export_v8_tarball.py
+++ /dev/null
@@ -1,135 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2011 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Creates a tarball with V8 sources, but without .svn directories.
-
-This allows easy packaging of V8, synchronized with browser releases.
-
-Example usage:
-
-export_v8_tarball.py /foo/bar
-
-The above will create file /foo/bar/v8-VERSION.tar.bz2 if it doesn't exist.
-"""
-
-import optparse
-import os
-import re
-import subprocess
-import sys
-import tarfile
-
-_V8_MAJOR_VERSION_PATTERN = re.compile(r'#define\s+MAJOR_VERSION\s+(.*)')
-_V8_MINOR_VERSION_PATTERN = re.compile(r'#define\s+MINOR_VERSION\s+(.*)')
-_V8_BUILD_NUMBER_PATTERN = re.compile(r'#define\s+BUILD_NUMBER\s+(.*)')
-_V8_PATCH_LEVEL_PATTERN = re.compile(r'#define\s+PATCH_LEVEL\s+(.*)')
-
-_V8_PATTERNS = [
-  _V8_MAJOR_VERSION_PATTERN,
-  _V8_MINOR_VERSION_PATTERN,
-  _V8_BUILD_NUMBER_PATTERN,
-  _V8_PATCH_LEVEL_PATTERN]
-
-_NONESSENTIAL_DIRS = (
-    'third_party/icu',
-)
-
-
-def GetV8Version(v8_directory):
-  """
-  Returns version number as string based on the string
-  contents of version.cc file.
-  """
-  with open(os.path.join(v8_directory, 'src', 'version.cc')) as version_file:
-    version_contents = version_file.read()
-
-  version_components = []
-  for pattern in _V8_PATTERNS:
-    version_components.append(pattern.search(version_contents).group(1).strip())
-
-  if version_components[len(version_components) - 1] == '0':
-    version_components.pop()
-
-  return '.'.join(version_components)
-
-
-def GetSourceDirectory():
-  return os.path.realpath(
-    os.path.join(os.path.dirname(__file__), '..', '..', '..', 'src'))
-
-
-def GetV8Directory():
-  return os.path.join(GetSourceDirectory(), 'v8')
-
-
-# Workaround lack of the exclude parameter in add method in python-2.4.
-# TODO(phajdan.jr): remove the workaround when it's not needed on the bot.
-class MyTarFile(tarfile.TarFile):
-  def set_remove_nonessential_files(self, remove):
-    self.__remove_nonessential_files = remove
-
-  def add(self, name, arcname=None, recursive=True, exclude=None, filter=None):
-    head, tail = os.path.split(name)
-    if tail in ('.svn', '.git'):
-      return
-
-    if self.__remove_nonessential_files:
-      # Remove contents of non-essential directories, but preserve gyp files,
-      # so that build/gyp_chromium can work.
-      for nonessential_dir in _NONESSENTIAL_DIRS:
-        dir_path = os.path.join(GetV8Directory(), nonessential_dir)
-        if (name.startswith(dir_path) and
-            os.path.isfile(name) and
-            'gyp' not in name):
-          return
-
-    tarfile.TarFile.add(self, name, arcname=arcname, recursive=recursive)
-
-
-def main(argv):
-  parser = optparse.OptionParser()
-  options, args = parser.parse_args(argv)
-
-  if len(args) != 1:
-    print 'You must provide only one argument: output file directory'
-    return 1
-
-  v8_directory = GetV8Directory()
-  if not os.path.exists(v8_directory):
-    print 'Cannot find the v8 directory.'
-    return 1
-
-  v8_version = GetV8Version(v8_directory)
-  print 'Packaging V8 version %s...' % v8_version
-
-  subprocess.check_call(["make", "dependencies"], cwd=v8_directory)
-
-  output_basename = 'v8-%s' % v8_version
-
-  # Package full tarball.
-  output_fullname = os.path.join(args[0], output_basename + '.tar.bz2')
-  if not os.path.exists(output_fullname):
-    archive = MyTarFile.open(output_fullname, 'w:bz2')
-    archive.set_remove_nonessential_files(False)
-    try:
-      archive.add(v8_directory, arcname=output_basename)
-    finally:
-      archive.close()
-
-  # Package lite tarball.
-  output_fullname = os.path.join(args[0], output_basename + '-lite.tar.bz2')
-  if not os.path.exists(output_fullname):
-    archive = MyTarFile.open(output_fullname, 'w:bz2')
-    archive.set_remove_nonessential_files(True)
-    try:
-      archive.add(v8_directory, arcname=output_basename)
-    finally:
-      archive.close()
-
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 89c32d4e..64e46dc 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -100,7 +100,7 @@
       'Chromium Linux Goma Canary': 'gn_release_bot',
       'Chromium Linux Goma Canary (clobber)': 'gn_release_bot',
       'Chromium Linux Precise Goma LinkTest': 'gn_release_bot',
-      'Chromium Linux32 Goma Canary (clobber)': 'gyp_release_bot_x86',
+      'Chromium Linux32 Goma Canary (clobber)': 'gn_release_bot_x86',
       'Chromium Mac 10.10 MacViews': 'mac_views_browser_gyp_release_bot',
       'Chromium Mac 10.11': 'gyp_release_bot',
       'Chromium Mac 10.11 Force Mac Toolchain': 'gyp_release_bot',
@@ -206,6 +206,7 @@
       'MD Top Chrome Win material':
         'gyp_debug_bot_minimal_symbols_x64',
       'MD Top Chrome Linux material': 'gn_debug_bot',
+      'LTO Linux': 'gn_official_goma_lto',
       'LTO Linux Perf': 'gn_official_goma_lto',
       'Libfuzzer Upload Linux ASan': 'gn_release_libfuzzer_asan',
       'Libfuzzer Upload Linux ASan Debug': 'gn_debug_libfuzzer_asan',
@@ -305,7 +306,7 @@
       'Cast Android (dbg)': 'android_cast_gn_debug_static_bot',
       'Cast Linux': 'cast_gn_release_bot',
       'Linux Builder (dbg)': 'swarming_gn_debug_bot',
-      'Linux Builder (dbg)(32)': 'swarming_gyp_debug_bot_no_symbols_x86',
+      'Linux Builder (dbg)(32)': 'swarming_gn_debug_bot_x86',
       'Linux Builder': 'swarming_gn_release_bot',
       'Linux Tests (dbg)(1)': 'none',
       'Linux Tests (dbg)(1)(32)': 'none',
@@ -729,10 +730,10 @@
       'linux_chromium_chromeos_variable': 'findit',
       'linux_chromium_chromeos_variable_chrome': 'findit',
       'linux_chromium_clobber_rel_ng': 'gn_release_trybot',
-      'linux_chromium_compile_dbg_32_ng': 'swarming_gyp_debug_trybot_x86',
+      'linux_chromium_compile_dbg_32_ng': 'swarming_gn_debug_trybot_x86',
       'linux_chromium_compile_dbg_ng': 'swarming_gn_debug_trybot',
       'linux_chromium_compile_rel_ng': 'swarming_gn_release_trybot',
-      'linux_chromium_dbg_32_ng': 'swarming_gyp_debug_trybot_x86',
+      'linux_chromium_dbg_32_ng': 'swarming_gn_debug_trybot_x86',
       'linux_chromium_dbg_ng': 'swarming_gn_debug_trybot',
       'linux_chromium_gn_chromeos_dbg': 'chromeos_gn_debug_bot',
       'linux_chromium_gn_chromeos_rel': 'chromeos_ozone_gn_release_trybot',
@@ -1143,6 +1144,10 @@
       'gn', 'release_bot_minimal_symbols', 'x86',
     ],
 
+    'gn_release_bot_x86': [
+      'gn', 'release_bot', 'x86',
+    ],
+
     'gn_release_drmemory_drfuzz': [
       'gn', 'release', 'drmemory', 'drfuzz', 'proprietary_codecs',
     ],
@@ -1333,10 +1338,6 @@
       'gyp', 'release_bot_minimal_symbols', 'x86'
     ],
 
-    'gyp_release_bot_x86': [
-      'gyp', 'release_bot', 'x86',
-    ],
-
     'gyp_release_trybot': [
       'gyp', 'release_trybot',
     ],
@@ -1504,6 +1505,11 @@
       'chromeos_with_codecs', 'goma', 'gyp', 'ozone', 'static', 'swarming',
     ],
 
+    'swarming_clang_tot_lld_release_shared': [
+      # TODO(crbug.com/605819): Enable debug info in release builds.
+      'swarming', 'gn', 'clang_tot', 'release', 'shared', 'use_lld',
+    ],
+
     'swarming_clang_tot_shared_debug': [
       'swarming', 'gn', 'clang_tot', 'shared', 'debug',
     ],
@@ -1520,15 +1526,14 @@
       'swarming', 'gn', 'debug_bot_minimal_symbols', 'x64',
     ],
 
-    'swarming_clang_tot_lld_release_shared': [
-      # TODO(crbug.com/605819): Enable debug info in release builds.
-      'swarming', 'gn', 'clang_tot', 'release', 'shared', 'use_lld',
-    ],
-
     'swarming_gn_debug_bot_minimal_symbols_x86': [
       'swarming', 'gn', 'debug_bot_minimal_symbols', 'x86',
     ],
 
+    'swarming_gn_debug_bot_x86': [
+      'swarming', 'gn', 'debug_bot', 'x86',
+    ],
+
     'swarming_gn_debug_trybot': [
       'swarming', 'gn', 'debug_trybot',
     ],
@@ -1802,10 +1807,6 @@
       'swarming', 'gyp', 'debug_bot_minimal_symbols', 'x86',
     ],
 
-    'swarming_gyp_debug_bot_no_symbols_x86': [
-      'swarming', 'gyp', 'debug_bot', 'no_symbols', 'x86',
-    ],
-
     'swarming_gyp_debug_trybot': [
       'swarming', 'gyp', 'debug_trybot',
     ],
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index ce8198fc..d6e3b42e 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -29091,6 +29091,14 @@
   </summary>
 </histogram>
 
+<histogram name="Net.QuicStreamFactory.TSVIPCliIsLoaded" enum="Boolean">
+  <owner>rtenneti@chromium.org</owner>
+  <summary>
+    Whether TSVIPCli DLL is loaded or not on windows when the socket is
+    configured.
+  </summary>
+</histogram>
+
 <histogram name="Net.QuicTimeBetweenTwoPacketSent" units="ms">
   <owner>zhongyi@chromium.org</owner>
   <summary>
@@ -46783,6 +46791,9 @@
 </histogram>
 
 <histogram name="SBOffDomainInclusion2.Abort" enum="ContentResourceType2">
+  <obsolete>
+    Deprecated 2016-05 as the OffDomainInclusionDetector was removed.
+  </obsolete>
   <owner>gab@chromium.org</owner>
   <summary>
     Logs the resource type of each resource request for which the off-domain
@@ -46792,6 +46803,9 @@
 </histogram>
 
 <histogram name="SBOffDomainInclusion2.InHistory" enum="ContentResourceType2">
+  <obsolete>
+    Deprecated 2016-05 as the OffDomainInclusionDetector was removed.
+  </obsolete>
   <owner>gab@chromium.org</owner>
   <summary>
     Logs the resource type of each resource request for which the off-domain
@@ -46802,6 +46816,9 @@
 
 <histogram name="SBOffDomainInclusion2.RequestAnalyzed"
     enum="ContentResourceType2">
+  <obsolete>
+    Deprecated 2016-05 as the OffDomainInclusionDetector was removed.
+  </obsolete>
   <owner>gab@chromium.org</owner>
   <summary>
     Logs the resource type of each resource request analyzed by the
@@ -46810,6 +46827,9 @@
 </histogram>
 
 <histogram name="SBOffDomainInclusion2.Suspicious" enum="ContentResourceType2">
+  <obsolete>
+    Deprecated 2016-05 as the OffDomainInclusionDetector was removed.
+  </obsolete>
   <owner>gab@chromium.org</owner>
   <summary>
     Logs the resource type of each resource request for which an off-domain
@@ -46819,6 +46839,9 @@
 </histogram>
 
 <histogram name="SBOffDomainInclusion2.Whitelisted" enum="ContentResourceType2">
+  <obsolete>
+    Deprecated 2016-05 as the OffDomainInclusionDetector was removed.
+  </obsolete>
   <owner>gab@chromium.org</owner>
   <summary>
     Logs the resource type of each resource request for which the off-domain
@@ -56532,7 +56555,37 @@
   </summary>
 </histogram>
 
+<histogram name="UMA.Debug.EnableCrashUpload.DeferredStartUptime" units="ms">
+  <owner>asvitkine@chromium.org</owner>
+  <summary>
+    Measures how much time since start up it took for onDeferredStartup() to be
+    called, which schedules enablePotentialCrashUploading() to be executed on an
+    async task. Only logged on Android.
+  </summary>
+</histogram>
+
+<histogram name="UMA.Debug.EnableCrashUpload.PostDeferredStartUptime"
+    units="ms">
+  <owner>asvitkine@chromium.org</owner>
+  <summary>
+    Measures how much time since start up it took before ChromeActivity's
+    postDeferredStartupIfNeeded() was called. Only logged on Android.
+  </summary>
+</histogram>
+
 <histogram name="UMA.Debug.EnableCrashUpload.Uptime" units="ms">
+  <obsolete>
+    Replaced by UMA.Debug.EnableCrashUpload.Uptime2
+  </obsolete>
+  <owner>asvitkine@chromium.org</owner>
+  <summary>
+    Measures how much time since start up it took before crash reporting was
+    enabled via enablePotentialCrashUploading() as part of deferred start up.
+    Only logged on Android.
+  </summary>
+</histogram>
+
+<histogram name="UMA.Debug.EnableCrashUpload.Uptime2" units="ms">
   <owner>asvitkine@chromium.org</owner>
   <summary>
     Measures how much time since start up it took before crash reporting was
@@ -56586,6 +56639,26 @@
   </summary>
 </histogram>
 
+<histogram name="UMA.FileMetricsProvider.DeletedFiles">
+  <owner>asvitkine@chromium.org</owner>
+  <owner>bcwhite@chromium.org</owner>
+  <summary>
+    The number of old metrics files for which a delete was attempted. This is
+    logged once with each upload operation. Values greater than 1 indicate that
+    the files are not deletable by the browser and must be cleaned up by
+    whatever process is creating them.
+  </summary>
+</histogram>
+
+<histogram name="UMA.FileMetricsProvider.DirectoryFiles">
+  <owner>asvitkine@chromium.org</owner>
+  <owner>bcwhite@chromium.org</owner>
+  <summary>
+    The number of metrics files in a directory that need to be uploaded. This is
+    logged once with each upload operation.
+  </summary>
+</histogram>
+
 <histogram name="UMA.FileMetricsProvider.InitialAccessResult"
     enum="FileMetricsProviderAccessResult">
   <owner>asvitkine@chromium.org</owner>
@@ -60222,6 +60295,14 @@
   </summary>
 </histogram>
 
+<histogram name="WebRTC.Audio.Encoder.CodecType" enum="WebRtcAudioCodecs">
+  <owner>aleloi@chromium.org</owner>
+  <summary>
+    Histogram of audio codec usage. Every sample corresponds to 5 seconds of
+    encoding with that codec.
+  </summary>
+</histogram>
+
 <histogram name="WebRTC.Audio.NumOfAecSystemDelayJumps" units="jumps">
   <owner>bjornv@chromium.org</owner>
   <summary>
@@ -72694,6 +72775,11 @@
   <int value="1360" label="CSSValueAppearanceRadio"/>
   <int value="1361" label="CSSValueAppearanceSearchField"/>
   <int value="1362" label="CSSValueAppearanceTextField"/>
+  <int value="1363" label="AudioContextCreatePannerAutomated"/>
+  <int value="1364" label="PannerNodeSetPosition"/>
+  <int value="1365" label="PannerNodeSetOrientation"/>
+  <int value="1366" label="AudioListenerSetPosition"/>
+  <int value="1367" label="AudioListenerSetOrientation"/>
 </enum>
 
 <enum name="FetchRequestMode" type="int">
@@ -73524,6 +73610,7 @@
   <int value="3" label="File is invalid (e.g. directory or zero-size)."/>
   <int value="4" label="File could not be memory-mapped by system."/>
   <int value="5" label="File has invalid contents."/>
+  <int value="6" label="File could not be exclusively opened."/>
 </enum>
 
 <enum name="FileSystemDatabaseInitResult" type="int">
@@ -74731,7 +74818,7 @@
   <int value="4" label="Linear histograms created"/>
   <int value="5" label="Boolean histograms created"/>
   <int value="6" label="Custom histograms created"/>
-  <int value="7" label="sparse histograms created"/>
+  <int value="7" label="Sparse histograms created"/>
   <int value="8" label="UMA-targeted histograms created"/>
   <int value="9" label="UMA-stability histograms created"/>
   <int value="10" label="Persistent histograms created"/>
@@ -76137,6 +76224,12 @@
   <int value="14" label="ERROR_INVALID_PERMISSIONS">
     Broker was asked to transfer a HANDLE with invalid permissions.
   </int>
+  <int value="15" label="DELAYED">
+    Broker was not immediately able to send an attachment.
+  </int>
+  <int value="16" label="DELAYED_SEND">
+    Broker successfully sent a delayed attachment.
+  </int>
 </enum>
 
 <enum name="IPCAttachmentBrokerUnprivilegedBrokerAttachmentError" type="int">
@@ -89184,6 +89277,16 @@
   <int value="2" label="WEB_HISTORY_QUERY_TIMED_OUT">Timed out</int>
 </enum>
 
+<enum name="WebRtcAudioCodecs" type="int">
+  <int value="0" label="Unknown"/>
+  <int value="1" label="Opus"/>
+  <int value="2" label="iSAC"/>
+  <int value="3" label="pcmA"/>
+  <int value="4" label="pcmU"/>
+  <int value="5" label="g722"/>
+  <int value="6" label="iLBC"/>
+</enum>
+
 <enum name="WebRtcH264DecoderImplEvent" type="int">
   <int value="0" label="Init"/>
   <int value="1" label="Error"/>
@@ -93345,6 +93448,9 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="OffDomainInclusionAbortReason" separator=".">
+  <obsolete>
+    Deprecated 2016-05 as the OffDomainInclusionDetector was removed.
+  </obsolete>
   <suffix name="EmptyMainFrameURL" label="The main frame URL was empty."/>
   <suffix name="HistoryLookupFailed"
       label="The lookup to the HistoryService failed."/>
diff --git a/tools/perf/benchmarks/memory_infra.py b/tools/perf/benchmarks/memory_infra.py
index 697e3ad..4672f73 100644
--- a/tools/perf/benchmarks/memory_infra.py
+++ b/tools/perf/benchmarks/memory_infra.py
@@ -163,6 +163,7 @@
     return cls.IsSvelte(possible_browser)  # http://crbug.com/611167
 
 
+@benchmark.Disabled('android-webview') # http://crbug.com/612210
 class MemoryLongRunningIdleGmailBackground(_MemoryV8Benchmark):
   """Use (recorded) real world web sites and measure memory consumption
   of long running idle Gmail page """
diff --git a/tools/perf/benchmarks/page_cycler.py b/tools/perf/benchmarks/page_cycler.py
index de19ab4..b952e68c 100644
--- a/tools/perf/benchmarks/page_cycler.py
+++ b/tools/perf/benchmarks/page_cycler.py
@@ -204,7 +204,6 @@
     options.AppendExtraBrowserArgs(['--site-per-process'])
 
 
-@benchmark.Disabled('reference')  # crbug.com/523346
 class PageCyclerBasicOopif(_PageCycler):
   """ A benchmark measuring performance of the out-of-process iframes page
   set, without running in out-of-process iframes mode.. """
diff --git a/tools/perf/benchmarks/system_health.py b/tools/perf/benchmarks/system_health.py
index 687a8672..8a76a6f 100644
--- a/tools/perf/benchmarks/system_health.py
+++ b/tools/perf/benchmarks/system_health.py
@@ -88,4 +88,7 @@
 
   @classmethod
   def ShouldDisable(cls, possible_browser):
-    return possible_browser.platform.GetDeviceTypeName() == 'Desktop'
+    # http://crbug.com/612144 (reference on Nexus 5X).
+    return possible_browser.platform.GetDeviceTypeName() == 'Desktop' or (
+        possible_browser.browser_type == 'reference' and
+        possible_browser.platform.GetDeviceTypeName() == 'Nexus 5X')
diff --git a/tools/perf/page_sets/data/memory_system_health_desktop.json b/tools/perf/page_sets/data/memory_system_health_desktop.json
index e9f6166..18400562 100644
--- a/tools/perf/page_sets/data/memory_system_health_desktop.json
+++ b/tools/perf/page_sets/data/memory_system_health_desktop.json
@@ -11,7 +11,6 @@
             "load:tools:weather"
         ], 
         "memory_system_health_desktop_002.wpr": [
-            "load:news:engadget", 
             "load:news:cnn", 
             "load:news:reddit", 
             "load:news:qq", 
diff --git a/tools/perf/page_sets/data/memory_system_health_mobile.json b/tools/perf/page_sets/data/memory_system_health_mobile.json
index 6b28315..672952e 100644
--- a/tools/perf/page_sets/data/memory_system_health_mobile.json
+++ b/tools/perf/page_sets/data/memory_system_health_mobile.json
@@ -45,8 +45,7 @@
             "load:news:sohu", 
             "load:news:qq", 
             "load:news:bbc", 
-            "load:news:wikipedia", 
-            "load:news:engadget"
+            "load:news:wikipedia"
         ]
     }
 }
diff --git a/tools/perf/page_sets/data/tough_webgl_cases.json b/tools/perf/page_sets/data/tough_webgl_cases.json
index 7d75929..b1e273a 100644
--- a/tools/perf/page_sets/data/tough_webgl_cases.json
+++ b/tools/perf/page_sets/data/tough_webgl_cases.json
@@ -1,20 +1,20 @@
 {
     "description": "Describes the Web Page Replay archives for a story set. Don't edit by hand! Use record_wpr for updating.", 
     "archives": {
-        "tough_webgl_cases_004.wpr": [
-            "http://www.khronos.org/registry/webgl/sdk/demos/webkit/ManyPlanetsDeep.html", 
-            "http://www.khronos.org/registry/webgl/sdk/demos/google/san-angeles/index.html", 
-            "http://webglsamples.org/blob/blob.html", 
-            "http://webglsamples.org/dynamic-cubemap/dynamic-cubemap.html", 
-            "http://www.khronos.org/registry/webgl/sdk/demos/google/nvidia-vertex-buffer-object/index.html", 
-            "http://webglsamples.org/aquarium/aquarium.html", 
-            "http://www.khronos.org/registry/webgl/sdk/demos/google/particles/index.html", 
-            "http://kenrussell.github.io/webgl-animometer/Animometer/tests/3d/webgl.html", 
-            "http://www.khronos.org/registry/webgl/sdk/demos/webkit/Earth.html"
-        ], 
         "tough_webgl_cases_000.wpr": [
             "http://montagestudio.com/demos/eco-homes/", 
             "http://helloracer.com/racer-s/"
+        ], 
+        "tough_webgl_cases_005.wpr": [
+            "http://webglsamples.org/aquarium/aquarium.html", 
+            "http://webglsamples.org/blob/blob.html", 
+            "http://webglsamples.org/dynamic-cubemap/dynamic-cubemap.html", 
+            "http://www.khronos.org/registry/webgl/sdk/demos/webkit/ManyPlanetsDeep.html", 
+            "http://www.khronos.org/registry/webgl/sdk/demos/webkit/Earth.html", 
+            "http://kenrussell.github.io/webgl-animometer/Animometer/tests/3d/webgl.html", 
+            "http://www.khronos.org/registry/webgl/sdk/demos/google/nvidia-vertex-buffer-object/index.html", 
+            "http://www.khronos.org/registry/webgl/sdk/demos/google/particles/index.html", 
+            "http://www.khronos.org/registry/webgl/sdk/demos/google/san-angeles/index.html"
         ]
     }
-}
+}
\ No newline at end of file
diff --git a/tools/perf/page_sets/data/tough_webgl_cases_005.wpr.sha1 b/tools/perf/page_sets/data/tough_webgl_cases_005.wpr.sha1
new file mode 100644
index 0000000..4515361
--- /dev/null
+++ b/tools/perf/page_sets/data/tough_webgl_cases_005.wpr.sha1
@@ -0,0 +1 @@
+eba66e7f82928f87f36faab9547ba2ec89978463
\ No newline at end of file
diff --git a/tools/perf/page_sets/system_health_stories.py b/tools/perf/page_sets/system_health_stories.py
index 9b2ee7d..3a2a5de 100644
--- a/tools/perf/page_sets/system_health_stories.py
+++ b/tools/perf/page_sets/system_health_stories.py
@@ -190,10 +190,6 @@
         _PageSpec(
             name='wikipedia',
             url='https://en.wikipedia.org/wiki/Science'),
-        # Redirects to the "http://" version.
-        _PageSpec(
-            name='engadget',
-            url='https://www.engadget.com/uk/'),
     ],
 
     # Audio and video.
diff --git a/tools/roll_webrtc.py b/tools/roll_webrtc.py
index 5fb661c..4291c38 100755
--- a/tools/roll_webrtc.py
+++ b/tools/roll_webrtc.py
@@ -36,8 +36,6 @@
 # Use a shell for subcommands on Windows to get a PATH search.
 IS_WIN = sys.platform.startswith('win')
 WEBRTC_PATH = os.path.join('third_party', 'webrtc')
-LIBJINGLE_PATH = os.path.join('third_party', 'libjingle', 'source', 'talk')
-LIBJINGLE_README = os.path.join('third_party', 'libjingle', 'README.chromium')
 # Run these CQ trybots in addition to the default ones in infra/config/cq.cfg.
 EXTRA_TRYBOTS = ('tryserver.chromium.linux:linux_chromium_archive_rel_ng;'
                  'tryserver.chromium.mac:mac_chromium_archive_rel_ng')
@@ -155,37 +153,18 @@
     print '%s: %s' % (status, ','.join(sorted(name_list)))
 
 
-def _GenerateCLDescriptionCommand(webrtc_current, libjingle_current,
-                                  webrtc_new, libjingle_new):
-  delim = ''
-  webrtc_str = ''
+def _GenerateCLDescriptionCommand(webrtc_current, webrtc_new):
   def GetChangeLogURL(git_repo_url, current_hash, new_hash):
     return '%s/+log/%s..%s' % (git_repo_url, current_hash[0:7], new_hash[0:7])
 
-  if webrtc_current.git_commit != webrtc_new.git_commit:
-    webrtc_str = 'WebRTC %s:%s' % (webrtc_current.commit_position,
-                                   webrtc_new.commit_position)
-    webrtc_changelog_url = GetChangeLogURL(webrtc_current.git_repo_url,
-                                           webrtc_current.git_commit,
-                                           webrtc_new.git_commit)
+  webrtc_str = 'WebRTC %s:%s' % (webrtc_current.commit_position,
+                                 webrtc_new.commit_position)
+  webrtc_changelog_url = GetChangeLogURL(webrtc_current.git_repo_url,
+                                         webrtc_current.git_commit,
+                                         webrtc_new.git_commit)
 
-  libjingle_str = ''
-  if libjingle_current.git_commit != libjingle_new.git_commit:
-    if webrtc_str:
-      delim += ', '
-    libjingle_str = 'Libjingle %s:%s' % (libjingle_current.commit_position,
-                                         libjingle_new.commit_position)
-    libjingle_changelog_url = GetChangeLogURL(libjingle_current.git_repo_url,
-                                              libjingle_current.git_commit,
-                                              libjingle_new.git_commit)
-
-  description = [ '-m', 'Roll ' + webrtc_str + delim + libjingle_str ]
-  if webrtc_str:
-    description.extend(['-m', webrtc_str])
-    description.extend(['-m', 'Changes: %s' % webrtc_changelog_url])
-  if libjingle_str:
-    description.extend(['-m', libjingle_str])
-    description.extend(['-m', 'Changes: %s' % libjingle_changelog_url])
+  description = [ '-m', 'Roll ' + webrtc_str ]
+  description.extend(['-m', 'Changes: %s' % webrtc_changelog_url])
   description.extend(['-m', 'TBR='])
   description.extend(['-m', 'CQ_EXTRA_TRYBOTS=%s' % EXTRA_TRYBOTS])
   return description
@@ -303,26 +282,22 @@
     deps_filename = os.path.join(self._chromium_src, 'DEPS')
     deps = _ParseDepsFile(deps_filename)
     webrtc_current = self._GetDepsCommitInfo(deps, WEBRTC_PATH)
-    libjingle_current = self._GetDepsCommitInfo(deps, LIBJINGLE_PATH)
 
     # Find ToT revisions.
     webrtc_latest = self._GetCommitInfo(WEBRTC_PATH)
-    libjingle_latest = self._GetCommitInfo(LIBJINGLE_PATH)
 
     if IS_WIN:
       # Make sure the roll script doesn't use Windows line endings.
       self._RunCommand(['git', 'config', 'core.autocrlf', 'true'])
 
     self._UpdateDep(deps_filename, WEBRTC_PATH, webrtc_latest)
-    self._UpdateDep(deps_filename, LIBJINGLE_PATH, libjingle_latest)
 
     if self._IsTreeClean():
-      print 'The latest revision is already rolled for WebRTC and libjingle.'
+      print 'The latest revision is already rolled for WebRTC.'
       self._DeleteRollBranch()
     else:
-      self._UpdateReadmeFile(LIBJINGLE_README, libjingle_latest.commit_position)
       description = _GenerateCLDescriptionCommand(
-        webrtc_current, libjingle_current, webrtc_latest, libjingle_latest)
+        webrtc_current, webrtc_latest)
       logging.debug('Committing changes locally.')
       self._RunCommand(['git', 'add', '--update', '.'])
       self._RunCommand(['git', 'commit'] + description)
@@ -401,7 +376,7 @@
 
 def main():
   parser = argparse.ArgumentParser(
-      description='Find webrtc and libjingle revisions for roll.')
+      description='Find webrtc revisions for roll.')
   parser.add_argument('--abort',
     help=('Aborts a previously prepared roll. '
           'Closes any associated issues and deletes the roll branches'),
diff --git a/tools/valgrind/gtest_exclude/browser_tests.gtest-drmemory.txt b/tools/valgrind/gtest_exclude/browser_tests.gtest-drmemory.txt
index 7531724..3166fdcc 100644
--- a/tools/valgrind/gtest_exclude/browser_tests.gtest-drmemory.txt
+++ b/tools/valgrind/gtest_exclude/browser_tests.gtest-drmemory.txt
@@ -141,6 +141,7 @@
 ImageWriterPrivateApiTest.TestWriteFromFile
 InlineInstallPrivateApiTestApp*
 InstallGoodExtensionSettingsWebUITest.showOptions
+ManageProfileUITestAsync.CreateExistingSupervisedUser
 MaterialHistoryBrowserTest*
 MimeHandlerViewTest.Abort
 MimeHandlerViewTest.EmbeddedDataUrlObject
@@ -148,10 +149,12 @@
 PDFExtensionTest*
 PasswordsPrivateApiTest.RequestPlaintextPassword
 PolicyPref*
+PredictorBrowserTest*
 ProfileWindow*
 PushMessagingBrowserTest.SubscribeWithoutKeySuccessNotificationsGranted
 SubframeTaskBrowserTest.TaskManagerShowsSubframeTasks
 SyncSetupWebUITestAsync.RestoreSyncDataTypes
+WebRtcDisableEncryptionFlagBrowserTest.VerifyEncryption
 WebUIWebView*
 WebrtcEventLogApiTest*
 ZoomControllerBrowserTest.NavigationResetsManualMode
diff --git a/ui/android/java/strings/translations/android_ui_strings_sw.xtb b/ui/android/java/strings/translations/android_ui_strings_sw.xtb
index 96a80440..02ee3cba 100644
--- a/ui/android/java/strings/translations/android_ui_strings_sw.xtb
+++ b/ui/android/java/strings/translations/android_ui_strings_sw.xtb
@@ -34,7 +34,7 @@
 <translation id="7138678301420049075">Nyingine</translation>
 <translation id="7535087603100972091">Thamani</translation>
 <translation id="7569983096843329377">Nyeusi</translation>
-<translation id="7575803462290353686">Weka muda</translation>
+<translation id="7575803462290353686">Weka saa</translation>
 <translation id="7658239707568436148">Ghairi</translation>
 <translation id="7781164152564914424">Weka mwezi</translation>
 <translation id="7821540960913969614">Weka tarehe</translation>
diff --git a/ui/aura/BUILD.gn b/ui/aura/BUILD.gn
index 32e747d..99b3b1f 100644
--- a/ui/aura/BUILD.gn
+++ b/ui/aura/BUILD.gn
@@ -243,7 +243,7 @@
     "//ui/events",
     "//ui/gfx",
     "//ui/gfx/geometry",
-    "//ui/gl",
+    "//ui/gl/init",
   ]
 
   if (use_x11) {
diff --git a/ui/aura/aura.gyp b/ui/aura/aura.gyp
index 2372dca..5b15beed 100644
--- a/ui/aura/aura.gyp
+++ b/ui/aura/aura.gyp
@@ -261,6 +261,7 @@
         '../gfx/gfx.gyp:gfx',
         '../gfx/gfx.gyp:gfx_geometry',
         '../gl/gl.gyp:gl',
+        '../gl/init/gl_init.gyp:gl_init',
         'aura_test_support',
         'aura',
       ],
diff --git a/ui/aura/client/default_capture_client.cc b/ui/aura/client/default_capture_client.cc
index 2740c9f..b0719fc 100644
--- a/ui/aura/client/default_capture_client.cc
+++ b/ui/aura/client/default_capture_client.cc
@@ -11,6 +11,10 @@
 namespace aura {
 namespace client {
 
+// static
+// Track the active capture window across root windows.
+Window* global_capture_window_ = nullptr;
+
 DefaultCaptureClient::DefaultCaptureClient(Window* root_window)
     : root_window_(root_window),
       capture_window_(NULL) {
@@ -18,6 +22,8 @@
 }
 
 DefaultCaptureClient::~DefaultCaptureClient() {
+  if (global_capture_window_ == capture_window_)
+    global_capture_window_ = nullptr;
   SetCaptureClient(root_window_, NULL);
 }
 
@@ -29,6 +35,7 @@
 
   Window* old_capture_window = capture_window_;
   capture_window_ = window;
+  global_capture_window_ = window;
 
   CaptureDelegate* capture_delegate = root_window_->GetHost()->dispatcher();
   if (capture_window_)
@@ -50,7 +57,7 @@
 }
 
 Window* DefaultCaptureClient::GetGlobalCaptureWindow() {
-  return capture_window_;
+  return global_capture_window_;
 }
 
 }  // namespace client
diff --git a/ui/aura/demo/DEPS b/ui/aura/demo/DEPS
index 04a064d..305f5f6 100644
--- a/ui/aura/demo/DEPS
+++ b/ui/aura/demo/DEPS
@@ -1,4 +1,4 @@
 include_rules = [
   "+ui/display",          # Windows DPI Initialization.
-  "+ui/gl/gl_surface.h",  # To initialize GL bindings.
+  "+ui/gl/init/gl_factory.h",  # To initialize GL bindings.
 ]
diff --git a/ui/aura/demo/demo_main.cc b/ui/aura/demo/demo_main.cc
index 0c6867b..8f52346 100644
--- a/ui/aura/demo/demo_main.cc
+++ b/ui/aura/demo/demo_main.cc
@@ -29,7 +29,7 @@
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/skia_util.h"
-#include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 
 #if defined(USE_X11)
 #include "ui/gfx/x/x11_connection.h"  // nogncheck
@@ -130,7 +130,7 @@
   gfx::InitializeThreadedX11();
 #endif
 
-  gfx::GLSurface::InitializeOneOff();
+  gl::init::InitializeGLOneOff();
 
 #if defined(OS_WIN)
   display::win::SetDefaultDeviceScaleFactor(1.0f);
diff --git a/ui/base/material_design/material_design_controller.cc b/ui/base/material_design/material_design_controller.cc
index 86685cf..bf153e3 100644
--- a/ui/base/material_design/material_design_controller.cc
+++ b/ui/base/material_design/material_design_controller.cc
@@ -6,6 +6,7 @@
 
 #include "base/command_line.h"
 #include "base/logging.h"
+#include "base/metrics/field_trial.h"
 #include "base/trace_event/trace_event.h"
 #include "ui/base/material_design/material_design_controller.h"
 #include "ui/base/ui_base_switches.h"
@@ -26,8 +27,8 @@
 
 namespace ui {
 
+// static
 bool MaterialDesignController::is_mode_initialized_ = false;
-
 MaterialDesignController::Mode MaterialDesignController::mode_ =
     MaterialDesignController::NON_MATERIAL;
 
@@ -35,6 +36,11 @@
 
 // static
 void MaterialDesignController::Initialize() {
+  InitializeWithDefaultMode(DefaultMode());
+}
+
+// static
+void MaterialDesignController::InitializeWithDefaultMode(Mode mode) {
   TRACE_EVENT0("startup", "MaterialDesignController::InitializeMode");
   CHECK(!is_mode_initialized_);
 #if !defined(ENABLE_TOPCHROME_MD)
@@ -56,7 +62,22 @@
                  << "' for command line switch '" << switches::kTopChromeMD
                  << "'.";
     }
-    SetMode(DefaultMode());
+
+    // The field trial value, if any, overrides the provided default mode.
+    constexpr char kMaterialDesignModeFieldTrialName[] = "MaterialDesignMode";
+    constexpr char kNonMaterialGroupName[] = "NonMaterial";
+    constexpr char kMaterialNormalGroupName[] = "MaterialNormal";
+    constexpr char kMaterialHybridGroupName[] = "MaterialHybrid";
+    const std::string group =
+        base::FieldTrialList::FindFullName(kMaterialDesignModeFieldTrialName);
+    if (group == kNonMaterialGroupName)
+      mode = NON_MATERIAL;
+    else if (group == kMaterialNormalGroupName)
+      mode = MATERIAL_NORMAL;
+    else if (group == kMaterialHybridGroupName)
+      mode = MATERIAL_HYBRID;
+
+    SetMode(mode);
   }
 
   include_secondary_ui_ = base::CommandLine::ForCurrentProcess()->HasSwitch(
@@ -81,6 +102,17 @@
 }
 
 // static
+void MaterialDesignController::Uninitialize() {
+  is_mode_initialized_ = false;
+}
+
+// static
+void MaterialDesignController::SetMode(MaterialDesignController::Mode mode) {
+  mode_ = mode;
+  is_mode_initialized_ = true;
+}
+
+// static
 MaterialDesignController::Mode MaterialDesignController::DefaultMode() {
 #if defined(OS_CHROMEOS)
   // If a scan of available devices has already completed, use material-hybrid
@@ -113,22 +145,11 @@
   }
 #endif  // defined(USE_OZONE)
   return MATERIAL_NORMAL;
-#elif defined(OS_LINUX) || defined(OS_MACOSX)
+#elif defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN)
   return MATERIAL_NORMAL;
 #else
   return NON_MATERIAL;
 #endif  // defined(OS_CHROMEOS)
 }
 
-// static
-void MaterialDesignController::Uninitialize() {
-  is_mode_initialized_ = false;
-}
-
-// static
-void MaterialDesignController::SetMode(MaterialDesignController::Mode mode) {
-  mode_ = mode;
-  is_mode_initialized_ = true;
-}
-
 }  // namespace ui
diff --git a/ui/base/material_design/material_design_controller.h b/ui/base/material_design/material_design_controller.h
index 46363f7..d0765a5 100644
--- a/ui/base/material_design/material_design_controller.h
+++ b/ui/base/material_design/material_design_controller.h
@@ -31,6 +31,10 @@
   // Initializes |mode_|. Must be called before checking |mode_|.
   static void Initialize();
 
+  // Same as Initialize(), but uses |mode| (instead of DefaultMode()) as the
+  // default value if no command-line switch or field trial overrides it.
+  static void InitializeWithDefaultMode(Mode mode);
+
   // Get the current Mode that should be used by the system.
   static Mode GetMode();
 
@@ -41,9 +45,6 @@
   // should be extended to cover secondary UI.
   static bool IsSecondaryUiMaterial();
 
-  // Returns the per-platform default material design variant.
-  static Mode DefaultMode();
-
  private:
   friend class test::MaterialDesignControllerTestAPI;
 
@@ -58,10 +59,6 @@
   // etc.). For example, this controls use of MD inside bubbles and dialogs.
   static bool include_secondary_ui_;
 
-  // Declarations only. Do not allow construction of an object.
-  MaterialDesignController();
-  ~MaterialDesignController();
-
   // Resets the initialization state to uninitialized. To be used by tests to
   // allow calling Initialize() more than once.
   static void Uninitialize();
@@ -70,7 +67,10 @@
   // used by tests to directly set the mode.
   static void SetMode(Mode mode);
 
-  DISALLOW_COPY_AND_ASSIGN(MaterialDesignController);
+  // Returns the per-platform default material design variant.
+  static Mode DefaultMode();
+
+  DISALLOW_IMPLICIT_CONSTRUCTORS(MaterialDesignController);
 };
 
 }  // namespace ui
diff --git a/ui/base/material_design/material_design_controller_unittest.cc b/ui/base/material_design/material_design_controller_unittest.cc
index b86820d..dfea5ed1 100644
--- a/ui/base/material_design/material_design_controller_unittest.cc
+++ b/ui/base/material_design/material_design_controller_unittest.cc
@@ -24,7 +24,9 @@
   // testing::Test:
   void SetUp() override;
   void TearDown() override;
+
   void SetCommandLineSwitch(const std::string& value_string);
+  bool CurrentModeIsDefaultMode();
 
  private:
   DISALLOW_COPY_AND_ASSIGN(MaterialDesignControllerTest);
@@ -54,6 +56,11 @@
 #endif  // defined(ENABLE_TOPCHROME_MD)
 }
 
+bool MaterialDesignControllerTest::CurrentModeIsDefaultMode() {
+  return MaterialDesignController::GetMode() ==
+      test::MaterialDesignControllerTestAPI::DefaultMode();
+}
+
 class MaterialDesignControllerTestMaterial :
     public MaterialDesignControllerTest {
  public:
@@ -132,8 +139,7 @@
 TEST_F(
     MaterialDesignControllerTestDefault,
     DisabledCommandLineValueMapsToNonMaterialModeWhenCompileTimeFlagEnabled) {
-  EXPECT_EQ(MaterialDesignController::DefaultMode(),
-            MaterialDesignController::GetMode());
+  EXPECT_TRUE(CurrentModeIsDefaultMode());
 }
 
 // Verify the current mode is reported as the default mode when no command line
@@ -142,14 +148,12 @@
        NoCommandLineValueMapsToNonMaterialModeWhenCompileTimeFlagEnabled) {
   ASSERT_FALSE(base::CommandLine::ForCurrentProcess()->HasSwitch(
       switches::kTopChromeMD));
-  EXPECT_EQ(MaterialDesignController::DefaultMode(),
-            MaterialDesignController::GetMode());
+  EXPECT_TRUE(CurrentModeIsDefaultMode());
 }
 
 // Verify an invalid command line value uses the default mode.
 TEST_F(MaterialDesignControllerTestInvalid, InvalidCommandLineValue) {
-  EXPECT_EQ(MaterialDesignController::DefaultMode(),
-            MaterialDesignController::GetMode());
+  EXPECT_TRUE(CurrentModeIsDefaultMode());
 }
 
 // Verify that MaterialDesignController::IsModeMaterial() will be true when
diff --git a/ui/base/resource/resource_bundle.cc b/ui/base/resource/resource_bundle.cc
index 0f95c9e..1dc1acd 100644
--- a/ui/base/resource/resource_bundle.cc
+++ b/ui/base/resource/resource_bundle.cc
@@ -57,6 +57,8 @@
 #include "ui/display/win/dpi.h"
 #endif
 
+// Helpers --------------------------------------------------------------------
+
 namespace ui {
 
 namespace {
@@ -114,6 +116,29 @@
 
 }  // namespace
 
+
+// ResourceBundle::TemporaryLoader --------------------------------------------
+
+ResourceBundle::TemporaryLoader::TemporaryLoader()
+    : already_loaded_(ResourceBundle::HasSharedInstance()) {
+  if (!already_loaded_) {
+    std::string locale = l10n_util::GetApplicationLocale(std::string());
+    const char kUserDataDirDialogFallbackLocale[] = "en-US";
+    if (locale.empty())
+      locale = kUserDataDirDialogFallbackLocale;
+    ui::ResourceBundle::InitSharedInstanceWithLocale(
+        locale, nullptr, ui::ResourceBundle::DO_NOT_LOAD_COMMON_RESOURCES);
+  }
+}
+
+ResourceBundle::TemporaryLoader::~TemporaryLoader() {
+  if (!already_loaded_)
+    ResourceBundle::CleanupSharedInstance();
+}
+
+
+// ResourceBundle::ResourceBundleImageSource ----------------------------------
+
 // An ImageSkiaSource that loads bitmaps for the requested scale factor from
 // ResourceBundle on demand for a given |resource_id|. If the bitmap for the
 // requested scale factor does not exist, it will return the 1x bitmap scaled
@@ -171,6 +196,9 @@
   DISALLOW_COPY_AND_ASSIGN(ResourceBundleImageSource);
 };
 
+
+// ResourceBundle -------------------------------------------------------------
+
 // static
 std::string ResourceBundle::InitSharedInstanceWithLocale(
     const std::string& pref_locale,
diff --git a/ui/base/resource/resource_bundle.h b/ui/base/resource/resource_bundle.h
index df812b1..b2ac9d2b 100644
--- a/ui/base/resource/resource_bundle.h
+++ b/ui/base/resource/resource_bundle.h
@@ -116,6 +116,29 @@
     virtual ~Delegate() {}
   };
 
+  // A class which is designed to be instantiated on the stack during early
+  // startup code that needs access to string resources before the
+  // ResourceBundle may be loaded.
+  //
+  // This incurs a performance hit, so this should only be used in exceptional
+  // circumstances.  Most uses of resources should wait until after the
+  // ResourceBundle has been loaded properly.
+  class UI_BASE_EXPORT TemporaryLoader {
+   public:
+    TemporaryLoader();
+    ~TemporaryLoader();
+
+   private:
+    // Mac loads resources earlier than other platforms and thus may have
+    // already initialized the resource bundle when we're constructed.  Instead
+    // of trying to ifdef Mac or otherwise define exactly when we should and
+    // shouldn't load, we just set this based on whether the shared instance
+    // exists and then do nothing if it's set.
+    bool already_loaded_;
+
+    DISALLOW_COPY_AND_ASSIGN(TemporaryLoader);
+  };
+
   // Initialize the ResourceBundle for this process. Does not take ownership of
   // the |delegate| value. Returns the language selected.
   // NOTE: Mac ignores this and always loads up resources for the language
diff --git a/ui/base/test/material_design_controller_test_api.cc b/ui/base/test/material_design_controller_test_api.cc
index 029af51..edfcea3f 100644
--- a/ui/base/test/material_design_controller_test_api.cc
+++ b/ui/base/test/material_design_controller_test_api.cc
@@ -19,9 +19,15 @@
   MaterialDesignController::mode_ = previous_mode_;
 }
 
+// static
 void MaterialDesignControllerTestAPI::Uninitialize() {
   MaterialDesignController::Uninitialize();
 }
 
+// static
+MaterialDesignController::Mode MaterialDesignControllerTestAPI::DefaultMode() {
+  return MaterialDesignController::DefaultMode();
+}
+
 }  // namespace test
 }  // namespace ui
diff --git a/ui/base/test/material_design_controller_test_api.h b/ui/base/test/material_design_controller_test_api.h
index 3eb53a3..0c2cce51 100644
--- a/ui/base/test/material_design_controller_test_api.h
+++ b/ui/base/test/material_design_controller_test_api.h
@@ -21,6 +21,7 @@
 
   // Wrapper functions for MaterialDesignController internal functions.
   static void Uninitialize();
+  static MaterialDesignController::Mode DefaultMode();
 
  private:
   const MaterialDesignController::Mode previous_mode_;
diff --git a/ui/compositor/layer.cc b/ui/compositor/layer.cc
index eb03c43..f8fe810 100644
--- a/ui/compositor/layer.cc
+++ b/ui/compositor/layer.cc
@@ -631,9 +631,9 @@
   nine_patch_layer_->SetAperture(aperture_in_pixel);
 }
 
-void Layer::UpdateNinePatchOcclusion(const gfx::Rect& occlusion) {
+void Layer::UpdateNinePatchLayerBorder(const gfx::Rect& border) {
   DCHECK(type_ == LAYER_NINE_PATCH && nine_patch_layer_.get());
-  nine_patch_layer_->SetLayerOcclusion(occlusion);
+  nine_patch_layer_->SetBorder(border);
 }
 
 void Layer::SetColor(SkColor color) { GetAnimator()->SetColor(color); }
@@ -815,7 +815,6 @@
       above ?
       (child_i < other_i ? other_i : other_i + 1) :
       (child_i < other_i ? other_i - 1 : other_i);
-
   children_.erase(children_.begin() + child_i);
   children_.insert(children_.begin() + dest_i, child);
 
diff --git a/ui/compositor/layer.h b/ui/compositor/layer.h
index 8b90283..9f1cf56 100644
--- a/ui/compositor/layer.h
+++ b/ui/compositor/layer.h
@@ -314,9 +314,7 @@
   // called for LAYER_NINE_PATCH.
   void UpdateNinePatchLayerImage(const gfx::ImageSkia& image);
   void UpdateNinePatchLayerAperture(const gfx::Rect& aperture_in_dip);
-  // Updates the area completely occluded by another layer, this can be an
-  // empty rectangle if nothing is occluded.
-  void UpdateNinePatchOcclusion(const gfx::Rect& occlusion);
+  void UpdateNinePatchLayerBorder(const gfx::Rect& border);
 
   // Adds |invalid_rect| to the Layer's pending invalid rect and calls
   // ScheduleDraw(). Returns false if the paint request is ignored.
diff --git a/ui/gfx/color_utils.cc b/ui/gfx/color_utils.cc
index a4618f2..d64a8b3 100644
--- a/ui/gfx/color_utils.cc
+++ b/ui/gfx/color_utils.cc
@@ -328,15 +328,15 @@
 #endif  // !defined(OS_WIN)
 
 SkColor DeriveDefaultIconColor(SkColor text_color) {
-  // This function works similarly to BlendTowardOppositeLuminance, but uses a
-  // different blend value for lightening and darkening.
+  // Lighten a dark color but leave it fully opaque.
   if (IsDark(text_color)) {
     // For black text, this comes out to kChromeIconGrey.
     return color_utils::AlphaBlend(SK_ColorWHITE, text_color,
                                    SkColorGetR(gfx::kChromeIconGrey));
   }
-  // The dimming is less dramatic when darkening a light color.
-  return color_utils::AlphaBlend(SK_ColorBLACK, text_color, 0x33);
+  // For a light color, just reduce opacity.
+  return SkColorSetA(text_color,
+                     static_cast<int>(0.8f * SkColorGetA(text_color)));
 }
 
 }  // namespace color_utils
diff --git a/ui/gl/BUILD.gn b/ui/gl/BUILD.gn
index 876f5c2..304f046 100644
--- a/ui/gl/BUILD.gn
+++ b/ui/gl/BUILD.gn
@@ -322,6 +322,7 @@
 
   public_deps = [
     ":gl",
+    "//ui/gl/init",
   ]
   deps = [
     "//testing/gtest",
@@ -374,6 +375,7 @@
     "//testing/gtest",
     "//ui/gfx",
     "//ui/gfx/geometry",
+    "//ui/gl/init",
   ]
 
   data_deps = [
diff --git a/ui/gl/generate_bindings.py b/ui/gl/generate_bindings.py
index 1b28d2a..8771d1e 100755
--- a/ui/gl/generate_bindings.py
+++ b/ui/gl/generate_bindings.py
@@ -1905,8 +1905,8 @@
   file.write(LICENSE_AND_HEADER +
 """
 
-#ifndef UI_GFX_GL_GL_BINDINGS_AUTOGEN_%(name)s_H_
-#define UI_GFX_GL_GL_BINDINGS_AUTOGEN_%(name)s_H_
+#ifndef UI_GL_GL_BINDINGS_AUTOGEN_%(name)s_H_
+#define UI_GL_GL_BINDINGS_AUTOGEN_%(name)s_H_
 
 namespace gfx {
 
@@ -1962,7 +1962,7 @@
         (func['known_as'], set_name.lower(), func['known_as']))
 
   file.write('\n')
-  file.write('#endif  //  UI_GFX_GL_GL_BINDINGS_AUTOGEN_%s_H_\n' %
+  file.write('#endif  //  UI_GL_GL_BINDINGS_AUTOGEN_%s_H_\n' %
       set_name.upper())
 
 
diff --git a/ui/gl/gl.gyp b/ui/gl/gl.gyp
index 2b84ea2..7fa43f5 100644
--- a/ui/gl/gl.gyp
+++ b/ui/gl/gl.gyp
@@ -311,6 +311,7 @@
         '../../testing/gmock.gyp:gmock',
         '../../third_party/khronos/khronos.gyp:khronos_headers',
         'gl',
+        'init/gl_init.gyp:gl_init',
       ],
       'include_dirs': [
         '../..',
@@ -332,6 +333,7 @@
         '<(DEPTH)/testing/gtest.gyp:gtest',
         '../../third_party/khronos/khronos.gyp:khronos_headers',
         'gl',
+        'init/gl_init.gyp:gl_init',
       ],
       'include_dirs': [
         '../..',
diff --git a/ui/gl/gl_bindings_autogen_egl.h b/ui/gl/gl_bindings_autogen_egl.h
index 54d1269..b321192 100644
--- a/ui/gl/gl_bindings_autogen_egl.h
+++ b/ui/gl/gl_bindings_autogen_egl.h
@@ -8,8 +8,8 @@
 //    clang-format -i -style=chromium filename
 // DO NOT EDIT!
 
-#ifndef UI_GFX_GL_GL_BINDINGS_AUTOGEN_EGL_H_
-#define UI_GFX_GL_GL_BINDINGS_AUTOGEN_EGL_H_
+#ifndef UI_GL_GL_BINDINGS_AUTOGEN_EGL_H_
+#define UI_GL_GL_BINDINGS_AUTOGEN_EGL_H_
 
 namespace gfx {
 
@@ -522,4 +522,4 @@
 #define eglWaitNative ::gfx::g_current_egl_context->eglWaitNativeFn
 #define eglWaitSyncKHR ::gfx::g_current_egl_context->eglWaitSyncKHRFn
 
-#endif  //  UI_GFX_GL_GL_BINDINGS_AUTOGEN_EGL_H_
+#endif  //  UI_GL_GL_BINDINGS_AUTOGEN_EGL_H_
diff --git a/ui/gl/gl_bindings_autogen_gl.h b/ui/gl/gl_bindings_autogen_gl.h
index 7019e7d..73ff63b 100644
--- a/ui/gl/gl_bindings_autogen_gl.h
+++ b/ui/gl/gl_bindings_autogen_gl.h
@@ -8,8 +8,8 @@
 //    clang-format -i -style=chromium filename
 // DO NOT EDIT!
 
-#ifndef UI_GFX_GL_GL_BINDINGS_AUTOGEN_GL_H_
-#define UI_GFX_GL_GL_BINDINGS_AUTOGEN_GL_H_
+#ifndef UI_GL_GL_BINDINGS_AUTOGEN_GL_H_
+#define UI_GL_GL_BINDINGS_AUTOGEN_GL_H_
 
 namespace gfx {
 
@@ -2745,4 +2745,4 @@
 #define glViewport ::gfx::g_current_gl_context->glViewportFn
 #define glWaitSync ::gfx::g_current_gl_context->glWaitSyncFn
 
-#endif  //  UI_GFX_GL_GL_BINDINGS_AUTOGEN_GL_H_
+#endif  //  UI_GL_GL_BINDINGS_AUTOGEN_GL_H_
diff --git a/ui/gl/gl_bindings_autogen_glx.h b/ui/gl/gl_bindings_autogen_glx.h
index fe2ae41..f9675b2 100644
--- a/ui/gl/gl_bindings_autogen_glx.h
+++ b/ui/gl/gl_bindings_autogen_glx.h
@@ -8,8 +8,8 @@
 //    clang-format -i -style=chromium filename
 // DO NOT EDIT!
 
-#ifndef UI_GFX_GL_GL_BINDINGS_AUTOGEN_GLX_H_
-#define UI_GFX_GL_GL_BINDINGS_AUTOGEN_GLX_H_
+#ifndef UI_GL_GL_BINDINGS_AUTOGEN_GLX_H_
+#define UI_GL_GL_BINDINGS_AUTOGEN_GLX_H_
 
 namespace gfx {
 
@@ -421,4 +421,4 @@
 #define glXWaitVideoSyncSGI ::gfx::g_current_glx_context->glXWaitVideoSyncSGIFn
 #define glXWaitX ::gfx::g_current_glx_context->glXWaitXFn
 
-#endif  //  UI_GFX_GL_GL_BINDINGS_AUTOGEN_GLX_H_
+#endif  //  UI_GL_GL_BINDINGS_AUTOGEN_GLX_H_
diff --git a/ui/gl/gl_bindings_autogen_osmesa.h b/ui/gl/gl_bindings_autogen_osmesa.h
index 8a6bb66..9b88f6b 100644
--- a/ui/gl/gl_bindings_autogen_osmesa.h
+++ b/ui/gl/gl_bindings_autogen_osmesa.h
@@ -8,8 +8,8 @@
 //    clang-format -i -style=chromium filename
 // DO NOT EDIT!
 
-#ifndef UI_GFX_GL_GL_BINDINGS_AUTOGEN_OSMESA_H_
-#define UI_GFX_GL_GL_BINDINGS_AUTOGEN_OSMESA_H_
+#ifndef UI_GL_GL_BINDINGS_AUTOGEN_OSMESA_H_
+#define UI_GL_GL_BINDINGS_AUTOGEN_OSMESA_H_
 
 namespace gfx {
 
@@ -120,4 +120,4 @@
 #define OSMesaMakeCurrent ::gfx::g_current_osmesa_context->OSMesaMakeCurrentFn
 #define OSMesaPixelStore ::gfx::g_current_osmesa_context->OSMesaPixelStoreFn
 
-#endif  //  UI_GFX_GL_GL_BINDINGS_AUTOGEN_OSMESA_H_
+#endif  //  UI_GL_GL_BINDINGS_AUTOGEN_OSMESA_H_
diff --git a/ui/gl/gl_bindings_autogen_wgl.h b/ui/gl/gl_bindings_autogen_wgl.h
index b7a2040..02d2fe9 100644
--- a/ui/gl/gl_bindings_autogen_wgl.h
+++ b/ui/gl/gl_bindings_autogen_wgl.h
@@ -8,8 +8,8 @@
 //    clang-format -i -style=chromium filename
 // DO NOT EDIT!
 
-#ifndef UI_GFX_GL_GL_BINDINGS_AUTOGEN_WGL_H_
-#define UI_GFX_GL_GL_BINDINGS_AUTOGEN_WGL_H_
+#ifndef UI_GL_GL_BINDINGS_AUTOGEN_WGL_H_
+#define UI_GL_GL_BINDINGS_AUTOGEN_WGL_H_
 
 namespace gfx {
 
@@ -144,4 +144,4 @@
 #define wglSwapIntervalEXT ::gfx::g_current_wgl_context->wglSwapIntervalEXTFn
 #define wglSwapLayerBuffers ::gfx::g_current_wgl_context->wglSwapLayerBuffersFn
 
-#endif  //  UI_GFX_GL_GL_BINDINGS_AUTOGEN_WGL_H_
+#endif  //  UI_GL_GL_BINDINGS_AUTOGEN_WGL_H_
diff --git a/ui/gl/gl_context.h b/ui/gl/gl_context.h
index 6d1420ded4..368b0ec9 100644
--- a/ui/gl/gl_context.h
+++ b/ui/gl/gl_context.h
@@ -13,6 +13,7 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/synchronization/cancellation_flag.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_share_group.h"
 #include "ui/gl/gl_state_restorer.h"
 #include "ui/gl/gpu_preference.h"
@@ -102,6 +103,7 @@
   // Create a GL context that is compatible with the given surface.
   // |share_group|, if non-NULL, is a group of contexts which the
   // internally created OpenGL context shares textures and other resources.
+  // DEPRECATED(kylechar): Use gl::init::CreateGLContext from gl_factory.h.
   static scoped_refptr<GLContext> CreateGLContext(
       GLShareGroup* share_group,
       GLSurface* compatible_surface,
diff --git a/ui/gl/gl_context_osmesa.h b/ui/gl/gl_context_osmesa.h
index d5612d6..25fa560 100644
--- a/ui/gl/gl_context_osmesa.h
+++ b/ui/gl/gl_context_osmesa.h
@@ -8,6 +8,7 @@
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "ui/gl/gl_context.h"
+#include "ui/gl/gl_export.h"
 
 typedef struct osmesa_context* OSMesaContext;
 
@@ -17,7 +18,7 @@
 class GLSurface;
 
 // Encapsulates an OSMesa OpenGL context that uses software rendering.
-class GLContextOSMesa : public GLContextReal {
+class GL_EXPORT GLContextOSMesa : public GLContextReal {
  public:
   explicit GLContextOSMesa(GLShareGroup* share_group);
 
diff --git a/ui/gl/gl_context_stub.h b/ui/gl/gl_context_stub.h
index 58854c8..ecee830 100644
--- a/ui/gl/gl_context_stub.h
+++ b/ui/gl/gl_context_stub.h
@@ -7,6 +7,7 @@
 
 #include "base/macros.h"
 #include "ui/gl/gl_context.h"
+#include "ui/gl/gl_export.h"
 
 namespace gfx {
 
diff --git a/ui/gl/gl_context_stub_with_extensions.h b/ui/gl/gl_context_stub_with_extensions.h
index 1bc1b3f..175dde9 100644
--- a/ui/gl/gl_context_stub_with_extensions.h
+++ b/ui/gl/gl_context_stub_with_extensions.h
@@ -7,6 +7,7 @@
 
 #include "base/macros.h"
 #include "ui/gl/gl_context_stub.h"
+#include "ui/gl/gl_export.h"
 
 namespace gfx {
 
diff --git a/ui/gl/gl_egl_api_implementation.h b/ui/gl/gl_egl_api_implementation.h
index d09255f0..7047625 100644
--- a/ui/gl/gl_egl_api_implementation.h
+++ b/ui/gl/gl_egl_api_implementation.h
@@ -9,7 +9,7 @@
 #include <vector>
 
 #include "base/compiler_specific.h"
-#include "gl_bindings.h"
+#include "ui/gl/gl_bindings.h"
 #include "ui/gl/gl_export.h"
 
 namespace base {
diff --git a/ui/gl/gl_fence_apple.h b/ui/gl/gl_fence_apple.h
index 5458e0d1..c307a20b 100644
--- a/ui/gl/gl_fence_apple.h
+++ b/ui/gl/gl_fence_apple.h
@@ -7,6 +7,7 @@
 
 #include "base/macros.h"
 #include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_fence.h"
 
 namespace gfx {
diff --git a/ui/gl/gl_fence_arb.h b/ui/gl/gl_fence_arb.h
index 3975efe..e01b0cd 100644
--- a/ui/gl/gl_fence_arb.h
+++ b/ui/gl/gl_fence_arb.h
@@ -7,6 +7,7 @@
 
 #include "base/macros.h"
 #include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_fence.h"
 
 namespace gfx {
diff --git a/ui/gl/gl_fence_egl.h b/ui/gl/gl_fence_egl.h
index 5b6006c..5f68c8c1 100644
--- a/ui/gl/gl_fence_egl.h
+++ b/ui/gl/gl_fence_egl.h
@@ -7,6 +7,7 @@
 
 #include "base/macros.h"
 #include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_fence.h"
 
 namespace gfx {
diff --git a/ui/gl/gl_fence_nv.h b/ui/gl/gl_fence_nv.h
index 488251b..bf07616 100644
--- a/ui/gl/gl_fence_nv.h
+++ b/ui/gl/gl_fence_nv.h
@@ -7,6 +7,7 @@
 
 #include "base/macros.h"
 #include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_fence.h"
 
 namespace gfx {
diff --git a/ui/gl/gl_image_egl.h b/ui/gl/gl_image_egl.h
index b613182..33f4de8 100644
--- a/ui/gl/gl_image_egl.h
+++ b/ui/gl/gl_image_egl.h
@@ -8,6 +8,7 @@
 #include "base/macros.h"
 #include "base/threading/thread_checker.h"
 #include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_image.h"
 
 namespace gl {
diff --git a/ui/gl/gl_image_io_surface.h b/ui/gl/gl_image_io_surface.h
index f62d4a21..5774e12 100644
--- a/ui/gl/gl_image_io_surface.h
+++ b/ui/gl/gl_image_io_surface.h
@@ -14,6 +14,7 @@
 #include "base/threading/thread_checker.h"
 #include "ui/gfx/buffer_types.h"
 #include "ui/gfx/generic_shared_memory_id.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_image.h"
 
 #if defined(__OBJC__)
diff --git a/ui/gl/gl_image_memory.h b/ui/gl/gl_image_memory.h
index 4f6db9a2..6fd87b3 100644
--- a/ui/gl/gl_image_memory.h
+++ b/ui/gl/gl_image_memory.h
@@ -12,6 +12,7 @@
 #include "base/macros.h"
 #include "base/numerics/safe_math.h"
 #include "ui/gfx/buffer_types.h"
+#include "ui/gl/gl_export.h"
 
 namespace gl {
 
diff --git a/ui/gl/gl_image_ozone_native_pixmap.h b/ui/gl/gl_image_ozone_native_pixmap.h
index 469c044..8a35750 100644
--- a/ui/gl/gl_image_ozone_native_pixmap.h
+++ b/ui/gl/gl_image_ozone_native_pixmap.h
@@ -8,6 +8,7 @@
 #include <stdint.h>
 
 #include "ui/gfx/buffer_types.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_image_egl.h"
 #include "ui/ozone/public/native_pixmap.h"
 
diff --git a/ui/gl/gl_image_ref_counted_memory.h b/ui/gl/gl_image_ref_counted_memory.h
index 0d73dcd..4c46372 100644
--- a/ui/gl/gl_image_ref_counted_memory.h
+++ b/ui/gl/gl_image_ref_counted_memory.h
@@ -9,6 +9,7 @@
 
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_image_memory.h"
 
 namespace base {
diff --git a/ui/gl/gl_image_shared_memory.h b/ui/gl/gl_image_shared_memory.h
index b1f5f994..40cdfb3 100644
--- a/ui/gl/gl_image_shared_memory.h
+++ b/ui/gl/gl_image_shared_memory.h
@@ -13,6 +13,7 @@
 #include "base/macros.h"
 #include "base/memory/shared_memory_handle.h"
 #include "ui/gfx/generic_shared_memory_id.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_image_memory.h"
 
 namespace base {
diff --git a/ui/gl/gl_image_stub.h b/ui/gl/gl_image_stub.h
index 8edadb6..406dfa23f 100644
--- a/ui/gl/gl_image_stub.h
+++ b/ui/gl/gl_image_stub.h
@@ -7,6 +7,7 @@
 
 #include <stdint.h>
 
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_image.h"
 
 namespace gl {
diff --git a/ui/gl/gl_image_surface_texture.h b/ui/gl/gl_image_surface_texture.h
index c58ec8c7..52f575a 100644
--- a/ui/gl/gl_image_surface_texture.h
+++ b/ui/gl/gl_image_surface_texture.h
@@ -11,6 +11,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/threading/thread_checker.h"
 #include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_image.h"
 
 namespace gfx {
diff --git a/ui/gl/gl_surface.h b/ui/gl/gl_surface.h
index e72ec11..6a2a7324 100644
--- a/ui/gl/gl_surface.h
+++ b/ui/gl/gl_surface.h
@@ -129,6 +129,7 @@
   virtual void CommitOverlayPlanesAsync(const SwapCompletionCallback& callback);
 
   // Initialize GL bindings.
+  // DEPRECATED(kylechar): Use gl::init::InitializeGLOneOff from gl_factory.h.
   static bool InitializeOneOff();
 
   // Called after a context is made current with this surface. Returns false
@@ -197,6 +198,7 @@
   virtual bool BuffersFlipped() const;
 
   // Create a GL surface that renders directly to a view.
+  // DEPRECATED(kylechar): Use gl::init::CreateViewGLSurface from gl_factory.h.
   static scoped_refptr<GLSurface> CreateViewGLSurface(
       gfx::AcceleratedWidget window);
 
@@ -205,11 +207,15 @@
   // semantics - there is no default framebuffer and the primary surface must
   // be presented as an overlay. If surfaceless mode is not supported or
   // enabled it will return a null pointer.
+  // DEPRECATED(kylechar): Use gl::init::CreateSurfacelessViewGLSurface from
+  // gl_factory.h.
   static scoped_refptr<GLSurface> CreateSurfacelessViewGLSurface(
       gfx::AcceleratedWidget window);
 #endif  // defined(USE_OZONE)
 
   // Create a GL surface used for offscreen rendering.
+  // DEPRECATED(kylechar): Use gl::init::CreateOffscreenGLSurface from
+  // gl_factory.h.
   static scoped_refptr<GLSurface> CreateOffscreenGLSurface(
       const gfx::Size& size);
 
diff --git a/ui/gl/gl_surface_egl.h b/ui/gl/gl_surface_egl.h
index 373c655..4be8b2a 100644
--- a/ui/gl/gl_surface_egl.h
+++ b/ui/gl/gl_surface_egl.h
@@ -20,6 +20,7 @@
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/vsync_provider.h"
 #include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_surface.h"
 #include "ui/gl/gl_surface_overlay.h"
 
diff --git a/ui/gl/gl_surface_egl_x11.h b/ui/gl/gl_surface_egl_x11.h
index 67c151eb..b7f0f3a 100644
--- a/ui/gl/gl_surface_egl_x11.h
+++ b/ui/gl/gl_surface_egl_x11.h
@@ -11,6 +11,7 @@
 
 #include "base/macros.h"
 #include "ui/events/platform/platform_event_dispatcher.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_surface_egl.h"
 
 namespace gfx {
diff --git a/ui/gl/gl_surface_mac.cc b/ui/gl/gl_surface_mac.cc
index 2da2b72..52179c3 100644
--- a/ui/gl/gl_surface_mac.cc
+++ b/ui/gl/gl_surface_mac.cc
@@ -13,6 +13,7 @@
 #include "base/trace_event/trace_event.h"
 #include "ui/gl/gl_bindings.h"
 #include "ui/gl/gl_context.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_implementation.h"
 #include "ui/gl/gl_surface_osmesa.h"
 #include "ui/gl/gl_surface_stub.h"
diff --git a/ui/gl/gl_surface_osmesa.h b/ui/gl/gl_surface_osmesa.h
index e4f6ba9..dee15eb 100644
--- a/ui/gl/gl_surface_osmesa.h
+++ b/ui/gl/gl_surface_osmesa.h
@@ -11,6 +11,7 @@
 
 #include "base/macros.h"
 #include "ui/gfx/geometry/size.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_surface.h"
 
 namespace gfx {
diff --git a/ui/gl/gl_surface_ozone.cc b/ui/gl/gl_surface_ozone.cc
index d4d2fe1..7125031e 100644
--- a/ui/gl/gl_surface_ozone.cc
+++ b/ui/gl/gl_surface_ozone.cc
@@ -733,8 +733,8 @@
       return nullptr;
     return surface;
   }
-  DCHECK(GetGLImplementation() == kGLImplementationEGLGLES2);
-  if (window != kNullAcceleratedWidget) {
+  if ((window != kNullAcceleratedWidget) &&
+      (GetGLImplementation() == kGLImplementationEGLGLES2)) {
     scoped_refptr<GLSurface> surface;
     if (GLSurfaceEGL::IsEGLSurfacelessContextSupported())
       surface = CreateViewGLSurfaceOzoneSurfacelessSurfaceImpl(window);
@@ -742,6 +742,7 @@
       surface = CreateViewGLSurfaceOzone(window);
     return surface;
   } else {
+    DCHECK_EQ(GetGLImplementation(), kGLImplementationMockGL);
     scoped_refptr<GLSurface> surface = new GLSurfaceStub();
     if (surface->Initialize())
       return surface;
diff --git a/ui/gl/gl_surface_stub.h b/ui/gl/gl_surface_stub.h
index 9115b7c1..13cfaf5 100644
--- a/ui/gl/gl_surface_stub.h
+++ b/ui/gl/gl_surface_stub.h
@@ -5,6 +5,7 @@
 #ifndef UI_GL_GL_SURFACE_STUB_H_
 #define UI_GL_GL_SURFACE_STUB_H_
 
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_surface.h"
 
 namespace gfx {
diff --git a/ui/gl/gl_surface_wgl.h b/ui/gl/gl_surface_wgl.h
index 7466bcb..dc323c1 100644
--- a/ui/gl/gl_surface_wgl.h
+++ b/ui/gl/gl_surface_wgl.h
@@ -7,6 +7,7 @@
 
 #include "base/macros.h"
 #include "ui/gfx/native_widget_types.h"
+#include "ui/gl/gl_export.h"
 #include "ui/gl/gl_surface.h"
 
 namespace gfx {
diff --git a/ui/gl/gl_tests.gyp b/ui/gl/gl_tests.gyp
index dfce746..a3cd88b0 100644
--- a/ui/gl/gl_tests.gyp
+++ b/ui/gl/gl_tests.gyp
@@ -29,6 +29,7 @@
         '<(DEPTH)/ui/gfx/gfx.gyp:gfx',
         '<(DEPTH)/ui/gfx/gfx.gyp:gfx_geometry',
         '<(DEPTH)/ui/gl/gl.gyp:gl',
+        '<(DEPTH)/ui/gl/init/gl_init.gyp:gl_init',
         '<(DEPTH)/ui/gl/gl.gyp:gl_test_support',
         '<(DEPTH)/ui/gl/gl.gyp:gl_unittest_utils',
       ],
diff --git a/ui/gl/init/BUILD.gn b/ui/gl/init/BUILD.gn
new file mode 100644
index 0000000..844ee29
--- /dev/null
+++ b/ui/gl/init/BUILD.gn
@@ -0,0 +1,23 @@
+# 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.
+
+component("init") {
+  output_name = "gl_init"
+
+  sources = [
+    "gl_factory.cc",
+    "gl_factory.h",
+    "gl_init_export.h",
+  ]
+  defines = [ "GL_INIT_IMPLEMENTATION" ]
+
+  deps = [
+    "//base",
+    "//ui/gfx",
+  ]
+
+  public_deps = [
+    "//ui/gl",
+  ]
+}
diff --git a/ui/gl/init/gl_factory.cc b/ui/gl/init/gl_factory.cc
new file mode 100644
index 0000000..09cb4ff
--- /dev/null
+++ b/ui/gl/init/gl_factory.cc
@@ -0,0 +1,49 @@
+// 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 "ui/gl/init/gl_factory.h"
+
+#include "ui/gl/gl_context.h"
+#include "ui/gl/gl_share_group.h"
+#include "ui/gl/gl_surface.h"
+
+namespace gl {
+namespace init {
+
+// TODO(kylechar): This file should be replaced with a platform specific
+// version for X11, Ozone, Windows, Mac and Android. The implementation of each
+// factory function should be moved into that file and the original static
+// methods should be removed from GLSurface and GLContext. This file can then
+// be deleted.
+
+bool InitializeGLOneOff() {
+  return gfx::GLSurface::InitializeOneOff();
+}
+
+scoped_refptr<gfx::GLContext> CreateGLContext(
+    gfx::GLShareGroup* share_group,
+    gfx::GLSurface* compatible_surface,
+    gfx::GpuPreference gpu_preference) {
+  return gfx::GLContext::CreateGLContext(share_group, compatible_surface,
+                                         gpu_preference);
+}
+
+scoped_refptr<gfx::GLSurface> CreateViewGLSurface(
+    gfx::AcceleratedWidget window) {
+  return gfx::GLSurface::CreateViewGLSurface(window);
+}
+
+#if defined(USE_OZONE)
+scoped_refptr<gfx::GLSurface> CreateSurfacelessViewGLSurface(
+    gfx::AcceleratedWidget window) {
+  return gfx::GLSurface::CreateSurfacelessViewGLSurface(window);
+}
+#endif  // defined(USE_OZONE)
+
+scoped_refptr<gfx::GLSurface> CreateOffscreenGLSurface(const gfx::Size& size) {
+  return gfx::GLSurface::CreateOffscreenGLSurface(size);
+}
+
+}  // namespace init
+}  // namespace gl
diff --git a/ui/gl/init/gl_factory.h b/ui/gl/init/gl_factory.h
new file mode 100644
index 0000000..bdf6e294
--- /dev/null
+++ b/ui/gl/init/gl_factory.h
@@ -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.
+
+#ifndef UI_GL_INIT_GL_FACTORY_H_
+#define UI_GL_INIT_GL_FACTORY_H_
+
+#include "base/memory/ref_counted.h"
+#include "ui/gfx/geometry/size.h"
+#include "ui/gfx/native_widget_types.h"
+#include "ui/gl/gpu_preference.h"
+#include "ui/gl/init/gl_init_export.h"
+
+namespace gfx {
+class GLContext;
+class GLShareGroup;
+class GLSurface;
+};
+
+namespace gl {
+namespace init {
+
+// Initialize GL bindings.
+GL_INIT_EXPORT bool InitializeGLOneOff();
+
+// Create a GL context that is compatible with the given surface. |share_group|,
+// if non-NULL, is a group of contexts which the internally created OpenGL
+// context shares textures and other resources.
+GL_INIT_EXPORT scoped_refptr<gfx::GLContext> CreateGLContext(
+    gfx::GLShareGroup* share_group,
+    gfx::GLSurface* compatible_surface,
+    gfx::GpuPreference gpu_preference);
+
+// Create a GL surface that renders directly to a view.
+GL_INIT_EXPORT scoped_refptr<gfx::GLSurface> CreateViewGLSurface(
+    gfx::AcceleratedWidget window);
+
+#if defined(USE_OZONE)
+// Create a GL surface that renders directly into a window with surfaceless
+// semantics - there is no default framebuffer and the primary surface must
+// be presented as an overlay. If surfaceless mode is not supported or
+// enabled it will return a null pointer.
+GL_INIT_EXPORT scoped_refptr<gfx::GLSurface> CreateSurfacelessViewGLSurface(
+    gfx::AcceleratedWidget window);
+#endif  // defined(USE_OZONE)
+
+// Create a GL surface used for offscreen rendering.
+GL_INIT_EXPORT scoped_refptr<gfx::GLSurface> CreateOffscreenGLSurface(
+    const gfx::Size& size);
+
+}  // namespace init
+}  // namespace gl
+
+#endif  // UI_GL_INIT_GL_FACTORY_H_
diff --git a/ui/gl/init/gl_init.gyp b/ui/gl/init/gl_init.gyp
new file mode 100644
index 0000000..ba65c01
--- /dev/null
+++ b/ui/gl/init/gl_init.gyp
@@ -0,0 +1,30 @@
+# 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.
+
+{
+  'variables': {
+    'chromium_code': 1,
+  },
+
+  'targets': [
+    {
+      'target_name': 'gl_init',
+      'type': '<(component)',
+      'dependencies': [
+        '../../../base/base.gyp:base',
+        '../../gfx/gfx.gyp:gfx',
+        '../../gfx/gfx.gyp:gfx_geometry',
+        '../gl.gyp:gl',
+      ],
+      'defines': [
+        'GL_INIT_IMPLEMENTATION',
+      ],
+      'sources': [
+        'gl_factory.cc',
+        'gl_factory.h',
+        'gl_init_export.h',
+      ],
+    },
+  ],
+}
diff --git a/ui/gl/init/gl_init_export.h b/ui/gl/init/gl_init_export.h
new file mode 100644
index 0000000..4523953
--- /dev/null
+++ b/ui/gl/init/gl_init_export.h
@@ -0,0 +1,29 @@
+// 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 UI_GL_INIT_GL_INIT_EXPORT_H_
+#define UI_GL_INIT_GL_INIT_EXPORT_H_
+
+#if defined(COMPONENT_BUILD)
+#if defined(WIN32)
+
+#if defined(GL_INIT_IMPLEMENTATION)
+#define GL_INIT_EXPORT __declspec(dllexport)
+#else
+#define GL_INIT_EXPORT __declspec(dllimport)
+#endif  // defined(GL_INIT_IMPLEMENTATION)
+
+#else  // defined(WIN32)
+#if defined(GL_INIT_IMPLEMENTATION)
+#define GL_INIT_EXPORT __attribute__((visibility("default")))
+#else
+#define GL_INIT_EXPORT
+#endif
+#endif
+
+#else  // defined(COMPONENT_BUILD)
+#define GL_INIT_EXPORT
+#endif
+
+#endif  // UI_GL_INIT_GL_INIT_EXPORT_H_
diff --git a/ui/gl/test/gl_image_test_template.h b/ui/gl/test/gl_image_test_template.h
index 4459200b..543df8d7 100644
--- a/ui/gl/test/gl_image_test_template.h
+++ b/ui/gl/test/gl_image_test_template.h
@@ -24,6 +24,7 @@
 #include "ui/gl/gl_image.h"
 #include "ui/gl/gl_implementation.h"
 #include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 #include "ui/gl/test/gl_image_test_support.h"
 #include "ui/gl/test/gl_test_helper.h"
 
@@ -125,9 +126,9 @@
   // Overridden from testing::Test:
   void SetUp() override {
     GLImageTestSupport::InitializeGL();
-    surface_ = gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size());
-    context_ = gfx::GLContext::CreateGLContext(nullptr, surface_.get(),
-                                               gfx::PreferIntegratedGpu);
+    surface_ = gl::init::CreateOffscreenGLSurface(gfx::Size());
+    context_ = gl::init::CreateGLContext(nullptr, surface_.get(),
+                                         gfx::PreferIntegratedGpu);
     context_->MakeCurrent(surface_.get());
   }
   void TearDown() override {
diff --git a/ui/message_center/OWNERS b/ui/message_center/OWNERS
index 43dfcc2..3dc6fc1 100644
--- a/ui/message_center/OWNERS
+++ b/ui/message_center/OWNERS
@@ -1,3 +1,4 @@
 dewittj@chromium.org
 mukai@chromium.org
 stevenjb@chromium.org
+yoshiki@chromium.org
diff --git a/ui/message_center/views/message_center_button_bar.cc b/ui/message_center/views/message_center_button_bar.cc
index 47613da..305aa04 100644
--- a/ui/message_center/views/message_center_button_bar.cc
+++ b/ui/message_center/views/message_center_button_bar.cc
@@ -255,9 +255,8 @@
 
 MessageCenterButtonBar::~MessageCenterButtonBar() {}
 
-void MessageCenterButtonBar::SetAllButtonsEnabled(bool enabled) {
-  if (close_all_button_)
-    close_all_button_->SetEnabled(enabled);
+void MessageCenterButtonBar::SetSettingsAndQuietModeButtonsEnabled(
+    bool enabled) {
   settings_button_->SetEnabled(enabled);
   quiet_mode_button_->SetEnabled(enabled);
 }
diff --git a/ui/message_center/views/message_center_button_bar.h b/ui/message_center/views/message_center_button_bar.h
index 3d74205..8dc07d6 100644
--- a/ui/message_center/views/message_center_button_bar.h
+++ b/ui/message_center/views/message_center_button_bar.h
@@ -39,7 +39,7 @@
 
   // Enables or disables all of the buttons in the center.  This is used to
   // prevent user clicks during the close-all animation.
-  virtual void SetAllButtonsEnabled(bool enabled);
+  void SetSettingsAndQuietModeButtonsEnabled(bool enabled);
 
   // Sometimes we shouldn't see the close-all button.
   void SetCloseAllButtonEnabled(bool enabled);
diff --git a/ui/message_center/views/message_center_view.cc b/ui/message_center/views/message_center_view.cc
index 47b7da85b..aa04936 100644
--- a/ui/message_center/views/message_center_view.cc
+++ b/ui/message_center/views/message_center_view.cc
@@ -43,11 +43,6 @@
 
 namespace {
 
-const SkColor kNoNotificationsTextColor = SkColorSetRGB(0xb4, 0xb4, 0xb4);
-#if defined(OS_LINUX) && defined(OS_CHROMEOS)
-const SkColor kTransparentColor = SkColorSetARGB(0, 0, 0, 0);
-#endif
-
 const int kDefaultAnimationDurationMs = 120;
 const int kDefaultFrameRateHz = 60;
 
@@ -59,52 +54,6 @@
 
 }  // namespace
 
-class NoNotificationMessageView : public views::View {
- public:
-  NoNotificationMessageView();
-  ~NoNotificationMessageView() override;
-
-  // Overridden from views::View.
-  gfx::Size GetPreferredSize() const override;
-  int GetHeightForWidth(int width) const override;
-  void Layout() override;
-
- private:
-  views::Label* label_;
-
-  DISALLOW_COPY_AND_ASSIGN(NoNotificationMessageView);
-};
-
-NoNotificationMessageView::NoNotificationMessageView() {
-  label_ = new views::Label(l10n_util::GetStringUTF16(
-      IDS_MESSAGE_CENTER_NO_MESSAGES));
-  label_->SetAutoColorReadabilityEnabled(false);
-  label_->SetEnabledColor(kNoNotificationsTextColor);
-  // Set transparent background to ensure that subpixel rendering
-  // is disabled. See crbug.com/169056
-#if defined(OS_LINUX) && defined(OS_CHROMEOS)
-  label_->SetBackgroundColor(kTransparentColor);
-#endif
-  AddChildView(label_);
-}
-
-NoNotificationMessageView::~NoNotificationMessageView() {
-}
-
-gfx::Size NoNotificationMessageView::GetPreferredSize() const {
-  return gfx::Size(kMinScrollViewHeight, label_->GetPreferredSize().width());
-}
-
-int NoNotificationMessageView::GetHeightForWidth(int width) const {
-  return kMinScrollViewHeight;
-}
-
-void NoNotificationMessageView::Layout() {
-  int text_height = label_->GetHeightForWidth(width());
-  int margin = (height() - text_height) / 2;
-  label_->SetBounds(0, margin, width(), text_height);
-}
-
 // MessageCenterView ///////////////////////////////////////////////////////////
 
 MessageCenterView::MessageCenterView(MessageCenter* message_center,
@@ -124,6 +73,8 @@
       target_view_(NULL),
       target_height_(0),
       is_closing_(false),
+      mode_((!initially_settings_visible) ? Mode::BUTTONS_ONLY
+                                          : Mode::SETTINGS),
       context_menu_controller_(new MessageViewContextMenuController(this)) {
   message_center_->AddObserver(this);
   set_notify_enter_exit_on_child(true);
@@ -135,6 +86,7 @@
   button_bar_ = new MessageCenterButtonBar(
       this, message_center, notifier_settings_provider,
       initially_settings_visible, GetButtonBarTitle());
+  button_bar_->SetCloseAllButtonEnabled(false);
 
   const int button_height = button_bar_->GetPreferredSize().height();
 
@@ -148,8 +100,6 @@
   scroller_->layer()->SetFillsBoundsOpaquely(false);
   scroller_->layer()->SetMasksToBounds(true);
 
-  empty_list_view_.reset(new NoNotificationMessageView);
-  empty_list_view_->set_owned_by_client();
   message_list_view_.reset(new MessageListView(this, top_down));
   message_list_view_->set_owned_by_client();
 
@@ -161,15 +111,13 @@
   // out.
   views::View* scroller_contents = new views::View();
   scroller_contents->SetLayoutManager(new views::FillLayout());
-  scroller_contents->AddChildView(empty_list_view_.get());
+  scroller_contents->AddChildView(message_list_view_.get());
   scroller_->SetContents(scroller_contents);
 
   settings_view_ = new NotifierSettingsView(notifier_settings_provider);
 
-  if (initially_settings_visible)
-    scroller_->SetVisible(false);
-  else
-    settings_view_->SetVisible(false);
+  scroller_->SetVisible(false);  // Because it has no notifications at first.
+  settings_view_->SetVisible(mode_ == Mode::SETTINGS);
 
   AddChildView(scroller_);
   AddChildView(settings_view_);
@@ -199,75 +147,33 @@
       break;
   }
 
-  NotificationsChanged();
+  Update(false /* animate */);
   scroller_->RequestFocus();
 }
 
 void MessageCenterView::SetSettingsVisible(bool visible) {
-  if (is_closing_)
-    return;
-
-  if (visible == settings_visible_)
-    return;
-
   settings_visible_ = visible;
-
-  if (visible) {
-    source_view_ = scroller_;
-    target_view_ = settings_view_;
-  } else {
-    source_view_ = settings_view_;
-    target_view_ = scroller_;
-  }
-  source_height_ = source_view_->GetHeightForWidth(width());
-  target_height_ = target_view_->GetHeightForWidth(width());
-
-  gfx::MultiAnimation::Parts parts;
-  // First part: slide resize animation.
-  parts.push_back(gfx::MultiAnimation::Part(
-      (source_height_ == target_height_) ? 0 : kDefaultAnimationDurationMs,
-      gfx::Tween::EASE_OUT));
-  // Second part: fade-out the source_view.
-  if (source_view_->layer()) {
-    parts.push_back(gfx::MultiAnimation::Part(
-        kDefaultAnimationDurationMs, gfx::Tween::LINEAR));
-  } else {
-    parts.push_back(gfx::MultiAnimation::Part());
-  }
-  // Third part: fade-in the target_view.
-  if (target_view_->layer()) {
-    parts.push_back(gfx::MultiAnimation::Part(
-        kDefaultAnimationDurationMs, gfx::Tween::LINEAR));
-    target_view_->layer()->SetOpacity(0);
-    target_view_->SetVisible(true);
-  } else {
-    parts.push_back(gfx::MultiAnimation::Part());
-  }
-  settings_transition_animation_.reset(new gfx::MultiAnimation(
-      parts, base::TimeDelta::FromMicroseconds(1000000 / kDefaultFrameRateHz)));
-  settings_transition_animation_->set_delegate(this);
-  settings_transition_animation_->set_continuous(false);
-  settings_transition_animation_->Start();
-
-  button_bar_->SetBackArrowVisible(visible);
-  button_bar_->SetTitle(GetButtonBarTitle());
+  Update(true /* animate */);
 }
 
 void MessageCenterView::ClearAllClosableNotifications() {
   if (is_closing_)
     return;
 
+  is_clearing_ = true;
+  UpdateButtonBarStatus();
   SetViewHierarchyEnabled(scroller_, false);
-  button_bar_->SetAllButtonsEnabled(false);
   message_list_view_->ClearAllClosableNotifications(
       scroller_->GetVisibleRect());
 }
 
 void MessageCenterView::OnAllNotificationsCleared() {
+  is_clearing_ = false;
   SetViewHierarchyEnabled(scroller_, true);
-  button_bar_->SetAllButtonsEnabled(true);
   button_bar_->SetCloseAllButtonEnabled(false);
 
+  // The status of buttons will be updated after removing all notifications.
+
   // Action by user.
   message_center_->RemoveAllNotifications(
       true /* by_user */,
@@ -321,7 +227,7 @@
   bool is_scrollable = false;
   if (scroller_->visible())
     is_scrollable = scroller_->height() < message_list_view_->height();
-  else
+  else if (settings_view_->visible())
     is_scrollable = settings_view_->IsScrollable();
 
   if (!animating) {
@@ -347,8 +253,9 @@
 gfx::Size MessageCenterView::GetPreferredSize() const {
   if (settings_transition_animation_ &&
       settings_transition_animation_->is_animating()) {
-    int content_width = std::max(source_view_->GetPreferredSize().width(),
-                                 target_view_->GetPreferredSize().width());
+    int content_width =
+        std::max(source_view_ ? source_view_->GetPreferredSize().width() : 0,
+                 target_view_ ? target_view_->GetPreferredSize().width() : 0);
     int width = std::max(content_width,
                          button_bar_->GetPreferredSize().width());
     return gfx::Size(width, GetHeightForWidth(width));
@@ -364,6 +271,7 @@
 }
 
 int MessageCenterView::GetHeightForWidth(int width) const {
+  views::Border* button_border = button_bar_->border();
   if (settings_transition_animation_ &&
       settings_transition_animation_->is_animating()) {
     int content_height = target_height_;
@@ -371,16 +279,17 @@
       content_height = settings_transition_animation_->CurrentValueBetween(
           source_height_, target_height_);
     }
-    return button_bar_->GetHeightForWidth(width) + content_height;
+    return button_bar_->GetHeightForWidth(width) + content_height +
+           (button_border ? button_border->GetInsets().height() : 0);
   }
 
   int content_height = 0;
   if (scroller_->visible())
     content_height += scroller_->GetHeightForWidth(width);
-  else
+  else if (settings_view_->visible())
     content_height += settings_view_->GetHeightForWidth(width);
-  return button_bar_->GetHeightForWidth(width) +
-         button_bar_->GetInsets().height() + content_height;
+  return button_bar_->GetHeightForWidth(width) + content_height +
+         (button_border ? button_border->GetInsets().height() : 0);
 }
 
 bool MessageCenterView::OnMouseWheel(const ui::MouseWheelEvent& event) {
@@ -398,7 +307,7 @@
     return;
 
   message_list_view_->ResetRepositionSession();
-  NotificationsChanged();
+  Update(true /* animate */);
 }
 
 void MessageCenterView::OnNotificationAdded(const std::string& id) {
@@ -415,7 +324,7 @@
     if (notification_views_.size() >= kMaxVisibleMessageCenterNotifications)
       break;
   }
-  NotificationsChanged();
+  Update(true /* animate */);
 }
 
 void MessageCenterView::OnNotificationRemoved(const std::string& id,
@@ -452,7 +361,7 @@
   }
   message_list_view_->RemoveNotification(view);
   notification_views_.erase(view_iter);
-  NotificationsChanged();
+  Update(true /* animate */);
 }
 
 void MessageCenterView::OnNotificationUpdated(const std::string& id) {
@@ -487,7 +396,7 @@
       int old_height = view->GetHeightForWidth(old_width);
       message_list_view_->UpdateNotification(view, **iter);
       if (view->GetHeightForWidth(old_width) != old_height)
-        NotificationsChanged();
+        Update(true /* animate */);
       break;
     }
   }
@@ -527,16 +436,18 @@
 void MessageCenterView::AnimationEnded(const gfx::Animation* animation) {
   DCHECK_EQ(animation, settings_transition_animation_.get());
 
-  Visibility visibility = target_view_ == settings_view_
-                              ? VISIBILITY_SETTINGS
-                              : VISIBILITY_MESSAGE_CENTER;
+  Visibility visibility =
+      mode_ == Mode::SETTINGS ? VISIBILITY_SETTINGS : VISIBILITY_MESSAGE_CENTER;
   message_center_->SetVisibility(visibility);
 
-  source_view_->SetVisible(false);
-  target_view_->SetVisible(true);
-  if (source_view_->layer())
+  if (source_view_) {
+    source_view_->SetVisible(false);
+  }
+  if (target_view_)
+    target_view_->SetVisible(true);
+  if (source_view_ && source_view_->layer())
     source_view_->layer()->SetOpacity(1.0);
-  if (target_view_->layer())
+  if (target_view_ && target_view_->layer())
     target_view_->layer()->SetOpacity(1.0);
   settings_transition_animation_.reset();
   PreferredSizeChanged();
@@ -546,16 +457,18 @@
 void MessageCenterView::AnimationProgressed(const gfx::Animation* animation) {
   DCHECK_EQ(animation, settings_transition_animation_.get());
   PreferredSizeChanged();
-  if (settings_transition_animation_->current_part_index() == 1 &&
-      source_view_->layer()) {
-    source_view_->layer()->SetOpacity(
-        1.0 - settings_transition_animation_->GetCurrentValue());
-    SchedulePaint();
-  } else if (settings_transition_animation_->current_part_index() == 2 &&
-             target_view_->layer()) {
-    target_view_->layer()->SetOpacity(
-        settings_transition_animation_->GetCurrentValue());
-    SchedulePaint();
+  if (settings_transition_animation_->current_part_index() == 1) {
+    if (source_view_ && source_view_->layer()) {
+      source_view_->layer()->SetOpacity(
+          1.0 - settings_transition_animation_->GetCurrentValue());
+      SchedulePaint();
+    }
+  } else if (settings_transition_animation_->current_part_index() == 2) {
+    if (target_view_ && target_view_->layer()) {
+      target_view_->layer()->SetOpacity(
+          settings_transition_animation_->GetCurrentValue());
+      SchedulePaint();
+    }
   }
 }
 
@@ -574,7 +487,15 @@
   message_list_view_->AddNotificationAt(view, index);
 }
 
-void MessageCenterView::NotificationsChanged() {
+base::string16 MessageCenterView::GetButtonBarTitle() const {
+  bool no_message_views = notification_views_.empty();
+  if (no_message_views && !settings_visible_)
+    return l10n_util::GetStringUTF16(IDS_MESSAGE_CENTER_NO_MESSAGES);
+
+  return l10n_util::GetStringUTF16(IDS_MESSAGE_CENTER_FOOTER_TITLE);
+}
+
+void MessageCenterView::Update(bool animate) {
   bool no_message_views = notification_views_.empty();
 
   // When the child view is removed from the hierarchy, its focus is cleared.
@@ -586,20 +507,12 @@
   if (focus_manager)
     focused_view = focus_manager->GetFocusedView();
 
-  // All the children of this view are owned by |this|.
-  scroller_->contents()->RemoveAllChildViews(/*delete_children=*/false);
-  scroller_->contents()->AddChildView(
-      no_message_views ? empty_list_view_.get() : message_list_view_.get());
-
-  bool no_closable_views = true;
-  for (const auto& view : notification_views_) {
-    if (!view.second->IsPinned()) {
-      no_closable_views = false;
-      break;
-    }
-  }
-  button_bar_->SetCloseAllButtonEnabled(!no_closable_views);
-  button_bar_->SetTitle(GetButtonBarTitle());
+  if (settings_visible_)
+    SetVisibilityMode(Mode::SETTINGS, animate);
+  else if (no_message_views)
+    SetVisibilityMode(Mode::BUTTONS_ONLY, animate);
+  else
+    SetVisibilityMode(Mode::NOTIFICATIONS, animate);
 
   if (no_message_views) {
     scroller_->SetFocusBehavior(FocusBehavior::NEVER);
@@ -611,20 +524,101 @@
 #endif
   }
 
+  UpdateButtonBarStatus();
+
   if (focus_manager && focused_view)
     focus_manager->SetFocusedView(focused_view);
 
-  scroller_->InvalidateLayout();
+  if (scroller_->visible())
+    scroller_->InvalidateLayout();
   PreferredSizeChanged();
   Layout();
 }
 
-base::string16 MessageCenterView::GetButtonBarTitle() const {
-  bool no_message_views = notification_views_.empty();
-  if (no_message_views && !settings_visible_)
-    return l10n_util::GetStringUTF16(IDS_MESSAGE_CENTER_NO_MESSAGES);
+void MessageCenterView::SetVisibilityMode(Mode mode, bool animate) {
+  if (is_closing_)
+    return;
 
-  return l10n_util::GetStringUTF16(IDS_MESSAGE_CENTER_FOOTER_TITLE);
+  if (mode == mode_)
+    return;
+
+  if (mode_ == Mode::NOTIFICATIONS)
+    source_view_ = scroller_;
+  else if (mode_ == Mode::SETTINGS)
+    source_view_ = settings_view_;
+  else
+    source_view_ = NULL;
+
+  if (mode == Mode::NOTIFICATIONS)
+    target_view_ = scroller_;
+  else if (mode == Mode::SETTINGS)
+    target_view_ = settings_view_;
+  else
+    target_view_ = NULL;
+
+  mode_ = mode;
+
+  source_height_ = source_view_ ? source_view_->GetHeightForWidth(width()) : 0;
+  target_height_ = target_view_ ? target_view_->GetHeightForWidth(width()) : 0;
+
+  if (!animate) {
+    AnimationEnded(NULL);
+    return;
+  }
+
+  gfx::MultiAnimation::Parts parts;
+  // First part: slide resize animation.
+  parts.push_back(gfx::MultiAnimation::Part(
+      (source_height_ == target_height_) ? 0 : kDefaultAnimationDurationMs,
+      gfx::Tween::EASE_OUT));
+  // Second part: fade-out the source_view.
+  if (source_view_ && source_view_->layer()) {
+    parts.push_back(gfx::MultiAnimation::Part(
+        kDefaultAnimationDurationMs, gfx::Tween::LINEAR));
+  } else {
+    parts.push_back(gfx::MultiAnimation::Part());
+  }
+  // Third part: fade-in the target_view.
+  if (target_view_ && target_view_->layer()) {
+    parts.push_back(gfx::MultiAnimation::Part(
+        kDefaultAnimationDurationMs, gfx::Tween::LINEAR));
+    target_view_->layer()->SetOpacity(0);
+    target_view_->SetVisible(true);
+  } else {
+    parts.push_back(gfx::MultiAnimation::Part());
+  }
+  settings_transition_animation_.reset(new gfx::MultiAnimation(
+      parts, base::TimeDelta::FromMicroseconds(1000000 / kDefaultFrameRateHz)));
+  settings_transition_animation_->set_delegate(this);
+  settings_transition_animation_->set_continuous(false);
+  settings_transition_animation_->Start();
+}
+
+void MessageCenterView::UpdateButtonBarStatus() {
+  // Disables all buttons during animation of cleaning of all notifications.
+  if (is_clearing_) {
+    button_bar_->SetSettingsAndQuietModeButtonsEnabled(false);
+    button_bar_->SetCloseAllButtonEnabled(false);
+    return;
+  }
+
+  button_bar_->SetBackArrowVisible(mode_ == Mode::SETTINGS);
+  button_bar_->SetSettingsAndQuietModeButtonsEnabled(true);
+  button_bar_->SetTitle(GetButtonBarTitle());
+
+  if (mode_ == Mode::NOTIFICATIONS) {
+    bool no_closable_views = true;
+    for (const auto& view : notification_views_) {
+      if (!view.second->IsPinned()) {
+        no_closable_views = false;
+        break;
+      }
+    }
+    button_bar_->SetCloseAllButtonEnabled(!no_closable_views);
+  } else {
+    // Disable the close-all button since no notification is visible.
+    button_bar_->SetCloseAllButtonEnabled(false);
+  }
 }
 
 void MessageCenterView::SetNotificationViewForTest(MessageView* view) {
diff --git a/ui/message_center/views/message_center_view.h b/ui/message_center/views/message_center_view.h
index 3783726..9a37ade 100644
--- a/ui/message_center/views/message_center_view.h
+++ b/ui/message_center/views/message_center_view.h
@@ -94,9 +94,13 @@
  private:
   friend class MessageCenterViewTest;
 
+  enum class Mode { NOTIFICATIONS, SETTINGS, BUTTONS_ONLY };
+
   void AddNotificationAt(const Notification& notification, int index);
-  void NotificationsChanged();
   base::string16 GetButtonBarTitle() const;
+  void Update(bool animate);
+  void SetVisibilityMode(Mode mode, bool animate);
+  void UpdateButtonBarStatus();
   void SetNotificationViewForTest(MessageView* view);
 
   MessageCenter* message_center_;  // Weak reference.
@@ -110,7 +114,6 @@
   // Child views.
   views::ScrollView* scroller_;
   std::unique_ptr<MessageListView> message_list_view_;
-  std::unique_ptr<views::View> empty_list_view_;
   NotifierSettingsView* settings_view_;
   MessageCenterButtonBar* button_bar_;
   bool top_down_;
@@ -133,6 +136,11 @@
   // ignored.
   bool is_closing_;
 
+  bool is_clearing_ = false;
+
+  // Current view mode. During animation, it is the target mode.
+  Mode mode_ = Mode::BUTTONS_ONLY;
+
   std::unique_ptr<MessageViewContextMenuController> context_menu_controller_;
 
   DISALLOW_COPY_AND_ASSIGN(MessageCenterView);
diff --git a/ui/message_center/views/message_center_view_unittest.cc b/ui/message_center/views/message_center_view_unittest.cc
index 79b2d111..b60f144 100644
--- a/ui/message_center/views/message_center_view_unittest.cc
+++ b/ui/message_center/views/message_center_view_unittest.cc
@@ -117,6 +117,9 @@
                               public MockNotificationView::Test,
                               public MessageCenterController {
  public:
+  // Expose the private enum class MessageCenter::Mode for this test.
+  typedef MessageCenterView::Mode Mode;
+
   MessageCenterViewTest();
   ~MessageCenterViewTest() override;
 
@@ -131,6 +134,7 @@
   int GetNotificationCount();
   int GetCallCount(CallType type);
   int GetCalculatedMessageListViewHeight();
+  Mode GetMessageCenterViewInternalMode();
   void AddNotification(std::unique_ptr<Notification> notification);
   void UpdateNotification(const std::string& notification_id,
                           std::unique_ptr<Notification> notification);
@@ -156,6 +160,8 @@
 
   MessageCenterButtonBar* GetButtonBar() const;
 
+  void RemoveDefaultNotifications();
+
  private:
   views::View* MakeParent(views::View* child1, views::View* child2);
 
@@ -235,6 +241,11 @@
   return GetMessageListView()->GetHeightForWidth(GetMessageListView()->width());
 }
 
+MessageCenterViewTest::Mode
+MessageCenterViewTest::GetMessageCenterViewInternalMode() {
+  return GetMessageCenterView()->mode_;
+}
+
 views::BoundsAnimator* MessageCenterViewTest::GetAnimator() {
   return &GetMessageListView()->animator_;
 }
@@ -347,6 +358,11 @@
   return message_center_view_->button_bar_;
 }
 
+void MessageCenterViewTest::RemoveDefaultNotifications() {
+  RemoveNotification(kNotificationId1, false);
+  RemoveNotification(kNotificationId2, false);
+}
+
 /* Unit tests *****************************************************************/
 
 TEST_F(MessageCenterViewTest, CallTest) {
@@ -598,4 +614,97 @@
 #endif  // defined(OS_CHROMEOS)
 }
 
+TEST_F(MessageCenterViewTest, CheckModeWithSettingsVisibleAndHidden) {
+  // Check the initial state.
+  EXPECT_EQ(Mode::NOTIFICATIONS, GetMessageCenterViewInternalMode());
+  // Show the settings.
+  GetMessageCenterView()->SetSettingsVisible(true);
+  EXPECT_EQ(Mode::SETTINGS, GetMessageCenterViewInternalMode());
+  // Hide the settings.
+  GetMessageCenterView()->SetSettingsVisible(false);
+  EXPECT_EQ(Mode::NOTIFICATIONS, GetMessageCenterViewInternalMode());
+}
+
+TEST_F(MessageCenterViewTest, CheckModeWithRemovingAndAddingNotifications) {
+  // Check the initial state.
+  EXPECT_EQ(Mode::NOTIFICATIONS, GetMessageCenterViewInternalMode());
+
+  // Remove notifications.
+  RemoveDefaultNotifications();
+  EXPECT_EQ(Mode::BUTTONS_ONLY, GetMessageCenterViewInternalMode());
+
+  // Add a notification.
+  Notification normal_notification(
+      NOTIFICATION_TYPE_SIMPLE, std::string(kNotificationId1),
+      base::UTF8ToUTF16("title2"),
+      base::UTF8ToUTF16("message\nwhich\nis\nvertically\nlong\n."),
+      gfx::Image(), base::UTF8ToUTF16("display source"), GURL(),
+      NotifierId(NotifierId::APPLICATION, "extension_id"),
+      message_center::RichNotificationData(), NULL);
+  AddNotification(
+      std::unique_ptr<Notification>(new Notification(normal_notification)));
+  EXPECT_EQ(Mode::NOTIFICATIONS, GetMessageCenterViewInternalMode());
+}
+
+TEST_F(MessageCenterViewTest, CheckModeWithSettingsVisibleAndHiddenOnEmpty) {
+  // Set up by removing all existing notifications.
+  RemoveDefaultNotifications();
+
+  // Check the initial state.
+  EXPECT_EQ(Mode::BUTTONS_ONLY, GetMessageCenterViewInternalMode());
+  // Show the settings.
+  GetMessageCenterView()->SetSettingsVisible(true);
+  EXPECT_EQ(Mode::SETTINGS, GetMessageCenterViewInternalMode());
+  // Hide the settings.
+  GetMessageCenterView()->SetSettingsVisible(false);
+  EXPECT_EQ(Mode::BUTTONS_ONLY, GetMessageCenterViewInternalMode());
+}
+
+TEST_F(MessageCenterViewTest,
+       CheckModeWithRemovingNotificationDuringSettingsVisible) {
+  // Check the initial state.
+  EXPECT_EQ(Mode::NOTIFICATIONS, GetMessageCenterViewInternalMode());
+
+  // Show the settings.
+  GetMessageCenterView()->SetSettingsVisible(true);
+  EXPECT_EQ(Mode::SETTINGS, GetMessageCenterViewInternalMode());
+
+  // Remove a notification during settings is visible.
+  RemoveDefaultNotifications();
+  EXPECT_EQ(Mode::SETTINGS, GetMessageCenterViewInternalMode());
+
+  // Hide the settings.
+  GetMessageCenterView()->SetSettingsVisible(false);
+  EXPECT_EQ(Mode::BUTTONS_ONLY, GetMessageCenterViewInternalMode());
+}
+
+TEST_F(MessageCenterViewTest,
+       CheckModeWithAddingNotificationDuringSettingsVisible) {
+  // Set up by removing all existing notifications.
+  RemoveDefaultNotifications();
+
+  // Check the initial state.
+  EXPECT_EQ(Mode::BUTTONS_ONLY, GetMessageCenterViewInternalMode());
+
+  // Show the settings.
+  GetMessageCenterView()->SetSettingsVisible(true);
+  EXPECT_EQ(Mode::SETTINGS, GetMessageCenterViewInternalMode());
+
+  // Add a notification during settings is visible.
+  Notification normal_notification(
+      NOTIFICATION_TYPE_SIMPLE, std::string(kNotificationId1),
+      base::UTF8ToUTF16("title2"),
+      base::UTF8ToUTF16("message\nwhich\nis\nvertically\nlong\n."),
+      gfx::Image(), base::UTF8ToUTF16("display source"), GURL(),
+      NotifierId(NotifierId::APPLICATION, "extension_id"),
+      message_center::RichNotificationData(), NULL);
+  AddNotification(
+      std::unique_ptr<Notification>(new Notification(normal_notification)));
+  EXPECT_EQ(Mode::SETTINGS, GetMessageCenterViewInternalMode());
+
+  // Hide the settings.
+  GetMessageCenterView()->SetSettingsVisible(false);
+  EXPECT_EQ(Mode::NOTIFICATIONS, GetMessageCenterViewInternalMode());
+}
+
 }  // namespace message_center
diff --git a/ui/message_center/views/message_view.cc b/ui/message_center/views/message_view.cc
index 7b40005..847d5a9 100644
--- a/ui/message_center/views/message_view.cc
+++ b/ui/message_center/views/message_view.cc
@@ -27,24 +27,22 @@
 
 namespace {
 
-const int kShadowOffset = 1;
-const int kShadowBlur = 4;
+constexpr int kCloseIconTopPadding = 5;
+constexpr int kCloseIconRightPadding = 5;
+
+constexpr int kShadowOffset = 1;
+constexpr int kShadowBlur = 4;
 
 }  // namespace
 
 namespace message_center {
 
 MessageView::MessageView(MessageCenterController* controller,
-                         const std::string& notification_id,
-                         const NotifierId& notifier_id,
-                         const gfx::ImageSkia& small_image,
-                         const base::string16& display_source)
+                         const Notification& notification)
     : controller_(controller),
-      notification_id_(notification_id),
-      notifier_id_(notifier_id),
-      background_view_(NULL),
-      scroller_(NULL),
-      display_source_(display_source) {
+      notification_id_(notification.id()),
+      notifier_id_(notification.notifier_id()),
+      display_source_(notification.display_source()) {
   SetFocusBehavior(FocusBehavior::ALWAYS);
 
   // Create the opaque background that's above the view's shadow.
@@ -54,7 +52,7 @@
   AddChildView(background_view_);
 
   views::ImageView* small_image_view = new views::ImageView();
-  small_image_view->SetImage(small_image);
+  small_image_view->SetImage(notification.small_image().AsImageSkia());
   small_image_view->SetImageSize(gfx::Size(kSmallImageSize, kSmallImageSize));
   // The small image view should be added to view hierarchy by the derived
   // class. This ensures that it is on top of other views.
@@ -71,6 +69,7 @@
 void MessageView::UpdateWithNotification(const Notification& notification) {
   small_image_view_->SetImage(notification.small_image().AsImageSkia());
   display_source_ = notification.display_source();
+  CreateOrUpdateCloseButtonView(notification);
 }
 
 // static
@@ -88,16 +87,21 @@
 }
 
 bool MessageView::IsCloseButtonFocused() {
-  // May be overridden by the owner of the close button.
-  return false;
+  if (!close_button_)
+    return false;
+
+  views::FocusManager* focus_manager = GetFocusManager();
+  return focus_manager &&
+         focus_manager->GetFocusedView() == close_button_.get();
 }
 
 void MessageView::RequestFocusOnCloseButton() {
-  // May be overridden by the owner of the close button.
+  if (close_button_)
+    close_button_->RequestFocus();
 }
 
 bool MessageView::IsPinned() {
-  return false;
+  return !close_button_;
 }
 
 void MessageView::GetAccessibleState(ui::AXViewState* state) {
@@ -141,6 +145,7 @@
 
 void MessageView::OnPaint(gfx::Canvas* canvas) {
   DCHECK_EQ(this, small_image_view_->parent());
+  DCHECK_EQ(this, close_button_->parent());
   SlideOutView::OnPaint(canvas);
   views::Painter::PaintFocusPainter(this, canvas, focus_painter_.get());
 }
@@ -163,6 +168,16 @@
   // Background.
   background_view_->SetBoundsRect(content_bounds);
 
+  // Close button.
+  if (close_button_) {
+    gfx::Rect content_bounds = GetContentsBounds();
+    gfx::Size close_size(close_button_->GetPreferredSize());
+    gfx::Rect close_rect(content_bounds.right() - close_size.width(),
+                         content_bounds.y(), close_size.width(),
+                         close_size.height());
+    close_button_->SetBoundsRect(close_rect);
+  }
+
   gfx::Size small_image_size(small_image_view_->GetPreferredSize());
   gfx::Rect small_image_rect(small_image_size);
   small_image_rect.set_origin(gfx::Point(
@@ -209,6 +224,9 @@
 
 void MessageView::ButtonPressed(views::Button* sender,
                                 const ui::Event& event) {
+  if (close_button_ && sender == close_button_.get()) {
+    controller()->RemoveNotification(notification_id(), true);  // By user.
+  }
 }
 
 void MessageView::OnSlideOut() {
@@ -224,4 +242,25 @@
   SchedulePaint();
 }
 
+void MessageView::CreateOrUpdateCloseButtonView(
+    const Notification& notification) {
+  set_slide_out_enabled(!notification.pinned());
+
+  if (!notification.pinned() && !close_button_) {
+    PaddedButton* close = new PaddedButton(this);
+    close->SetPadding(-kCloseIconRightPadding, kCloseIconTopPadding);
+    close->SetNormalImage(IDR_NOTIFICATION_CLOSE);
+    close->SetHoveredImage(IDR_NOTIFICATION_CLOSE_HOVER);
+    close->SetPressedImage(IDR_NOTIFICATION_CLOSE_PRESSED);
+    close->set_animate_on_state_change(false);
+    close->SetAccessibleName(l10n_util::GetStringUTF16(
+        IDS_MESSAGE_CENTER_CLOSE_NOTIFICATION_BUTTON_ACCESSIBLE_NAME));
+    close->set_owned_by_client();
+    AddChildView(close);
+    close_button_.reset(close);
+  } else if (notification.pinned() && close_button_) {
+    close_button_.reset();
+  }
+}
+
 }  // namespace message_center
diff --git a/ui/message_center/views/message_view.h b/ui/message_center/views/message_view.h
index 1ee9122a..07da4e572 100644
--- a/ui/message_center/views/message_view.h
+++ b/ui/message_center/views/message_view.h
@@ -46,10 +46,7 @@
                                           public views::ButtonListener {
  public:
   MessageView(MessageCenterController* controller,
-              const std::string& notification_id,
-              const NotifierId& notifier_id,
-              const gfx::ImageSkia& small_image,
-              const base::string16& display_source);
+              const Notification& notification);
   ~MessageView() override;
 
   // Updates this view with the new data contained in the notification.
@@ -61,9 +58,9 @@
   // Creates a shadow around the notification.
   void CreateShadowBorder();
 
-  virtual bool IsCloseButtonFocused();
-  virtual void RequestFocusOnCloseButton();
-  virtual bool IsPinned();
+  bool IsCloseButtonFocused();
+  void RequestFocusOnCloseButton();
+  bool IsPinned();
 
   void set_accessible_name(const base::string16& accessible_name) {
     accessible_name_ = accessible_name;
@@ -98,17 +95,28 @@
   // Overridden from views::SlideOutView:
   void OnSlideOut() override;
 
+  // Creates and add close button to view hierarchy when necessary. Derived
+  // classes should call this after its view hierarchy is populated to ensure
+  // it is on top of other views.
+  void CreateOrUpdateCloseButtonView(const Notification& notification);
+
   views::ImageView* small_image() { return small_image_view_.get(); }
+  views::ImageButton* close_button() { return close_button_.get(); }
   views::ScrollView* scroller() { return scroller_; }
   MessageCenterController* controller() { return controller_; }
 
  private:
+  // Changes the background color being used by |background_view_| and schedules
+  // a paint.
+  void SetDrawBackgroundAsActive(bool active);
+
   MessageCenterController* controller_;  // Weak, lives longer then views.
   std::string notification_id_;
   NotifierId notifier_id_;
-  views::View* background_view_;  // Owned by views hierarchy.
+  views::View* background_view_ = nullptr;  // Owned by views hierarchy.
   std::unique_ptr<views::ImageView> small_image_view_;
-  views::ScrollView* scroller_;
+  std::unique_ptr<views::ImageButton> close_button_;
+  views::ScrollView* scroller_ = nullptr;
 
   base::string16 accessible_name_;
 
@@ -116,10 +124,6 @@
 
   std::unique_ptr<views::Painter> focus_painter_;
 
-  // Changes the background color being used by |background_view_| and schedules
-  // a paint.
-  void SetDrawBackgroundAsActive(bool active);
-
   DISALLOW_COPY_AND_ASSIGN(MessageView);
 };
 
diff --git a/ui/message_center/views/notification_view.cc b/ui/message_center/views/notification_view.cc
index c128cc1a..301f94f 100644
--- a/ui/message_center/views/notification_view.cc
+++ b/ui/message_center/views/notification_view.cc
@@ -59,9 +59,6 @@
 // Dimensions.
 const int kProgressBarBottomPadding = 0;
 
-const int kCloseIconTopPadding = 5;
-const int kCloseIconRightPadding = 5;
-
 // static
 std::unique_ptr<views::Border> MakeEmptyBorder(int top,
                                                int left,
@@ -207,8 +204,8 @@
                                     action_buttons_.end());
   if (settings_button_view_)
     buttons.push_back(settings_button_view_);
-  if (close_button_)
-    buttons.push_back(close_button_.get());
+  if (close_button())
+    buttons.push_back(close_button());
 
   for (size_t i = 0; i < buttons.size(); ++i) {
     gfx::Point point_in_child = point;
@@ -221,7 +218,6 @@
 }
 
 void NotificationView::CreateOrUpdateViews(const Notification& notification) {
-  CreateOrUpdateCloseButtonView(notification);
   CreateOrUpdateTitleView(notification);
   CreateOrUpdateMessageView(notification);
   CreateOrUpdateProgressBarView(notification);
@@ -249,22 +245,8 @@
 
 NotificationView::NotificationView(MessageCenterController* controller,
                                    const Notification& notification)
-    : MessageView(controller,
-                  notification.id(),
-                  notification.notifier_id(),
-                  notification.small_image().AsImageSkia(),
-                  notification.display_source()),
-      clickable_(notification.clickable()),
-      top_view_(NULL),
-      title_view_(NULL),
-      message_view_(NULL),
-      context_message_view_(NULL),
-      settings_button_view_(NULL),
-      icon_view_(NULL),
-      bottom_view_(NULL),
-      image_container_(NULL),
-      image_view_(NULL),
-      progress_bar_view_(NULL) {
+    : MessageView(controller, notification),
+      clickable_(notification.clickable()) {
   // Create the top_view_, which collects into a vertical box all content
   // at the top of the notification (to the right of the icon) except for the
   // close button.
@@ -288,6 +270,7 @@
   // image to overlap the content as needed to provide large enough click and
   // touch areas (<http://crbug.com/168822> and <http://crbug.com/168856>).
   AddChildView(small_image());
+  CreateOrUpdateCloseButtonView(notification);
   SetAccessibleName(notification);
 
   SetEventTargeter(
@@ -360,16 +343,6 @@
   int top_height = top_view_->GetHeightForWidth(content_width);
   top_view_->SetBounds(insets.left(), insets.top(), content_width, top_height);
 
-  // Close button.
-  if (close_button_) {
-    gfx::Rect content_bounds = GetContentsBounds();
-    gfx::Size close_size(close_button_->GetPreferredSize());
-    gfx::Rect close_rect(content_bounds.right() - close_size.width(),
-                         content_bounds.y(), close_size.width(),
-                         close_size.height());
-    close_button_->SetBoundsRect(close_rect);
-  }
-
   // Icon.
   icon_view_->SetBounds(insets.left(), insets.top(), kNotificationIconSize,
                         kNotificationIconSize);
@@ -438,10 +411,6 @@
     }
   }
 
-  if (close_button_ && sender == close_button_.get()) {
-    controller()->RemoveNotification(notification_id(), true);  // By user.
-  }
-
   // Let the superclass handle everything else.
   // Warning: This may cause the NotificationView itself to be deleted,
   // so don't do anything afterwards.
@@ -754,29 +723,6 @@
   }
 }
 
-void NotificationView::CreateOrUpdateCloseButtonView(
-    const Notification& notification) {
-  set_slide_out_enabled(!notification.pinned());
-
-  if (!notification.pinned() && !close_button_) {
-    PaddedButton* close = new PaddedButton(this);
-    close->SetPadding(-kCloseIconRightPadding, kCloseIconTopPadding);
-    close->SetNormalImage(IDR_NOTIFICATION_CLOSE);
-    close->SetHoveredImage(IDR_NOTIFICATION_CLOSE_HOVER);
-    close->SetPressedImage(IDR_NOTIFICATION_CLOSE_PRESSED);
-    close->set_animate_on_state_change(false);
-    close->SetAccessibleName(l10n_util::GetStringUTF16(
-        IDS_MESSAGE_CENTER_CLOSE_NOTIFICATION_BUTTON_ACCESSIBLE_NAME));
-    // The close button should be added to view hierarchy by the derived class.
-    // This ensures that it is on top of other views.
-    close->set_owned_by_client();
-    close_button_.reset(close);
-    AddChildView(close_button_.get());
-  } else if (notification.pinned() && close_button_) {
-    close_button_.reset();
-  }
-}
-
 int NotificationView::GetMessageLineLimit(int title_lines, int width) const {
   // Image notifications require that the image must be kept flush against
   // their icons, but we can allow more text if no image.
@@ -818,22 +764,4 @@
          message_view_->GetSizeForWidthAndLines(width, limit).height() : 0;
 }
 
-bool NotificationView::IsCloseButtonFocused() {
-  if (!close_button_)
-    return false;
-
-  views::FocusManager* focus_manager = GetFocusManager();
-  return focus_manager &&
-         focus_manager->GetFocusedView() == close_button_.get();
-}
-
-void NotificationView::RequestFocusOnCloseButton() {
-  if (close_button_)
-    close_button_->RequestFocus();
-}
-
-bool NotificationView::IsPinned() {
-  return !close_button_;
-}
-
 }  // namespace message_center
diff --git a/ui/message_center/views/notification_view.h b/ui/message_center/views/notification_view.h
index 5856899..304475a3 100644
--- a/ui/message_center/views/notification_view.h
+++ b/ui/message_center/views/notification_view.h
@@ -60,9 +60,6 @@
   // Overridden from MessageView:
   void UpdateWithNotification(const Notification& notification) override;
   void ButtonPressed(views::Button* sender, const ui::Event& event) override;
-  bool IsCloseButtonFocused() override;
-  void RequestFocusOnCloseButton() override;
-  bool IsPinned() override;
 
  protected:
   NotificationView(MessageCenterController* controller,
@@ -97,7 +94,6 @@
   void CreateOrUpdateIconView(const Notification& notification);
   void CreateOrUpdateImageView(const Notification& notification);
   void CreateOrUpdateActionButtonViews(const Notification& notification);
-  void CreateOrUpdateCloseButtonView(const Notification& notification);
 
   int GetMessageLineLimit(int title_lines, int width) const;
   int GetMessageHeight(int width, int limit) const;
@@ -112,19 +108,18 @@
   bool clickable_;
 
   // Weak references to NotificationView descendants owned by their parents.
-  views::View* top_view_;
-  BoundedLabel* title_view_;
-  BoundedLabel* message_view_;
-  BoundedLabel* context_message_view_;
-  views::ImageButton* settings_button_view_;
+  views::View* top_view_ = nullptr;
+  BoundedLabel* title_view_ = nullptr;
+  BoundedLabel* message_view_ = nullptr;
+  BoundedLabel* context_message_view_ = nullptr;
+  views::ImageButton* settings_button_view_ = nullptr;
   std::vector<views::View*> item_views_;
-  ProportionalImageView* icon_view_;
-  views::View* bottom_view_;
-  views::View* image_container_;
-  ProportionalImageView* image_view_;
-  NotificationProgressBarBase* progress_bar_view_;
+  ProportionalImageView* icon_view_ = nullptr;
+  views::View* bottom_view_ = nullptr;
+  views::View* image_container_ = nullptr;
+  ProportionalImageView* image_view_ = nullptr;
+  NotificationProgressBarBase* progress_bar_view_ = nullptr;
   std::vector<NotificationButton*> action_buttons_;
-  std::unique_ptr<views::ImageButton> close_button_;
   std::vector<views::View*> separators_;
 
   DISALLOW_COPY_AND_ASSIGN(NotificationView);
diff --git a/ui/message_center/views/notification_view_unittest.cc b/ui/message_center/views/notification_view_unittest.cc
index 053feec..d4315c8b 100644
--- a/ui/message_center/views/notification_view_unittest.cc
+++ b/ui/message_center/views/notification_view_unittest.cc
@@ -179,12 +179,11 @@
   }
 
   views::ImageButton* GetCloseButton() {
-    return notification_view()->close_button_.get();
+    return notification_view()->close_button();
   }
 
   void UpdateNotificationViews() {
-    notification_view()->CreateOrUpdateViews(*notification());
-    notification_view()->Layout();
+    notification_view()->UpdateWithNotification(*notification());
   }
 
   float GetNotificationScrollAmount() const {
diff --git a/ui/ozone/demo/BUILD.gn b/ui/ozone/demo/BUILD.gn
index c05bb92..e904e19 100644
--- a/ui/ozone/demo/BUILD.gn
+++ b/ui/ozone/demo/BUILD.gn
@@ -32,6 +32,7 @@
     "//ui/events/ozone:events_ozone_layout",
     "//ui/gfx/geometry",
     "//ui/gl",
+    "//ui/gl/init",
     "//ui/ozone",
     "//ui/platform_window",
   ]
diff --git a/ui/ozone/demo/gl_renderer.cc b/ui/ozone/demo/gl_renderer.cc
index 9551f1e..93fe3d8 100644
--- a/ui/ozone/demo/gl_renderer.cc
+++ b/ui/ozone/demo/gl_renderer.cc
@@ -10,6 +10,7 @@
 #include "ui/gl/gl_bindings.h"
 #include "ui/gl/gl_context.h"
 #include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 
 namespace ui {
 
@@ -22,8 +23,8 @@
 }
 
 bool GlRenderer::Initialize() {
-  context_ = gfx::GLContext::CreateGLContext(NULL, surface_.get(),
-                                             gfx::PreferIntegratedGpu);
+  context_ = gl::init::CreateGLContext(nullptr, surface_.get(),
+                                       gfx::PreferIntegratedGpu);
   if (!context_.get()) {
     LOG(ERROR) << "Failed to create GL context";
     return false;
diff --git a/ui/ozone/demo/ozone_demo.cc b/ui/ozone/demo/ozone_demo.cc
index f3933137..f3a0e4b 100644
--- a/ui/ozone/demo/ozone_demo.cc
+++ b/ui/ozone/demo/ozone_demo.cc
@@ -22,6 +22,7 @@
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 #include "ui/ozone/demo/gl_renderer.h"
 #include "ui/ozone/demo/software_renderer.h"
 #include "ui/ozone/demo/surfaceless_gl_renderer.h"
@@ -45,9 +46,9 @@
 scoped_refptr<gfx::GLSurface> CreateGLSurface(gfx::AcceleratedWidget widget) {
   scoped_refptr<gfx::GLSurface> surface;
   if (!base::CommandLine::ForCurrentProcess()->HasSwitch(kDisableSurfaceless))
-    surface = gfx::GLSurface::CreateSurfacelessViewGLSurface(widget);
+    surface = gl::init::CreateSurfacelessViewGLSurface(widget);
   if (!surface)
-    surface = gfx::GLSurface::CreateViewGLSurface(widget);
+    surface = gl::init::CreateViewGLSurface(widget);
   return surface;
 }
 
@@ -197,8 +198,7 @@
 
 bool RendererFactory::Initialize() {
   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
-  if (!command_line->HasSwitch(kDisableGpu) &&
-      gfx::GLSurface::InitializeOneOff() &&
+  if (!command_line->HasSwitch(kDisableGpu) && gl::init::InitializeGLOneOff() &&
       gpu_helper_.Initialize(base::ThreadTaskRunnerHandle::Get(),
                              base::ThreadTaskRunnerHandle::Get())) {
     type_ = GL;
diff --git a/ui/ozone/demo/ozone_demos.gyp b/ui/ozone/demo/ozone_demos.gyp
index 4e7a8c0..7f860a5 100644
--- a/ui/ozone/demo/ozone_demos.gyp
+++ b/ui/ozone/demo/ozone_demos.gyp
@@ -16,6 +16,7 @@
         '../../../ui/events/ozone/events_ozone.gyp:events_ozone_layout',
         '../../../ui/gfx/gfx.gyp:gfx_geometry',
         '../../../ui/gl/gl.gyp:gl',
+        '../../../ui/gl/init/gl_init.gyp:gl_init',
         '../../../ui/ozone/ozone.gyp:ozone',
         '../../../ui/ozone/ozone.gyp:ozone_base',
       ],
diff --git a/ui/strings/translations/ui_strings_am.xtb b/ui/strings/translations/ui_strings_am.xtb
index 54555ae..6b6d63c4 100644
--- a/ui/strings/translations/ui_strings_am.xtb
+++ b/ui/strings/translations/ui_strings_am.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">ወደ ቀኝ ሸብልል</translation>
 <translation id="4820616160060340806">Command+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">እዚህ ምንም የሚታይ ነገር የለም፣ ይቀጥሉ።</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 ሰከንድ}one{# ሰከንዶች}other{# ሰከንዶች}}</translation>
 <translation id="4971687151119236543">የሚዲያ ቀዳሚ ትራክ</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_ar.xtb b/ui/strings/translations/ui_strings_ar.xtb
index a7208b4..450af19 100644
--- a/ui/strings/translations/ui_strings_ar.xtb
+++ b/ui/strings/translations/ui_strings_ar.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">‏مفتاح PgDwn (صفحة إلى أسفل)</translation>
 <translation id="4588090240171750605">التمرير إلى اليسار</translation>
 <translation id="4820616160060340806">‏المفتاح Command+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">ليس هناك شيء تراه هنا، انتقل إلى مكان آخر.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{ثانية واحدة}zero{# من الثواني}two{ثانيتان (#)}few{# ثوانٍ}many{# ثانية}other{# من الثواني}}</translation>
 <translation id="4971687151119236543">المقطع الصوتي السابق للوسائط</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_bg.xtb b/ui/strings/translations/ui_strings_bg.xtb
index 09da37e..aeec702 100644
--- a/ui/strings/translations/ui_strings_bg.xtb
+++ b/ui/strings/translations/ui_strings_bg.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">Превъртане надясно</translation>
 <translation id="4820616160060340806">Command + <ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Тук няма нищо, продължете нататък.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 секунда}other{# секунди}}</translation>
 <translation id="4971687151119236543">Мултимедия, предишният запис</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_bn.xtb b/ui/strings/translations/ui_strings_bn.xtb
index edb68ba..a76320b 100644
--- a/ui/strings/translations/ui_strings_bn.xtb
+++ b/ui/strings/translations/ui_strings_bn.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">ডান দিকে স্ক্রোল করুন</translation>
 <translation id="4820616160060340806">Command+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">এখানে দেখার কিছু নেই , এগিয়ে যান৷</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{১ সেকেন্ড}one{# সেকেন্ড}other{# সেকেন্ড}}</translation>
 <translation id="4971687151119236543">মিডিয়া পূর্ববর্তী ট্র্যাক</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_ca.xtb b/ui/strings/translations/ui_strings_ca.xtb
index 2ba519f..9ea2d89 100644
--- a/ui/strings/translations/ui_strings_ca.xtb
+++ b/ui/strings/translations/ui_strings_ca.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">Av Pàg</translation>
 <translation id="4588090240171750605">Desplaçament a la dreta</translation>
 <translation id="4820616160060340806">Ordre+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">No hi ha cap notificació, podeu continuar.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 segon}other{# segons}}</translation>
 <translation id="4971687151119236543">Fitxer multimèdia: pista anterior</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_cs.xtb b/ui/strings/translations/ui_strings_cs.xtb
index 4a39c54..4817a6e 100644
--- a/ui/strings/translations/ui_strings_cs.xtb
+++ b/ui/strings/translations/ui_strings_cs.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">Klávesa PgDwn</translation>
 <translation id="4588090240171750605">Posuv doprava</translation>
 <translation id="4820616160060340806">Příkaz + <ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Tady není nic k vidění, rozejděte se.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 sekunda}few{# sekundy}many{# sekundy}other{# sekund}}</translation>
 <translation id="4971687151119236543">Média – předchozí skladba</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_da.xtb b/ui/strings/translations/ui_strings_da.xtb
index 01c9a8e..d5a20feb 100644
--- a/ui/strings/translations/ui_strings_da.xtb
+++ b/ui/strings/translations/ui_strings_da.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">Scroll til højre</translation>
 <translation id="4820616160060340806">Kommando+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Der er intet at se her, så du kan bare gå videre.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 sekund}one{# sekunder}other{# sekunder}}</translation>
 <translation id="4971687151119236543">Medie: Forrige nummer</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_de.xtb b/ui/strings/translations/ui_strings_de.xtb
index 35f52789..383f1af 100644
--- a/ui/strings/translations/ui_strings_de.xtb
+++ b/ui/strings/translations/ui_strings_de.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">BildAb</translation>
 <translation id="4588090240171750605">Nach rechts blättern</translation>
 <translation id="4820616160060340806">Befehltaste+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Sie haben keine Benachrichtigungen.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 Sekunde}other{# Sekunden}}</translation>
 <translation id="4971687151119236543">Medien – vorheriger Titel</translation>
 <translation id="4999762576397546063">Strg+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_el.xtb b/ui/strings/translations/ui_strings_el.xtb
index 379875a..0f6122d 100644
--- a/ui/strings/translations/ui_strings_el.xtb
+++ b/ui/strings/translations/ui_strings_el.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">Κύλιση δεξιά</translation>
 <translation id="4820616160060340806">Εντολή+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Δεν υπάρχει τίποτα να δείτε εδώ, συνεχίστε με αυτό που κάνατε.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 δευτερόλεπτο}other{# δευτερόλεπτα}}</translation>
 <translation id="4971687151119236543">Προηγούμενο κομμάτι πολυμέσων</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_en-GB.xtb b/ui/strings/translations/ui_strings_en-GB.xtb
index cbbf35e..0588550 100644
--- a/ui/strings/translations/ui_strings_en-GB.xtb
+++ b/ui/strings/translations/ui_strings_en-GB.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">Scroll Right</translation>
 <translation id="4820616160060340806">Command+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Nothing to see here, move along.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 second}other{# seconds}}</translation>
 <translation id="4971687151119236543">Media Previous Track</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_es-419.xtb b/ui/strings/translations/ui_strings_es-419.xtb
index 8d21471..6a69ef3 100644
--- a/ui/strings/translations/ui_strings_es-419.xtb
+++ b/ui/strings/translations/ui_strings_es-419.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">AvPág</translation>
 <translation id="4588090240171750605">Desplazar a la derecha</translation>
 <translation id="4820616160060340806">Comando+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">No hay ningún elemento que mostrar.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 segundo}other{# segundos}}</translation>
 <translation id="4971687151119236543">Pista multimedia anterior</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_es.xtb b/ui/strings/translations/ui_strings_es.xtb
index b836b2a..54f6324 100644
--- a/ui/strings/translations/ui_strings_es.xtb
+++ b/ui/strings/translations/ui_strings_es.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">AvPág</translation>
 <translation id="4588090240171750605">Desplazar a la derecha</translation>
 <translation id="4820616160060340806">Comando+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Aquí no hay nada que ver, circulen...</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 segundo}other{# segundos}}</translation>
 <translation id="4971687151119236543">Pista anterior multimedia</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_et.xtb b/ui/strings/translations/ui_strings_et.xtb
index f0ba174..267d0268 100644
--- a/ui/strings/translations/ui_strings_et.xtb
+++ b/ui/strings/translations/ui_strings_et.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">Keri paremale</translation>
 <translation id="4820616160060340806">Käsk + <ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Siin pole ühtegi märguannet, liikuge edasi.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 sekund}other{# sekundit}}</translation>
 <translation id="4971687151119236543">Meediumi eelmine lugu</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_fa.xtb b/ui/strings/translations/ui_strings_fa.xtb
index 8a111cfb..4d487314 100644
--- a/ui/strings/translations/ui_strings_fa.xtb
+++ b/ui/strings/translations/ui_strings_fa.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">پیمایش به راست</translation>
 <translation id="4820616160060340806">فرمان+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">اینجا خبری نیست، برگردید.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{۱ ثانیه}one{# ثانیه}other{# ثانیه}}</translation>
 <translation id="4971687151119236543">آهنگ قبلی رسانه</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_fi.xtb b/ui/strings/translations/ui_strings_fi.xtb
index 0818d9ad..2f2f6b1 100644
--- a/ui/strings/translations/ui_strings_fi.xtb
+++ b/ui/strings/translations/ui_strings_fi.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">Sivu alas</translation>
 <translation id="4588090240171750605">Vieritä oikealle</translation>
 <translation id="4820616160060340806">Command + <ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Täällä ei ole mitään nähtävää.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 sekunti}other{# sekuntia}}</translation>
 <translation id="4971687151119236543">Media: edellinen kappale</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_fil.xtb b/ui/strings/translations/ui_strings_fil.xtb
index b351965..90a7b38 100644
--- a/ui/strings/translations/ui_strings_fil.xtb
+++ b/ui/strings/translations/ui_strings_fil.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">Mag-scroll Pakanan</translation>
 <translation id="4820616160060340806">Command+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Walang makikita rito, magpatuloy.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 segundo}one{# segundo}other{# na segundo}}</translation>
 <translation id="4971687151119236543">Nakaraang Track ng Media</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_fr.xtb b/ui/strings/translations/ui_strings_fr.xtb
index 85db325..dc98982 100644
--- a/ui/strings/translations/ui_strings_fr.xtb
+++ b/ui/strings/translations/ui_strings_fr.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgSuiv</translation>
 <translation id="4588090240171750605">Défilement vers la droite</translation>
 <translation id="4820616160060340806">Commande + <ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Aucune notification</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 seconde}one{# seconde}other{# secondes}}</translation>
 <translation id="4971687151119236543">Contenu multimédia : titre précédent</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_gu.xtb b/ui/strings/translations/ui_strings_gu.xtb
index e3c8dbb..78063a5 100644
--- a/ui/strings/translations/ui_strings_gu.xtb
+++ b/ui/strings/translations/ui_strings_gu.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">જમણે સ્ક્રોલ કરો</translation>
 <translation id="4820616160060340806">કમાન્ડ+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">અહીં જોવા માટે કંઈ નથી, આગળ વધો.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 સેકન્ડ}one{# સેકન્ડ}other{# સેકન્ડ}}</translation>
 <translation id="4971687151119236543">મીડિયા પહેલાંનું ટ્રૅક</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_hi.xtb b/ui/strings/translations/ui_strings_hi.xtb
index d66c724..f3dc7fc 100644
--- a/ui/strings/translations/ui_strings_hi.xtb
+++ b/ui/strings/translations/ui_strings_hi.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">दाएं स्क्रॉल करें</translation>
 <translation id="4820616160060340806">आदेश+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">यहां देखने के लिए कुछ भी नहीं है, आगे चलें.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 सेकंड}one{# सेकंड}other{# सेकंड}}</translation>
 <translation id="4971687151119236543">मीडिया पिछला ट्रैक</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_hr.xtb b/ui/strings/translations/ui_strings_hr.xtb
index 0e4db318..e3e9723 100644
--- a/ui/strings/translations/ui_strings_hr.xtb
+++ b/ui/strings/translations/ui_strings_hr.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">Pomakni se desno</translation>
 <translation id="4820616160060340806">Naredba + <ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Nema nikakvih obavijesti.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 sekunda}one{# sekunda}few{# sekunde}other{# sekundi}}</translation>
 <translation id="4971687151119236543">Prethodni zapis Medija</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_hu.xtb b/ui/strings/translations/ui_strings_hu.xtb
index 150bb41..b83f669 100644
--- a/ui/strings/translations/ui_strings_hu.xtb
+++ b/ui/strings/translations/ui_strings_hu.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">Görgetés jobbra</translation>
 <translation id="4820616160060340806">Command+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Itt nincs semmi, továbbmehet.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 másodperc}other{# másodperc}}</translation>
 <translation id="4971687151119236543">Előző szám</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_id.xtb b/ui/strings/translations/ui_strings_id.xtb
index a4420b4..9372d191 100644
--- a/ui/strings/translations/ui_strings_id.xtb
+++ b/ui/strings/translations/ui_strings_id.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">Gulir ke Kanan</translation>
 <translation id="4820616160060340806">Command+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Tidak ada apa-apa di sini, lihat yang lain saja.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 detik}other{# detik}}</translation>
 <translation id="4971687151119236543">Lacak Media Sebelumnya</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_it.xtb b/ui/strings/translations/ui_strings_it.xtb
index 3197e70..3510682 100644
--- a/ui/strings/translations/ui_strings_it.xtb
+++ b/ui/strings/translations/ui_strings_it.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PGGIÙ</translation>
 <translation id="4588090240171750605">Scorri a destra</translation>
 <translation id="4820616160060340806">Comando+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Nessuna notifica.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 secondo}other{# secondi}}</translation>
 <translation id="4971687151119236543">Traccia precedente contenuti multimediali</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_iw.xtb b/ui/strings/translations/ui_strings_iw.xtb
index 42157416d..8e2a844 100644
--- a/ui/strings/translations/ui_strings_iw.xtb
+++ b/ui/strings/translations/ui_strings_iw.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">דף למטה</translation>
 <translation id="4588090240171750605">גלול ימינה</translation>
 <translation id="4820616160060340806">פקודה+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">אין התראות להצגה, המשך הלאה.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{שנייה אחת}two{# שניות}many{# שניות}other{# שניות}}</translation>
 <translation id="4971687151119236543">רצועה קודמת במדיה</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_ja.xtb b/ui/strings/translations/ui_strings_ja.xtb
index d81177b..0a7bad4 100644
--- a/ui/strings/translations/ui_strings_ja.xtb
+++ b/ui/strings/translations/ui_strings_ja.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PageDown</translation>
 <translation id="4588090240171750605">右にスクロール</translation>
 <translation id="4820616160060340806">Command+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">表示する通知はありません。続行してください。</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 秒}other{# 秒}}</translation>
 <translation id="4971687151119236543">メディアの前のトラック</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_kn.xtb b/ui/strings/translations/ui_strings_kn.xtb
index e2c08210..9993da1 100644
--- a/ui/strings/translations/ui_strings_kn.xtb
+++ b/ui/strings/translations/ui_strings_kn.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">ಬಲಕ್ಕೆ ಸ್ಕ್ರೋಲ್ ಮಾಡಿ</translation>
 <translation id="4820616160060340806">ಕಮಾಂಡ್+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">ಇಲ್ಲಿ ನೋಡಲು ಏನೂ ಇಲ್ಲ, ಮುಂದೆ ಸಾಗಿ.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 ಸೆಕೆಂಡ್}one{# ಸೆಕೆಂಡುಗಳು}other{# ಸೆಕೆಂಡುಗಳು}}</translation>
 <translation id="4971687151119236543">ಮೀಡಿಯಾದ ಹಿಂದಿನ ಟ್ರ್ಯಾಕ್</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_ko.xtb b/ui/strings/translations/ui_strings_ko.xtb
index 3358623..2d43f29e 100644
--- a/ui/strings/translations/ui_strings_ko.xtb
+++ b/ui/strings/translations/ui_strings_ko.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PageDown</translation>
 <translation id="4588090240171750605">오른쪽 스크롤</translation>
 <translation id="4820616160060340806">Command+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">표시할 내용이 없습니다.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1초}other{#초}}</translation>
 <translation id="4971687151119236543">미디어 이전 트랙</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_lt.xtb b/ui/strings/translations/ui_strings_lt.xtb
index ca4e93a..d654d73d 100644
--- a/ui/strings/translations/ui_strings_lt.xtb
+++ b/ui/strings/translations/ui_strings_lt.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">Slinkti į dešinę</translation>
 <translation id="4820616160060340806">„Command“ + „<ph name="KEY_COMBO_NAME" />“</translation>
-<translation id="4927753642311223124">Čia nieko nėra, slinkite toliau.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 sekundė}one{# sekundė}few{# sekundės}many{# sekundės}other{# sekundžių}}</translation>
 <translation id="4971687151119236543">Ankstesnis medijos takelis</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_lv.xtb b/ui/strings/translations/ui_strings_lv.xtb
index fc0b9ad5..55c3aa81 100644
--- a/ui/strings/translations/ui_strings_lv.xtb
+++ b/ui/strings/translations/ui_strings_lv.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">Lejup</translation>
 <translation id="4588090240171750605">Ritināt pa labi</translation>
 <translation id="4820616160060340806">Command+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Te nekā nav, varat doties tālāk!</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 sekunde}zero{# sekundes}one{# sekunde}other{# sekundes}}</translation>
 <translation id="4971687151119236543">Multivide — iepriekšējā dziesma</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_ml.xtb b/ui/strings/translations/ui_strings_ml.xtb
index 5665c7350..6186c525 100644
--- a/ui/strings/translations/ui_strings_ml.xtb
+++ b/ui/strings/translations/ui_strings_ml.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">വലത്തോട്ട് സ്ക്രോള്‍ ചെയ്യുക</translation>
 <translation id="4820616160060340806">കമാൻഡ്+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">ഇവിടെ കാണുന്നതിനായി ഒന്നുമില്ല, തുടരുക.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{ഒരു സെക്കന്‍ഡ്}other{# സെക്കൻഡ്}}</translation>
 <translation id="4971687151119236543">മുമ്പത്തെ മീഡിയ ട്രാക്ക്</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_mr.xtb b/ui/strings/translations/ui_strings_mr.xtb
index 925720e..94a5c92 100644
--- a/ui/strings/translations/ui_strings_mr.xtb
+++ b/ui/strings/translations/ui_strings_mr.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">उजवे स्क्रोल करा</translation>
 <translation id="4820616160060340806">आदेश+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">येथे पाहण्यासाठी काही नाही, पुढे चला.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 सेकंद}one{# सेकंद}other{# सेकंद}}</translation>
 <translation id="4971687151119236543">मीडिया मागील ट्रॅक</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_ms.xtb b/ui/strings/translations/ui_strings_ms.xtb
index 9421641..6d49604b 100644
--- a/ui/strings/translations/ui_strings_ms.xtb
+++ b/ui/strings/translations/ui_strings_ms.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">BwhHlmn</translation>
 <translation id="4588090240171750605">Tatal ke Kanan</translation>
 <translation id="4820616160060340806">Command+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Tiada apa-apa untuk dilihat di sini, teruskan.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 saat}other{# saat}}</translation>
 <translation id="4971687151119236543">Lagu Media Sebelumnya</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_nl.xtb b/ui/strings/translations/ui_strings_nl.xtb
index 2532fdd..cb806fd 100644
--- a/ui/strings/translations/ui_strings_nl.xtb
+++ b/ui/strings/translations/ui_strings_nl.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">Naar rechts bladeren</translation>
 <translation id="4820616160060340806">Command+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Er zijn geen meldingen.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 seconde}other{# seconden}}</translation>
 <translation id="4971687151119236543">Vorige track voor media</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_no.xtb b/ui/strings/translations/ui_strings_no.xtb
index 66d5dd9..774800e 100644
--- a/ui/strings/translations/ui_strings_no.xtb
+++ b/ui/strings/translations/ui_strings_no.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">Rull mot høyre</translation>
 <translation id="4820616160060340806">Kommando + <ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Her er det ikke noe nytt. Men intet nytt er jo godt nytt!</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 sekund}other{# sekunder}}</translation>
 <translation id="4971687151119236543">Media – forrige spor</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_pl.xtb b/ui/strings/translations/ui_strings_pl.xtb
index 213146e9..15f66a53 100644
--- a/ui/strings/translations/ui_strings_pl.xtb
+++ b/ui/strings/translations/ui_strings_pl.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">Przewiń w prawo</translation>
 <translation id="4820616160060340806">Command+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Nic tu nie ma.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 sekunda}few{# sekundy}many{# sekund}other{# sekundy}}</translation>
 <translation id="4971687151119236543">Poprzedni utwór multimedialny</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_pt-BR.xtb b/ui/strings/translations/ui_strings_pt-BR.xtb
index 7d97170..5019ea25 100644
--- a/ui/strings/translations/ui_strings_pt-BR.xtb
+++ b/ui/strings/translations/ui_strings_pt-BR.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">Percorrer à direita</translation>
 <translation id="4820616160060340806">Comando+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Nada para ver aqui, siga em frente.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{Um segundo}one{# segundos}other{# segundos}}</translation>
 <translation id="4971687151119236543">Faixa anterior da mídia</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_pt-PT.xtb b/ui/strings/translations/ui_strings_pt-PT.xtb
index cd00cfa..51bef82 100644
--- a/ui/strings/translations/ui_strings_pt-PT.xtb
+++ b/ui/strings/translations/ui_strings_pt-PT.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">Deslocar-se para a direita</translation>
 <translation id="4820616160060340806">Command + <ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Nada de novo a apresentar por aqui.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 segundo}other{# segundos}}</translation>
 <translation id="4971687151119236543">Faixa anterior de multimédia</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_ro.xtb b/ui/strings/translations/ui_strings_ro.xtb
index 20d0ecd..2a734562 100644
--- a/ui/strings/translations/ui_strings_ro.xtb
+++ b/ui/strings/translations/ui_strings_ro.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">Derulează spre dreapta</translation>
 <translation id="4820616160060340806">Command+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Nimic de văzut aici, treceți mai departe.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{o secundă}few{# secunde}other{# de secunde}}</translation>
 <translation id="4971687151119236543">Melodia anterioară din conținutul media</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_ru.xtb b/ui/strings/translations/ui_strings_ru.xtb
index 032bd21..26103bf 100644
--- a/ui/strings/translations/ui_strings_ru.xtb
+++ b/ui/strings/translations/ui_strings_ru.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">Прокрутка вправо</translation>
 <translation id="4820616160060340806">Command + <ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Оповещений нет.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 секунда}one{# секунда}few{# секунды}many{# секунд}other{# секунды}}</translation>
 <translation id="4971687151119236543">Предыдущий трек</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_sk.xtb b/ui/strings/translations/ui_strings_sk.xtb
index fc96263..55b61790 100644
--- a/ui/strings/translations/ui_strings_sk.xtb
+++ b/ui/strings/translations/ui_strings_sk.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">Rolovať doprava</translation>
 <translation id="4820616160060340806">Command + <ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Tu sa nič nenachádza, pokračujte ďalej.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 sekunda}few{# sekundy}many{# sekundy}other{# sekúnd}}</translation>
 <translation id="4971687151119236543">Média – predchádzajúca stopa</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_sl.xtb b/ui/strings/translations/ui_strings_sl.xtb
index 18df025..f4b5988 100644
--- a/ui/strings/translations/ui_strings_sl.xtb
+++ b/ui/strings/translations/ui_strings_sl.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">Pomik desno</translation>
 <translation id="4820616160060340806">Command + <ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Tu ni ničesar, pomaknite se naprej.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 s}one{# s}two{# s}few{# s}other{# s}}</translation>
 <translation id="4971687151119236543">Prejšnja skladba</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_sr.xtb b/ui/strings/translations/ui_strings_sr.xtb
index 1076cf1..5077cb7 100644
--- a/ui/strings/translations/ui_strings_sr.xtb
+++ b/ui/strings/translations/ui_strings_sr.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">Page Down</translation>
 <translation id="4588090240171750605">Помери надесно</translation>
 <translation id="4820616160060340806">Command + <ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Нема шта да се види овде. Наставите даље.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 секунда}one{# секунда}few{# секунде}other{# секунди}}</translation>
 <translation id="4971687151119236543">Претходна песма медија</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_sv.xtb b/ui/strings/translations/ui_strings_sv.xtb
index 49d40f7..cfb32a4 100644
--- a/ui/strings/translations/ui_strings_sv.xtb
+++ b/ui/strings/translations/ui_strings_sv.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">Page Down</translation>
 <translation id="4588090240171750605">Rulla åt höger</translation>
 <translation id="4820616160060340806">Command + <ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Här finns inget att se, fortsätt.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 sekund}other{# sekunder}}</translation>
 <translation id="4971687151119236543">Föregående spår</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_sw.xtb b/ui/strings/translations/ui_strings_sw.xtb
index 8c459ebf..8f2c6aa 100644
--- a/ui/strings/translations/ui_strings_sw.xtb
+++ b/ui/strings/translations/ui_strings_sw.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">Sogeza Kulia</translation>
 <translation id="4820616160060340806">Amri+ <ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Hakuna cha kuangalia hapa, endelea.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{Sekunde 1}other{Sekunde #}}</translation>
 <translation id="4971687151119236543">Wimbo wa Awali wa Media</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_ta.xtb b/ui/strings/translations/ui_strings_ta.xtb
index 0e520e4..df3a855d 100644
--- a/ui/strings/translations/ui_strings_ta.xtb
+++ b/ui/strings/translations/ui_strings_ta.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">வலப்புறம் உருட்டு</translation>
 <translation id="4820616160060340806">Command+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">பார்க்க இங்கு எதுவுமில்லை, தொடரவும்.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 நொடி}other{# நொடிகள்}}</translation>
 <translation id="4971687151119236543">ஊடகத்தின் முந்தைய டிராக்</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_te.xtb b/ui/strings/translations/ui_strings_te.xtb
index 7fa9e21..48529bf 100644
--- a/ui/strings/translations/ui_strings_te.xtb
+++ b/ui/strings/translations/ui_strings_te.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">కుడికి స్క్రోల్ చెయ్యి</translation>
 <translation id="4820616160060340806">Command+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">ఇక్కడ చూడటానికి ఏమీ లేదు, కొనసాగండి.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 సెకను}other{# సెకన్లు}}</translation>
 <translation id="4971687151119236543">మీడియా మునుపటి ట్రాక్</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_th.xtb b/ui/strings/translations/ui_strings_th.xtb
index 41accc3..149f0e9 100644
--- a/ui/strings/translations/ui_strings_th.xtb
+++ b/ui/strings/translations/ui_strings_th.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">เลื่อนทางขวา</translation>
 <translation id="4820616160060340806">คำสั่ง+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">ที่นี่ไม่มีอะไรต้องดู ไปต่อได้</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 วินาที}other{# วินาที}}</translation>
 <translation id="4971687151119236543">แทร็กก่อนหน้าของสื่อ</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_tr.xtb b/ui/strings/translations/ui_strings_tr.xtb
index d43dc095..771479f 100644
--- a/ui/strings/translations/ui_strings_tr.xtb
+++ b/ui/strings/translations/ui_strings_tr.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">Sağa Kaydır</translation>
 <translation id="4820616160060340806">Command+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Burada görülecek bir şey yok, devam edin.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 saniye}other{# saniye}}</translation>
 <translation id="4971687151119236543">Medya Önceki Parça</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_uk.xtb b/ui/strings/translations/ui_strings_uk.xtb
index 15050853..3237d508 100644
--- a/ui/strings/translations/ui_strings_uk.xtb
+++ b/ui/strings/translations/ui_strings_uk.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">Прокрутка вправо</translation>
 <translation id="4820616160060340806">Command+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Сповіщень немає.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 секунда}one{# секунда}few{# секунди}many{# секунд}other{# секунди}}</translation>
 <translation id="4971687151119236543">Попередня композиція</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_vi.xtb b/ui/strings/translations/ui_strings_vi.xtb
index 02da462..60502f7 100644
--- a/ui/strings/translations/ui_strings_vi.xtb
+++ b/ui/strings/translations/ui_strings_vi.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">Trang Dưới</translation>
 <translation id="4588090240171750605">Cuộn qua Phải</translation>
 <translation id="4820616160060340806">Command+<ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">Không có nội dung nào để xem ở đây, hãy tiếp tục.</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 giây}other{# giây}}</translation>
 <translation id="4971687151119236543">Bản nhạc trước của trình phát phương tiện</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_zh-CN.xtb b/ui/strings/translations/ui_strings_zh-CN.xtb
index 4bbe719..a57abf4 100644
--- a/ui/strings/translations/ui_strings_zh-CN.xtb
+++ b/ui/strings/translations/ui_strings_zh-CN.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">向右滚动</translation>
 <translation id="4820616160060340806">命令键 + <ph name="KEY_COMBO_NAME" /></translation>
-<translation id="4927753642311223124">这里没有任何通知,往前走吧。</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 秒}other{# 秒}}</translation>
 <translation id="4971687151119236543">媒体上一曲</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/strings/translations/ui_strings_zh-TW.xtb b/ui/strings/translations/ui_strings_zh-TW.xtb
index 4b86f65..fadb04b 100644
--- a/ui/strings/translations/ui_strings_zh-TW.xtb
+++ b/ui/strings/translations/ui_strings_zh-TW.xtb
@@ -61,7 +61,6 @@
 <translation id="4552416320897244156">PgDwn</translation>
 <translation id="4588090240171750605">向右捲動</translation>
 <translation id="4820616160060340806">Command + <ph name="KEY_COMBO_NAME" /> 鍵</translation>
-<translation id="4927753642311223124">這裡沒有任何通知訊息,以後再來看看吧!</translation>
 <translation id="4968171027979920686">{SECONDS,plural, =1{1 秒}other{# 秒}}</translation>
 <translation id="4971687151119236543">上一首媒體曲目</translation>
 <translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME" /></translation>
diff --git a/ui/surface/surface.gyp b/ui/surface/surface.gyp
index e45e2ae8..f4be6f75 100644
--- a/ui/surface/surface.gyp
+++ b/ui/surface/surface.gyp
@@ -26,6 +26,7 @@
         '../base/ui_base.gyp:ui_base',
         '../gfx/gfx.gyp:gfx_geometry',
         '../gl/gl.gyp:gl',
+        '../gl/init/gl_init.gyp:gl_init',
       ],
       'sources': [
         'surface_export.h',
diff --git a/ui/views/BUILD.gn b/ui/views/BUILD.gn
index 63745f5..0d664bc 100644
--- a/ui/views/BUILD.gn
+++ b/ui/views/BUILD.gn
@@ -178,7 +178,10 @@
     "//ui/gfx/geometry",
   ]
 
-  sources += [ "test/platform_test_helper.h" ]
+  sources += [
+    "test/platform_test_helper.cc",
+    "test/platform_test_helper.h",
+  ]
 
   if (use_aura) {
     sources += gypi_values.views_test_support_aura_sources
@@ -208,7 +211,6 @@
     ":test_support_internal",
   ]
   sources = [
-    "test/default_platform_test_helper.cc",
     "test/native_widget_factory_desktop.cc",
   ]
 }
diff --git a/ui/views/animation/button_ink_drop_delegate.cc b/ui/views/animation/button_ink_drop_delegate.cc
index 02634f0..3862e87 100644
--- a/ui/views/animation/button_ink_drop_delegate.cc
+++ b/ui/views/animation/button_ink_drop_delegate.cc
@@ -35,6 +35,10 @@
   ink_drop_->SetHovered(is_hovered);
 }
 
+InkDropState ButtonInkDropDelegate::GetTargetInkDropState() const {
+  return ink_drop_->GetTargetInkDropState();
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // ui::EventHandler:
 
diff --git a/ui/views/animation/button_ink_drop_delegate.h b/ui/views/animation/button_ink_drop_delegate.h
index 31c123c..aa9330d2 100644
--- a/ui/views/animation/button_ink_drop_delegate.h
+++ b/ui/views/animation/button_ink_drop_delegate.h
@@ -41,6 +41,7 @@
   void OnAction(InkDropState state) override;
   void SnapToActivated() override;
   void SetHovered(bool is_hovered) override;
+  InkDropState GetTargetInkDropState() const override;
 
   // ui::EventHandler:
   void OnMouseEvent(ui::MouseEvent* event) override;
diff --git a/ui/views/animation/ink_drop_delegate.h b/ui/views/animation/ink_drop_delegate.h
index 6123524..545f5be 100644
--- a/ui/views/animation/ink_drop_delegate.h
+++ b/ui/views/animation/ink_drop_delegate.h
@@ -35,6 +35,9 @@
   // Enables or disables the hover state.
   virtual void SetHovered(bool is_hovered) = 0;
 
+  // Returns the current InkDropState
+  virtual InkDropState GetTargetInkDropState() const = 0;
+
  private:
   DISALLOW_COPY_AND_ASSIGN(InkDropDelegate);
 };
diff --git a/ui/views/animation/test/test_ink_drop_delegate.cc b/ui/views/animation/test/test_ink_drop_delegate.cc
index a251d78a..4fa9743b 100644
--- a/ui/views/animation/test/test_ink_drop_delegate.cc
+++ b/ui/views/animation/test/test_ink_drop_delegate.cc
@@ -24,5 +24,9 @@
   is_hovered_ = is_hovered;
 }
 
+InkDropState TestInkDropDelegate::GetTargetInkDropState() const {
+  return state_;
+}
+
 }  // namespace test
 }  // namespace views
diff --git a/ui/views/animation/test/test_ink_drop_delegate.h b/ui/views/animation/test/test_ink_drop_delegate.h
index a3eee3e..fdcaad3 100644
--- a/ui/views/animation/test/test_ink_drop_delegate.h
+++ b/ui/views/animation/test/test_ink_drop_delegate.h
@@ -16,14 +16,13 @@
   TestInkDropDelegate();
   ~TestInkDropDelegate() override;
 
-  InkDropState state() const { return state_; }
-
   bool is_hovered() const { return is_hovered_; }
 
   // InkDropDelegate:
   void OnAction(InkDropState state) override;
   void SnapToActivated() override;
   void SetHovered(bool is_hovered) override;
+  InkDropState GetTargetInkDropState() const override;
 
  private:
   InkDropState state_;
diff --git a/ui/views/controls/button/custom_button.cc b/ui/views/controls/button/custom_button.cc
index 770f92f..527a6d8 100644
--- a/ui/views/controls/button/custom_button.cc
+++ b/ui/views/controls/button/custom_button.cc
@@ -268,6 +268,10 @@
   // KeyRelease and Enter clicks the button on KeyPressed.
   if (event.key_code() == ui::VKEY_SPACE) {
     SetState(STATE_PRESSED);
+    if (ink_drop_delegate_ &&
+        ink_drop_delegate_->GetTargetInkDropState() !=
+            views::InkDropState::ACTION_PENDING)
+      ink_drop_delegate_->OnAction(views::InkDropState::ACTION_PENDING);
   } else if (event.key_code() == ui::VKEY_RETURN) {
     SetState(STATE_NORMAL);
     NotifyClick(event);
diff --git a/ui/views/controls/button/custom_button_unittest.cc b/ui/views/controls/button/custom_button_unittest.cc
index 1f9388ce..4b9ca78c 100644
--- a/ui/views/controls/button/custom_button_unittest.cc
+++ b/ui/views/controls/button/custom_button_unittest.cc
@@ -86,7 +86,7 @@
 };
 
 // An InkDropDelegate that keeps track of ink drop visibility.
-class TestInkDropDelegateThatTracksVisibilty : public InkDropDelegate {
+class TestInkDropDelegateThatTracksVisibilty : public TestInkDropDelegate {
  public:
   TestInkDropDelegateThatTracksVisibilty(bool* ink_shown, bool* ink_hidden)
       : ink_shown_(ink_shown), ink_hidden_(ink_hidden) {}
@@ -94,7 +94,8 @@
 
   // InkDropDelegate:
   void OnAction(InkDropState state) override {
-    switch (state) {
+    TestInkDropDelegate::OnAction(state);
+    switch (GetTargetInkDropState()) {
       case InkDropState::ACTION_PENDING:
       case InkDropState::ALTERNATE_ACTION_PENDING:
       case InkDropState::ACTIVATED:
@@ -448,7 +449,7 @@
   button()->ShowContextMenu(gfx::Point(), ui::MENU_SOURCE_MOUSE);
 
   EXPECT_FALSE(ink_drop_delegate->is_hovered());
-  EXPECT_EQ(InkDropState::HIDDEN, ink_drop_delegate->state());
+  EXPECT_EQ(InkDropState::HIDDEN, ink_drop_delegate->GetTargetInkDropState());
 }
 
 TEST_F(CustomButtonTest, DontHideInkDropWhenShowingContextMenu) {
@@ -464,7 +465,8 @@
   button()->ShowContextMenu(gfx::Point(), ui::MENU_SOURCE_MOUSE);
 
   EXPECT_TRUE(ink_drop_delegate->is_hovered());
-  EXPECT_EQ(InkDropState::ACTION_PENDING, ink_drop_delegate->state());
+  EXPECT_EQ(InkDropState::ACTION_PENDING,
+            ink_drop_delegate->GetTargetInkDropState());
 }
 
 TEST_F(CustomButtonTest, InkDropAfterTryingToShowContextMenu) {
@@ -478,7 +480,8 @@
   button()->ShowContextMenu(gfx::Point(), ui::MENU_SOURCE_MOUSE);
 
   EXPECT_TRUE(ink_drop_delegate->is_hovered());
-  EXPECT_EQ(InkDropState::ACTION_PENDING, ink_drop_delegate->state());
+  EXPECT_EQ(InkDropState::ACTION_PENDING,
+            ink_drop_delegate->GetTargetInkDropState());
 }
 
 }  // namespace views
diff --git a/ui/views/controls/button/menu_button_unittest.cc b/ui/views/controls/button/menu_button_unittest.cc
index 86ee12b..e34315e 100644
--- a/ui/views/controls/button/menu_button_unittest.cc
+++ b/ui/views/controls/button/menu_button_unittest.cc
@@ -437,7 +437,7 @@
   button()->set_ink_drop_delegate(&ink_drop_delegate);
   button()->Activate(nullptr);
 
-  EXPECT_EQ(InkDropState::HIDDEN, ink_drop_delegate.state());
+  EXPECT_EQ(InkDropState::HIDDEN, ink_drop_delegate.GetTargetInkDropState());
 }
 
 TEST_F(MenuButtonTest,
@@ -448,7 +448,8 @@
   button()->set_ink_drop_delegate(&ink_drop_delegate);
   button()->Activate(nullptr);
 
-  EXPECT_EQ(InkDropState::ACTION_TRIGGERED, ink_drop_delegate.state());
+  EXPECT_EQ(InkDropState::ACTION_TRIGGERED,
+            ink_drop_delegate.GetTargetInkDropState());
 }
 
 TEST_F(
@@ -461,7 +462,7 @@
   button()->set_ink_drop_delegate(&ink_drop_delegate);
   button()->Activate(nullptr);
 
-  EXPECT_EQ(InkDropState::ACTIVATED, ink_drop_delegate.state());
+  EXPECT_EQ(InkDropState::ACTIVATED, ink_drop_delegate.GetTargetInkDropState());
 
   // Prevent the button from accessing invalid memory during clean up.
   button()->set_ink_drop_delegate(nullptr);
@@ -476,7 +477,8 @@
   button()->set_ink_drop_delegate(&ink_drop_delegate);
   button()->Activate(nullptr);
 
-  EXPECT_EQ(InkDropState::DEACTIVATED, ink_drop_delegate.state());
+  EXPECT_EQ(InkDropState::DEACTIVATED,
+            ink_drop_delegate.GetTargetInkDropState());
 }
 
 TEST_F(MenuButtonTest, InkDropStateForMenuButtonsWithPressedLocks) {
@@ -487,18 +489,19 @@
   std::unique_ptr<MenuButton::PressedLock> pressed_lock1(
       new MenuButton::PressedLock(button()));
 
-  EXPECT_EQ(InkDropState::ACTIVATED, ink_drop_delegate.state());
+  EXPECT_EQ(InkDropState::ACTIVATED, ink_drop_delegate.GetTargetInkDropState());
 
   std::unique_ptr<MenuButton::PressedLock> pressed_lock2(
       new MenuButton::PressedLock(button()));
 
-  EXPECT_EQ(InkDropState::ACTIVATED, ink_drop_delegate.state());
+  EXPECT_EQ(InkDropState::ACTIVATED, ink_drop_delegate.GetTargetInkDropState());
 
   pressed_lock1.reset();
-  EXPECT_EQ(InkDropState::ACTIVATED, ink_drop_delegate.state());
+  EXPECT_EQ(InkDropState::ACTIVATED, ink_drop_delegate.GetTargetInkDropState());
 
   pressed_lock2.reset();
-  EXPECT_EQ(InkDropState::DEACTIVATED, ink_drop_delegate.state());
+  EXPECT_EQ(InkDropState::DEACTIVATED,
+            ink_drop_delegate.GetTargetInkDropState());
 }
 
 // Verifies only one ink drop animation is triggered when multiple PressedLocks
@@ -511,13 +514,14 @@
   std::unique_ptr<MenuButton::PressedLock> pressed_lock1(
       new MenuButton::PressedLock(button()));
 
-  EXPECT_EQ(InkDropState::ACTIVATED, ink_drop_delegate.state());
+  EXPECT_EQ(InkDropState::ACTIVATED, ink_drop_delegate.GetTargetInkDropState());
   ink_drop_delegate.OnAction(InkDropState::ACTION_PENDING);
 
   std::unique_ptr<MenuButton::PressedLock> pressed_lock2(
       new MenuButton::PressedLock(button()));
 
-  EXPECT_EQ(InkDropState::ACTION_PENDING, ink_drop_delegate.state());
+  EXPECT_EQ(InkDropState::ACTION_PENDING,
+            ink_drop_delegate.GetTargetInkDropState());
 }
 
 // Verifies the InkDropState is left as ACTIVATED if a PressedLock is active
@@ -532,7 +536,7 @@
 
   button()->Activate(nullptr);
 
-  EXPECT_EQ(InkDropState::ACTIVATED, ink_drop_delegate.state());
+  EXPECT_EQ(InkDropState::ACTIVATED, ink_drop_delegate.GetTargetInkDropState());
 }
 
 #if defined(USE_AURA)
diff --git a/ui/views/controls/menu/menu_controller.cc b/ui/views/controls/menu/menu_controller.cc
index 1dde6bc..030600f 100644
--- a/ui/views/controls/menu/menu_controller.cc
+++ b/ui/views/controls/menu/menu_controller.cc
@@ -2669,15 +2669,19 @@
 void MenuController::SetHotTrackedButton(CustomButton* hot_button) {
   if (hot_button == hot_button_) {
     // Hot-tracked state may change outside of the MenuController. Correct it.
-    if (hot_button && !hot_button->IsHotTracked())
+    if (hot_button && !hot_button->IsHotTracked()) {
       hot_button->SetHotTracked(true);
+      hot_button->NotifyAccessibilityEvent(ui::AX_EVENT_SELECTION, true);
+    }
     return;
   }
   if (hot_button_)
     hot_button_->SetHotTracked(false);
   hot_button_ = hot_button;
-  if (hot_button)
+  if (hot_button) {
     hot_button->SetHotTracked(true);
+    hot_button->NotifyAccessibilityEvent(ui::AX_EVENT_SELECTION, true);
+  }
 }
 
 }  // namespace views
diff --git a/ui/views/controls/menu/menu_runner_unittest.cc b/ui/views/controls/menu/menu_runner_unittest.cc
index 2f6db02..6d76f7e 100644
--- a/ui/views/controls/menu/menu_runner_unittest.cc
+++ b/ui/views/controls/menu/menu_runner_unittest.cc
@@ -18,7 +18,9 @@
 #include "ui/views/controls/menu/menu_types.h"
 #include "ui/views/controls/menu/submenu_view.h"
 #include "ui/views/test/menu_test_utils.h"
+#include "ui/views/test/test_views.h"
 #include "ui/views/test/views_test_base.h"
+#include "ui/views/widget/native_widget_private.h"
 #include "ui/views/widget/widget.h"
 
 namespace views {
@@ -186,6 +188,72 @@
   EXPECT_EQ(MenuRunner::NORMAL_EXIT, delegate->on_menu_closed_run_result());
 }
 
+namespace {
+
+// An EventHandler that launches a menu in response to a mouse press.
+class MenuLauncherEventHandler : public ui::EventHandler {
+ public:
+  MenuLauncherEventHandler(MenuRunner* runner, Widget* owner)
+      : runner_(runner), owner_(owner) {}
+  ~MenuLauncherEventHandler() override {}
+
+ private:
+  // ui::EventHandler:
+  void OnMouseEvent(ui::MouseEvent* event) override {
+    if (event->type() == ui::ET_MOUSE_PRESSED) {
+      runner_->RunMenuAt(owner_, nullptr, gfx::Rect(), MENU_ANCHOR_TOPLEFT,
+                         ui::MENU_SOURCE_NONE);
+      event->SetHandled();
+    }
+  }
+
+  MenuRunner* runner_;
+  Widget* owner_;
+
+  DISALLOW_COPY_AND_ASSIGN(MenuLauncherEventHandler);
+};
+
+}  // namespace
+
+// Tests that when a mouse press launches a menu, that the target widget does
+// not take explicit capture, nor closes the menu.
+TEST_F(MenuRunnerTest, WidgetDoesntTakeCapture) {
+  Widget* widget = new Widget;
+  Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
+  widget->Init(params);
+  widget->Show();
+  widget->SetSize(gfx::Size(300, 300));
+
+  EventCountView* event_count_view = new EventCountView();
+  event_count_view->SetBounds(0, 0, 300, 300);
+  widget->GetRootView()->AddChildView(event_count_view);
+
+  InitMenuRunner(MenuRunner::ASYNC);
+  MenuRunner* runner = menu_runner();
+
+  MenuLauncherEventHandler consumer(runner, owner());
+  event_count_view->AddPostTargetHandler(&consumer);
+  EXPECT_EQ(nullptr, internal::NativeWidgetPrivate::GetGlobalCapture(
+                         widget->GetNativeView()));
+  std::unique_ptr<ui::test::EventGenerator> generator(
+      new ui::test::EventGenerator(
+          IsMus() ? widget->GetNativeWindow() : GetContext(),
+          widget->GetNativeWindow()));
+  // Implicit capture should not be held by |widget|.
+  generator->PressLeftButton();
+  EXPECT_EQ(1, event_count_view->GetEventCount(ui::ET_MOUSE_PRESSED));
+  EXPECT_NE(
+      widget->GetNativeView(),
+      internal::NativeWidgetPrivate::GetGlobalCapture(widget->GetNativeView()));
+
+  // The menu should still be open.
+  TestMenuDelegate* delegate = menu_delegate();
+  EXPECT_TRUE(runner->IsRunning());
+  EXPECT_EQ(0, delegate->on_menu_closed_called());
+
+  widget->CloseNow();
+}
+
 typedef MenuRunnerTest MenuRunnerImplTest;
 
 // Tests that when nested menu runners are destroyed out of order, that
diff --git a/ui/views/examples/BUILD.gn b/ui/views/examples/BUILD.gn
index 6aed028f..5e1cfb6 100644
--- a/ui/views/examples/BUILD.gn
+++ b/ui/views/examples/BUILD.gn
@@ -110,7 +110,7 @@
     "//ui/compositor",
     "//ui/compositor:test_support",
     "//ui/gfx",
-    "//ui/gl",
+    "//ui/gl/init",
     "//ui/resources:ui_test_pak",
     "//ui/views",
     "//ui/views:test_support",
diff --git a/ui/views/examples/DEPS b/ui/views/examples/DEPS
index 06e440bb..47e7bcd 100644
--- a/ui/views/examples/DEPS
+++ b/ui/views/examples/DEPS
@@ -2,6 +2,6 @@
   "+content/public",
   "+content/shell",
   "+sandbox",
-  "+ui/gl/gl_surface.h",  # To initialize GL bindings.
+  "+ui/gl/init/gl_factory.h",  # To initialize GL bindings.
   "+ui/views_content_client",
 ]
diff --git a/ui/views/examples/examples_main.cc b/ui/views/examples/examples_main.cc
index 8151ed72..d3889a89 100644
--- a/ui/views/examples/examples_main.cc
+++ b/ui/views/examples/examples_main.cc
@@ -21,7 +21,7 @@
 #include "ui/base/ui_base_paths.h"
 #include "ui/compositor/test/in_process_context_factory.h"
 #include "ui/display/screen.h"
-#include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 #include "ui/views/examples/example_base.h"
 #include "ui/views/examples/examples_window.h"
 #include "ui/views/test/desktop_test_views_delegate.h"
@@ -59,7 +59,7 @@
   gfx::InitializeThreadedX11();
 #endif
 
-  gfx::GLSurface::InitializeOneOff();
+  gl::init::InitializeGLOneOff();
 
   // The ContextFactory must exist before any Compositors are created.
   bool context_factory_for_test = false;
diff --git a/ui/views/mus/BUILD.gn b/ui/views/mus/BUILD.gn
index 31563b9fe..8742d05 100644
--- a/ui/views/mus/BUILD.gn
+++ b/ui/views/mus/BUILD.gn
@@ -141,7 +141,6 @@
     "../widget/native_widget_unittest.cc",
     "../widget/widget_unittest.cc",
     "native_widget_mus_unittest.cc",
-    "platform_test_helper_mus.cc",
     "platform_window_mus_unittest.cc",
     "run_all_unittests_mus.cc",
     "screen_mus_unittest.cc",
diff --git a/ui/views/mus/DEPS b/ui/views/mus/DEPS
index de9eca4..7589ba3 100644
--- a/ui/views/mus/DEPS
+++ b/ui/views/mus/DEPS
@@ -24,7 +24,7 @@
 ]
 
 specific_include_rules = {
-  "platform_test_helper_mus.cc": [
+  "run_all_unittests_mus.cc": [
     "+services/shell/background",
   ],
 }
diff --git a/ui/views/mus/platform_test_helper_mus.cc b/ui/views/mus/platform_test_helper_mus.cc
deleted file mode 100644
index bffdbc6..0000000
--- a/ui/views/mus/platform_test_helper_mus.cc
+++ /dev/null
@@ -1,99 +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 "base/command_line.h"
-#include "base/memory/ptr_util.h"
-#include "base/run_loop.h"
-#include "services/shell/background/background_shell.h"
-#include "services/shell/background/tests/test_catalog_store.h"
-#include "services/shell/public/cpp/connector.h"
-#include "services/shell/public/cpp/shell_client.h"
-#include "services/shell/public/cpp/shell_connection.h"
-#include "ui/aura/env.h"
-#include "ui/views/mus/window_manager_connection.h"
-#include "ui/views/test/platform_test_helper.h"
-#include "ui/views/views_delegate.h"
-
-using shell::BackgroundShell;
-
-namespace views {
-namespace {
-
-const char kTestName[] = "exe:views_mus_unittests";
-
-class DefaultShellClient : public shell::ShellClient {
- public:
-  DefaultShellClient() {}
-  ~DefaultShellClient() override {}
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(DefaultShellClient);
-};
-
-class PlatformTestHelperMus : public PlatformTestHelper {
- public:
-  PlatformTestHelperMus() {
-    background_shell_.reset(new BackgroundShell);
-    background_shell_->Init(nullptr);
-    shell_client_.reset(new DefaultShellClient);
-    shell_connection_.reset(new shell::ShellConnection(
-        shell_client_.get(),
-        background_shell_->CreateShellClientRequest(kTestName)));
-
-    // TODO(rockot): Remove this RunLoop. http://crbug.com/594852.
-    base::RunLoop wait_loop;
-    shell_connection_->set_initialize_handler(wait_loop.QuitClosure());
-    wait_loop.Run();
-
-    // ui/views/mus requires a WindowManager running, for now use the desktop
-    // one.
-    shell::Connector* connector = shell_connection_->connector();
-    connector->Connect("mojo:desktop_wm");
-    WindowManagerConnection::Create(connector, shell_connection_->identity());
-
-    // On X we need to reset the ContextFactory before every NativeWidgetMus
-    // is created.
-    // TODO(sad): this is a hack, figure out a better solution.
-    ViewsDelegate::GetInstance()->set_native_widget_factory(base::Bind(
-        &PlatformTestHelperMus::CreateNativeWidgetMus, base::Unretained(this),
-        std::map<std::string, std::vector<uint8_t>>()));
-  }
-
-  ~PlatformTestHelperMus() override {
-    WindowManagerConnection::Reset();
-    // |app_| has a reference to us, destroy it while we are still valid.
-    shell_connection_.reset();
-  }
-
-  bool IsMus() const override { return true; }
-
- private:
-  NativeWidget* CreateNativeWidgetMus(
-      const std::map<std::string, std::vector<uint8_t>>& props,
-      const Widget::InitParams& init_params,
-      internal::NativeWidgetDelegate* delegate) {
-    ui::ContextFactory* factory = aura::Env::GetInstance()->context_factory();
-    aura::Env::GetInstance()->set_context_factory(nullptr);
-    NativeWidget* result =
-        WindowManagerConnection::Get()->CreateNativeWidgetMus(
-            props, init_params, delegate);
-    aura::Env::GetInstance()->set_context_factory(factory);
-    return result;
-  }
-
-  std::unique_ptr<BackgroundShell> background_shell_;
-  std::unique_ptr<shell::ShellConnection> shell_connection_;
-  std::unique_ptr<DefaultShellClient> shell_client_;
-
-  DISALLOW_COPY_AND_ASSIGN(PlatformTestHelperMus);
-};
-
-}  // namespace
-
-// static
-std::unique_ptr<PlatformTestHelper> PlatformTestHelper::Create() {
-  return base::WrapUnique(new PlatformTestHelperMus);
-}
-
-}  // namespace views
diff --git a/ui/views/mus/run_all_unittests_mus.cc b/ui/views/mus/run_all_unittests_mus.cc
index 4de8cdb..52bc71a 100644
--- a/ui/views/mus/run_all_unittests_mus.cc
+++ b/ui/views/mus/run_all_unittests_mus.cc
@@ -4,6 +4,141 @@
 
 #include "ui/views/run_all_unittests.h"
 
+#include <memory>
+
+#include "base/run_loop.h"
+#include "base/synchronization/waitable_event.h"
+#include "base/threading/simple_thread.h"
+#include "base/threading/thread.h"
+#include "services/shell/background/background_shell.h"
+#include "services/shell/public/cpp/connector.h"
+#include "services/shell/public/cpp/shell_client.h"
+#include "services/shell/public/cpp/shell_connection.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/views/mus/window_manager_connection.h"
+#include "ui/views/test/platform_test_helper.h"
+#include "ui/views/views_delegate.h"
+
+namespace views {
+namespace {
+
+const char kTestName[] = "exe:views_mus_unittests";
+
+class DefaultShellClient : public shell::ShellClient {
+ public:
+  DefaultShellClient() {}
+  ~DefaultShellClient() override {}
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(DefaultShellClient);
+};
+
+class PlatformTestHelperMus : public PlatformTestHelper {
+ public:
+  PlatformTestHelperMus() {}
+  ~PlatformTestHelperMus() override {}
+
+  // PlatformTestHelper:
+  bool IsMus() const override { return true; }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(PlatformTestHelperMus);
+};
+
+std::unique_ptr<PlatformTestHelper> CreatePlatformTestHelper(
+    shell::Connector* connector,
+    const shell::Identity& identity) {
+  if (!WindowManagerConnection::Exists())
+    WindowManagerConnection::Create(connector, identity);
+  return base::WrapUnique(new PlatformTestHelperMus);
+}
+
+class ShellConnection {
+ public:
+  ShellConnection() : thread_("Persistent shell connections") {
+    base::WaitableEvent wait(false, false);
+    base::Thread::Options options;
+    thread_.StartWithOptions(options);
+    thread_.task_runner()->PostTask(
+        FROM_HERE, base::Bind(&ShellConnection::SetUpConnections,
+                              base::Unretained(this), &wait));
+    wait.Wait();
+
+    // WindowManagerConnection cannot be created from here yet, although the
+    // connector and identity are available at this point. This is because
+    // WindowManagerConnection needs a ViewsDelegate and a MessageLoop to have
+    // been installed first. So delay the creation until the necessary
+    // dependencies have been met.
+    PlatformTestHelper::set_factory(base::Bind(
+        &CreatePlatformTestHelper, shell_connector_.get(), shell_identity_));
+  }
+
+  ~ShellConnection() {
+    views::WindowManagerConnection::Reset();
+    base::WaitableEvent wait(false, false);
+    thread_.task_runner()->PostTask(
+        FROM_HERE, base::Bind(&ShellConnection::TearDownConnections,
+                              base::Unretained(this), &wait));
+    wait.Wait();
+  }
+
+ private:
+  void SetUpConnections(base::WaitableEvent* wait) {
+    background_shell_.reset(new shell::BackgroundShell);
+    background_shell_->Init(nullptr);
+    shell_client_.reset(new DefaultShellClient);
+    shell_connection_.reset(new shell::ShellConnection(
+        shell_client_.get(),
+        background_shell_->CreateShellClientRequest(kTestName)));
+
+    // ui/views/mus requires a WindowManager running, for now use the desktop
+    // one.
+    shell::Connector* connector = shell_connection_->connector();
+    connector->Connect("mojo:desktop_wm");
+    shell_connector_ = connector->Clone();
+    shell_identity_ = shell_connection_->identity();
+    wait->Signal();
+  }
+
+  void TearDownConnections(base::WaitableEvent* wait) {
+    shell_connection_.reset();
+    wait->Signal();
+  }
+
+  base::Thread thread_;
+  std::unique_ptr<shell::BackgroundShell> background_shell_;
+  std::unique_ptr<shell::ShellConnection> shell_connection_;
+  std::unique_ptr<DefaultShellClient> shell_client_;
+  std::unique_ptr<shell::Connector> shell_connector_;
+  shell::Identity shell_identity_;
+
+  DISALLOW_COPY_AND_ASSIGN(ShellConnection);
+};
+
+class ViewMusTestSuite : public ViewTestSuite {
+ public:
+  ViewMusTestSuite(int argc, char** argv) : ViewTestSuite(argc, argv) {}
+
+ protected:
+  void Initialize() override {
+    ViewTestSuite::Initialize();
+    shell_connections_.reset(new ShellConnection);
+  }
+
+  void Shutdown() override {
+    shell_connections_.reset();
+    ViewTestSuite::Shutdown();
+  }
+
+ private:
+  std::unique_ptr<ShellConnection> shell_connections_;
+
+  DISALLOW_COPY_AND_ASSIGN(ViewMusTestSuite);
+};
+
+}  // namespace
+}  // namespace views
+
 int MasterProcessMain(int argc, char** argv) {
-  return views::RunAllUnittests(argc, argv);
+  return views::ViewMusTestSuite(argc, argv).RunTests();
 }
diff --git a/ui/views/run_all_unittests.cc b/ui/views/run_all_unittests.cc
index 7ffeac9e..19f72a6 100644
--- a/ui/views/run_all_unittests.cc
+++ b/ui/views/run_all_unittests.cc
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "ui/views/run_all_unittests.h"
+
 #include "base/bind.h"
 #include "base/compiler_specific.h"
 #include "base/macros.h"
@@ -21,45 +23,35 @@
 
 namespace views {
 
-class ViewTestSuite : public base::TestSuite {
- public:
-  ViewTestSuite(int argc, char** argv) : base::TestSuite(argc, argv) {}
+ViewTestSuite::ViewTestSuite(int argc, char** argv)
+    : base::TestSuite(argc, argv), argc_(argc), argv_(argv) {}
 
- protected:
-  void Initialize() override {
-    base::TestSuite::Initialize();
-    gfx::GLSurfaceTestSupport::InitializeOneOff();
-    ui::RegisterPathProvider();
+ViewTestSuite::~ViewTestSuite() {}
 
-    base::FilePath ui_test_pak_path;
-    ASSERT_TRUE(PathService::Get(ui::UI_TEST_PAK, &ui_test_pak_path));
-    ui::ResourceBundle::InitSharedInstanceWithPakPath(ui_test_pak_path);
-#if defined(USE_AURA)
-    env_ = aura::Env::CreateInstance();
-#endif
-  }
-
-  void Shutdown() override {
-#if defined(USE_AURA)
-    env_.reset();
-#endif
-    ui::ResourceBundle::CleanupSharedInstance();
-    base::TestSuite::Shutdown();
-  }
-
- private:
-#if defined(USE_AURA)
-  std::unique_ptr<aura::Env> env_;
-#endif
-  DISALLOW_COPY_AND_ASSIGN(ViewTestSuite);
-};
-
-int RunAllUnittests(int argc, char** argv) {
-  ViewTestSuite test_suite(argc, argv);
-
+int ViewTestSuite::RunTests() {
   return base::LaunchUnitTests(
-      argc, argv, base::Bind(&ViewTestSuite::Run,
-                             base::Unretained(&test_suite)));
+      argc_, argv_, base::Bind(&ViewTestSuite::Run, base::Unretained(this)));
+}
+
+void ViewTestSuite::Initialize() {
+  base::TestSuite::Initialize();
+  gfx::GLSurfaceTestSupport::InitializeOneOff();
+  ui::RegisterPathProvider();
+
+  base::FilePath ui_test_pak_path;
+  ASSERT_TRUE(PathService::Get(ui::UI_TEST_PAK, &ui_test_pak_path));
+  ui::ResourceBundle::InitSharedInstanceWithPakPath(ui_test_pak_path);
+#if defined(USE_AURA)
+  env_ = aura::Env::CreateInstance();
+#endif
+}
+
+void ViewTestSuite::Shutdown() {
+#if defined(USE_AURA)
+  env_.reset();
+#endif
+  ui::ResourceBundle::CleanupSharedInstance();
+  base::TestSuite::Shutdown();
 }
 
 }  // namespace views
diff --git a/ui/views/run_all_unittests.h b/ui/views/run_all_unittests.h
index 43239f8..ded03f3 100644
--- a/ui/views/run_all_unittests.h
+++ b/ui/views/run_all_unittests.h
@@ -5,9 +5,40 @@
 #ifndef UI_VIEWS_RUN_ALL_UNITTESTS_H_
 #define UI_VIEWS_RUN_ALL_UNITTESTS_H_
 
+#include "base/callback_forward.h"
+#include "base/test/test_suite.h"
+
+#if defined(USE_AURA)
+#include <memory>
+#endif
+
+namespace aura {
+class Env;
+}
+
 namespace views {
 
-int RunAllUnittests(int argc, char** argv);
+class ViewTestSuite : public base::TestSuite {
+ public:
+  ViewTestSuite(int argc, char** argv);
+  ~ViewTestSuite() override;
+
+  int RunTests();
+
+ protected:
+  // base::TestSuite:
+  void Initialize() override;
+  void Shutdown() override;
+
+ private:
+#if defined(USE_AURA)
+  std::unique_ptr<aura::Env> env_;
+#endif
+  int argc_;
+  char** argv_;
+
+  DISALLOW_COPY_AND_ASSIGN(ViewTestSuite);
+};
 
 }  // namespace
 
diff --git a/ui/views/run_all_unittests_main.cc b/ui/views/run_all_unittests_main.cc
index 5b26c76..9df3dbd 100644
--- a/ui/views/run_all_unittests_main.cc
+++ b/ui/views/run_all_unittests_main.cc
@@ -5,5 +5,5 @@
 #include "ui/views/run_all_unittests.h"
 
 int main(int argc, char** argv) {
-  views::RunAllUnittests(argc, argv);
+  return views::ViewTestSuite(argc, argv).RunTests();
 }
diff --git a/ui/views/test/native_widget_factory_mus.cc b/ui/views/test/native_widget_factory_mus.cc
index 495c48e..9469c0c 100644
--- a/ui/views/test/native_widget_factory_mus.cc
+++ b/ui/views/test/native_widget_factory_mus.cc
@@ -4,7 +4,6 @@
 
 #include "ui/views/test/native_widget_factory.h"
 
-#include "ui/aura/env.h"
 #include "ui/views/mus/window_manager_connection.h"
 
 namespace views {
@@ -14,15 +13,8 @@
     const Widget::InitParams& init_params,
     Widget* widget,
     bool* destroyed) {
-  // On X we need to reset the ContextFactory before every NativeWidgetMus
-  // is created.
-  // TODO(sad): this is a hack, figure out a better solution.
-  ui::ContextFactory* factory = aura::Env::GetInstance()->context_factory();
-  aura::Env::GetInstance()->set_context_factory(nullptr);
-  NativeWidget* result = WindowManagerConnection::Get()->CreateNativeWidgetMus(
+  return WindowManagerConnection::Get()->CreateNativeWidgetMus(
       std::map<std::string, std::vector<uint8_t>>(), init_params, widget);
-  aura::Env::GetInstance()->set_context_factory(factory);
-  return result;
 }
 
 }  // namespace test
diff --git a/ui/views/test/default_platform_test_helper.cc b/ui/views/test/platform_test_helper.cc
similarity index 63%
rename from ui/views/test/default_platform_test_helper.cc
rename to ui/views/test/platform_test_helper.cc
index 8d49876..a415ff9a 100644
--- a/ui/views/test/default_platform_test_helper.cc
+++ b/ui/views/test/platform_test_helper.cc
@@ -2,9 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/memory/ptr_util.h"
 #include "ui/views/test/platform_test_helper.h"
 
+#include "base/callback.h"
+#include "base/logging.h"
+#include "base/memory/ptr_util.h"
+
 namespace views {
 namespace {
 
@@ -20,11 +23,20 @@
   DISALLOW_COPY_AND_ASSIGN(DefaultPlatformTestHelper);
 };
 
+PlatformTestHelper::Factory test_helper_factory;
+
 }  // namespace
 
+void PlatformTestHelper::set_factory(const Factory& factory) {
+  DCHECK(test_helper_factory.is_null());
+  test_helper_factory = factory;
+}
+
 // static
 std::unique_ptr<PlatformTestHelper> PlatformTestHelper::Create() {
-  return base::WrapUnique(new DefaultPlatformTestHelper);
+  return !test_helper_factory.is_null()
+             ? test_helper_factory.Run()
+             : base::WrapUnique(new DefaultPlatformTestHelper);
 }
 
 }  // namespace views
diff --git a/ui/views/test/platform_test_helper.h b/ui/views/test/platform_test_helper.h
index 5bfd08b..2214270e 100644
--- a/ui/views/test/platform_test_helper.h
+++ b/ui/views/test/platform_test_helper.h
@@ -7,15 +7,18 @@
 
 #include <memory>
 
+#include "base/callback_forward.h"
 #include "base/macros.h"
 
 namespace views {
 
 class PlatformTestHelper {
  public:
+  using Factory = base::Callback<std::unique_ptr<PlatformTestHelper>(void)>;
   PlatformTestHelper() {}
   virtual ~PlatformTestHelper() {}
 
+  static void set_factory(const Factory& factory);
   static std::unique_ptr<PlatformTestHelper> Create();
 
   virtual bool IsMus() const = 0;
diff --git a/ui/views/test/scoped_views_test_helper.cc b/ui/views/test/scoped_views_test_helper.cc
index 5391029..8a65e0eb 100644
--- a/ui/views/test/scoped_views_test_helper.cc
+++ b/ui/views/test/scoped_views_test_helper.cc
@@ -14,6 +14,10 @@
 #include "ui/views/test/test_views_delegate.h"
 #include "ui/views/test/views_test_helper.h"
 
+#if defined(USE_AURA)
+#include "ui/aura/env.h"
+#endif
+
 namespace views {
 
 ScopedViewsTestHelper::ScopedViewsTestHelper()
@@ -33,6 +37,17 @@
                                              context_factory));
   test_helper_->SetUp();
 
+#if defined(USE_AURA)
+  // When running inside mus, the context-factory from
+  // ui::InitializeContextFactoryForTests() is only needed for the default
+  // WindowTreeHost instance created by TestScreen. After that, the
+  // context-factory is used when creating Widgets (to set-up the compositor for
+  // the corresponding mus::Windows). So unset the context-factory, so that
+  // NativeWidgetMus installs the correct context-factory that can talk to mus.
+  if (platform_test_helper_->IsMus())
+    aura::Env::GetInstance()->set_context_factory(nullptr);
+#endif
+
   ui::InitializeInputMethodForTesting();
 }
 
diff --git a/ui/views/touchui/touch_selection_controller_impl.cc b/ui/views/touchui/touch_selection_controller_impl.cc
index 67a3058..8508ffc5 100644
--- a/ui/views/touchui/touch_selection_controller_impl.cc
+++ b/ui/views/touchui/touch_selection_controller_impl.cc
@@ -125,7 +125,7 @@
     case ui::SelectionBound::RIGHT:
       return GetRightHandleImage();
     default:
-      NOTREACHED() << "Invalid touch handle bound type.";
+      NOTREACHED() << "Invalid touch handle bound type: " << bound_type;
       return nullptr;
   };
 }
@@ -249,6 +249,10 @@
 
   ~EditingHandleView() override { SetWidgetVisible(false, false); }
 
+  ui::SelectionBound::Type selection_bound_type() {
+    return selection_bound_.type();
+  }
+
   // Overridden from views::WidgetDelegateView:
   bool WidgetHasHitTestMask() const override { return true; }
 
@@ -336,7 +340,11 @@
       widget_->Hide();
   }
 
-  void SetBoundInScreen(const ui::SelectionBound& bound) {
+  // If |is_visible| is true, this will update the widget and trigger a repaint
+  // if necessary. Otherwise this will only update the internal state:
+  // |selection_bound_| and |image_|, so that the state is valid for the time
+  // this becomes visible.
+  void SetBoundInScreen(const ui::SelectionBound& bound, bool is_visible) {
     bool update_bound_type = false;
     // Cursor handle should always have the bound type CENTER
     DCHECK(!is_cursor_handle_ || bound.type() == ui::SelectionBound::CENTER);
@@ -353,8 +361,13 @@
     if (update_bound_type) {
       selection_bound_.set_type(bound.type());
       image_ = GetHandleImage(bound.type());
-      SchedulePaint();
+      if (is_visible)
+        SchedulePaint();
     }
+
+    if (!is_visible)
+      return;
+
     selection_bound_.SetEdge(bound.edge_top(), bound.edge_bottom());
 
     widget_->SetBounds(GetSelectionWidgetBounds(selection_bound_));
@@ -492,7 +505,7 @@
     // If the new location of this handle is out of client view, its widget
     // should not get hidden, since it should still receive touch events.
     // Hence, we are not using |SetHandleBound()| method here.
-    dragging_handle_->SetBoundInScreen(screen_bound_focus_clipped);
+    dragging_handle_->SetBoundInScreen(screen_bound_focus_clipped, true);
 
     // Temporary fix for selection handle going outside a window. On a webpage,
     // the page should scroll if the selection handle is dragged outside the
@@ -592,8 +605,7 @@
     const ui::SelectionBound& bound,
     const ui::SelectionBound& bound_in_screen) {
   handle->SetWidgetVisible(ShouldShowHandleFor(bound), false);
-  if (handle->IsWidgetVisible())
-    handle->SetBoundInScreen(bound_in_screen);
+  handle->SetBoundInScreen(bound_in_screen, handle->IsWidgetVisible());
 }
 
 bool TouchSelectionControllerImpl::ShouldShowHandleFor(
@@ -739,6 +751,11 @@
   return cursor_handle_->GetWidget()->GetNativeView();
 }
 
+ui::SelectionBound::Type
+TouchSelectionControllerImpl::GetSelectionHandle1Type() {
+  return selection_handle_1_->selection_bound_type();
+}
+
 gfx::Rect TouchSelectionControllerImpl::GetSelectionHandle1Bounds() {
   return selection_handle_1_->GetBoundsInScreen();
 }
diff --git a/ui/views/touchui/touch_selection_controller_impl.h b/ui/views/touchui/touch_selection_controller_impl.h
index 295c85cc..1580bfb 100644
--- a/ui/views/touchui/touch_selection_controller_impl.h
+++ b/ui/views/touchui/touch_selection_controller_impl.h
@@ -110,6 +110,7 @@
 
   // Convenience methods for testing.
   gfx::NativeView GetCursorHandleNativeView();
+  ui::SelectionBound::Type GetSelectionHandle1Type();
   gfx::Rect GetSelectionHandle1Bounds();
   gfx::Rect GetSelectionHandle2Bounds();
   gfx::Rect GetCursorHandleBounds();
diff --git a/ui/views/touchui/touch_selection_controller_impl_unittest.cc b/ui/views/touchui/touch_selection_controller_impl_unittest.cc
index 2131701..602795a 100644
--- a/ui/views/touchui/touch_selection_controller_impl_unittest.cc
+++ b/ui/views/touchui/touch_selection_controller_impl_unittest.cc
@@ -181,6 +181,10 @@
     return GetSelectionController()->GetCursorHandleNativeView();
   }
 
+  ui::SelectionBound::Type GetSelectionHandle1Type() {
+    return GetSelectionController()->GetSelectionHandle1Type();
+  }
+
   gfx::Rect GetSelectionHandle1Bounds() {
     return GetSelectionController()->GetSelectionHandle1Bounds();
   }
@@ -269,6 +273,36 @@
     }
   }
 
+  // Sets up a textfield with a long text string such that it doesn't all fit
+  // into the textfield. Then selects the text - the first handle is expected
+  // to be invisible. |selection_start| is the position of the first handle.
+  void SetupSelectionInvisibleHandle(uint32_t selection_start) {
+    // Create a textfield with lots of text in it.
+    CreateTextfield();
+    std::string some_text("some text");
+    std::string textfield_text;
+    for (int i = 0; i < 10; ++i)
+      textfield_text += some_text;
+    textfield_->SetText(ASCIIToUTF16(textfield_text));
+
+    // Tap the textfield to invoke selection.
+    ui::GestureEventDetails details(ui::ET_GESTURE_TAP);
+    details.set_tap_count(1);
+    ui::GestureEvent tap(0, 0, 0, base::TimeDelta(), details);
+    textfield_->OnGestureEvent(&tap);
+
+    // Select some text such that one handle is hidden.
+    textfield_->SelectRange(gfx::Range(
+        selection_start, static_cast<uint32_t>(textfield_text.length())));
+
+    // Check that one selection handle is hidden.
+    EXPECT_FALSE(IsSelectionHandle1Visible());
+    EXPECT_TRUE(IsSelectionHandle2Visible());
+    EXPECT_EQ(gfx::Range(selection_start,
+                         static_cast<uint32_t>(textfield_text.length())),
+              textfield_->GetSelectedRange());
+  }
+
   Widget* textfield_widget_;
   Widget* widget_;
 
@@ -539,29 +573,8 @@
 
 TEST_F(TouchSelectionControllerImplTest,
        HiddenSelectionHandleRetainsCursorPosition) {
-  // Create a textfield with lots of text in it.
-  CreateTextfield();
-  std::string textfield_text("some text");
-  for (int i = 0; i < 10; ++i)
-    textfield_text += textfield_text;
-  textfield_->SetText(ASCIIToUTF16(textfield_text));
-
-  // Tap the textfield to invoke selection.
-  ui::GestureEventDetails details(ui::ET_GESTURE_TAP);
-  details.set_tap_count(1);
-  ui::GestureEvent tap(0, 0, 0, base::TimeDelta(), details);
-  textfield_->OnGestureEvent(&tap);
-
-  // Select some text such that one handle is hidden.
-  textfield_->SelectRange(
-      gfx::Range(10u, static_cast<uint32_t>(textfield_text.length())));
-
-  // Check that one selection handle is hidden.
-  EXPECT_FALSE(IsSelectionHandle1Visible());
-  EXPECT_TRUE(IsSelectionHandle2Visible());
-  EXPECT_EQ(
-      gfx::Range(10u, static_cast<uint32_t>(textfield_text.length())),
-      textfield_->GetSelectedRange());
+  static const uint32_t selection_start = 10u;
+  SetupSelectionInvisibleHandle(selection_start);
 
   // Drag the visible handle around and make sure the selection end point of the
   // invisible handle does not change.
@@ -576,6 +589,24 @@
   }
 }
 
+// Tests that we can handle the hidden handle getting exposed as a result of a
+// drag and that it maintains the correct orientation when exposed.
+TEST_F(TouchSelectionControllerImplTest, HiddenSelectionHandleExposed) {
+  static const uint32_t selection_start = 0u;
+  SetupSelectionInvisibleHandle(selection_start);
+
+  // Drag the handle until the selection shrinks such that the other handle
+  // becomes visible.
+  while (!IsSelectionHandle1Visible()) {
+    static const int drag_diff = -10;
+    SimulateSelectionHandleDrag(gfx::Vector2d(drag_diff, 0), 2);
+  }
+
+  // Confirm that the exposed handle maintains the LEFT orientation
+  // (and does not reset to ui::SelectionBound::Type::CENTER).
+  EXPECT_EQ(ui::SelectionBound::Type::LEFT, GetSelectionHandle1Type());
+}
+
 TEST_F(TouchSelectionControllerImplTest,
        DoubleTapInTextfieldWithCursorHandleShouldSelectText) {
   CreateTextfield();
diff --git a/ui/views/views.gyp b/ui/views/views.gyp
index e01f607..6ffa9e0 100644
--- a/ui/views/views.gyp
+++ b/ui/views/views.gyp
@@ -854,8 +854,8 @@
         '<@(views_test_support_sources)',
         # These are not listed in views_test_support_sources as they are not
         # used by the gn target that pulls in views_test_support_sources.
-        'test/default_platform_test_helper.cc',
         'test/native_widget_factory_desktop.cc',
+        'test/platform_test_helper.cc',
         'test/platform_test_helper.h',
       ],
       'conditions': [
diff --git a/ui/views/widget/desktop_aura/desktop_screen_x11.cc b/ui/views/widget/desktop_aura/desktop_screen_x11.cc
index a7b1e9a..57d5f13 100644
--- a/ui/views/widget/desktop_aura/desktop_screen_x11.cc
+++ b/ui/views/widget/desktop_aura/desktop_screen_x11.cc
@@ -286,6 +286,7 @@
       has_xrandr_(false),
       xrandr_event_base_(0),
       displays_(test_displays),
+      primary_display_index_(0),
       atom_cache_(xdisplay_, kAtomsToCache) {}
 
 std::vector<display::Display> DesktopScreenX11::BuildDisplaysFromXRandRInfo() {
diff --git a/ui/views/widget/native_widget_aura.cc b/ui/views/widget/native_widget_aura.cc
index 157307f..cbdf382 100644
--- a/ui/views/widget/native_widget_aura.cc
+++ b/ui/views/widget/native_widget_aura.cc
@@ -10,6 +10,7 @@
 #include "build/build_config.h"
 #include "third_party/skia/include/core/SkRegion.h"
 #include "ui/aura/client/aura_constants.h"
+#include "ui/aura/client/capture_client.h"
 #include "ui/aura/client/cursor_client.h"
 #include "ui/aura/client/focus_client.h"
 #include "ui/aura/client/screen_position_client.h"
@@ -1186,5 +1187,15 @@
 #endif
 }
 
+// static
+gfx::NativeView NativeWidgetPrivate::GetGlobalCapture(
+    gfx::NativeView native_view) {
+  aura::client::CaptureClient* capture_client =
+      aura::client::GetCaptureClient(native_view->GetRootWindow());
+  if (!capture_client)
+    return nullptr;
+  return capture_client->GetGlobalCaptureWindow();
+}
+
 }  // namespace internal
 }  // namespace views
diff --git a/ui/views/widget/native_widget_mac.mm b/ui/views/widget/native_widget_mac.mm
index bfde5f63..fb7fef4 100644
--- a/ui/views/widget/native_widget_mac.mm
+++ b/ui/views/widget/native_widget_mac.mm
@@ -719,6 +719,13 @@
   return gfx::FontList();
 }
 
+// static
+gfx::NativeView NativeWidgetPrivate::GetGlobalCapture(
+    gfx::NativeView native_view) {
+  NOTIMPLEMENTED();
+  return nullptr;
+}
+
 }  // namespace internal
 }  // namespace views
 
diff --git a/ui/views/widget/native_widget_private.h b/ui/views/widget/native_widget_private.h
index 815ab8f..d52aee63 100644
--- a/ui/views/widget/native_widget_private.h
+++ b/ui/views/widget/native_widget_private.h
@@ -73,6 +73,10 @@
 
   static gfx::FontList GetWindowTitleFontList();
 
+  // Returns the NativeView with capture, otherwise NULL if there is no current
+  // capture set, or if |native_view| has no root.
+  static gfx::NativeView GetGlobalCapture(gfx::NativeView native_view);
+
   // Initializes the NativeWidget.
   virtual void InitNativeWidget(const Widget::InitParams& params) = 0;
 
diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc
index 17675e7..a86fe48 100644
--- a/ui/views/widget/widget.cc
+++ b/ui/views/widget/widget.cc
@@ -1171,19 +1171,23 @@
       // use an observer to make sure we are still alive.
       WidgetDeletionObserver widget_deletion_observer(this);
 
+      gfx::NativeView current_capture =
+          internal::NativeWidgetPrivate::GetGlobalCapture(
+              native_widget_->GetNativeView());
       // Make sure we're still visible before we attempt capture as the mouse
       // press processing may have made the window hide (as happens with menus).
-
-      // It is possible for a View to show a context menu on mouse-press. Since
-      // the menu does a capture and starts a nested message-loop, the release
-      // would go to the menu. The next click (i.e. both mouse-press and release
-      // events) also go to the menu. The menu (and the nested message-loop)
-      // gets closed after this second release event. The code then resumes from
-      // here. So make sure that the mouse-button is still down before doing a
-      // capture.
+      //
+      // It is possible that capture has changed as a result of a mouse-press.
+      // In these cases do not update internal state.
+      //
+      // A mouse-press may trigger a nested message-loop, and absorb the paired
+      // release. If so the code returns here. So make sure that that
+      // mouse-button is still down before attempting to do a capture.
       if (root_view && root_view->OnMousePressed(*event) &&
           widget_deletion_observer.IsWidgetAlive() && IsVisible() &&
-          internal::NativeWidgetPrivate::IsMouseButtonDown()) {
+          internal::NativeWidgetPrivate::IsMouseButtonDown() &&
+          current_capture == internal::NativeWidgetPrivate::GetGlobalCapture(
+                                 native_widget_->GetNativeView())) {
         is_mouse_button_pressed_ = true;
         if (!native_widget_->HasCapture())
           native_widget_->SetCapture();
diff --git a/ui/views/widget/widget_unittest.cc b/ui/views/widget/widget_unittest.cc
index 3358f60..0b11a97 100644
--- a/ui/views/widget/widget_unittest.cc
+++ b/ui/views/widget/widget_unittest.cc
@@ -1701,9 +1701,6 @@
   EXPECT_EQ(1, v2->GetEventCount(ui::ET_MOUSE_MOVED));
 }
 
-// No touch on desktop Mac. Tracked in http://crbug.com/445520.
-#if !defined(OS_MACOSX) || defined(USE_AURA)
-
 namespace {
 
 // ui::EventHandler which handles all mouse press events.
@@ -1723,6 +1720,9 @@
 
 }  // namespace
 
+// No touch on desktop Mac. Tracked in http://crbug.com/445520.
+#if !defined(OS_MACOSX) || defined(USE_AURA)
+
 // Test that mouse presses and mouse releases are dispatched normally when a
 // touch is down.
 TEST_F(WidgetTest, MouseEventDispatchWhileTouchIsDown) {
@@ -1753,6 +1753,107 @@
 
 #endif  // !defined(OS_MACOSX) || defined(USE_AURA)
 
+// Tests that when there is no active capture, that a mouse press causes capture
+// to be set.
+TEST_F(WidgetTest, MousePressCausesCapture) {
+  Widget* widget = CreateTopLevelNativeWidget();
+  widget->Show();
+  widget->SetSize(gfx::Size(300, 300));
+
+  EventCountView* event_count_view = new EventCountView();
+  event_count_view->SetBounds(0, 0, 300, 300);
+  widget->GetRootView()->AddChildView(event_count_view);
+
+  // No capture has been set.
+  EXPECT_EQ(nullptr, internal::NativeWidgetPrivate::GetGlobalCapture(
+                         widget->GetNativeView()));
+
+  MousePressEventConsumer consumer;
+  event_count_view->AddPostTargetHandler(&consumer);
+  std::unique_ptr<ui::test::EventGenerator> generator(
+      new ui::test::EventGenerator(
+          IsMus() ? widget->GetNativeWindow() : GetContext(),
+          widget->GetNativeWindow()));
+  generator->PressLeftButton();
+
+  EXPECT_EQ(1, event_count_view->GetEventCount(ui::ET_MOUSE_PRESSED));
+  EXPECT_EQ(
+      widget->GetNativeView(),
+      internal::NativeWidgetPrivate::GetGlobalCapture(widget->GetNativeView()));
+
+  // For mus it's important we destroy the widget before the EventGenerator.
+  widget->CloseNow();
+}
+
+namespace {
+
+// An EventHandler which shows a Wiget upon receiving a mouse event. The Widget
+// proceeds to take capture.
+class CaptureEventConsumer : public ui::EventHandler {
+ public:
+  CaptureEventConsumer(Widget* widget)
+      : event_count_view_(new EventCountView()), widget_(widget) {}
+  ~CaptureEventConsumer() override { widget_->CloseNow(); }
+
+ private:
+  // ui::EventHandler:
+  void OnMouseEvent(ui::MouseEvent* event) override {
+    if (event->type() == ui::ET_MOUSE_PRESSED) {
+      event->SetHandled();
+      widget_->Show();
+      widget_->SetSize(gfx::Size(200, 200));
+
+      event_count_view_->SetBounds(0, 0, 200, 200);
+      widget_->GetRootView()->AddChildView(event_count_view_);
+      widget_->SetCapture(event_count_view_);
+    }
+  }
+
+  EventCountView* event_count_view_;
+  Widget* widget_;
+  DISALLOW_COPY_AND_ASSIGN(CaptureEventConsumer);
+};
+
+}  // namespace
+
+// Tests that if explicit capture occurs during a mouse press, that implicit
+// capture is not applied.
+TEST_F(WidgetTest, CaptureDuringMousePressNotOverridden) {
+  Widget* widget = CreateTopLevelNativeWidget();
+  widget->Show();
+  widget->SetSize(gfx::Size(300, 300));
+
+  EventCountView* event_count_view = new EventCountView();
+  event_count_view->SetBounds(0, 0, 300, 300);
+  widget->GetRootView()->AddChildView(event_count_view);
+
+  EXPECT_EQ(nullptr, internal::NativeWidgetPrivate::GetGlobalCapture(
+                         widget->GetNativeView()));
+
+  Widget* widget2 = CreateTopLevelNativeWidget();
+  // Gives explicit capture to |widget2|
+  CaptureEventConsumer consumer(widget2);
+  event_count_view->AddPostTargetHandler(&consumer);
+  std::unique_ptr<ui::test::EventGenerator> generator(
+      new ui::test::EventGenerator(
+          IsMus() ? widget->GetNativeWindow() : GetContext(),
+          widget->GetNativeWindow()));
+  // This event should implicitly give capture to |widget|, except that
+  // |consumer| will explicitly set capture on |widget2|.
+  generator->PressLeftButton();
+
+  EXPECT_EQ(1, event_count_view->GetEventCount(ui::ET_MOUSE_PRESSED));
+  EXPECT_NE(
+      widget->GetNativeView(),
+      internal::NativeWidgetPrivate::GetGlobalCapture(widget->GetNativeView()));
+  EXPECT_EQ(
+      widget2->GetNativeView(),
+      internal::NativeWidgetPrivate::GetGlobalCapture(widget->GetNativeView()));
+
+  // For mus it's important we destroy the widget before the EventGenerator.
+  widget->CloseNow();
+}
+
 // Verifies WindowClosing() is invoked correctly on the delegate when a Widget
 // is closed.
 TEST_F(WidgetTest, SingleWindowClosing) {
diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc
index e98ba07..14b30da 100644
--- a/ui/views/win/hwnd_message_handler.cc
+++ b/ui/views/win/hwnd_message_handler.cc
@@ -300,6 +300,10 @@
   DISALLOW_COPY_AND_ASSIGN(ScopedRedrawLock);
 };
 
+// static HWNDMessageHandler member initialization.
+base::LazyInstance<HWNDMessageHandler::FullscreenWindowMonitorMap>
+    HWNDMessageHandler::fullscreen_monitor_map_ = LAZY_INSTANCE_INITIALIZER;
+
 ////////////////////////////////////////////////////////////////////////////////
 // HWNDMessageHandler, public:
 
@@ -813,6 +817,18 @@
   // window, then go ahead and do it now.
   if (!fullscreen && dwm_transition_desired_)
     PerformDwmTransition();
+
+  // Add the fullscreen window to the fullscreen window map which is used to
+  // handle window activations.
+  HMONITOR monitor = MonitorFromWindow(hwnd(), MONITOR_DEFAULTTOPRIMARY);
+  if (fullscreen) {
+    (fullscreen_monitor_map_.Get())[monitor] = this;
+  } else {
+    FullscreenWindowMonitorMap::iterator iter =
+        fullscreen_monitor_map_.Get().find(monitor);
+    if (iter != fullscreen_monitor_map_.Get().end())
+      fullscreen_monitor_map_.Get().erase(iter);
+  }
 }
 
 void HWNDMessageHandler::SizeConstraintsChanged() {
@@ -1021,18 +1037,18 @@
   // By reducing the size of the fullscreen window by 1px, we ensure that the
   // taskbar no longer treats the window and in turn the thread as a fullscreen
   // thread. This in turn ensures that maximized windows on the same thread
-  /// don't obscure the taskbar, etc.
+  // don't obscure the taskbar, etc.
+  // Please note that this taskbar behavior only occurs if the window becoming
+  // active is on the same monitor as the fullscreen window.
   if (!active) {
     if (IsFullscreen() && ::IsWindow(window_gaining_or_losing_activation)) {
-      // Reduce the bounds of the window by 1px to ensure that Windows does
-      // not treat this like a fullscreen window.
-      MONITORINFO monitor_info = {sizeof(monitor_info)};
-      GetMonitorInfo(MonitorFromWindow(hwnd(), MONITOR_DEFAULTTOPRIMARY),
-                      &monitor_info);
-      gfx::Rect shrunk_rect(monitor_info.rcMonitor);
-      shrunk_rect.set_height(shrunk_rect.height() - 1);
-      background_fullscreen_hack_ = true;
-      SetBoundsInternal(shrunk_rect, false);
+      HMONITOR active_window_monitor = MonitorFromWindow(
+          window_gaining_or_losing_activation, MONITOR_DEFAULTTOPRIMARY);
+      HMONITOR fullscreen_window_monitor =
+          MonitorFromWindow(hwnd(), MONITOR_DEFAULTTOPRIMARY);
+
+      if (active_window_monitor == fullscreen_window_monitor)
+        OnBackgroundFullscreen();
     }
   } else if (background_fullscreen_hack_) {
     // Restore the bounds of the window to fullscreen.
@@ -1042,6 +1058,13 @@
                    &monitor_info);
     SetBoundsInternal(gfx::Rect(monitor_info.rcMonitor), false);
     background_fullscreen_hack_ = false;
+  } else {
+    // If the window becoming active has a fullscreen window on the same
+    // monitor then we need to reduce the size of the fullscreen window by
+    // 1 px. Please refer to the comments above for the reasoning behind
+    // this.
+    CheckAndHandleBackgroundFullscreenOnMonitor(
+        window_gaining_or_losing_activation);
   }
 }
 
@@ -1337,6 +1360,16 @@
 void HWNDMessageHandler::OnDestroy() {
   windows_session_change_observer_.reset(nullptr);
   delegate_->HandleDestroying();
+  // If the window going away is a fullscreen window then remove its references
+  // from the full screen window map.
+  for (auto iter = fullscreen_monitor_map_.Get().begin();
+       iter != fullscreen_monitor_map_.Get().end();
+       iter++) {
+    if (iter->second == this) {
+      fullscreen_monitor_map_.Get().erase(iter);
+      break;
+    }
+  }
 }
 
 void HWNDMessageHandler::OnDisplayChange(UINT bits_per_pixel,
@@ -1397,6 +1430,9 @@
   // trackpoint drivers.
   if (in_size_loop_ && needs_scroll_styles_)
     AddScrollStylesToWindow(hwnd());
+  // If the window was moved to a monitor which has a fullscreen window active,
+  // we need to reduce the size of the fullscreen window by 1px.
+  CheckAndHandleBackgroundFullscreenOnMonitor(hwnd());
 }
 
 void HWNDMessageHandler::OnGetMinMaxInfo(MINMAXINFO* minmax_info) {
@@ -2683,5 +2719,29 @@
     direct_manipulation_helper_->SetBounds(bounds_in_pixels);
 }
 
+void HWNDMessageHandler::CheckAndHandleBackgroundFullscreenOnMonitor(
+    HWND window) {
+  HMONITOR monitor = MonitorFromWindow(window, MONITOR_DEFAULTTOPRIMARY);
+
+  FullscreenWindowMonitorMap::iterator iter =
+      fullscreen_monitor_map_.Get().find(monitor);
+  if (iter != fullscreen_monitor_map_.Get().end()) {
+    DCHECK(iter->second);
+    if (window != iter->second->hwnd())
+      iter->second->OnBackgroundFullscreen();
+  }
+}
+
+void HWNDMessageHandler::OnBackgroundFullscreen() {
+  // Reduce the bounds of the window by 1px to ensure that Windows does
+  // not treat this like a fullscreen window.
+  MONITORINFO monitor_info = {sizeof(monitor_info)};
+  GetMonitorInfo(MonitorFromWindow(hwnd(), MONITOR_DEFAULTTOPRIMARY),
+                 &monitor_info);
+  gfx::Rect shrunk_rect(monitor_info.rcMonitor);
+  shrunk_rect.set_height(shrunk_rect.height() - 1);
+  background_fullscreen_hack_ = true;
+  SetBoundsInternal(shrunk_rect, false);
+}
 
 }  // namespace views
diff --git a/ui/views/win/hwnd_message_handler.h b/ui/views/win/hwnd_message_handler.h
index 8a114eb..f011864 100644
--- a/ui/views/win/hwnd_message_handler.h
+++ b/ui/views/win/hwnd_message_handler.h
@@ -8,11 +8,13 @@
 #include <windows.h>
 
 #include <stddef.h>
+#include <map>
 #include <memory>
 #include <set>
 #include <vector>
 
 #include "base/compiler_specific.h"
+#include "base/lazy_instance.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/strings/string16.h"
@@ -517,6 +519,16 @@
   void SetBoundsInternal(const gfx::Rect& bounds_in_pixels,
                          bool force_size_changed);
 
+  // Checks if there is a full screen window on the same monitor as the
+  // |window| which is becoming active. If yes then we reduce the size of the
+  // fullscreen window by 1 px to ensure that maximized windows on the same
+  // monitor don't draw over the taskbar.
+  void CheckAndHandleBackgroundFullscreenOnMonitor(HWND window);
+
+  // Provides functionality to reduce the bounds of the fullscreen window by 1
+  // px on activation loss to a window on the same monitor.
+  void OnBackgroundFullscreen();
+
   HWNDMessageHandlerDelegate* delegate_;
 
   std::unique_ptr<FullscreenHandler> fullscreen_handler_;
@@ -651,6 +663,12 @@
   // fullscreen window which lost activation. Defaults to false.
   bool background_fullscreen_hack_;
 
+  // This is a map of the HMONITOR to full screeen window instance. It is safe
+  // to keep a raw pointer to the HWNDMessageHandler instance as we track the
+  // window destruction and ensure that the map is cleaned up.
+  using FullscreenWindowMonitorMap = std::map<HMONITOR, HWNDMessageHandler*>;
+  static base::LazyInstance<FullscreenWindowMonitorMap> fullscreen_monitor_map_;
+
   // The WeakPtrFactories below must occur last in the class definition so they
   // get destroyed last.
 
diff --git a/ui/webui/resources/cr_elements/network/cr_network_list_item.html b/ui/webui/resources/cr_elements/network/cr_network_list_item.html
index b4c9e2dc..23fca13 100644
--- a/ui/webui/resources/cr_elements/network/cr_network_list_item.html
+++ b/ui/webui/resources/cr_elements/network/cr_network_list_item.html
@@ -38,6 +38,8 @@
       #icon {
         height: 32px;
         width: 32px;
+
+        @apply(--cr-network-icon-mixin);
       }
 
       #divDetail {
@@ -56,12 +58,16 @@
       #networkName {
         -webkit-margin-start: 8px;
         font-size: 16px;
+
+        @apply(--cr-network-name-mixin);
       }
 
       #networkStateText {
         -webkit-margin-start: 8px;
         color: grey;
         font-size: 14px;
+
+        @apply(--cr-network-state-mixin);
       }
 
       .buttons {
diff --git a/ui/wm/core/shadow.cc b/ui/wm/core/shadow.cc
index dc80187..a5f736a 100644
--- a/ui/wm/core/shadow.cc
+++ b/ui/wm/core/shadow.cc
@@ -182,13 +182,12 @@
   int aperture = GetShadowApertureForStyle(style_);
   int aperture_x = std::min(aperture, layer_bounds.width() / 2);
   int aperture_y = std::min(aperture, layer_bounds.height() / 2);
-
   shadow_layer_->UpdateNinePatchLayerAperture(
       gfx::Rect(aperture_x, aperture_y,
                 image_size_.width() - aperture_x * 2,
                 image_size_.height() - aperture_y * 2));
-  shadow_layer_->UpdateNinePatchOcclusion(
-      content_bounds_ + gfx::Vector2d(interior_inset_, interior_inset_));
+  shadow_layer_->UpdateNinePatchLayerBorder(
+      gfx::Rect(aperture_x, aperture_y, aperture_x * 2, aperture_y * 2));
 }
 
 }  // namespace wm